bundler 1.13.6 → 1.17.3

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 (323) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +554 -9
  3. data/README.md +28 -5
  4. data/bundler.gemspec +40 -11
  5. data/exe/bundle +4 -8
  6. data/exe/bundle_ruby +4 -3
  7. data/lib/bundler.rb +162 -68
  8. data/lib/bundler/build_metadata.rb +53 -0
  9. data/lib/bundler/capistrano.rb +5 -0
  10. data/lib/bundler/cli.rb +360 -118
  11. data/lib/bundler/cli/add.rb +35 -0
  12. data/lib/bundler/cli/binstubs.rb +18 -10
  13. data/lib/bundler/cli/cache.rb +6 -5
  14. data/lib/bundler/cli/check.rb +4 -6
  15. data/lib/bundler/cli/clean.rb +6 -7
  16. data/lib/bundler/cli/common.rb +47 -1
  17. data/lib/bundler/cli/config.rb +26 -7
  18. data/lib/bundler/cli/console.rb +2 -1
  19. data/lib/bundler/cli/doctor.rb +63 -18
  20. data/lib/bundler/cli/exec.rb +12 -5
  21. data/lib/bundler/cli/gem.rb +59 -21
  22. data/lib/bundler/cli/info.rb +50 -0
  23. data/lib/bundler/cli/init.rb +21 -7
  24. data/lib/bundler/cli/inject.rb +13 -4
  25. data/lib/bundler/cli/install.rb +72 -101
  26. data/lib/bundler/cli/issue.rb +40 -0
  27. data/lib/bundler/cli/list.rb +58 -0
  28. data/lib/bundler/cli/lock.rb +9 -6
  29. data/lib/bundler/cli/open.rb +4 -3
  30. data/lib/bundler/cli/outdated.rb +175 -60
  31. data/lib/bundler/cli/package.rb +9 -6
  32. data/lib/bundler/cli/platform.rb +2 -1
  33. data/lib/bundler/cli/plugin.rb +1 -0
  34. data/lib/bundler/cli/pristine.rb +47 -0
  35. data/lib/bundler/cli/remove.rb +18 -0
  36. data/lib/bundler/cli/show.rb +2 -2
  37. data/lib/bundler/cli/update.rb +44 -34
  38. data/lib/bundler/cli/viz.rb +5 -1
  39. data/lib/bundler/compact_index_client.rb +109 -0
  40. data/lib/bundler/compact_index_client/cache.rb +118 -0
  41. data/lib/bundler/compact_index_client/updater.rb +116 -0
  42. data/lib/bundler/compatibility_guard.rb +14 -0
  43. data/lib/bundler/constants.rb +1 -0
  44. data/lib/bundler/current_ruby.rb +17 -8
  45. data/lib/bundler/definition.rb +353 -182
  46. data/lib/bundler/dep_proxy.rb +3 -1
  47. data/lib/bundler/dependency.rb +22 -10
  48. data/lib/bundler/deployment.rb +1 -1
  49. data/lib/bundler/deprecate.rb +15 -3
  50. data/lib/bundler/dsl.rb +122 -64
  51. data/lib/bundler/endpoint_specification.rb +13 -3
  52. data/lib/bundler/env.rb +110 -38
  53. data/lib/bundler/environment_preserver.rb +27 -6
  54. data/lib/bundler/errors.rb +24 -0
  55. data/lib/bundler/feature_flag.rb +74 -0
  56. data/lib/bundler/fetcher.rb +18 -11
  57. data/lib/bundler/fetcher/base.rb +1 -0
  58. data/lib/bundler/fetcher/compact_index.rb +7 -5
  59. data/lib/bundler/fetcher/dependency.rb +3 -2
  60. data/lib/bundler/fetcher/downloader.rb +25 -7
  61. data/lib/bundler/fetcher/index.rb +3 -2
  62. data/lib/bundler/friendly_errors.rb +33 -7
  63. data/lib/bundler/gem_helper.rb +25 -11
  64. data/lib/bundler/gem_helpers.rb +70 -1
  65. data/lib/bundler/gem_remote_fetcher.rb +1 -0
  66. data/lib/bundler/gem_tasks.rb +1 -0
  67. data/lib/bundler/gem_version_promoter.rb +17 -2
  68. data/lib/bundler/gemdeps.rb +29 -0
  69. data/lib/bundler/graph.rb +1 -0
  70. data/lib/bundler/index.rb +28 -15
  71. data/lib/bundler/injector.rb +216 -33
  72. data/lib/bundler/inline.rb +12 -12
  73. data/lib/bundler/installer.rb +139 -53
  74. data/lib/bundler/installer/gem_installer.rb +15 -5
  75. data/lib/bundler/installer/parallel_installer.rb +113 -28
  76. data/lib/bundler/installer/standalone.rb +1 -0
  77. data/lib/bundler/lazy_specification.rb +31 -3
  78. data/lib/bundler/lockfile_generator.rb +95 -0
  79. data/lib/bundler/lockfile_parser.rb +50 -37
  80. data/lib/bundler/match_platform.rb +13 -3
  81. data/lib/bundler/mirror.rb +10 -5
  82. data/lib/bundler/plugin.rb +22 -8
  83. data/lib/bundler/plugin/api.rb +2 -1
  84. data/lib/bundler/plugin/api/source.rb +17 -4
  85. data/lib/bundler/plugin/events.rb +61 -0
  86. data/lib/bundler/plugin/index.rb +9 -2
  87. data/lib/bundler/plugin/installer.rb +7 -6
  88. data/lib/bundler/plugin/source_list.rb +7 -8
  89. data/lib/bundler/process_lock.rb +24 -0
  90. data/lib/bundler/psyched_yaml.rb +10 -0
  91. data/lib/bundler/remote_specification.rb +30 -1
  92. data/lib/bundler/resolver.rb +187 -194
  93. data/lib/bundler/resolver/spec_group.rb +106 -0
  94. data/lib/bundler/retry.rb +5 -1
  95. data/lib/bundler/ruby_dsl.rb +1 -0
  96. data/lib/bundler/ruby_version.rb +12 -2
  97. data/lib/bundler/rubygems_ext.rb +23 -8
  98. data/lib/bundler/rubygems_gem_installer.rb +90 -0
  99. data/lib/bundler/rubygems_integration.rb +193 -70
  100. data/lib/bundler/runtime.rb +39 -22
  101. data/lib/bundler/settings.rb +245 -85
  102. data/lib/bundler/settings/validator.rb +102 -0
  103. data/lib/bundler/setup.rb +4 -7
  104. data/lib/bundler/shared_helpers.rb +183 -40
  105. data/lib/bundler/similarity_detector.rb +1 -0
  106. data/lib/bundler/source.rb +58 -1
  107. data/lib/bundler/source/gemspec.rb +1 -0
  108. data/lib/bundler/source/git.rb +52 -23
  109. data/lib/bundler/source/git/git_proxy.rb +30 -14
  110. data/lib/bundler/source/metadata.rb +62 -0
  111. data/lib/bundler/source/path.rb +42 -16
  112. data/lib/bundler/source/path/installer.rb +4 -2
  113. data/lib/bundler/source/rubygems.rb +171 -82
  114. data/lib/bundler/source/rubygems/remote.rb +12 -2
  115. data/lib/bundler/source_list.rb +75 -15
  116. data/lib/bundler/spec_set.rb +67 -32
  117. data/lib/bundler/ssl_certs/certificate_manager.rb +2 -1
  118. data/lib/bundler/stub_specification.rb +86 -2
  119. data/lib/bundler/templates/.document +1 -0
  120. data/lib/bundler/templates/Executable +13 -1
  121. data/lib/bundler/templates/Executable.bundler +105 -0
  122. data/lib/bundler/templates/Executable.standalone +5 -5
  123. data/lib/bundler/templates/Gemfile +3 -0
  124. data/lib/bundler/templates/gems.rb +8 -0
  125. data/lib/bundler/templates/newgem/Gemfile.tt +4 -2
  126. data/lib/bundler/templates/newgem/LICENSE.txt.tt +1 -1
  127. data/lib/bundler/templates/newgem/README.md.tt +14 -8
  128. data/lib/bundler/templates/newgem/Rakefile.tt +5 -5
  129. data/lib/bundler/templates/newgem/bin/console.tt +1 -1
  130. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +4 -4
  131. data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +3 -3
  132. data/lib/bundler/templates/newgem/gitignore.tt +5 -1
  133. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +7 -6
  134. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +4 -4
  135. data/lib/bundler/templates/newgem/newgem.gemspec.tt +21 -12
  136. data/lib/bundler/templates/newgem/rspec.tt +1 -0
  137. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +1 -3
  138. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +13 -1
  139. data/lib/bundler/templates/newgem/test/newgem_test.rb.tt +1 -1
  140. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +3 -3
  141. data/lib/bundler/templates/newgem/{.travis.yml.tt → travis.yml.tt} +2 -0
  142. data/lib/bundler/ui.rb +1 -0
  143. data/lib/bundler/ui/rg_proxy.rb +1 -0
  144. data/lib/bundler/ui/shell.rb +30 -10
  145. data/lib/bundler/ui/silent.rb +21 -1
  146. data/lib/bundler/uri_credentials_filter.rb +1 -0
  147. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
  148. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +2 -0
  149. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
  150. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
  151. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +1 -0
  152. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +26 -6
  153. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +2 -1
  154. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +12 -4
  155. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +3 -2
  156. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
  157. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +11 -3
  158. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +13 -1
  159. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +3 -2
  160. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +3 -2
  161. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +18 -5
  162. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +75 -7
  163. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  164. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +1 -0
  165. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +3 -1
  166. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +499 -128
  167. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +1 -0
  168. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +8 -4
  169. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/faster.rb +1 -0
  170. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent.rb +27 -24
  171. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent/ssl_reuse.rb +2 -1
  172. data/lib/bundler/vendor/thor/lib/thor.rb +46 -21
  173. data/lib/bundler/vendor/thor/lib/thor/actions.rb +24 -22
  174. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +2 -1
  175. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  176. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +2 -2
  177. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +16 -8
  178. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +66 -18
  179. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +17 -15
  180. data/lib/bundler/vendor/thor/lib/thor/base.rb +55 -32
  181. data/lib/bundler/vendor/thor/lib/thor/command.rb +13 -11
  182. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +21 -1
  183. data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +7 -5
  184. data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +94 -63
  185. data/lib/bundler/vendor/thor/lib/thor/error.rb +3 -3
  186. data/lib/bundler/vendor/thor/lib/thor/group.rb +13 -13
  187. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +4 -5
  188. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +2 -0
  189. data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +4 -7
  190. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +16 -16
  191. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +42 -21
  192. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +13 -10
  193. data/lib/bundler/vendor/thor/lib/thor/runner.rb +31 -29
  194. data/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  195. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +49 -33
  196. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -1
  197. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +4 -4
  198. data/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
  199. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  200. data/lib/bundler/vendored_fileutils.rb +9 -0
  201. data/lib/bundler/vendored_molinillo.rb +1 -0
  202. data/lib/bundler/vendored_persistent.rb +43 -3
  203. data/lib/bundler/vendored_thor.rb +6 -2
  204. data/lib/bundler/version.rb +19 -2
  205. data/lib/bundler/version_ranges.rb +76 -0
  206. data/lib/bundler/vlad.rb +5 -0
  207. data/lib/bundler/worker.rb +30 -6
  208. data/lib/bundler/yaml_serializer.rb +4 -4
  209. data/man/bundle-add.1 +58 -0
  210. data/man/bundle-add.1.txt +52 -0
  211. data/man/bundle-add.ronn +40 -0
  212. data/{lib/bundler/man/bundle-binstubs → man/bundle-binstubs.1} +11 -1
  213. data/man/bundle-binstubs.1.txt +48 -0
  214. data/man/bundle-binstubs.ronn +15 -1
  215. data/man/bundle-check.1 +31 -0
  216. data/man/bundle-check.1.txt +33 -0
  217. data/man/bundle-check.ronn +26 -0
  218. data/man/bundle-clean.1 +24 -0
  219. data/man/bundle-clean.1.txt +26 -0
  220. data/man/bundle-clean.ronn +18 -0
  221. data/man/bundle-config.1 +497 -0
  222. data/man/bundle-config.1.txt +529 -0
  223. data/man/bundle-config.ronn +233 -61
  224. data/man/bundle-doctor.1 +44 -0
  225. data/man/bundle-doctor.1.txt +44 -0
  226. data/man/bundle-doctor.ronn +33 -0
  227. data/{lib/bundler/man/bundle-exec → man/bundle-exec.1} +6 -3
  228. data/man/bundle-exec.1.txt +178 -0
  229. data/man/bundle-exec.ronn +10 -3
  230. data/{lib/bundler/man/bundle-gem → man/bundle-gem.1} +4 -4
  231. data/man/bundle-gem.1.txt +91 -0
  232. data/man/bundle-gem.ronn +3 -2
  233. data/man/bundle-info.1 +20 -0
  234. data/man/bundle-info.1.txt +21 -0
  235. data/man/bundle-info.ronn +17 -0
  236. data/man/bundle-init.1 +25 -0
  237. data/man/bundle-init.1.txt +34 -0
  238. data/man/bundle-init.ronn +29 -0
  239. data/man/bundle-inject.1 +33 -0
  240. data/man/bundle-inject.1.txt +32 -0
  241. data/man/bundle-inject.ronn +22 -0
  242. data/{lib/bundler/man/bundle-install → man/bundle-install.1} +32 -29
  243. data/man/bundle-install.1.txt +396 -0
  244. data/man/bundle-install.ronn +45 -36
  245. data/man/bundle-list.1 +50 -0
  246. data/man/bundle-list.1.txt +43 -0
  247. data/man/bundle-list.ronn +33 -0
  248. data/{lib/bundler/man/bundle-lock → man/bundle-lock.1} +43 -2
  249. data/man/bundle-lock.1.txt +93 -0
  250. data/man/bundle-lock.ronn +47 -0
  251. data/man/bundle-open.1 +32 -0
  252. data/man/bundle-open.1.txt +29 -0
  253. data/man/bundle-open.ronn +19 -0
  254. data/man/bundle-outdated.1 +155 -0
  255. data/man/bundle-outdated.1.txt +131 -0
  256. data/man/bundle-outdated.ronn +111 -0
  257. data/{lib/bundler/man/bundle-package → man/bundle-package.1} +6 -3
  258. data/man/bundle-package.1.txt +79 -0
  259. data/man/bundle-package.ronn +7 -2
  260. data/{lib/bundler/man/bundle-platform → man/bundle-platform.1} +1 -1
  261. data/man/bundle-platform.1.txt +57 -0
  262. data/man/bundle-pristine.1 +34 -0
  263. data/man/bundle-pristine.1.txt +44 -0
  264. data/man/bundle-pristine.ronn +34 -0
  265. data/man/bundle-remove.1 +31 -0
  266. data/man/bundle-remove.1.txt +34 -0
  267. data/man/bundle-remove.ronn +23 -0
  268. data/man/bundle-show.1 +23 -0
  269. data/man/bundle-show.1.txt +27 -0
  270. data/man/bundle-show.ronn +21 -0
  271. data/man/bundle-update.1 +394 -0
  272. data/man/bundle-update.1.txt +391 -0
  273. data/man/bundle-update.ronn +172 -16
  274. data/man/bundle-viz.1 +39 -0
  275. data/man/bundle-viz.1.txt +39 -0
  276. data/man/bundle-viz.ronn +30 -0
  277. data/{lib/bundler/man/bundle → man/bundle.1} +44 -28
  278. data/man/bundle.1.txt +116 -0
  279. data/man/bundle.ronn +39 -27
  280. data/{lib/bundler/man → man}/gemfile.5 +67 -84
  281. data/man/gemfile.5.ronn +77 -55
  282. data/man/gemfile.5.txt +653 -0
  283. data/man/index.txt +25 -8
  284. metadata +118 -58
  285. data/.codeclimate.yml +0 -25
  286. data/.gitignore +0 -16
  287. data/.rspec +0 -3
  288. data/.rubocop.yml +0 -128
  289. data/.rubocop_todo.yml +0 -248
  290. data/.travis.yml +0 -108
  291. data/CODE_OF_CONDUCT.md +0 -42
  292. data/CONTRIBUTING.md +0 -36
  293. data/DEVELOPMENT.md +0 -148
  294. data/ISSUES.md +0 -100
  295. data/Rakefile +0 -333
  296. data/bin/rake +0 -19
  297. data/bin/rspec +0 -15
  298. data/bin/rubocop +0 -17
  299. data/bin/with_rubygems +0 -39
  300. data/lib/bundler/man/bundle-binstubs.txt +0 -33
  301. data/lib/bundler/man/bundle-config +0 -254
  302. data/lib/bundler/man/bundle-config.txt +0 -282
  303. data/lib/bundler/man/bundle-exec.txt +0 -171
  304. data/lib/bundler/man/bundle-gem.txt +0 -90
  305. data/lib/bundler/man/bundle-install.txt +0 -385
  306. data/lib/bundler/man/bundle-lock.txt +0 -52
  307. data/lib/bundler/man/bundle-package.txt +0 -74
  308. data/lib/bundler/man/bundle-platform.txt +0 -57
  309. data/lib/bundler/man/bundle-update +0 -221
  310. data/lib/bundler/man/bundle-update.txt +0 -227
  311. data/lib/bundler/man/bundle.txt +0 -104
  312. data/lib/bundler/man/gemfile.5.txt +0 -636
  313. data/lib/bundler/postit_trampoline.rb +0 -68
  314. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client.rb +0 -79
  315. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/cache.rb +0 -112
  316. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/updater.rb +0 -80
  317. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/version.rb +0 -4
  318. data/lib/bundler/vendor/postit/lib/postit.rb +0 -15
  319. data/lib/bundler/vendor/postit/lib/postit/environment.rb +0 -44
  320. data/lib/bundler/vendor/postit/lib/postit/installer.rb +0 -28
  321. data/lib/bundler/vendor/postit/lib/postit/parser.rb +0 -21
  322. data/lib/bundler/vendor/postit/lib/postit/setup.rb +0 -12
  323. data/lib/bundler/vendor/postit/lib/postit/version.rb +0 -3
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler
3
4
  class DepProxy
