File Coverage

lib/Module/Build/Bundle.pm
Criterion Covered Total %
statement 32 176 18.1
branch 0 76 0.0
condition 0 24 0.0
subroutine 11 17 64.7
pod 5 5 100.0
total 48 298 16.1


line stmt bran cond sub pod time code
1             package Module::Build::Bundle;
2              
3 1     1   26517 use 5.008; #$^V
  1         3  
4 1     1   7 use strict;
  1         2  
  1         30  
5 1     1   6 use warnings;
  1         2  
  1         44  
6 1     1   6 use Carp qw(croak);
  1         2  
  1         95  
7 1     1   7 use Cwd qw(getcwd);
  1         1  
  1         57  
8 1     1   749 use Tie::IxHash;
  1         5597  
  1         47  
9 1     1   704 use English qw( -no_match_vars );
  1         4466  
  1         9  
10 1     1   1334 use File::Slurp; #read_file
  1         14442  
  1         118  
11 1     1   14 use base qw(Module::Build::Base);
  1         2  
  1         1576  
12 1     1   72949 use utf8;
  1         9  
  1         4  
13              
14 1     1   32 use constant EXTENDED_POD_LINK_VERSION => 5.12.0;
  1         1  
  1         1634  
15              
16             our $VERSION = '0.15';
17              
18             #HACK: we need a writable copy for testing purposes
19             ## no critic qw(Variables::ProhibitPackageVars Variables::ProhibitPunctuationVars)
20             our $myPERL_VERSION = $^V;
21              
22             sub ACTION_build {
23 0     0 1   my $self = shift;
24              
25 0 0         if ( !$self->{'_completed_actions'}{'contents'} ) {
26 0           $self->ACTION_contents();
27             }
28              
29 0           return Module::Build::Base::ACTION_build($self);
30             }
31              
32             sub ACTION_contents {
33 0     0 1   my $self = shift;
34              
35             #Fetching requirements from Build.PL
36 0           my @list = %{ $self->requires() };
  0            
37              
38 0   0       my $section_header = $self->notes('section_header') || 'CONTENTS';
39              
40 0           my $sorted = 'Tie::IxHash'->new(@list);
41 0           $sorted->SortByKey();
42              
43 0           my $pod = "=head1 $section_header\n\n=over\n\n";
44 0           foreach ( $sorted->Keys ) {
45 0           my ( $module, $version ) = $sorted->Shift();
46              
47 0           my $dist = $module;
48 0           $dist =~ s/::/\-/g;
49              
50 0           my $module_path = $module;
51 0           $module_path =~ s[::][/]g;
52 0           $module_path .= '.pm';
53              
54 0 0         if ( $myPERL_VERSION ge EXTENDED_POD_LINK_VERSION ) {
55 0 0         if ($version) {
56 0           $pod .= "=item * L<$module|$module>, "
57             . "L<$version|http://search.cpan.org/dist/$dist-$version/lib/$module_path>\n\n";
58             } else {
59 0           $pod .= "=item * L<$module|$module>\n\n";
60             }
61             } else {
62 0 0         if ($version) {
63 0           $pod .= "=item * L<$module|$module>, $version\n\n";
64             } else {
65 0           $pod .= "=item * L<$module|$module>\n\n";
66             }
67             }
68             }
69 0           $pod .= "=back\n\n=head1";
70              
71 0           my $cwd = getcwd();
72              
73             my @path = split /::/, $self->{properties}->{module_name}
74 0   0       || $self->{properties}->{module_name};
75              
76             #HACK: induced from test suite
77 0 0         my $dir = $self->notes('temp_wd') ? $self->notes('temp_wd') : $cwd .'/t/';
78              
79             ## no critic qw(ValuesAndExpressions::ProhibitNoisyQuotes)
80 0           my $file = ( join '/', ( $dir, @path ) ) . '.pm';
81              
82 0 0         my $contents = read_file($file) or croak "Unable to read file: $file - $!";
83              
84 0           my $rv = $contents =~ s/=head1\s*$section_header\s*.*=head1/$pod/s;
85              
86 0 0         if ( !$rv ) {
87 0           croak "No $section_header section replaced";
88             }
89              
90 0 0         open my $fout, '>', $file
91             or croak "Unable to open file: $file - $!";
92              
93 0           print $fout $contents;
94              
95 0 0         close $fout or croak "Unable to close file: $file - $!";
96              
97 0           return 1;
98             }
99              
100             #Lifted from Module::Build::Base
101             sub do_create_metafile {
102 0     0 1   my $self = shift;
103 0 0         return if $self->{wrote_metadata};
104 0           my $p = $self->{properties};
105              
106 0 0         unless ($p->{license}) {
107 0           $self->log_warn("No license specified, setting license = 'unknown'\n");
108 0           $p->{license} = 'unknown';
109             }
110              
111 0           my @metafiles = ( $self->metafile, $self->metafile2 );
112             # If we're in the distdir, the metafile may exist and be non-writable.
113 0           $self->delete_filetree($_) for @metafiles;
114              
115             # Since we're building ourself, we have to do some special stuff
116             # here: the ConfigData module is found in blib/lib.
117 0           local @INC = @INC;
118 0 0 0       if (($self->module_name || '') eq 'Module::Build') {
119 0           $self->depends_on('config_data');
120 0           push @INC, File::Spec->catdir($self->blib, 'lib');
121             }
122              
123 0           my $meta_obj = $self->_get_meta_object(
124             quiet => 0, fatal => 1, auto => 1
125             );
126              
127             #JONASBN: Changed file parameter
128 0           my @created = $self->_write_meta_files( $meta_obj, $self->metafile );
129              
130 0 0         if ( @created ) {
131 0           $self->{wrote_metadata} = 1;
132 0           $self->_add_to_manifest('MANIFEST', $_) for @created;
133             }
134 0           return 1;
135             }
136              
137             #lifted from Module::Build::Base, sets generated_by
138             sub get_metadata {
139 0     0 1   my ($self, %args) = @_;
140              
141 0   0       my $fatal = $args{fatal} || 0;
142 0           my $p = $self->{properties};
143              
144 0 0         $self->auto_config_requires if $args{auto};
145              
146             # validate required fields
147 0           foreach my $f (qw(dist_name dist_version dist_author dist_abstract license)) {
148 0           my $field = $self->$f();
149 0 0 0       unless ( defined $field and length $field ) {
150 0           my $err = "ERROR: Missing required field '$f' for metafile\n";
151 0 0         if ( $fatal ) {
152 0           die $err;
153             }
154             else {
155 0           $self->log_warn($err);
156             }
157             }
158             }
159              
160             my %metadata = (
161             name => $self->dist_name,
162             version => $self->normalize_version($self->dist_version),
163             author => $self->dist_author,
164             abstract => $self->dist_abstract,
165             #JONASBN changed the generated_by
166             generated_by => "Module::Build::Bundle version $Module::Build::Bundle::VERSION",
167             'meta-spec' => {
168             version => '2',
169             url => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
170             },
171 0 0         dynamic_config => exists $p->{dynamic_config} ? $p->{dynamic_config} : 1,
172             release_status => $self->release_status,
173             );
174              
175 0           my ($meta_license, $meta_license_url) = $self->_get_license;
176 0           $metadata{license} = [ $meta_license ];
177 0 0         $metadata{resources}{license} = [ $meta_license_url ] if defined $meta_license_url;
178              
179 0           $metadata{prereqs} = $self->_normalize_prereqs;
180              
181 0 0         if (exists $p->{no_index}) {
    0          
182 0           $metadata{no_index} = $p->{no_index};
183 0           } elsif (my $pkgs = eval { $self->find_dist_packages }) {
184 0 0         $metadata{provides} = $pkgs if %$pkgs;
185             } else {
186 0           $self->log_warn("$@\nWARNING: Possible missing or corrupt 'MANIFEST' file.\n" .
187             "Nothing to enter for 'provides' field in metafile.\n");
188             }
189              
190 0 0         if (my $add = $self->meta_add) {
191 0 0 0       if (not exists $add->{'meta-spec'} or $add->{'meta-spec'}{version} != 2) {
192 0           require CPAN::Meta::Converter;
193 0 0         if (CPAN::Meta::Converter->VERSION('2.141170')) {
194 0           $add = CPAN::Meta::Converter->new($add)->upgrade_fragment;
195 0           delete $add->{prereqs}; # XXX this would now overwrite all prereqs
196             }
197             else {
198 0           $self->log_warn("Can't meta_add without CPAN::Meta 2.141170");
199             }
200             }
201              
202 0           while (my($k, $v) = each %{$add}) {
  0            
203 0           $metadata{$k} = $v;
204             }
205             }
206              
207 0 0         if (my $merge = $self->meta_merge) {
208 0 0         if (eval { require CPAN::Meta::Merge }) {
  0            
209 0           %metadata = %{ CPAN::Meta::Merge->new(default_version => '1.4')->merge(\%metadata, $merge) };
  0            
210             }
211             else {
212 0           $self->log_warn("Can't merge without CPAN::Meta::Merge");
213             }
214             }
215              
216 0           return \%metadata;
217             }
218              
219             #lifted from Module::Build::Base, added package and version resolution and
220             # addition to configure requires
221             sub prepare_metadata {
222 0     0 1   my ($self, $node, $keys) = @_;
223 0           my $p = $self->{properties};
224              
225             #JONASBN: Added package resolution
226 0           my $package = ref $self;
227 0           my $version = $package::VERSION;
228              
229             # A little helper sub
230             my $add_node = sub {
231 0     0     my ($name, $val) = @_;
232 0           $node->{$name} = $val;
233 0 0         push @$keys, $name if $keys;
234 0           };
235              
236 0           foreach (qw(dist_name dist_version dist_author dist_abstract license)) {
237 0           (my $name = $_) =~ s/^dist_//;
238 0           $add_node->($name, $self->$_());
239             die "ERROR: Missing required field '$_' for META.yml\n"
240 0 0 0       unless defined($node->{$name}) && length($node->{$name});
241             }
242 0           $node->{version} = $self->normalize_version($node->{version});
243              
244 0 0         if (defined( my $l = $self->license )) {
245             die "Unknown license string '$l'"
246 0 0         unless exists $self->valid_licenses->{ $l };
247              
248 0 0         if (my $key = $self->valid_licenses->{ $l }) {
249 0           my $class = "Software::License::$key";
250 0 0         if (eval "use $class; 1") {
251             # S::L requires a 'holder' key
252 0           $node->{resources}{license} = $class->new({holder=>"nobody"})->url;
253             }
254             else {
255 0           $node->{resources}{license} = $self->_license_url($l);
256             }
257             }
258             # XXX we are silently omitting the url for any unknown license
259             }
260              
261             # copy prereq data structures so we can modify them before writing to META
262 0           my %prereq_types;
263 0           for my $type ( 'configure_requires', @{$self->prereq_action_types} ) {
  0            
264 0 0         if (exists $p->{$type}) {
265 0           for my $mod ( keys %{ $p->{$type} } ) {
  0            
266             $prereq_types{$type}{$mod} =
267 0           $self->normalize_version($p->{$type}{$mod});
268             }
269             }
270             }
271              
272             # add current Module::Build to configure_requires if there
273             # isn't one already specified (but not ourself, so we're not circular)
274 0 0 0       if ( $self->dist_name ne 'Module-Build'
      0        
275             && $self->auto_configure_requires
276             && ! exists $prereq_types{'configure_requires'}{'Module::Build'}
277             ) {
278 0           $prereq_types{configure_requires}{'Module::Build'} = $VERSION;
279             #JONASBN added configure requires
280 0           $prereq_types{configure_requires}{$package} = $version;
281             }
282              
283 0           for my $t ( keys %prereq_types ) {
284 0           $add_node->($t, $prereq_types{$t});
285             }
286              
287 0 0         if (exists $p->{dynamic_config}) {
288 0           $add_node->('dynamic_config', $p->{dynamic_config});
289             }
290 0           my $pkgs = eval { $self->find_dist_packages };
  0            
291 0 0         if ($@) {
292 0           $self->log_warn("$@\nWARNING: Possible missing or corrupt 'MANIFEST' file.\n" .
293             "Nothing to enter for 'provides' field in META.yml\n");
294             } else {
295 0 0         $node->{provides} = $pkgs if %$pkgs;
296             }
297             ;
298 0 0         if (exists $p->{no_index}) {
299 0           $add_node->('no_index', $p->{no_index});
300             }
301              
302 0           $add_node->('generated_by', "$package version $version");
303              
304 0           $add_node->('meta-spec',
305             {version => '1.4',
306             url => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
307             });
308              
309 0           while (my($k, $v) = each %{$self->meta_add}) {
  0            
310 0           $add_node->($k, $v);
311             }
312              
313 0           while (my($k, $v) = each %{$self->meta_merge}) {
  0            
314 0           $self->_hash_merge($node, $k, $v);
315             }
316              
317 0           return $node;
318             }
319              
320             1;
321              
322             __END__