ymendel (owner)

Revisions

gist: 105621 Download_button fork
public
Public Clone URL: git://gist.github.com/105621.git
Embed All Files: show embed
Diff #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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