bundler 2.3.21 → 2.3.23

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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +40 -0
  3. data/bundler.gemspec +6 -8
  4. data/lib/bundler/build_metadata.rb +2 -2
  5. data/lib/bundler/cli/init.rb +5 -1
  6. data/lib/bundler/cli.rb +2 -1
  7. data/lib/bundler/current_ruby.rb +14 -5
  8. data/lib/bundler/definition.rb +7 -20
  9. data/lib/bundler/dependency.rb +18 -85
  10. data/lib/bundler/dsl.rb +0 -1
  11. data/lib/bundler/endpoint_specification.rb +1 -1
  12. data/lib/bundler/feature_flag.rb +0 -1
  13. data/lib/bundler/gem_version_promoter.rb +10 -25
  14. data/lib/bundler/index.rb +3 -26
  15. data/lib/bundler/injector.rb +2 -1
  16. data/lib/bundler/lockfile_generator.rb +1 -1
  17. data/lib/bundler/man/bundle-add.1 +6 -2
  18. data/lib/bundler/man/bundle-add.1.ronn +4 -1
  19. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  20. data/lib/bundler/man/bundle-cache.1 +1 -1
  21. data/lib/bundler/man/bundle-check.1 +1 -1
  22. data/lib/bundler/man/bundle-clean.1 +1 -1
  23. data/lib/bundler/man/bundle-config.1 +1 -1
  24. data/lib/bundler/man/bundle-console.1 +53 -0
  25. data/lib/bundler/man/bundle-console.1.ronn +44 -0
  26. data/lib/bundler/man/bundle-doctor.1 +1 -1
  27. data/lib/bundler/man/bundle-exec.1 +1 -1
  28. data/lib/bundler/man/bundle-gem.1 +1 -1
  29. data/lib/bundler/man/bundle-help.1 +13 -0
  30. data/lib/bundler/man/bundle-help.1.ronn +12 -0
  31. data/lib/bundler/man/bundle-info.1 +1 -1
  32. data/lib/bundler/man/bundle-init.1 +1 -1
  33. data/lib/bundler/man/bundle-inject.1 +1 -1
  34. data/lib/bundler/man/bundle-install.1 +1 -1
  35. data/lib/bundler/man/bundle-list.1 +1 -1
  36. data/lib/bundler/man/bundle-lock.1 +1 -1
  37. data/lib/bundler/man/bundle-open.1 +1 -1
  38. data/lib/bundler/man/bundle-outdated.1 +1 -1
  39. data/lib/bundler/man/bundle-platform.1 +1 -1
  40. data/lib/bundler/man/bundle-plugin.1 +1 -1
  41. data/lib/bundler/man/bundle-pristine.1 +1 -1
  42. data/lib/bundler/man/bundle-remove.1 +1 -1
  43. data/lib/bundler/man/bundle-show.1 +1 -1
  44. data/lib/bundler/man/bundle-update.1 +1 -1
  45. data/lib/bundler/man/bundle-version.1 +35 -0
  46. data/lib/bundler/man/bundle-version.1.ronn +24 -0
  47. data/lib/bundler/man/bundle-viz.1 +1 -1
  48. data/lib/bundler/man/bundle.1 +6 -2
  49. data/lib/bundler/man/bundle.1.ronn +4 -1
  50. data/lib/bundler/man/gemfile.5 +8 -38
  51. data/lib/bundler/man/gemfile.5.ronn +9 -27
  52. data/lib/bundler/man/index.txt +3 -0
  53. data/lib/bundler/match_remote_metadata.rb +4 -1
  54. data/lib/bundler/resolver/base.rb +50 -0
  55. data/lib/bundler/resolver.rb +72 -93
  56. data/lib/bundler/rubygems_ext.rb +24 -3
  57. data/lib/bundler/settings.rb +0 -1
  58. data/lib/bundler/spec_set.rb +11 -1
  59. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +5 -4
  60. data/lib/bundler/version.rb +1 -1
  61. metadata +11 -4
@@ -3,12 +3,11 @@
3
3
  module Bundler
4
4
  class Resolver
5
5
  require_relative "vendored_molinillo"
6
+ require_relative "resolver/base"
6
7
  require_relative "resolver/spec_group"
7
8
 
8
9
  include GemHelpers
9
10
 