4
5
  attr_reader :__platform, :dep
@@ -9,10 +10,11 @@ module Bundler
9
10
  end
10
11
 
11
12
  def hash
12
- @hash ||= dep.hash
13
+ @hash ||= [dep, __platform].hash
13
14
  end
14
15
 
15
16
  def ==(other)
17
+ return false if other.class != self.class
16
18
  dep == other.dep && __platform == other.__platform
17
19
  end
18
20
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "rubygems/dependency"
3
4
  require "bundler/shared_helpers"
4
5
  require "bundler/rubygems_ext"
@@ -6,8 +7,7 @@ require "bundler/rubygems_ext"
6
7
  module Bundler
7
8
  class Dependency < Gem::Dependency
8
9
  attr_reader :autorequire
9
- attr_reader :groups
10
- attr_reader :platforms
10
+ attr_reader :groups, :platforms, :gemfile
11
11
 
12
12
  PLATFORM_MAP = {
13
13
  :ruby => Gem::Platform::RUBY,
@@ -17,6 +17,8 @@ module Bundler
17
17
  :ruby_21 => Gem::Platform::RUBY,
18
18
  :ruby_22 => Gem::Platform::RUBY,
19
19
  :ruby_23 => Gem::Platform::RUBY,
20
+ :ruby_24 => Gem::Platform::RUBY,
21
+ :ruby_25 => Gem::Platform::RUBY,
20
22
  :mri => Gem::Platform::RUBY,
21
23
  :mri_18 => Gem::Platform::RUBY,
22
24
  :mri_19 => Gem::Platform::RUBY,
@@ -24,7 +26,10 @@ module Bundler
24
26
  :mri_21 => Gem::Platform::RUBY,
25
27
  :mri_22 => Gem::Platform::RUBY,
26
28
  :mri_23 => Gem::Platform::RUBY,
29
+ :mri_24 => Gem::Platform::RUBY,
30
+ :mri_25 => Gem::Platform::RUBY,
27
31
  :rbx => Gem::Platform::RUBY,
32
+ :truffleruby => Gem::Platform::RUBY,
28
33
  :jruby => Gem::Platform::JAVA,
29
34
  :jruby_18 => Gem::Platform::JAVA,
30
35
  :jruby_19 => Gem::Platform::JAVA,
@@ -35,12 +40,16 @@ module Bundler
35
40
  :mswin_21 => Gem::Platform::MSWIN,
36
41
  :mswin_22 => Gem::Platform::MSWIN,
37
42
  :mswin_23 => Gem::Platform::MSWIN,
43
+ :mswin_24 => Gem::Platform::MSWIN,
44
+ :mswin_25 => Gem::Platform::MSWIN,
38
45
  :mswin64 => Gem::Platform::MSWIN64,
39
46
  :mswin64_19 => Gem::Platform::MSWIN64,
40
47
  :mswin64_20 => Gem::Platform::MSWIN64,
41
48
  :mswin64_21 => Gem::Platform::MSWIN64,
42
49
  :mswin64_22 => Gem::Platform::MSWIN64,
43
50
  :mswin64_23 => Gem::Platform::MSWIN64,
51
+ :mswin64_24 => Gem::Platform::MSWIN64,
52
+ :mswin64_25 => Gem::Platform::MSWIN64,
44
53
  :mingw => Gem::Platform::MINGW,
45
54
  :mingw_18 => Gem::Platform::MINGW,
46
55
  :mingw_19 => Gem::Platform::MINGW,
@@ -48,11 +57,15 @@ module Bundler
48
57
  :mingw_21 => Gem::Platform::MINGW,
49
58
  :mingw_22 => Gem::Platform::MINGW,
50
59
  :mingw_23 => Gem::Platform::MINGW,
60
+ :mingw_24 => Gem::Platform::MINGW,
61
+ :mingw_25 => Gem::Platform::MINGW,
51
62
  :x64_mingw => Gem::Platform::X64_MINGW,
52
63
  :x64_mingw_20 => Gem::Platform::X64_MINGW,
53
64
  :x64_mingw_21 => Gem::Platform::X64_MINGW,
54
65
  :x64_mingw_22 => Gem::Platform::X64_MINGW,
55
- :x64_mingw_23 => Gem::Platform::X64_MINGW
66
+ :x64_mingw_23 => Gem::Platform::X64_MINGW,
67
+ :x64_mingw_24 => Gem::Platform::X64_MINGW,
68
+ :x64_mingw_25 => Gem::Platform::X64_MINGW,
56
69
  }.freeze
