bundler 2.3.12 → 2.4.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (226) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +367 -1
  3. data/README.md +2 -2
  4. data/bundler.gemspec +8 -10
  5. data/exe/bundle +1 -4
  6. data/lib/bundler/build_metadata.rb +2 -2
  7. data/lib/bundler/cli/add.rb +1 -1
  8. data/lib/bundler/cli/binstubs.rb +5 -1
  9. data/lib/bundler/cli/check.rb +1 -1
  10. data/lib/bundler/cli/common.rb +3 -1
  11. data/lib/bundler/cli/console.rb +2 -2
  12. data/lib/bundler/cli/doctor.rb +4 -6
  13. data/lib/bundler/cli/gem.rb +62 -40
  14. data/lib/bundler/cli/init.rb +5 -1
  15. data/lib/bundler/cli/install.rb +7 -5
  16. data/lib/bundler/cli/lock.rb +8 -5
  17. data/lib/bundler/cli/open.rb +6 -4
  18. data/lib/bundler/cli/outdated.rb +13 -6
  19. data/lib/bundler/cli/platform.rb +1 -1
  20. data/lib/bundler/cli/viz.rb +1 -1
  21. data/lib/bundler/cli.rb +52 -7
  22. data/lib/bundler/compact_index_client/cache.rb +1 -1
  23. data/lib/bundler/compact_index_client/updater.rb +53 -39
  24. data/lib/bundler/constants.rb +1 -1
  25. data/lib/bundler/current_ruby.rb +15 -6
  26. data/lib/bundler/definition.rb +203 -110
  27. data/lib/bundler/dependency.rb +21 -84
  28. data/lib/bundler/digest.rb +1 -1
  29. data/lib/bundler/dsl.rb +13 -18
  30. data/lib/bundler/endpoint_specification.rb +6 -10
  31. data/lib/bundler/env.rb +1 -1
  32. data/lib/bundler/environment_preserver.rb +1 -0
  33. data/lib/bundler/errors.rb +15 -15
  34. data/lib/bundler/feature_flag.rb +0 -1
  35. data/lib/bundler/fetcher/base.rb +6 -8
  36. data/lib/bundler/fetcher/compact_index.rb +9 -11
  37. data/lib/bundler/fetcher/dependency.rb +1 -1
  38. data/lib/bundler/fetcher/downloader.rb +2 -5
  39. data/lib/bundler/fetcher.rb +12 -12
  40. data/lib/bundler/force_platform.rb +18 -0
  41. data/lib/bundler/friendly_errors.rb +21 -7
  42. data/lib/bundler/gem_helpers.rb +9 -2
  43. data/lib/bundler/gem_version_promoter.rb +53 -98
  44. data/lib/bundler/graph.rb +3 -3
  45. data/lib/bundler/index.rb +11 -49
  46. data/lib/bundler/injector.rb +8 -3
  47. data/lib/bundler/inline.rb +9 -21
  48. data/lib/bundler/installer/gem_installer.rb +14 -1
  49. data/lib/bundler/installer/parallel_installer.rb +0 -31
  50. data/lib/bundler/installer/standalone.rb +41 -10
  51. data/lib/bundler/installer.rb +18 -39
  52. data/lib/bundler/lazy_specification.rb +53 -48
  53. data/lib/bundler/lockfile_generator.rb +1 -1
  54. data/lib/bundler/lockfile_parser.rb +9 -5
  55. data/lib/bundler/man/bundle-add.1 +13 -5
  56. data/lib/bundler/man/bundle-add.1.ronn +10 -4
  57. data/lib/bundler/man/bundle-binstubs.1 +1 -1
  58. data/lib/bundler/man/bundle-cache.1 +7 -1
  59. data/lib/bundler/man/bundle-cache.1.ronn +7 -0
  60. data/lib/bundler/man/bundle-check.1 +1 -1
  61. data/lib/bundler/man/bundle-clean.1 +2 -2
  62. data/lib/bundler/man/bundle-clean.1.ronn +1 -1
  63. data/lib/bundler/man/bundle-config.1 +26 -7
  64. data/lib/bundler/man/bundle-config.1.ronn +17 -7
  65. data/lib/bundler/man/bundle-console.1 +53 -0
  66. data/lib/bundler/man/bundle-console.1.ronn +44 -0
  67. data/lib/bundler/man/bundle-doctor.1 +1 -1
  68. data/lib/bundler/man/bundle-exec.1 +6 -6
  69. data/lib/bundler/man/bundle-exec.1.ronn +6 -6
  70. data/lib/bundler/man/bundle-gem.1 +27 -37
  71. data/lib/bundler/man/bundle-gem.1.ronn +5 -5
  72. data/lib/bundler/man/bundle-help.1 +13 -0
  73. data/lib/bundler/man/bundle-help.1.ronn +12 -0
  74. data/lib/bundler/man/bundle-info.1 +1 -1
  75. data/lib/bundler/man/bundle-init.1 +1 -1
  76. data/lib/bundler/man/bundle-inject.1 +5 -2
  77. data/lib/bundler/man/bundle-inject.1.ronn +3 -1
  78. data/lib/bundler/man/bundle-install.1 +5 -30
  79. data/lib/bundler/man/bundle-install.1.ronn +6 -29
  80. data/lib/bundler/man/bundle-list.1 +1 -1
  81. data/lib/bundler/man/bundle-lock.1 +1 -1
  82. data/lib/bundler/man/bundle-open.1 +22 -2
  83. data/lib/bundler/man/bundle-open.1.ronn +9 -1
  84. data/lib/bundler/man/bundle-outdated.1 +1 -1
  85. data/lib/bundler/man/bundle-platform.1 +16 -6
  86. data/lib/bundler/man/bundle-platform.1.ronn +14 -7
  87. data/lib/bundler/man/bundle-plugin.1 +81 -0
  88. data/lib/bundler/man/bundle-plugin.1.ronn +59 -0
  89. data/lib/bundler/man/bundle-pristine.1 +1 -1
  90. data/lib/bundler/man/bundle-remove.1 +1 -1
  91. data/lib/bundler/man/bundle-show.1 +1 -1
  92. data/lib/bundler/man/bundle-update.1 +1 -1
  93. data/lib/bundler/man/bundle-version.1 +35 -0
  94. data/lib/bundler/man/bundle-version.1.ronn +24 -0
  95. data/lib/bundler/man/bundle-viz.1 +4 -1
  96. data/lib/bundler/man/bundle-viz.1.ronn +2 -0
  97. data/lib/bundler/man/bundle.1 +15 -10
  98. data/lib/bundler/man/bundle.1.ronn +12 -7
  99. data/lib/bundler/man/gemfile.5 +92 -81
  100. data/lib/bundler/man/gemfile.5.ronn +98 -85
  101. data/lib/bundler/man/index.txt +4 -0
  102. data/lib/bundler/match_metadata.rb +13 -0
  103. data/lib/bundler/match_platform.rb +0 -1
  104. data/lib/bundler/match_remote_metadata.rb +29 -0
  105. data/lib/bundler/mirror.rb +5 -7
  106. data/lib/bundler/plugin/api/source.rb +3 -3
  107. data/lib/bundler/plugin/index.rb +4 -4
  108. data/lib/bundler/plugin/installer/git.rb +0 -4
  109. data/lib/bundler/plugin/installer/rubygems.rb +0 -8
  110. data/lib/bundler/plugin.rb +2 -0
  111. data/lib/bundler/process_lock.rb +1 -1
  112. data/lib/bundler/remote_specification.rb +8 -9
  113. data/lib/bundler/resolver/base.rb +77 -0
  114. data/lib/bundler/resolver/candidate.rb +94 -0
  115. data/lib/bundler/resolver/incompatibility.rb +15 -0
  116. data/lib/bundler/resolver/package.rb +72 -0
  117. data/lib/bundler/resolver/root.rb +25 -0
  118. data/lib/bundler/resolver/spec_group.rb +42 -70
  119. data/lib/bundler/resolver.rb +322 -326
  120. data/lib/bundler/ruby_dsl.rb +1 -1
  121. data/lib/bundler/ruby_version.rb +5 -5
  122. data/lib/bundler/rubygems_ext.rb +102 -12
  123. data/lib/bundler/rubygems_gem_installer.rb +32 -20
  124. data/lib/bundler/rubygems_integration.rb +12 -34
  125. data/lib/bundler/runtime.rb +1 -6
  126. data/lib/bundler/settings.rb +2 -8
  127. data/lib/bundler/shared_helpers.rb +7 -7
  128. data/lib/bundler/source/git/git_proxy.rb +193 -67
  129. data/lib/bundler/source/git.rb +21 -25
  130. data/lib/bundler/source/metadata.rb +1 -2
  131. data/lib/bundler/source/path/installer.rb +1 -22
  132. data/lib/bundler/source/path.rb +6 -6
  133. data/lib/bundler/source/rubygems.rb +75 -117
  134. data/lib/bundler/source.rb +3 -4
  135. data/lib/bundler/source_list.rb +12 -2
  136. data/lib/bundler/spec_set.rb +52 -34
  137. data/lib/bundler/stub_specification.rb +5 -3
  138. data/lib/bundler/templates/Executable +1 -1
  139. data/lib/bundler/templates/Executable.bundler +4 -9
  140. data/lib/bundler/templates/Executable.standalone +2 -0
  141. data/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
  142. data/lib/bundler/templates/newgem/Gemfile.tt +3 -0
  143. data/lib/bundler/templates/newgem/README.md.tt +6 -4
  144. data/lib/bundler/templates/newgem/Rakefile.tt +2 -1
  145. data/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
  146. data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
  147. data/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
  148. data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
  149. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +10 -0
  150. data/lib/bundler/templates/newgem/gitignore.tt +3 -0
  151. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +13 -4
  152. data/lib/bundler/templates/newgem/newgem.gemspec.tt +8 -2
  153. data/lib/bundler/ui/shell.rb +35 -12
  154. data/lib/bundler/ui/silent.rb +21 -5
  155. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +3 -3
  156. data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +0 -1
  157. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +3 -1
  158. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1350 -408
  159. data/lib/bundler/vendor/net-http-persistent/README.rdoc +1 -1
  160. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +1 -1
  161. data/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
  162. data/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
  163. data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
  164. data/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
  165. data/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +151 -0
  166. data/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
  167. data/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
  168. data/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
  169. data/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
  170. data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +53 -0
  171. data/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
  172. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
  173. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +128 -0
  174. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +409 -0
  175. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +240 -0
  176. data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
  177. data/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
  178. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +1 -1
  179. data/lib/bundler/vendor/uri/lib/uri/common.rb +64 -16
  180. data/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
  181. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -1
  182. data/lib/bundler/vendor/uri/lib/uri/generic.rb +27 -7
  183. data/lib/bundler/vendor/uri/lib/uri/http.rb +40 -2
  184. data/lib/bundler/vendor/uri/lib/uri/https.rb +2 -1
  185. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +1 -1
  186. data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
  187. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -2
  188. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +13 -7
  189. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +10 -5
  190. data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
  191. data/lib/bundler/vendor/uri/lib/uri/ws.rb +1 -2
  192. data/lib/bundler/vendor/uri/lib/uri/wss.rb +2 -1
  193. data/lib/bundler/vendor/uri/lib/uri.rb +3 -2
  194. data/lib/bundler/vendored_persistent.rb +1 -33
  195. data/lib/bundler/{vendored_tmpdir.rb → vendored_pub_grub.rb} +1 -1
  196. data/lib/bundler/version.rb +5 -1
  197. data/lib/bundler/worker.rb +5 -7
  198. data/lib/bundler.rb +35 -69
  199. metadata +45 -34
  200. data/lib/bundler/dep_proxy.rb +0 -55
  201. data/lib/bundler/templates/newgem/travis.yml.tt +0 -6
  202. data/lib/bundler/vendor/molinillo/LICENSE +0 -9
  203. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
  204. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
  205. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
  206. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
  207. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
  208. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
  209. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
  210. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
  211. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
  212. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
  213. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
  214. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
  215. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -149
  216. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
  217. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
  218. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
  219. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
  220. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
  221. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
  222. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
  223. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
  224. data/lib/bundler/vendored_molinillo.rb +0 -4
  225. data/lib/bundler/version_ranges.rb +0 -122
  226. /data/lib/bundler/templates/newgem/ext/newgem/{extconf.rb.tt → extconf-c.rb.tt} +0 -0
