Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 16 additions & 2 deletions lib/rubygems/version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ def eql? other
end

def hash # :nodoc:
@version.hash
canonical_segments.hash
end

def init_with coder # :nodoc:
Expand Down Expand Up @@ -331,7 +331,7 @@ def approximate_recommendation

def <=> other
return unless Gem::Version === other
return 0 if @version == other._version
return 0 if @version == other._version || canonical_segments == other.canonical_segments

lhsegments = _segments
rhsegments = other._segments
Expand All @@ -356,6 +356,13 @@ def <=> other
return 0
end

def canonical_segments
@canonical_segments ||=
_split_segments.map! do |segments|
segments.reverse_each.drop_while {|s| s == 0 }.reverse
end.reduce(&:concat)
end

protected

def _version
Expand All @@ -371,4 +378,11 @@ def _segments
/^\d+$/ =~ s ? s.to_i : s
end.freeze
end

def _split_segments
string_start = _segments.index {|s| s.is_a?(String) }
string_segments = segments
numeric_segments = string_segments.slice!(0, string_start || string_segments.size)
return numeric_segments, string_segments
end
end
13 changes: 12 additions & 1 deletion test/rubygems/test_gem_version.rb
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,8 @@ def test_equals2
def test_hash
assert_equal v("1.2").hash, v("1.2").hash
refute_equal v("1.2").hash, v("1.3").hash
refute_equal v("1.2").hash, v("1.2.0").hash
assert_equal v("1.2").hash, v("1.2.0").hash
assert_equal v("1.2.pre.1").hash, v("1.2.0.pre.1.0").hash
end

def test_initialize
Expand Down Expand Up @@ -99,6 +100,9 @@ def test_prerelease

assert_prerelease '1.A'

assert_prerelease '1-1'
assert_prerelease '1-a'

refute_prerelease "1.2.0"
refute_prerelease "2.9"
refute_prerelease "22.1.50.0"
Expand Down Expand Up @@ -154,6 +158,12 @@ def test_segments
assert_equal [9,8,7], v("9.8.7").segments
end

def test_canonical_segments
assert_equal [1], v("1.0.0").canonical_segments
assert_equal [1, "a", 1], v("1.0.0.a.1.0").canonical_segments
assert_equal [1, 2, 3, "pre", 1], v("1.2.3-1").canonical_segments
end

# Asserts that +version+ is a prerelease.

def assert_prerelease version
Expand Down Expand Up @@ -183,6 +193,7 @@ def assert_release_equal release, version

def assert_version_equal expected, actual
assert_equal v(expected), v(actual)
assert_equal v(expected).hash, v(actual).hash, "since #{actual} == #{expected}, they must have the same hash"
end

# Assert that two versions are eql?. Checks both directions.
Expand Down