File Coverage

lib/Dist/Zilla/Plugin/Author/SKIRMESS/RepositoryBase.pm
Criterion Covered Total %
statement 29 70 41.4
branch 0 14 0.0
condition 0 3 0.0
subroutine 10 17 58.8
pod 0 4 0.0
total 39 108 36.1


line stmt bran cond sub pod time code
1             package Dist::Zilla::Plugin::Author::SKIRMESS::RepositoryBase;
2              
3 1     1   947 use 5.006;
  1         3  
4 1     1   5 use strict;
  1         1  
  1         20  
5 1     1   4 use warnings;
  1         2  
  1         44  
6              
7             our $VERSION = '0.029';
8              
9 1     1   6 use Moose;
  1         1  
  1         8  
10              
11             with(
12             'Dist::Zilla::Role::BeforeBuild',
13             'Dist::Zilla::Role::FileFinderUser' => {
14             method => 'found_module_files',
15             finder_arg_names => ['module_finder'],
16             default_finders => [':InstallModules'],
17             },
18             'Dist::Zilla::Role::FileFinderUser' => {
19             method => 'found_script_files',
20             finder_arg_names => ['script_finder'],
21             default_finders => [':PerlExecFiles'],
22             },
23             'Dist::Zilla::Role::FileMunger',
24             'Dist::Zilla::Role::TextTemplate',
25             );
26              
27             sub mvp_multivalue_args { return (qw( skip stopwords travis_ci_ignore_perl travis_ci_no_author_testing_perl travis_ci_osx_perl )) }
28              
29             has skip => (
30             is => 'ro',
31             isa => 'Maybe[ArrayRef]',
32             default => sub { [] },
33             );
34              
35             has stopwords => (
36             is => 'ro',
37             isa => 'Maybe[ArrayRef]',
38             default => sub { [] },
39             );
40              
41             has travis_ci_ignore_perl => (
42             is => 'ro',
43             isa => 'Maybe[ArrayRef]',
44             default => sub { [] },
45             );
46              
47             has travis_ci_no_author_testing_perl => (
48             is => 'ro',
49             isa => 'Maybe[ArrayRef]',
50             default => sub { [qw(5.8)] },
51             );
52              
53             has travis_ci_osx_perl => (
54             is => 'ro',
55             isa => 'ArrayRef[Str]',
56             default => sub { [qw(5.18)] },
57             );
58              
59             has _travis_available_perl => (
60             is => 'ro',
61             isa => 'ArrayRef[Str]',
62             default => sub { [qw( 5.8 5.10 5.12 5.14 5.16 5.18 5.20 5.22 5.24 5.26)] },
63             traits => ['Array'],
64             );
65              
66 1     1   5682 use Carp;
  1         2  
  1         78  
67 1     1   373 use Config::Std { def_sep => q{=} };
  1         11388  
  1         12  
68 1     1   49 use File::Spec;
  1         2  
  1         24  
69 1     1   319 use List::SomeUtils qw(uniq);
  1         4906  
  1         63  
70 1     1   6 use Path::Tiny;
  1         2  
  1         42  
71              
72 1     1   6 use namespace::autoclean;
  1         2  
  1         8  
