This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
94ce0948b0427af57cc672c448e6d3f54d360b6a
[perl5.git] / cpan / ExtUtils-MakeMaker / t / metafile_data.t
1 BEGIN {
2     unshift @INC, 't/lib';
3 }
4
5 use strict;
6 use Test::More tests => 22;
7
8 use Data::Dumper;
9 use File::Temp;
10 use Cwd;
11 use Parse::CPAN::Meta;
12
13 require ExtUtils::MM_Any;
14
15 sub in_dir(&;$) {
16     my $code = shift;
17     my $dir = shift || File::Temp->newdir;
18
19     # chdir to the new directory
20     my $orig_dir = cwd();
21     chdir $dir or die "Can't chdir to $dir: $!";
22
23     # Run the code, but trap the error so we can chdir back
24     my $return;
25     my $ok = eval { $return = $code->(); 1; };
26     my $err = $@;
27
28     # chdir back
29     chdir $orig_dir or die "Can't chdir to $orig_dir: $!";
30
31     # rethrow if necessary
32     die $err unless $ok;
33
34     return $return;
35 }
36
37 sub mymeta_ok {
38     my($have, $want, $name) = @_;
39
40     local $Test::Builder::Level = $Test::Builder::Level + 1;
41
42     my $have_gen = delete $have->{generated_by};
43     my $want_gen = delete $want->{generated_by};
44
45     is_deeply $have, $want, $name;
46     like $have_gen, qr{CPAN::Meta}, "CPAN::Meta mentioned in the generated_by";
47
48     return;
49 }
50
51 my $new_mm = sub {
52     return bless { ARGS => {@_}, @_ }, 'ExtUtils::MM_Any';
53 };
54
55 {
56     my $mm = $new_mm->(
57         DISTNAME        => 'Foo-Bar',
58         VERSION         => 1.23,
59         PM              => {
60             "Foo::Bar"          => 'lib/Foo/Bar.pm',
61         },
62     );
63
64     is_deeply {$mm->metafile_data}, {
65         name            => 'Foo-Bar',
66         version         => 1.23,
67         abstract        => 'unknown',
68         author          => [],
69         license         => 'unknown',
70         dynamic_config  => 1,
71         distribution_type       => 'module',
72
73         configure_requires      => {
74             'ExtUtils::MakeMaker'       => 0,
75         },
76         build_requires      => {
77             'ExtUtils::MakeMaker'       => 0,
78         },
79
80         no_index        => {
81             directory           => [qw(t inc)],
82         },
83
84         generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
85         'meta-spec'  => {
86             url         => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
87             version     => 1.4
88         },
89     };
90
91
92     is_deeply {$mm->metafile_data({}, { no_index => { directory => [qw(foo)] } })}, {
93         name            => 'Foo-Bar',
94         version         => 1.23,
95         abstract        => 'unknown',
96         author          => [],
97         license         => 'unknown',
98         dynamic_config  => 1,
99         distribution_type       => 'module',
100
101         configure_requires      => {
102             'ExtUtils::MakeMaker'       => 0,
103         },
104         build_requires      => {
105             'ExtUtils::MakeMaker'       => 0,
106         },
107
108         no_index        => {
109             directory           => [qw(t inc foo)],
110         },
111
112         generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
113         'meta-spec'  => {
114             url         => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
115             version     => 1.4
116         },
117     }, 'rt.cpan.org 39348';
118 }
119
120
121 {
122     my $mm = $new_mm->(
123         DISTNAME        => 'Foo-Bar',
124         VERSION         => 1.23,
125         AUTHOR          => ['Some Guy'],
126         PREREQ_PM       => {
127             Foo                 => 2.34,
128             Bar                 => 4.56,
129         },
130     );
131
132     is_deeply {$mm->metafile_data(
133         {
134             configure_requires => {
135                 Stuff   => 2.34
136             },
137             wobble      => 42
138         },
139         {
140             no_index    => {
141                 package => "Thing"
142             },
143             wibble      => 23
144         },
145     )},
146     {
147         name            => 'Foo-Bar',
148         version         => 1.23,
149         abstract        => 'unknown',
150         author          => ['Some Guy'],
151         license         => 'unknown',
152         dynamic_config  => 1,
153         distribution_type       => 'script',
154
155         configure_requires      => {
156             Stuff       => 2.34,
157         },
158         build_requires      => {
159             'ExtUtils::MakeMaker'       => 0,
160         },
161
162         requires       => {
163             Foo                 => 2.34,
164             Bar                 => 4.56,
165         },
166
167         no_index        => {
168             directory           => [qw(t inc)],
169             package             => 'Thing',
170         },
171
172         generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
173         'meta-spec'  => {
174             url         => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
175             version     => 1.4
176         },
177
178         wibble  => 23,
179         wobble  => 42,
180     };
181 }
182
183
184 # Test MIN_PERL_VERSION
185 {
186     my $mm = $new_mm->(
187         DISTNAME        => 'Foo-Bar',
188         VERSION         => 1.23,
189         PM              => {
190             "Foo::Bar"          => 'lib/Foo/Bar.pm',
191         },
192         MIN_PERL_VERSION => 5.006,
193     );
194
195     is_deeply {$mm->metafile_data}, {
196         name            => 'Foo-Bar',
197         version         => 1.23,
198         abstract        => 'unknown',
199         author          => [],
200         license         => 'unknown',
201         dynamic_config  => 1,
202         distribution_type       => 'module',
203
204         configure_requires      => {
205             'ExtUtils::MakeMaker'       => 0,
206         },
207         build_requires      => {
208             'ExtUtils::MakeMaker'       => 0,
209         },
210
211         requires        => {
212             perl        => '5.006',
213         },
214
215         no_index        => {
216             directory           => [qw(t inc)],
217         },
218
219         generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
220         'meta-spec'  => {
221             url         => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
222             version     => 1.4
223         },
224     };
225 }
226
227
228 # Test MIN_PERL_VERSION
229 {
230     my $mm = $new_mm->(
231         DISTNAME        => 'Foo-Bar',
232         VERSION         => 1.23,
233         PM              => {
234             "Foo::Bar"          => 'lib/Foo/Bar.pm',
235         },
236         MIN_PERL_VERSION => 5.006,
237         PREREQ_PM => {
238             'Foo::Bar'  => 1.23,
239         },
240     );
241
242     is_deeply {$mm->metafile_data}, {
243         name            => 'Foo-Bar',
244         version         => 1.23,
245         abstract        => 'unknown',
246         author          => [],
247         license         => 'unknown',
248         dynamic_config  => 1,
249         distribution_type       => 'module',
250
251         configure_requires      => {
252             'ExtUtils::MakeMaker'       => 0,
253         },
254         build_requires      => {
255             'ExtUtils::MakeMaker'       => 0,
256         },
257
258         requires        => {
259             perl        => '5.006',
260             'Foo::Bar'  => 1.23,
261         },
262
263         no_index        => {
264             directory           => [qw(t inc)],
265         },
266
267         generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
268         'meta-spec'  => {
269             url         => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
270             version     => 1.4
271         },
272     };
273 }
274
275 # Test CONFIGURE_REQUIRES
276 {
277     my $mm = $new_mm->(
278         DISTNAME        => 'Foo-Bar',
279         VERSION         => 1.23,
280         CONFIGURE_REQUIRES => {
281             "Fake::Module1" => 1.01,
282         },
283         PM              => {
284             "Foo::Bar"          => 'lib/Foo/Bar.pm',
285         },
286     );
287
288     is_deeply {$mm->metafile_data}, {
289         name            => 'Foo-Bar',
290         version         => 1.23,
291         abstract        => 'unknown',
292         author          => [],
293         license         => 'unknown',
294         dynamic_config  => 1,
295         distribution_type       => 'module',
296
297         configure_requires      => {
298             'Fake::Module1'       => 1.01,
299         },
300         build_requires      => {
301             'ExtUtils::MakeMaker'       => 0,
302         },
303
304         no_index        => {
305             directory           => [qw(t inc)],
306         },
307
308         generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
309         'meta-spec'  => {
310             url         => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
311             version     => 1.4
312         },
313     },'CONFIGURE_REQUIRES';
314 }
315
316 # Test BUILD_REQUIRES
317 {
318     my $mm = $new_mm->(
319         DISTNAME        => 'Foo-Bar',
320         VERSION         => 1.23,
321         BUILD_REQUIRES => {
322             "Fake::Module1" => 1.01,
323         },
324         PM              => {
325             "Foo::Bar"          => 'lib/Foo/Bar.pm',
326         },
327     );
328
329     is_deeply {$mm->metafile_data}, {
330         name            => 'Foo-Bar',
331         version         => 1.23,
332         abstract        => 'unknown',
333         author          => [],
334         license         => 'unknown',
335         dynamic_config  => 1,
336         distribution_type       => 'module',
337
338         configure_requires      => {
339             'ExtUtils::MakeMaker'       => 0,
340         },
341         build_requires      => {
342             'Fake::Module1'       => 1.01,
343         },
344
345         no_index        => {
346             directory           => [qw(t inc)],
347         },
348
349         generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
350         'meta-spec'  => {
351             url         => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
352             version     => 1.4
353         },
354     },'CONFIGURE_REQUIRES';
355 }
356
357 # Test _REQUIRES key priority over META_ADD
358
359 {
360     my $mm = $new_mm->(
361         DISTNAME        => 'Foo-Bar',
362         VERSION         => 1.23,
363         BUILD_REQUIRES => {
364             "Fake::Module1" => 1.01,
365         },
366         META_ADD => (my $meta_add = { build_requires => {} }),
367         PM              => {
368             "Foo::Bar"          => 'lib/Foo/Bar.pm',
369         },
370     );
371
372     is_deeply {$mm->metafile_data($meta_add)}, {
373         name            => 'Foo-Bar',
374         version         => 1.23,
375         abstract        => 'unknown',
376         author          => [],
377         license         => 'unknown',
378         dynamic_config  => 1,
379         distribution_type       => 'module',
380
381         configure_requires      => {
382             'ExtUtils::MakeMaker'       => 0,
383         },
384         build_requires      => { },
385
386         no_index        => {
387             directory           => [qw(t inc)],
388         },
389
390         generated_by => "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
391         'meta-spec'  => {
392             url         => 'http://module-build.sourceforge.net/META-spec-v1.4.html',
393             version     => 1.4
394         },
395     },'META.yml data (META_ADD wins)';
396
397
398     # Yes, this is all hard coded.
399     require CPAN::Meta;
400     my $want_mymeta = {
401         name            => 'ExtUtils-MakeMaker',
402         version         => '6.57_07',
403         abstract        => 'Create a module Makefile',
404         author          => ['Michael G Schwern <schwern@pobox.com>'],
405         license         => ['perl_5'],
406         dynamic_config  => 0,
407
408         prereqs         => {
409             runtime => {
410                 requires => {
411                     "DirHandle"         => 0,
412                     "File::Basename"    => 0,
413                     "File::Spec"        => "0.8",
414                     "Pod::Man"          => 0,
415                     "perl"              => "5.006",
416                 },
417             },
418             configure => {
419                 requires => {
420                 },
421             },
422             build    => {
423                 requires => {
424                     'Fake::Module1'       => 1.01,
425                 },
426             },
427         },
428
429         release_status => 'testing',
430         resources => {
431             license     =>  [ 'http://dev.perl.org/licenses/' ],
432             homepage    =>  'http://makemaker.org',
433             bugtracker  =>  { web => 'http://rt.cpan.org/NoAuth/Bugs.html?Dist=ExtUtils-MakeMaker' },
434             repository  =>  { url => 'http://github.com/Perl-Toolchain-Gang/ExtUtils-MakeMaker' },
435             x_MailingList => 'makemaker@perl.org',
436         },
437
438         no_index        => {
439             directory           => [qw(t inc)],
440             package             => ["DynaLoader", "in"],
441         },
442
443         generated_by => "ExtUtils::MakeMaker version 6.5707, CPAN::Meta::Converter version 2.110580",
444         'meta-spec'  => {
445             url         => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
446             version     => 2,
447         },
448     };
449
450     mymeta_ok $mm->mymeta("t/META_for_testing.json"),
451               $want_mymeta,
452               'MYMETA JSON data (BUILD_REQUIRES wins)';
453
454     mymeta_ok $mm->mymeta("t/META_for_testing.yml"),
455               $want_mymeta,
456               'MYMETA YAML data (BUILD_REQUIRES wins)';
457 }
458
459 {
460     my $mm = $new_mm->(
461         DISTNAME       => 'Foo-Bar',
462         VERSION        => 1.23,
463         BUILD_REQUIRES => { "Fake::Module1" => 1.01 },
464         TEST_REQUIRES  => { "Fake::Module2" => 1.23 },
465     );
466
467     my $meta = $mm->mymeta('t/META_for_testing.json');
468     is($meta->{build_requires}, undef, "no build_requires in v2 META");
469     is_deeply(
470         $meta->{prereqs}{build}{requires},
471         { "Fake::Module1" => 1.01 },
472         "build requires are one thing in META v2...",
473     );
474
475     is_deeply(
476         $meta->{prereqs}{test}{requires},
477         { "Fake::Module2" => 1.23 },
478         "...and test requires are another",
479     );
480 }
481
482 note "CPAN::Meta bug using the module version instead of the meta spec version"; {
483     my $mm = $new_mm->(
484         NAME      => 'GD::Barcode::Code93',
485         AUTHOR    => 'Chris DiMartino',
486         ABSTRACT  => 'Code 93 implementation of GD::Barcode family',
487         PREREQ_PM => {
488             'GD::Barcode' => 0,
489             'GD'          => 0
490         },
491         VERSION   => '1.4',
492     );
493
494     my $meta = $mm->mymeta("t/META_for_testing_tricky_version.yml");
495     is $meta->{'meta-spec'}{version}, 2, "internally, our MYMETA struct is v2";
496
497     in_dir {
498         $mm->write_mymeta($meta);
499         ok -e "MYMETA.yml";
500         ok -e "MYMETA.json";
501
502         my $meta_yml = Parse::CPAN::Meta->load_file("MYMETA.yml");
503         is $meta_yml->{'meta-spec'}{version}, 1.4, "MYMETA.yml correctly downgraded to 1.4";
504
505         my $meta_json = Parse::CPAN::Meta->load_file("MYMETA.json");
506         cmp_ok $meta_json->{'meta-spec'}{version}, ">=", 2, "MYMETA.json at 2 or better";
507     };
508 }
509
510
511 note "A bad license string"; {
512     my $mm = $new_mm->(
513         DISTNAME  => 'Foo::Bar',
514         VERSION   => '1.4',
515         LICENSE   => 'death and retribution',
516     );
517
518     in_dir {
519         my $meta = $mm->mymeta;
520         $mm->write_mymeta($meta);
521
522         my $meta_yml = Parse::CPAN::Meta->load_file("MYMETA.yml");
523         is $meta_yml->{license}, "unknown", "in yaml";
524
525         my $meta_json = Parse::CPAN::Meta->load_file("MYMETA.json");
526         is_deeply $meta_json->{license}, ["unknown"], "in json";
527     };
528 }