File Coverage

blib/lib/Dist/Zilla/Plugin/Author/KENTNL/RecommendFixes.pm
Criterion Covered Total %
statement 200 238 84.0
branch 43 80 53.7
condition n/a
subroutine 65 85 76.4
pod 0 4 0.0
total 308 407 75.6


line stmt bran cond sub pod time code
1 6     6   13214802 use 5.006;
  6         21  
2 6     6   32 use strict;
  6         9  
  6         183  
3 6     6   41 use warnings;
  6         10  
  6         654  
4              
5             package Dist::Zilla::Plugin::Author::KENTNL::RecommendFixes;
6              
7             our $VERSION = '0.005004';
8              
9             # ABSTRACT: Recommend generic changes to the dist.
10              
11             our $AUTHORITY = 'cpan:KENTNL'; # AUTHORITY
12              
13 6     6   775 use Moose qw( with has around );
  6         436097  
  6         64  
14 6     6   36283 use MooX::Lsub qw( lsub );
  6         7612  
  6         28  
15 6     6   3897 use Path::Tiny qw( path );
  6         13704  
  6         385  
16 6     6   1101 use YAML::Tiny;
  6         7055  
  6         449  
17 6     6   3765 use Data::DPath qw( dpath );
  6         513344  
  6         48  
18 6     6   5102 use Generic::Assertions;
  6         10875  
  6         316  
19              
20             with 'Dist::Zilla::Role::InstallTool';
21              
22 6     6   4360 use Term::ANSIColor qw( colored ); () = eval { require Win32::Console::ANSI } if 'MSWin32' eq $^O;
  6         38690  
  6         37872  
23              
24             our $LOG_COLOR = 'yellow';
25              
26             around 'log' => sub {
27             my ( $orig, $self, @args ) = @_;
28             return $self->$orig( map { ref $_ ? $_ : colored( [$LOG_COLOR], $_ ) } @args );
29             };
30              
31             ## no critic (Subroutines::ProhibitSubroutinePrototypes,Subroutines::RequireArgUnpacking,Variables::ProhibitLocalVars)
32 9     9   20 sub _is_bad(&) { local $LOG_COLOR = 'red'; return $_[0]->() }
  9         24  
