Update CPAN-Meta-Requirements to CPAN version 2.131
authorChris 'BinGOs' Williams <chris@bingosnet.co.uk>
Wed, 24 Dec 2014 10:00:02 +0000 (10:00 +0000)
committerChris 'BinGOs' Williams <chris@bingosnet.co.uk>
Wed, 24 Dec 2014 10:00:02 +0000 (10:00 +0000)
  [DELTA]

2.131     2014-12-23 15:04:19-05:00 America/New_York

    [ENHANCEMENTS]

    - Merging Module => 0 into requirements is now optimized

    [PREREQS]

    - Scalar::Utils removed as a prerequisite

MANIFEST
Porting/Maintainers.pl
cpan/CPAN-Meta-Requirements/lib/CPAN/Meta/Requirements.pm
cpan/CPAN-Meta-Requirements/t/accepts.t
cpan/CPAN-Meta-Requirements/t/strings.t [new file with mode: 0644]

index c7f0b1b..d58ba92 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -256,6 +256,7 @@ cpan/CPAN-Meta-Requirements/t/basic.t
 cpan/CPAN-Meta-Requirements/t/finalize.t
 cpan/CPAN-Meta-Requirements/t/from-hash.t
 cpan/CPAN-Meta-Requirements/t/merge.t
+cpan/CPAN-Meta-Requirements/t/strings.t
 cpan/CPAN-Meta/t/converter-bad.t
 cpan/CPAN-Meta/t/converter-fail.t
 cpan/CPAN-Meta/t/converter-fragments.t