57
70
 
58
71
  REVERSE_PLATFORM_MAP = {}.tap do |reverse_platform_map|
@@ -74,20 +87,19 @@ module Bundler
74
87
  @platforms = Array(options["platforms"])
75
88
  @env = options["env"]
76
89
  @should_include = options.fetch("should_include", true)
90
+ @gemfile = options["gemfile"]
77
91
 
78
92
  @autorequire = Array(options["require"] || []) if options.key?("require")
79
93
  end
80
94
 
95
+ # Returns the platforms this dependency is valid for, in the same order as
96
+ # passed in the `valid_platforms` parameter
81
97
  def gem_platforms(valid_platforms)
82
98
  return valid_platforms if @platforms.empty?
83
99
 
84
- platforms = []
85
- @platforms.each do |p|
86
- platform = PLATFORM_MAP[p]
87
- next unless valid_platforms.include?(platform)
88
- platforms |= [platform]
89
- end
90
- platforms
100
+ @gem_platforms ||= @platforms.map {|pl| PLATFORM_MAP[pl] }.compact.uniq
101
+
102
+ valid_platforms & @gem_platforms
91
103
  end
92
104
 
93
105
  def should_include?
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "bundler/shared_helpers"
4
- Bundler::SharedHelpers.major_deprecation "Bundler no longer integrates with " \
4
+ Bundler::SharedHelpers.major_deprecation 2, "Bundler no longer integrates with " \
5
5
  "Capistrano, but Capistrano provides its own integration with " \
