Comparing Version Strings in Ruby
While writing a Ruby script, I needed to check the the version of a binary dependancy. The --version
switch gets me the data, but how to compare to the required version?
The binary follows semver, so a quick and dirty attempt might be:
"1.4.2".gsub(".", "") >= "1.3.1".gsub(".", "")
# => true
Unfortunately, this is misleading: we are lexicographically comparing the strings and these strings happen to have the same length. Thus, "142"
comes after "131"
.
Testing that version "1.200.0"
is newer than "1.9.0"
will fail as "120"
comes before "190"
.
It would be straight-forward to write a small class to parse the string and compare the major, minor, and patch values. But, Ruby has a quick solution provided by RubyGems. Since Ruby 1.9, RubyGems has been included in Ruby’s standard library:
Gem::Version.new("1.200.1") >= Gem::Version.new("1.3.1")
# => true
Gem
also provides a way handle pessimistic constraints:
dependency = Gem::Dependency.new("", "~> 1.3.1")
dependency.match?("", "1.3.9")
# => true
dependency.match?("", "1.4.1")
# => false