10
- attr_writer :platforms
11
-
12
11
  # Figures out the best possible configuration of gems that satisfies
13
12
  # the list of passed dependencies and any child dependencies without
14
13
  # causing any gem activation errors.
@@ -27,15 +26,13 @@ module Bundler
27
26
 
28
27
  def initialize(source_requirements, base, gem_version_promoter, additional_base_requirements, platforms)
29
28
  @source_requirements = source_requirements
30
- @base = base
29
+ @base = Resolver::Base.new(base, additional_base_requirements)
31
30
  @resolver = Molinillo::Resolver.new(self, self)
32
31
  @results_for = {}
33
32
  @search_for = {}
34
- @additional_base_requirements = additional_base_requirements
35
33
  @platforms = platforms
36
34
  @resolving_only_for_ruby = platforms == [Gem::Platform::RUBY]
37
35
  @gem_version_promoter = gem_version_promoter
38
- @use_gvp = Bundler.feature_flag.use_gem_version_promoter_for_major_updates? || !@gem_version_promoter.major?
39
36
  end
40
37
 
41
38
  def start(requirements, exclude_specs: [])
@@ -45,18 +42,10 @@ module Bundler
45
42
  remove_from_candidates(spec)
46
43
  end
47
44
 
48
- @base_dg = Molinillo::DependencyGraph.new
49
- @base.each do |ls|
50
- dep = Dependency.new(ls.name, ls.version)
51
- @base_dg.add_vertex(ls.name, DepProxy.get_proxy(dep, ls.platform), true)
52
- end
53
- @additional_base_requirements.each {|d| @base_dg.add_vertex(d.name, d) }
54
-
55
- @gem_version_promoter.prerelease_specified = @prerelease_specified = {}
56
- requirements.each {|dep| @prerelease_specified[dep.name] ||= dep.prerelease? }
45
+ requirements.each {|dep| prerelease_specified[dep.name] ||= dep.prerelease? }
57
46
 
58
47
  verify_gemfile_dependencies_are_found!(requirements)
59
- result = @resolver.resolve(requirements, @base_dg).
48
+ result = @resolver.resolve(requirements).
60
49
  map(&:payload).
61
50
  reject {|sg| sg.name.end_with?("\0") }.
62
51
  map(&:to_specs).
@@ -64,8 +53,20 @@ module Bundler
64
53
 
65
54
  SpecSet.new(SpecSet.new(result).for(regular_requirements, false, @platforms))
66
55
  rescue Molinillo::VersionConflict => e
56
+ conflicts = e.conflicts
57
+
58
+ deps_to_unlock = conflicts.values.inject([]) do |deps, conflict|
59
+ deps |= conflict.requirement_trees.flatten.map {|req| base_requirements[req.name] }.compact
60
+ end
61
+
62
+ if deps_to_unlock.any?
63
+ @base.unlock_deps(deps_to_unlock)
64
+ reset_spec_cache
65
+ retry
66
+ end
67
+
67
68
  message = version_conflict_message(e)
68
- raise VersionConflict.new(e.conflicts.keys.uniq, message)
69
+ raise VersionConflict.new(conflicts.keys.uniq, message)
69
70
  rescue Molinillo::CircularDependencyError => e
70
71
  names = e.dependencies.sort_by(&:name).map {|d| "gem '#{d.name}'" }
71
72
  raise CyclicDependencyError, "Your bundle requires gems that depend" \
@@ -120,31 +121,15 @@ module Bundler
120
121
  dependency = dependency_proxy.dep
121
122
  name = dependency.name
122
123
  @search_for[dependency_proxy] ||= begin
123
- results = results_for(dependency) + @base[name].select {|spec| requirement_satisfied_by?(dependency, nil, spec) }
124
-
125
- if vertex = @base_dg.vertex_named(name)
126
- locked_requirement = vertex.payload.requirement
127
- end
124
+ locked_results = @base[name].select {|spec| requirement_satisfied_by?(dependency, nil, spec) }
125
+ locked_requirement = base_requirements[name]
126
+ results = results_for(dependency) + locked_results
127
+ results = results.select {|spec| requirement_satisfied_by?(locked_requirement, nil, spec) } if locked_requirement
128
128
 