6
6
  "Bundler via the capistrano-bundler gem. Use it instead."
7
7
 
@@ -1,11 +1,23 @@
1
1
  # frozen_string_literal: true
2
+
3
+ begin
4
+ require "rubygems/deprecate"
5
+ rescue LoadError
6
+ # it's fine if it doesn't exist on the current RubyGems...
7
+ nil
8
+ end
9
+
2
10
  module Bundler
3
- if defined? ::Deprecate
11
+ # If Bundler::Deprecate is an autoload constant, we need to define it
12
+ if defined?(Bundler::Deprecate) && !autoload?(:Deprecate)
13
+ # nothing to do!
14
+ elsif defined? ::Deprecate
4
15
  Deprecate = ::Deprecate
5
16
  elsif defined? Gem::Deprecate
6
17
  Deprecate = Gem::Deprecate
7
18
  else
8
- class Deprecate; end
19
+ class Deprecate
20
+ end
9
21
  end
10
22
 
11
23
  unless Deprecate.respond_to?(:skip_during)
@@ -20,7 +32,7 @@ module Bundler
20
32
 
21
33
  unless Deprecate.respond_to?(:skip)
22
34
  def Deprecate.skip
23
- @skip
35
+ @skip ||= false
24
36
  end
25
37
  end
26
38
 
