Update CPAN-Meta to CPAN release 2.150005
authorChris 'BinGOs' Williams <chris@bingosnet.co.uk>
Thu, 11 Jun 2015 15:28:11 +0000 (16:28 +0100)
committerChris 'BinGOs' Williams <chris@bingosnet.co.uk>
Thu, 11 Jun 2015 15:28:11 +0000 (16:28 +0100)
  [DELTA]

2.150005  2015-06-09 19:08:44-06:00 America/Denver

  [TESTING]

  - Changed some test data from UTF-8 to ASCII

2.150004  2015-05-19 11:25:53-04:00 America/New_York (TRIAL RELEASE)

  [DOCUMENTED]

  - Noted explicitly that historical META spec files are licensed under
    the same terms as Perl

  [TESTING]

  - Added test for 'x_deprecated' field in "provides"

  [META]

  - declared extra developer prereq

2.150003  2015-04-21 19:41:15-04:00 America/New_York (TRIAL RELEASE)

  [CHANGED]

  - Serialized CPAN::Meta objects now include a x_serialization_backend
    entry

2.150002  2015-04-19 01:00:10+02:00 Europe/Berlin (TRIAL RELEASE)

  [CHANGED]

  - Metadata merging now does deep hash merging as long as keys
    don't conflict

31 files changed:
MANIFEST
Porting/Maintainers.pl
cpan/CPAN-Meta/lib/CPAN/Meta.pm
cpan/CPAN-Meta/lib/CPAN/Meta/Converter.pm
cpan/CPAN-Meta/lib/CPAN/Meta/Feature.pm
cpan/CPAN-Meta/lib/CPAN/Meta/History.pm
cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_0.pod
cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_1.pod
cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_2.pod
cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_3.pod
cpan/CPAN-Meta/lib/CPAN/Meta/History/Meta_1_4.pod
cpan/CPAN-Meta/lib/CPAN/Meta/Merge.pm
cpan/CPAN-Meta/lib/CPAN/Meta/Prereqs.pm
cpan/CPAN-Meta/lib/CPAN/Meta/Spec.pm
cpan/CPAN-Meta/lib/CPAN/Meta/Validator.pm
cpan/CPAN-Meta/t/converter-bad.t
cpan/CPAN-Meta/t/converter-fail.t
cpan/CPAN-Meta/t/converter-fragments.t
cpan/CPAN-Meta/t/converter.t
cpan/CPAN-Meta/t/data-test/preserve-release-status.yml [new file with mode: 0644]
cpan/CPAN-Meta/t/load-bad.t
cpan/CPAN-Meta/t/merge.t
cpan/CPAN-Meta/t/meta-obj.t
cpan/CPAN-Meta/t/no-index.t
cpan/CPAN-Meta/t/optional_feature-merge.t
cpan/CPAN-Meta/t/prereqs-finalize.t
cpan/CPAN-Meta/t/prereqs-merge.t
cpan/CPAN-Meta/t/prereqs.t
cpan/CPAN-Meta/t/repository.t
cpan/CPAN-Meta/t/save-load.t
cpan/CPAN-Meta/t/validator.t

index 64529d9..8b4aefc 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -299,6 +299,7 @@ cpan/CPAN-Meta/t/data-test/META-1_3.yml
 cpan/CPAN-Meta/t/data-test/META-1_4.yml
 cpan/CPAN-Meta/t/data-test/META-2.json
 cpan/CPAN-Meta/t/data-test/META-2.meta
+cpan/CPAN-Meta/t/data-test/preserve-release-status.yml
 cpan/CPAN-Meta/t/data-test/provides-version-missing.json
 cpan/CPAN-Meta/t/data-test/resources.yml
 cpan/CPAN-Meta/t/data-test/restricted-2.json
