RubyGems compares version strings by their numeric parts, not by plain alphabetical order.

gem version `Gem::Version` turns version text into comparable version objects.

Gem Versions

version_text
gem_versions.rb
Replay: real traced execution (multi-file project)
version_text = "3.2.1"
current = Gem::Version.new(version_text)
baseline = Gem::Version.new("3.2.0")

new_enough = current >= baseline
comparison = new_enough ? "ok" : "old"

puts "current=#{current}"
puts "baseline=#{baseline}"
puts "comparison=#{comparison}"
version_text = "3.1.9"
current = Gem::Version.new(version_text)
baseline = Gem::Version.new("3.2.0")

new_enough = current >= baseline
comparison = new_enough ? "ok" : "old"

puts "current=#{current}"
puts "baseline=#{baseline}"
puts "comparison=#{comparison}"
version_text = "4.0.0"
current = Gem::Version.new(version_text)
baseline = Gem::Version.new("3.2.0")

new_enough = current >= baseline
comparison = new_enough ? "ok" : "old"

puts "current=#{current}"
puts "baseline=#{baseline}"
puts "comparison=#{comparison}"
  1. version_text ← 3.2.1, current ← 3.2.1, baseline ← 3.2.0, new_enough ← true

    1version_text→ 3.2.1 = "3.2.1"  #@version_text="3.1.9", "4.0.0"2current→ 3.2.1 = Gem::Version.new(version_text3.2.1)3baseline→ 3.2.0 = Gem::Version.new("3.2.0")45new_enough→ true = current3.2.1 >= baseline3.2.06comparison→ ok = new_enoughtrue ? "ok" : "old"78puts "current=#{current3.2.1}"9puts "baseline=#{baseline3.2.0}"10puts "comparison=#{comparisonok}"
    outputcurrent=3.2.1
    baseline=3.2.0
    comparison=ok
  1. version_text ← 3.1.9, current ← 3.1.9, baseline ← 3.2.0, new_enough ← false

    1version_text→ 3.1.9 = "3.1.9"2current→ 3.1.9 = Gem::Version.new(version_text3.1.9)3baseline→ 3.2.0 = Gem::Version.new("3.2.0")45new_enough→ false = current3.1.9 >= baseline3.2.06comparison→ old = new_enoughfalse ? "ok" : "old"78puts "current=#{current3.1.9}"9puts "baseline=#{baseline3.2.0}"10puts "comparison=#{comparisonold}"
    outputcurrent=3.1.9
    baseline=3.2.0
    comparison=old
  1. version_text ← 4.0.0, current ← 4.0.0, baseline ← 3.2.0, new_enough ← true

    1version_text→ 4.0.0 = "4.0.0"2current→ 4.0.0 = Gem::Version.new(version_text4.0.0)3baseline→ 3.2.0 = Gem::Version.new("3.2.0")45new_enough→ true = current4.0.0 >= baseline3.2.06comparison→ ok = new_enoughtrue ? "ok" : "old"78puts "current=#{current4.0.0}"9puts "baseline=#{baseline3.2.0}"10puts "comparison=#{comparisonok}"
    outputcurrent=4.0.0
    baseline=3.2.0
    comparison=ok