Skip to content

Instantly share code, notes, and snippets.

@ymendel
Created May 2, 2009 16:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ymendel/105621 to your computer and use it in GitHub Desktop.
Save ymendel/105621 to your computer and use it in GitHub Desktop.
commit 11a75d0f2fea50ab4f35e99a7b584c450ea0e634
Author: Yossef Mendelssohn <ymendel@pobox.com>
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment