File Coverage

blib/lib/Module/New/Command/Basic.pm
Criterion Covered Total %
statement 94 114 82.4
branch 25 52 48.0
condition 13 30 43.3
subroutine 24 26 92.3
pod n/a
total 156 222 70.2


line stmt bran cond sub pod time code
1             package Module::New::Command::Basic;
2              
3 3     3   419 use strict;
  3         6  
  3         94  
4 3     3   12 use warnings;
  3         4  
  3         67  
5 3     3   10 use Carp;
  3         4  
  3         161  
6 3     3   19 use Module::New::Meta;
  3         5  
  3         13  
7 3     3   150 use Module::New::Queue;
  3         4  
  3         4002  
8              
9             functions {
10              
11             set_distname => sub () { Module::New::Queue->register(sub {
12 6     6   8 my ($self, $name) = @_;
13 6 50       21 croak "distribution/main module name is required" unless $name;
14 6         28 Module::New->context->distname( $name );
15 6     6   45 })},
16              
17             guess_root => sub () { Module::New::Queue->register(sub {
18 5     5   10 my $self = shift;
19 5         20 my $context = Module::New->context;
20 5         23 $context->path->guess_root( $context->config('root') );
21 5     5   37 })},
22              
23             set_file => sub () { Module::New::Queue->register(sub {
24 4     4   9 my ($self, $name) = @_;
25              
26 4 50       11 croak "filename is required" unless $name;
27              
28 4         12 my $context = Module::New->context;
29 4         14 my $type = $context->config('type');
30              
31 4 50       13 unless ($type) {
32 4 100 66     68 if ( $name =~ /::/ or $name =~ /\.pm$/ or $name =~ m{^lib/} ) {
    100 66        
    50 66        
    0 33        
33 2         5 $type = 'Module';
34             }
35             elsif ( $name =~ /\.t$/ or $name =~ m{^t/} ) {
36 1         3 $type = 'Test';
37             }
38             elsif ( $name =~ /\.pl/ or $name =~ m{^(?:bin|scripts?)/} ) {
39 1         3 $type = 'Script';
40             }
41             elsif ( $name = /\./ ) {
42 0         0 $type = 'Plain';
43             }
44             }
45 4   50     13 $type ||= 'Module';
46 4         15 $context->config( type => $type );
47              
48 4 100       25 if ( $type =~ /Module$/ ) {
49 2         7 $context->module( $name );
50             }
51             else {
52 2         6 $context->mainfile( $name );
53             }
54 4     4   24 })},
55              
56             create_distdir => sub () { Module::New::Queue->register(sub {
57 6     6   10 my $self = shift;
58              
59 6         17 my $context = Module::New->context;
60              
61 6         22 $context->path->set_root;
62 6 100       27 unless ( $context->config('no_dirs') ) {
63 5         14 my $distname = $context->distname;
64 5         14 my $distdir = $context->path->dir($distname);
65 5 50       150 if ( $distdir->exists ) {
66 0 0       0 if ( $context->config('force') ) {
    0          
67 0         0 $context->path->remove_dir( $distdir, 'absolute' );
68             }
69             elsif ( $context->config('grace') ) {
70             # just skip and do nothing
71             }
72             else {
73 0         0 croak "$distname already exists";
74             }
75             }
76 5         102 $context->path->create_dir($distname);
77 5         143 $context->path->change_dir($distname);
78             }
79             else {
80 1         4 $context->path->change_dir(".");
81             }
82 6         146 $context->path->set_root;
83 6     6   39 })},
84              
85             create_maketool => sub (;$) {
86 6     6   12 my $type = shift;
87             Module::New::Queue->register(sub {
88 6     6   14 my $self = shift;
89              
90 6         18 my $context = Module::New->context;
91 6   100     31 $type ||= $context->config('make') || 'MakeMakerCPANfile';
      33        
92 6 50       17 $type = 'ModuleBuild' if $type eq 'MB';
93 6 50       12 $type = 'MakeMaker' if $type eq 'EUMM';
94              
95 6         27 $context->files->add( $type );
96 6         39 });
97             },
98              
99             create_general_files => sub () { Module::New::Queue->register(sub {
100 6     6   9 my $self = shift;
101              
102 6         18 Module::New->context->files->add(qw( Readme Changes ManifestSkip License ));
103 6     6   38 })},
104              
105             create_tests => sub (;@) {
106 6     6   14 my @files = @_;
107             Module::New::Queue->register(sub {
108 6     6   9 my $self = shift;
109              
110 6         17 my $context = Module::New->context;
111 6 50       21 if ( ref $context->config('test') eq 'ARRAY' ) {
    50          
112 0         0 $context->files->add( @{ Module::New->context->config('test') } );
  0         0  
113             }
114             elsif ( @files ) {
115 0         0 $context->files->add( @files );
116             }
117             else {
118 6         17 $context->files->add(qw( LoadTest PodTest PodCoverageTest ));
119             }
120 6         41 });
121             },
122              
123             create_files => sub (;@) {
124 10     10   21 my @files = @_;
125             Module::New::Queue->register(sub {
126 10     10   19 my $self = shift;
127              
128 10         31 my $context = Module::New->context;
129 10         30 $context->files->add( @files );
130 10 100       28 if ($context->config('xs')) {
131 1         4 $context->files->add('XS');
132 1         2 eval {
133 1         1386 require Devel::PPPort;
134 1         359 Devel::PPPort::WriteFile();
135 1         2074 $context->log( info => "created ppport.h" );
136             };
137 1 50       54 $context->log( warn => $@ ) if $@;
138             }
139 10         35 while ( my $name = $context->files->next ) {
140 59 100       170 if ( $name eq '{ANY_TYPE}' ) {
141 4   50     14 $name = $context->config('type') || 'Module';
142             }
143 59         179 my $file = $context->loader->reload_class( File => $name );
144 59         328 $context->path->create_file( $file->render );
145             }
146 10         68 });
147             },
148              
149             create_manifest => sub () { Module::New::Queue->register(sub {
150 10     10   21 my $self = shift;
151              
152 10         34 my $context = Module::New->context;
153 10 50       39 $context->path->remove_file('MANIFEST') if $context->config('force');
154              
155 10 50       38 local $ENV{PERL_MM_MANIFEST_VERBOSE} = 0 if $context->config('silent');
156              
157 10         799 require ExtUtils::Manifest;
158 10         8952 ExtUtils::Manifest::mkmanifest();
159              
160 10         16834 $context->log( info => 'updated manifest' );
161 10     10   58 })},
162              
163             edit_mainfile => sub (;%) {
164 10     10   27 my %options = @_;
165 10 50 33     62 return if $ENV{HARNESS_ACTIVE} || $INC{'Test/Classy.pm'};
166             Module::New::Queue->register(sub {
167 0     0     my $self = shift;
168              
169 0           my $context = Module::New->context;
170 0 0         return if $options{optional};
171              
172 0   0       my $editor = $context->config('editor') || $ENV{EDITOR};
173 0 0         unless ( $editor ) { carp 'editor is not set'; return; }
  0            
  0            
174 0   0       my $file = $options{file} || $context->mainfile;
175 0           exec( _shell_quote($editor) => _shell_quote($file) );
176 0           });
177             },
178             };
179              
180             sub _shell_quote {
181 0     0     my $str = shift;
182 0 0         return $str unless $str =~ /\s/;
183 0 0         return ( $^O eq 'MSWin32' ) ? qq{"$str"} : qq{'$str'};
184             }
185              
186             1;
187              
188             __END__