index 5cc75c5..1f42462 100755 (executable)
@@ -281,7 +281,7 @@ use File::Glob qw(:case);
     # Note: When updating CPAN-Meta the META.* files will need to be regenerated
     # perl -Icpan/CPAN-Meta/lib Porting/makemeta
     'CPAN::Meta' => {
-        'DISTRIBUTION' => 'DAGOLDEN/CPAN-Meta-2.150001.tar.gz',
+        'DISTRIBUTION' => 'DAGOLDEN/CPAN-Meta-2.150005.tar.gz',
         'FILES'        => q[cpan/CPAN-Meta],
         'EXCLUDED'     => [
             qw[t/00-report-prereqs.t],
index 2a78691..afbb221 100644 (file)
@@ -3,7 +3,7 @@ use strict;
 use warnings;
 package CPAN::Meta;
 
-our $VERSION = '2.150001';
+our $VERSION = '2.150005';
 
 #pod =head1 SYNOPSIS
 #pod
@@ -591,6 +591,10 @@ sub as_struct {
 #pod both cases, the same rules are followed as in the C<save()> method for choosing
 #pod a serialization backend.
 #pod
+#pod The serialized structure will include a C<x_serialization_backend> entry giving
+#pod the package and version used to serialize.  Any existing key in the given
+#pod C<$meta> object will be clobbered.
+#pod
 #pod =cut
 
 sub as_string {
@@ -610,10 +614,14 @@ sub as_string {
   my ($data, $backend);
   if ( $version ge '2' ) {
     $backend = Parse::CPAN::Meta->json_backend();
+    local $struct->{x_serialization_backend} = sprintf '%s version %s',
+      $backend, $backend->VERSION;
     $data = $backend->new->pretty->canonical->encode($struct);
   }
   else {
     $backend = Parse::CPAN::Meta->yaml_backend();
+    local $struct->{x_serialization_backend} = sprintf '%s version %s',
+      $backend, $backend->VERSION;
     $data = eval { no strict 'refs'; &{"$backend\::Dump"}($struct) };
     if ( $@ ) {
       croak $backend->can('errstr') ? $backend->errstr : $@
@@ -632,8 +640,6 @@ sub TO_JSON {
 
 # ABSTRACT: the distribution metadata for a CPAN dist
 
-__END__
-
 =pod
 
 =encoding UTF-8
@@ -644,7 +650,7 @@ CPAN::Meta - the distribution metadata for a CPAN dist
 
 =head1 VERSION
 
-version 2.150001
+version 2.150005
 
 =head1 SYNOPSIS
 
@@ -859,6 +865,10 @@ JSON.  For C<version> less than 2, the string will be serialized as YAML.  In
 both cases, the same rules are followed as in the C<save()> method for choosing
 a serialization backend.
 
+The serialized structure will include a C<x_serialization_backend> entry giving
+the package and version used to serialize.  Any existing key in the given
+C<$meta> object will be clobbered.
+
 =head1 STRING DATA
 
 The following methods return a single value, which is the value for the
@@ -1025,7 +1035,7 @@ Ricardo Signes <rjbs@cpan.org>
 
 =head1 CONTRIBUTORS
 
-=for stopwords Ansgar Burchardt Avar Arnfjord Bjarmason Christopher J. Madsen Chuck Adams Cory G Watson Damyan Ivanov Eric Wilhelm Graham Knop Gregor Hermann Karen Etheridge Kenichi Ishigaki Ken Williams Lars Dieckow Leon Timmermans majensen Mark Fowler Matt S Trout Michael G. Schwern mohawk2 moznion Olaf Alders Olivier Mengue Randy Sims
+=for stopwords Ansgar Burchardt Avar Arnfjord Bjarmason Christopher J. Madsen Chuck Adams Cory G Watson Damyan Ivanov Eric Wilhelm Graham Knop Gregor Hermann Karen Etheridge Kenichi Ishigaki Ken Williams Lars Dieckow Leon Timmermans majensen Mark Fowler Matt S Trout Michael G. Schwern mohawk2 moznion Niko Tyni Olaf Alders Olivier Mengu√© Randy Sims Tomohiro Hosaka
 
 =over 4
 
@@ -1111,16 +1121,24 @@ moznion <moznion@gmail.com>
 
 =item *
 
+Niko Tyni <ntyni@debian.org>
+
+=item *
+
 Olaf Alders <olaf@wundersolutions.com>
 
 =item *
 
-Olivier Mengue <dolmen@cpan.org>
+Olivier Mengu√© <dolmen@cpan.org>
 
 =item *
 
 Randy Sims <randys@thepierianspring.org>
 
+=item *
+
+Tomohiro Hosaka <bokutin@bokut.in>
+
 =back
 
 =head1 COPYRIGHT AND LICENSE
@@ -1131,3 +1149,8 @@ This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
 
 =cut
+
+__END__
+
+
+# vim: ts=2 sts=2 sw=2 et :
index 8b32b13..03806bc 100644 (file)
@@ -3,7 +3,7 @@ use strict;
 use warnings;
 package CPAN::Meta::Converter;
 
-our $VERSION = '2.150001';
+our $VERSION = '2.150005';
 
 #pod =head1 SYNOPSIS
 #pod
@@ -388,6 +388,8 @@ sub _clean_version {
 
 sub _bad_version_hook {
   my ($v) = @_;
+  $v =~ s{^\s*}{};
+  $v =~ s{\s*$}{};
   $v =~ s{[a-z]+$}{}; # strip trailing alphabetics
   my $vobj = eval { version->new($v) };
   return defined($vobj) ? $vobj : version->new(0); # or give up
@@ -803,7 +805,7 @@ my %up_convert = (
     # CHANGED TO MANDATORY
     'dynamic_config'      => \&_keep_or_one,
     # ADDED MANDATORY
-    'release_status'      => \&_release_status_from_version,
+    'release_status'      => \&_release_status,
     # PRIOR OPTIONAL
     'keywords'            => \&_keep,
     'no_index'            => \&_no_index_directory,
@@ -1497,7 +1499,7 @@ CPAN::Meta::Converter - Convert CPAN distribution metadata structures
 
 =head1 VERSION
 
-version 2.150001
+version 2.150005
 
 =head1 SYNOPSIS
 
@@ -1634,4 +1636,4 @@ the same terms as the Perl 5 programming language system itself.
 __END__
 
 
-# vim: ts=2 sts=2 sw=2 et:
+# vim: ts=2 sts=2 sw=2 et :
index 4bfbb19..9dac4f4 100644 (file)
@@ -3,7 +3,7 @@ use strict;
 use warnings;
 package CPAN::Meta::Feature;
 
-our $VERSION = '2.150001';
+our $VERSION = '2.150005';
 
 use CPAN::Meta::Prereqs;
 
@@ -67,8 +67,6 @@ sub prereqs     { $_[0]{prereqs} }
 
 # ABSTRACT: an optional feature provided by a CPAN distribution
 
-__END__
-
 =pod
 
 =encoding UTF-8
@@ -79,7 +77,7 @@ CPAN::Meta::Feature - an optional feature provided by a CPAN distribution
 
 =head1 VERSION
 
-version 2.150001
+version 2.150005
 
 =head1 DESCRIPTION
 
@@ -144,3 +142,8 @@ This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
 
 =cut
+
+__END__
+
+
+# vim: ts=2 sts=2 sw=2 et :
index 3d7e558..f4cac5e 100644 (file)
@@ -4,7 +4,7 @@ use strict;
 use warnings;
 package CPAN::Meta::History;
 
-our $VERSION = '2.150001';
+our $VERSION = '2.150005';
 
 1;
 
@@ -22,7 +22,7 @@ CPAN::Meta::History - history of CPAN Meta Spec changes
 
 =head1 VERSION
 
-version 2.150001
+version 2.150005
 
 =head1 DESCRIPTION
 
index 1052c3e..cd3bb9c 100644 (file)
@@ -7,7 +7,8 @@ CPAN::Meta::History::Meta_1_0 - Version 1.0 metadata specification for META.yml
 =head1 PREFACE
 
 This is a historical copy of the version 1.0 specification for F<META.yml>
-files, copyright by Ken Williams.
+files, copyright by Ken Williams and licensed under the same terms as Perl
+itself.
 
 Modifications from the original:
 
index 69f3411..7b4b2f4 100644 (file)
@@ -7,7 +7,8 @@ CPAN::Meta::History::Meta_1_1 - Version 1.1 metadata specification for META.yml
 =head1 PREFACE
 
 This is a historical copy of the version 1.1 specification for F<META.yml>
-files, copyright by Ken Williams.
+files, copyright by Ken Williams and licensed under the same terms as Perl
+itself.
 
 Modifications from the original:
 
index 69cd5bb..48867b2 100644 (file)
@@ -7,7 +7,8 @@ CPAN::Meta::History::Meta_1_2 - Version 1.2 metadata specification for META.yml
 =head1 PREFACE
 
 This is a historical copy of the version 1.2 specification for F<META.yml>
-files, copyright by Ken Williams.
+files, copyright by Ken Williams and licensed under the same terms as Perl
+itself.
 
 Modifications from the original:
 
index deff28d..b075adc 100644 (file)
@@ -7,7 +7,8 @@ CPAN::Meta::History::Meta_1_3 - Version 1.3 metadata specification for META.yml
 =head1 PREFACE
 
 This is a historical copy of the version 1.3 specification for F<META.yml>
-files, copyright by Ken Williams.
+files, copyright by Ken Williams and licensed under the same terms as Perl
+itself.
 
 Modifications from the original:
 
index a84fb3d..471296c 100644 (file)
@@ -7,7 +7,8 @@ CPAN::Meta::History::Meta_1_4 - Version 1.4 metadata specification for META.yml
 =head1 PREFACE
 
 This is a historical copy of the version 1.4 specification for F<META.yml>
-files, copyright by Ken Williams.
+files, copyright by Ken Williams and licensed under the same terms as Perl
+itself.
 
 Modifications from the original:
 
index f4c1286..05a18ea 100644 (file)
@@ -3,15 +3,24 @@ use warnings;
 
 package CPAN::Meta::Merge;
 
-our $VERSION = '2.150001';
+our $VERSION = '2.150005';
 
 use Carp qw/croak/;
 use Scalar::Util qw/blessed/;
 use CPAN::Meta::Converter 2.141170;
 
+sub _is_identical {
+  my ($left, $right) = @_;
+  return
+    (not defined $left and not defined $right)
+    # if either of these are references, we compare the serialized value
+    || (defined $left and defined $right and $left eq $right);
+}
+
 sub _identical {
   my ($left, $right, $path) = @_;
-  croak sprintf "Can't merge attribute %s: '%s' does not equal '%s'", join('.', @{$path}), $left, $right unless $left eq $right;
+  croak sprintf "Can't merge attribute %s: '%s' does not equal '%s'", join('.', @{$path}), $left, $right
+    unless _is_identical($left, $right);
   return $left;
 }
 
@@ -50,6 +59,13 @@ sub _uniq_map {
     if (not exists $left->{$key}) {
       $left->{$key} = $right->{$key};
     }
+    # identical strings or references are merged identically
+    elsif (_is_identical($left->{$key}, $right->{$key})) {
+      1; # do nothing - keep left
+    }
+    elsif (ref $left->{$key} eq 'HASH' and ref $right->{$key} eq 'HASH') {
+      $left->{$key} = _uniq_map($left->{$key}, $right->{$key}, [ @{$path}, $key ]);
+    }
     else {
       croak 'Duplication of element ' . join '.', @{$path}, $key;
     }
@@ -219,6 +235,9 @@ sub merge {
 
 # ABSTRACT: Merging CPAN Meta fragments
 
+
+# vim: ts=2 sts=2 sw=2 et :
+
 __END__
 
 =pod
@@ -231,7 +250,7 @@ CPAN::Meta::Merge - Merging CPAN Meta fragments
 
 =head1 VERSION
 
-version 2.150001
+version 2.150005
 
 =head1 SYNOPSIS
 
index 7503510..8a13eb1 100644 (file)
@@ -3,7 +3,7 @@ use strict;
 use warnings;
 package CPAN::Meta::Prereqs;
 
-our $VERSION = '2.150001';
+our $VERSION = '2.150005';
 
 #pod =head1 DESCRIPTION
 #pod
@@ -163,7 +163,7 @@ sub with_merged_prereqs {
 #pod
 #pod     my $new_reqs = $prereqs->merged_requirements( \@phases, \@types );
 #pod     my $new_reqs = $prereqs->merged_requirements( \@phases );
-#pod     my $new_reqs = $preerqs->merged_requirements();
+#pod     my $new_reqs = $prereqs->merged_requirements();
 #pod
 #pod This method joins together all requirements across a number of phases
 #pod and types into a new L<CPAN::Meta::Requirements> object.  If arguments
@@ -275,8 +275,6 @@ sub clone {
 
 # ABSTRACT: a set of distribution prerequisites by phase and type
 
-__END__
-
 =pod
 
 =encoding UTF-8
@@ -287,7 +285,7 @@ CPAN::Meta::Prereqs - a set of distribution prerequisites by phase and type
 
 =head1 VERSION
 
-version 2.150001
+version 2.150005
 
 =head1 DESCRIPTION
 
@@ -353,7 +351,7 @@ will not alter them.
 
     my $new_reqs = $prereqs->merged_requirements( \@phases, \@types );
     my $new_reqs = $prereqs->merged_requirements( \@phases );
-    my $new_reqs = $preerqs->merged_requirements();
+    my $new_reqs = $prereqs->merged_requirements();
 
 This method joins together all requirements across a number of phases
 and types into a new L<CPAN::Meta::Requirements> object.  If arguments
@@ -417,3 +415,8 @@ This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
 
 =cut
+
+__END__
+
+
+# vim: ts=2 sts=2 sw=2 et :
index ec68f17..9056940 100644 (file)
@@ -8,7 +8,7 @@ use strict;
 use warnings;
 package CPAN::Meta::Spec;
 
-our $VERSION = '2.150001';
+our $VERSION = '2.150005';
 
 1;
 
@@ -29,7 +29,7 @@ CPAN::Meta::Spec - specification for CPAN distribution metadata
 
 =head1 VERSION
 
-version 2.150001
+version 2.150005
 
 =head1 SYNOPSIS
 
index cc0409e..eddaa10 100644 (file)
@@ -3,7 +3,7 @@ use strict;
 use warnings;
 package CPAN::Meta::Validator;
 
-our $VERSION = '2.150001';
+our $VERSION = '2.150005';
 
 #pod =head1 SYNOPSIS
 #pod
@@ -986,8 +986,6 @@ sub _error {
 
 # ABSTRACT: validate CPAN distribution metadata structures
 
-__END__
-
 =pod
 
 =encoding UTF-8
@@ -998,7 +996,7 @@ CPAN::Meta::Validator - validate CPAN distribution metadata structures
 
 =head1 VERSION
 
-version 2.150001
+version 2.150005
 
 =head1 SYNOPSIS
 
@@ -1205,3 +1203,8 @@ This is free software; you can redistribute it and/or modify it under
 the same terms as the Perl 5 programming language system itself.
 
 =cut
+
+__END__
+
+
+# vim: ts=2 sts=2 sw=2 et :
index f9e7d59..7cce934 100644 (file)
@@ -73,4 +73,4 @@ for my $f ( reverse sort @files ) {
 }
 
 done_testing;
-
+# vim: ts=2 sts=2 sw=2 et :
index b9cfedd..dfda1ae 100644 (file)
@@ -38,4 +38,4 @@ for my $f ( reverse sort @files ) {
 }
 
 done_testing;
-
+# vim: ts=2 sts=2 sw=2 et :
index 18dad14..a9b78de 100644 (file)
@@ -151,8 +151,8 @@ for my $c (@cases) {
     my $got = $cmc->upgrade_fragment;
     my $exp = $c->{expect};
     is_deeply( $got, $exp, $c->{label} )
-      or diag "GOT:\n" . explain($got) . "\nEXPECTED:\n" . explain($exp);
+      or diag "GOT:\n", explain($got), "EXPECTED:\n", explain($exp);
 }
 
 done_testing;
-# vim: ts=4 sts=4 sw=4 et:
+# vim: ts=8 sts=4 sw=4 et :
index 10c6a48..87cdbd6 100644 (file)
@@ -34,6 +34,7 @@ my @files = sort grep { /^\w/ } $data_dir->read;
 #use Data::Dumper;
 
 for my $f ( reverse sort @files ) {
+  note '';
   my $path = File::Spec->catfile('t','data-test',$f);
   my $original = Parse::CPAN::Meta->load_file( $path  );
   ok( $original, "loaded $f" );
@@ -294,4 +295,15 @@ sub _normalize_reqs {
   );
 }
 
+# specific test for preserving release_status on upconversion
+{
+  my $path = File::Spec->catfile('t','data-test','preserve-release-status.yml');
+  my $original = Parse::CPAN::Meta->load_file( $path  );
+  ok( $original, "loaded META-2.json" );
+  my $cmc = CPAN::Meta::Converter->new( $original );
+  my $cleaned_up = $cmc->convert( version => "2" );
+  is( $cleaned_up->{release_status}, 'unstable', "release_status preserved" );
+}
+
 done_testing;
+# vim: ts=2 sts=2 sw=2 et:
diff --git a/cpan/CPAN-Meta/t/data-test/preserve-release-status.yml b/cpan/CPAN-Meta/t/data-test/preserve-release-status.yml
new file mode 100644 (file)
index 0000000..9468b86
--- /dev/null
@@ -0,0 +1,13 @@
+# http://module-build.sourceforge.net/META-spec.html
+#XXXXXXX This is a prototype!!!  It will change in the future!!! XXXXX#
+name:         Template-DBI
+version:      2.64
+version_from: lib/Template/Plugin/DBI.pm
+installdirs:  site
+license: perl
+requires:
+    DBI:                           1
+    Template:                      2.15
+distribution_type: module
+generated_by: ExtUtils::MakeMaker version 6.17
+release_status: unstable
index c3df3ea..7cae168 100644 (file)
@@ -15,13 +15,11 @@ my @files = sort grep { /^\w/ } $data_dir->read;
 
 for my $f ( sort @files ) {
   my $path = File::Spec->catfile('t','data-fixable',$f);
-  my $meta = eval { CPAN::Meta->load_file( $path ) };
-  ok( defined $meta, "load_file('$f')" ) or diag $@;
+  ok( eval { CPAN::Meta->load_file( $path ) }, "load_file('$f')" ) or diag $@;
   my $string = _slurp($path);
   my $method =  $path =~ /\.json/ ? "load_json_string" : "load_yaml_string";
-  my $meta2 = eval { CPAN::Meta->$method( $string, { fix_errors => 1 } ) };
-  ok( defined $meta2, "$method(slurp('$f'))" ) or diag $@;
+  ok( eval { CPAN::Meta->$method( $string, { fix_errors => 1 } ) }, "$method(slurp('$f'))" ) or diag $@;
 }
 
 done_testing;
-
+# vim: ts=2 sts=2 sw=2 et:
index f58e8c6..39e8124 100644 (file)
@@ -1,5 +1,3 @@
-#! perl
-
 use strict;
 use warnings;
 
@@ -14,6 +12,7 @@ my %base = (
        license => [ 'perl_5' ],
        resources => {
                license => [ 'http://dev.perl.org/licenses/' ],
+                bugtracker => { web => 'https://rt.cpan.org/Dist/Display.html?Foo-Bar' },
        },
        prereqs => {
                runtime => {
@@ -70,6 +69,7 @@ my %first_expected = (
        license => [ 'perl_5', 'bsd' ],
        resources => {
                license => [ 'http://dev.perl.org/licenses/', 'http://opensource.org/licenses/bsd-license.php' ],
+                bugtracker => { web => 'https://rt.cpan.org/Dist/Display.html?Foo-Bar' },
        },
        prereqs => {
                runtime => {
@@ -100,6 +100,34 @@ my %first_expected = (
                version => 2,
        },
 );
+my %provides_merge_expected = (
+       abstract => 'This is a test',
+       author => ['A.U. Thor'],
+       generated_by => 'Myself',
+       license => [ 'perl_5' ],
+       resources => {
+               license => [ 'http://dev.perl.org/licenses/' ],
+               bugtracker => { web => 'https://rt.cpan.org/Dist/Display.html?Foo-Bar' },
+       },
+       prereqs => {
+               runtime => {
+                       requires => {
+                               Foo => '0',
+                       },
+               },
+       },
+       dynamic_config => 0,
+       provides => {
+               Baz => {
+                       file => 'lib/Baz.pm',
+                       version => '0.001',         # same as %base, but for this extra key
+               },
+       },
+       'meta-spec' => {
+               url => "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
+               version => 2,
+       },
+);
 
 my $merger = CPAN::Meta::Merge->new(default_version => '2');
 
@@ -108,13 +136,34 @@ my $first_result = $merger->merge(\%base, \%first);
 is_deeply($first_result, \%first_expected, 'First result is as expected');
 
 is_deeply($merger->merge(\%base, { abstract => 'This is a test' }), \%base, 'Can merge in identical abstract');
-my $failure = eval { $merger->merge(\%base, { abstract => 'And now for something else' }) };
-is($failure, undef, 'Trying to merge different author gives an exception');
+is(
+    eval { $merger->merge(\%base, { abstract => 'And now for something else' }) },
+    undef,
+    'Trying to merge different author gives an exception',
+);
 like $@, qr/^Can't merge attribute abstract/, 'Exception looks right';
 
-my $failure2 = eval { $merger->merge(\%base, { provides => { Baz => { file => 'Baz.pm' } } }) };
-is($failure2, undef, 'Trying to merge different author gives an exception');
-like $@, qr/^Duplication of element provides\.Baz /, 'Exception looks right';
+is(
+    eval { $merger->merge(\%base, { resources => { bugtracker => { web => 'http://foo.com' } } } ) },
+    undef,
+    'Trying to merge a different bugtracker URL gives an exception',
+);
+like $@, qr/^Duplication of element resources\.bugtracker\.web /, 'Exception looks right';
+
+is(
+    eval { $merger->merge(\%base, { provides => { Baz => { file => 'Baz.pm' } } }) },
+    undef,
+    'Trying to merge different provides.$module.file gives an exception',
+);
+like $@, qr/^Duplication of element provides\.Baz\.file /, 'Exception looks right';
+
+my $provides_result = $merger->merge(\%base, { provides => { Baz => { file => 'lib/Baz.pm', version => '0.001' } } });
+is_deeply(
+       $provides_result,
+       \%provides_merge_expected,
+       'Trying to merge a new key for provides.$module is permitted; identical values are preserved',
+);
+
 
 # issue 67
 @base{qw/name version release_status/} = qw/Foo-Bar 0.01 testing/;
@@ -122,3 +171,4 @@ my $base_obj = CPAN::Meta->create(\%base);
 ok my $first_result_obj = $merger->merge($base_obj, \%first), 'merging CPAN::Meta objects succeeds';
 
 done_testing();
+# vim: ts=4 sts=4 sw=4 tw=78 noet :
index bb39c46..fa3c703 100644 (file)
@@ -240,3 +240,4 @@ $chk_feature->($features[0]);
 $chk_feature->( $meta->feature('domination') );
 
 done_testing;
+# vim: ts=2 sts=2 sw=2 et :
index 456633a..554e921 100644 (file)
@@ -86,3 +86,4 @@ my %distmeta = (
 }
 
 done_testing;
+# vim: ts=2 sts=2 sw=2 et :
index 15aa621..76ea964 100644 (file)
@@ -1,6 +1,5 @@
 use strict;
 use warnings;
-# vim: set ts=4 sw=4 noet nolist :
 
 use Test::More;
 use CPAN::Meta;
@@ -92,8 +91,7 @@ my $fragment3 = {
        }
 };
 
-my $result = eval { $merger->merge($meta1, $fragment3) };
-is($result, undef, 'Trying to merge optional_features with same feature name and different descriptions gives an exception');
+is( eval { $merger->merge($meta1, $fragment3) }, undef, 'Trying to merge optional_features with same feature name and different descriptions gives an exception');
 like $@, qr/^Cannot merge two optional_features named 'FeatureName' with different 'description' values/, 'Exception looks right';
 
 my $fragment4 = {
@@ -106,8 +104,7 @@ my $fragment4 = {
        }
 };
 
-$result = eval { $merger->merge($meta1, $fragment4) };
-is($result, undef, 'Trying to merge optional_features with same feature name and differences in other keys gives an exception');
+is( eval { $merger->merge($meta1, $fragment4) }, undef, 'Trying to merge optional_features with same feature name and differences in other keys gives an exception');
 like $@, qr/^Cannot merge two optional_features named 'FeatureName' with different 'x_default' values/, 'Exception looks right';
 
 my $fragment5 = {
@@ -140,3 +137,4 @@ is_deeply(
 );
 
 done_testing;
+# vim: ts=4 sts=4 sw=4 noet :
index e974f99..ac4aea8 100644 (file)
@@ -9,9 +9,7 @@ delete $ENV{$_} for qw/PERL_JSON_BACKEND PERL_YAML_BACKEND/; # use defaults
 sub dies_ok (&@) {
   my ($code, $qr, $comment) = @_;
 
-  my $lived = eval { $code->(); 1 };
-
-  if ($lived) {
+  if (eval { $code->(); 1 }) {
     fail("$comment: did not die");
   } else {
     like($@, $qr, $comment);
@@ -91,3 +89,4 @@ $clone->requirements_for(qw(develop suggests))->add_minimum(Foo => 1);
 pass('...and we can add stuff to it');
 
 done_testing;
+# vim: ts=2 sts=2 sw=2 et :
index 37bca7d..e15c9f2 100644 (file)
@@ -104,3 +104,4 @@ is_deeply(
 );
 
 done_testing;
+# vim: ts=2 sts=2 sw=2 et :
index ad21caa..b4a3c95 100644 (file)
@@ -161,4 +161,4 @@ is_deeply($prereq->as_string_hash, $prereq_struct, "round-trip okay");
 }
 
 done_testing;
-
+# vim: ts=2 sts=2 sw=2 et :
index 8bb1da7..0cd2c24 100644 (file)
@@ -225,3 +225,4 @@ delete $ENV{$_} for qw/PERL_JSON_BACKEND PERL_YAML_BACKEND/; # use defaults
   );
 }
 done_testing;
+# vim: ts=2 sts=2 sw=2 et :
index 5399305..8093344 100644 (file)
@@ -83,6 +83,16 @@ ok( -f $metafile, "save meta to file" );
 ok( my $loaded = Parse::CPAN::Meta->load_file($metafile), 'load saved file' );
 is($loaded->{name},     'Module-Build', 'name correct');
 
+like(
+  $loaded->{x_serialization_backend},
+  qr/\AJSON::PP version [0-9]/,
+  "x_serialization_backend",
+);
+
+ok(
+  ! exists $meta->{x_serialization_backend},
+  "we didn't leak x_serialization_backend up into the saved struct",
+);
 
 ok( $loaded = Parse::CPAN::Meta->load_file('t/data-test/META-1_4.yml'), 'load META-1.4' );
 is($loaded->{name},     'Module-Build', 'name correct');
@@ -98,6 +108,17 @@ ok( $loaded = Parse::CPAN::Meta->load_file($metayml), 'load saved file' );
 is( $loaded->{name},     'Module-Build', 'name correct');
 is( $loaded->{requires}{perl}, "5.006", 'prereq correct' );
 
+like(
+  $loaded->{x_serialization_backend},
+  qr/\ACPAN::Meta::YAML version [0-9]/,
+  "x_serialization_backend",
+);
+
+ok(
+  ! exists $meta->{x_serialization_backend},
+  "we didn't leak x_serialization_backend up into the saved struct",
+);
+
 # file without suffix
 
 ok( $loaded = CPAN::Meta->load_file('t/data-test/META-2.meta'), 'load_file META-2.meta' );
@@ -106,3 +127,4 @@ my $string = do { open my $fh, '<', 't/data-test/META-2.meta'; local $/; <$fh> }
 ok( $loaded = CPAN::Meta->load_string($string), 'load META-2.meta from string' );
 
 done_testing;
+# vim: ts=2 sts=2 sw=2 et :
index 4fce192..0145073 100644 (file)
@@ -36,8 +36,9 @@ delete $ENV{$_} for qw/PERL_JSON_BACKEND PERL_YAML_BACKEND/; # use defaults
     my $meta = Parse::CPAN::Meta->load_file( File::Spec->catfile($f) );
     my $cmv = CPAN::Meta::Validator->new({%$meta});
     ok( ! $cmv->is_valid, "$f shouldn't validate" );
+    note 'validation error: ', $_ foreach $cmv->errors;
   }
 }
 
 done_testing;
-
+# vim: ts=2 sts=2 sw=2 et :