index 4a33564..6eaf716 100755 (executable)
@@ -300,7 +300,7 @@ use File::Glob qw(:case);
     },
 
     'CPAN::Meta::Requirements' => {
-        'DISTRIBUTION' => 'DAGOLDEN/CPAN-Meta-Requirements-2.130.tar.gz',
+        'DISTRIBUTION' => 'DAGOLDEN/CPAN-Meta-Requirements-2.131.tar.gz',
         'FILES'        => q[cpan/CPAN-Meta-Requirements],
         'EXCLUDED'     => [
             qw(CONTRIBUTING.mkdn),
index 05df504..e86dd56 100644 (file)
@@ -3,7 +3,7 @@ use warnings;
 package CPAN::Meta::Requirements;
 # ABSTRACT: a set of version requirements for a CPAN dist
 
-our $VERSION = '2.130';
+our $VERSION = '2.131';
 
 #pod =head1 SYNOPSIS
 #pod
@@ -33,7 +33,6 @@ our $VERSION = '2.130';
 #pod =cut
 
 use Carp ();
-use Scalar::Util ();
 
 # To help ExtUtils::MakeMaker bootstrap CPAN::Meta::Requirements on perls
 # before 5.10, we fall back to the EUMM bundled compatibility version module if
@@ -51,6 +50,9 @@ BEGIN {
 # Perl 5.10.0 didn't have "is_qv" in version.pm
 *_is_qv = version->can('is_qv') ? sub { $_[0]->is_qv } : sub { exists $_[0]->{qv} };
 
+# construct once, reuse many times
+my $V0 = version->new(0);
+
 #pod =method new
 #pod
 #pod   my $req = CPAN::Meta::Requirements->new;
@@ -100,6 +102,11 @@ sub _find_magic_vstring {
   return $tvalue;
 }
 
+# safe if given an unblessed reference
+sub _isa_version {
+  UNIVERSAL::isa( $_[0], 'UNIVERSAL' ) && $_[0]->isa('version')
+}
+
 sub _version_object {
   my ($self, $module, $version) = @_;
 
@@ -112,17 +119,23 @@ sub _version_object {
   }
 
   eval {
-    local $SIG{__WARN__} = sub { die "Invalid version: $_[0]" };
-    $vobj  = (! defined $version)                ? version->new(0)
-           : (! Scalar::Util::blessed($version)) ? version->new($version)
-           :                                       $version;
+    if (not defined $version or $version eq '0') {
+      $vobj = $V0;
+    }
+    elsif ( ref($version) eq 'version' || _isa_version($version) ) {
+      $vobj = $version;
+    }
+    else {
+      local $SIG{__WARN__} = sub { die "Invalid version: $_[0]" };
+      $vobj = version->new($version);
+    }
   };
 
   if ( my $err = $@ ) {
     my $hook = $self->{bad_version_hook};
     $vobj = eval { $hook->($version, $module) }
       if ref $hook eq 'CODE';
-    unless (Scalar::Util::blessed($vobj) && $vobj->isa("version")) {
+    unless (eval { $vobj->isa("version") }) {
       $err =~ s{ at .* line \d+.*$}{};
       die "Can't convert '$version': $err";
     }
@@ -194,7 +207,7 @@ sub _version_object {
 #pod =cut
 
 BEGIN {
-  for my $type (qw(minimum maximum exclusion exact_version)) {
+  for my $type (qw(maximum exclusion exact_version)) {
     my $method = "with_$type";
     my $to_add = $type eq 'exact_version' ? $type : "add_$type";
 
@@ -213,6 +226,25 @@ BEGIN {
   }
 }
 
+sub add_minimum {
+  my ($self, $name, $version) = @_;
+
+  if (not defined $version or $version eq '0') {
+    return $self if $self->__entry_for($name);
+    Carp::confess("can't add new requirements to finalized requirements")
+      if $self->is_finalized;
+
+    $self->{requirements}{ $name } =
+      CPAN::Meta::Requirements::_Range::Range->with_minimum($V0);
+  }
+  else {
+    $version = $self->_version_object( $name, $version );
+
+    $self->__modify_entry_for($name, 'with_minimum', $version);
+  }
+  return $self;
+}
+
 #pod =method add_requirements
 #pod
 #pod   $req->add_requirements( $another_req_object );
@@ -755,7 +787,7 @@ CPAN::Meta::Requirements - a set of version requirements for a CPAN dist
 
 =head1 VERSION
 
-version 2.130
+version 2.131
 
 =head1 SYNOPSIS
 
@@ -1037,7 +1069,7 @@ Ricardo Signes <rjbs@cpan.org>
 
 =head1 CONTRIBUTORS
 
-=for stopwords Ed J Karen Etheridge robario
+=for stopwords Ed J Karen Etheridge Leon Timmermans robario
 
 =over 4
 
@@ -1051,6 +1083,10 @@ Karen Etheridge <ether@cpan.org>
 
 =item *
 
+Leon Timmermans <fawaka@gmail.com>
+
+=item *
+
 robario <webmaster@robario.com>
 
 =back
index 3456394..75bc22f 100644 (file)
@@ -12,6 +12,16 @@ use Test::More 0.88;
   ok(! $req->accepts_module(Foo => 0));
 }
 
+{
+  my $req = CPAN::Meta::Requirements->new->add_minimum(Foo => 0);
+
+  ok(  $req->accepts_module(Foo => 1));
+  ok(  $req->accepts_module(Foo => undef));
+  ok(  $req->accepts_module(Foo => "v0"));
+  ok(  $req->accepts_module(Foo => v1.2.3));
+  ok(  $req->accepts_module(Foo => "v1.2.3"));
+}
+
 {
   my $req = CPAN::Meta::Requirements->new->add_maximum(Foo => 1);
 
diff --git a/cpan/CPAN-Meta-Requirements/t/strings.t b/cpan/CPAN-Meta-Requirements/t/strings.t
new file mode 100644 (file)
index 0000000..94a5236
--- /dev/null
@@ -0,0 +1,63 @@
+use strict;
+use warnings;
+use Test::More 0.88;
+
+sub dies_ok (&@) {
+  my ($code, $qr, $comment) = @_;
+
+  my $lived = eval { $code->(); 1 };
+
+  if ($lived) {
+    fail("$comment: did not die");
+  } else {
+    like($@, $qr, $comment);
+  }
+}
+
+use CPAN::Meta::Requirements;
+
+my $req = CPAN::Meta::Requirements->new;
+
+# Test ==
+$req->add_string_requirement('Foo::Bar', '== 1.3');
+ok($req->accepts_module('Foo::Bar' => '1.3'), 'exact version (==)');
+ok(!$req->accepts_module('Foo::Bar' => '1.2'), 'lower version (==)');
+ok(!$req->accepts_module('Foo::Bar' => '1.4'), 'higher version (==)');
+
+# Test !=
+$req->add_string_requirement('Foo::Baz', '!= 1.3');
+ok(!$req->accepts_module('Foo::Baz' => '1.3'), 'exact version (!=)');
+ok($req->accepts_module('Foo::Baz' => '1.2'), 'lower version (!=)');
+ok($req->accepts_module('Foo::Baz' => '1.4'), 'higher version (!=)');
+
+# Test >=
+$req->add_string_requirement('Foo::Gorch', '>= 1.3');
+ok($req->accepts_module('Foo::Gorch' => '1.3'), 'exact version (>=)');
+ok(!$req->accepts_module('Foo::Gorch' => '1.2'), 'lower version (>=)');
+ok($req->accepts_module('Foo::Gorch' => '1.4'), 'higher version (>=)');
+
+# Test <=
+$req->add_string_requirement('Foo::Graz', '<= 1.3');
+ok($req->accepts_module('Foo::Graz' => '1.3'), 'exact version (<=)');
+ok($req->accepts_module('Foo::Graz' => '1.2'), 'lower version (<=)');
+ok(!$req->accepts_module('Foo::Graz' => '1.4'), 'higher version (<=)');
+
+# Test ""
+$req->add_string_requirement('Foo::Blurb', '>= 1.3');
+ok($req->accepts_module('Foo::Blurb' => '1.3'), 'exact version (>=)');
+ok(!$req->accepts_module('Foo::Blurb' => '1.2'), 'lower version (>=)');
+ok($req->accepts_module('Foo::Blurb' => '1.4'), 'higher version (>=)');
+
+# Test multiple requirements
+$req->add_string_requirement('A::Tribe::Called', '>= 1.3, <= 2.0, != 1.6');
+ok($req->accepts_module('A::Tribe::Called' => '1.5'), 'middle version (>=, <=, !)');
+ok(!$req->accepts_module('A::Tribe::Called' => '1.2'), 'lower version (>=, <=, !)');
+ok(!$req->accepts_module('A::Tribe::Called' => '2.1'), 'higher version (>=, <=, !)');
+ok(!$req->accepts_module('A::Tribe::Called' => '1.6'), 'excluded version (>=, <=, !)');
+
+# Test fatal errors
+dies_ok { $req->add_string_requirement('Foo::Bar', "not really a version") }
+  qr/Can't convert/,
+  "conversion failure caught";
+
+done_testing;