33              
34             sub _badly(&) {
35 18     18   23 my $code = shift;
36 18     15   373 return sub { local $LOG_COLOR = 'red'; return $code->(@_); };
  15     15   236  
  15     15   59  
        15      
37             }
38             ## use critic
39              
40             sub _after_true {
41 72     72   130 my ( $subname, $code ) = @_;
42             return around $subname, sub {
43 55     55   805 my ( $orig, $self, @args ) = @_;
44 55 100       2474 return unless my $rval = $self->$orig(@args);
45 11         149 return $code->( $rval, $self, @args );
46 72         454 };
47              
48             }
49              
50             sub _rel {
51 167     167   209 my ( $self, @args ) = @_;
52 167         5674 return $self->root->child(@args)->relative( $self->root );
53             }
54              
55             sub _mk_assertions {
56 10     10   46 my ( $self, @args ) = @_;
57             return Generic::Assertions->new(
58             @args,
59             '-handlers' => {
60             test => sub {
61 7     7   86 my ( $status, $message, $name ) = @_;
62 7 50       25 if ( not $status ) {
63 7         71 $self->log_debug("test $name: $message");
64 7         1992 return;
65             }
66 0         0 $self->log_debug("ok:test $name: $message");
67 0         0 return $status;
68             },
69             should => sub {
70 142     142   1695 my ( $status, $message, $name, @slurpy ) = @_;
71 142 100       285 if ( not $status ) {
72 127         502 $self->log("should $name: $message");
73 127         41297 return;
74             }
75 15         93 $self->log_debug("ok:should $name: $message");
76 15         4900 return $slurpy[0];
77             },
78             should_not => sub {
79 115     115   1091 my ( $status, $message, $name, @slurpy ) = @_;
80 115 50       218 if ($status) {
81 0         0 $self->log("should_not $name: $message");
82 0         0 return;
83             }
84 115         527 $self->log_debug("ok:should not $name: $message");
85 115         30573 return $slurpy[0];
86             },
87             must => sub {
88 0     0   0 my ( $status, $message, $name, @slurpy ) = @_;
89 0 0       0 $self->log_fatal("must $name: $message") unless $status;
90 0         0 return $slurpy[0];
91             },
92             must_not => sub {
93 0     0   0 my ( $status, $message, $name, @slurpy ) = @_;
94 0 0       0 $self->log_fatal("must_not $name: $message") if $status;
95 0         0 return $slurpy[0];
96             },
97             },
98 10         381 );
99             }
100              
101             has _pc => ( is => ro =>, lazy => 1, builder => '_build__pc' );
102              
103             sub _build__pc {
104 5     5   8 my ($self) = @_;
105              
106 5         12 my %cache;
107              
108             my $get_lines = sub {
109 46 100   46   122 exists $cache{ $_[0] } or ( $cache{ $_[0] } = [ $_[0]->lines_raw( { chomp => 1 } ) ] );
110 46         2234 return $cache{ $_[0] };
111 5         27 };
112              
113             return $self->_mk_assertions(
114             '-input_transformer' => sub {
115 167     167   1801 my ( undef, @bits ) = @_;
116 167         206 my $path = shift @bits;
117 167         372 return ( $self->_rel($path), @bits );
118             },
119             exist => sub {
120 121 100   121   24641 if ( $_[0]->exists ) {
121 15         325 return ( 1, "$_[0] exists" );
122             }
123 106         1872 return ( 0, "$_[0] does not exist" );
124             },
125             have_line => sub {
126 39     39   8244 my ( $path, $regex ) = @_;
127 39         45 my (@lines) = @{ $get_lines->($path) };
  39         74  
128 39 100       241 return ( 0, "$path has no lines ( none to match $regex )" ) unless @lines;
129 20         38 for my $line (@lines) {
130 160 50       387 return ( 1, "$path Has line matching $regex" ) if $line =~ $regex;
131             }
132 20         46 return ( 0, "$path Does not have line matching $regex" );
133             },
134             have_one_of_line => sub {
135 6     6   1261 my ( $path, @regexs ) = @_;
136 6         12 my (@rematches);
137 6         12 for my $line ( @{ $get_lines->($path) } ) {
  6         14  
138 40         56 for my $re (@regexs) {
139 80 50       195 if ( $line =~ $re ) {
140 0         0 push @rematches, "Has line matching $re";
141             }
142             }
143             }
144 6 50       24 if ( not @rematches ) {
145 6         44 return ( 0, "Does not match at least one of ( @regexs )" );
146             }
147 0 0       0 if ( @rematches > 1 ) {
148 0         0 return ( 0, 'Matches more than one of ( ' . ( join q[, ], @rematches ) . ' )' );
149             }
150 0         0 return ( 1, "Matches only @rematches" );
151             },
152             have_any_of_line => sub {
153 1     1   149 my ( $path, @regexs ) = @_;
154 1         1 my (@rematches);
155 1         2 for my $line ( @{ $get_lines->($path) } ) {
  1         3  
156 0         0 for my $re (@regexs) {
157 0 0       0 if ( $line =~ $re ) {
158 0         0 push @rematches, "Has line matching $re";
159             }
160             }
161             }
162 1 50       6 if ( not @rematches ) {
163 1         10 return ( 0, "Does not match at least one of ( @regexs )" );
164             }
165 0         0 return ( 1, 'Matches more than one of ( ' . ( join q[, ], @rematches ) . ' )' );
166             },
167             have_assign => sub {
168 0     0   0 my ( $path, $key, $callback ) = @_;
169 0         0 my (@lines) = @{ $get_lines->($path) };
  0         0  
170 0 0       0 return ( 0, "$path has no lines ( none to assign to $key )" ) unless @lines;
171 0         0 my @failures;
172 0         0 for my $line (@lines) {
173 0 0       0 if ( $line =~ /\A\s*\Q$key\E\s*=\s*(.+$)/ ) {
174 0         0 my ( $result, $message ) = $callback->("$1");
175 0 0       0 if ($result) {
176 0         0 return ( $result, "${path}'s $key assigns ok ( $message )" );
177             }
178 0         0 push @failures, $message;
179             }
180             }
181 0 0       0 if ( not @failures ) {
182 0         0 return ( 0, "${path}'s $key is not assigned" );
183             }
184 0         0 return ( 0, "${path}'s $key does not assign ok (" . ( join q[, ], @failures ) . ')' );
185             },
186 5         119 );
187             }
188              
189             has _dc => ( is => ro =>, lazy => 1, builder => '_build__dc' );
190              
191             sub _build__dc {
192 5     5   12 my ($self) = @_;
193              
194 5         11 my %yaml_cache;
195              
196             my $get_yaml = sub {
197             exists $yaml_cache{ $_[0] } or (
198 12 100   12   5393 $yaml_cache{ $_[0] } = do {
199 1         9 my ( $r, $ok );
200             ## no critic (ErrorHandling::RequireCheckingReturnValueOfEval)
201 1         2 eval {
202 1         6 $r = YAML::Tiny->read( path( $_[0] )->stringify )->[0];
203 1         2379 $ok = 1;
204             };
205 1         7 $r;
206             }
207             );
208 12         74 return $yaml_cache{ $_[0] };
209 5         37 };
210              
211             return $self->_mk_assertions(
212             have_dpath => sub {
213 85     85   1440 my ( $label, $data, $expression ) = @_;
214 85 50       187 if ( dpath($expression)->match($data) ) {
215 0         0 return ( 1, "$label matches $expression" );
216             }
217 85         29399 return ( 0, "$label does not match $expression" );
218              
219             },
220             yaml_have_dpath => sub {
221 12     12   260 my ( $yaml_path, $expression ) = @_;
222 12 50       33 if ( dpath($expression)->match( $get_yaml->($yaml_path) ) ) {
223 0         0 return ( 1, "$yaml_path matches $expression" );
224             }
225 12         1201 return ( 0, "$yaml_path does not match $expression" );
226              
227             },
228 5         93 );
229              
230             }
231              
232 5     5   77 lsub root => sub { my ($self) = @_; return path( $self->zilla->root ) };
  5         192  
