bundler 2.3.3 → 2.3.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +50 -0
  3. data/lib/bundler/build_metadata.rb +2 -2
  4. data/lib/bundler/cli/config.rb +10 -1
  5. data/lib/bundler/cli/doctor.rb +9 -1
  6. data/lib/bundler/cli/gem.rb +11 -1
  7. data/lib/bundler/cli/info.rb +10 -1
  8. data/lib/bundler/cli/install.rb +6 -25
  9. data/lib/bundler/cli/platform.rb +1 -1
  10. data/lib/bundler/cli/update.rb +6 -2
  11. data/lib/bundler/cli.rb +3 -10
  12. data/lib/bundler/compact_index_client/cache.rb +0 -9
  13. data/lib/bundler/compact_index_client.rb +0 -6
  14. data/lib/bundler/definition.rb +2 -9
  15. data/lib/bundler/endpoint_specification.rb +21 -3
  16. data/lib/bundler/env.rb +1 -1
  17. data/lib/bundler/fetcher/compact_index.rb +0 -10
  18. data/lib/bundler/fetcher/index.rb +0 -26
  19. data/lib/bundler/fetcher.rb +9 -14
  20. data/lib/bundler/gem_helper.rb +2 -2
  21. data/lib/bundler/lazy_specification.rb +2 -2
  22. data/lib/bundler/lockfile_generator.rb +1 -1
  23. data/lib/bundler/remote_specification.rb +7 -0
  24. data/lib/bundler/resolver/spec_group.rb +1 -1
  25. data/lib/bundler/resolver.rb +7 -12
  26. data/lib/bundler/ruby_version.rb +1 -1
  27. data/lib/bundler/rubygems_ext.rb +13 -10
  28. data/lib/bundler/rubygems_integration.rb +2 -14
  29. data/lib/bundler/self_manager.rb +106 -14
  30. data/lib/bundler/settings.rb +1 -1
  31. data/lib/bundler/templates/newgem/newgem.gemspec.tt +1 -1
  32. data/lib/bundler/templates/newgem/standard.yml.tt +1 -0
  33. data/lib/bundler/templates/newgem/test/minitest/test_newgem.rb.tt +1 -1
  34. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +1 -4
  35. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  36. data/lib/bundler/version.rb +1 -1
  37. data/lib/bundler.rb +1 -1
  38. metadata +3 -4
  39. data/lib/bundler/psyched_yaml.rb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 88610a0ccc28d334ac316852f804afb36dc3d727790261c4f7d1c35d16e30cbf
4
- data.tar.gz: 47dd496494e214a5679a93dc32822ba2469a96e46d39f57de1daee0cbe26f23e
3
+ metadata.gz: afa073e2d0f107d4d7c2c6906c399d5a04973d85c45416643a40ae23cf2acfe7
4
+ data.tar.gz: 7173281106d774a25a867f141a752e7b9617a36811375276d592f208e1dd7646
5
5
  SHA512:
6
- metadata.gz: 4d8153145686030bcdde4b49d3ae5124cac3a621310e89427b4e88e8363d6700220415f16c112b4ae516437d02f2656d33a64aa9e61b8b5f324ed5ace3c0c4d7
7
- data.tar.gz: fad2d2b90df5e52e986507ad6f54063476aae11ef365550118bfd0556d95d3c79b2e218bdf8fcb82c15d2a32bac824b77249cafc647b18a2eea4367e429bd1d6
6
+ metadata.gz: 6c97e621ce961b554ce5a20ee0e78d4ada40fdf169994e9a67dd45bd1df4a29fe936dc79bfb3b4d01a3eb1bf91ae6d33b5028f291ba59cefaf506dccb9e4d53c
7
+ data.tar.gz: 6d58dbb998751182e6b9fb3f1b6cd41626202dfb92c76a7744346068b0e854d6813e8b62cf5288170f04f3744cc5ea5cb55fcf6da80b17c37ad7db3f15d0098a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,53 @@
1
+ # 2.3.7 (February 9, 2022)
2
+
3
+ ## Enhancements:
4
+
5
+ - Don't activate `yaml` gem from Bundler [#5277](https://github.com/rubygems/rubygems/pull/5277)
6
+ - Add Reverse Dependencies section to info command [#3966](https://github.com/rubygems/rubygems/pull/3966)
7
+
8
+ ## Bug fixes:
9
+
10
+ - Don't silently persist `BUNDLE_WITH` and `BUNDLE_WITHOUT` envs locally [#5335](https://github.com/rubygems/rubygems/pull/5335)
11
+ - Fix `bundle config` inside an application saving configuration globally [#4152](https://github.com/rubygems/rubygems/pull/4152)
12
+
13
+ # 2.3.6 (January 26, 2022)
14
+
15
+ ## Enhancements:
16
+
17
+ - Use `Gem::Platform.local` instead of `RUBY_PLATFORM` when displaying local platform [#5306](https://github.com/rubygems/rubygems/pull/5306)
18
+ - Lock standard.yml to the required ruby version [#5284](https://github.com/rubygems/rubygems/pull/5284)
19
+ - Use `Fiddle` in `bundle doctor` to check for dynamic library presence [#5173](https://github.com/rubygems/rubygems/pull/5173)
20
+
21
+ ## Bug fixes:
22
+
23
+ - Fix edge case where gems were incorrectly removed from the lockfile [#5302](https://github.com/rubygems/rubygems/pull/5302)
24
+ - Fix `force_ruby_platform` ignored when lockfile includes current specific platform [#5304](https://github.com/rubygems/rubygems/pull/5304)
25
+ - Create minitest file to underscored path in "bundle gem" command with dashed gem name [#5273](https://github.com/rubygems/rubygems/pull/5273)
26
+ - Fix regression with old marshaled specs having null `required_rubygems_version` [#5291](https://github.com/rubygems/rubygems/pull/5291)
27
+
28
+ # 2.3.5 (January 12, 2022)
29
+
30
+ ## Enhancements:
31
+
32
+ - Make `bundle update --bundler` actually lock to the latest bundler version (even if not yet installed) [#5182](https://github.com/rubygems/rubygems/pull/5182)
33
+ - Use thor-1.2.1 [#5260](https://github.com/rubygems/rubygems/pull/5260)
34
+ - Exclude bin directory for newgem template [#5259](https://github.com/rubygems/rubygems/pull/5259)
35
+
36
+ ## Bug fixes:
37
+
38
+ - Fix metadata requirements being bypassed when custom gem servers are used [#5256](https://github.com/rubygems/rubygems/pull/5256)
39
+ - Fix `rake build:checksum` writing checksum of package path, not package contents [#5250](https://github.com/rubygems/rubygems/pull/5250)
40
+
41
+ # 2.3.4 (December 29, 2021)
42
+
43
+ ## Enhancements:
44
+
45
+ - Improve error message when `BUNDLED WITH` version does not exist [#5205](https://github.com/rubygems/rubygems/pull/5205)
46
+
47
+ ## Bug fixes:
48
+
49
+ - Fix `bundle update --bundler` no longer updating lockfile [#5224](https://github.com/rubygems/rubygems/pull/5224)
50
+
1
51
  # 2.3.3 (December 24, 2021)
2
52
 
3
53
  ## Bug fixes:
@@ -4,8 +4,8 @@ module Bundler
4
4
  # Represents metadata from when the Bundler gem was built.
5
5
  module BuildMetadata
6
6
  # begin ivars
7
- @built_at = "2021-12-24".freeze
8
- @git_commit_sha = "688b71febc".freeze
7
+ @built_at = "2022-02-09".freeze
8
+ @git_commit_sha = "bafe43c593".freeze
9
9
  @release = true
10
10
  # end ivars
11
11
 
@@ -180,7 +180,7 @@ module Bundler
180
180
  scopes = %w[global local].select {|s| options[s] }
181
181
  case scopes.size
182
182
  when 0
183
- @scope = "global"
183
+ @scope = inside_app? ? "local" : "global"
184
184
  @explicit_scope = false
185
185
  when 1
186
186
  @scope = scopes.first
@@ -189,6 +189,15 @@ module Bundler
189
189
  "The options #{scopes.join " and "} were specified. Please only use one of the switches at a time."
190
190
  end
191
191
  end
192
+
193
+ private
194
+
195
+ def inside_app?
196
+ Bundler.root
197
+ true
198
+ rescue GemfileNotFound
199
+ false
200
+ end
192
201
  end
193
202
  end
194
203
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "rbconfig"
4
4
  require "shellwords"
5
+ require "fiddle"
5
6
 
6
7
  module Bundler
7
8
  class CLI::Doctor
@@ -71,7 +72,14 @@ module Bundler
71
72
 
72
73
  definition.specs.each do |spec|
73
74
  bundles_for_gem(spec).each do |bundle|
74
- bad_paths = dylibs(bundle).select {|f| !File.exist?(f) }
75
+ bad_paths = dylibs(bundle).select do |f|
76
+ begin
77
+ Fiddle.dlopen(f)
78
+ false
79
+ rescue Fiddle::DLError
80
+ true
81
+ end
82
+ end
75
83
  if bad_paths.any?
76
84
  broken_links[spec] ||= []
77
85
  broken_links[spec].concat(bad_paths)
@@ -38,6 +38,7 @@ module Bundler
38
38
  namespaced_path = name.tr("-", "/")
39
39
  constant_name = name.gsub(/-[_-]*(?![_-]|$)/) { "::" }.gsub(/([_-]+|(::)|^)(.|$)/) { $2.to_s + $3.upcase }
40
40
  constant_array = constant_name.split("::")
41
+ minitest_constant_name = constant_array.clone.tap {|a| a[-1] = "Test#{a[-1]}" }.join("::") # Foo::Bar => Foo::TestBar
41
42
 
42
43
  use_git = Bundler.git_present? && options[:git]
43
44
 
@@ -69,6 +70,7 @@ module Bundler
69
70
  :git => use_git,
70
71
  :github_username => github_username.empty? ? "[USERNAME]" : github_username,
71
72
  :required_ruby_version => required_ruby_version,
73
+ :minitest_constant_name => minitest_constant_name,
72
74
  }
73
75
  ensure_safe_gem_name(name, constant_array)
74
76
 
@@ -104,9 +106,17 @@ module Bundler
104
106
  )
105
107
  config[:test_task] = :spec
106
108
  when "minitest"
109
+ # Generate path for minitest target file (FileList["test/**/test_*.rb"])
110
+ # foo => test/test_foo.rb
111
+ # foo-bar => test/foo/test_bar.rb
112
+ # foo_bar => test/test_foo_bar.rb
113
+ paths = namespaced_path.rpartition("/")
114
+ paths[2] = "test_#{paths[2]}"
115
+ minitest_namespaced_path = paths.join("")
116
+
107
117
  templates.merge!(
108
118
  "test/minitest/test_helper.rb.tt" => "test/test_helper.rb",
109
- "test/minitest/test_newgem.rb.tt" => "test/test_#{namespaced_path}.rb"
119
+ "test/minitest/test_newgem.rb.tt" => "test/#{minitest_namespaced_path}.rb"
110
120
  )
111
121
  config[:test_task] = :test
112
122
  when "test-unit"
@@ -73,7 +73,8 @@ module Bundler
73
73
  gem_info << "\tBug Tracker: #{metadata["bug_tracker_uri"]}\n" if metadata.key?("bug_tracker_uri")
74
74
  gem_info << "\tMailing List: #{metadata["mailing_list_uri"]}\n" if metadata.key?("mailing_list_uri")
75
75
  gem_info << "\tPath: #{spec.full_gem_path}\n"
76
- gem_info << "\tDefault Gem: yes" if spec.respond_to?(:default_gem?) && spec.default_gem?
76
+ gem_info << "\tDefault Gem: yes\n" if spec.respond_to?(:default_gem?) && spec.default_gem?
77
+ gem_info << "\tReverse Dependencies: \n\t\t#{gem_dependencies.join("\n\t\t")}" if gem_dependencies.any?
77
78
 
78
79
  if name != "bundler" && spec.deleted_gem?
79
80
  return Bundler.ui.warn "The gem #{name} has been deleted. Gemspec information is still available though:\n#{gem_info}"
@@ -81,5 +82,13 @@ module Bundler
81
82
 
82
83
  Bundler.ui.info gem_info
83
84
  end
85
+
86
+ def gem_dependencies
87
+ @gem_dependencies ||= Bundler.definition.specs.map do |spec|
88
+ dependency = spec.dependencies.find {|dep| dep.name == gem_name }
89
+ next unless dependency
90
+ "#{spec.name} (#{spec.version}) depends on #{gem_name} (#{dependency.requirements_list.join(", ")})"
91
+ end.compact.sort
92
+ end
84
93
  end
85
94
  end
@@ -135,32 +135,13 @@ module Bundler
135
135
  end
136
136
 
137
137
  def normalize_groups
138
- options[:with] &&= options[:with].join(":").tr(" ", ":").split(":")
139
- options[:without] &&= options[:without].join(":").tr(" ", ":").split(":")
140
-
141
138
  check_for_group_conflicts_in_cli_options
142
139
 
143
- Bundler.settings.set_command_option :with, nil if options[:with] == []
144
- Bundler.settings.set_command_option :without, nil if options[:without] == []
145
-
146
- with = options.fetch(:with, [])
147
- with |= Bundler.settings[:with].map(&:to_s)
148
- with -= options[:without] if options[:without]
149
-
150
- without = options.fetch(:without, [])
151
- without |= Bundler.settings[:without].map(&:to_s)
152
- without -= options[:with] if options[:with]
153
-
154
- options[:with] = with
155
- options[:without] = without
156
-
157
- unless Bundler.settings[:without] == options[:without] && Bundler.settings[:with] == options[:with]
158
- # need to nil them out first to get around validation for backwards compatibility
159
- Bundler.settings.set_command_option :without, nil
160
- Bundler.settings.set_command_option :with, nil
161
- Bundler.settings.set_command_option :without, options[:without] - options[:with]
162
- Bundler.settings.set_command_option :with, options[:with]
163
- end
140
+ # need to nil them out first to get around validation for backwards compatibility
141
+ Bundler.settings.set_command_option :without, nil
142
+ Bundler.settings.set_command_option :with, nil
143
+ Bundler.settings.set_command_option :without, options[:without]
144
+ Bundler.settings.set_command_option :with, options[:with]
164
145
  end
165
146
 
166
147
  def normalize_settings
@@ -184,7 +165,7 @@ module Bundler
184
165
 
185
166
  Bundler.settings.set_command_option_if_given :clean, options["clean"]
186
167
 
187
- normalize_groups
168
+ normalize_groups if options[:without] || options[:with]
188
169
 
189
170
  options[:force] = options[:redownload]
190
171
  end
@@ -23,7 +23,7 @@ module Bundler
23
23
  output << "No ruby version specified"
24
24
  end
25
25
  else
26
- output << "Your platform is: #{RUBY_PLATFORM}"
26
+ output << "Your platform is: #{Gem::Platform.local}"
27
27
  output << "Your app has gems that work on these platforms:\n#{platforms.join("\n")}"
28
28
 
29
29
  if ruby_version
@@ -11,12 +11,16 @@ module Bundler
11
11
  def run
12
12
  Bundler.ui.level = "warn" if options[:quiet]
13
13
 
14
+ update_bundler = options[:bundler]
15
+
16
+ Bundler.self_manager.update_bundler_and_restart_with_it_if_needed(update_bundler) if update_bundler
17
+
14
18
  Plugin.gemfile_install(Bundler.default_gemfile) if Bundler.feature_flag.plugins?
15
19
 
16
20
  sources = Array(options[:source])
17
21
  groups = Array(options[:group]).map(&:to_sym)
18
22
 
19
- full_update = gems.empty? && sources.empty? && groups.empty? && !options[:ruby] && !options[:bundler]
23
+ full_update = gems.empty? && sources.empty? && groups.empty? && !options[:ruby] && !update_bundler
20
24
 
21
25
  if full_update && !options[:all]
22
26
  if Bundler.feature_flag.update_requires_all_flag?
@@ -49,7 +53,7 @@ module Bundler
49
53
 
50
54
  Bundler.definition(:gems => gems, :sources => sources, :ruby => options[:ruby],
51
55
  :conservative => conservative,
52
- :bundler => options[:bundler])
56
+ :bundler => update_bundler)
53
57
  end
54
58
 
55
59
  Bundler::CLI::Common.configure_gem_version_promoter(Bundler.definition, options)
data/lib/bundler/cli.rb CHANGED
@@ -809,17 +809,10 @@ module Bundler
809
809
 
810
810
  current = Gem::Version.new(VERSION)
811
811
  return if current >= latest
812
- latest_installed = Bundler.rubygems.find_name("bundler").map(&:version).max
813
812
 
814
- installation = "To install the latest version, run `gem install bundler#{" --pre" if latest.prerelease?}`"
815
- if latest_installed && latest_installed > current
816
- suggestion = "To update to the most recent installed version (#{latest_installed}), run `bundle update --bundler`"
817
- suggestion = "#{installation}\n#{suggestion}" if latest_installed < latest
818
- else
819
- suggestion = installation
820
- end
821
-
822
- Bundler.ui.warn "The latest bundler is #{latest}, but you are currently running #{current}.\n#{suggestion}"
813
+ Bundler.ui.warn \
814
+ "The latest bundler is #{latest}, but you are currently running #{current}.\n" \
815
+ "To update to the most recent version, run `bundle update --bundler`"
823
816
  rescue RuntimeError
824
817
  nil
825
818
  end
@@ -76,15 +76,6 @@ module Bundler
76
76
  end
77
77
  end
78
78
 
79
- def specific_dependency(name, version, platform)
80
- pattern = [version, platform].compact.join("-")
81
- return nil if pattern.empty?
82
-
83
- gem_lines = info_path(name).read
84
- gem_line = gem_lines[/^#{Regexp.escape(pattern)}\b.*/, 0]
85
- gem_line ? parse_gem(gem_line) : nil
86
- end
87
-
88
79
  private
89
80
 
90
81
  def lines(path)
@@ -73,12 +73,6 @@ module Bundler
73
73
  end.flatten(1)
74
74
  end
75
75
 
76
- def spec(name, version, platform = nil)
77
- Bundler::CompactIndexClient.debug { "spec(name = #{name}, version = #{version}, platform = #{platform})" }
78
- update_info(name)
79
- @cache.specific_dependency(name, version, platform)
80
- end
81
-
82
76
  def update_and_parse_checksums!
83
77
  Bundler::CompactIndexClient.debug { "update_and_parse_checksums!" }
84
78
  return @info_checksums_by_name if @parsed_checksums
@@ -265,7 +265,7 @@ module Bundler
265
265
  else
266
266
  # Run a resolve against the locally available gems
267
267
  Bundler.ui.debug("Found changes from the lockfile, re-resolving dependencies because #{change_reason}")
268
- expanded_dependencies = expand_dependencies(dependencies + metadata_dependencies, @remote)
268
+ expanded_dependencies = expand_dependencies(dependencies + metadata_dependencies, true)
269
269
  Resolver.resolve(expanded_dependencies, source_requirements, last_resolve, gem_version_promoter, additional_base_requirements_for_resolve, platforms)
270
270
  end
271
271
  end
@@ -309,14 +309,6 @@ module Bundler
309
309
  end
310
310
  end
311
311
 
312
- def locked_bundler_version
313
- if @locked_bundler_version && @locked_bundler_version < Gem::Version.new(Bundler::VERSION)
314
- new_version = Bundler::VERSION
315
- end
316
-
317
- new_version || @locked_bundler_version || Bundler::VERSION
318
- end
319
-
320
312
  def locked_ruby_version
321
313
  return unless ruby_version
322
314
  if @unlock[:ruby] || !@locked_ruby_version
@@ -503,6 +495,7 @@ module Bundler
503
495
 
504
496
  def current_ruby_platform_locked?
505
497
  return false unless generic_local_platform == Gem::Platform::RUBY
498
+ return false if Bundler.settings[:force_ruby_platform] && !@platforms.include?(Gem::Platform::RUBY)
506
499
 
507
500
  current_platform_locked?
508
501
  end
@@ -5,14 +5,15 @@ module Bundler
5
5
  class EndpointSpecification < Gem::Specification
6
6
  include MatchPlatform
7
7
 
8
- attr_reader :name, :version, :platform, :required_rubygems_version, :required_ruby_version, :checksum
8
+ attr_reader :name, :version, :platform, :checksum
9
9
  attr_accessor :source, :remote, :dependencies
10
10
 
11
- def initialize(name, version, platform, dependencies, metadata = nil)
11
+ def initialize(name, version, platform, spec_fetcher, dependencies, metadata = nil)
12
12
  super()
13
13
  @name = name
14
14
  @version = Gem::Version.create version
15
15
  @platform = platform
16
+ @spec_fetcher = spec_fetcher
16
17
  @dependencies = dependencies.map {|dep, reqs| build_dependency(dep, reqs) }
17
18
 
18
19
  @loaded_from = nil
@@ -21,6 +22,14 @@ module Bundler
21
22
  parse_metadata(metadata)
22
23
  end
23
24
 
25
+ def required_ruby_version
26
+ @required_ruby_version ||= _remote_specification.required_ruby_version
27
+ end
28
+
29
+ def required_rubygems_version
30
+ @required_rubygems_version ||= _remote_specification.required_rubygems_version
31
+ end
32
+
24
33
  def fetch_platform
25
34
  @platform
26
35
  end
@@ -105,12 +114,21 @@ module Bundler
105
114
 
106
115
  private
107
116
 
117
+ def _remote_specification
118
+ @_remote_specification ||= @spec_fetcher.fetch_spec([@name, @version, @platform])
119
+ end
120
+
108
121
  def local_specification_path
109
122
  "#{base_dir}/specifications/#{full_name}.gemspec"
110
123
  end
111
124
 
112
125
  def parse_metadata(data)
113
- return unless data
126
+ unless data
127
+ @required_ruby_version = nil
128
+ @required_rubygems_version = nil
129
+ return
130
+ end
131
+
114
132
  data.each do |k, v|
115
133
  next unless v
116
134
  case k.to_s
data/lib/bundler/env.rb CHANGED
@@ -71,7 +71,7 @@ module Bundler
71
71
  def self.ruby_version
72
72
  str = String.new(RUBY_VERSION)
73
73
  str << "p#{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
74
- str << " (#{RUBY_RELEASE_DATE} revision #{RUBY_REVISION}) [#{RUBY_PLATFORM}]"
74
+ str << " (#{RUBY_RELEASE_DATE} revision #{RUBY_REVISION}) [#{Gem::Platform.local}]"
75
75
  end
76
76
 
77
77
  def self.git_version
@@ -57,16 +57,6 @@ module Bundler
57
57
  gem_info
58
58
  end
59
59
 
60
- def fetch_spec(spec)
61
- spec -= [nil, "ruby", ""]
62
- contents = compact_index_client.spec(*spec)
63
- return nil if contents.nil?
64
- contents.unshift(spec.first)
65
- contents[3].map! {|d| Gem::Dependency.new(*d) }
66
- EndpointSpecification.new(*contents)
67
- end
68
- compact_index_request :fetch_spec
69
-
70
60
  def available?
71
61
  unless SharedHelpers.md5_available?
72
62
  Bundler.ui.debug("FIPS mode is enabled, bundler can't use the CompactIndex API")
@@ -21,32 +21,6 @@ module Bundler
21
21
  raise HTTPError, "Could not fetch specs from #{display_uri} due to underlying error <#{e.message}>"
22
22
  end
23
23
  end
24
-
25
- def fetch_spec(spec)
26
- spec -= [nil, "ruby", ""]
27
- spec_file_name = "#{spec.join "-"}.gemspec"
28
-
29
- uri = Bundler::URI.parse("#{remote_uri}#{Gem::MARSHAL_SPEC_DIR}#{spec_file_name}.rz")
30
- if uri.scheme == "file"
31
- path = Bundler.rubygems.correct_for_windows_path(uri.path)
32
- Bundler.load_marshal Bundler.rubygems.inflate(Gem.read_binary(path))
33
- elsif cached_spec_path = gemspec_cached_path(spec_file_name)
34
- Bundler.load_gemspec(cached_spec_path)
35
- else
36
- Bundler.load_marshal Bundler.rubygems.inflate(downloader.fetch(uri).body)
37
- end
38
- rescue MarshalError
39
- raise HTTPError, "Gemspec #{spec} contained invalid data.\n" \
40
- "Your network or your gem server is probably having issues right now."
41
- end
42
-
43
- private
44
-
45
- # cached gem specification path, if one exists
46
- def gemspec_cached_path(spec_file_name)
47
- paths = Bundler.rubygems.spec_cache_dirs.map {|dir| File.join(dir, spec_file_name) }
48
- paths.find {|path| File.file? path }
49
- end
50
24
  end
51
25
  end
52
26
  end
@@ -129,17 +129,15 @@ module Bundler
129
129
  specs = fetchers.last.specs(gem_names)
130
130
  else
131
131
  specs = []
132
- fetchers.shift until fetchers.first.available? || fetchers.empty?
133
- fetchers.dup.each do |f|
134
- break unless f.api_fetcher? && !gem_names || !specs = f.specs(gem_names)
135
- fetchers.delete(f)
132
+ @fetchers = fetchers.drop_while do |f|
133
+ !f.available? || (f.api_fetcher? && !gem_names) || !specs = f.specs(gem_names)
136
134
  end
137
135
  @use_api = false if fetchers.none?(&:api_fetcher?)
138
136
  end
139
137
 
140
138
  specs.each do |name, version, platform, dependencies, metadata|
141
139
  spec = if dependencies
142
- EndpointSpecification.new(name, version, platform, dependencies, metadata)
140
+ EndpointSpecification.new(name, version, platform, self, dependencies, metadata)
143
141
  else
144
142
  RemoteSpecification.new(name, version, platform, self)
145
143
  end
@@ -242,7 +240,7 @@ module Bundler
242
240
  raise SSLError if needs_ssl && !defined?(OpenSSL::SSL)
243
241
 
244
242
  con = PersistentHTTP.new :name => "bundler", :proxy => :ENV
245
- if gem_proxy = Bundler.rubygems.configuration[:http_proxy]
243
+ if gem_proxy = Gem.configuration[:http_proxy]
246
244
  con.proxy = Bundler::URI.parse(gem_proxy) if gem_proxy != :no_proxy
247
245
  end
248
246
 
@@ -253,8 +251,8 @@ module Bundler
253
251
  end
254
252
 
255
253
  ssl_client_cert = Bundler.settings[:ssl_client_cert] ||
256
- (Bundler.rubygems.configuration.ssl_client_cert if
257
- Bundler.rubygems.configuration.respond_to?(:ssl_client_cert))
254
+ (Gem.configuration.ssl_client_cert if
255
+ Gem.configuration.respond_to?(:ssl_client_cert))
258
256
  if ssl_client_cert
259
257
  pem = File.read(ssl_client_cert)
260
258
  con.cert = OpenSSL::X509::Certificate.new(pem)
@@ -272,8 +270,7 @@ module Bundler
272
270
  # cached gem specification path, if one exists
273
271
  def gemspec_cached_path(spec_file_name)
274
272
  paths = Bundler.rubygems.spec_cache_dirs.map {|dir| File.join(dir, spec_file_name) }
275
- paths = paths.select {|path| File.file? path }
276
- paths.first
273
+ paths.find {|path| File.file? path }
277
274
  end
278
275
 
279
276
  HTTP_ERRORS = [
@@ -286,8 +283,8 @@ module Bundler
286
283
  def bundler_cert_store
287
284
  store = OpenSSL::X509::Store.new
288
285
  ssl_ca_cert = Bundler.settings[:ssl_ca_cert] ||
289
- (Bundler.rubygems.configuration.ssl_ca_cert if
290
- Bundler.rubygems.configuration.respond_to?(:ssl_ca_cert))
286
+ (Gem.configuration.ssl_ca_cert if
287
+ Gem.configuration.respond_to?(:ssl_ca_cert))
291
288
  if ssl_ca_cert
292
289
  if File.directory? ssl_ca_cert
293
290
  store.add_path ssl_ca_cert
@@ -301,8 +298,6 @@ module Bundler
301
298
  store
302
299
  end
303
300
 
304
- private
305
-
306
301
  def remote_uri
307
302
  @remote.uri
308
303
  end
@@ -107,9 +107,9 @@ module Bundler
107
107
  SharedHelpers.filesystem_access(File.join(base, "checksums")) {|p| FileUtils.mkdir_p(p) }
108
108
  file_name = "#{File.basename(built_gem_path)}.sha512"
109
109
  require "digest/sha2"
110
- checksum = ::Digest::SHA512.new.hexdigest(built_gem_path.to_s)
110
+ checksum = ::Digest::SHA512.file(built_gem_path).hexdigest
111
111
  target = File.join(base, "checksums", file_name)
112
- File.write(target, checksum)
112
+ File.write(target, checksum + "\n")
113
113
  Bundler.ui.confirm "#{name} #{version} checksum written to checksums/#{file_name}."
114
114
  end
115
115
 
@@ -90,11 +90,11 @@ module Bundler
90
90
  MatchPlatform.platforms_match?(spec.platform, platform_object)
91
91
  end
92
92
  installable_candidates = same_platform_candidates.select do |spec|
93
- !spec.is_a?(EndpointSpecification) ||
93
+ spec.is_a?(StubSpecification) ||
94
94
  (spec.required_ruby_version.satisfied_by?(Gem.ruby_version) &&
95
95
  spec.required_rubygems_version.satisfied_by?(Gem.rubygems_version))
96
96
  end
97
- search = installable_candidates.last || same_platform_candidates.last
97
+ search = installable_candidates.last
98
98
  search.dependencies = dependencies if search && (search.is_a?(RemoteSpecification) || search.is_a?(EndpointSpecification))
99
99
  search
100
100
  end
@@ -71,7 +71,7 @@ module Bundler
71
71
  end
72
72
 
73
73
  def add_bundled_with
74
- add_section("BUNDLED WITH", definition.locked_bundler_version.to_s)
74
+ add_section("BUNDLED WITH", Bundler::VERSION)
75
75
  end
76
76
 
77
77
  def add_section(name, value)
@@ -27,6 +27,13 @@ module Bundler
27
27
  @platform = _remote_specification.platform
28
28
  end
29
29
 
30
+ # A fallback is included because the original version of the specification
31
+ # API didn't include that field, so some marshalled specs in the index have it
32
+ # set to +nil+.
33
+ def required_rubygems_version
34
+ @required_rubygems_version ||= _remote_specification.required_rubygems_version || Gem::Requirement.default
35
+ end
36
+
30
37
  def full_name
31
38
  if platform == Gem::Platform::RUBY || platform.nil?
32
39
  "#{@name}-#{@version}"
@@ -95,7 +95,7 @@ module Bundler
95
95
 
96
96
  def metadata_dependencies(platform)
97
97
  spec = @specs[platform].first
98
- return [] unless spec.is_a?(Gem::Specification)
98
+ return [] if spec.is_a?(LazySpecification)
99
99
  dependencies = []
100
100
  if !spec.required_ruby_version.nil? && !spec.required_ruby_version.none?
101
101
  dependencies << DepProxy.get_proxy(Gem::Dependency.new("Ruby\0", spec.required_ruby_version), platform)
@@ -249,10 +249,11 @@ module Bundler
249
249
  end
250
250
 
251
251
  def verify_gemfile_dependencies_are_found!(requirements)
252
- requirements.each do |requirement|
252
+ requirements.map! do |requirement|
253
253
  name = requirement.name
254
- next if name == "bundler"
255
- next unless search_for(requirement).empty?
254
+ next requirement if name == "bundler"
255
+ next requirement unless search_for(requirement).empty?
256
+ next unless requirement.current_platform?
256
257
 
257
258
  if (base = @base[name]) && !base.empty?
258
259
  version = base.first.version
@@ -266,7 +267,7 @@ module Bundler
266
267
  message = gem_not_found_message(name, requirement, source_for(name))
267
268
  end
268
269
  raise GemNotFound, message
269
- end
270
+ end.compact!
270
271
  end
271
272
 
272
273
  def gem_not_found_message(name, requirement, source, extra_message = "")
@@ -358,24 +359,18 @@ module Bundler
358
359
  o << "\n"
359
360
  o << %(Running `bundle update` will rebuild your snapshot from scratch, using only\n)
360
361
  o << %(the gems in your Gemfile, which may resolve the conflict.\n)
361
- elsif !conflict.existing
362
+ elsif !conflict.existing && !name.end_with?("\0")
362
363
  o << "\n"
363
364
 
364
365
  relevant_source = conflict.requirement.source || source_for(name)
365
366
 
366
- metadata_requirement = name.end_with?("\0")
367
-
368
367
  extra_message = if conflict.requirement_trees.first.size > 1
369
368
  ", which is required by gem '#{SharedHelpers.pretty_dependency(conflict.requirement_trees.first[-2])}',"
370
369
  else
371
370
  ""
372
371
  end
373
372
 
374
- if metadata_requirement
375
- o << "#{SharedHelpers.pretty_dependency(conflict.requirement)}#{extra_message} is not available in #{relevant_source}"
376
- else
377
- o << gem_not_found_message(name, conflict.requirement, relevant_source, extra_message)
378
- end
373
+ o << gem_not_found_message(name, conflict.requirement, relevant_source, extra_message)
379
374
  end
380
375
  end,
381
376
  :version_for_spec => lambda {|spec| spec.version },
@@ -103,7 +103,7 @@ module Bundler
103
103
 
104
104
  def self.system
105
105
  ruby_engine = RUBY_ENGINE.dup
106
- ruby_version = ENV.fetch("BUNDLER_SPEC_RUBY_VERSION") { RUBY_VERSION }.dup
106
+ ruby_version = RUBY_VERSION.dup
107
107
  ruby_engine_version = RUBY_ENGINE_VERSION.dup
108
108
  patchlevel = RUBY_PATCHLEVEL.to_s
109
109
 
@@ -4,14 +4,12 @@ require "pathname"
4
4
 
5
5
  require "rubygems/specification"
6
6
 
7
- # Possible use in Gem::Specification#source below and require
8
- # shouldn't be deferred.
9
- require "rubygems/source"
10
-
11
7
  require_relative "match_platform"
12
8
 
13
9
  module Gem
14
10
  class Specification
11
+ include ::Bundler::MatchPlatform
12
+
15
13
  attr_accessor :remote, :location, :relative_loaded_from
16
14
 
17
15
  remove_method :source
@@ -81,6 +79,17 @@ module Gem
81
79
  gemfile
82
80
  end
83
81
 
82
+ # Backfill missing YAML require when not defined. Fixed since 3.1.0.pre1.
83
+ module YamlBackfiller
84
+ def to_yaml(opts = {})
85
+ Gem.load_yaml unless defined?(::YAML)
86
+
87
+ super(opts)
88
+ end
89
+ end
90
+
91
+ prepend YamlBackfiller
92
+
84
93
  def nondevelopment_dependencies
85
94
  dependencies - development_dependencies
86
95
  end
@@ -228,9 +237,3 @@ module Gem
228
237
  end
229
238
  end
230
239
  end
231
-
232
- module Gem
233
- class Specification
234
- include ::Bundler::MatchPlatform
235
- end
236
- end
@@ -104,18 +104,6 @@ module Bundler
104
104
  obj.to_s
105
105
  end
106
106
 
107
- def configuration
108
- require_relative "psyched_yaml"
109
- Gem.configuration
110
- rescue Gem::SystemExitException, LoadError => e
111
- Bundler.ui.error "#{e.class}: #{e.message}"
112
- Bundler.ui.trace e
113
- raise
114
- rescue ::Psych::SyntaxError => e
115
- raise YamlSyntaxError.new(e, "Your RubyGems configuration, which is " \
116
- "usually located in ~/.gemrc, contains invalid YAML syntax.")
117
- end
118
-
119
107
  def ruby_engine
120
108
  Gem.ruby_engine
121
109
  end
@@ -217,7 +205,7 @@ module Bundler
217
205
 
218
206
  def spec_from_gem(path, policy = nil)
219
207
  require "rubygems/security"
220
- require_relative "psyched_yaml"
208
+ require "psych"
221
209
  gem_from_path(path, security_policies[policy]).spec
222
210
  rescue Exception, Gem::Exception, Gem::Security::Exception => e # rubocop:disable Lint/RescueException
223
211
  if e.is_a?(Gem::Security::Exception) ||
@@ -522,7 +510,7 @@ module Bundler
522
510
 
523
511
  def gem_remote_fetcher
524
512
  require "rubygems/remote_fetcher"
525
- proxy = configuration[:http_proxy]
513
+ proxy = Gem.configuration[:http_proxy]
526
514
  Gem::RemoteFetcher.new(proxy)
527
515
  end
528
516
 
@@ -9,7 +9,7 @@ module Bundler
9
9
  def restart_with_locked_bundler_if_needed
10
10
  return unless needs_switching? && installed?
11
11
 
12
- restart_with_locked_bundler
12
+ restart_with(lockfile_version)
13
13
  end
14
14
 
15
15
  def install_locked_bundler_and_restart_with_it_if_needed
@@ -19,23 +19,48 @@ module Bundler
19
19
  "Bundler #{current_version} is running, but your lockfile was generated with #{lockfile_version}. " \
20
20
  "Installing Bundler #{lockfile_version} and restarting using that version."
21
21
 
22
- install_and_restart_with_locked_bundler
22
+ install_and_restart_with(lockfile_version)
23
+ end
24
+
25
+ def update_bundler_and_restart_with_it_if_needed(target)
26
+ return unless autoswitching_applies?
27
+
28
+ spec = resolve_update_version_from(target)
29
+ return unless spec
30
+
31
+ version = spec.version
32
+
33
+ Bundler.ui.info "Updating bundler to #{version}."
34
+
35
+ install(spec)
36
+
37
+ restart_with(version)
23
38
  end
24
39
 
25
40
  private
26
41
 
27
- def install_and_restart_with_locked_bundler
28
- bundler_dep = Gem::Dependency.new("bundler", lockfile_version)
42
+ def install_and_restart_with(version)
43
+ requirement = Gem::Requirement.new(version)
44
+ spec = find_latest_matching_spec(requirement)
29
45
 
30
- Gem.install(bundler_dep)
46
+ if spec.nil?
47
+ Bundler.ui.warn "Your lockfile is locked to a version of bundler (#{lockfile_version}) that doesn't exist at https://rubygems.org/. Going on using #{current_version}"
48
+ return
49
+ end
50
+
51
+ install(spec)
31
52
  rescue StandardError => e
32
53
  Bundler.ui.trace e
33
54
  Bundler.ui.warn "There was an error installing the locked bundler version (#{lockfile_version}), rerun with the `--verbose` flag for more details. Going on using bundler #{current_version}."
34
55
  else
35
- restart_with_locked_bundler
56
+ restart_with(version)
57
+ end
58
+
59
+ def install(spec)
60
+ spec.source.install(spec)
36
61
  end
37
62
 
38
- def restart_with_locked_bundler
63
+ def restart_with(version)
39
64
  configured_gem_home = ENV["GEM_HOME"]
40
65
  configured_gem_path = ENV["GEM_PATH"]
41
66
 
@@ -44,33 +69,100 @@ module Bundler
44
69
 
45
70
  Bundler.with_original_env do
46
71
  Kernel.exec(
47
- { "GEM_HOME" => configured_gem_home, "GEM_PATH" => configured_gem_path, "BUNDLER_VERSION" => lockfile_version },
72
+ { "GEM_HOME" => configured_gem_home, "GEM_PATH" => configured_gem_path, "BUNDLER_VERSION" => version.to_s },
48
73
  *cmd
49
74
  )
50
75
  end
51
76
  end
52
77
 
53
78
  def needs_switching?
79
+ autoswitching_applies? &&
80
+ released?(lockfile_version) &&
81
+ !running?(lockfile_version) &&
82
+ !updating?
83
+ end
84
+
85
+ def autoswitching_applies?
54
86
  ENV["BUNDLER_VERSION"].nil? &&
55
87
  Bundler.rubygems.supports_bundler_trampolining? &&
56
88
  SharedHelpers.in_bundle? &&
57
- lockfile_version &&
58
- !lockfile_version.end_with?(".dev") &&
59
- lockfile_version != current_version
89
+ lockfile_version
90
+ end
91
+
92
+ def resolve_update_version_from(target)
93
+ requirement = Gem::Requirement.new(target)
94
+ update_candidate = find_latest_matching_spec(requirement)
95
+
96
+ if update_candidate.nil?
97
+ raise InvalidOption, "The `bundle update --bundler` target version (#{target}) does not exist"
98
+ end
99
+
100
+ resolved_version = update_candidate.version
101
+ needs_update = requirement.specific? ? !running?(resolved_version) : running_older_than?(resolved_version)
102
+
103
+ return unless needs_update
104
+
105
+ update_candidate
106
+ end
107
+
108
+ def local_specs
109
+ @local_specs ||= Bundler::Source::Rubygems.new("allow_local" => true).specs.select {|spec| spec.name == "bundler" }
110
+ end
111
+
112
+ def remote_specs
113
+ @remote_specs ||= begin
114
+ source = Bundler::Source::Rubygems.new("remotes" => "https://rubygems.org")
115
+ source.remote!
116
+ source.add_dependency_names("bundler")
117
+ source.specs
118
+ end
119
+ end
120
+
121
+ def find_latest_matching_spec(requirement)
122
+ local_result = find_latest_matching_spec_from_collection(local_specs, requirement)
123
+ return local_result if local_result && requirement.specific?
124
+
125
+ remote_result = find_latest_matching_spec_from_collection(remote_specs, requirement)
126
+ return remote_result if local_result.nil?
127
+
128
+ [local_result, remote_result].max
129
+ end
130
+
131
+ def find_latest_matching_spec_from_collection(specs, requirement)
132
+ specs.sort.reverse_each.find {|spec| requirement.satisfied_by?(spec.version) }
133
+ end
134
+
135
+ def running?(version)
136
+ version == current_version
137
+ end
138
+
139
+ def running_older_than?(version)
140
+ current_version < version
141
+ end
142
+
143
+ def released?(version)
144
+ !version.to_s.end_with?(".dev")
145
+ end
146
+
147
+ def updating?
148
+ "update".start_with?(ARGV.first || " ") && ARGV[1..-1].any? {|a| a.start_with?("--bundler") }
60
149
  end
61
150
 
62
151
  def installed?
63
152
  Bundler.configure
64
153
 
65
- Bundler.rubygems.find_bundler(lockfile_version)
154
+ Bundler.rubygems.find_bundler(lockfile_version.to_s)
66
155
  end
67
156
 
68
157
  def current_version
69
- @current_version ||= Bundler::VERSION
158
+ @current_version ||= Gem::Version.new(Bundler::VERSION)
70
159
  end
71
160
 
72
161
  def lockfile_version
73
- @lockfile_version ||= Bundler::LockfileParser.bundled_with
162
+ return @lockfile_version if defined?(@lockfile_version)
163
+
164
+ parsed_version = Bundler::LockfileParser.bundled_with
165
+ @lockfile_version = parsed_version ? Gem::Version.new(parsed_version) : nil
74
166
  end
75
167
  end
76
168
  end
@@ -367,7 +367,7 @@ module Bundler
367
367
 
368
368
  def to_array(value)
369
369
  return [] unless value
370
- value.split(":").map(&:to_sym)
370
+ value.tr(" ", ":").split(":").map(&:to_sym)
371
371
  end
372
372
 
373
373
  def array_to_s(array)
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
26
26
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
27
27
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
28
28
  `git ls-files -z`.split("\x0").reject do |f|
29
- (f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
29
+ (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
30
30
  end
31
31
  end
32
32
  spec.bindir = "exe"
@@ -1,2 +1,3 @@
1
1
  # For available configuration options, see:
2
2
  # https://github.com/testdouble/standard
3
+ ruby_version: <%= ::Gem::Version.new(config[:required_ruby_version]).segments[0..1].join(".") %>
@@ -2,7 +2,7 @@
2
2
 
3
3
  require "test_helper"
4
4
 
5
- class Test<%= config[:constant_name] %> < Minitest::Test
5
+ class <%= config[:minitest_constant_name] %> < Minitest::Test
6
6
  def test_that_it_has_a_version_number
7
7
  refute_nil ::<%= config[:constant_name] %>::VERSION
8
8
  end
@@ -107,10 +107,7 @@ class Bundler::Thor
107
107
  #
108
108
  def replace!(regexp, string, force)
109
109
  content = File.read(destination)
110
- before, after = content.split(regexp, 2)
111
- snippet = (behavior == :after ? after : before).to_s
112
-
113
- if force || !snippet.include?(replacement)
110
+ if force || !content.include?(replacement)
114
111
  success = content.gsub!(regexp, string)
115
112
 
116
113
  File.open(destination, "wb") { |file| file.write(content) } unless pretend?
@@ -1,3 +1,3 @@
1
1
  class Bundler::Thor
2
- VERSION = "1.1.0"
2
+ VERSION = "1.2.1"
3
3
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: false
2
2
 
3
3
  module Bundler
4
- VERSION = "2.3.3".freeze
4
+ VERSION = "2.3.7".freeze
5
5
 
6
6
  def self.bundler_major_version
7
7
  @bundler_major_version ||= VERSION.split(".").first.to_i
data/lib/bundler.rb CHANGED
@@ -654,7 +654,7 @@ EOF
654
654
  private
655
655
 
656
656
  def eval_yaml_gemspec(path, contents)
657
- require_relative "bundler/psyched_yaml"
657
+ Kernel.require "psych"
658
658
 
659
659
  Gem::Specification.from_yaml(contents)
660
660
  rescue ::Psych::SyntaxError, ArgumentError, Gem::EndOfYAMLException, Gem::Exception
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.3
4
+ version: 2.3.7
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: 2021-12-24 00:00:00.000000000 Z
25
+ date: 2022-02-09 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
@@ -178,7 +178,6 @@ files:
178
178
  - lib/bundler/plugin/installer/rubygems.rb
179
179
  - lib/bundler/plugin/source_list.rb
180
180
  - lib/bundler/process_lock.rb
181
- - lib/bundler/psyched_yaml.rb
182
181
  - lib/bundler/remote_specification.rb
183
182
  - lib/bundler/resolver.rb
184
183
  - lib/bundler/resolver/spec_group.rb
@@ -370,7 +369,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
370
369
  - !ruby/object:Gem::Version
371
370
  version: 2.5.2
372
371
  requirements: []
373
- rubygems_version: 3.3.3
372
+ rubygems_version: 3.3.7
374
373
  signing_key:
375
374
  specification_version: 4
376
375
  summary: The best way to manage your application's dependencies
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- begin
4
- require "psych"
5
- rescue LoadError
6
- # Apparently Psych wasn't available. Oh well.
7
- end
8
-
9
- # At least load the YAML stdlib, whatever that may be
10
- require "yaml" unless defined?(YAML.dump)