bundler 2.1.2 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of bundler might be problematic. Click here for more details.

Files changed (208) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1575 -1422
  3. data/README.md +6 -8
  4. data/bundler.gemspec +3 -3
  5. data/exe/bundle +3 -0
  6. data/lib/bundler.rb +25 -7
  7. data/lib/bundler/build_metadata.rb +3 -11
  8. data/lib/bundler/cli.rb +58 -21
  9. data/lib/bundler/cli/add.rb +1 -1
  10. data/lib/bundler/cli/binstubs.rb +6 -2
  11. data/lib/bundler/cli/cache.rb +1 -7
  12. data/lib/bundler/cli/clean.rb +1 -1
  13. data/lib/bundler/cli/common.rb +14 -0
  14. data/lib/bundler/cli/console.rb +1 -1
  15. data/lib/bundler/cli/doctor.rb +1 -1
  16. data/lib/bundler/cli/exec.rb +4 -4
  17. data/lib/bundler/cli/fund.rb +36 -0
  18. data/lib/bundler/cli/gem.rb +84 -11
  19. data/lib/bundler/cli/info.rb +15 -4
  20. data/lib/bundler/cli/init.rb +2 -2
  21. data/lib/bundler/cli/inject.rb +1 -1
  22. data/lib/bundler/cli/install.rb +12 -18
  23. data/lib/bundler/cli/issue.rb +2 -2
  24. data/lib/bundler/cli/list.rb +12 -10
  25. data/lib/bundler/cli/outdated.rb +88 -67
  26. data/lib/bundler/cli/plugin.rb +10 -0
  27. data/lib/bundler/cli/pristine.rb +5 -0
  28. data/lib/bundler/cli/show.rb +1 -1
  29. data/lib/bundler/cli/update.rb +2 -0
  30. data/lib/bundler/compact_index_client.rb +1 -1
  31. data/lib/bundler/compact_index_client/cache.rb +1 -1
  32. data/lib/bundler/compact_index_client/updater.rb +5 -5
  33. data/lib/bundler/definition.rb +47 -61
  34. data/lib/bundler/dep_proxy.rb +1 -1
  35. data/lib/bundler/dependency.rb +0 -9
  36. data/lib/bundler/dsl.rb +5 -9
  37. data/lib/bundler/endpoint_specification.rb +1 -1
  38. data/lib/bundler/env.rb +1 -1
  39. data/lib/bundler/environment_preserver.rb +26 -2
  40. data/lib/bundler/errors.rb +1 -0
  41. data/lib/bundler/feature_flag.rb +0 -3
  42. data/lib/bundler/fetcher.rb +4 -3
  43. data/lib/bundler/fetcher/base.rb +1 -1
  44. data/lib/bundler/fetcher/compact_index.rb +1 -1
  45. data/lib/bundler/fetcher/downloader.rb +1 -1
  46. data/lib/bundler/fetcher/index.rb +3 -4
  47. data/lib/bundler/friendly_errors.rb +22 -13
  48. data/lib/bundler/gem_helper.rb +33 -19
  49. data/lib/bundler/gem_helpers.rb +6 -1
  50. data/lib/bundler/gem_version_promoter.rb +2 -2
  51. data/lib/bundler/graph.rb +1 -1
  52. data/lib/bundler/index.rb +6 -2
  53. data/lib/bundler/injector.rb +22 -4
  54. data/lib/bundler/inline.rb +2 -2
  55. data/lib/bundler/installer.rb +35 -32
  56. data/lib/bundler/installer/gem_installer.rb +3 -3
  57. data/lib/bundler/installer/parallel_installer.rb +10 -10
  58. data/lib/bundler/installer/standalone.rb +2 -2
  59. data/lib/bundler/lazy_specification.rb +20 -9
  60. data/lib/bundler/lockfile_generator.rb +1 -1
  61. data/lib/bundler/lockfile_parser.rb +1 -1
  62. data/lib/bundler/man/.document +1 -0
  63. data/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +0 -0
  64. data/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +2 -4
  65. data/{man/bundle-cache.ronn → lib/bundler/man/bundle-cache.1.ronn} +0 -0
  66. data/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
  67. data/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +0 -0
  68. data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +19 -30
  69. data/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
  70. data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +0 -0
  71. data/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +30 -7
  72. data/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +0 -0
  73. data/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +0 -0
  74. data/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +0 -0
  75. data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +25 -3
  76. data/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
  77. data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
  78. data/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +0 -0
  79. data/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +0 -0
  80. data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +0 -0
  81. data/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
  82. data/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
  83. data/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
  84. data/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +0 -0
  85. data/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +0 -0
  86. data/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +0 -0
  87. data/{man → lib/bundler/man}/gemfile.5.ronn +4 -4
  88. data/lib/bundler/mirror.rb +2 -2
  89. data/lib/bundler/plugin.rb +30 -5
  90. data/lib/bundler/plugin/api/source.rb +1 -1
  91. data/lib/bundler/plugin/dsl.rb +1 -1
  92. data/lib/bundler/plugin/index.rb +10 -1
  93. data/lib/bundler/plugin/installer.rb +1 -1
  94. data/lib/bundler/plugin/installer/rubygems.rb +1 -1
  95. data/lib/bundler/plugin/source_list.rb +1 -1
  96. data/lib/bundler/psyched_yaml.rb +0 -15
  97. data/lib/bundler/remote_specification.rb +5 -2
  98. data/lib/bundler/resolver.rb +32 -10
  99. data/lib/bundler/resolver/spec_group.rb +27 -6
  100. data/lib/bundler/retry.rb +1 -1
  101. data/lib/bundler/ruby_version.rb +1 -1
  102. data/lib/bundler/rubygems_ext.rb +53 -9
  103. data/lib/bundler/rubygems_gem_installer.rb +3 -9
  104. data/lib/bundler/rubygems_integration.rb +26 -55
  105. data/lib/bundler/runtime.rb +4 -14
  106. data/lib/bundler/settings.rb +49 -46
  107. data/lib/bundler/shared_helpers.rb +2 -2
  108. data/lib/bundler/similarity_detector.rb +1 -1
  109. data/lib/bundler/source.rb +1 -1
  110. data/lib/bundler/source/git.rb +5 -5
  111. data/lib/bundler/source/git/git_proxy.rb +57 -60
  112. data/lib/bundler/source/path.rb +7 -3
  113. data/lib/bundler/source/path/installer.rb +8 -10
  114. data/lib/bundler/source/rubygems.rb +13 -16
  115. data/lib/bundler/source/rubygems/remote.rb +1 -1
  116. data/lib/bundler/source_list.rb +2 -2
  117. data/lib/bundler/spec_set.rb +2 -1
  118. data/lib/bundler/stub_specification.rb +17 -5
  119. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  120. data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
  121. data/lib/bundler/templates/newgem/README.md.tt +1 -2
  122. data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
  123. data/lib/bundler/templates/newgem/bin/console.tt +1 -0
  124. data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  125. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  126. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -0
  127. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  128. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
  129. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  130. data/lib/bundler/templates/newgem/newgem.gemspec.tt +14 -6
  131. data/lib/bundler/templates/newgem/rubocop.yml.tt +10 -0
  132. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  133. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
  134. data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
  135. data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
  136. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  137. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  138. data/lib/bundler/ui/shell.rb +5 -5
  139. data/lib/bundler/uri_credentials_filter.rb +3 -1
  140. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
  141. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +34 -1
  142. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
  143. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +1 -1
  144. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  145. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +38 -40
  146. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +72 -208
  147. data/lib/bundler/vendor/thor/lib/thor.rb +0 -7
  148. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  149. data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
  150. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  151. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
  152. data/lib/bundler/vendored_persistent.rb +0 -7
  153. data/lib/bundler/vendored_tmpdir.rb +4 -0
  154. data/lib/bundler/version.rb +1 -1
  155. data/lib/bundler/worker.rb +1 -1
  156. data/lib/bundler/yaml_serializer.rb +1 -1
  157. data/man/bundle-add.1 +1 -1
  158. data/man/bundle-binstubs.1 +5 -3
  159. data/man/bundle-cache.1 +1 -1
  160. data/man/bundle-check.1 +1 -1
  161. data/man/bundle-clean.1 +1 -1
  162. data/man/bundle-config.1 +16 -25
  163. data/man/bundle-doctor.1 +1 -1
  164. data/man/bundle-exec.1 +1 -1
  165. data/man/bundle-gem.1 +25 -3
  166. data/man/bundle-info.1 +1 -1
  167. data/man/bundle-init.1 +1 -1
  168. data/man/bundle-inject.1 +1 -1
  169. data/man/bundle-install.1 +30 -3
  170. data/man/bundle-list.1 +7 -7
  171. data/man/bundle-lock.1 +1 -1
  172. data/man/bundle-open.1 +1 -1
  173. data/man/bundle-outdated.1 +1 -1
  174. data/man/bundle-platform.1 +1 -1
  175. data/man/bundle-pristine.1 +1 -1
  176. data/man/bundle-remove.1 +1 -1
  177. data/man/bundle-show.1 +1 -1
  178. data/man/bundle-update.1 +1 -1
  179. data/man/bundle-viz.1 +1 -1
  180. data/man/bundle.1 +1 -1
  181. data/man/gemfile.5 +4 -4
  182. metadata +46 -62
  183. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
  184. data/man/bundle-add.1.txt +0 -58
  185. data/man/bundle-binstubs.1.txt +0 -48
  186. data/man/bundle-cache.1.txt +0 -78
  187. data/man/bundle-check.1.txt +0 -33
  188. data/man/bundle-clean.1.txt +0 -26
  189. data/man/bundle-config.1.txt +0 -528
  190. data/man/bundle-doctor.1.txt +0 -44
  191. data/man/bundle-exec.1.txt +0 -178
  192. data/man/bundle-gem.1.txt +0 -91
  193. data/man/bundle-info.1.txt +0 -21
  194. data/man/bundle-init.1.txt +0 -34
  195. data/man/bundle-inject.1.txt +0 -32
  196. data/man/bundle-install.1.txt +0 -401
  197. data/man/bundle-list.1.txt +0 -43
  198. data/man/bundle-lock.1.txt +0 -93
  199. data/man/bundle-open.1.txt +0 -29
  200. data/man/bundle-outdated.1.txt +0 -131
  201. data/man/bundle-platform.1.txt +0 -57
  202. data/man/bundle-pristine.1.txt +0 -44
  203. data/man/bundle-remove.1.txt +0 -34
  204. data/man/bundle-show.1.txt +0 -27
  205. data/man/bundle-update.1.txt +0 -390
  206. data/man/bundle-viz.1.txt +0 -39
  207. data/man/bundle.1.txt +0 -116
  208. data/man/gemfile.5.txt +0 -649