data/lib/bundler/dsl.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "bundler/dependency"
3
4
  require "bundler/ruby_dsl"
4
5
 
@@ -14,6 +15,9 @@ module Bundler
14
15
 
15
16
  VALID_PLATFORMS = Bundler::Dependency::PLATFORM_MAP.keys.freeze
16
17
 
18
+ VALID_KEYS = %w[group groups git path glob name branch ref tag require submodules
19
+ platform platforms type source install_if gemfile].freeze
20
+
17
21
  attr_reader :gemspecs
18
22
  attr_accessor :dependencies
19
23
 
@@ -30,14 +34,16 @@ module Bundler
30
34
  @ruby_version = nil
31
35
  @gemspecs = []
32
36
  @gemfile = nil
37
+ @gemfiles = []
33
38
  add_git_sources
34
39
  end
35
40
 
36
41
  def eval_gemfile(gemfile, contents = nil)
37
- expanded_gemfile_path = Pathname.new(gemfile).expand_path
42
+ expanded_gemfile_path = Pathname.new(gemfile).expand_path(@gemfile && @gemfile.parent)
38
43
  original_gemfile = @gemfile
39
44
  @gemfile = expanded_gemfile_path
40
- contents ||= Bundler.read_file(gemfile.to_s)
45
+ @gemfiles << expanded_gemfile_path
46
+ contents ||= Bundler.read_file(@gemfile.to_s)
41
47
  instance_eval(contents.dup.untaint, gemfile.to_s, 1)
42
48
  rescue Exception => e
43
49
  message = "There was an error " \
@@ -65,7 +71,7 @@ module Bundler
65
71
  case specs_by_name_and_version.size
66
72
  when 1
67
73
  specs = specs_by_name_and_version.values.first
68
- spec = specs.find {|s| s.match_platform(Gem::Platform.local) } || specs.first
74
+ spec = specs.find {|s| s.match_platform(Bundler.local_platform) } || specs.first
69
75
 
70
76
  @gemspecs << spec
71
77
 
