Skip to content

Commit f2d9c93

Browse files
authored
Merge pull request #12 from github/feat-add-compare
feat: add .compare(a, b), .rcompare(a, b)
2 parents 0e30ea8 + fa36ce4 commit f2d9c93

File tree

3 files changed

+21
-0
lines changed

3 files changed

+21
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ VersionSorter.rsort(versions) #=> reverse sorted array
2929

3030
VersionSorter.sort!(versions) # sort array in place
3131
VersionSorter.rsort!(versions) # reverse sort array in place
32+
33+
VersionSorter.compare(version_a, version_b) #=> positive or negative number depending on which way to sort
3234
```
3335

3436
<http://github.com/blog/521-speedy-version-sorting>

ext/version_sorter/version_sorter.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,11 +232,20 @@ rb_version_sort_r_bang(VALUE rb_self, VALUE rb_versions)
232232
return rb_version_sort_1(rb_self, rb_versions, version_compare_cb_r);
233233
}
234234

235+
static VALUE
236+
rb_version_compare(VALUE rb_self, VALUE rb_version_a, VALUE rb_version_b)
237+
{
238+
struct version_number *version_a = parse_version_number(StringValuePtr(rb_version_a));
239+
struct version_number *version_b = parse_version_number(StringValuePtr(rb_version_b));
240+
return INT2NUM(version_compare_cb(&version_a, &version_b));
241+
}
242+
235243
void Init_version_sorter(void)
236244
{
237245
VALUE rb_mVersionSorter = rb_define_module("VersionSorter");
238246
rb_define_module_function(rb_mVersionSorter, "sort", rb_version_sort, 1);
239247
rb_define_module_function(rb_mVersionSorter, "rsort", rb_version_sort_r, 1);
240248
rb_define_module_function(rb_mVersionSorter, "sort!", rb_version_sort_bang, 1);
241249
rb_define_module_function(rb_mVersionSorter, "rsort!", rb_version_sort_r_bang, 1);
250+
rb_define_module_function(rb_mVersionSorter, "compare", rb_version_compare, 2);
242251
}

test/version_sorter_test.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ def test_sorts_versions_correctly
2121

2222
def test_sorts_versions_like_rubygems
2323
versions = %w(1.0.9.b 1.0.9 1.0.10 2.0 3.1.4.2 1.0.9a 2.0rc2 2.0-rc1)
24+
if (Gem.rubygems_version < Gem::Version.new('2.1.0'))
25+
# Old versions of RubyGems cannot parse semver versions like `2.0-rc1`
26+
versions.pop()
27+
end
2428
sorted_versions = versions.sort_by { |v| Gem::Version.new(v) }
2529

2630
assert_equal sorted_versions, VersionSorter.sort(versions)
@@ -91,6 +95,12 @@ def test_rsort_block
9195
assert_equal [@version10, @version2, @version1], sorted
9296
end
9397

98+
def test_compare
99+
assert VersionSorter.compare("10.0", "1.0") > 0
100+
assert VersionSorter.compare("10.0", "12.0") < 0
101+
assert_equal 0, VersionSorter.compare("12.0", "12.0")
102+
end
103+
94104
def shuffle(array)
95105
array, result = array.dup, []
96106
result << array.delete_at(rand(array.size)) until array.size.zero?

0 commit comments

Comments
 (0)