233              
234             my %amap = (
235             git => '.git',
236             libdir => 'lib',
237             dist_ini => 'dist.ini',
238             git_config => '.git/config',
239             dist_ini_meta => 'dist.ini.meta',
240             weaver_ini => 'weaver.ini',
241             travis_yml => '.travis.yml',
242             perltidyrc => '.perltidyrc',
243             gitignore => '.gitignore',
244             changes => 'Changes',
245             license => 'LICENSE',
246             mailmap => '.mailmap',
247             perlcritic_gen => 'maint/perlcritic.rc.gen.pl',
248             perlcritic_deps => 'misc/perlcritic.deps',
249             contributing_pod => 'CONTRIBUTING.pod',
250             contributing_mkdn => 'CONTRIBUTING.mkdn',
251             makefile_pl => 'Makefile.PL',
252             install_skip => 'INSTALL.SKIP',
253             readme_pod => 'README.pod',
254             tdir => 't',
255             );
256              
257             for my $key (qw( git libdir dist_ini )) {
258             my $value = delete $amap{$key};
259             lsub $key => _badly { $_[0]->_pc->should( exist => $value ) };
260             }
261             for my $key ( keys %amap ) {
262             my $value = $amap{$key};
263 66     66   3593 lsub $key => sub { $_[0]->_pc->should( exist => $value ) };
        66      
        66      
        66      
        66      
        66      
        66      
        66      
        66      
        66      
        66      
        66      
        66      
        66      
        66      
        66      
        66      
264 0     0   0 lsub "_have_$key" => sub { $_[0]->_pc->test( exist => $value ) };
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
        0      
265             }
266              
267             _after_true makefile_pl => sub {
268             my ( $file, $self ) = @_;
269             undef $file if $self->install_skip;
270             return $file;
271             };
272              
273             _after_true contributing_pod => sub {
274             my ( $file, $self ) = @_;
275             undef $file if $self->_pc->should_not( exist => $amap{contributing_mkdn} );
276             return $file;
277             };
278              
279             _after_true gitignore => sub {
280             my ( $rval, $self, ) = @_;
281             my $file = $amap{'gitignore'};
282             my $assert = $self->_pc;
283             my $ok = $rval;
284             my $distname = $self->zilla->name;
285             undef $ok unless $assert->should( have_line => $file, qr/\A\/\.build\z/ );
286             undef $ok unless $assert->should( have_line => $file, qr/\A\/tmp\/\z/ );
287              
288             undef $ok unless $assert->should( have_line => $file, qr/\A\/\Q$distname\E-\*\z/ );
289             undef $ok unless $assert->should_not( have_line => $file, qr/\A\Q$distname\E-\*\z/ );
290              
291             if ( $self->_have_makefile_pl ) {
292             ## no critic ( RegularExpressions::ProhibitFixedStringMatches )
293             undef $ok unless $assert->should( have_line => $file, qr/\A\/META\.json\z/ );
294             undef $ok unless $assert->should( have_line => $file, qr/\A\/MYMETA\.json\z/ );
295             undef $ok unless $assert->should( have_line => $file, qr/\A\/META\.yml\z/ );
296             undef $ok unless $assert->should( have_line => $file, qr/\A\/MYMETA\.yml\z/ );
297             undef $ok unless $assert->should( have_line => $file, qr/\A\/Makefile\z/ );
298             undef $ok unless $assert->should( have_line => $file, qr/\A\/Makefile\.old\z/ );
299             undef $ok unless $assert->should( have_line => $file, qr/\A\/blib\/\z/ );
300             undef $ok unless $assert->should( have_line => $file, qr/\A\/pm_to_blib\z/ );
301             }
302             return $ok;
303             };
304              
305             _after_true install_skip => sub {
306             my ( $rval, $self, ) = @_;
307             my $skipfile = $amap{'install_skip'};
308             my (@entries) = qw( contributing_pod readme_pod );
309             my $assert = $self->_pc;
310             my $ok = $rval;
311             for my $entry (@entries) {
312             my $sub = $self->can("_have_${entry}");
313             next unless $self->$sub();
314             my $entry_re = quotemeta $amap{$entry};
315             undef $ok unless $assert->should( have_line => $skipfile, qr/\A\Q$entry_re\E\$\z/ );
316             }
317             return $ok;
318             };
319              
320 5     5   214 lsub changes_deps_files => sub { return [qw( Changes.deps Changes.deps.all Changes.deps.dev Changes.deps.all )] };
321              
322             lsub libfiles => sub {
323 2     2   25 my ($self) = @_;
324 2 50       53 return [] unless $self->libdir;
325 2         14 my @out;
326 2         47 my $it = $self->libdir->iterator( { recurse => 1 } );
327 2         56 while ( my $thing = $it->() ) {
328 6 100       622 next if -d $thing;
329 3 100       32 next unless $thing->basename =~ /\.pm\z/msx;
330 1         20 push @out, $thing;
331             }
332 2 100       63 if ( not @out ) {
333 1     1   5 _is_bad { $self->log( 'Should have modules in ' . $self->libdir ) };
  1         30  
334             }
335              
336 2         302 return \@out;
337             };
338             lsub tfiles => sub {
339 1     1   12 my ($self) = @_;
340 1 50       24 return [] unless $self->tdir;
341 1         7 my @out;
342 1         29 my $it = $self->tdir->iterator( { recurse => 1 } );
343 1         22 while ( my $thing = $it->() ) {
344 1 50       105 next if -d $thing;
345 1 50       11 next unless $thing->basename =~ /\.t\z/msx;
346 1         22 push @out, $thing;
347             }
348 1 50       30 if ( not @out ) {
349 0         0 $self->log( 'Should have tests in ' . $self->tdir );
350             }
351 1         34 return \@out;
352              
353             };
354              
355             sub has_new_changes_deps {
356 5     5 0 10 my ($self) = @_;
357 5         9 my $ok = 1;
358 5         189 my $assert = $self->_pc;
359 5         11 for my $file ( @{ $self->changes_deps_files } ) {
  5         164  
360 20 50       110 undef $ok unless $assert->should( exist => 'misc/' . $file );
361 20 50       65 undef $ok unless $assert->should_not( exist => $file );
362             }
363 5         13 return $ok;
364             }
365              
366             _after_true perlcritic_deps => sub {
367             my ( $file, $self ) = @_;
368             my $ok = $file;
369             my $assert = $self->_pc;
370             undef $ok unless $assert->should_not( exist => 'perlcritic.deps' );
371             return $ok;
372             };
373              
374             _after_true 'perlcritic_gen' => sub {
375             my ( $file, $self ) = @_;
376             my $assert = $self->_pc;
377             my $ok = $file;
378             undef $ok unless $assert->should( have_line => $file, qr/Path::Tiny/ );
379             undef $ok unless $assert->should( have_line => $file, qr/\.\/misc/ );
380             return $ok;
381             };
382              
383             _after_true 'git_config' => sub {
384             my ( $rval, $self ) = @_;
385             undef $rval unless $self->_pc->should_not( have_line => $rval, qr/kentfredric/ );
386             return $rval;
387             };
388              
389 6     6   13 sub _matrix_include_perl { my ($perl) = @_; return "/matrix/include/*/perl[ value eq \"$perl\"]"; }
  6         35  