@@ -87,6 +93,7 @@ module Bundler
87
93
 
88
94
  def gem(name, *args)
89
95
  options = args.last.is_a?(Hash) ? args.pop.dup : {}
96
+ options["gemfile"] = @gemfile
90
97
  version = args || [">= 0"]
91
98
 
92
99
  normalize_options(name, version, options)
@@ -95,25 +102,38 @@ module Bundler
95
102
 
96
103
  # if there's already a dependency with this name we try to prefer one
97
104
  if current = @dependencies.find {|d| d.name == dep.name }
105
+ deleted_dep = @dependencies.delete(current) if current.type == :development
106
+
98
107
  if current.requirement != dep.requirement
99
- if current.type == :development
100
- @dependencies.delete current
101
- else
108
+ unless deleted_dep
102
109
  return if dep.type == :development
110
+
111
+ update_prompt = ""
112
+
113
+ if File.basename(@gemfile) == Injector::INJECTED_GEMS
114
+ if dep.requirements_list.include?(">= 0") && !current.requirements_list.include?(">= 0")
115
+ update_prompt = ". Gem already added"
116
+ else
117
+ update_prompt = ". If you want to update the gem version, run `bundle update #{current.name}`"
118
+
119
+ update_prompt += ". You may also need to change the version requirement specified in the Gemfile if it's too restrictive." unless current.requirements_list.include?(">= 0")
120
+ end
121
+ end
122
+
103
123
  raise GemfileError, "You cannot specify the same gem twice with different version requirements.\n" \
104
- "You specified: #{current.name} (#{current.requirement}) and #{dep.name} (#{dep.requirement})"
124
+ "You specified: #{current.name} (#{current.requirement}) and #{dep.name} (#{dep.requirement})" \
125
+ "#{update_prompt}"
105
126
  end
106
127
 
107
128
  else
108
129
  Bundler.ui.warn "Your Gemfile lists the gem #{current.name} (#{current.requirement}) more than once.\n" \
109
130
  "You should probably keep only one of them.\n" \
131
+ "Remove any duplicate entries and specify the gem only once (per group).\n" \
110
132
  "While it's not a problem now, it could cause errors if you change the version of one of them later."
111
133
  end
112
134
 
113
135
  if current.source != dep.source
114
- if current.type == :development
115
- @dependencies.delete current
116
- else
136
+ unless deleted_dep
117
137
  return if dep.type == :development
118
138
  raise GemfileError, "You cannot specify the same gem twice coming from different sources.\n" \
119
139
  "You specified that #{dep.name} (#{dep.requirement}) should come from " \
@@ -128,10 +148,12 @@ module Bundler
128
148
  def source(source, *args, &blk)
129
149
  options = args.last.is_a?(Hash) ? args.pop.dup : {}
130
150
  options = normalize_hash(options)
151
+ source = normalize_source(source)
152
+
131
153
  if options.key?("type")
132
154
  options["type"] = options["type"].to_s
133
155
  unless Plugin.source?(options["type"])
134
- raise "No sources available for #{options["type"]}"
156
+ raise InvalidOption, "No plugin sources available for #{options["type"]}"
135
157
  end
136
158
 
137
159
  unless block_given?
@@ -141,12 +163,10 @@ module Bundler
141
163
  source_opts = options.merge("uri" => source)
142
164
  with_source(@sources.add_plugin_source(options["type"], source_opts), &blk)
143
165
  elsif block_given?
144
- source = normalize_source(source)
145
166
  with_source(@sources.add_rubygems_source("remotes" => source), &blk)
146
167
  else
147
- source = normalize_source(source)
148
168
  check_primary_source_safety(@sources)
149
- @sources.add_rubygems_remote(source)
169
+ @sources.global_rubygems_source = source
150
170
  end
151
171
  end
152
172
 
@@ -164,6 +184,19 @@ module Bundler
164
184
  end
165
185
 
166
186
  def path(path, options = {}, &blk)
187
+ unless block_given?
188
+ msg = "You can no longer specify a path source by itself. Instead, \n" \
189
+ "either use the :path option on a gem, or specify the gems that \n" \
190
+ "bundler should find in the path source by passing a block to \n" \
191
+ "the path method, like: \n\n" \
192
+ " path 'dir/containing/rails' do\n" \
193
+ " gem 'rails'\n" \
194
+ " end\n\n"
195
+
196
+ raise DeprecatedError, msg if Bundler.feature_flag.disable_multisource?
197
+ SharedHelpers.major_deprecation(2, msg.strip)
198
+ end
199
+
167
200
  source_options = normalize_hash(options).merge(
168
201
  "path" => Pathname.new(path),
169
202
  "root_path" => gemfile_root,
@@ -189,7 +222,8 @@ module Bundler
189
222
  end
190
223
 
191
224
  def github(repo, options = {})
192
- raise ArgumentError, "Github sources require a block" unless block_given?
225
+ raise ArgumentError, "GitHub sources require a block" unless block_given?
226
+ raise DeprecatedError, "The #github method has been removed" if Bundler.feature_flag.skip_default_git_sources?
193
227
  github_uri = @git_sources["github"].call(repo)
194
228
  git_options = normalize_hash(options).merge("uri" => github_uri)
195
229
  git_source = @sources.add_git_source(git_options)
@@ -197,16 +231,16 @@ module Bundler
197
231
  end
198
232
 
199
233
  def to_definition(lockfile, unlock)
200
- Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version, @optional_groups)
234
+ Definition.new(lockfile, @dependencies, @sources, unlock, @ruby_version, @optional_groups, @gemfiles)
201
235
  end
202
236
 
