File Coverage

lib/Dist/Zilla/PluginBundle/Author/AJNN.pm
Criterion Covered Total %
statement 47 48 97.9
branch 5 8 62.5
condition n/a
subroutine 12 12 100.0
pod 0 2 0.0
total 64 70 91.4


line stmt bran cond sub pod time code
1 3     3   6631776 use 5.026;
  3         13  
2 3     3   17 use warnings;
  3         9  
  3         225  
3              
4             package Dist::Zilla::PluginBundle::Author::AJNN;
5             # ABSTRACT: Dist::Zilla configuration the way AJNN does it
6             $Dist::Zilla::PluginBundle::Author::AJNN::VERSION = '0.05';
7              
8 3     3   23 use Dist::Zilla;
  3         7  
  3         107  
9 3     3   18 use Moose;
  3         9  
  3         30  
10 3     3   22055 use namespace::autoclean;
  3         9  
  3         65  
11              
12             with 'Dist::Zilla::Role::PluginBundle::Easy';
13              
14 3     3   1237 use Dist::Zilla::PluginBundle::Author::AJNN::Readme;
  3         11  
  3         122  
15 3     3   1034 use Pod::Weaver::PluginBundle::Author::AJNN;
  3         21  
  3         174  
16              
17 3     3   25 use List::Util 1.33 'none';
  3         79  
  3         231  
18 3     3   24 use Path::Tiny;
  3         7  
  3         2777  
