diff --git a/README.md b/README.md index 6820086..3d26709 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,8 @@ VersionSorter.rsort(versions) #=> reverse sorted array VersionSorter.sort!(versions) # sort array in place VersionSorter.rsort!(versions) # reverse sort array in place + +VersionSorter.compare(version_a, version_b) #=> positive or negative number depending on which way to sort ``` diff --git a/ext/version_sorter/version_sorter.c b/ext/version_sorter/version_sorter.c index 5e8de16..d8c891e 100644 --- a/ext/version_sorter/version_sorter.c +++ b/ext/version_sorter/version_sorter.c @@ -232,6 +232,14 @@ rb_version_sort_r_bang(VALUE rb_self, VALUE rb_versions) return rb_version_sort_1(rb_self, rb_versions, version_compare_cb_r); } +static VALUE +rb_version_compare(VALUE rb_self, VALUE rb_version_a, VALUE rb_version_b) +{ + struct version_number *version_a = parse_version_number(StringValuePtr(rb_version_a)); + struct version_number *version_b = parse_version_number(StringValuePtr(rb_version_b)); + return INT2NUM(version_compare_cb(&version_a, &version_b)); +} + void Init_version_sorter(void) { VALUE rb_mVersionSorter = rb_define_module("VersionSorter"); @@ -239,4 +247,5 @@ void Init_version_sorter(void) rb_define_module_function(rb_mVersionSorter, "rsort", rb_version_sort_r, 1); rb_define_module_function(rb_mVersionSorter, "sort!", rb_version_sort_bang, 1); rb_define_module_function(rb_mVersionSorter, "rsort!", rb_version_sort_r_bang, 1); + rb_define_module_function(rb_mVersionSorter, "compare", rb_version_compare, 2); } diff --git a/test/version_sorter_test.rb b/test/version_sorter_test.rb index 1a2b87f..00fedd0 100644 --- a/test/version_sorter_test.rb +++ b/test/version_sorter_test.rb @@ -21,6 +21,10 @@ def test_sorts_versions_correctly def test_sorts_versions_like_rubygems 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) + if (Gem.rubygems_version < Gem::Version.new('2.1.0')) + # Old versions of RubyGems cannot parse semver versions like `2.0-rc1` + versions.pop() + end sorted_versions = versions.sort_by { |v| Gem::Version.new(v) } assert_equal sorted_versions, VersionSorter.sort(versions) @@ -91,6 +95,12 @@ def test_rsort_block assert_equal [@version10, @version2, @version1], sorted end + def test_compare + assert VersionSorter.compare("10.0", "1.0") > 0 + assert VersionSorter.compare("10.0", "12.0") < 0 + assert_equal 0, VersionSorter.compare("12.0", "12.0") + end + def shuffle(array) array, result = array.dup, [] result << array.delete_at(rand(array.size)) until array.size.zero?