203
237
  def group(*args, &blk)
204
- opts = Hash === args.last ? args.pop.dup : {}
205
- normalize_group_options(opts, args)
238
+ options = args.last.is_a?(Hash) ? args.pop.dup : {}
239
+ normalize_group_options(options, args)
206
240
 
207
241
  @groups.concat args
208
242
 
209
- if opts["optional"]
243
+ if options["optional"]
210
244
  optional_groups = args - @optional_groups
211
245
  @optional_groups.concat optional_groups
212
246
  end
@@ -216,9 +250,9 @@ module Bundler
216
250
  args.each { @groups.pop }
217
251
  end
218
252
 
219
- def install_if(*args, &blk)
253
+ def install_if(*args)
220
254
  @install_conditionals.concat args
221
- blk.call
255
+ yield
222
256
  ensure
223
257
  args.each { @install_conditionals.pop }
224
258
  end
@@ -250,7 +284,12 @@ module Bundler
250
284
  private
251
285
 
252
286
  def add_git_sources
287
+ return if Bundler.feature_flag.skip_default_git_sources?
288
+
253
289
  git_source(:github) do |repo_name|
290
+ warn_deprecated_git_source(:github, <<-'RUBY'.strip, 'Change any "reponame" :github sources to "username/reponame".')
291
+ "https://github.com/#{repo_name}.git"
292
+ RUBY
254
293
  # It would be better to use https instead of the git protocol, but this
255
294
  # can break deployment of existing locked bundles when switching between
256
295
  # different versions of Bundler. The change will be made in 2.0, which
@@ -266,24 +305,30 @@ module Bundler
266
305
  # end
267
306
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
268
307
  # TODO: 2.0 upgrade this setting to the default
269
- if Bundler.settings["github.https"]
308
+ if Bundler.feature_flag.github_https?
309
+ Bundler::SharedHelpers.major_deprecation 2, "The `github.https` setting will be removed"
270
310
  "https://github.com/#{repo_name}.git"
271
311
  else
272
- warn_github_source_change(repo_name)
273
312
  "git://github.com/#{repo_name}.git"
274
313
  end
275
314
  end
276
315
 
277
316
  # TODO: 2.0 remove this deprecated git source
278
317
  git_source(:gist) do |repo_name|
279
- warn_deprecated_git_source(:gist, 'https://gist.github.com/#{repo_name}.git')
318
+ warn_deprecated_git_source(:gist, '"https://gist.github.com/#{repo_name}.git"')
319
+
280
320
  "https://gist.github.com/#{repo_name}.git"
281
321
  end
282
322
 
283
323
  # TODO: 2.0 remove this deprecated git source
284
324
  git_source(:bitbucket) do |repo_name|
285
- user_name, repo_name = repo_name.split "/"
286
- warn_deprecated_git_source(:bitbucket, 'https://#{user_name}@bitbucket.org/#{user_name}/#{repo_name}.git')
325
+ warn_deprecated_git_source(:bitbucket, <<-'RUBY'.strip)
326
+ user_name, repo_name = repo_name.split("/")
327
+ repo_name ||= user_name
328
+ "https://#{user_name}@bitbucket.org/#{user_name}/#{repo_name}.git"
329
+ RUBY
330
+
331
+ user_name, repo_name = repo_name.split("/")
287
332
  repo_name ||= user_name
288
333
  "https://#{user_name}@bitbucket.org/#{user_name}/#{repo_name}.git"
289
334
  end
@@ -308,7 +353,7 @@ module Bundler
308
353
  end
309
354
 
310
355
  def valid_keys
311
- @valid_keys ||= %w(group groups git path glob name branch ref tag require submodules platform platforms type source install_if)
356
+ @valid_keys ||= VALID_KEYS
312
357
  end
313
358
 
314
359
  def normalize_options(name, version, opts)
@@ -318,6 +363,9 @@ module Bundler
318
363
  if name =~ /\s/
319
364
  raise GemfileError, %('#{name}' is not a valid gem name because it contains whitespace)
320
365
  end
366
+ if name.empty?
367
+ raise GemfileError, %(an empty gem name is not valid)
368
+ end
321
369
 
322
370
  normalize_hash(opts)
323
371
 
@@ -355,7 +403,7 @@ module Bundler
355
403
  opts["git"] = @git_sources[git_name].call(opts[git_name])
356
404
  end
357
405
 
358
- %w(git path).each do |type|
406
+ %w[git path].each do |type|
359
407
  next unless param = opts[type]
360
408
  if version.first && version.first =~ /^\s*=?\s*(\d[^\s]*)\s*$/
361
409
  options = opts.merge("name" => name, "version" => $1)
@@ -366,8 +414,8 @@ module Bundler
366
414
  opts["source"] = source
367
415
  end
368
416
 
369
- opts["source"] ||= @source
370
- opts["env"] ||= @env
417
+ opts["source"] ||= @source
418
+ opts["env"] ||= @env
371
419
  opts["platforms"] = platforms.dup
372
420
  opts["group"] = groups
373
421
  opts["should_include"] = install_if
@@ -377,31 +425,38 @@ module Bundler
377
425
  normalize_hash(opts)
378
426
 
379
427
  groups = groups.map {|group| ":#{group}" }.join(", ")
380
- validate_keys("group #{groups}", opts, %w(optional))
428
+ validate_keys("group #{groups}", opts, %w[optional])
381
429
 
382
430
  opts["optional"] ||= false
383
431
  end
384
432
 
385
433
  def validate_keys(command, opts, valid_keys)
386
434
  invalid_keys = opts.keys - valid_keys