@@ -15,7 +15,7 @@ module Bundler
15
15
  "test-unit" => "3.0",
16
16
  }.freeze
17
17
 
18
- attr_reader :options, :gem_name, :thor, :name, :target
18
+ attr_reader :options, :gem_name, :thor, :name, :target, :extension
19
19
 
20
20
  def initialize(options, gem_name, thor)
21
21
  @options = options
@@ -28,7 +28,11 @@ module Bundler
28
28
  @name = @gem_name
29
29
  @target = SharedHelpers.pwd.join(gem_name)
30
30
 
31
- validate_ext_name if options[:ext]
31
+ @extension = options[:ext]
32
+
33
+ validate_ext_name if @extension
34
+ validate_rust_builder_rubygems_version if @extension == "rust"
35
+ travis_removal_info
32
36
  end
33
37
 
34
38
  def run
@@ -55,21 +59,22 @@ module Bundler
55
59
  end
56
60
 
57
61
  config = {
58
- :name => name,
62
+ :name => name,
59
63
  :underscored_name => underscored_name,
60
- :namespaced_path => namespaced_path,
61
- :makefile_path => "#{underscored_name}/#{underscored_name}",
62
- :constant_name => constant_name,
63
- :constant_array => constant_array,
64
- :author => git_author_name.empty? ? "TODO: Write your name" : git_author_name,
65
- :email => git_user_email.empty? ? "TODO: Write your email address" : git_user_email,
66
- :test => options[:test],
67
- :ext => options[:ext],
68
- :exe => options[:exe],
69
- :bundler_version => bundler_dependency_version,
70
- :git => use_git,
71
- :github_username => github_username.empty? ? "[USERNAME]" : github_username,
64
+ :namespaced_path => namespaced_path,
65
+ :makefile_path => "#{underscored_name}/#{underscored_name}",
66
+ :constant_name => constant_name,
67
+ :constant_array => constant_array,
68
+ :author => git_author_name.empty? ? "TODO: Write your name" : git_author_name,
69
+ :email => git_user_email.empty? ? "TODO: Write your email address" : git_user_email,
70
+ :test => options[:test],
71
+ :ext => extension,
72
+ :exe => options[:exe],
73
+ :bundler_version => bundler_dependency_version,
74
+ :git => use_git,
75
+ :github_username => github_username.empty? ? "[USERNAME]" : github_username,
72
76
  :required_ruby_version => required_ruby_version,
77
+ :rust_builder_required_rubygems_version => rust_builder_required_rubygems_version,
73
78
  :minitest_constant_name => minitest_constant_name,
74
79
  }
