bundler 2.6.6 → 2.6.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +37 -6
  3. data/lib/bundler/build_metadata.rb +2 -2
  4. data/lib/bundler/checksum.rb +21 -11
  5. data/lib/bundler/compact_index_client/cache.rb +1 -1
  6. data/lib/bundler/compact_index_client/parser.rb +1 -1
  7. data/lib/bundler/definition.rb +90 -65
  8. data/lib/bundler/dsl.rb +2 -3
  9. data/lib/bundler/friendly_errors.rb +1 -1
  10. data/lib/bundler/installer.rb +1 -1
  11. data/lib/bundler/lazy_specification.rb +9 -1
  12. data/lib/bundler/lockfile_parser.rb +8 -5
  13. data/lib/bundler/plugin/api/source.rb +1 -1
  14. data/lib/bundler/plugin/installer/path.rb +8 -0
  15. data/lib/bundler/plugin.rb +1 -1
  16. data/lib/bundler/resolver/candidate.rb +1 -1
  17. data/lib/bundler/resolver/strategy.rb +40 -0
  18. data/lib/bundler/resolver.rb +11 -22
  19. data/lib/bundler/rubygems_ext.rb +15 -0
  20. data/lib/bundler/runtime.rb +8 -5
  21. data/lib/bundler/source/gemspec.rb +1 -4
  22. data/lib/bundler/source/git/git_proxy.rb +8 -3
  23. data/lib/bundler/source/path.rb +2 -2
  24. data/lib/bundler/source_list.rb +29 -11
  25. data/lib/bundler/spec_set.rb +27 -10
  26. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +53 -3
  27. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
  28. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +11 -0
  29. data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +4 -24
  30. data/lib/bundler/vendor/pub_grub/lib/pub_grub/strategy.rb +42 -0
  31. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +20 -8
  32. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +17 -29
  33. data/lib/bundler/version.rb +1 -1
  34. metadata +5 -4
  35. data/lib/bundler/compact_index_client/gem_parser.rb +0 -32
@@ -2,17 +2,20 @@ require_relative 'partial_solution'
2
2
  require_relative 'term'
3
3
  require_relative 'incompatibility'
4
4
  require_relative 'solve_failure'
5
+ require_relative 'strategy'
5
6
 
6
7
  module Bundler::PubGrub
7
8
  class VersionSolver
8
9
  attr_reader :logger
9
10
  attr_reader :source
10
11
  attr_reader :solution
12
+ attr_reader :strategy
11
13
 
12
- def initialize(source:, root: Package.root, logger: Bundler::PubGrub.logger)
14
+ def initialize(source:, root: Package.root, strategy: Strategy.new(source), logger: Bundler::PubGrub.logger)
13
15
  @logger = logger
14
16
 
15
17
  @source = source
18
+ @strategy = strategy
16
19
 
17
20
  # { package => [incompatibility, ...]}
18
21
  @incompatibilities = Hash.new do |h, k|
@@ -36,26 +39,25 @@ module Bundler::PubGrub
36
39
 
37
40
  # Returns true if there is more work to be done, false otherwise
38
41
  def work
39
- return false if solved?
40
-
41
- next_package = choose_package_version
42
- propagate(next_package)
43
-
44
- if solved?
42
+ unsatisfied_terms = solution.unsatisfied
43
+ if unsatisfied_terms.empty?
45
44
  logger.info { "Solution found after #{solution.attempted_solutions} attempts:" }
46
45
  solution.decisions.each do |package, version|
47
46
  next if Package.root?(package)
48
47
  logger.info { "* #{package} #{version}" }
49
48
  end
50
49
 
51
- false
52
- else
53
- true
50
+ return false
54
51
  end
52
+
53
+ next_package = choose_package_version_from(unsatisfied_terms)
54
+ propagate(next_package)
55
+
56
+ true
55
57
  end
56
58
 
57
59
  def solve
58
- work until solved?
60
+ while work; end
59
61
 
60
62
  solution.decisions
61
63
  end
@@ -105,29 +107,15 @@ module Bundler::PubGrub
105
107
  unsatisfied.package
106
108
  end
107
109
 
108
- def next_package_to_try
109
- solution.unsatisfied.min_by do |term|
110
- package = term.package
111
- range = term.constraint.range
112
- matching_versions = source.versions_for(package, range)
113
- higher_versions = source.versions_for(package, range.upper_invert)
110
+ def choose_package_version_from(unsatisfied_terms)
111
+ remaining = unsatisfied_terms.map { |t| [t.package, t.constraint.range] }.to_h
114
112
 