@@ -34,7 +34,7 @@ module Bundler
34
34
  end
35
35
  end
36
36
 
37
- private
37
+ private
38
38
 
39
39
  def validate_cmd!
40
40
  return unless cmd.nil?
@@ -63,10 +63,10 @@ module Bundler
63
63
  Kernel.load(file)
64
64
  rescue SystemExit, SignalException
65
65
  raise
66
- rescue Exception => e # rubocop:disable Lint/RescueException
66
+ rescue Exception # rubocop:disable Lint/RescueException
67
67
  Bundler.ui.error "bundler: failed to load command: #{cmd} (#{file})"
68
- backtrace = e.backtrace ? e.backtrace.take_while {|bt| !bt.start_with?(__FILE__) } : []
69
- abort "#{e.class}: #{e.message}\n #{backtrace.join("\n ")}"
68
+ Bundler::FriendlyErrors.disable!
69
+ raise
70
70
  end
71
71
 
72
72
  def process_title(file, args)
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class CLI::Fund
5
+ attr_reader :options
6
+
7
+ def initialize(options)
8
+ @options = options
9
+ end
10
+
11
+ def run
12
+ Bundler.definition.validate_runtime!
13
+
14
+ groups = Array(options[:group]).map(&:to_sym)
15
+
16
+ deps = if groups.any?
17
+ Bundler.definition.dependencies_for(groups)
18
+ else
19
+ Bundler.definition.current_dependencies
20
+ end
21
+
22
+ fund_info = deps.each_with_object([]) do |dep, arr|
23
+ spec = Bundler.definition.specs[dep.name].first
24
+ if spec.metadata.key?("funding_uri")
25
+ arr << "* #{spec.name} (#{spec.version})\n Funding: #{spec.metadata["funding_uri"]}"
26
+ end
27
+ end
28
+
29
+ if fund_info.empty?
30
+ Bundler.ui.info "None of the installed gems you directly depend on are looking for funding."
31
+ else
32
+ Bundler.ui.info fund_info.join("\n")
33
+ end
34
+ end
35
+ end
36
+ end
@@ -12,6 +12,7 @@ module Bundler
12
12
  TEST_FRAMEWORK_VERSIONS = {
13
13
  "rspec" => "3.0",
14
14
  "minitest" => "5.0",
15
+ "test-unit" => "3.0",
15
16
  }.freeze