75
80
  ensure_safe_gem_name(name, constant_array)
@@ -132,8 +137,6 @@ module Bundler
132
137
  case config[:ci]
133
138
  when "github"
134
139
  templates.merge!("github/workflows/main.yml.tt" => ".github/workflows/main.yml")
135
- when "travis"
136
- templates.merge!("travis.yml.tt" => ".travis.yml")
137
140
  when "gitlab"
138
141
  templates.merge!("gitlab-ci.yml.tt" => ".gitlab-ci.yml")
139
142
  when "circle"
@@ -188,14 +191,23 @@ module Bundler
188
191
 
189
192
  templates.merge!("exe/newgem.tt" => "exe/#{name}") if config[:exe]
190
193
 
191
- if options[:ext]
194
+ if extension == "c"
192
195
  templates.merge!(
193
- "ext/newgem/extconf.rb.tt" => "ext/#{name}/extconf.rb",
196
+ "ext/newgem/extconf-c.rb.tt" => "ext/#{name}/extconf.rb",
194
197
  "ext/newgem/newgem.h.tt" => "ext/#{name}/#{underscored_name}.h",
195
198
  "ext/newgem/newgem.c.tt" => "ext/#{name}/#{underscored_name}.c"
196
199
  )
197
200
  end
198
201
 
