[rubygems/rubygems] Instantiate Resolver::SpecGroup with explicit priority

https://github.com/rubygems/rubygems/commit/e2c1bc1b6c
This commit is contained in:
David Rodríguez 2024-07-03 20:17:59 +02:00 committed by git
parent 5fdfdc30f1
commit 086cde1651
3 changed files with 16 additions and 29 deletions

View File

@ -273,11 +273,11 @@ module Bundler
platform_specs.uniq!
ruby_specs = select_best_platform_match(specs, Gem::Platform::RUBY)
groups << Resolver::Candidate.new(version, specs: ruby_specs) if ruby_specs.any?
groups << Resolver::Candidate.new(version, specs: ruby_specs, priority: -1) if ruby_specs.any?
next groups if platform_specs == ruby_specs || package.force_ruby_platform?
groups << Resolver::Candidate.new(version, specs: platform_specs)
groups << Resolver::Candidate.new(version, specs: platform_specs, priority: 1)
groups
end
@ -432,8 +432,8 @@ module Bundler
def requirement_to_range(requirement)
ranges = requirement.requirements.map do |(op, version)|
ver = Resolver::Candidate.new(version).generic!
platform_ver = Resolver::Candidate.new(version).platform_specific!
ver = Resolver::Candidate.new(version, priority: -1)
platform_ver = Resolver::Candidate.new(version, priority: 1)
case op
when "~>"

View File

@ -24,10 +24,10 @@ module Bundler
attr_reader :version
def initialize(version, specs: [])
def initialize(version, specs: [], priority: -1)
@spec_group = Resolver::SpecGroup.new(specs)
@version = Gem::Version.new(version)
@ruby_only = specs.map(&:platform).uniq == [Gem::Platform::RUBY]
@priority = priority
end
def dependencies
@ -40,18 +40,6 @@ module Bundler
@spec_group.to_specs(package.force_ruby_platform?)
end
def generic!
@ruby_only = true
self
end
def platform_specific!
@ruby_only = false
self
end
def prerelease?
@version.prerelease?
end
@ -61,7 +49,7 @@ module Bundler
end
def sort_obj
[@version, @ruby_only ? -1 : 1]
[@version, @priority]
end
def <=>(other)

View File

@ -2,20 +2,19 @@
RSpec.describe Bundler::Resolver::Candidate do
it "compares fine" do
version1 = described_class.new("1.12.5", specs: [Gem::Specification.new("foo", "1.12.5") {|s| s.platform = Gem::Platform::RUBY }])
version2 = described_class.new("1.12.5") # passing no specs creates a platform specific candidate, so sorts higher
version1 = described_class.new("1.12.5", priority: -1)
version2 = described_class.new("1.12.5", priority: 1)
expect(version2 >= version1).to be true
expect(version2 > version1).to be true
expect(version1.generic! == version2.generic!).to be true
expect(version1.platform_specific! == version2.platform_specific!).to be true
version1 = described_class.new("1.12.5")
version2 = described_class.new("1.12.5")
expect(version1.platform_specific! >= version2.generic!).to be true
expect(version2.platform_specific! >= version1.generic!).to be true
expect(version2 == version1).to be true
version1 = described_class.new("1.12.5", specs: [Gem::Specification.new("foo", "1.12.5") {|s| s.platform = Gem::Platform::RUBY }])
version2 = described_class.new("1.12.5", specs: [Gem::Specification.new("foo", "1.12.5") {|s| s.platform = Gem::Platform::X64_LINUX }])
version1 = described_class.new("1.12.5", priority: 1)
version2 = described_class.new("1.12.5", priority: -1)
expect(version2 >= version1).to be true
expect(version2 < version1).to be true
end
end