16
17
 
17
18
  attr_reader :options, :gem_name, :thor, :name, :target
@@ -62,7 +63,7 @@ module Bundler
62
63
  ensure_safe_gem_name(name, constant_array)
63
64
 
64
65
  templates = {
65
- "Gemfile.tt" => "Gemfile",
66
+ "#{Bundler.preferred_gemfile_name}.tt" => Bundler.preferred_gemfile_name,
66
67
  "lib/newgem.rb.tt" => "lib/#{namespaced_path}.rb",
67
68
  "lib/newgem/version.rb.tt" => "lib/#{namespaced_path}/version.rb",
68
69
  "newgem.gemspec.tt" => "#{name}.gemspec",
@@ -83,8 +84,6 @@ module Bundler
83
84
  config[:test] = test_framework
84
85
  config[:test_framework_version] = TEST_FRAMEWORK_VERSIONS[test_framework]
85
86
 
86
- templates.merge!("travis.yml.tt" => ".travis.yml")
87
-
88
87
  case test_framework
89
88
  when "rspec"
90
89
  templates.merge!(
@@ -92,15 +91,33 @@ module Bundler
92
91
  "spec/spec_helper.rb.tt" => "spec/spec_helper.rb",
93
92
  "spec/newgem_spec.rb.tt" => "spec/#{namespaced_path}_spec.rb"
94
93
  )
94
+ config[:test_task] = :spec
95
95
  when "minitest"
96
96
  templates.merge!(
97
- "test/test_helper.rb.tt" => "test/test_helper.rb",
98
- "test/newgem_test.rb.tt" => "test/#{namespaced_path}_test.rb"
97
+ "test/minitest/test_helper.rb.tt" => "test/test_helper.rb",
98
+ "test/minitest/newgem_test.rb.tt" => "test/#{namespaced_path}_test.rb"
99
+ )
100
+ config[:test_task] = :test
101
+ when "test-unit"
102
+ templates.merge!(
103
+ "test/test-unit/test_helper.rb.tt" => "test/test_helper.rb",
104
+ "test/test-unit/newgem_test.rb.tt" => "test/#{namespaced_path}_test.rb"
99
105
  )
106
+ config[:test_task] = :test
100
107
  end
101
108
  end
102
109
 
103
- config[:test_task] = config[:test] == "minitest" ? "test" : "spec"
110
+ config[:ci] = ask_and_set_ci
111
+ case config[:ci]
112
+ when "github"
113
+ templates.merge!("github/workflows/main.yml.tt" => ".github/workflows/main.yml")
114
+ when "travis"
115
+ templates.merge!("travis.yml.tt" => ".travis.yml")
116
+ when "gitlab"
117
+ templates.merge!("gitlab-ci.yml.tt" => ".gitlab-ci.yml")
118
+ when "circle"
119
+ templates.merge!("circleci/config.yml.tt" => ".circleci/config.yml")
120
+ end
104
121
 
105
122
  if ask_and_set(:mit, "Do you want to license your code permissively under the MIT license?",
106
123
  "This means that any other developer or company will be legally allowed to use your code " \
@@ -124,6 +141,16 @@ module Bundler
124
141
  templates.merge!("CODE_OF_CONDUCT.md.tt" => "CODE_OF_CONDUCT.md")
125
142
  end
126
143
 
144
+ if ask_and_set(:rubocop, "Do you want to add rubocop as a dependency for gems you generate?",
145
+ "RuboCop is a static code analyzer that has out-of-the-box rules for many " \
146
+ "of the guidelines in the community style guide. " \
147
+ "For more information, see the RuboCop docs (https://docs.rubocop.org/en/stable/) " \
148
+ "and the Ruby Style Guides (https://github.com/rubocop-hq/ruby-style-guide).")
149
+ config[:rubocop] = true
150
+ Bundler.ui.info "RuboCop enabled in config"
151
+ templates.merge!("rubocop.yml.tt" => ".rubocop.yml")
152
+ end
153
+
127
154
  templates.merge!("exe/newgem.tt" => "exe/#{name}") if config[:exe]
128
155
 
129
156
  if options[:ext]
@@ -165,7 +192,7 @@ module Bundler
165
192
  raise GenericSystemCallError.new(e, "There was a conflict while creating the new gem.")
166
193
  end
167
194
 
168
- private
195
+ private
169
196
 
170
197
  def resolve_name(name)
171
198
  SharedHelpers.pwd.join(name).basename.to_s
@@ -197,11 +224,12 @@ module Bundler
197
224
  def ask_and_set_test_framework
198
225
  test_framework = options[:test] || Bundler.settings["gem.test"]
199
226
 
200
- if test_framework.nil?
227
+ if test_framework.to_s.empty?
201
228
  Bundler.ui.confirm "Do you want to generate tests with your gem?"
202
- result = Bundler.ui.ask "Type 'rspec' or 'minitest' to generate those test files now and " \
203
- "in the future. rspec/minitest/(none):"
204
- if result =~ /rspec|minitest/
229
+ Bundler.ui.info hint_text("test")
230
+
231
+ result = Bundler.ui.ask "Enter a test framework. rspec/minitest/test-unit/(none):"
232
+ if result =~ /rspec|minitest|test-unit/
205
233
  test_framework = result
206
234
  else
207
235
  test_framework = false
@@ -212,9 +240,54 @@ module Bundler
212
240
  Bundler.settings.set_global("gem.test", test_framework)
213
241
  end
214
242
 
243
+ if options[:test] == Bundler.settings["gem.test"]
244
+ Bundler.ui.info "#{options[:test]} is already configured, ignoring --test flag."
245
+ end
246
+
215
247
  test_framework
216
248
  end
217
249
 
250
+ def hint_text(setting)
251
+ if Bundler.settings["gem.#{setting}"] == false
252
+ "Your choice will only be applied to this gem."
253
+ else
254
+ "Future `bundle gem` calls will use your choice. " \
255
+ "This setting can be changed anytime with `bundle config gem.#{setting}`."
256
+ end
257
+ end
258
+
259
+ def ask_and_set_ci
260
+ ci_template = options[:ci] || Bundler.settings["gem.ci"]
261
+
262
+ if ci_template.to_s.empty?
263
+ Bundler.ui.confirm "Do you want to set up continuous integration for your gem? " \
264
+ "Supported services:\n" \
265
+ "* CircleCI: https://circleci.com/\n" \
266
+ "* GitHub Actions: https://github.com/features/actions\n" \
267
+ "* GitLab CI: https://docs.gitlab.com/ee/ci/\n" \
268
+ "* Travis CI: https://travis-ci.org/\n" \
269
+ "\n"
270
+ Bundler.ui.info hint_text("ci")
271
+
272
+ result = Bundler.ui.ask "Enter a CI service. github/travis/gitlab/circle/(none):"
273
+ if result =~ /github|travis|gitlab|circle/
274
+ ci_template = result
275
+ else
276
+ ci_template = false
277
+ end
278
+ end
279
+
280
+ if Bundler.settings["gem.ci"].nil?
281
+ Bundler.settings.set_global("gem.ci", ci_template)
282
+ end
283
+
284
+ if options[:ci] == Bundler.settings["gem.ci"]
285
+ Bundler.ui.info "#{options[:ci]} is already configured, ignoring --ci flag."
286
+ end
287
+
288
+ ci_template
289
+ end
290
+
218
291
  def bundler_dependency_version
219
292
  v = Gem::Version.new(Bundler::VERSION)
220
293
  req = v.segments[0..1]
@@ -22,7 +22,7 @@ module Bundler
22
22
  end
23
23
  end
24
24
 
25
- private
25
+ private
26
26
 
27
27
  def spec_for_gem(gem_name)
28
28
  spec = Bundler.definition.specs.find {|s| s.name == gem_name }
@@ -40,20 +40,31 @@ module Bundler
40
40
  end
41
41
 
42
42
  def print_gem_path(spec)
43
- path = if spec.name == "bundler"
44
- File.expand_path("../../../..", __FILE__)
43
+ if spec.name == "bundler"
44
+ path = File.expand_path("../../../..", __FILE__)
45
45
  else
46
- spec.full_gem_path
46
+ path = spec.full_gem_path
47
+ unless File.directory?(path)
48
+ return Bundler.ui.warn "The gem #{gem_name} has been deleted. It was installed at: #{path}"
49
+ end
47
50
  end
48
51
 
49
52
  Bundler.ui.info path
50
53
  end
51
54
 
52
55
  def print_gem_info(spec)
56
+ metadata = spec.metadata
53
57
  gem_info = String.new
54
58
  gem_info << " * #{spec.name} (#{spec.version}#{spec.git_version})\n"
55
59
  gem_info << "\tSummary: #{spec.summary}\n" if spec.summary
56
60
  gem_info << "\tHomepage: #{spec.homepage}\n" if spec.homepage
61
+ gem_info << "\tDocumentation: #{metadata["documentation_uri"]}\n" if metadata.key?("documentation_uri")
62
+ gem_info << "\tSource Code: #{metadata["source_code_uri"]}\n" if metadata.key?("source_code_uri")
63
+ gem_info << "\tFunding: #{metadata["funding_uri"]}\n" if metadata.key?("funding_uri")
64
+ gem_info << "\tWiki: #{metadata["wiki_uri"]}\n" if metadata.key?("wiki_uri")
65
+ gem_info << "\tChangelog: #{metadata["changelog_uri"]}\n" if metadata.key?("changelog_uri")
66
+ gem_info << "\tBug Tracker: #{metadata["bug_tracker_uri"]}\n" if metadata.key?("bug_tracker_uri")
67
+ gem_info << "\tMailing List: #{metadata["mailing_list_uri"]}\n" if metadata.key?("mailing_list_uri")
57
68
  gem_info << "\tPath: #{spec.full_gem_path}\n"
58
69
  gem_info << "\tDefault Gem: yes" if spec.respond_to?(:default_gem?) && spec.default_gem?
59
70
  Bundler.ui.info gem_info
@@ -38,10 +38,10 @@ module Bundler
38
38
  puts "Writing new #{gemfile} to #{SharedHelpers.pwd}/#{gemfile}"
39
39
  end
40
40
 
41
- private
41
+ private
42
42
 
43
43
  def gemfile
44
- @gemfile ||= Bundler.settings[:init_gems_rb] ? "gems.rb" : "Gemfile"
44
+ @gemfile ||= Bundler.preferred_gemfile_name
45
45
  end
46
46
  end
47
47
  end
@@ -44,7 +44,7 @@ module Bundler
44
44
  end
45
45
  end
46
46
 
47
- private
47
+ private
48
48
 
49
49
  def last_version_number
50
50
  definition = Bundler.definition(true)
@@ -12,8 +12,6 @@ module Bundler
12
12
 
13
13
  warn_if_root
14
14
 
15
- normalize_groups
16
-
17
15
  Bundler::SharedHelpers.set_env "RB_USER_INSTALL", "1" if Bundler::FREEBSD
18
16
 
19
17
  # Disable color in deployment mode
@@ -38,7 +36,8 @@ module Bundler
38
36
  if Bundler.feature_flag.deployment_means_frozen?
39
37
  Bundler.settings.set_command_option :deployment, true
40
38
  else
41
- Bundler.settings.set_command_option :frozen, true
39
+ Bundler.settings.set_command_option :deployment, true if options[:deployment]
40
+ Bundler.settings.set_command_option :frozen, true if options[:frozen]
42
41
  end
43
42
  end
44
43
 
@@ -54,7 +53,7 @@ module Bundler
54
53
 
55
54
  if options["binstubs"]
56
55
  Bundler::SharedHelpers.major_deprecation 2,
57
- "The --binstubs option will be removed in favor of `bundle binstubs`"
56
+ "The --binstubs option will be removed in favor of `bundle binstubs --all`"
58
57
  end
59
58
 
60
59
  Plugin.gemfile_install(Bundler.default_gemfile) if Bundler.feature_flag.plugins?
@@ -83,6 +82,8 @@ module Bundler
83
82
  require_relative "clean"
84
83
  Bundler::CLI::Clean.new(options).run
85
84
  end
85
+
86
+ Bundler::CLI::Common.output_fund_metadata_summary
86
87
  rescue GemNotFound, VersionConflict => e
87
88
  if options[:local] && Bundler.app_cache.exist?
88
89
  Bundler.ui.warn "Some gems seem to be missing from your #{Bundler.settings.app_cache_path} directory."
@@ -101,7 +102,7 @@ module Bundler
101
102
  raise e
102
103
  end
103
104
 
104
- private
105
+ private
105
106
 
106
107
  def warn_if_root
107
108
  return if Bundler.settings[:silence_root_warning] || Bundler::WINDOWS || !Process.uid.zero?
@@ -151,25 +152,24 @@ module Bundler
151
152
 
152
153
  check_for_group_conflicts_in_cli_options
153
154
 
154
- Bundler.settings.set_command_option :with, nil if options[:with] == []
155
- Bundler.settings.set_command_option :without, nil if options[:without] == []
156
-
157
155
  with = options.fetch(:with, [])
158
156
  with |= Bundler.settings[:with].map(&:to_s)
159
157
  with -= options[:without] if options[:without]
158
+ with = nil if options[:with] == []
160
159
 
161
160
  without = options.fetch(:without, [])
162
161
  without |= Bundler.settings[:without].map(&:to_s)
163
162
  without -= options[:with] if options[:with]
163
+ without = nil if options[:without] == []
164
164
 
165
- options[:with] = with
166
- options[:without] = without
165
+ Bundler.settings.set_command_option :without, without
166
+ Bundler.settings.set_command_option :with, with
167
167
  end
168
168
 
169
169
  def normalize_settings
170
170
  Bundler.settings.set_command_option :path, nil if options[:system]
171
171
  Bundler.settings.temporary(:path_relative_to_cwd => false) do
172
- Bundler.settings.set_command_option :path, "vendor/bundle" if options[:deployment]
172
+ Bundler.settings.set_command_option :path, "vendor/bundle" if Bundler.settings[:deployment] && Bundler.settings[:path].nil?
173
173
  end
174
174
  Bundler.settings.set_command_option_if_given :path, options[:path]
175
175
  Bundler.settings.temporary(:path_relative_to_cwd => false) do
@@ -190,13 +190,7 @@ module Bundler
190
190
 
191
191
  Bundler.settings.set_command_option_if_given :clean, options["clean"]
192
192
 
193
- unless Bundler.settings[:without] == options[:without] && Bundler.settings[:with] == options[:with]
194
- # need to nil them out first to get around validation for backwards compatibility
195
- Bundler.settings.set_command_option :without, nil
196
- Bundler.settings.set_command_option :with, nil
197
- Bundler.settings.set_command_option :without, options[:without] - options[:with]
198
- Bundler.settings.set_command_option :with, options[:with]
199
- end
193
+ normalize_groups if options[:without] || options[:with]
200
194
 
201
195
  options[:force] = options[:redownload]
202
196
  end
@@ -10,7 +10,7 @@ module Bundler
10
10
  be sure to check out these resources:
11
11
 
12
12
  1. Check out our troubleshooting guide for quick fixes to common issues:
13
- https://github.com/bundler/bundler/blob/master/doc/TROUBLESHOOTING.md
13
+ https://github.com/rubygems/rubygems/blob/master/bundler/doc/TROUBLESHOOTING.md
14
14
 
15
15
  2. Instructions for common Bundler uses can be found on the documentation
16
16
  site: https://bundler.io/
@@ -22,7 +22,7 @@ module Bundler
22
22
  still aren't working the way you expect them to, please let us know so
23
23
  that we can diagnose and help fix the problem you're having. Please
24
24
  view the Filing Issues guide for more information:
25
- https://github.com/bundler/bundler/blob/master/doc/contributing/ISSUES.md
25
+ https://github.com/rubygems/rubygems/blob/master/bundler/doc/contributing/ISSUES.md
26
26
 
27
27
  EOS
28
28
 
@@ -4,14 +4,16 @@ module Bundler
4
4
  class CLI::List
5
5
  def initialize(options)
6
6
  @options = options
7
+ @without_group = options["without-group"].map(&:to_sym)
8
+ @only_group = options["only-group"].map(&:to_sym)
7
9
  end
8
10
 
9
11
  def run
10
- raise InvalidOption, "The `--only-group` and `--without-group` options cannot be used together" if @options["only-group"] && @options["without-group"]
12
+ raise InvalidOption, "The `--only-group` and `--without-group` options cannot be used together" if @only_group.any? && @without_group.any?
11
13
 
12
14
  raise InvalidOption, "The `--name-only` and `--paths` options cannot be used together" if @options["name-only"] && @options[:paths]
13
15
 
14
- specs = if @options["only-group"] || @options["without-group"]
16
+ specs = if @only_group.any? || @without_group.any?
15
17
  filtered_specs_by_groups
16
18
  else
17
19
  Bundler.load.specs
@@ -29,12 +31,12 @@ module Bundler
29
31
  Bundler.ui.info "Use `bundle info` to print more detailed information about a gem"
30
32
  end
31
33
 
32
- private
34
+ private
33
35
 
34
36
  def verify_group_exists(groups)
35
- raise InvalidOption, "`#{@options["without-group"]}` group could not be found." if @options["without-group"] && !groups.include?(@options["without-group"].to_sym)
36
-
37
- raise InvalidOption, "`#{@options["only-group"]}` group could not be found." if @options["only-group"] && !groups.include?(@options["only-group"].to_sym)
37
+ (@without_group + @only_group).each do |group|
38
+ raise InvalidOption, "`#{group}` group could not be found." unless groups.include?(group)
39
+ end
38
40
  end
39
41
 
40
42
  def filtered_specs_by_groups
@@ -44,10 +46,10 @@ module Bundler
44
46
  verify_group_exists(groups)
45
47
 
46
48
  show_groups =
47
- if @options["without-group"]
48
- groups.reject {|g| g == @options["without-group"].to_sym }
49
- elsif @options["only-group"]
50
- groups.select {|g| g == @options["only-group"].to_sym }
49
+ if @without_group.any?
50
+ groups.reject {|g| @without_group.include?(g) }
51
+ elsif @only_group.any?
52
+ groups.select {|g| @only_group.include?(g) }
51
53
  else
52
54
  groups
53
55
  end.map(&:to_sym)
@@ -3,18 +3,16 @@
3
3
  module Bundler
4
4
  class CLI::Outdated
5
5
  attr_reader :options, :gems, :options_include_groups, :filter_options_patch, :sources, :strict
6
- attr_accessor :outdated_gems_by_groups, :outdated_gems_list
6
+ attr_accessor :outdated_gems
7
7
 
8
8
  def initialize(options, gems)
9
9
  @options = options
10
10
  @gems = gems
11
11
  @sources = Array(options[:source])
12
12
 
13
- @filter_options_patch = options.keys &
14
- %w[filter-major filter-minor filter-patch]
13
+ @filter_options_patch = options.keys & %w[filter-major filter-minor filter-patch]
15
14
 
16
- @outdated_gems_by_groups = {}
17
- @outdated_gems_list = []
15
+ @outdated_gems = []
18
16
 
19
17
  @options_include_groups = [:group, :groups].any? do |v|
20
18
  options.keys.include?(v.to_s)
@@ -22,8 +20,7 @@ module Bundler
22
20
 
23
21
  # the patch level options imply strict is also true. It wouldn't make
24
22
  # sense otherwise.
25
- @strict = options["filter-strict"] ||
26
- Bundler::CLI::Common.patch_level_options(options).any?
23
+ @strict = options["filter-strict"] || Bundler::CLI::Common.patch_level_options(options).any?
27
24
  end
28
25
 
29
26
  def run
@@ -76,86 +73,64 @@ module Bundler
76
73
  end
77
74
 
78
75
  specs.sort_by(&:name).each do |current_spec|
79
- next if !gems.empty? && !gems.include?(current_spec.name)
76
+ next unless gems.empty? || gems.include?(current_spec.name)
80
77
 
81
- dependency = current_dependencies[current_spec.name]
82
78
  active_spec = retrieve_active_spec(definition, current_spec)
83
-
84
- next if active_spec.nil?
85
- next if filter_options_patch.any? &&
86
- !update_present_via_semver_portions(current_spec, active_spec, options)
79
+ next unless filter_options_patch.empty? || update_present_via_semver_portions(current_spec, active_spec, options)
87
80
 
88
81
  gem_outdated = Gem::Version.new(active_spec.version) > Gem::Version.new(current_spec.version)
89
82
  next unless gem_outdated || (current_spec.git_version != active_spec.git_version)
90
- groups = nil
83
+
84
+ dependency = current_dependencies[current_spec.name]
85
+ groups = ""
91
86
  if dependency && !options[:parseable]
92
87
  groups = dependency.groups.join(", ")
93
88
  end
94
89
 
95
- outdated_gems_list << { :active_spec => active_spec,
96
- :current_spec => current_spec,
97
- :dependency => dependency,
98
- :groups => groups }
99
-
100
- outdated_gems_by_groups[groups] ||= []
101
- outdated_gems_by_groups[groups] << outdated_gems_list[-1]
90
+ outdated_gems << {
91
+ :active_spec => active_spec,
92
+ :current_spec => current_spec,
93
+ :dependency => dependency,
94
+ :groups => groups,
95
+ }
102
96
  end
103
97
 
104
- if outdated_gems_list.empty?
105
- display_nothing_outdated_message
106
- else
98
+ if outdated_gems.empty?
107
99
  unless options[:parseable]
108
- Bundler.ui.info(header_outdated_message)
100
+ Bundler.ui.info(nothing_outdated_message)
109
101
  end
110
-
102
+ else
111
103
  if options_include_groups
112
- ordered_groups = outdated_gems_by_groups.keys.compact.sort
113
- ordered_groups.insert(0, nil).each do |groups|
114
- gems = outdated_gems_by_groups[groups]
115
- contains_group = if groups
116
- groups.split(", ").include?(options[:group])
117
- else
118
- options[:group] == "group"
119
- end
104
+ relevant_outdated_gems = outdated_gems.group_by {|g| g[:groups] }.sort.flat_map do |groups, gems|
105
+ contains_group = groups.split(", ").include?(options[:group])
106
+ next unless options[:groups] || contains_group
120
107
 
121
- next if (!options[:groups] && !contains_group) || gems.nil?
108
+ gems
109
+ end.compact
122
110
 
123
- unless options[:parseable]
124
- Bundler.ui.info(header_group_message(groups))
111
+ if options[:parseable]
112
+ relevant_outdated_gems.each do |gems|
113
+ print_gems(gems)
125
114
  end
126
-
127
- print_gems(gems)
115
+ else
116
+ print_gems_table(relevant_outdated_gems)
128
117
  end
118
+ elsif options[:parseable]
119
+ print_gems(outdated_gems)
129
120
  else
130
- print_gems(outdated_gems_list)
121
+ print_gems_table(outdated_gems)
131
122
  end
132
123
 
133
124
  exit 1
134
125
  end
135
126
  end
136
127
 
137
- private
128
+ private
138
129
 
139
130
  def groups_text(group_text, groups)
140
131
  "#{group_text}#{groups.split(",").size > 1 ? "s" : ""} \"#{groups}\""
141
132
  end
142
133
 
143
- def header_outdated_message
144
- if options[:pre]
145
- "Outdated gems included in the bundle (including pre-releases):"
146
- else
147
- "Outdated gems included in the bundle:"
148
- end
149
- end
150
-
151
- def header_group_message(groups)
152
- if groups
153
- "===== #{groups_text("Group", groups)} ====="
154
- else
155
- "===== Without group ====="
156
- end
157
- end
158
-
159
134
  def nothing_outdated_message
160
135
  if filter_options_patch.any?
161
136
  display = filter_options_patch.map do |o|
@@ -182,12 +157,6 @@ module Bundler
182
157
  active_spec
183
158
  end
184
159
 
185
- def display_nothing_outdated_message
186
- unless options[:parseable]
187
- Bundler.ui.info(nothing_outdated_message)
188
- end
189
- end
190
-
191
160
  def print_gems(gems_list)
192
161
  gems_list.each do |gem|
193
162
  print_gem(
@@ -199,6 +168,19 @@ module Bundler
199
168
  end
200
169
  end
201
170
 
171
+ def print_gems_table(gems_list)
172
+ data = gems_list.map do |gem|
173
+ gem_column_for(
174
+ gem[:current_spec],
175
+ gem[:active_spec],
176
+ gem[:dependency],
177
+ gem[:groups],
178
+ )
179
+ end
180
+
181
+ print_indented([table_header] + data)
182
+ end
183
+
202
184
  def print_gem(current_spec, active_spec, dependency, groups)
203
185
  spec_version = "#{active_spec.version}#{active_spec.git_version}"
204
186
  spec_version += " (from #{active_spec.loaded_from})" if Bundler.ui.debug? && active_spec.loaded_from
@@ -213,7 +195,7 @@ module Bundler
213
195
 
214
196
  output_message = if options[:parseable]
215
197
  spec_outdated_info.to_s
216
- elsif options_include_groups || !groups
198
+ elsif options_include_groups || groups.empty?
217
199
  " * #{spec_outdated_info}"
218
200
  else
219
201
  " * #{spec_outdated_info} in #{groups_text("group", groups)}"
@@ -222,14 +204,22 @@ module Bundler
222
204
  Bundler.ui.info output_message.rstrip
223
205
  end
224
206
 
207
+ def gem_column_for(current_spec, active_spec, dependency, groups)
208
+ current_version = "#{current_spec.version}#{current_spec.git_version}"
209
+ spec_version = "#{active_spec.version}#{active_spec.git_version}"
210
+ dependency = dependency.requirement if dependency
211
+
212
+ ret_val = [active_spec.name, current_version, spec_version, dependency.to_s, groups.to_s]
213
+ ret_val << active_spec.loaded_from.to_s if Bundler.ui.debug?
214
+ ret_val
215
+ end
216
+
225
217
  def check_for_deployment_mode!
226
218
  return unless Bundler.frozen_bundle?
227
- suggested_command = if Bundler.settings.locations("frozen")[:global]
219
+ suggested_command = if Bundler.settings.locations("frozen").keys.&([:global, :local]).any?
228
220
  "bundle config unset frozen"
229
221
  elsif Bundler.settings.locations("deployment").keys.&([:global, :local]).any?
230
222
  "bundle config unset deployment"
231
- else
232
- "bundle install --no-deployment"
233
223
  end
234
224
  raise ProductionError, "You are trying to check outdated gems in " \
235
225
  "deployment mode. Run `bundle outdated` elsewhere.\n" \
@@ -239,6 +229,8 @@ module Bundler
239
229
  end
240
230
 
241
231
  def update_present_via_semver_portions(current_spec, active_spec, options)
232
+ return false if active_spec.nil?
233
+
242
234
  current_major = current_spec.version.segments.first
243
235
  active_major = active_spec.version.segments.first
244
236
 
@@ -266,5 +258,34 @@ module Bundler
266
258
  version_section = spec.version.segments[version_portion_index, 1]
267
259
  version_section.to_a[0].to_i
268
260
  end
261
+
262
+ def print_indented(matrix)
263
+ header = matrix[0]
264
+ data = matrix[1..-1]
265
+
266
+ column_sizes = Array.new(header.size) do |index|
267
+ matrix.max_by {|row| row[index].length }[index].length
268
+ end
269
+
270
+ Bundler.ui.info justify(header, column_sizes)
271
+
272
+ data.sort_by! {|row| row[0] }
273
+
274
+ data.each do |row|
275
+ Bundler.ui.info justify(row, column_sizes)
276
+ end
277
+ end
278
+
279
+ def table_header
280
+ header = ["Gem", "Current", "Latest", "Requested", "Groups"]
281
+ header << "Path" if Bundler.ui.debug?
282
+ header
283
+ end
284
+
285
+ def justify(row, sizes)
286
+ row.each_with_index.map do |element, index|
287
+ element.ljust(sizes[index])
288
+ end.join(" ").strip + "\n"
289
+ end
269
290
  end
270
291
  end