390 4     4   8 sub _branch_only { my ($branch) = @_; return '/branches/only/*[ value eq "' . $branch . '"]' }
  4         22  
391              
392             _after_true 'travis_yml' => sub {
393             my ( $yaml, $self ) = @_;
394             my $assert = $self->_dc;
395             my $ok = $yaml;
396              
397             undef $ok unless $assert->should( yaml_have_dpath => $yaml, '/matrix/include/*/env[ value =~ /COVERAGE_TESTING=1/' );
398              
399             for my $perl (qw( 5.21 5.20 5.10 )) {
400             undef $ok unless $assert->should( yaml_have_dpath => $yaml, _matrix_include_perl($perl) );
401             }
402             for my $perl (qw( 5.8 )) {
403             undef $ok unless $assert->should( yaml_have_dpath => $yaml, _matrix_include_perl($perl) );
404             }
405             for my $perl (qw( 5.19 )) {
406             undef $ok unless _is_bad { $assert->should_not( yaml_have_dpath => $yaml, _matrix_include_perl($perl) ) };
407             }
408             for my $perl (qw( 5.18 )) {
409             undef $ok unless $assert->should_not( yaml_have_dpath => $yaml, _matrix_include_perl($perl) );
410             }
411             undef $ok
412             unless _is_bad { $assert->should( yaml_have_dpath => $yaml, '/before_install/*[ value =~/git clone.*maint-travis-ci/ ]' ) };
413             for my $branch (qw( master builds releases )) {
414             undef $ok unless $assert->should( yaml_have_dpath => $yaml, _branch_only($branch) );
415             }
416             for my $branch (qw( build/master )) {
417             undef $ok unless $assert->should_not( yaml_have_dpath => $yaml, _branch_only($branch) );
418             }
419              
420             return $ok;
421             };
422              
423             _after_true 'dist_ini' => sub {
424             my ( $ini, $self ) = @_;
425             my $assert = $self->_pc;
426             my $ok = $ini;
427             my (@tests) = ( qr/dzil bakeini/, qr/normal_form\s*=\s*numify/, qr/mantissa\s*=\s*6/, );
428             for my $test (@tests) {
429             undef $ok unless $assert->should( have_line => $ini, $test );
430             }
431             if ( not $assert->test( have_line => $ini, qr/dzil bakeini/ ) ) {
432             _is_bad { undef $ok unless $assert->should( have_one_of_line => $ini, qr/bump_?versions\s*=\s*1/, qr/git_versions/ ) };
433             }
434             return $ok;
435             };
436              
437             _after_true 'weaver_ini' => sub {
438             my ( $weave, $self ) = @_;
439             my $assert = $self->_pc;
440             my $ok = $weave;
441             undef $ok unless $assert->should( have_line => $weave, qr/-SingleEncoding/, );
442             undef $ok unless $assert->should_not( have_line => $weave, qr/-Encoding/, );
443             return $ok;
444             };
445              
446             _after_true 'dist_ini_meta' => sub {
447             my ( $file, $self ) = @_;
448             my $assert = $self->_pc;
449             my (@wanted_regex) = (
450             qr/bump_?versions\s*=\s*1/, qr/toolkit\s*=\s*eumm/,
451             qr/toolkit_hardness\s*=\s*soft/, qr/src_?readme\s*=.*/,
452             qr/copyright_holder\s*=.*<[^@]+@[^>]+>/, qr/twitter_extra_hash_tags\s*=\s*#/,
453             qr/;\s*vim:\s+.*syntax=dosini/,
454             );
455             my (@unwanted_regex) = (
456             #
457             qr/copy_?files\s*=.*LICENSE/,
458             qr/author.*=.*kentfredric/, qr/git_versions/, #
459             qr/twitter_hash_tags\s*=\s*#perl\s+#cpan\s*/, #
460             );
461             my $ok = $file;
462             for my $test (@wanted_regex) {
463             undef $ok unless $assert->should( have_line => $file, $test );
464             }
465             for my $test (@unwanted_regex) {
466             undef $ok unless $assert->should_not( have_line => $file, $test );
467             }
468             my (@upgrade_regex) = ( qr/src_readme\s*=.*/, qr/bump_versions\s*=.*/, qr/copy_files\s*=.*/ );
469             if ( $assert->test( have_any_of_line => $file, @upgrade_regex ) ) {
470             my $check = sub {
471             my $v = $_[0];
472             return (
473             ( version->parse('2.025020') <= version->parse($v) )
474             ? ( 1, "version $v is at least 2.025020" )
475             : ( 0, "version $v is not at least 2.025020" )
476             );
477             };
478             undef $ok unless $assert->should( have_assign => $file, ':version' => $check );
479             }
480              
481             _is_bad {
482             undef $ok unless $assert->should( have_one_of_line => $file, qr/bump_?versions\s*=\s*1/, qr/git_versions/ );
483             };
484              
485             return $ok;
486             };
487              
488             lsub unrecommend => sub {
489             [
490 5     5   234 qw( Path::Class Path::Class::File Path::Class::Dir ), # Path::Tiny preferred
491             qw( JSON JSON::XS JSON::Any ), # JSON::MaybeXS preferred
492             qw( Path::IsDev Path::FindDev ), # Ugh, this is such a bad idea
493             qw( File::ShareDir::ProjectDistDir ), # Whhhy
494             qw( File::Find File::Find::Rule ), # Path::Iterator::Rule is much better
495             qw( Class::Load ), # Module::Runtime preferred
496             qw( Readonly ), # use Const::Fast
497             qw( Sub::Name ), # use Sub::Util
498             qw( autobox ), # Rewrite it
499             qw( Moose::Autobox ), # Rewrite it
500             qw( List::MoreUtils ), # Some people want to avoid it,
501             # consider avoiding if its easy to do so
502             ];
503             };
504              
505             sub avoid_old_modules {
506 5     5 0 11 my ($self) = @_;
507 5 50       175 return unless my $distmeta = $self->zilla->distmeta;
508 5         506 my $assert = $self->_dc;
509              
510 5         14 my $ok = 1;
511 5         9 for my $bad ( @{ $self->unrecommend } ) {
  5         235  
512 85 50       313 undef $ok unless $assert->should_not( have_dpath => 'distmeta', $distmeta, '/prereqs/*/*/' . $bad );
513             }
514 5         14 return $ok;
515             }
516              
517             _after_true 'mailmap' => sub {
518             my ( $mailmap, $self ) = @_;
519             my $ok = $mailmap;
520             undef $ok unless $self->_pc->should( have_line => $mailmap, qr/<kentnl\@cpan.org>.*<kentfredric\@gmail.com>/ );
521             return $ok;
522             };
523              
524             # Hack to avoid matching ourselves.
525             sub _plugin_re {
526 1     1   2 my $inpn = shift;
527 1         7 my $pn = join q[::], split qr/\+/, $inpn;
528 1         17 return qr/$pn/;
529             }
530              
531             sub dzil_plugin_check {
532 5     5 0 11 my ($self) = @_;
533 5 100       149 return unless $self->libdir;
534 2 100       18 return unless @{ $self->libfiles };
  2         53  
535 1         37 my $assert = $self->_pc;
536 1         2 my (@plugins) = grep { $_->stringify =~ /\Alib\/Dist\/Zilla\/Plugin\//msx } @{ $self->libfiles };
  1         8  
  1         28  
537 1 50       8 return unless @plugins;
538 1         2 for my $plugin (@plugins) {
539 1         2 $assert->should_not( have_line => $plugin, _plugin_re('Dist+Zilla+Util+ConfigDumper') );
540             }
541 1 50       31 return unless $self->tdir;
542 1 50       8 return unless @{ $self->tfiles };
  1         27  
543             FIND_DZTEST: {
544 1         7 for my $tfile ( @{ $self->tfiles } ) {
  1         1  
  1         23  
545 1 50       10 if ( $assert->test( have_line => $tfile, qr/dztest/ ) ) {
546 0         0 $self->log('Tests should probably not use dztest (Dist::Zilla::Util::Test::KENTNL)');
547 0         0 last FIND_DZTEST;
548             }
549             }
550             }
551 1         2 return;
552             }
553              
554             sub setup_installer {
555 5     5 0 401510 my ($self) = @_;
556 5         214 $self->git;
557 5         49 $self->git_config;
558 5         59 $self->dist_ini;
559 5         29 $self->dist_ini_meta;
560 5         58 $self->weaver_ini;
561 5         48 $self->travis_yml;
562 5         53 $self->contributing_pod;
563 5         64 $self->makefile_pl;
564 5         210 $self->perltidyrc;
565 5         46 $self->gitignore;
566 5         211 $self->changes;
567 5         194 $self->license;
568 5         42 $self->has_new_changes_deps;
569 5         30 $self->perlcritic_deps;
570 5         62 $self->perlcritic_gen;
571 5         47 $self->avoid_old_modules;
572 5         30 $self->mailmap;
573 5         47 $self->dzil_plugin_check;
574 5         41 return;
575             }
576              
577             __PACKAGE__->meta->make_immutable;
578 6     6   76 no Moose;
  6         11  
  6         69  
579              
580             1;
581              
582             __END__
583              
584             =pod
585              
586             =encoding UTF-8
587              
588             =head1 NAME
589              
590             Dist::Zilla::Plugin::Author::KENTNL::RecommendFixes - Recommend generic changes to the dist.
591              
592             =head1 VERSION
593              
594             version 0.005004
595              
596             =head1 DESCRIPTION
597              
598             Nothing interesting to see here.
599              
600             This module just informs me during C<dzil build> that a bunch of
601             changes that I intend to make to multiple modules have not been applied
602             to the current distribution.
603              
604             It does this by spewing colored output.
605              
606             =for Pod::Coverage setup_installer
607             has_new_changes_deps
608             avoid_old_modules
609             dzil_plugin_check
610              
611             =head1 AUTHOR
612              
613             Kent Fredric <kentnl@cpan.org>
614              
615             =head1 COPYRIGHT AND LICENSE
616              
617             This software is copyright (c) 2017 by Kent Fredric <kentfredric@gmail.com>.
618              
619             This is free software; you can redistribute it and/or modify it under
620             the same terms as the Perl 5 programming language system itself.
621              
622             =cut