129
- if !@prerelease_specified[name] && (!@use_gvp || locked_requirement.nil?)
130
- # Move prereleases to the beginning of the list, so they're considered
131
- # last during resolution.
132
- pre, results = results.partition {|spec| spec.version.prerelease? }
133
- results = pre + results
134
- end
129
+ if results.any?
130
+ results = @gem_version_promoter.sort_versions(dependency, results)
135
131
 
136
- spec_groups = if results.any?
137
- nested = []
138
- results.each do |spec|
139
- version, specs = nested.last
140
- if version == spec.version
141
- specs << spec
142
- else
143
- nested << [spec.version, [spec]]
144
- end
145
- end
146
- nested.reduce([]) do |groups, (version, specs)|
147
- next groups if locked_requirement && !locked_requirement.satisfied_by?(version)
132
+ results.group_by(&:version).reduce([]) do |groups, (_, specs)|
148
133
  next groups unless specs.any? {|spec| spec.match_platform(platform) }
149
134
 
150
135
  specs_by_platform = Hash.new do |current_specs, current_platform|
@@ -167,13 +152,6 @@ module Bundler
167
152
  else
168
153
  []
169
154
  end
170
- # GVP handles major itself, but it's still a bit risky to trust it with it
171
- # until we get it settled with new behavior. For 2.x it can take over all cases.
172
- if !@use_gvp
173
- spec_groups
174
- else
175
- @gem_version_promoter.sort_versions(dependency, spec_groups)
176
- end
177
155
  end
178
156
  end
179
157
 
@@ -199,12 +177,6 @@ module Bundler
199
177
  "Gemfile"
200
178
  end
201
179
 
202
- def name_for_locking_dependency_source
203
- Bundler.default_lockfile.basename.to_s
204
- rescue StandardError
205
- "Gemfile.lock"
206
- end
207
-
208
180
  def requirement_satisfied_by?(requirement, activated, spec)
209
181
  requirement.matches_spec?(spec) || spec.source.is_a?(Source::Gemspec)
210
182
  end
@@ -218,7 +190,7 @@ module Bundler
218
190
  name = name_for(dependency)
219
191
  vertex = activated.vertex_named(name)
