A lockfile records the exact version chosen after dependency resolution.

lockfile version Checking a locked version against a requirement explains whether the selected version still fits.

Lockfile Versions

locked_text
lockfile_versions.rb
Replay: real traced execution (multi-file project)
locked_text = "3.2.4"
locked_version = Gem::Version.new(locked_text)
requirement = Gem::Requirement.new("~> 3.2")

compatible = requirement.satisfied_by?(locked_version)
status = compatible ? "compatible" : "review"

puts "locked=#{locked_version}"
puts "requirement=~> 3.2"
puts "status=#{status}"
locked_text = "3.1.0"
locked_version = Gem::Version.new(locked_text)
requirement = Gem::Requirement.new("~> 3.2")

compatible = requirement.satisfied_by?(locked_version)
status = compatible ? "compatible" : "review"

puts "locked=#{locked_version}"
puts "requirement=~> 3.2"
puts "status=#{status}"
locked_text = "4.0.0"
locked_version = Gem::Version.new(locked_text)
requirement = Gem::Requirement.new("~> 3.2")

compatible = requirement.satisfied_by?(locked_version)
status = compatible ? "compatible" : "review"

puts "locked=#{locked_version}"
puts "requirement=~> 3.2"
puts "status=#{status}"
  1. locked_text ← 3.2.4, locked_version ← 3.2.4, requirement ← ~> 3.2

    1locked_text→ 3.2.4 = "3.2.4"  #@locked_text="3.1.0", "4.0.0"2locked_version→ 3.2.4 = Gem::Version.new(locked_text3.2.4)3requirement→ ~> 3.2 = Gem::Requirement.new("~> 3.2")45compatible→ true = requirement.satisfied_by?(locked_version)true6status→ compatible = compatibletrue ? "compatible" : "review"78puts "locked=#{locked_version3.2.4}"9puts "requirement=~> 3.2"10puts "status=#{statuscompatible}"
    outputlocked=3.2.4
    requirement=~> 3.2
    status=compatible
  1. locked_text ← 3.1.0, locked_version ← 3.1.0, requirement ← ~> 3.2

    1locked_text→ 3.1.0 = "3.1.0"2locked_version→ 3.1.0 = Gem::Version.new(locked_text3.1.0)3requirement→ ~> 3.2 = Gem::Requirement.new("~> 3.2")45compatible→ false = requirement.satisfied_by?(locked_version)false6status→ review = compatiblefalse ? "compatible" : "review"78puts "locked=#{locked_version3.1.0}"9puts "requirement=~> 3.2"10puts "status=#{statusreview}"
    outputlocked=3.1.0
    requirement=~> 3.2
    status=review
  1. locked_text ← 4.0.0, locked_version ← 4.0.0, requirement ← ~> 3.2

    1locked_text→ 4.0.0 = "4.0.0"2locked_version→ 4.0.0 = Gem::Version.new(locked_text4.0.0)3requirement→ ~> 3.2 = Gem::Requirement.new("~> 3.2")45compatible→ false = requirement.satisfied_by?(locked_version)false6status→ review = compatiblefalse ? "compatible" : "review"78puts "locked=#{locked_version4.0.0}"9puts "requirement=~> 3.2"10puts "status=#{statusreview}"
    outputlocked=4.0.0
    requirement=~> 3.2
    status=review