File Coverage

blib/lib/Dist/Zooky/DistIni.pm
Criterion Covered Total %
statement 42 43 97.6
branch 5 8 62.5
condition 1 2 50.0
subroutine 9 9 100.0
pod 1 1 100.0
total 58 63 92.0


line stmt bran cond sub pod time code
1             package Dist::Zooky::DistIni;
2             $Dist::Zooky::DistIni::VERSION = '0.20';
3             # ABSTRACT: Generates a Dist::Zilla dist.ini file
4              
5 2     2   1471 use strict;
  2         4  
  2         78  
6 2     2   7 use warnings;
  2         2  
  2         55  
7 2     2   835 use Class::Load ();
  2         22931  
  2         43  
8 2     2   924 use Moose;
  2         576639  
  2         11  
9 2     2   11081 use Module::Load::Conditional qw[check_install];
  2         32253  
  2         117  
10 2     2   989 use Module::Pluggable search_path => 'Dist::Zooky::DistIni', except => 'Dist::Zooky::DistIni::Prereqs';
  2         11773  
  2         12  
11 2     2   1034 use Dist::Zooky::DistIni::Prereqs;
  2         6  
  2         815  
12              
13             with 'Dist::Zilla::Role::TextTemplate';
14              
15             has 'type' => (
16             is => 'ro',
17             isa => 'Str',
18             required => 1,
19             );
20              
21             has 'metadata' => (
22             is => 'ro',
23             isa => 'HashRef',
24             required => 1,
25             );
26              
27             has 'bundle' => (
28             is => 'ro',
29             isa => 'Str',
30             );
31              
32             my $temphead =
33             q|name = {{ $name }}
34             version = {{ $version }}
35             {{ $OUT .= join "\n", map { "author = $_" } @authors; }}
36             {{ $OUT .= join "\n", map { "license = $_" } @licenses; }}
37             {{ ( my $holder = $authors[0] ) =~ s/\s*\<.+?\>\s*//g; "copyright_holder = $holder"; }}
38              
39             |;
40              
41             my $tempstd =
42             q|[GatherDir]
43             [PruneCruft]
44             [ManifestSkip]
45             [MetaYAML]
46             [MetaJSON]
47             [License]
48              
49             {{ -e 'README' ? ';[Readme]' : '[Readme]'; }}
50              
51             [ExecDir]
52             {{ $OUT = "dir = scripts" if -d 'scripts' }}
53              
54             [ExtraTests]
55             [ShareDir]
56              
57             {{ $OUT .= +( $type eq 'ModBuild' ? '[ModuleBuild]' : '[MakeMaker]' ) }}
58              
59             [Manifest]
60             [TestRelease]
61             [ConfirmRelease]
62             [UploadToCPAN]|;
63              
64             sub write {
65 2     2 1 643 my $self = shift;
66 2   50     6 my $file = shift || 'dist.ini';
67 2         3 my %stash;
68 2         58 $stash{type} = $self->type;
69             $stash{$_} = $self->metadata->{prereqs}->{$_}->{requires}
70 2         46 for qw(configure build runtime);
71 2         44 $stash{$_} = $self->metadata->{$_} for qw(author license version name);
72 2         11 $stash{"${_}s"} = delete $stash{$_} for qw(author license);
73 2 100       44 my $template = $temphead . ( $self->bundle ? q|[@| . $self->bundle . qq|]| : $tempstd ) . "\n";
74 2         11 my $content = $self->fill_in_string(
75             $template,
76             \%stash,
77             );
78              
79 2         2556 foreach my $plugin ( $self->plugins ) {
80 4         3508 Class::Load::load_class( $plugin );
81 4         204 my $add = $plugin->new( type => $self->type, metadata => $self->metadata )->content;
82 4 50       123 next unless $add;
83 0         0 $content = join "\n", $content, $add;
84             }
85              
86 2         46 my $prereqs = Dist::Zooky::DistIni::Prereqs->new( type => $self->type, metadata => $self->metadata )->content;
87 2 50       88 $content = join("\n", $content, $prereqs) if $prereqs;
88              
89 2 50       307 open my $ini, '>', $file or die "Could not open '$file': $!\n";
90 2         14 print $ini $content;
91 2         152 close $ini;
92             }
93              
94             __PACKAGE__->meta->make_immutable;
95 2     2   18 no Moose;
  2         2  
  2         12  
96              
97             qq[And Dist::Zooky too!];
98              
99             __END__
100              
101             =pod
102              
103             =encoding UTF-8
104              
105             =head1 NAME
106              
107             Dist::Zooky::DistIni - Generates a Dist::Zilla dist.ini file
108              
109             =head1 VERSION
110              
111             version 0.20
112              
113             =head1 SYNOPSIS
114              
115             my $meta = {
116             type => 'MakeMaker',
117             name => 'Foo-Bar',
118             version => '0.02',
119             author => [ 'Duck Dodgers', 'Ivor Biggun' ],
120             license => [ 'Perl_5' ],
121             prereqs => {
122             'runtime' => {
123             'requires' => { 'Moo::Cow' => '0.19' },
124             },
125             }
126             };
127              
128             my $distini = Dist::Zooky::DistIni->new( metadata => $meta );
129             $distini->write();
130              
131             =head1 DESCRIPTION
132              
133             Dist::Zooky::DistIni takes meta data and writes a L<Dist::Zilla> C<dist.ini> file.
134              
135             =head2 ATTRIBUTES
136              
137             These attributes are passed to DistIni plugins.
138              
139             =over
140              
141             =item C<type>
142              
143             A required attribute, the type of distribution, C<MakeMaker> for L<ExtUtils::MakeMaker> or
144             L<Module::Install> ( yeah, I know ) based distributions, or C<ModBuild> for L<Module::Build>
145             based distributions.
146              
147             =item C<metadata>
148              
149             A required attribute. This is a C<HASHREF> of meta data.
150              
151             =back
152              
153             =head2 METHODS
154              
155             =over
156              
157             =item C<write>
158              
159             Writes a C<dist.ini> file with the provides C<metadata>. Takes an optional parameter, which is the filename
160             to write to, the default being C<dist.ini>.
161              
162             =back
163              
164             =head1 NAME
165              
166             Dist::Zooky::DistIni - Generates a Dist::Zilla dist.ini file
167              
168             =head1 AUTHOR
169              
170             Chris Williams <chris@bingosnet.co.uk>
171              
172             =head1 COPYRIGHT AND LICENSE
173              
174             This software is copyright (c) 2017 by Chris Williams.
175              
176             This is free software; you can redistribute it and/or modify it under
177             the same terms as the Perl 5 programming language system itself.
178              
179             =cut