Class: Kettle::Jem::Appraisals::SubDepResolver
- Inherits:
-
Object
- Object
- Kettle::Jem::Appraisals::SubDepResolver
- Defined in:
- lib/kettle/jem/appraisals/sub_dep_resolver.rb,
sig/kettle/jem/appraisals.rbs
Overview
Resolves sub-dependency versions for a tier1 gem version within a Ruby series.
For each runtime dependency of the tier1 gem, finds the newest version satisfying both the tier1 gem's gemspec constraint and the target Ruby series compatibility.
Instance Attribute Summary collapse
-
#resolver ⇒ GemVersionResolver
readonly
The resolver used to query RubyGems.
Instance Method Summary collapse
-
#initialize(resolver:) ⇒ SubDepResolver
constructor
A new instance of SubDepResolver.
- #latest_patch(gem_name, minor_version) ⇒ String
-
#resolve(gem_name, version, ruby_min: nil) ⇒ Hash{String => String}
Resolves sub-dependencies for a given tier1 gem at a specific version.
-
#resolve_single(dep_name, requirements_str, ruby_min: nil) ⇒ String?
Finds the newest version of a sub-dep that satisfies both the requirement constraint and the Ruby series compatibility.
Constructor Details
#initialize(resolver:) ⇒ SubDepResolver
Returns a new instance of SubDepResolver.
21 22 23 |
# File 'lib/kettle/jem/appraisals/sub_dep_resolver.rb', line 21 def initialize(resolver:) @resolver = resolver end |
Instance Attribute Details
#resolver ⇒ GemVersionResolver (readonly)
Returns the resolver used to query RubyGems.
18 19 20 |
# File 'lib/kettle/jem/appraisals/sub_dep_resolver.rb', line 18 def resolver @resolver end |
Instance Method Details
#latest_patch(gem_name, minor_version) ⇒ String
87 88 89 90 91 92 93 94 |
# File 'lib/kettle/jem/appraisals/sub_dep_resolver.rb', line 87 def latest_patch(gem_name, minor_version) all_versions = resolver.versions(gem_name) prefix = "#{minor_version}." matching = all_versions.select { |v| v[:number].start_with?(prefix) || v[:number] == minor_version } return minor_version if matching.empty? matching.max_by { |v| Gem::Version.new(v[:number]) }[:number] end |
#resolve(gem_name, version, ruby_min: nil) ⇒ Hash{String => String}
Resolves sub-dependencies for a given tier1 gem at a specific version.
Queries the v2 API for the gem's runtime dependencies, excludes standard-library gems (via XStdLibsExclusion), and resolves each remaining dependency to a concrete version.
36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/kettle/jem/appraisals/sub_dep_resolver.rb', line 36 def resolve(gem_name, version, ruby_min: nil) info = resolver.version_info(gem_name, latest_patch(gem_name, version)) return {} unless info deps = {} info[:runtime_dependencies].each do |dep| dep_name = dep[:name] next if XStdLibsExclusion.excluded?(dep_name) resolved = resolve_single(dep_name, dep[:requirements], ruby_min: ruby_min) deps[dep_name] = resolved if resolved end deps end |
#resolve_single(dep_name, requirements_str, ruby_min: nil) ⇒ String?
Finds the newest version of a sub-dep that satisfies both the requirement constraint and the Ruby series compatibility.
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/kettle/jem/appraisals/sub_dep_resolver.rb', line 55 def resolve_single(dep_name, requirements_str, ruby_min: nil) all = resolver.versions(dep_name) return if all.empty? # Parse the requirement from the parent gem's dependency req = begin Gem::Requirement.new(requirements_str) rescue ArgumentError Gem::Requirement.default end # Filter to versions satisfying the requirement compatible = all.select { |v| req.satisfied_by?(Gem::Version.new(v[:number])) } return if compatible.empty? if ruby_min # Find the newest version compatible with the target Ruby # Walk backwards to find the latest version whose min_ruby <= ruby_min compatible.reverse_each do |v| v_ruby = resolver.min_ruby_version(dep_name, v[:number]) next unless v_ruby.nil? || v_ruby <= ruby_min return v[:number] end # If nothing matches, return the oldest compatible version compatible.first[:number] else # No Ruby constraint — return newest compatible compatible.last[:number] end end |