73              
74             sub before_build {
75 0     0 0   my ($self) = @_;
76              
77             # Files must exist during the "gather files" phase and therefore we're
78             # forced to create them in the "before build" phase.
79 0           $self->_write_files();
80              
81 0           return;
82             }
83              
84             sub munge_files {
85 0     0 0   my ($self) = @_;
86              
87             # Files are already generated in the before build phase.
88              
89             # This module is part of the Author::SKIRMESS plugin bundle. The bundle
90             # is either used to release itself, but also to release other
91             # distributions. We must know which kind of build the current build is
92             # because if we build another distribution we are done, the files were
93             # already correctly generated during the "before build" phase.
94             #
95             # But if we are using the bundle to release itself we have to recreate
96             # the generated files because the new version of this plugin was not
97             # known during the "before build" phase.
98             #
99             # If __FILE__ is inside lib of the cwd we are run with Bootstrap::lib
100             # which means we are building the bundle. Otherwise we use the bundle to
101             # build another distribution.
102 0 0 0       if ( exists $ENV{DZIL_RELEASING} && path('lib')->realpath->subsumes( path(__FILE__)->realpath() ) ) {
103              
104             # Ok, we are releasing the bundle itself. That means that $VERSION of
105             # this module is not set correctly as the module was require'd before
106             # the $VERSION was adjusted in the file (during the "munge files"
107             # phase). We have to fix this now to write the correct version to the
108             # generated files.
109              
110             # NOTE: Just a reminder if someone wants to refactor this module.
111             # $self->zilla->version() must not be called in the "before build"
112             # phase because it calls _build_version which is going to fail the
113             # build. Besides that, VersionFromMainModule is run during the
114             # "munge files" phase and before that we can't even know the new
115             # version of the bundle.
116              
117 0           local $VERSION = $self->zilla->version;
118              
119             # re-write all generated files
120 0           $self->_write_files();
121              
122 0           return;
123             }
124              
125             # We are building, or releasing something else - not the bundle itself.
126              
127             # We always have to write t/00-load.t during the munge files phase
128             # because this file is not created correctly during the before
129             # build phase because the FileFinderUser isn't initialized that
130             # early
131 0           $self->_write_file('t/00-load.t');
132 0           return;
133             }
134              
135             sub _write_files {
136 0     0     my ($self) = @_;
137              
138 0 0         my %file_to_skip = map { $_ => 1 } grep { defined && !m{ ^ \s* $ }xsm } @{ $self->skip };
  0            
  0            
  0            
139              
140             FILE:
141 0           for my $file ( sort $self->files() ) {
142 0 0         if ( exists $file_to_skip{$file} ) {
143 0           next FILE;
144             }
145              
146 0           $self->_write_file($file);
147             }
148              
149 0           return;
150             }
151              
152             sub _write_file {
153 0     0     my ( $self, $file ) = @_;
154              
155 0           $file = path($file);
156              
157 0 0         if ( -e $file ) {
158 0           $file->remove();
159             }
160             else {
161             # If the file does not yet exist, the basedir might also not
162             # exist. Create it if required.
163 0           my $parent = $file->parent();
164 0 0         if ( !-e $parent ) {
165 0           $self->log("Creating directory $parent");
166 0           $parent->mkpath();
167             }
168             }
169              
170 0           $self->log("Generate file $file");
171              
172             # write the file to disk
173 0           $file->spew( $self->file($file) );
174              
175 0           return;
176             }
177              
178             =pod
179              
180             =encoding UTF-8
181              
182             =head1 NAME
183              
184             Dist::Zilla::Plugin::Author::SKIRMESS::RepositoryBase - Automatically create and update files
185              
186             =head1 VERSION
187              
188             Version 0.029
189              
190             =head1 SYNOPSIS
191              
192             This plugin is part of the
193             L<Dist::Zilla::PluginBundle::Author::SKIRMESS|Dist::Zilla::PluginBundle::Author::SKIRMESS>
194             bundle and should not be used outside of that.
195              
196             =head1 DESCRIPTION
197              
198             This plugin creates a collection of files that are shared between all my
199             CPAN distributions which makes it easy to keep them all up to date.
200              
201             The following files are created in the repository and in the distribution:
202              
203             =cut
204              
205             {
206             # Files to generate
207             my %file;
208              
209             sub files {
210 0     0 0   my ($self) = @_;
211              
212 0           return keys %file;
213             }
214              
215             sub file {
216 0     0 0   my ( $self, $filename ) = @_;
217              
218 0 0         if ( !exists $file{$filename} ) {
219 0           $self->log_fatal("File '$filename' is not defined");
220              
221             # log_fatal should die
222 0           croak 'internal error';
223             }
224              
225 0           my $file_content = $file{$filename};
226 0 0   0     if ( ref $file_content eq ref sub { } ) {
227 0           $file_content = $file_content->($self);
228             }
229              
230             # process the file template
231 0           return $self->fill_in_string(
232             $file_content,
233             {
234             plugin => \$self,
235             },
236             );
237             }
238              
239             =head2 .appveyor.yml
240              
241             The configuration file for AppVeyor.
242              
243             =cut
244              
245             $file{q{.appveyor.yml}} = <<'APPVEYOR_YML';
246             # Automatically generated file
247             # {{ ref $plugin }} {{ $plugin->VERSION() }}
248              
249             skip_tags: true
250              
251             cache:
252             - C:\strawberry -> appveyor.yml
253              
254             install:
255             - if not exist "C:\strawberry" cinst strawberryperl
256             - set PATH=C:\strawberry\perl\bin;C:\strawberry\perl\site\bin;C:\strawberry\c\bin;%PATH%
257             - cd C:\projects\%APPVEYOR_PROJECT_NAME%
258             - cpanm --quiet --installdeps --notest --skip-satisfied --with-develop .
259              
260             build_script:
261             - perl Makefile.PL
262             - set AUTOMATED_TESTING=1
263             - gmake test
264             - prove -lr xt/author
265             APPVEYOR_YML
266              
267             =head2 .perlcriticrc
268              
269             The configuration for L<Perl::Critic|Perl::Critic>. This file is created from
270             a default contained in this plugin and from distribution specific settings in
271             F<perlcriticrc.local>.
272              
273             =cut
274              
275             $file{q{.perlcriticrc}} = sub {
276             my ($self) = @_;
277              
278             my $perlcriticrc_template = <<'PERLCRITICRC_TEMPLATE';
279             # Automatically generated file
280             # {{ ref $plugin }} {{ $plugin->VERSION() }}
281              
282             only = 1
283             severity = 1
284             verbose = [%p] %m at %f line %l, near '%r'\n
285              
286             [BuiltinFunctions::ProhibitBooleanGrep]
287             [BuiltinFunctions::ProhibitComplexMappings]
288             [BuiltinFunctions::ProhibitLvalueSubstr]
289             [BuiltinFunctions::ProhibitReverseSortBlock]
290             [BuiltinFunctions::ProhibitSleepViaSelect]
291             [BuiltinFunctions::ProhibitStringyEval]
292             [BuiltinFunctions::ProhibitStringySplit]
293             [BuiltinFunctions::ProhibitUniversalCan]
294             [BuiltinFunctions::ProhibitUniversalIsa]
295             [BuiltinFunctions::ProhibitUselessTopic]
296             [BuiltinFunctions::ProhibitVoidGrep]
297             [BuiltinFunctions::ProhibitVoidMap]
298             [BuiltinFunctions::RequireBlockGrep]
299             [BuiltinFunctions::RequireBlockMap]
300             [BuiltinFunctions::RequireGlobFunction]
301             [BuiltinFunctions::RequireSimpleSortBlock]
302             [ClassHierarchies::ProhibitAutoloading]
303             [ClassHierarchies::ProhibitExplicitISA]
304             [ClassHierarchies::ProhibitOneArgBless]
305             [CodeLayout::ProhibitHardTabs]
306             [CodeLayout::ProhibitParensWithBuiltins]
307             [CodeLayout::ProhibitQuotedWordLists]
308             [CodeLayout::ProhibitTrailingWhitespace]
309             [CodeLayout::RequireConsistentNewlines]
310             [CodeLayout::RequireTidyCode]
311             [CodeLayout::RequireTrailingCommas]
312             [ControlStructures::ProhibitCStyleForLoops]
313             [ControlStructures::ProhibitCascadingIfElse]
314             [ControlStructures::ProhibitDeepNests]
315             [ControlStructures::ProhibitLabelsWithSpecialBlockNames]
316             [ControlStructures::ProhibitMutatingListFunctions]
317             [ControlStructures::ProhibitNegativeExpressionsInUnlessAndUntilConditions]
318             [ControlStructures::ProhibitPostfixControls]
319             [ControlStructures::ProhibitUnlessBlocks]
320             [ControlStructures::ProhibitUnreachableCode]
321             [ControlStructures::ProhibitUntilBlocks]
322             [ControlStructures::ProhibitYadaOperator]
323             #[Documentation::PodSpelling]
324             [Documentation::RequirePackageMatchesPodName]
325             [Documentation::RequirePodAtEnd]
326             [Documentation::RequirePodLinksIncludeText]
327             #[Documentation::RequirePodSections]
328              
329             [ErrorHandling::RequireCarping]
330             allow_in_main_unless_in_subroutine = 1
331              
332             [ErrorHandling::RequireCheckingReturnValueOfEval]
333             [InputOutput::ProhibitBacktickOperators]
334             [InputOutput::ProhibitBarewordFileHandles]
335             [InputOutput::ProhibitExplicitStdin]
336             [InputOutput::ProhibitInteractiveTest]
337             [InputOutput::ProhibitJoinedReadline]
338             [InputOutput::ProhibitOneArgSelect]
339             [InputOutput::ProhibitReadlineInForLoop]
340             [InputOutput::ProhibitTwoArgOpen]
341             [InputOutput::RequireBracedFileHandleWithPrint]
342             #[InputOutput::RequireBriefOpen]
343             [InputOutput::RequireCheckedClose]
344             [InputOutput::RequireCheckedOpen]
345              
346             [InputOutput::RequireCheckedSyscalls]
347             functions = :builtins
348             exclude_functions = print say sleep
349              
350             [InputOutput::RequireEncodingWithUTF8Layer]
351             [Miscellanea::ProhibitFormats]
352             [Miscellanea::ProhibitTies]
353             [Miscellanea::ProhibitUnrestrictedNoCritic]
354             [Miscellanea::ProhibitUselessNoCritic]
355             [Modules::ProhibitAutomaticExportation]
356             [Modules::ProhibitConditionalUseStatements]
357              
358             [Modules::ProhibitEvilModules]
359             modules = Class::ISA {Found use of Class::ISA. This module is deprecated by the Perl 5 Porters.} Pod::Plainer {Found use of Pod::Plainer. This module is deprecated by the Perl 5 Porters.} Shell {Found use of Shell. This module is deprecated by the Perl 5 Porters.} Switch {Found use of Switch. This module is deprecated by the Perl 5 Porters.} Readonly {Found use of Readonly. Please use constant.pm or Const::Fast.} base {Found use of base. Please use parent instead.} File::Slurp {Found use of File::Slurp. Please use Path::Tiny instead.} common::sense {Found use of common::sense. Please use strict and warnings instead.} Class::Load {Found use of Class::Load. Please use Module::Runtime instead.} Any::Moose {Found use of Any::Moose. Please use Moo instead.} Error {Found use of Error.pm. Please use Throwable.pm instead.} Getopt::Std {Found use of Getopt::Std. Please use Getopt::Long instead.} HTML::Template {Found use of HTML::Template. Please use Template::Toolkit.} IO::Socket::INET6 {Found use of IO::Socket::INET6. Please use IO::Socket::IP.} JSON {Found use of JSON. Please use JSON::MaybeXS or Cpanel::JSON::XS.} JSON::Any {Found use of JSON::Any. Please use JSON::MaybeXS.} List::MoreUtils {Found use of List::MoreUtils. Please use List::Util or List::UtilsBy.} Mouse {Found use of Mouse. Please use Moo.} Net::IRC {Found use of Net::IRC. Please use POE::Component::IRC, Net::Async::IRC, or Mojo::IRC.} XML::Simple {Found use of XML::Simple. Please use XML::LibXML, XML::TreeBuilder, XML::Twig, or Mojo::DOM.} Sub::Infix {Found use of Sub::Infix. Please do not use it.}
360              
361             #[Modules::ProhibitExcessMainComplexity]
362             [Modules::ProhibitMultiplePackages]
363             [Modules::RequireBarewordIncludes]
364             [Modules::RequireEndWithOne]
365             [Modules::RequireExplicitPackage]
366             [Modules::RequireFilenameMatchesPackage]
367             [Modules::RequireNoMatchVarsWithUseEnglish]
368             #[Modules::RequireVersionVar]
369             [NamingConventions::Capitalization]
370             [NamingConventions::ProhibitAmbiguousNames]
371             [Objects::ProhibitIndirectSyntax]
372             [References::ProhibitDoubleSigils]
373             [RegularExpressions::ProhibitCaptureWithoutTest]
374             [RegularExpressions::ProhibitComplexRegexes]
375             [RegularExpressions::ProhibitEnumeratedClasses]
376             [RegularExpressions::ProhibitEscapedMetacharacters]
377             [RegularExpressions::ProhibitFixedStringMatches]
378             [RegularExpressions::ProhibitSingleCharAlternation]
379             [RegularExpressions::ProhibitUnusedCapture]
380             [RegularExpressions::ProhibitUnusualDelimiters]
381             [RegularExpressions::ProhibitUselessTopic]
382             [RegularExpressions::RequireBracesForMultiline]
383             [RegularExpressions::RequireDotMatchAnything]
384             [RegularExpressions::RequireExtendedFormatting]
385             [RegularExpressions::RequireLineBoundaryMatching]
386             [Subroutines::ProhibitAmpersandSigils]
387             [Subroutines::ProhibitBuiltinHomonyms]
388             [Subroutines::ProhibitExcessComplexity]
389             [Subroutines::ProhibitExplicitReturnUndef]
390             [Subroutines::ProhibitManyArgs]
391             [Subroutines::ProhibitNestedSubs]
392             [Subroutines::ProhibitReturnSort]
393             [Subroutines::ProhibitSubroutinePrototypes]
394              
395             [Subroutines::ProhibitUnusedPrivateSubroutines]
396             private_name_regex = _(?!build_)\w+
397              
398             [Subroutines::ProtectPrivateSubs]
399             [Subroutines::RequireArgUnpacking]
400             [Subroutines::RequireFinalReturn]
401             [TestingAndDebugging::ProhibitNoStrict]
402             [TestingAndDebugging::ProhibitNoWarnings]
403             [TestingAndDebugging::ProhibitProlongedStrictureOverride]
404             [TestingAndDebugging::RequireTestLabels]
405             [TestingAndDebugging::RequireUseStrict]
406             [TestingAndDebugging::RequireUseWarnings]
407             [ValuesAndExpressions::ProhibitCommaSeparatedStatements]
408              
409             [ValuesAndExpressions::ProhibitComplexVersion]
410             forbid_use_version = 1
411              
412             [ValuesAndExpressions::ProhibitConstantPragma]
413             [ValuesAndExpressions::ProhibitEmptyQuotes]
414             [ValuesAndExpressions::ProhibitEscapedCharacters]
415             [ValuesAndExpressions::ProhibitImplicitNewlines]
416             [ValuesAndExpressions::ProhibitInterpolationOfLiterals]
417             [ValuesAndExpressions::ProhibitLeadingZeros]
418             [ValuesAndExpressions::ProhibitLongChainsOfMethodCalls]
419             [ValuesAndExpressions::ProhibitMagicNumbers]
420             [ValuesAndExpressions::ProhibitMismatchedOperators]
421             [ValuesAndExpressions::ProhibitMixedBooleanOperators]
422             [ValuesAndExpressions::ProhibitNoisyQuotes]
423             [ValuesAndExpressions::ProhibitQuotesAsQuotelikeOperatorDelimiters]
424             [ValuesAndExpressions::ProhibitSpecialLiteralHeredocTerminator]
425             [ValuesAndExpressions::ProhibitVersionStrings]
426             [ValuesAndExpressions::RequireConstantVersion]
427             [ValuesAndExpressions::RequireInterpolationOfMetachars]
428             [ValuesAndExpressions::RequireNumberSeparators]
429             [ValuesAndExpressions::RequireQuotedHeredocTerminator]
430             [ValuesAndExpressions::RequireUpperCaseHeredocTerminator]
431             [Variables::ProhibitAugmentedAssignmentInDeclaration]
432             [Variables::ProhibitConditionalDeclarations]
433             [Variables::ProhibitEvilVariables]
434             [Variables::ProhibitLocalVars]
435             [Variables::ProhibitMatchVars]
436             [Variables::ProhibitPackageVars]
437             [Variables::ProhibitPerl4PackageNames]
438              
439             [Variables::ProhibitPunctuationVars]
440             allow = $@ $! $/ $0
441              
442             [Variables::ProhibitReusedNames]
443             [Variables::ProhibitUnusedVariables]
444             [Variables::ProtectPrivateVars]
445             [Variables::RequireInitializationForLocalVars]
446             [Variables::RequireLexicalLoopIterators]
447             [Variables::RequireLocalizedPunctuationVars]
448             [Variables::RequireNegativeIndices]
449              
450             ### Perl::Critic::Bangs
451             [Bangs::ProhibitBitwiseOperators]
452             #[Bangs::ProhibitCommentedOutCode]
453             [Bangs::ProhibitDebuggingModules]
454             [Bangs::ProhibitFlagComments]
455             #[Bangs::ProhibitNoPlan]
456             [Bangs::ProhibitNumberedNames]
457             [Bangs::ProhibitRefProtoOrProto]
458             [Bangs::ProhibitUselessRegexModifiers]
459             #[Bangs::ProhibitVagueNames]
460              
461             ### Perl::Critic::Moose
462             [Moose::ProhibitDESTROYMethod]
463             equivalent_modules = Moo Moo::Role
464              
465             [Moose::ProhibitLazyBuild]
466             equivalent_modules = Moo Moo::Role
467              
468             [Moose::ProhibitMultipleWiths]
469             equivalent_modules = Moo Moo::Role
470              
471             [Moose::ProhibitNewMethod]
472             equivalent_modules = Moo Moo::Role
473              
474             [Moose::RequireCleanNamespace]
475             [Moose::RequireMakeImmutable]
476              
477             ### Perl::Critic::Freenode
478             [Freenode::AmpersandSubCalls]
479             [Freenode::ArrayAssignAref]
480             [Freenode::BarewordFilehandles]
481             [Freenode::ConditionalDeclarations]
482             [Freenode::ConditionalImplicitReturn]
483             [Freenode::DeprecatedFeatures]
484             [Freenode::DiscouragedModules]
485             [Freenode::DollarAB]
486             [Freenode::Each]
487             #[Freenode::EmptyReturn]
488             [Freenode::IndirectObjectNotation]
489             [Freenode::ModPerl]
490             [Freenode::OpenArgs]
491             [Freenode::OverloadOptions]
492             [Freenode::PackageMatchesFilename]
493             [Freenode::POSIXImports]
494             [Freenode::Prototypes]
495             [Freenode::StrictWarnings]
496             [Freenode::Threads]
497             [Freenode::Wantarray]
498             [Freenode::WarningsSwitch]
499             [Freenode::WhileDiamondDefaultAssignment]
500              
501             ### Perl::Critic::Policy::HTTPCookies
502             [HTTPCookies]
503              
504             ### Perl::Critic::Itch
505             #[CodeLayout::ProhibitHashBarewords]
506              
507             ### Perl::Critic::Lax
508             [Lax::ProhibitComplexMappings::LinesNotStatements]
509             #[Lax::ProhibitEmptyQuotes::ExceptAsFallback]
510             #[Lax::ProhibitLeadingZeros::ExceptChmod]
511             #[Lax::ProhibitStringyEval::ExceptForRequire]
512             #[Lax::RequireConstantOnLeftSideOfEquality::ExceptEq]
513             #[Lax::RequireEndWithTrueConst]
514             #[Lax::RequireExplicitPackage::ExceptForPragmata]
515              
516             ### Perl::Critic::More
517             #[CodeLayout::RequireASCII]
518             #[Editor::RequireEmacsFileVariables]
519             #[ErrorHandling::RequireUseOfExceptions]
520             [Modules::PerlMinimumVersion]
521             [Modules::RequirePerlVersion]
522             #[ValuesAndExpressions::RequireConstantOnLeftSideOfEquality]
523             #[ValuesAndExpressions::RestrictLongStrings]
524              
525             # Perl::Critic::PetPeeves::JTRAMMELL
526             [Variables::ProhibitUselessInitialization]
527              
528             ### Perl::Critic::Policy::BuiltinFunctions::ProhibitDeleteOnArrays
529             [BuiltinFunctions::ProhibitDeleteOnArrays]
530              
531             ### Perl::Critic::Policy::BuiltinFunctions::ProhibitReturnOr
532             [BuiltinFunctions::ProhibitReturnOr]
533              
534             ### Perl::Critic::Policy::Moo::ProhibitMakeImmutable
535             [Moo::ProhibitMakeImmutable]
536              
537             ### Perl::Critic::Policy::ValuesAndExpressions::ProhibitSingleArgArraySlice
538             # requires Perl 5.12
539             #[ValuesAndExpressions::ProhibitSingleArgArraySlice]
540              
541             ### Perl::Critic::Policy::Perlsecret
542             [Perlsecret]
543              
544             ### Perl::Critic::Policy::TryTiny::RequireBlockTermination
545             [TryTiny::RequireBlockTermination]
546              
547             ### Perl::Critic::Policy::TryTiny::RequireUse
548             [TryTiny::RequireUse]
549              
550             ### Perl::Critic::Policy::ValuesAndExpressions::PreventSQLInjection
551             [ValuesAndExpressions::PreventSQLInjection]
552              
553             ### Perl::Critic::Policy::Variables::ProhibitUnusedVarsStricter
554             [Variables::ProhibitUnusedVarsStricter]
555             allow_unused_subroutine_arguments = 1
556              
557             ### Perl::Critic::Pulp
558             [CodeLayout::ProhibitFatCommaNewline]
559             #[CodeLayout::ProhibitIfIfSameLine]
560             [CodeLayout::RequireFinalSemicolon]
561             [CodeLayout::RequireTrailingCommaAtNewline]
562             [Compatibility::ConstantLeadingUnderscore]
563             [Compatibility::ConstantPragmaHash]
564             #[Compatibility::Gtk2Constants]
565             [Compatibility::PerlMinimumVersionAndWhy]
566             #[Compatibility::PodMinimumVersion]
567             [Compatibility::ProhibitUnixDevNull]
568             [Documentation::ProhibitAdjacentLinks]
569             [Documentation::ProhibitBadAproposMarkup]
570             [Documentation::ProhibitDuplicateHeadings]
571             #[Documentation::ProhibitDuplicateSeeAlso]
572             [Documentation::ProhibitLinkToSelf]
573             [Documentation::ProhibitParagraphEndComma]
574             [Documentation::ProhibitParagraphTwoDots]
575             [Documentation::ProhibitUnbalancedParens]
576             [Documentation::ProhibitVerbatimMarkup]
577             [Documentation::RequireEndBeforeLastPod]
578             [Documentation::RequireFilenameMarkup]
579             #[Documentation::RequireFinalCut]
580             [Documentation::RequireLinkedURLs]
581             #[Miscellanea::TextDomainPlaceholders]
582             #[Miscellanea::TextDomainUnused]
583             [Modules::ProhibitModuleShebang]
584             [Modules::ProhibitPOSIXimport]
585             [Modules::ProhibitUseQuotedVersion]
586             [ValuesAndExpressions::ConstantBeforeLt]
587             [ValuesAndExpressions::NotWithCompare]
588             [ValuesAndExpressions::ProhibitArrayAssignAref]
589             [ValuesAndExpressions::ProhibitBarewordDoubleColon]
590             [ValuesAndExpressions::ProhibitDuplicateHashKeys]
591             [ValuesAndExpressions::ProhibitEmptyCommas]
592             #[ValuesAndExpressions::ProhibitFiletest_f]
593             [ValuesAndExpressions::ProhibitNullStatements]
594             [ValuesAndExpressions::ProhibitUnknownBackslash]
595             [ValuesAndExpressions::RequireNumericVersion]
596             [ValuesAndExpressions::UnexpandedSpecialLiteral]
597              
598             ### Perl::Critic::StricterSubs
599             [Modules::RequireExplicitInclusion]
600             #[Subroutines::ProhibitCallsToUndeclaredSubs]
601             #[Subroutines::ProhibitCallsToUnexportedSubs]
602             [Subroutines::ProhibitExportingUndeclaredSubs]
603             [Subroutines::ProhibitQualifiedSubDeclarations]
604              
605             ### Perl::Critic::Tics
606             #[Tics::ProhibitLongLines]
607             [Tics::ProhibitManyArrows]
608             [Tics::ProhibitUseBase]
609             PERLCRITICRC_TEMPLATE
610              
611             # Conig::Std will not preserve a comment on the last line, therefore
612             # we append at least one empty line at the end
613             $perlcriticrc_template .= "\n\n";
614              
615             read_config \$perlcriticrc_template, my %perlcriticrc;
616              
617             my $perlcriticrc_local = 'perlcriticrc.local';
618              
619             if ( -f $perlcriticrc_local ) {
620             $self->log("Adjusting Perl::Critic config from '$perlcriticrc_local'");
621              
622             read_config $perlcriticrc_local, my %perlcriticrc_local;
623              
624             my %local_seen;
625              
626             POLICY:
627             for my $policy ( keys %perlcriticrc_local ) {
628              
629             if ( $policy eq q{-} ) {
630             $self->log_fatal('We cannot disable the global settings');
631              
632             # log_fatal should die
633             croak 'internal error';
634             }
635              
636             my $policy_name = $policy =~ m{ ^ - (.+) }xsm ? $1 : $policy;
637              
638             if ( exists $local_seen{$policy_name} ) {
639             $self->log_fatal("There are multiple entries for policy '$policy_name' in '$perlcriticrc_local'.");
640              
641             # log_fatal should die
642             croak 'internal error';
643             }
644              
645             $local_seen{$policy_name} = 1;
646              
647             delete $perlcriticrc{$policy_name};
648              
649             if ( $policy =~ m{ ^ - }xsm ) {
650             $self->log("Disabling policy '$policy_name'");
651             next POLICY;
652             }
653              
654             if ( $policy eq q{} ) {
655             $self->log('Custom global settings');
656             }
657             else {
658             $self->log("Custom configuration for policy '$policy_name'");
659             }
660              
661             $perlcriticrc{$policy_name} = $perlcriticrc_local{$policy_name};
662             }
663             }
664              
665             if ( ( !exists $perlcriticrc{q{}}{only} ) or ( $perlcriticrc{q{}}{only} ne '1' ) ) {
666             $self->log(q{Setting global option 'only' back to '1'});
667             $perlcriticrc{q{}}{only} = '1';
668             }
669              
670             my $content;
671             write_config %perlcriticrc, \$content;
672              
673             return $content;
674             };
675              
676             =head2 .perltidyrc
677              
678             The configuration file for B<perltidy>.
679              
680             =cut
681              
682             $file{q{.perltidyrc}} = <<'PERLTIDYRC';
683             # Automatically generated file
684             # {{ ref $plugin }} {{ $plugin->VERSION() }}
685              
686             --maximum-line-length=0
687             --break-at-old-comma-breakpoints
688             --backup-and-modify-in-place
689             --output-line-ending=unix
690             PERLTIDYRC
691              
692             =head2 .travis.yml
693              
694             The configuration file for TravisCI. All known supported Perl versions are
695             enabled unless disabled with B<travis_ci_ignore_perl>.
696              
697             With B<travis_ci_osx_perl> you can specify one or multiple Perl versions to
698             be tested on OSX, in addition to on Linux. If omitted it defaults to one
699             single version.
700              
701             Use the B<travis_ci_no_author_testing_perl> option to disable author tests on
702             some Perl versions.
703              
704             =cut
705              
706             $file{q{.travis.yml}} = sub {
707             my ($self) = @_;
708              
709             my $travis_yml = <<'TRAVIS_YML_1';
710             # Automatically generated file
711             # {{ ref $plugin }} {{ $plugin->VERSION() }}
712              
713             language: perl
714              
715             cache:
716             directories:
717             - ~/perl5
718              
719             env:
720             global:
721             - AUTOMATED_TESTING=1
722              
723             matrix:
724             include:
725             TRAVIS_YML_1
726              
727             my %ignore_perl;
728             @ignore_perl{ @{ $self->travis_ci_ignore_perl } } = ();
729              
730             my %no_auth;
731             @no_auth{ @{ $self->travis_ci_no_author_testing_perl } } = ();
732              
733             my %osx_perl;
734             @osx_perl{ @{ $self->travis_ci_osx_perl } } = ();
735              
736             PERL:
737             for my $perl ( @{ $self->_travis_available_perl } ) {
738             next PERL if exists $ignore_perl{$perl};
739              
740             my @os = (undef);
741             if ( exists $osx_perl{$perl} ) {
742             push @os, 'osx';
743             }
744              
745             for my $os (@os) {
746             $travis_yml .= " - perl: '$perl'\n";
747              
748             if ( !exists $no_auth{$perl} ) {
749             $travis_yml .= " env: AUTHOR_TESTING=1\n";
750             }
751              
752             if ( defined $os ) {
753             $travis_yml .= " os: $os\n";
754             }
755              
756             $travis_yml .= "\n";
757             }
758             }
759              
760             $travis_yml .= <<'TRAVIS_YML';
761             install:
762             - if [ -n "$AUTHOR_TESTING" ]; then cpanm --quiet --installdeps --notest --skip-satisfied --with-develop .; fi
763             - if [ -z "$AUTHOR_TESTING" ]; then cpanm --quiet --installdeps --notest --skip-satisfied .; fi
764              
765             script:
766             - perl Makefile.PL && make test
767             - if [ -n "$AUTHOR_TESTING" ]; then prove -lr xt/author; fi
768             TRAVIS_YML
769              
770             return $travis_yml;
771             };
772              
773             # test header
774             my $test_header = <<'_TEST_HEADER';
775             #!perl
776              
777             use 5.006;
778             use strict;
779             use warnings;
780              
781             # this test was generated with
782             # {{ ref $plugin }} {{ $plugin->VERSION() }}
783              
784             _TEST_HEADER
785              
786             =head2 t/00-load.t
787              
788             Verifies that all modules and perl scripts can be compiled with require_ok
789             from L<Test::More|Test::More>.
790              
791             =cut
792              
793             $file{q{t/00-load.t}} = sub {
794             my ($self) = @_;
795              
796             my %use_lib_args = (
797             lib => undef,
798             q{.} => undef,
799             );
800              
801             my @modules;
802             MODULE:
803             for my $module ( map { $_->name } @{ $self->found_module_files() } ) {
804             next MODULE if $module =~ m{ [.] pod $}xsm;
805              
806             my @dirs = File::Spec->splitdir($module);
807             if ( $dirs[0] eq 'lib' && $dirs[-1] =~ s{ [.] pm $ }{}xsm ) {
808             shift @dirs;
809             push @modules, join q{::}, @dirs;
810             $use_lib_args{lib} = 1;
811             next MODULE;
812             }
813              
814             $use_lib_args{q{.}} = 1;
815             push @modules, $module;
816             }
817              
818             my @scripts = map { $_->name } @{ $self->found_script_files() };
819             if (@scripts) {
820             $use_lib_args{q{.}} = 1;
821             }
822              
823             my $content = $test_header . <<'T_OO_LOAD_T';
824             use Test::More;
825              
826             T_OO_LOAD_T
827              
828             if ( !@scripts && !@modules ) {
829             $content .= qq{BAIL_OUT("No files found in distribution");\n};
830              
831             return $content;
832             }
833              
834             $content .= 'use lib qw(';
835             if ( defined $use_lib_args{lib} ) {
836             if ( defined $use_lib_args{q{.}} ) {
837             $content .= 'lib .';
838             }
839             else {
840             $content .= 'lib';
841             }
842             }
843             else {
844             $content .= q{.};
845             }
846             $content .= ");\n\n";
847              
848             $content .= "my \@modules = qw(\n";
849              
850             for my $module ( @modules, @scripts ) {
851             $content .= " $module\n";
852             }
853             $content .= <<'T_OO_LOAD_T';
854             );
855              
856             plan tests => scalar @modules;
857              
858             for my $module (@modules) {
859             require_ok($module) || BAIL_OUT();
860             }
861             T_OO_LOAD_T
862              
863             return $content;
864             };
865              
866             =head2 xt/author/clean-namespaces.t
867              
868             L<Test::CleanNamespaces|Test::CleanNamespaces> author test.
869              
870             =cut
871              
872             $file{q{xt/author/clean-namespaces.t}} = $test_header . <<'XT_AUTHOR_CLEAN_NAMESPACES_T';
873             use Test::More;
874             use Test::CleanNamespaces;
875              
876             if ( !Test::CleanNamespaces->find_modules() ) {
877             plan skip_all => 'No files found to test.';
878             }
879              
880             all_namespaces_clean();
881             XT_AUTHOR_CLEAN_NAMESPACES_T
882              
883             =head2 xt/author/critic.t
884              
885             L<Test::Perl::Critic|Test::Perl::Critic> author test.
886              
887             =cut
888              
889             $file{q{xt/author/critic.t}} = $test_header . <<'XT_AUTHOR_CRITIC_T';
890             use File::Spec;
891              
892             use Perl::Critic::Utils qw(all_perl_files);
893             use Test::More;
894             use Test::Perl::Critic;
895              
896             my @dirs = qw(bin lib t xt);
897              
898             my @ignores;
899             my %file;
900             @file{ all_perl_files(@dirs) } = ();
901             delete @file{@ignores};
902             my @files = keys %file;
903              
904             if ( @files == 0 ) {
905             BAIL_OUT('no files to criticize found');
906             }
907              
908             all_critic_ok(@files);
909             XT_AUTHOR_CRITIC_T
910              
911             =head2 xt/author/minimum_version.t
912              
913             L<Test::MinimumVersion|Test::MinimumVersion> author test.
914              
915             =cut
916              
917             $file{q{xt/author/minimum_version.t}} = $test_header . <<'XT_AUTHOR_MINIMUM_VERSION_T';
918             use Test::MinimumVersion 0.008;
919              
920             all_minimum_version_from_metayml_ok();
921             XT_AUTHOR_MINIMUM_VERSION_T
922              
923             =head2 xt/author/mojibake.t
924              
925             L<Test::Mojibake|Test::Mojibake> author test.
926              
927             =cut
928              
929             $file{q{xt/author/mojibake.t}} = $test_header . <<'XT_AUTHOR_MOJIBAKE_T';
930             use Test::Mojibake;
931              
932             all_files_encoding_ok( grep { -d } qw( bin lib t xt ) );
933             XT_AUTHOR_MOJIBAKE_T
934              
935             =head2 xt/author/no-tabs.t
936              
937             L<Test::NoTabs|Test::NoTabs> author test.
938              
939             =cut
940              
941             $file{q{xt/author/no-tabs.t}} = $test_header . <<'XT_AUTHOR_NO_TABS_T';
942             use Test::NoTabs;
943              
944             all_perl_files_ok( grep { -d } qw( bin lib t xt ) );
945             XT_AUTHOR_NO_TABS_T
946              
947             =head2 xt/author/pod-no404s.t
948              
949             L<Test::Pod::No404s|Test::Pod::No404s> author test.
950              
951             =cut
952              
953             $file{q{xt/author/pod-no404s.t}} = $test_header . <<'XT_AUTHOR_POD_NO404S_T';
954             if ( exists $ENV{AUTOMATED_TESTING} ) {
955             print "1..0 # SKIP these tests during AUTOMATED_TESTING\n";
956             exit 0;
957             }
958              
959             use Test::Pod::No404s;
960              
961             all_pod_files_ok();
962             XT_AUTHOR_POD_NO404S_T
963              
964             =head2 xt/author/pod-spell.t
965              
966             L<Test::Spelling|Test::Spelling> author test. B<stopwords> are added as stopwords.
967              
968             =cut
969              
970             $file{q{xt/author/pod-spell.t}} = sub {
971             my ($self) = @_;
972              
973             my $content = $test_header . <<'XT_AUTHOR_POD_SPELL_T';
974             use Test::Spelling 0.12;
975             use Pod::Wordlist;
976              
977             add_stopwords(<DATA>);
978              
979             all_pod_files_spelling_ok( grep { -d } qw( bin lib t xt ) );
980             __DATA__
981             XT_AUTHOR_POD_SPELL_T
982              
983             my @stopwords = grep { defined && !m{ ^ \s* $ }xsm } @{ $self->stopwords };
984             push @stopwords, split /\s/xms, join q{ }, @{ $self->zilla->authors };
985              
986             $content .= join "\n", uniq( sort @stopwords ), q{};
987              
988             return $content;
989             };
990              
991             =head2 xt/author/pod-syntax.t
992              
993             L<Test::Pod|Test::Pod> author test.
994              
995             =cut
996              
997             $file{q{xt/author/pod-syntax.t}} = $test_header . <<'XT_AUTHOR_POD_SYNTAX_T';
998             use Test::Pod 1.26;
999              
1000             all_pod_files_ok( grep { -d } qw( bin lib t xt) );
1001             XT_AUTHOR_POD_SYNTAX_T
1002              
1003             =head2 xt/author/portability.t
1004              
1005             L<Test::Portability::Files|Test::Portability::Files> author test.
1006              
1007             =cut
1008              
1009             $file{q{xt/author/portability.t}} = $test_header . <<'XT_AUTHOR_PORTABILITY_T';
1010             BEGIN {
1011             if ( !-f 'MANIFEST' ) {
1012             print "1..0 # SKIP No MANIFEST file\n";
1013             exit 0;
1014             }
1015             }
1016              
1017             use Test::Portability::Files;
1018              
1019             options( test_one_dot => 0 );
1020             run_tests();
1021             XT_AUTHOR_PORTABILITY_T
1022              
1023             =head2 xt/author/test-version.t
1024              
1025             L<Test::Version|Test::Version> author test.
1026              
1027             =cut
1028              
1029             $file{q{xt/author/test-version.t}} = $test_header . <<'XT_AUTHOR_TEST_VERSION_T';
1030             use Test::More 0.88;
1031             use Test::Version 0.04 qw( version_all_ok ), {
1032             consistent => 1,
1033             has_version => 1,
1034             is_strict => 0,
1035             multiple => 0,
1036             };
1037              
1038             version_all_ok;
1039             done_testing();
1040             XT_AUTHOR_TEST_VERSION_T
1041              
1042             =head2 xt/release/changes.t
1043              
1044             L<Test::CPAN::Changes|Test::CPAN::Changes> release test.
1045              
1046             =cut
1047              
1048             $file{q{xt/release/changes.t}} = $test_header . <<'XT_RELEASE_CHANGES_T';
1049             use Test::CPAN::Changes;
1050              
1051             changes_ok();
1052             XT_RELEASE_CHANGES_T
1053              
1054             =head2 xt/release/distmeta.t
1055              
1056             L<Test::CPAN::Meta|Test::CPAN::Meta> release test.
1057              
1058             =cut
1059              
1060             $file{q{xt/release/distmeta.t}} = $test_header . <<'XT_RELEASE_DISTMETA_T';
1061             use Test::CPAN::Meta;
1062              
1063             meta_yaml_ok();
1064             XT_RELEASE_DISTMETA_T
1065              
1066             =head2 xt/release/eol.t
1067              
1068             L<Test::EOL|Test::EOL> release test.
1069              
1070             =cut
1071              
1072             $file{q{xt/release/eol.t}} = $test_header . <<'XT_RELEASE_EOL_T';
1073             use Test::EOL;
1074              
1075             all_perl_files_ok( { trailing_whitespace => 1 }, grep { -d } qw( bin lib t xt) );
1076             XT_RELEASE_EOL_T
1077              
1078             =head2 xt/release/kwalitee.t
1079              
1080             L<Test::Kwalitee|Test::Kwalitee> release test.
1081              
1082             =cut
1083              
1084             $file{q{xt/release/kwalitee.t}} = $test_header . <<'XT_RELEASE_KWALITEE_T';
1085             use Test::More 0.88;
1086             use Test::Kwalitee 'kwalitee_ok';
1087              
1088             # Module::CPANTS::Analyse does not find the LICENSE in scripts that don't end in .pl
1089             kwalitee_ok(qw{-has_license_in_source_file -has_abstract_in_pod});
1090              
1091             done_testing();
1092             XT_RELEASE_KWALITEE_T
1093              
1094             =head2 xt/release/manifest.t
1095              
1096             L<Test::DistManifest|Test::DistManifest> release test.
1097              
1098             =cut
1099              
1100             $file{q{xt/release/manifest.t}} = $test_header . <<'XT_RELEASE_MANIFEST_T';
1101             use Test::DistManifest 1.003;
1102              
1103             manifest_ok();
1104             XT_RELEASE_MANIFEST_T
1105              
1106             =head2 xt/release/meta-json.t
1107              
1108             L<Test::CPAN::Meta::JSON|Test::CPAN::Meta::JSON> release test.
1109              
1110             =cut
1111              
1112             $file{q{xt/release/meta-json.t}} = $test_header . <<'XT_RELEASE_META_JSON_T';
1113             use Test::CPAN::Meta::JSON;
1114              
1115             meta_json_ok();
1116             XT_RELEASE_META_JSON_T
1117              
1118             =head2 xt/release/meta-yaml.t
1119              
1120             L<Test::CPAN::Meta|Test::CPAN::Meta> release test.
1121              
1122             =cut
1123              
1124             $file{q{xt/release/meta-yaml.t}} = $test_header . <<'XT_RELEASE_META_YAML_T';
1125             use Test::CPAN::Meta 0.12;
1126              
1127             meta_yaml_ok();
1128             XT_RELEASE_META_YAML_T
1129             }
1130              
1131             __PACKAGE__->meta->make_immutable;
1132              
1133             1;
1134              
1135             __END__
1136              
1137             =head1 USAGE
1138              
1139             The following configuration options are supported:
1140              
1141             =over 4
1142              
1143             =item *
1144              
1145             C<skip> - Defines files to be skipped (not generated).
1146              
1147             =item *
1148              
1149             C<stopwords> - Defines stopwords for the spell checker.
1150              
1151             =item *
1152              
1153             C<travis_ci_ignore_perl> - By default, the generated F<.travis.yml> file
1154             runs on all Perl version known to exist on TravisCI. Use the
1155             C<travis_ci_ignore_perl> option to define Perl versions to not check.
1156              
1157             =back
1158              
1159             =head1 SUPPORT
1160              
1161             =head2 Bugs / Feature Requests
1162              
1163             Please report any bugs or feature requests through the issue tracker
1164             at L<https://github.com/skirmess/Dist-Zilla-PluginBundle-Author-SKIRMESS/issues>.
1165             You will be notified automatically of any progress on your issue.
1166              
1167             =head2 Source Code
1168              
1169             This is open source software. The code repository is available for
1170             public review and contribution under the terms of the license.
1171              
1172             L<https://github.com/skirmess/Dist-Zilla-PluginBundle-Author-SKIRMESS>
1173              
1174             git clone https://github.com/skirmess/Dist-Zilla-PluginBundle-Author-SKIRMESS.git
1175              
1176             =head1 AUTHOR
1177              
1178             Sven Kirmess <sven.kirmess@kzone.ch>
1179              
1180             =head1 COPYRIGHT AND LICENSE
1181              
1182             This software is Copyright (c) 2017 by Sven Kirmess.
1183              
1184             This is free software, licensed under:
1185              
1186             The (two-clause) FreeBSD License
1187              
1188             =head1 SEE ALSO
1189              
1190             L<Dist::Zilla::PluginBundle::Author::SKIRMESS|Dist::Zilla::PluginBundle::Author::SKIRMESS>
1191              
1192             =cut
1193              
1194             # vim: ts=4 sts=4 sw=4 et: syntax=perl