File Coverage

blib/lib/Dist/Zilla/PluginBundle/Author/WATERKIP.pm
Criterion Covered Total %
statement 15 43 34.8
branch 0 14 0.0
condition 0 6 0.0
subroutine 5 10 50.0
pod 4 4 100.0
total 24 77 31.1


line stmt bran cond sub pod time code
1             package Dist::Zilla::PluginBundle::Author::WATERKIP;
2 1     1   127978 use Moose;
  1         477400  
  1         7  
3              
4             # ABSTRACT: An plugin bundle for all distributions by WATERKIP
5             # KEYWORDS: author bundle distribution tool
6              
7 1     1   8726 use Data::Dumper;
  1         8353  
  1         87  
8 1     1   9 use List::Util qw(uniq any first);
  1         3  
  1         79  
9 1     1   7 use Moose::Util::TypeConstraints qw(enum subtype where);
  1         3  
  1         11  
10 1     1   1261 use namespace::autoclean;
  1         8196  
  1         5  
11              
12             our $VERSION = '3.3';
13              
14             with
15             'Dist::Zilla::Role::PluginBundle::Easy',
16             'Dist::Zilla::Role::PluginBundle::Airplane',
17             'Dist::Zilla::Role::PluginBundle::PluginRemover' =>
18             { -version => '0.103' },
19             'Dist::Zilla::Role::PluginBundle::Config::Slicer';
20              
21             has server => (
22             is => 'ro',
23             isa => enum([qw(github bitbucket gitlab none)]),
24             init_arg => undef,
25             lazy => 1,
26             default => sub { $_[0]->payload->{server} // 'gitlab' },
27             );
28              
29             has license => (
30             is => 'ro',
31             isa => 'Str',
32             init_arg => undef,
33             lazy => 1,
34             default => sub { $_[0]->payload->{license} // 'LICENSE' },
35             );
36              
37             has exclude_files => (
38             isa => 'ArrayRef[Str]',
39             init_arg => undef,
40             lazy => 1,
41             default => sub { $_[0]->payload->{exclude_files} // [] },
42             traits => ['Array'],
43             handles => { exclude_files => 'elements' },
44             );
45              
46             around exclude_files => sub {
47             my $orig = shift;
48             my $self = shift;
49             sort(uniq(
50             $self->$orig(@_),
51             qw(Dockerfile .gitlab-ci.yml docker-compose.yml docker-compose.override.yml .dockerignore dev-bin/cpanm)
52             ));
53             };
54              
55             has copy_file_from_build => (
56             isa => 'ArrayRef[Str]',
57             init_arg => undef,
58             lazy => 1,
59             default => sub { $_[0]->payload->{copy_file_from_build} // [] },
60             traits => ['Array'],
61             handles => { copy_files_from_build => 'elements' },
62             );
63              
64             around copy_files_from_build => sub {
65             my $orig = shift;
66             my $self = shift;
67             sort(uniq(
68             $self->$orig(@_),
69             qw(Makefile.PL cpanfile Build.PL README README.md CONTRIBUTORS),
70             $self->license
71             ));
72             };
73              
74             has copy_file_from_release => (
75             isa => 'ArrayRef[Str]',
76             init_arg => undef,
77             lazy => 1,
78             default => sub { $_[0]->payload->{copy_file_from_release} // [] },
79             traits => ['Array'],
80             handles => { copy_files_from_release => 'elements' },
81             );
82              
83             sub mvp_multivalue_args { qw(copy_file_from_build copy_file_from_release exclude_files) }
84              
85             around copy_files_from_release => sub {
86             my $orig = shift;
87             my $self = shift;
88             sort(uniq(
89             $self->$orig(@_),
90             qw(CONTRIBUTING ppport.h INSTALL)
91             ));
92             };
93              
94             has debug => (
95             is => 'ro',
96             isa => 'Bool',
97             init_arg => undef,
98             lazy => 1,
99             default =>
100             sub { $ENV{DZIL_AUTHOR_DEBUG} // $_[0]->payload->{debug} // 0 },
101             );
102              
103             has upload_to => (
104             is => 'ro',
105             isa => enum([qw(cpan pause stratopan local)]),
106             init_arg => undef,
107             lazy => 1,
108             default => sub { $_[0]->payload->{upload_to} // 'cpan' },
109             );
110              
111             has authority => (
112             is => 'ro',
113             isa => 'Str',
114             init_arg => undef,
115             lazy => 1,
116             default => sub {
117             my $self = shift;
118             $self->payload->{authority} // 'cpan:WATERKIP';
119             },
120             );
121              
122             has fake_release => (
123             is => 'ro',
124             isa => 'Bool',
125             init_arg => undef,
126             lazy => 1,
127             default =>
128             sub { $ENV{FAKE_RELEASE} // $_[0]->payload->{fake_release} // 0 },
129             );
130              
131             has changes_version_columns => (
132             is => 'ro',
133             isa => subtype('Int', where { $_ > 0 && $_ < 20 }),
134             init_arg => undef,
135             lazy => 1,
136             default => sub { $_[0]->payload->{changes_version_columns} // 10 },
137             );
138              
139             sub _warn_me {
140 0     0     my $msg = shift;
141 0           warn(sprintf("[\@Author::WATERKIP] %s\n", $msg));
142             }
143              
144             sub commit_files_after_release {
145 0     0 1   my $self = shift;
146 0           grep { -e }
  0            
147             sort(uniq('README.pod', 'Changes', $self->copy_files_from_release, $self->copy_files_from_build));
148             }
149              
150             sub build_network_plugins {
151 0     0 1   return [qw(
152             PromptIfStale
153             Test::Pod::LinkCheck
154             Test::Pod::No404s
155             Git::Remote::Check
156             CheckPrereqsIndexed
157             CheckIssues
158             UploadToCPAN
159             UploadToStratopan
160             Git::Push
161             )];
162             };
163              
164             my %removed;
165              
166             sub release_option {
167 0     0 1   my $self = shift;
168 0 0         if ($self->fake_release) {
169 0           _warn_me("Fake release has been set");
170 0           return 'FakeRelease';
171             }
172 0 0         if ($self->upload_to eq 'stratopan') {
173 0           _warn_me("Stratopan release has been set");
174 0           my $prefix = 'stratopan';
175             return [
176             'UploadToStratopan' => {
177             repo => $self->payload->{"$prefix.repo"},
178             stack => $self->payload->{"$prefix.stack"},
179 0           recurse => $self->payload->{"$prefix.recurse"},
180             }
181             ],
182             ;
183             }
184 0           return 'UploadToCPAN';
185             }
186              
187             sub configure {
188 0     0 1   my $self = shift;
189              
190 0 0         if ($self->debug) {
191 0           _warn_me(Dumper { payload => $self->payload, });
192             }
193              
194 0 0 0       if (!-d '.git' and -f 'META.json' and !exists $removed{'Git::GatherDir'})
      0        
195             {
196 0 0         _warn_me(
197             '.git is missing and META.json is present -- this looks like a CPAN download rather than a git repository. You should probably run '
198             . (
199             -f 'Build.PL'
200             ? 'perl Build.PL; ./Build'
201             : 'perl Makefile.PL; make'
202             )
203             . ' instead of using dzil commands!',
204             );
205             }
206              
207             my @plugins = (
208              
209             [
210             'Git::GatherDir' => {
211             do {
212             my @filenames = uniq(
213 0           grep { -e } $self->copy_files_from_release,
  0            
214             $self->copy_files_from_build,
215             $self->exclude_files,
216             );
217 0 0         @filenames ? (exclude_filename => \@filenames) : ();
218             },
219             },
220             ],
221              
222             [
223             'PromptIfStale' => 'stale modules, build' =>
224             { phase => 'build', module => [$self->meta->name] }
225             ],
226             [
227             'PromptIfStale' => 'stale modules, release' => {
228             phase => 'release',
229             check_all_plugins => 1,
230             check_all_prereqs => 1
231             }
232             ],
233              
234             qw(PruneCruft ManifestSkip MetaYAML MetaJSON),
235              
236             ['License' => { filename => $self->license }],
237              
238             ['ReadmeFromPod' => { type => 'markdown', readme => 'README.md' }],
239              
240             qw(ExecDir ShareDir MakeMaker Manifest
241             TestRelease PodWeaver),
242              
243             ['Git::Contributors' => { order_by => 'commits', include_authors => 1 }],
244             ['ContributorsFile' => { filename => 'CONTRIBUTORS' }],
245              
246             [
247             'AutoPrereqs' => {
248             skip => [
249 0 0         map { "^$_\$" } qw(
  0            
250             Data::Dumper
251             Exporter
252             autodie
253             base
254             constant
255             feature
256             overload
257             perl
258             strict
259             utf8
260             vars
261             warnings
262             )
263             ]
264             }
265             ],
266             ['Prereqs::AuthorDeps' => { ':version' => '0.006' }],
267             [
268             'MinimumPerl' => {
269             ':version' => '1.006',
270             configure_finder => ':NoFiles'
271             }
272             ],
273             ['MetaProvides::Package'],
274              
275             [
276             'Encoding' => [
277             encoding => 'bytes',
278             match => '\.ico$',
279             match => '\.docx?$',
280             match => '\.zip$',
281             match => '\.ztb$', # Mintlab specific, just a zip file
282             match => '\.pdf$',
283             match => '\.odt$',
284             match => '\.msg$',
285             match => '\.gz$',
286             ]
287             ],
288              
289             ['CPANFile'],
290              
291             [
292             'CopyFilesFromBuild::Filtered' =>
293             { copy => [$self->copy_files_from_build] }
294             ],
295              
296             [ 'Git::Check' => 'initial check' => { allow_dirty => [ $self->airplane ? 'dist.ini' : '' ] } ],
297              
298             qw(Git::CheckFor::MergeConflicts),
299             ['Git::Remote::Check' => { branch => 'master', remote_branch => 'master' } ],
300             ['Git::CheckFor::CorrectBranch' =>
301             { release_branch => 'master' }
302             ],
303              
304             qw(CheckPrereqsIndexed),
305              
306             ['Repository'],
307             ['ConfirmRelease'],
308              
309             # This plugin seems cool, but also unmaintained with downstream
310             # deps which are also unmaintained. ABORT
311             #[ 'PrereqsClean'],
312              
313             $self->release_option,
314              
315             [
316             'CopyFilesFromRelease' =>
317             { filename => [$self->copy_files_from_release] }
318             ],
319             );
320              
321             # Disable test::perl::critic as it messes with the version rewrite
322             # that happens during a build
323             # Also disable portability files as foo.conf.dist is not allowed :(
324 0           $self->add_bundle(
325             '@TestingMania' => {
326             disable => [
327             qw(
328             Test::Perl::Critic
329             Test::Portability::Files
330             Test::Portability
331             )
332             ]
333             }
334             );
335              
336             # plugins to do with calculating, munging, incrementing versions
337 0           $self->add_bundle(
338             '@Git::VersionManager' => {
339             'RewriteVersion::Transitional.global' => 1,
340             'RewriteVersion::Transitional.fallback_version_provider' =>
341             'Git::NextVersion',
342             'RewriteVersion::Transitional.version_regexp' =>
343             '^v([\d._]+)(-TRIAL)?$',
344              
345             # for first Git::Commit
346             commit_files_after_release => [$self->commit_files_after_release],
347              
348             # because of [Git::Check], only files copied from the release would
349             # be added -- there is nothing else hanging around in the current
350             # directory
351             'release snapshot.add_files_in' => ['.'],
352             'release snapshot.commit_msg' => '%N-%v%t%n%n%c',
353              
354             'Git::Tag.tag_message' => 'v%v%t',
355              
356             'BumpVersionAfterRelease::Transitional.global' => 1,
357              
358             'NextRelease.:version' => '5.033',
359             'NextRelease.time_zone' => 'UTC',
360             'NextRelease.format' => '%-'
361             . ($self->changes_version_columns - 2)
362             . 'v %{yyyy-MM-dd HH:mm:ss\'Z\'}d%{ (TRIAL RELEASE)}T',
363             }
364             );
365 0           $self->add_plugins(@plugins);
366              
367             }
368              
369              
370             __PACKAGE__->meta->make_immutable;
371              
372             __END__
373              
374             =pod
375              
376             =encoding UTF-8
377              
378             =head1 NAME
379              
380             Dist::Zilla::PluginBundle::Author::WATERKIP - An plugin bundle for all distributions by WATERKIP
381              
382             =head1 VERSION
383              
384             version 3.3
385              
386             =head1 SYNOPSIS
387              
388             In your F<dist.ini>:
389              
390             [@Author::WATERKIP]
391              
392             =head1 DESCRIPTION
393              
394             This is a L<Dist::Zilla> plugin bundle. It is somewhat equal to the
395             following F<dist.ini>:
396              
397             [Git::GatherDir]
398             exclude_filename = .dockerignore
399             exclude_filename = .gitlab-ci.yml
400             exclude_filename = Dockerfile
401             exclude_filename = docker-compose.override.yml
402             exclude_filename = docker-compose.yml
403              
404             [PromptIfStale 'stale modules, build']
405             phase = build
406             module = ... ; lookup syntax
407              
408             [PruneCruft]
409             [ManifestSkip]
410             [MetaYAML]
411             [MetaJSON]
412              
413             [License]
414             filename = LICENSE
415              
416             [ReadmeFromPod]
417             type = markdown
418             readme = README.md
419              
420             [ExecDir]
421             [ShareDir]
422             [MakeMaker]
423             [Manifest]
424             [TestRelease]
425             [PodWeaver]
426              
427             [Git::Contributors]
428             order_by = commits
429              
430             [ContributesFile]
431             filename = CONTRIBUTORS
432              
433             [AutoPrereqs]
434             skip = ^perl$
435             skip = ^utf8$
436             skip = ^warnings$
437             skip = ^strict$
438             skip = ^overload$
439             skip = ^vars$
440              
441             [Prereqs::AuthorDeps]
442             [MinimumPerl]
443             configure_finder = :NoFiles
444              
445             [MetaProvides::Package]
446              
447             [Encoding]
448             encoding = bytes
449             match = \.ico$
450             match = \.docx?$
451             match = \.zip$
452             match = \.ztb$ ; Mintlab specific
453             match = \.pdf$
454             match = \.odt$
455              
456             [CPANFile]
457              
458             [CopyFilesFromBuild::Filtered]
459             copy = cpanfile, Makefile.pl, CONTRIBUTORS, LICENSE, README.md
460              
461             [Git::Check 'initial check']
462             allow_dirty = dist.ini; only if airplane mode is set
463              
464             [Git::CheckFor::MergeConflicts]
465             [Git::Remote::Check]
466             branch = master
467             remote_branch = master
468              
469             [Git::CheckFor::CorrectBranch]
470             release_branch = master
471              
472             [CheckPrereqsIndexed]
473              
474             [Repository]
475             [ConfirmRelease]
476              
477             [CopyFilesFromRelease]
478             filename = cpanfile, Makefile.pl, CONTRIBUTORS, LICENSE, README.md
479              
480             [@TestingMania]
481             disable = Test::Perl::Critic
482             disable = Test::Portability::Files
483             disable = Test::Portability
484              
485             [@Git::VersionManager]
486             RewriteVersion::Transitional.global = 1
487             RewriteVersion::Transitional.fallback_version_provider = Git::NextVersion
488             RewriteVersion::Transitional.version_regexp = ^v([\d._]+)(-TRIAL)?$
489              
490             commit_files_after_release = Changes LICENSE README.md
491              
492             release snapshot.add_files_in = .
493             release snapshot.commit_msg = %N-%v%t%n%n%c
494              
495             Git::Tag.tag_message = v%v%t
496              
497             BumpVersionAfterRelease::Transitional.global = 1
498              
499             NextRelease.time_zone = UTC
500             NextRelease.format = %-8v %{yyyy-MM-dd HH:mm:ss\'Z\'}d%{ (TRIAL RELEASE)}T'
501              
502             =head1 METHODS
503              
504             =head2 configure
505              
506             Configure the author plugin
507              
508             =head2 commit_files_after_release
509              
510             Commit files after a release
511              
512             =head2 release_option
513              
514             Define the release options. Choose between:
515              
516             C<cpan> or C<stratopan>. When fake release is used, this overrides these two options
517              
518             =head2 build_network_plugins
519              
520             Builder for network plugins
521              
522             =head1 SEE ALSO
523              
524             I took inspiration from L<Dist::Zilla::PluginBundle::Author::ETHER>
525              
526             =head1 AUTHOR
527              
528             Wesley Schwengle <waterkip@cpan.org>
529              
530             =head1 COPYRIGHT AND LICENSE
531              
532             This software is copyright (c) 2017 by Wesley Schwengle.
533              
534             This is free software; you can redistribute it and/or modify it under
535             the same terms as the Perl 5 programming language system itself.
536              
537             =cut