387
- if invalid_keys.any?
388
- message = String.new
389
- message << "You passed #{invalid_keys.map {|k| ":" + k }.join(", ")} "
390
- message << if invalid_keys.size > 1
391
- "as options for #{command}, but they are invalid."
392
- else
393
- "as an option for #{command}, but it is invalid."
394
- end
395
-
396
- message << " Valid options are: #{valid_keys.join(", ")}"
397
- raise InvalidOption, message
435
+
436
+ git_source = opts.keys & @git_sources.keys.map(&:to_s)
437
+ if opts["branch"] && !(opts["git"] || opts["github"] || git_source.any?)
438
+ raise GemfileError, %(The `branch` option for `#{command}` is not allowed. Only gems with a git source can specify a branch)
398
439
  end
440
+
441
+ return true unless invalid_keys.any?
442
+
443
+ message = String.new
444
+ message << "You passed #{invalid_keys.map {|k| ":" + k }.join(", ")} "
445
+ message << if invalid_keys.size > 1
446
+ "as options for #{command}, but they are invalid."
447
+ else
448
+ "as an option for #{command}, but it is invalid."
449
+ end
450
+
451
+ message << " Valid options are: #{valid_keys.join(", ")}."
452
+ message << " You may be able to resolve this by upgrading Bundler to the newest version."
453
+ raise InvalidOption, message
399
454
  end
400
455
 
401
456
  def normalize_source(source)
402
457
  case source
403
458
  when :gemcutter, :rubygems, :rubyforge
404
- Bundler::SharedHelpers.major_deprecation "The source :#{source} is deprecated because HTTP " \
459
+ Bundler::SharedHelpers.major_deprecation 2, "The source :#{source} is deprecated because HTTP " \
405
460
  "requests are insecure.\nPlease change your source to 'https://" \
406
461
  "rubygems.org' if possible, or 'http://rubygems.org' if not."
407
462
  "http://rubygems.org"
@@ -412,17 +467,20 @@ module Bundler
412
467
  end
413
468
  end
414
469
 
415
- def check_primary_source_safety(source)
416
- return unless source.rubygems_primary_remotes.any?
470
+ def check_primary_source_safety(source_list)
471
+ return if source_list.rubygems_primary_remotes.empty? && source_list.global_rubygems_source.nil?
417
472
 
418
- # TODO: 2.0 upgrade from setting to default
419
- if Bundler.settings[:disable_multisource]
420
- raise GemfileError, "Warning: this Gemfile contains multiple primary sources. " \
473
+ if Bundler.feature_flag.disable_multisource?
474
+ msg = "This Gemfile contains multiple primary sources. " \
421
475
  "Each source after the first must include a block to indicate which gems " \
422
- "should come from that source. To downgrade this error to a warning, run " \
423
- "`bundle config --delete disable_multisource`"
476
+ "should come from that source"
477
+ unless Bundler.feature_flag.bundler_2_mode?
478
+ msg += ". To downgrade this error to a warning, run " \
479
+ "`bundle config --delete disable_multisource`"
480
+ end
481
+ raise GemfileEvalError, msg
424
482
  else
425
- Bundler::SharedHelpers.major_deprecation "Your Gemfile contains multiple primary sources. " \
483
+ Bundler::SharedHelpers.major_deprecation 2, "Your Gemfile contains multiple primary sources. " \
426
484
  "Using `source` more than once without a block is a security risk, and " \
427
485
  "may result in installing unexpected gems. To resolve this warning, use " \
428
486
  "a block to indicate which gems should come from the secondary source. " \
@@ -431,20 +489,20 @@ module Bundler
431
489
  end
432
490
  end
433
491
 
434
- def warn_github_source_change(repo_name)
492
+ def warn_deprecated_git_source(name, replacement, additional_message = nil)
435
493
  # TODO: 2.0 remove deprecation
436
- Bundler::SharedHelpers.major_deprecation "The :github option uses the git: protocol, which is not secure. " \
437
- "Bundler 2.0 will use the https: protocol, which is secure. Enable this change now by " \
438
- "running `bundle config github.https true`."
439
- end
494
+ additional_message &&= " #{additional_message}"
495
+ replacement = if replacement.count("\n").zero?
496
+ "{|repo_name| #{replacement} }"
497
+ else
498
+ "do |repo_name|\n#{replacement.to_s.gsub(/^/, " ")}\n end"
499
+ end
500
+
501
+ Bundler::SharedHelpers.major_deprecation 2, <<-EOS
502
+ The :#{name} git source is deprecated, and will be removed in Bundler 2.0.#{additional_message} Add this code to the top of your Gemfile to ensure it continues to work:
503
+
504
+ git_source(:#{name}) #{replacement}
440
505
 
441
- def warn_deprecated_git_source(name, repo_string)
442
- # TODO: 2.0 remove deprecation
443
- Bundler::SharedHelpers.major_deprecation <<-EOS
444
- The :#{name} git source is deprecated, and will be removed in Bundler 2.0. Add this code to your Gemfile to ensure it continues to work:
445
- git_source(:#{name}) do |repo_name|
446
- "#{repo_string}"
447
- end
448
506
  EOS
449
507
  end
450
508
 
@@ -523,7 +581,7 @@ The :#{name} git source is deprecated, and will be removed in Bundler 2.0. Add t
523
581
  lines = contents.lines.to_a
524
582
  indent = " # "
525
583
  indicator = indent.tr("#", ">")
526
- first_line = (line_numer.zero?)
584
+ first_line = line_numer.zero?
527
585
  last_line = (line_numer == (lines.count - 1))
528
586
 
529
587
  m << "\n"