202
+ if extension == "rust"
203
+ templates.merge!(
204
+ "Cargo.toml.tt" => "Cargo.toml",
205
+ "ext/newgem/Cargo.toml.tt" => "ext/#{name}/Cargo.toml",
206
+ "ext/newgem/extconf-rust.rb.tt" => "ext/#{name}/extconf.rb",
207
+ "ext/newgem/src/lib.rs.tt" => "ext/#{name}/src/lib.rs",
208
+ )
209
+ end
210
+
199
211
  if target.exist? && !target.directory?
200
212
  Bundler.ui.error "Couldn't create a new gem named `#{gem_name}` because there's an existing file named `#{gem_name}`."
201
213
  exit Bundler::BundlerError.all_errors[Bundler::GenericSystemCallError]
@@ -270,7 +282,7 @@ module Bundler
270
282
  Bundler.ui.info hint_text("test")
271
283
 
272
284
  result = Bundler.ui.ask "Enter a test framework. rspec/minitest/test-unit/(none):"
273
- if result =~ /rspec|minitest|test-unit/
285
+ if /rspec|minitest|test-unit/.match?(result)
274
286
  test_framework = result
275
287
  else
276
288
  test_framework = false
@@ -306,12 +318,11 @@ module Bundler
306
318
  "* CircleCI: https://circleci.com/\n" \
307
319
  "* GitHub Actions: https://github.com/features/actions\n" \
308
320
  "* GitLab CI: https://docs.gitlab.com/ee/ci/\n" \
309
- "* Travis CI: https://travis-ci.org/\n" \
310
321
  "\n"
311
322
  Bundler.ui.info hint_text("ci")
312
323
 
313
- result = Bundler.ui.ask "Enter a CI service. github/travis/gitlab/circle/(none):"
314
- if result =~ /github|travis|gitlab|circle/
324
+ result = Bundler.ui.ask "Enter a CI service. github/gitlab/circle/(none):"
325
+ if /github|gitlab|circle/.match?(result)
315
326
  ci_template = result
316
327
  else
317
328
  ci_template = false
@@ -342,7 +353,7 @@ module Bundler
342
353
  Bundler.ui.info hint_text("linter")
343
354
 
344
355
  result = Bundler.ui.ask "Enter a linter. rubocop/standard/(none):"
345
- if result =~ /rubocop|standard/
356
+ if /rubocop|standard/.match?(result)
346
357
  linter_template = result
347
358
  else
348
359
  linter_template = false
@@ -389,7 +400,7 @@ module Bundler
389
400
  end
390
401
 
391
402
  def ensure_safe_gem_name(name, constant_array)
392
- if name =~ /^\d/
403
+ if /^\d/.match?(name)
393
404
  Bundler.ui.error "Invalid gem name #{name} Please give a name which does not start with numbers."
394
405
  exit 1
395
406
  end
