commit 11a75d0f2fea50ab4f35e99a7b584c450ea0e634 Author: Yossef Mendelssohn Date: Sat May 2 11:44:52 2009 -0500 Made prerelease gems stick to the release number for satisfying ~> Since 1.1.pre is < 1.1, it would fail ~> 1.1 Added Gem::Version#release for convenience and cleanliness diff --git a/lib/rubygems/requirement.rb b/lib/rubygems/requirement.rb index ba6b890..8c2a196 100644 --- a/lib/rubygems/requirement.rb +++ b/lib/rubygems/requirement.rb @@ -26,7 +26,7 @@ class Gem::Requirement "<" => lambda { |v, r| v < r }, ">=" => lambda { |v, r| v >= r }, "<=" => lambda { |v, r| v <= r }, - "~>" => lambda { |v, r| v >= r && v < r.bump } + "~>" => lambda { |v, r| v = v.release; v >= r && v < r.bump } } OP_RE = OPS.keys.map{ |k| Regexp.quote k }.join '|' diff --git a/lib/rubygems/version.rb b/lib/rubygems/version.rb index d996538..4e979a5 100644 --- a/lib/rubygems/version.rb +++ b/lib/rubygems/version.rb @@ -160,6 +160,16 @@ class Gem::Version def prerelease? parts.any? { |part| part.alpha? } end + + ## + # The release for this version (e.g. 1.2.0.a -> 1.2.0) + # Non-prerelease versions return themselves + def release + return self unless prerelease? + rel_parts = parts.dup + rel_parts.pop while rel_parts.any? { |part| part.alpha? } + self.class.new(rel_parts.join('.')) + end def yaml_initialize(tag, values) self.version = values['version'] diff --git a/test/test_gem_version.rb b/test/test_gem_version.rb index 29b8b5b..d87245f 100644 --- a/test/test_gem_version.rb +++ b/test/test_gem_version.rb @@ -199,6 +199,13 @@ class TestGemVersion < RubyGemTestCase refute Gem::Version.new('2.9').prerelease? refute Gem::Version.new('22.1.50.0').prerelease? end + + def test_release + assert_equal Gem::Version.new('1.2.0'), Gem::Version.new('1.2.0.a').release + assert_equal Gem::Version.new('1.1'), Gem::Version.new('1.1.rc10').release + assert_equal Gem::Version.new('1.9.3'), Gem::Version.new('1.9.3.alpha.5').release + assert_equal Gem::Version.new('1.9.3'), Gem::Version.new('1.9.3').release + end def test_satisfied_by_eh_boxed assert_inadequate("1.3", "~> 1.4") @@ -212,6 +219,11 @@ class TestGemVersion < RubyGemTestCase assert_adequate( "1.4.5", "~> 1.4.4") assert_inadequate("1.5", "~> 1.4.4") assert_inadequate("2.0", "~> 1.4.4") + + assert_inadequate("1.1.pre", "~> 1.0.0") + assert_adequate( "1.1.pre", "~> 1.1") + assert_inadequate("2.0.a", "~> 1.0") + assert_adequate( "2.0.a", "~> 2.0") end def test_satisfied_by_eh_multiple