File Coverage

blib/lib/ExtUtils/ModuleMaker/Siffra.pm
Criterion Covered Total %
statement 57 160 35.6
branch 0 36 0.0
condition 0 5 0.0
subroutine 13 19 68.4
pod 7 7 100.0
total 77 227 33.9


line stmt bran cond sub pod time code
1             package ExtUtils::ModuleMaker::Siffra;
2              
3 1     1   65904 use 5.014;
  1         5  
4 1     1   6 use strict;
  1         2  
  1         19  
5 1     1   17 use warnings;
  1         3  
  1         34  
6 1     1   6 use Carp;
  1         3  
  1         62  
7 1     1   574 use utf8;
  1         15  
  1         5  
8 1     1   594 use Data::Dumper;
  1         6575  
  1         71  
9 1     1   428 use DDP;
  1         40436  
  1         10  
10 1     1   518 use Log::Any qw($log);
  1         10326  
  1         5  
11 1     1   2083 use Scalar::Util qw(blessed);
  1         3  
  1         64  
12             $Carp::Verbose = 1;
13              
14              
15             BEGIN
16             {
17 1     1   595 require ExtUtils::ModuleMaker;
18 1     1   23 use Exporter ();
  1         3  
  1         27  
19 1     1   7 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
  1         2  
  1         114  
20 1         16422 $VERSION = '0.06';
21 1         29 @ISA = qw(Exporter ExtUtils::ModuleMaker);
22              
23             #Give a hoot don't pollute, do not export more than needed by default
24 1         4 @EXPORT = qw();
25 1         2 @EXPORT_OK = qw();
26 1         1493 %EXPORT_TAGS = ();
27             } ## end BEGIN
28              
29             =head3 C
30              
31             Usage : $self->block_new_method() within text_pm_file()
32             Purpose : Build 'new()' method as part of a pm file
33             Returns : String holding sub new.
34             Argument : $module: pointer to the module being built
35             (as there can be more than one module built by EU::MM);
36             for the primary module it is a pointer to $self
37             Throws : n/a
38             Comment : This method is a likely candidate for alteration in a subclass,
39             e.g., pass a single hash-ref to new() instead of a list of
40             parameters.
41              
42             =cut
43              
44             sub block_new_method
45             {
46 0     0 1 0 my $self = shift;
47 0         0 return <<'EOFBLOCK';
48              
49             =head2 C
50              
51             Usage : $self->block_new_method() within text_pm_file()
52             Purpose : Build 'new()' method as part of a pm file
53             Returns : String holding sub new.
54             Argument : $module: pointer to the module being built
55             (as there can be more than one module built by EU::MM);
56             for the primary module it is a pointer to $self
57             Throws : n/a
58             Comment : This method is a likely candidate for alteration in a subclass,
59             e.g., pass a single hash-ref to new() instead of a list of
60             parameters.
61              
62             =cut
63              
64             sub new
65             {
66             my ($class, %parameters) = @_;
67              
68             my $self = {};
69             #my $self = $class->SUPER::new( %parameters );
70              
71             $self = bless ($self, ref ($class) || $class);
72              
73             $log->info( "new", { progname => $0, pid => $$, perl_version => $], package => __PACKAGE__ } );
74              
75             #$self->_initialize( %parameters );
76             return $self;
77             }
78              
79             EOFBLOCK
80             } ## end sub block_new_method
81              
82             =head3 C
83              
84             Usage : $self->block_begin($module) within text_pm_file()
85             Purpose : Composes the standard code for top of a Perl pm file
86             Returns : String holding code for top of pm file
87             Argument : $module: pointer to the module being built
88             (as there can be more than one module built by EU::MM);
89             for the primary module it is a pointer to $self
90             Throws : n/a
91             Comment : This method is a likely candidate for alteration in a subclass,
92             e.g., you don't need Exporter-related code if you're building
93             an OO-module.
94             Comment : References $self keys NAME and (indirectly) VERSION
95              
96             =cut
97              
98             sub block_begin
99             {
100 0     0 1 0 my ( $self, $module ) = @_;
101 0         0 my $version = $self->process_attribute( $module, 'VERSION' );
102 0         0 my $package_line = "package $module->{NAME};\n\n";
103 0   0     0 my $min_perl_version_line = "use " . ( $self->{ MIN_PERL_VERSION } // 5.010 ) . ";\n";
104 0         0 my $Id_line = q{#$Id#} . "\n";
105 0         0 my $strict_line = "use strict;\n";
106 0         0 my $warnings_line = "use warnings;\n"; # not included in standard version
107 0         0 my $carp_line = "use Carp;\n";
108 0         0 my $carp_verbose = "\$Carp::Verbose = 1;\n";
109 0         0 my $encoding_line = "use utf8;\n";
110 0         0 my $data_dumper_line = "use Data::Dumper;\n";
111 0         0 my $log_line = "use Log::Any qw(\$log);\n";
112 0         0 my $scalar_util_line = "use Scalar::Util qw(blessed);\n";
113 0         0 my $begin_block = <<"END_OF_BEGIN";
114              
115             BEGIN {
116             use Exporter ();
117             use vars qw(\$VERSION \@ISA \@EXPORT \@EXPORT_OK \%EXPORT_TAGS);
118             \$VERSION = '$version';
119             \@ISA = qw(Exporter);
120             #Give a hoot don't pollute, do not export more than needed by default
121             \@EXPORT = qw();
122             \@EXPORT_OK = qw();
123             \%EXPORT_TAGS = ();
124             }
125              
126             END_OF_BEGIN
127              
128 0         0 my $text = $package_line;
129 0 0       0 $text .= $min_perl_version_line if $self->{ MIN_PERL_VERSION };
130 0 0       0 $text .= $Id_line if $self->{ INCLUDE_ID_LINE };
131 0         0 $text .= $strict_line;
132 0 0       0 $text .= $warnings_line if $self->{ INCLUDE_WARNINGS };
133 0         0 $text .= $carp_line;
134 0         0 $text .= $encoding_line;
135 0         0 $text .= $data_dumper_line;
136 0         0 $text .= $log_line;
137 0         0 $text .= $scalar_util_line;
138 0         0 $text .= $carp_verbose;
139 0         0 $text .= $begin_block;
140 0         0 return $text;
141             } ## end sub block_begin
142              
143             =head3 C
144              
145             Usage : $self->default_values() within complete_build()
146             Purpose : Build Makefile
147             Returns : Hash holding default_values
148             Argument : n/a
149             Throws : n/a
150             Comment : This method is a likely candidate for alteration in a subclass
151              
152             =cut
153              
154             sub default_values
155             {
156 1     1 1 286 my $self = shift;
157 1         9 my $defaults_ref = $self->SUPER::default_values();
158              
159 1         30 $defaults_ref->{ AUTHOR } = 'Luiz Benevenuto';
160 1         5 $defaults_ref->{ EMAIL } = 'luiz@siffra.com.br';
161 1         3 $defaults_ref->{ CPANID } = 'LUIZBENE';
162 1         15 $defaults_ref->{ WEBSITE } = 'https://siffra.com.br';
163 1         5 $defaults_ref->{ ORGANIZATION } = 'Siffra TI';
164              
165 1         3 $defaults_ref->{ VERBOSE } = 1;
166 1         3 $defaults_ref->{ MIN_PERL_VERSION } = '5.014';
167              
168 1         3 $defaults_ref->{ LICENSE } = 'perl';
169 1         2 $defaults_ref->{ INCLUDE_LICENSE } = 1;
170 1         2 $defaults_ref->{ INCLUDE_WARNINGS } = 1;
171 1         2 $defaults_ref->{ INCLUDE_MANIFEST_SKIP } = 1;
172 1         2 $defaults_ref->{ INCLUDE_POD_COVERAGE_TEST } = 1;
173 1         2 $defaults_ref->{ INCLUDE_POD_TEST } = 1;
174 1         2 $defaults_ref->{ INCLUDE_PERLCRITIC_TEST } = 1;
175 1         3 $defaults_ref->{ INCLUDE_SCRIPTS_DIRECTORY } = 1;
176 1         2 $defaults_ref->{ INCLUDE_FILE_IN_PM } = '/home/luiz/.modulemaker/ExtUtils/ModuleMaker/include_module.pm';
177              
178 1         3 return $defaults_ref;
179             } ## end sub default_values
180              
181             =head3 C
182              
183             Usage : $self->text_Makefile() within complete_build()
184             Purpose : Build Makefile
185             Returns : String holding text of Makefile
186             Argument : n/a
187             Throws : n/a
188             Comment : This method is a likely candidate for alteration in a subclass
189              
190             =cut
191              
192             sub text_Makefile
193             {
194 0     0 1   my $self = shift;
195              
196 0           my %escaped = ();
197 0           for my $key ( qw| NAME FILE AUTHOR EMAIL ABSTRACT LICENSE MIN_PERL_VERSION ORGANIZATION CPANID | )
198             {
199 0           my $value = $self->{ $key };
200 0           ( $escaped{ $key } = $value ) =~ s{'}{\\'}g;
201             }
202              
203 0           ( my $nameFormat = $escaped{ NAME } ) =~ s{\:\:}{\-}g;
204              
205 0           my $text_of_Makefile = <
206             use ExtUtils::MakeMaker;
207             use strict;
208             use warnings;
209              
210             # Call 'perldoc ExtUtils::MakeMaker' for details of how to influence
211             # the contents of the Makefile that is written.
212              
213             my %WriteMakefileArgs = (
214             NAME => '$escaped{NAME}',
215             VERSION_FROM => '$escaped{FILE}',
216             ABSTRACT_FROM => '$escaped{FILE}',
217             AUTHOR => '$escaped{AUTHOR} ($escaped{EMAIL})',
218             MIN_PERL_VERSION => '$escaped{MIN_PERL_VERSION}',
219             LICENSE => '$escaped{LICENSE}',
220             INSTALLDIRS => (\$] < 5.011 ? 'perl' : 'site'),
221             PREREQ_PM => {
222              
223             # Default req
224             'strict' => 0,
225             'warnings' => 0,
226             'Carp' => 0,
227             'utf8' => 0,
228             'Data::Dumper' => 0,
229             'DDP' => 0,
230             'Log::Any' => 0,
231             'Scalar::Util' => 0,
232             'version' => 0,
233             'Test::More' => 0,
234             # Default req
235              
236             },
237             BUILD_REQUIRES => {
238             'Test::More' => 0,
239             'ExtUtils::MakeMaker' => 0,
240             },
241             (
242             eval { ExtUtils::MakeMaker->VERSION(6.46) }
243             ? ()
244             : (
245             META_MERGE => {
246             'meta-spec' => { version => 2 },
247             dynamic_config => 1,
248             resources => {
249             homepage => 'https://siffra.com.br',
250             repository => {
251             url => 'git\@github.com:SiffraTI/$nameFormat.git',
252             web => 'https://github.com/SiffraTI/$nameFormat',
253             type => 'git',
254             },
255             bugtracker => {
256             web => 'https://github.com/SiffraTI/$nameFormat/issues',
257             },
258             },
259             }
260             )
261             ),
262             dist => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', },
263             clean => { FILES => '$nameFormat-* *.old *.bak' },
264             );
265              
266             WriteMakefile(\%WriteMakefileArgs);
267             END_OF_MAKEFILE_TEXT
268              
269 0           return $text_of_Makefile;
270             } ## end sub text_Makefile
271              
272             =head3 C
273              
274             Usage : $self->pod_wrapper($string) within block_pod()
275             Purpose : When writing POD sections, you have to 'escape'
276             the POD markers to prevent the compiler from treating
277             them as real POD. This method 'unescapes' them and puts header
278             and closer around main POD block in pm file, along with warning
279             about stub documentation.
280             Argument : String holding text of POD which has been built up
281             within block_pod().
282             Comment : $head and $tail inside pod_wrapper() are optional and, in a
283             subclass, could be redefined as empty strings;
284             but $cutline is mandatory as it supplies the last =cut
285              
286             =cut
287              
288             sub pod_wrapper
289             {
290 0     0 1   my ( $self, $podtext ) = @_;
291 0           my $head = <<'END_OF_HEAD';
292              
293             #################### main pod documentation begin ###################
294             ## Below is the stub of documentation for your module.
295             ## You better edit it!
296              
297             END_OF_HEAD
298              
299 0           my $cutline = <<'END_OF_CUT';
300              
301             ====cut
302              
303             END_OF_CUT
304              
305 0           my $tail = <<'END_OF_TAIL';
306             #################### main pod documentation end ###################
307              
308             END_OF_TAIL
309              
310 0           my $encoding_section = <<'END_OF_ENCODING_SECTION';
311              
312             ====encoding UTF-8
313              
314             END_OF_ENCODING_SECTION
315              
316 0           $cutline =~ s/\n ====/\n=/g;
317 0           $encoding_section =~ s/\n ====/\n=/g;
318 0           return join(
319             q{},
320             $head, # optional
321             $encoding_section, # optional
322             $podtext, # required
323             $cutline, # required
324             $tail # optional
325             );
326             } ## end sub pod_wrapper
327              
328             =head3 C
329              
330             Usage : $self->text_perlcritic_test() within complete_build()
331             Purpose : Composes text for t/pod-coverage.t
332             Returns : String with text of t/pod-coverage.t
333             Argument : n/a
334             Throws : n/a
335             Comment : Adapted from Andy Lester's Module::Starter
336             Comment : I don't think of much of this metric, but Andy and Damian do,
337             so if you want it you set INCLUDE_POD_COVERAGE_TEST => 1
338              
339             =cut
340              
341             sub text_perlcritic_test
342             {
343 0     0 1   my $self = shift;
344              
345 0           my $text_of_perlcritic_test_test = <<'END_OF_TEXT_PERLCRITIC_TEST_TEST';
346             #!perl
347              
348             if (!require Test::Perl::Critic) {
349             Test::More::plan(
350             skip_all => "Test::Perl::Critic required for testing PBP compliance"
351             );
352             }
353              
354             Test::Perl::Critic::all_critic_ok();
355             END_OF_TEXT_PERLCRITIC_TEST_TEST
356              
357 0           return $text_of_perlcritic_test_test;
358             } ## end sub text_perlcritic_test
359              
360             =head3 C
361              
362             Usage : $self->pod_wrapper($string) within block_pod()
363             Purpose : When writing POD sections, you have to 'escape'
364             the POD markers to prevent the compiler from treating
365             them as real POD. This method 'unescapes' them and puts header
366             and closer around main POD block in pm file, along with warning
367             about stub documentation.
368             Argument : String holding text of POD which has been built up
369             within block_pod().
370             Comment : $head and $tail inside pod_wrapper() are optional and, in a
371             subclass, could be redefined as empty strings;
372             but $cutline is mandatory as it supplies the last =cut
373              
374             =cut
375              
376             sub complete_build
377             {
378 0     0 1   my $self = shift;
379              
380 0           $self->create_base_directory();
381              
382 0           $self->create_directory( map { File::Spec->catdir( $self->{ Base_Dir }, $_ ) } qw{ lib t } ); # always on
  0            
383              
384 0           $self->create_directory( map { File::Spec->catdir( $self->{ Base_Dir }, $_ ) } qw{ scripts } )
385 0 0         if $self->{ INCLUDE_SCRIPTS_DIRECTORY }; # default is on
386              
387 0           $self->print_file( 'README', $self->text_README() ); # always on
388              
389             $self->print_file( 'LICENSE', $self->{ LicenseParts }{ LICENSETEXT } )
390 0 0         if $self->{ INCLUDE_LICENSE }; # default is on
391              
392             $self->print_file( 'Todo', $self->text_Todo() )
393 0 0         if $self->{ INCLUDE_TODO }; # default is on
394              
395             $self->print_file( 'Changes', $self->text_Changes() )
396 0 0         unless ( $self->{ CHANGES_IN_POD } ); # default is off
397              
398             $self->print_file( 'MANIFEST.SKIP', $self->text_MANIFEST_SKIP() )
399 0 0         if $self->{ INCLUDE_MANIFEST_SKIP }; # default is off
400              
401             $self->print_file( qq|t/pod-coverage.t|, $self->text_pod_coverage_test() )
402 0 0         if $self->{ INCLUDE_POD_COVERAGE_TEST }; # default is off
403              
404             $self->print_file( qq|t/pod.t|, $self->text_pod_test() )
405 0 0         if $self->{ INCLUDE_POD_TEST }; # default is off
406              
407             $self->print_file( qq|t/perlcritic.t|, $self->text_perlcritic_test() )
408 0 0         if $self->{ INCLUDE_PERLCRITIC_TEST }; # default is off
409              
410 0 0         if ( $self->{ BUILD_SYSTEM } eq 'ExtUtils::MakeMaker' )
411             {
412 0           $self->print_file( 'Makefile.PL', $self->text_Makefile() );
413             }
414             else
415             {
416 0           $self->print_file( 'Build.PL', $self->text_Buildfile() );
417 0 0 0       if ( $self->{ BUILD_SYSTEM } eq 'Module::Build and proxy Makefile.PL'
418             or $self->{ BUILD_SYSTEM } eq 'Module::Build and Proxy' )
419             {
420 0           $self->print_file( 'Makefile.PL', $self->text_proxy_makefile() );
421             }
422             } ## end else [ if ( $self->{ BUILD_SYSTEM...})]
423              
424 0           my @pmfiles = ( $self );
425 0           foreach my $f ( @{ $self->{ EXTRA_MODULES } } )
  0            
426             {
427 0           push @pmfiles, $f;
428             }
429 0           foreach my $module ( @pmfiles )
430             {
431 0           my ( $dir, $file ) = $self->_get_dir_and_file( $module );
432 0           $self->create_directory( join( '/', $self->{ Base_Dir }, $dir ) );
433 0           my $text_of_pm_file = $self->text_pm_file( $module );
434 0           $self->print_file( join( '/', $dir, $file ), $text_of_pm_file );
435             } ## end foreach my $module ( @pmfiles...)
436              
437             # How test files are created depends on how tests for EXTRA_MODULES
438             # are handled: 1 test file per extra module (default) or all tests for all
439             # modules in a single file (example: PBP).
440 0 0         unless ( $self->{ EXTRA_MODULES_SINGLE_TEST_FILE } )
441             {
442 0           my $ct = $self->{ FIRST_TEST_NUMBER };
443 0           foreach my $module ( @pmfiles )
444             {
445 0           my ( $teststart, $testmiddle );
446              
447             # Are we going to derive the lexical part of the test name from
448             # the name of the module it is testing? (non-default)
449             # Or are we simply going to use our pre-defined test name?
450             # (default)
451 0 0         if ( $self->{ TEST_NAME_DERIVED_FROM_MODULE_NAME } )
452             {
453 0           $testmiddle = $self->process_attribute( $module, 'NAME' );
454 0           $testmiddle =~ s|::|$self->{TEST_NAME_SEPARATOR}|g;
455             }
456             else
457             {
458 0           $testmiddle = $self->{ TEST_NAME };
459             }
460             #
461             # Are we going to include a number at start of test name?
462             # (default) If so, what is sprintf format and what character is
463             # used to separate it from the lexical part of the test name?
464 0           my $testfilename;
465 0 0         if ( defined $self->{ TEST_NUMBER_FORMAT } )
466             {
467 0           $teststart = "t/" . $self->{ TEST_NUMBER_FORMAT } . $self->{ TEST_NAME_SEPARATOR };
468 0           $testfilename = sprintf( $teststart . $testmiddle . q{.t}, $ct );
469             }
470             else
471             {
472 0           $teststart = "t/";
473 0           $testfilename = $teststart . $testmiddle . q{.t};
474             }
475              
476 0           $self->print_file( $testfilename, $self->text_test( $testfilename, $module ) );
477 0           $ct++;
478             } ## end foreach my $module ( @pmfiles...)
479             } ## end unless ( $self->{ EXTRA_MODULES_SINGLE_TEST_FILE...})
480             else
481             {
482 0           my ( $teststart, $testfilename );
483 0 0         if ( defined $self->{ TEST_NUMBER_FORMAT } )
484             {
485 0           $teststart = "t/" . $self->{ TEST_NUMBER_FORMAT } . $self->{ TEST_NAME_SEPARATOR };
486 0           $testfilename = sprintf( $teststart . $self->{ TEST_NAME } . q{.t}, $self->{ FIRST_TEST_NUMBER } );
487             }
488             else
489             {
490 0           $teststart = "t/";
491 0           $testfilename = $teststart . $self->{ TEST_NAME } . q{.t};
492             }
493 0           $self->print_file( $testfilename, $self->text_test_multi( $testfilename, \@pmfiles ) );
494             } ## end else
495              
496 0           $self->print_file( 'MANIFEST', join( "\n", @{ $self->{ MANIFEST } } ) );
  0            
497 0 0         $self->make_selections_defaults() if $self->{ SAVE_AS_DEFAULTS };
498 0           return 1;
499             } ## end sub complete_build
500              
501             #################### main pod documentation begin ###################
502             ## Below is the stub of documentation for your module.
503             ## You better edit it!
504              
505             =encoding UTF-8
506              
507              
508             =head1 NAME
509              
510             ExtUtils::ModuleMaker::Siffra - Create a module
511              
512             =head1 SYNOPSIS
513              
514             use ExtUtils::ModuleMaker::Siffra;
515             blah blah blah
516              
517              
518             =head1 DESCRIPTION
519              
520             Stub documentation for this module was created by ExtUtils::ModuleMaker.
521             It looks like the author of the extension was negligent enough
522             to leave the stub unedited.
523              
524             Blah blah blah.
525              
526              
527             =head1 USAGE
528              
529              
530              
531             =head1 BUGS
532              
533              
534              
535             =head1 SUPPORT
536              
537              
538              
539             =head1 AUTHOR
540              
541             Luiz Benevenuto
542             CPAN ID: LUIZBENE
543             Siffra TI
544             luiz@siffra.com.br
545             https://siffra.com.br
546              
547             =head1 COPYRIGHT
548              
549             This program is free software; you can redistribute
550             it and/or modify it under the same terms as Perl itself.
551              
552             The full text of the license can be found in the
553             LICENSE file included with this module.
554              
555              
556             =head1 SEE ALSO
557              
558             perl(1).
559              
560             =cut
561              
562             #################### main pod documentation end ###################
563              
564             1;
565              
566             # The preceding line will help the module return a true value
567