@@ -415,28 +426,39 @@ module Bundler
415
426
  thor.run(%(#{editor} "#{file}"))
416
427
  end
417
428
 
429
+ def rust_builder_required_rubygems_version
430
+ "3.3.11"
431
+ end
432
+
418
433
  def required_ruby_version
419
- if Gem.ruby_version < Gem::Version.new("2.4.a") then "2.3.0"
420
- elsif Gem.ruby_version < Gem::Version.new("2.5.a") then "2.4.0"
421
- elsif Gem.ruby_version < Gem::Version.new("2.6.a") then "2.5.0"
422
- else
423
- "2.6.0"
424
- end
434
+ "2.6.0"
425
435
  end
426
436
 
427
437
  def rubocop_version
428
- if Gem.ruby_version < Gem::Version.new("2.4.a") then "0.81.0"
429
- elsif Gem.ruby_version < Gem::Version.new("2.5.a") then "1.12"
430
- else
431
- "1.21"
432
- end
438
+ "1.21"
433
439
  end
434
440
 
435
441
  def standard_version
436
- if Gem.ruby_version < Gem::Version.new("2.4.a") then "0.2.5"
437
- elsif Gem.ruby_version < Gem::Version.new("2.5.a") then "1.0"
438
- else
439
- "1.3"
442
+ "1.3"
443
+ end
444
+
445
+ # TODO: remove at next minor release
446
+ def travis_removal_info
447
+ if options[:ci] == "travis"
448
+ Bundler.ui.error "Support for Travis CI was removed from gem skeleton generator."
449
+ exit 1
450
+ end
451
+
452
+ if Bundler.settings["gem.ci"] == "travis"
453
+ Bundler.ui.error "Support for Travis CI was removed from gem skeleton generator, but it is present in bundle config. Please configure another provider using `bundle config set gem.ci SERVICE` (where SERVICE is one of github/gitlab/circle) or unset configuration using `bundle config unset gem.ci`."
454
+ exit 1
455
+ end
456
+ end
457
+
458
+ def validate_rust_builder_rubygems_version
459
+ if Gem::Version.new(rust_builder_required_rubygems_version) > Gem.rubygems_version
460
+ Bundler.ui.error "Your RubyGems version (#{Gem.rubygems_version}) is too old to build Rust extension. Please update your RubyGems using `gem update --system` or any other way and try again."
461
+ exit 1
440
462
  end
441
463
  end
442
464
  end
@@ -32,7 +32,11 @@ module Bundler
32
32
  file << spec.to_gemfile
33
33
  end
34
34
  else
35
- FileUtils.cp(File.expand_path("../templates/#{gemfile}", __dir__), gemfile)
35
+ File.open(File.expand_path("../templates/#{gemfile}", __dir__), "r") do |template|
36
+ File.open(gemfile, "wb") do |destination|
37
+ IO.copy_stream(template, destination)
38
+ end
39
+ end
36
40
  end
37
41
 
38
42
  puts "Writing new #{gemfile} to #{SharedHelpers.pwd}/#{gemfile}"
@@ -94,9 +94,8 @@ module Bundler
94
94
 
95
95
  def warn_if_root
96
96
  return if Bundler.settings[:silence_root_warning] || Gem.win_platform? || !Process.uid.zero?
97
- Bundler.ui.warn "Don't run Bundler as root. Bundler can ask for sudo " \
98
- "if it is needed, and installing your bundle as root will break this " \
99
- "application for all non-root users on this machine.", :wrap => true
97
+ Bundler.ui.warn "Don't run Bundler as root. Installing your bundle as root " \
98
+ "will break this application for all non-root users on this machine.", :wrap => true
100
99
  end
101
100
 
102
101
  def dependencies_count_for(definition)
@@ -147,8 +146,11 @@ module Bundler
147
146
  def normalize_settings
148
147
  Bundler.settings.set_command_option :path, nil if options[:system]
149
148
  Bundler.settings.set_command_option_if_given :path, options[:path]
150
- Bundler.settings.temporary(:path_relative_to_cwd => false) do
151
- Bundler.settings.set_command_option :path, "bundle" if options["standalone"] && Bundler.settings[:path].nil?
149
+
150
+ if options["standalone"] && Bundler.settings[:path].nil? && !options["local"]
151
+ Bundler.settings.temporary(:path_relative_to_cwd => false) do
152
+ Bundler.settings.set_command_option :path, "bundle"
153
+ end
152
154
  end
153
155
 
154
156
  bin_option = options["binstubs"]
@@ -15,19 +15,22 @@ module Bundler
15
15
  end
16
16
 
17
17
  print = options[:print]
18
- ui = Bundler.ui
19
- Bundler.ui = UI::Silent.new if print
18
+ previous_ui_level = Bundler.ui.level
19
+ Bundler.ui.level = "silent" if print
20
20
 
21
21
  Bundler::Fetcher.disable_endpoint = options["full-index"]
22
22
 
23
23
  update = options[:update]
24
24
  conservative = options[:conservative]
25
+ bundler = options[:bundler]
25
26
 
26
27
  if update.is_a?(Array) # unlocking specific gems
27
28
  Bundler::CLI::Common.ensure_all_gems_in_lockfile!(update)
28
29
  update = { :gems => update, :conservative => conservative }
29
- elsif update
30
- update = { :conservative => conservative } if conservative
30
+ elsif update && conservative
31
+ update = { :conservative => conservative }
32
+ elsif update && bundler
33
+ update = { :bundler => bundler }
31
34
  end
32
35
  definition = Bundler.definition(update)
33
36
 
@@ -61,7 +64,7 @@ module Bundler
61
64
  definition.lock(file)
62
65
  end
63
66
 
64
- Bundler.ui = ui
67
+ Bundler.ui.level = previous_ui_level
65
68
  end
66
69
  end
67
70
  end
@@ -2,23 +2,25 @@
2
2
 
3
3
  module Bundler
4
4
  class CLI::Open
5
- attr_reader :options, :name
5
+ attr_reader :options, :name, :path
6
6
  def initialize(options, name)
7
7
  @options = options
8
8
  @name = name
9
+ @path = options[:path] unless options[:path].nil?
9
10
  end
10
11
 
11
12
  def run
13
+ raise InvalidOption, "Cannot specify `--path` option without a value" if !@path.nil? && @path.empty?
12
14
  editor = [ENV["BUNDLER_EDITOR"], ENV["VISUAL"], ENV["EDITOR"]].find {|e| !e.nil? && !e.empty? }
13
15
  return Bundler.ui.info("To open a bundled gem, set $EDITOR or $BUNDLER_EDITOR") unless editor
14
16
  return unless spec = Bundler::CLI::Common.select_spec(name, :regex_match)
15
17
  if spec.default_gem?
16
18
  Bundler.ui.info "Unable to open #{name} because it's a default gem, so the directory it would normally be installed to does not exist."
17
19
  else
18
- path = spec.full_gem_path
19
- Dir.chdir(path) do
20
+ root_path = spec.full_gem_path
21
+ Dir.chdir(root_path) do
20
22
  require "shellwords"
21
- command = Shellwords.split(editor) + [path]
23
+ command = Shellwords.split(editor) << File.join([root_path, path].compact)
22
24
  Bundler.with_original_env do
23
25
  system(*command)
24
26
  end || Bundler.ui.info("Could not run '#{command.join(" ")}'")
@@ -46,7 +46,7 @@ module Bundler
46
46
 
47
47
  Bundler::CLI::Common.configure_gem_version_promoter(
48
48
  Bundler.definition,
49
- options
49
+ options.merge(:strict => @strict)
50
50
  )
51
51
 
52
52
  definition_resolution = proc do
@@ -111,9 +111,7 @@ module Bundler
111
111
  end.compact
112
112
 
113
113
  if options[:parseable]
114
- relevant_outdated_gems.each do |gems|
115
- print_gems(gems)
116
- end
114
+ print_gems(relevant_outdated_gems)
117
115
  else
118
116
  print_gems_table(relevant_outdated_gems)
119
117
  end
@@ -129,6 +127,12 @@ module Bundler
129
127
 
130
128
  private
131
129
 
130
+ def loaded_from_for(spec)
131
+ return unless spec.respond_to?(:loaded_from)
132
+
133
+ spec.loaded_from
134
+ end
135
+
132
136
  def groups_text(group_text, groups)
133
137
  "#{group_text}#{groups.split(",").size > 1 ? "s" : ""} \"#{groups}\""
134
138
  end
@@ -184,7 +188,10 @@ module Bundler
184
188
 
185
189
  def print_gem(current_spec, active_spec, dependency, groups)
186
190
  spec_version = "#{active_spec.version}#{active_spec.git_version}"
187
- spec_version += " (from #{active_spec.loaded_from})" if Bundler.ui.debug? && active_spec.loaded_from
191
+ if Bundler.ui.debug?
192
+ loaded_from = loaded_from_for(active_spec)
193
+ spec_version += " (from #{loaded_from})" if loaded_from
194
+ end
188
195
  current_version = "#{current_spec.version}#{current_spec.git_version}"
189
196
 
190
197
  if dependency && dependency.specific?
@@ -211,7 +218,7 @@ module Bundler
211
218
  dependency = dependency.requirement if dependency
212
219
 
213
220
  ret_val = [active_spec.name, current_version, spec_version, dependency.to_s, groups.to_s]
214
- ret_val << active_spec.loaded_from.to_s if Bundler.ui.debug?
221
+ ret_val << loaded_from_for(active_spec).to_s if Bundler.ui.debug?
215
222
  ret_val
216
223
  end
217
224
 
@@ -9,7 +9,7 @@ module Bundler
9
9
 
10
10
  def run
11
11
  platforms, ruby_version = Bundler.ui.silence do
12
- locked_ruby_version = Bundler.locked_gems && Bundler.locked_gems.ruby_version
12
+ locked_ruby_version = Bundler.locked_gems && Bundler.locked_gems.ruby_version&.gsub(/p\d+\Z/, "")
13
13
  gemfile_ruby_version = Bundler.definition.ruby_version && Bundler.definition.ruby_version.single_version_string
14
14
  [Bundler.definition.platforms.map {|p| "* #{p}" },
15
15
  locked_ruby_version || gemfile_ruby_version]
@@ -23,7 +23,7 @@ module Bundler
23
23
  Bundler.ui.warn "Make sure you have the graphviz ruby gem. You can install it with:"
24
24
  Bundler.ui.warn "`gem install ruby-graphviz`"
25
25
  rescue StandardError => e
26
- raise unless e.message =~ /GraphViz not installed or dot not in PATH/
26
+ raise unless e.message.to_s.include?("GraphViz not installed or dot not in PATH")
27
27
  Bundler.ui.error e.message
28
28
  Bundler.ui.warn "Please install GraphViz. On a Mac with Homebrew, you can run `brew install graphviz`."
29
29
  end
data/lib/bundler/cli.rb CHANGED
@@ -10,6 +10,7 @@ module Bundler
10
10
 
11
11
  AUTO_INSTALL_CMDS = %w[show binstubs outdated exec open console licenses clean].freeze
12
12
  PARSEABLE_COMMANDS = %w[check config help exec platform show version].freeze
13
+ EXTENSIONS = ["c", "rust"].freeze
13
14
 
14
15
  COMMAND_ALIASES = {
15
16
  "check" => "c",
@@ -22,6 +23,8 @@ module Bundler
22
23
  }.freeze
23
24
 
24
25
  def self.start(*)
26
+ check_deprecated_ext_option(ARGV) if ARGV.include?("--ext")
27
+
25
28
  super
26
29
  ensure
27
30
  Bundler::SharedHelpers.print_major_deprecations!
@@ -218,6 +221,8 @@ module Bundler
218
221
  "Specify the number of jobs to run in parallel"
219
222
  method_option "local", :type => :boolean, :banner =>
220
223
  "Do not attempt to fetch gems remotely and use the gem cache instead"
224
+ method_option "prefer-local", :type => :boolean, :banner =>
225
+ "Only attempt to fetch gems remotely if not present locally, even if newer versions are available remotely"
221
226
  method_option "no-cache", :type => :boolean, :banner =>
222
227
  "Don't update the existing gem cache."
223
228
  method_option "redownload", :type => :boolean, :aliases => "--force", :banner =>
@@ -236,7 +241,7 @@ module Bundler
236
241
  "Install to the system location ($BUNDLE_PATH or $GEM_HOME) even if the bundle was previously installed somewhere else for this application"
237
242
  method_option "trust-policy", :alias => "P", :type => :string, :banner =>
238
243
  "Gem trust policy (like gem install -P). Must be one of " +
239
- Bundler.rubygems.security_policy_keys.join("|")
244
+ Bundler.rubygems.security_policy_keys.join("|")
240
245
  method_option "without", :type => :array, :banner =>
241
246
  "Exclude gems that are part of the specified named group."
242
247
  method_option "with", :type => :array, :banner =>
@@ -290,6 +295,8 @@ module Bundler
290
295
  "Prefer updating only to next minor version"
291
296
  method_option "major", :type => :boolean, :banner =>
292
297
  "Prefer updating to next major version (default)"
298
+ method_option "pre", :type => :boolean, :banner =>
299
+ "Always choose the highest allowed version when updating gems, regardless of prerelease status"
293
300
  method_option "strict", :type => :boolean, :banner =>
294
301
  "Do not allow any gem to be updated past latest --patch | --minor | --major"
295
302
  method_option "conservative", :type => :boolean, :banner =>
@@ -370,6 +377,7 @@ module Bundler
370
377
  method_option "group", :aliases => "-g", :type => :string
371
378
  method_option "source", :aliases => "-s", :type => :string
372
379
  method_option "require", :aliases => "-r", :type => :string, :banner => "Adds require path to gem. Provide false, or a path as a string."
380
+ method_option "path", :type => :string
373
381
  method_option "git", :type => :string
374
382
  method_option "github", :type => :string
375
383
  method_option "branch", :type => :string
@@ -399,9 +407,9 @@ module Bundler
399
407
  "Do not attempt to fetch gems remotely and use the gem cache instead"
400
408
  method_option "pre", :type => :boolean, :banner => "Check for newer pre-release gems"
401
409
  method_option "source", :type => :array, :banner => "Check against a specific source"
402
- method_option "filter-strict", :type => :boolean, :banner =>
410
+ method_option "filter-strict", :type => :boolean, :aliases => "--strict", :banner =>
403
411
  "Only list newer versions allowed by your Gemfile requirements"
404
- method_option "strict", :type => :boolean, :aliases => "--update-strict", :banner =>
412
+ method_option "update-strict", :type => :boolean, :banner =>
405
413
  "Strict conservative resolution, do not allow any gem to be updated past latest --patch | --minor | --major"
406
414
  method_option "minor", :type => :boolean, :banner => "Prefer updating only to next minor version"
407
415
  method_option "major", :type => :boolean, :banner => "Prefer updating to next major version (default)"
@@ -501,6 +509,7 @@ module Bundler
501
509
  subcommand "config", Config
502
510
 
503
511
  desc "open GEM", "Opens the source directory of the given bundled gem"
512
+ method_option "path", :type => :string, :lazy_default => "", :banner => "Open relative path of the gem source."
504
513
  def open(name)
505
514
  require_relative "cli/open"
506
515
  Open.new(options, name).run
@@ -514,7 +523,7 @@ module Bundler
514
523
  end
515
524
  end
516
525
 
517
- desc "version", "Prints the bundler's version information"
526
+ desc "version", "Prints Bundler version information"
518
527
  def version
519
528
  cli_help = current_command.name == "cli_help"
520
529
  if cli_help || ARGV.include?("version")
@@ -571,7 +580,7 @@ module Bundler
571
580
  method_option :edit, :type => :string, :aliases => "-e", :required => false, :banner => "EDITOR",
572
581
  :lazy_default => [ENV["BUNDLER_EDITOR"], ENV["VISUAL"], ENV["EDITOR"]].find {|e| !e.nil? && !e.empty? },
573
582
  :desc => "Open generated gemspec in the specified editor (defaults to $EDITOR or $BUNDLER_EDITOR)"
574
- method_option :ext, :type => :boolean, :default => false, :desc => "Generate the boilerplate for C extension code"
583
+ method_option :ext, :type => :string, :desc => "Generate the boilerplate for C extension code.", :enum => EXTENSIONS
575
584
  method_option :git, :type => :boolean, :default => true, :desc => "Initialize a git repo inside your library."
576
585
  method_option :mit, :type => :boolean, :desc => "Generate an MIT license file. Set a default with `bundle config set --global gem.mit true`."
577
586
  method_option :rubocop, :type => :boolean, :desc => "Add rubocop to the generated Rakefile and gemspec. Set a default with `bundle config set --global gem.rubocop true`."
@@ -579,7 +588,7 @@ module Bundler
579
588
  method_option :test, :type => :string, :lazy_default => Bundler.settings["gem.test"] || "", :aliases => "-t", :banner => "Use the specified test framework for your library",
580
589
  :desc => "Generate a test directory for your library, either rspec, minitest or test-unit. Set a default with `bundle config set --global gem.test (rspec|minitest|test-unit)`."
581
590
  method_option :ci, :type => :string, :lazy_default => Bundler.settings["gem.ci"] || "",
582
- :desc => "Generate CI configuration, either GitHub Actions, Travis CI, GitLab CI or CircleCI. Set a default with `bundle config set --global gem.ci (github|travis|gitlab|circle)`"
591
+ :desc => "Generate CI configuration, either GitHub Actions, GitLab CI or CircleCI. Set a default with `bundle config set --global gem.ci (github|gitlab|circle)`"
583
592
  method_option :linter, :type => :string, :lazy_default => Bundler.settings["gem.linter"] || "",
584
593
  :desc => "Add a linter and code formatter, either RuboCop or Standard. Set a default with `bundle config set --global gem.linter (rubocop|standard)`"
585
594
  method_option :github_username, :type => :string, :default => Bundler.settings["gem.github_username"], :banner => "Set your username on GitHub", :desc => "Fill in GitHub username on README so that you don't have to do it manually. Set a default with `bundle config set --global gem.github_username <your_username>`."
@@ -617,7 +626,7 @@ module Bundler
617
626
  method_option "dry-run", :type => :boolean, :default => false, :banner =>
618
627
  "Only print out changes, do not clean gems"
619
628
  method_option "force", :type => :boolean, :default => false, :banner =>
620
- "Forces clean even if --path is not set"
629
+ "Forces cleaning up unused gems even if Bundler is configured to use globally installed gems. As a consequence, removes all system gems except for the ones in the current application."
621
630
  def clean
622
631
  require_relative "cli/clean"
623
632
  Clean.new(options.dup).run
@@ -665,10 +674,14 @@ module Bundler
665
674
  "If updating, prefer updating only to next minor version"
666
675
  method_option "major", :type => :boolean, :banner =>
667
676
  "If updating, prefer updating to next major version (default)"
677
+ method_option "pre", :type => :boolean, :banner =>
678
+ "If updating, always choose the highest allowed version, regardless of prerelease status"
668
679
  method_option "strict", :type => :boolean, :banner =>
669
680
  "If updating, do not allow any gem to be updated past latest --patch | --minor | --major"
670
681
  method_option "conservative", :type => :boolean, :banner =>
671
682
  "If updating, use bundle install conservative update behavior and do not allow shared dependencies to be updated"
683
+ method_option "bundler", :type => :string, :lazy_default => "> 0.a", :banner =>
684
+ "Update the locked version of bundler"
672
685
  def lock
673
686
  require_relative "cli/lock"
674
687
  Lock.new(options).run
@@ -746,6 +759,38 @@ module Bundler
746
759
  end
747
760
  end
748
761
 
762
+ def self.check_deprecated_ext_option(arguments)
763
+ # when deprecated version of `--ext` is called
764
+ # print out deprecation warning and pretend `--ext=c` was provided
765
+ if deprecated_ext_value?(arguments)
766
+ SharedHelpers.major_deprecation 2, "Extensions can now be generated using C or Rust, so `--ext` with no arguments has been deprecated. Please select a language, e.g. `--ext=rust` to generate a Rust extension. This gem will now be generated as if `--ext=c` was used."
767
+ arguments[arguments.index("--ext")] = "--ext=c"
768
+ end
769
+ end
770
+
771
+ def self.deprecated_ext_value?(arguments)
772
+ index = arguments.index("--ext")
773
+ next_argument = arguments[index+1]
774
+
775
+ # it is ok when --ext is followed with valid extension value
776
+ # for example `bundle gem hello --ext c`
777
+ return false if EXTENSIONS.include?(next_argument)
778
+
779
+ # deprecated call when --ext is called with no value in last position
780
+ # for example `bundle gem hello_gem --ext`
781
+ return true if next_argument.nil?
782
+
783
+ # deprecated call when --ext is followed by other parameter
784
+ # for example `bundle gem --ext --no-ci hello_gem`
785
+ return true if next_argument.start_with?("-")
786
+
787
+ # deprecated call when --ext is followed by gem name
788
+ # for example `bundle gem --ext hello_gem`
789
+ return true if next_argument
790
+
791
+ false
792
+ end
793
+
749
794
  private
750
795
 
751
796
  # Automatically invoke `bundle install` and resume if
@@ -68,7 +68,7 @@ module Bundler
68
68
 
69
69
  def info_path(name)
70
70
  name = name.to_s
71
- if name =~ /[^a-z0-9_-]/
71
+ if /[^a-z0-9_-]/.match?(name)
72
72
  name += "-#{SharedHelpers.digest(:MD5).hexdigest(name).downcase}"
73
73
  info_roots.last.join(name)
74
74
  else