115
- [matching_versions.count <= 1 ? 0 : 1, higher_versions.count]
116
- end.package
117
- end
118
-
119
- def choose_package_version
120
- if solution.unsatisfied.empty?
121
- logger.info "No packages unsatisfied. Solving complete!"
122
- return nil
123
- end
113
+ package, version = strategy.next_package_and_version(remaining)
124
114
 
125
- package = next_package_to_try
126
- unsatisfied_term = solution.unsatisfied.find { |t| t.package == package }
127
- version = source.versions_for(package, unsatisfied_term.constraint.range).first
128
115
  logger.debug { "attempting #{package} #{version}" }
129
116
 
130
117
  if version.nil?
118
+ unsatisfied_term = unsatisfied_terms.find { |t| t.package == package }
131
119
  add_incompatibility source.no_versions_incompatibility_for(package, unsatisfied_term)
132
120
  return package
133
121
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: false
2
2
 
3
3
  module Bundler
4
- VERSION = "2.6.6".freeze
4
+ VERSION = "2.6.8".freeze
5
5
 
6
6
  def self.bundler_major_version
7
7
  @bundler_major_version ||= VERSION.split(".").first.to_i
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bundler
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.6
4
+ version: 2.6.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - André Arko
@@ -21,7 +21,7 @@ authors:
21
21
  - Yehuda Katz
22
22
  bindir: exe
23
23
  cert_chain: []
24
- date: 2025-03-13 00:00:00.000000000 Z
24
+ date: 1980-01-02 00:00:00.000000000 Z
25
25
  dependencies: []
26
26
  description: Bundler manages an application's dependencies through its entire life,
27
27
  across many machines, systematically and repeatably
@@ -77,7 +77,6 @@ files:
77
77
  - lib/bundler/compact_index_client.rb
78
78
  - lib/bundler/compact_index_client/cache.rb
79
79
  - lib/bundler/compact_index_client/cache_file.rb
80
- - lib/bundler/compact_index_client/gem_parser.rb
81
80
  - lib/bundler/compact_index_client/parser.rb
82
81
  - lib/bundler/compact_index_client/updater.rb
83
82
  - lib/bundler/constants.rb
@@ -210,6 +209,7 @@ files:
210
209
  - lib/bundler/resolver/package.rb
211
210
  - lib/bundler/resolver/root.rb
212
211
  - lib/bundler/resolver/spec_group.rb
212
+ - lib/bundler/resolver/strategy.rb
213
213
  - lib/bundler/retry.rb
214
214
  - lib/bundler/ruby_dsl.rb
215
215
  - lib/bundler/ruby_version.rb
@@ -310,6 +310,7 @@ files:
310
310
  - lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb
311
311
  - lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb
312
312
  - lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb
313
+ - lib/bundler/vendor/pub_grub/lib/pub_grub/strategy.rb
313
314
  - lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb
314
315
  - lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb
315
316
  - lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb
@@ -411,7 +412,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
411
412
  - !ruby/object:Gem::Version
412
413
  version: 3.3.3
413
414
  requirements: []
414
- rubygems_version: 3.6.6
415
+ rubygems_version: 3.6.8
415
416
  specification_version: 4
416
417
  summary: The best way to manage your application's dependencies
417
418
  test_files: []
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Bundler
4
- class CompactIndexClient
5
- if defined?(Gem::Resolver::APISet::GemParser)
6
- GemParser = Gem::Resolver::APISet::GemParser
7
- else
8
- class GemParser
9
- EMPTY_ARRAY = [].freeze
10
- private_constant :EMPTY_ARRAY
11
-
12
- def parse(line)
13
- version_and_platform, rest = line.split(" ", 2)
14
- version, platform = version_and_platform.split("-", 2)
15
- dependencies, requirements = rest.split("|", 2).map! {|s| s.split(",") } if rest
16
- dependencies = dependencies ? dependencies.map! {|d| parse_dependency(d) } : EMPTY_ARRAY
17
- requirements = requirements ? requirements.map! {|d| parse_dependency(d) } : EMPTY_ARRAY
18
- [version, platform, dependencies, requirements]
19
- end
20
-
21
- private
22
-
23
- def parse_dependency(string)
24
- dependency = string.split(":")
25
- dependency[-1] = dependency[-1].split("&") if dependency.size > 1
26
- dependency[0] = -dependency[0]
27
- dependency
28
- end
29
- end
30
- end
31
- end
32
- end