220
192
  [
221
- @base_dg.vertex_named(name) ? 0 : 1,
193
+ @base[name].any? ? 0 : 1,
222
194
  vertex.payload ? 0 : 1,
223
195
  vertex.root? ? 0 : 1,
224
196
  amount_constrained(dependency),
@@ -237,9 +209,16 @@ module Bundler
237
209
 
238
210
  private
239
211
 
212
+ def base_requirements
213
+ @base.base_requirements
214
+ end
215
+
216
+ def prerelease_specified
217
+ @gem_version_promoter.prerelease_specified
218
+ end
219
+
240
220
  def remove_from_candidates(spec)
241
221
  @base.delete(spec)
242
- @gem_version_promoter.reset
243
222
 
244
223
  @results_for.keys.each do |dep|
245
224
  next unless dep.name == spec.name
@@ -247,7 +226,12 @@ module Bundler
247
226
  @results_for[dep].reject {|s| s.name == spec.name && s.version == spec.version }
248
227
  end
249
228
 
229
+ reset_spec_cache
230
+ end
231
+
232
+ def reset_spec_cache
250
233
  @search_for = {}
234
+ @gem_version_promoter.reset
251
235
  end
252
236
 
253
237
  # returns an integer \in (-\infty, 0]
@@ -267,7 +251,7 @@ module Bundler
267
251
  all - 1_000_000
268
252
  else
269
253
  search = search_for(dependency)
270
- search = @prerelease_specified[dependency.name] ? search.count : search.count {|s| !s.version.prerelease? }
254
+ search = prerelease_specified[dependency.name] ? search.count : search.count {|s| !s.version.prerelease? }
271
255
  search - all
272
256
  end
273
257
  end
@@ -296,7 +280,7 @@ module Bundler
296
280
  end
297
281
 
298
282
  def gem_not_found_message(name, requirement, source, extra_message = "")
299
- specs = source.specs.search(name)
283
+ specs = source.specs.search(name).sort_by {|s| [s.version, s.platform.to_s] }
300
284
  matching_part = name
301
285
  requirement_label = SharedHelpers.pretty_dependency(requirement)
302
286
  cache_message = begin
@@ -339,18 +323,6 @@ module Bundler
339
323
 
340
324
  e.message_with_trees(
341
325
  :full_message_for_conflict => lambda do |name, conflict|
342
- o = if name.end_with?("\0")
343
- String.new("Bundler found conflicting requirements for the #{name} version:")
344
- else
345
- String.new("Bundler could not find compatible versions for gem \"#{name}\":")
346
- end
347
- o << %(\n)
348
- if conflict.locked_requirement
349
- o << %( In snapshot (#{name_for_locking_dependency_source}):\n)
350
- o << %( #{SharedHelpers.pretty_dependency(conflict.locked_requirement)}\n)
351
- o << %(\n)
352
- end
353
- o << %( In #{name_for_explicit_dependency_source}:\n)
354
326
  trees = conflict.requirement_trees
355
327
 
356
328
  # called first, because we want to reduce the amount of work required to find maximal empty sets
@@ -369,30 +341,41 @@ module Bundler
369
341
  trees.sort_by! {|t| t.reverse.map(&:name) }
370
342
  end
371
343
 
372
- o << trees.map do |tree|
373
- t = "".dup
374
- depth = 2
344
+ if trees.size > 1 || name == "bundler"
345
+ o = if name.end_with?("\0")
346
+ String.new("Bundler found conflicting requirements for the #{name} version:")
347
+ else
348
+ String.new("Bundler could not find compatible versions for gem \"#{name}\":")
349
+ end
350
+ o << %(\n)
351
+ o << %( In #{name_for_explicit_dependency_source}:\n)
352
+ o << trees.map do |tree|
353
+ t = "".dup
354
+ depth = 2
375
355
 
376
- base_tree = tree.first
377
- base_tree_name = base_tree.name
356
+ base_tree = tree.first
357
+ base_tree_name = base_tree.name
378
358
 
379
- if base_tree_name.end_with?("\0")
380
- t = nil
381
- else
382
- tree.each do |req|
383
- t << " " * depth << SharedHelpers.pretty_dependency(req)
384
- unless tree.last == req
385
- if spec = conflict.activated_by_name[req.name]
386
- t << %( was resolved to #{spec.version}, which)
359
+ if base_tree_name.end_with?("\0")
360
+ t = nil
361
+ else
362
+ tree.each do |req|
363
+ t << " " * depth << SharedHelpers.pretty_dependency(req)
364
+ unless tree.last == req
365
+ if spec = conflict.activated_by_name[req.name]
366
+ t << %( was resolved to #{spec.version}, which)
367
+ end
368
+ t << %( depends on)
387
369
  end
388
- t << %( depends on)
370
+ t << %(\n)
371
+ depth += 1
389
372
  end
390
- t << %(\n)
391
- depth += 1
392
373
  end
393
- end
394
- t
395
- end.compact.join("\n")
374
+ t
375
+ end.compact.join("\n")
376
+ else
377
+ o = String.new
378
+ end
396
379
 
397
380
  if name == "bundler"
398
381
  o << %(\n Current Bundler version:\n bundler (#{Bundler::VERSION}))
@@ -416,17 +399,13 @@ module Bundler
416
399
  end
417
400
  elsif name.end_with?("\0")
418
401
  o << %(\n Current #{name} version:\n #{SharedHelpers.pretty_dependency(@metadata_requirements.find {|req| req.name == name })}\n\n)
419
- elsif conflict.locked_requirement
420
- o << "\n"
421
- o << %(Deleting your #{name_for_locking_dependency_source} file and running `bundle install` will rebuild your snapshot from scratch, using only\n)
422
- o << %(the gems in your Gemfile, which may resolve the conflict.\n)
423
402
  elsif !conflict.existing
424
403
  o << "\n"
425
404
 
426
405
  relevant_source = conflict.requirement.source || source_for(name)
427
406
 
428
- extra_message = if conflict.requirement_trees.first.size > 1
429
- ", which is required by gem '#{SharedHelpers.pretty_dependency(conflict.requirement_trees.first[-2])}',"
407
+ extra_message = if trees.first.size > 1
408
+ ", which is required by gem '#{SharedHelpers.pretty_dependency(trees.first[-2])}',"
430
409
  else
431
410
  ""
432
411
  end
@@ -237,8 +237,11 @@ module Gem
237
237
  MINGW = Gem::Platform.new("x86-mingw32")
238
238
  X64_MINGW = [Gem::Platform.new("x64-mingw32"),
239
239
  Gem::Platform.new("x64-mingw-ucrt")].freeze
240
+ WINDOWS = [MSWIN, MSWIN64, MINGW, X64_MINGW].flatten.freeze
241
+ X64_LINUX = Gem::Platform.new("x86_64-linux")
242
+ X64_LINUX_MUSL = Gem::Platform.new("x86_64-linux-musl")
240
243
 
241
- if Gem::Platform.new("x86_64-linux-musl") === Gem::Platform.new("x86_64-linux")
244
+ if X64_LINUX === X64_LINUX_MUSL
242
245
  remove_method :===
243
246
 
244
247
  def ===(other)
@@ -258,10 +261,21 @@ module Gem
258
261
  # version
259
262
  (
260
263
  (@os != "linux" && (@version.nil? || other.version.nil?)) ||
261
- (@os == "linux" && ((@version.nil? && ["gnu", "musl"].include?(other.version)) || (@version == "gnu" && other.version.nil?))) ||
264
+ (@os == "linux" && (normalized_linux_version_ext == other.normalized_linux_version_ext || ["musl#{@version}", "musleabi#{@version}", "musleabihf#{@version}"].include?(other.version))) ||
262
265
  @version == other.version
263
266
  )
264
267
  end
268
+
269
+ # This is a copy of RubyGems 3.3.23 or higher `normalized_linux_method`.
270
+ # Once only 3.3.23 is supported, we can use the method in RubyGems.
271
+ def normalized_linux_version_ext
272
+ return nil unless @version
273
+
274
+ without_gnu_nor_abi_modifiers = @version.sub(/\Agnu/, "").sub(/eabi(hf)?\Z/, "")
275
+ return nil if without_gnu_nor_abi_modifiers.empty?
276
+
277
+ without_gnu_nor_abi_modifiers
278
+ end
265
279
  end
266
280
  end
267
281
 
@@ -274,14 +288,21 @@ module Gem
274
288
  def match_gem?(platform, gem_name)
275
289
  match_platforms?(platform, Gem.platforms)
276
290
  end
291
+ end
292
+
293
+ match_platforms_defined = Gem::Platform.respond_to?(:match_platforms?, true)
294
+
295
+ if !match_platforms_defined || Gem::Platform.send(:match_platforms?, Gem::Platform::X64_LINUX_MUSL, [Gem::Platform::X64_LINUX])
277
296
 
278
297
  private
279
298
 
299
+ remove_method :match_platforms? if match_platforms_defined
300
+
280
301
  def match_platforms?(platform, platforms)
281
302
  platforms.any? do |local_platform|
282
303
  platform.nil? ||
283
304
  local_platform == platform ||
284
- (local_platform != Gem::Platform::RUBY && local_platform =~ platform)
305
+ (local_platform != Gem::Platform::RUBY && platform =~ local_platform)
285
306
  end
286
307
  end
287
308
  end
@@ -45,7 +45,6 @@ module Bundler
45
45
  silence_root_warning
46
46
  suppress_install_using_messages
47
47
  update_requires_all_flag
48
- use_gem_version_promoter_for_major_updates
49
48
  ].freeze
50
49
 
51
50
  NUMBER_KEYS = %w[
@@ -114,10 +114,20 @@ module Bundler
114
114
  SpecSet.new(arr)
115
115
  end
116
116
 
117
+ def -(other)
118
+ SpecSet.new(to_a - other.to_a)
119
+ end
120
+
117
121
  def find_by_name_and_platform(name, platform)
118
122
  @specs.detect {|spec| spec.name == name && spec.match_platform(platform) }
119
123
  end
120
124
 
125
+ def delete_by_name_and_version(name, version)
126
+ @specs.reject! {|spec| spec.name == name && spec.version == version }
127
+ @lookup = nil
128
+ @sorted = nil
129
+ end
130
+
121
131
  def what_required(spec)
122
132
  unless req = find {|s| s.dependencies.any? {|d| d.type == :runtime && d.name == spec.name } }
123
133
  return [spec]
@@ -166,7 +176,7 @@ module Bundler
166
176
  def lookup
167
177
  @lookup ||= begin
168
178
  lookup = Hash.new {|h, k| h[k] = [] }
169
- Index.sort_specs(@specs).reverse_each do |s|
179
+ @specs.each do |s|
170
180
  lookup[s.name] << s
171
181
  end
172
182
  lookup
@@ -1,8 +1,9 @@
1
- image: ruby:<%= RUBY_VERSION %>
1
+ default:
2
+ image: ruby:<%= RUBY_VERSION %>
2
3
 
3
- before_script:
4
- - gem install bundler -v <%= Bundler::VERSION %>
5
- - bundle install
4
+ before_script:
5
+ - gem install bundler -v <%= Bundler::VERSION %>
6
+ - bundle install
6
7
 
7
8
  example_job:
8
9
  script:
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: false
2
2
 
3
3
  module Bundler
4
- VERSION = "2.3.21".freeze
4
+ VERSION = "2.3.23".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.3.21
4
+ version: 2.3.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - André Arko
@@ -22,7 +22,7 @@ authors:
22
22
  autorequire:
23
23
  bindir: exe
24
24
  cert_chain: []
25
- date: 2022-08-24 00:00:00.000000000 Z
25
+ date: 2022-10-05 00:00:00.000000000 Z
26
26
  dependencies: []
27
27
  description: Bundler manages an application's dependencies through its entire life,
28
28
  across many machines, systematically and repeatably
@@ -126,12 +126,16 @@ files:
126
126
  - lib/bundler/man/bundle-clean.1.ronn
127
127
  - lib/bundler/man/bundle-config.1
128
128
  - lib/bundler/man/bundle-config.1.ronn
129
+ - lib/bundler/man/bundle-console.1
130
+ - lib/bundler/man/bundle-console.1.ronn
129
131
  - lib/bundler/man/bundle-doctor.1
130
132
  - lib/bundler/man/bundle-doctor.1.ronn
131
133
  - lib/bundler/man/bundle-exec.1
132
134
  - lib/bundler/man/bundle-exec.1.ronn
133
135
  - lib/bundler/man/bundle-gem.1
134
136
  - lib/bundler/man/bundle-gem.1.ronn
137
+ - lib/bundler/man/bundle-help.1
138
+ - lib/bundler/man/bundle-help.1.ronn
135
139
  - lib/bundler/man/bundle-info.1
136
140
  - lib/bundler/man/bundle-info.1.ronn
137
141
  - lib/bundler/man/bundle-init.1
@@ -160,6 +164,8 @@ files:
160
164
  - lib/bundler/man/bundle-show.1.ronn
161
165
  - lib/bundler/man/bundle-update.1
162
166
  - lib/bundler/man/bundle-update.1.ronn
167
+ - lib/bundler/man/bundle-version.1
168
+ - lib/bundler/man/bundle-version.1.ronn
163
169
  - lib/bundler/man/bundle-viz.1
164
170
  - lib/bundler/man/bundle-viz.1.ronn
165
171
  - lib/bundler/man/bundle.1
@@ -184,6 +190,7 @@ files:
184
190
  - lib/bundler/process_lock.rb
185
191
  - lib/bundler/remote_specification.rb
186
192
  - lib/bundler/resolver.rb
193
+ - lib/bundler/resolver/base.rb
187
194
  - lib/bundler/resolver/spec_group.rb
188
195
  - lib/bundler/retry.rb
189
196
  - lib/bundler/ruby_dsl.rb
@@ -357,7 +364,7 @@ metadata:
357
364
  bug_tracker_uri: https://github.com/rubygems/rubygems/issues?q=is%3Aopen+is%3Aissue+label%3ABundler
358
365
  changelog_uri: https://github.com/rubygems/rubygems/blob/master/bundler/CHANGELOG.md
359
366
  homepage_uri: https://bundler.io/
360
- source_code_uri: https://github.com/rubygems/rubygems/
367
+ source_code_uri: https://github.com/rubygems/rubygems/tree/master/bundler
361
368
  post_install_message:
362
369
  rdoc_options: []
363
370
  require_paths:
@@ -373,7 +380,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
373
380
  - !ruby/object:Gem::Version
374
381
  version: 2.5.2
375
382
  requirements: []
376
- rubygems_version: 3.3.21
383
+ rubygems_version: 3.3.23
377
384
  signing_key:
378
385
  specification_version: 4
379
386
  summary: The best way to manage your application's dependencies