19              
20              
21             my @mvp_multivalue_args;
22 6     6 0 188143 sub mvp_multivalue_args { @mvp_multivalue_args }
23              
24             has cpan_release => (
25             is => 'ro',
26             isa => 'Str',
27             lazy => 1,
28             default => sub { $_[0]->payload->{'cpan_release'} // '1' },
29             );
30              
31             has gatherdir_exclude_match => (
32             is => 'ro',
33             isa => 'ArrayRef[Str]',
34             lazy => 1,
35             default => sub { $_[0]->payload->{'GatherDir.exclude_match'} || [] },
36             );
37             push @mvp_multivalue_args, 'GatherDir.exclude_match';
38              
39             has max_target_perl => (
40             is => 'ro',
41             isa => 'Str',
42             lazy => 1,
43             default => sub { $_[0]->payload->{'Test::MinimumVersion.max_target_perl'} || '' },
44             );
45              
46             has podweaver_skip => (
47             is => 'ro',
48             isa => 'ArrayRef[Str]',
49             lazy => 1,
50             default => sub { $_[0]->payload->{'PodWeaver.skip'} || [] },
51             );
52             push @mvp_multivalue_args, 'PodWeaver.skip';
53              
54             has filter_remove => (
55             is => 'ro',
56             isa => 'ArrayRef[Str]',
57             lazy => 1,
58             default => sub { $_[0]->payload->{'-remove'} || [] },
59             );
60             push @mvp_multivalue_args, '-remove';
61              
62              
63             sub _meta_no_index {
64             # Only include no_index in meta if t/lib actually exists in this dist
65             # (this may be slightly over-engineered)
66 4     4   46 my $path = Path::Tiny->cwd;
67 4         329 while (! $path->is_rootdir) {
68 28 50       1872 if ($path->child('t')->child('lib')->exists) {
69 0         0 return ([ 'MetaNoIndex' => {
70             directory => 't/lib',
71             }]);
72             }
73 28         2727 $path = $path->parent;
74             }
75 4         360 return ();
76             }
77              
78              
79             sub configure {
80 4     4 0 33 my ($self) = @_;
81            
82 4         11 my $AJNN = '=' . __PACKAGE__;
83            
84 4         212 my @gatherdir_exclude_match = $self->gatherdir_exclude_match->@*;
85 4         71 $self->add_plugins(
86             [ 'GatherDir' => {
87             exclude_filename => [qw(
88             README.md
89             cpanfile
90             dist.ini
91             )],
92             exclude_match => [ @gatherdir_exclude_match, qw(
93             ~
94             \.webloc$
95             )],
96             prune_directory => [qw(
97             ^cover_db$
98             ^Stuff$
99             \.bbprojectd$
100             )],
101             }],
102             [ 'PruneCruft' ],
103             [ 'PruneAliases' ],
104             );
105            
106 4         941 $self->add_plugins(
107             [ 'CPANFile' ],
108             [ 'MetaJSON' ],
109             [ 'MetaYAML' ],
110             _meta_no_index(),
111             [ 'MetaProvides::Package' ],
112             [ 'PkgVersion' => {
113             die_on_existing_version => 1,
114             die_on_line_insertion => 1,
115             }],
116             [ 'GithubMeta' => {
117             issues => 1,
118             homepage => "''",
119             }],
120             );
121            
122 4 50       1154 $self->add_plugins(
123             [ 'Git::Check' => {
124             allow_dirty => '',
125             }],
126             [ 'CheckChangeLog' ],
127             [ 'TestRelease' ],
128             [ 'ConfirmRelease' ],
129             [ $self->cpan_release ? 'UploadToCPAN' : 'FakeRelease' ],
130             [ 'Git::Tag' => {
131             tag_format => '%V',
132             tag_message => '%V%t %{yyyy-MM-dd}d%n%c',
133             }],
134             );
135            
136 4         1055 $self->add_plugins(
137             [ 'MakeMaker' ],
138             #[ 'StaticInstall' => { mode => 'on' } ],
139             [ $AJNN . '::Readme' => 'Readme', {
140             cpan_release => $self->cpan_release,
141             }],
142             [ 'Manifest' ],
143             );
144            
145 4         794 my @podweaver_skip = $self->podweaver_skip->@*;
146 4 100       18 if (@podweaver_skip) {
147 1         10 $self->add_plugins([ 'FileFinder::Filter' => 'PodWeaverFiles' => {
148             finder => [':InstallModules', ':ExecFiles'],
149             skip => [@podweaver_skip],
150             }]);
151 1         106 @podweaver_skip = ( finder => '@Author::AJNN/PodWeaverFiles' );
152             }
153             $self->add_plugins(
154             #[ 'PodWeaverIfPod' => {
155 4         39 [ 'PodWeaver' => {
156             config_plugin => '@Author::AJNN',
157             @podweaver_skip,
158             }],
159             );
160            
161 4         485 my @test_min_version;
162 4 50       165 @test_min_version = (
163             [ 'Test::MinimumVersion' => {
164             max_target_perl => $self->max_target_perl,
165             }],
166             ) if $self->max_target_perl;
167 4         33 $self->add_plugins(
168             @test_min_version,
169             [ 'PodSyntaxTests' ],
170             [ 'RunExtraTests' ],
171             );
172             }
173              
174              
175             around add_plugins => sub {
176             my ($orig, $self, @plugins) = @_;
177            
178             my @remove = $self->filter_remove->@*;
179             $self->$orig( grep {
180             my $moniker = $_;
181             $moniker = $_->[1] && ! ref $_->[1] ? $_->[1] : $_->[0] if ref;
182             none { $_ eq $moniker } @remove
183             } @plugins );
184             };
185              
186              
187             __PACKAGE__->meta->make_immutable;
188              
189             1;
190              
191             __END__
192              
193             =pod
194              
195             =encoding UTF-8
196              
197             =head1 NAME
198              
199             Dist::Zilla::PluginBundle::Author::AJNN - Dist::Zilla configuration the way AJNN does it
200              
201             =head1 VERSION
202              
203             version 0.05
204              
205             =head1 SYNOPSIS
206              
207             in F<dist.ini>:
208              
209             name = Example-Dist-Name
210             main_module = lib/Local/Example.pm
211            
212             author = Jane Doe <doe@example.org>
213             license = Artistic_2_0
214             copyright_holder = Jane Doe
215             copyright_year = 2020
216            
217             version = 0.123
218             release_status = unstable
219            
220             [@Author::AJNN]
221            
222             [AutoPrereqs]
223              
224             skip some parts if required:
225              
226             [@Author::AJNN]
227             -remove = CheckChangeLog
228             -remove = Git::Check
229              
230             =head1 DESCRIPTION
231              
232             This is the configuration I use for L<Dist::Zilla>.
233              
234             (Most likely you don't want or need to read this.)
235              
236             =head1 OVERVIEW
237              
238             This plugin bundle is nearly equivalent to the following C<dist.ini> config:
239              
240             [GatherDir]
241             exclude_filename = README.md
242             exclude_filename = cpanfile
243             exclude_filename = dist.ini
244             exclude_match = ~|\.webloc$
245             prune_directory = ^cover_db$|^Stuff$|\.bbprojectd$
246             [PruneCruft]
247             [PruneAliases]
248            
249             [CPANFile]
250             [MetaJSON]
251             [MetaYAML]
252             [MetaNoIndex]
253             directory = t/lib
254             [MetaProvides::Package]
255             [PkgVersion]
256             die_on_existing_version = 1
257             die_on_line_insertion = 1
258             [GithubMeta]
259             issues = 1
260             homepage = ''
261            
262             [Git::Check]
263             allow_dirty =
264             [CheckChangeLog]
265             [TestRelease]
266             [ConfirmRelease]
267             [UploadToCPAN]
268             [Git::Tag]
269             tag_format = '%V'
270             tag_message = '%V%t %{yyyy-MM-dd}d%n%c'
271            
272             [MakeMaker]
273             [@Author::AJNN::Readme]
274             [Manifest]
275            
276             [FileFinder::Filter / PodWeaverFiles]
277             finder = :InstallModules
278             finder = :ExecFiles
279             [PodWeaver]
280             finder = PodWeaverFiles
281             config_plugin = @Author::AJNN
282            
283             [Test::MinimumVersion]
284             [PodSyntaxTests]
285             [RunExtraTests]
286              
287             =head1 ATTRIBUTES
288              
289             =head2 -remove
290              
291             Moniker of a plugin that is to be removed from this bundle. May
292             be given multiple times. See L<Dist::Zilla::PluginBundle::Filter>.
293             Offered here as a workaround for
294             L<RT 81958|https://github.com/rjbs/Dist-Zilla/issues/695>.
295              
296             -remove = CheckChangeLog
297             -remove = Git::Check
298              
299             =head2 cpan_release
300              
301             Whether or not this distribution is meant to be released to
302             L<CPAN|https://www.cpan.org/>. The default is yes, but for software
303             of low quality or little interest to others, it can be set to no.
304              
305             cpan_release = 0
306              
307             =head2 GatherDir.exclude_match
308              
309             Files or directories that match any of these regular expressions
310             will not be included in the build. May be given multiple times.
311             See L<Dist::Zilla::Plugin::GatherDir/"exclude_match">.
312              
313             GatherDir.exclude_match = private_dir
314             GatherDir.exclude_match = \.data$
315              
316             =head2 PodWeaver.skip
317              
318             L<PodWeaver> will not be applied to a file that matches any of these
319             regular expressions. May be given multiple times.
320             See L<Dist::Zilla::Plugin::FileFinder::Filter/"skip">.
321              
322             PodWeaver.skip = \.pod$
323             PodWeaver.skip = Net/(?:SSL|TLS)
324              
325             =head2 Test::MinimumVersion.max_target_perl
326              
327             A syntax test for the specified target version will be generated.
328             If omitted or set to C<0>, the test will not be generated.
329             See L<Dist::Zilla::Plugin::Test::MinimumVersion>.
330              
331             Test::MinimumVersion.max_target_perl = v5.26
332              
333             =head1 BUGS
334              
335             This configuration is hacked together specifically for AJNN's needs.
336             It has not been designed with extensibility or reusability in mind.
337             No forward or backward compatibility should be expected.
338              
339             =head1 SEE ALSO
340              
341             L<Dist::Zilla::PluginBundle::Author::AJNN::Readme>
342              
343             L<Pod::Weaver::PluginBundle::Author::AJNN>
344              
345             L<Dist::Zilla::Role::PluginBundle::Easy>
346              
347             =head1 AUTHOR
348              
349             Arne Johannessen <ajnn@cpan.org>
350              
351             If you contact me by email, please make sure you include the word
352             "Perl" in your subject header to help beat the spam filters.
353              
354             =head1 COPYRIGHT AND LICENSE
355              
356             Arne Johannessen has dedicated the work to the Commons by waiving all of his
357             or her rights to the work worldwide under copyright law and all related or
358             neighboring legal rights he or she had in the work, to the extent allowable by
359             law.
360              
361             Works under CC0 do not require attribution. When citing the work, you should
362             not imply endorsement by the author.
363              
364             =cut