bundler 1.9.0 → 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 (328) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1157 -6
  3. data/README.md +33 -6
  4. data/bundler.gemspec +51 -18
  5. data/exe/bundle +31 -0
  6. data/{bin → exe}/bundle_ruby +10 -6
  7. data/exe/bundler +4 -0
  8. data/lib/bundler.rb +326 -207
  9. data/lib/bundler/build_metadata.rb +53 -0
  10. data/lib/bundler/capistrano.rb +9 -3
  11. data/lib/bundler/cli.rb +522 -141
  12. data/lib/bundler/cli/add.rb +35 -0
  13. data/lib/bundler/cli/binstubs.rb +22 -11
  14. data/lib/bundler/cli/cache.rb +7 -6
  15. data/lib/bundler/cli/check.rb +11 -8
  16. data/lib/bundler/cli/clean.rb +7 -8
  17. data/lib/bundler/cli/common.rb +53 -7
  18. data/lib/bundler/cli/config.rb +84 -49
  19. data/lib/bundler/cli/console.rb +13 -8
  20. data/lib/bundler/cli/doctor.rb +140 -0
  21. data/lib/bundler/cli/exec.rb +77 -16
  22. data/lib/bundler/cli/gem.rb +120 -52
  23. data/lib/bundler/cli/info.rb +50 -0
  24. data/lib/bundler/cli/init.rb +21 -7
  25. data/lib/bundler/cli/inject.rb +37 -10
  26. data/lib/bundler/cli/install.rb +139 -78
  27. data/lib/bundler/cli/issue.rb +40 -0
  28. data/lib/bundler/cli/list.rb +58 -0
  29. data/lib/bundler/cli/lock.rb +63 -0
  30. data/lib/bundler/cli/open.rb +9 -6
  31. data/lib/bundler/cli/outdated.rb +221 -35
  32. data/lib/bundler/cli/package.rb +11 -7
  33. data/lib/bundler/cli/platform.rb +7 -4
  34. data/lib/bundler/cli/plugin.rb +24 -0
  35. data/lib/bundler/cli/pristine.rb +47 -0
  36. data/lib/bundler/cli/remove.rb +18 -0
  37. data/lib/bundler/cli/show.rb +11 -10
  38. data/lib/bundler/cli/update.rb +47 -29
  39. data/lib/bundler/cli/viz.rb +12 -8
  40. data/lib/bundler/compact_index_client.rb +109 -0
  41. data/lib/bundler/compact_index_client/cache.rb +118 -0
  42. data/lib/bundler/compact_index_client/updater.rb +116 -0
  43. data/lib/bundler/compatibility_guard.rb +14 -0
  44. data/lib/bundler/constants.rb +3 -1
  45. data/lib/bundler/current_ruby.rb +47 -137
  46. data/lib/bundler/definition.rb +599 -230
  47. data/lib/bundler/dep_proxy.rb +15 -10
  48. data/lib/bundler/dependency.rb +54 -25
  49. data/lib/bundler/deployment.rb +12 -2
  50. data/lib/bundler/deprecate.rb +33 -4
  51. data/lib/bundler/dsl.rb +383 -99
  52. data/lib/bundler/endpoint_specification.rb +72 -7
  53. data/lib/bundler/env.rb +121 -41
  54. data/lib/bundler/environment_preserver.rb +59 -0
  55. data/lib/bundler/errors.rb +158 -0
  56. data/lib/bundler/feature_flag.rb +74 -0
  57. data/lib/bundler/fetcher.rb +171 -280
  58. data/lib/bundler/fetcher/base.rb +52 -0
  59. data/lib/bundler/fetcher/compact_index.rb +126 -0
  60. data/lib/bundler/fetcher/dependency.rb +82 -0
  61. data/lib/bundler/fetcher/downloader.rb +84 -0
  62. data/lib/bundler/fetcher/index.rb +52 -0
  63. data/lib/bundler/friendly_errors.rb +113 -58
  64. data/lib/bundler/gem_helper.rb +73 -46
  65. data/lib/bundler/gem_helpers.rb +85 -9
  66. data/lib/bundler/gem_remote_fetcher.rb +43 -0
  67. data/lib/bundler/gem_tasks.rb +6 -1
  68. data/lib/bundler/gem_version_promoter.rb +190 -0
  69. data/lib/bundler/gemdeps.rb +29 -0
  70. data/lib/bundler/graph.rb +32 -49
  71. data/lib/bundler/index.rb +79 -67
  72. data/lib/bundler/injector.rb +219 -30
  73. data/lib/bundler/inline.rb +74 -0
  74. data/lib/bundler/installer.rb +191 -206
  75. data/lib/bundler/installer/gem_installer.rb +85 -0
  76. data/lib/bundler/installer/parallel_installer.rb +233 -0
  77. data/lib/bundler/installer/standalone.rb +53 -0
  78. data/lib/bundler/lazy_specification.rb +53 -13
  79. data/lib/bundler/lockfile_generator.rb +95 -0
  80. data/lib/bundler/lockfile_parser.rb +157 -62
  81. data/lib/bundler/match_platform.rb +15 -4
  82. data/lib/bundler/mirror.rb +223 -0
  83. data/lib/bundler/plugin.rb +292 -0
  84. data/lib/bundler/plugin/api.rb +81 -0
  85. data/lib/bundler/plugin/api/source.rb +306 -0
  86. data/lib/bundler/plugin/dsl.rb +53 -0
  87. data/lib/bundler/plugin/events.rb +61 -0
  88. data/lib/bundler/plugin/index.rb +162 -0
  89. data/lib/bundler/plugin/installer.rb +96 -0
  90. data/lib/bundler/plugin/installer/git.rb +38 -0
  91. data/lib/bundler/plugin/installer/rubygems.rb +27 -0
  92. data/lib/bundler/plugin/source_list.rb +27 -0
  93. data/lib/bundler/process_lock.rb +24 -0
  94. data/lib/bundler/psyched_yaml.rb +17 -6
  95. data/lib/bundler/remote_specification.rb +68 -11
  96. data/lib/bundler/resolver.rb +263 -229
  97. data/lib/bundler/resolver/spec_group.rb +106 -0
  98. data/lib/bundler/retry.rb +25 -19
  99. data/lib/bundler/ruby_dsl.rb +9 -2
  100. data/lib/bundler/ruby_version.rb +101 -66
  101. data/lib/bundler/rubygems_ext.rb +77 -37
  102. data/lib/bundler/rubygems_gem_installer.rb +106 -0
  103. data/lib/bundler/rubygems_integration.rb +450 -163
  104. data/lib/bundler/runtime.rb +133 -103
  105. data/lib/bundler/settings.rb +344 -83
  106. data/lib/bundler/settings/validator.rb +102 -0
  107. data/lib/bundler/setup.rb +7 -3
  108. data/lib/bundler/shared_helpers.rb +284 -54
  109. data/lib/bundler/similarity_detector.rb +21 -21
  110. data/lib/bundler/source.rb +68 -15
  111. data/lib/bundler/source/gemspec.rb +18 -0
  112. data/lib/bundler/source/git.rb +90 -55
  113. data/lib/bundler/source/git/git_proxy.rb +135 -35
  114. data/lib/bundler/source/metadata.rb +62 -0
  115. data/lib/bundler/source/path.rb +84 -61
  116. data/lib/bundler/source/path/installer.rb +53 -17
  117. data/lib/bundler/source/rubygems.rb +282 -122
  118. data/lib/bundler/source/rubygems/remote.rb +69 -0
  119. data/lib/bundler/source_list.rb +107 -22
  120. data/lib/bundler/spec_set.rb +83 -45
  121. data/lib/bundler/ssl_certs/certificate_manager.rb +8 -7
  122. data/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem +21 -0
  123. data/lib/bundler/ssl_certs/{DigiCertHighAssuranceEVRootCA.pem → rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem} +0 -0
  124. data/lib/bundler/ssl_certs/{AddTrustExternalCARoot-2048.pem → rubygems.org/AddTrustExternalCARoot.pem} +0 -0
  125. data/lib/bundler/stub_specification.rb +108 -0
  126. data/lib/bundler/templates/.document +1 -0
  127. data/lib/bundler/templates/Executable +19 -6
  128. data/lib/bundler/templates/Executable.bundler +105 -0
  129. data/lib/bundler/templates/Executable.standalone +6 -4
  130. data/lib/bundler/templates/Gemfile +4 -1
  131. data/lib/bundler/templates/gems.rb +8 -0
  132. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +68 -7
  133. data/lib/bundler/templates/newgem/Gemfile.tt +4 -2
  134. data/lib/bundler/templates/newgem/LICENSE.txt.tt +1 -1
  135. data/lib/bundler/templates/newgem/README.md.tt +19 -11
  136. data/lib/bundler/templates/newgem/Rakefile.tt +10 -6
  137. data/lib/bundler/templates/newgem/bin/console.tt +1 -1
  138. data/lib/bundler/templates/newgem/bin/setup.tt +2 -1
  139. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +4 -4
  140. data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +3 -3
  141. data/lib/bundler/templates/newgem/gitignore.tt +5 -1
  142. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +7 -6
  143. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +4 -4
  144. data/lib/bundler/templates/newgem/newgem.gemspec.tt +31 -15
  145. data/lib/bundler/templates/newgem/rspec.tt +1 -0
  146. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +3 -5
  147. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +14 -2
  148. data/lib/bundler/templates/newgem/test/{test_newgem.rb.tt → newgem_test.rb.tt} +2 -2
  149. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +4 -0
  150. data/lib/bundler/templates/newgem/travis.yml.tt +7 -0
  151. data/lib/bundler/ui.rb +5 -3
  152. data/lib/bundler/ui/rg_proxy.rb +5 -7
  153. data/lib/bundler/ui/shell.rb +69 -18
  154. data/lib/bundler/ui/silent.rb +26 -1
  155. data/lib/bundler/uri_credentials_filter.rb +37 -0
  156. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
  157. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +12 -0
  158. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
  159. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  160. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +81 -0
  161. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +223 -0
  162. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +36 -0
  163. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +66 -0
  164. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +62 -0
  165. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
  166. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +61 -0
  167. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +126 -0
  168. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +46 -0
  169. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +36 -0
  170. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +136 -0
  171. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +143 -0
  172. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
  173. data/lib/bundler/vendor/{Molinillo-0.2.1 → molinillo}/lib/molinillo/modules/specification_provider.rb +11 -0
  174. data/lib/bundler/vendor/{Molinillo-0.2.1 → molinillo}/lib/molinillo/modules/ui.rb +6 -2
  175. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +837 -0
  176. data/lib/bundler/vendor/{Molinillo-0.2.1 → molinillo}/lib/molinillo/resolver.rb +6 -3
  177. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +58 -0
  178. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/faster.rb +1 -0
  179. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent.rb +27 -24
  180. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent/ssl_reuse.rb +2 -1
  181. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor.rb +47 -22
  182. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions.rb +31 -29
  183. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/create_file.rb +3 -2
  184. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/create_link.rb +3 -2
  185. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/directory.rb +3 -3
  186. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/empty_directory.rb +16 -8
  187. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/file_manipulation.rb +66 -18
  188. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/inject_into_file.rb +18 -16
  189. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/base.rb +67 -44
  190. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/command.rb +13 -11
  191. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/core_ext/hash_with_indifferent_access.rb +21 -1
  192. data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +12 -0
  193. data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +129 -0
  194. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/error.rb +3 -3
  195. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/group.rb +14 -14
  196. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/invocation.rb +4 -5
  197. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/line_editor.rb +2 -2
  198. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/line_editor/basic.rb +2 -0
  199. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/line_editor/readline.rb +0 -0
  200. data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -0
  201. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/parser/argument.rb +4 -7
  202. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/parser/arguments.rb +16 -16
  203. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/parser/option.rb +42 -21
  204. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/parser/options.rb +13 -10
  205. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/rake_compat.rb +1 -1
  206. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/runner.rb +35 -33
  207. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/shell.rb +4 -4
  208. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/shell/basic.rb +49 -33
  209. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/shell/color.rb +2 -2
  210. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/shell/html.rb +5 -5
  211. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/util.rb +8 -7
  212. data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/version.rb +1 -1
  213. data/lib/bundler/vendored_fileutils.rb +9 -0
  214. data/lib/bundler/vendored_molinillo.rb +4 -5
  215. data/lib/bundler/vendored_persistent.rb +45 -4
  216. data/lib/bundler/vendored_thor.rb +8 -5
  217. data/lib/bundler/version.rb +23 -1
  218. data/lib/bundler/version_ranges.rb +76 -0
  219. data/lib/bundler/vlad.rb +8 -2
  220. data/lib/bundler/worker.rb +39 -6
  221. data/lib/bundler/yaml_serializer.rb +90 -0
  222. data/man/bundle-add.1 +58 -0
  223. data/man/bundle-add.1.txt +52 -0
  224. data/man/bundle-add.ronn +40 -0
  225. data/man/bundle-binstubs.1 +40 -0
  226. data/man/bundle-binstubs.1.txt +48 -0
  227. data/man/bundle-binstubs.ronn +43 -0
  228. data/man/bundle-check.1 +31 -0
  229. data/man/bundle-check.1.txt +33 -0
  230. data/man/bundle-check.ronn +26 -0
  231. data/man/bundle-clean.1 +24 -0
  232. data/man/bundle-clean.1.txt +26 -0
  233. data/man/bundle-clean.ronn +18 -0
  234. data/man/bundle-config.1 +497 -0
  235. data/man/bundle-config.1.txt +529 -0
  236. data/man/bundle-config.ronn +256 -31
  237. data/man/bundle-doctor.1 +44 -0
  238. data/man/bundle-doctor.1.txt +44 -0
  239. data/man/bundle-doctor.ronn +33 -0
  240. data/man/bundle-exec.1 +165 -0
  241. data/man/bundle-exec.1.txt +178 -0
  242. data/man/bundle-exec.ronn +19 -3
  243. data/man/bundle-gem.1 +80 -0
  244. data/man/bundle-gem.1.txt +91 -0
  245. data/man/bundle-gem.ronn +78 -0
  246. data/man/bundle-info.1 +20 -0
  247. data/man/bundle-info.1.txt +21 -0
  248. data/man/bundle-info.ronn +17 -0
  249. data/man/bundle-init.1 +25 -0
  250. data/man/bundle-init.1.txt +34 -0
  251. data/man/bundle-init.ronn +29 -0
  252. data/man/bundle-inject.1 +33 -0
  253. data/man/bundle-inject.1.txt +32 -0
  254. data/man/bundle-inject.ronn +22 -0
  255. data/man/bundle-install.1 +308 -0
  256. data/man/bundle-install.1.txt +396 -0
  257. data/man/bundle-install.ronn +64 -67
  258. data/man/bundle-list.1 +50 -0
  259. data/man/bundle-list.1.txt +43 -0
  260. data/man/bundle-list.ronn +33 -0
  261. data/man/bundle-lock.1 +84 -0
  262. data/man/bundle-lock.1.txt +93 -0
  263. data/man/bundle-lock.ronn +94 -0
  264. data/man/bundle-open.1 +32 -0
  265. data/man/bundle-open.1.txt +29 -0
  266. data/man/bundle-open.ronn +19 -0
  267. data/man/bundle-outdated.1 +155 -0
  268. data/man/bundle-outdated.1.txt +131 -0
  269. data/man/bundle-outdated.ronn +111 -0
  270. data/man/bundle-package.1 +55 -0
  271. data/man/bundle-package.1.txt +79 -0
  272. data/man/bundle-package.ronn +14 -8
  273. data/man/bundle-platform.1 +61 -0
  274. data/man/bundle-platform.1.txt +57 -0
  275. data/man/bundle-platform.ronn +1 -1
  276. data/man/bundle-pristine.1 +34 -0
  277. data/man/bundle-pristine.1.txt +44 -0
  278. data/man/bundle-pristine.ronn +34 -0
  279. data/man/bundle-remove.1 +31 -0
  280. data/man/bundle-remove.1.txt +34 -0
  281. data/man/bundle-remove.ronn +23 -0
  282. data/man/bundle-show.1 +23 -0
  283. data/man/bundle-show.1.txt +27 -0
  284. data/man/bundle-show.ronn +21 -0
  285. data/man/bundle-update.1 +394 -0
  286. data/man/bundle-update.1.txt +391 -0
  287. data/man/bundle-update.ronn +180 -18
  288. data/man/bundle-viz.1 +39 -0
  289. data/man/bundle-viz.1.txt +39 -0
  290. data/man/bundle-viz.ronn +30 -0
  291. data/man/bundle.1 +136 -0
  292. data/man/bundle.1.txt +116 -0
  293. data/man/bundle.ronn +46 -33
  294. data/man/gemfile.5 +689 -0
  295. data/man/gemfile.5.ronn +127 -79
  296. data/man/gemfile.5.txt +653 -0
  297. data/man/index.txt +25 -7
  298. metadata +242 -95
  299. data/.gitignore +0 -16
  300. data/.rspec +0 -3
  301. data/.travis.yml +0 -110
  302. data/CODE_OF_CONDUCT.md +0 -40
  303. data/CONTRIBUTING.md +0 -32
  304. data/DEVELOPMENT.md +0 -119
  305. data/ISSUES.md +0 -96
  306. data/Rakefile +0 -302
  307. data/UPGRADING.md +0 -103
  308. data/bin/bundle +0 -21
  309. data/bin/bundler +0 -21
  310. data/lib/bundler/anonymizable_uri.rb +0 -32
  311. data/lib/bundler/environment.rb +0 -42
  312. data/lib/bundler/gem_installer.rb +0 -9
  313. data/lib/bundler/gem_path_manipulation.rb +0 -8
  314. data/lib/bundler/ssl_certs/AddTrustExternalCARoot.pem +0 -32
  315. data/lib/bundler/ssl_certs/Class3PublicPrimaryCertificationAuthority.pem +0 -14
  316. data/lib/bundler/ssl_certs/EntrustnetSecureServerCertificationAuthority.pem +0 -28
  317. data/lib/bundler/ssl_certs/GeoTrustGlobalCA.pem +0 -20
  318. data/lib/bundler/templates/newgem/.travis.yml.tt +0 -3
  319. data/lib/bundler/templates/newgem/test/minitest_helper.rb.tt +0 -4
  320. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo.rb +0 -5
  321. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/dependency_graph.rb +0 -266
  322. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/errors.rb +0 -69
  323. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/gem_metadata.rb +0 -3
  324. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/resolution.rb +0 -412
  325. data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/state.rb +0 -43
  326. data/lib/bundler/vendor/thor-0.19.1/lib/thor/core_ext/io_binary_read.rb +0 -10
  327. data/lib/bundler/vendor/thor-0.19.1/lib/thor/core_ext/ordered_hash.rb +0 -98
  328. data/lib/bundler/vendor/thor-0.19.1/lib/thor/parser.rb +0 -4
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class CLI::Info
5
+ attr_reader :gem_name, :options
6
+ def initialize(options, gem_name)
7
+ @options = options
8
+ @gem_name = gem_name
9
+ end
10
+
11
+ def run
12
+ spec = spec_for_gem(gem_name)
13
+
14
+ spec_not_found(gem_name) unless spec
15
+ return print_gem_path(spec) if @options[:path]
16
+ print_gem_info(spec)
17
+ end
18
+
19
+ private
20
+
21
+ def spec_for_gem(gem_name)
22
+ spec = Bundler.definition.specs.find {|s| s.name == gem_name }
23
+ spec || default_gem_spec(gem_name)
24
+ end
25
+
26
+ def default_gem_spec(gem_name)
27
+ return unless Gem::Specification.respond_to?(:find_all_by_name)
28
+ gem_spec = Gem::Specification.find_all_by_name(gem_name).last
29
+ return gem_spec if gem_spec && gem_spec.respond_to?(:default_gem?) && gem_spec.default_gem?
30
+ end
31
+
32
+ def spec_not_found(gem_name)
33
+ raise GemNotFound, Bundler::CLI::Common.gem_not_found_message(gem_name, Bundler.definition.dependencies)
34
+ end
35
+
36
+ def print_gem_path(spec)
37
+ Bundler.ui.info spec.full_gem_path
38
+ end
39
+
40
+ def print_gem_info(spec)
41
+ gem_info = String.new
42
+ gem_info << " * #{spec.name} (#{spec.version}#{spec.git_version})\n"
43
+ gem_info << "\tSummary: #{spec.summary}\n" if spec.summary
44
+ gem_info << "\tHomepage: #{spec.homepage}\n" if spec.homepage
45
+ gem_info << "\tPath: #{spec.full_gem_path}\n"
46
+ gem_info << "\tDefault Gem: yes" if spec.respond_to?(:default_gem?) && spec.default_gem?
47
+ Bundler.ui.info gem_info
48
+ end
49
+ end
50
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bundler
2
4
  class CLI::Init
3
5
  attr_reader :options
@@ -6,8 +8,13 @@ module Bundler
6
8
  end
7
9
 
8
10
  def run
9
- if File.exist?("Gemfile")
10
- Bundler.ui.error "Gemfile already exists at #{Dir.pwd}/Gemfile"
11
+ if File.exist?(gemfile)
12
+ Bundler.ui.error "#{gemfile} already exists at #{File.expand_path(gemfile)}"
13
+ exit 1
14
+ end
15
+
16
+ unless File.writable?(Dir.pwd)
17
+ Bundler.ui.error "Can not create #{gemfile} as the current directory is not writable."
11
18
  exit 1
12
19
  end
13
20
 
@@ -17,17 +24,24 @@ module Bundler
17
24
  Bundler.ui.error "Gem specification #{gemspec} doesn't exist"
18
25
  exit 1
19
26
  end
20
- spec = Gem::Specification.load(gemspec)
21
- puts "Writing new Gemfile to #{Dir.pwd}/Gemfile"
22
- File.open('Gemfile', 'wb') do |file|
27
+
28
+ spec = Bundler.load_gemspec_uncached(gemspec)
29
+
30
+ File.open(gemfile, "wb") do |file|
23
31
  file << "# Generated from #{gemspec}\n"
24
32
  file << spec.to_gemfile
25
33
  end
26
34
  else
27
- puts "Writing new Gemfile to #{Dir.pwd}/Gemfile"
28
- FileUtils.cp(File.expand_path('../../templates/Gemfile', __FILE__), 'Gemfile')
35
+ FileUtils.cp(File.expand_path("../../templates/#{gemfile}", __FILE__), gemfile)
29
36
  end
37
+
38
+ puts "Writing new #{gemfile} to #{SharedHelpers.pwd}/#{gemfile}"
30
39
  end
31
40
 
41
+ private
42
+
43
+ def gemfile
44
+ @gemfile ||= Bundler.feature_flag.init_gems_rb? ? "gems.rb" : "Gemfile"
45
+ end
32
46
  end
33
47
  end
@@ -1,33 +1,60 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bundler
2
4
  class CLI::Inject
3
- attr_reader :options, :name, :version, :gems
4
- def initialize(options, name, version, gems)
5
+ attr_reader :options, :name, :version, :group, :source, :gems
6
+ def initialize(options, name, version)
5
7
  @options = options
6
8
  @name = name
7
- @version = version
8
- @gems = gems
9
+ @version = version || last_version_number
10
+ @group = options[:group].split(",") unless options[:group].nil?
11
+ @source = options[:source]
12
+ @gems = []
9
13
  end
10
14
 
11
15
  def run
12
16
  # The required arguments allow Thor to give useful feedback when the arguments
13
17
  # are incorrect. This adds those first two arguments onto the list as a whole.
14
- gems.unshift(version).unshift(name)
18
+ gems.unshift(source).unshift(group).unshift(version).unshift(name)
15
19
 
16
20
  # Build an array of Dependency objects out of the arguments
17
21
  deps = []
18
- gems.each_slice(2) do |gem_name, gem_version|
19
- deps << Bundler::Dependency.new(gem_name, gem_version)
22
+ # when `inject` support addition of more than one gem, then this loop will
23
+ # help. Currently this loop is running once.
24
+ gems.each_slice(4) do |gem_name, gem_version, gem_group, gem_source|
25
+ ops = Gem::Requirement::OPS.map {|key, _val| key }
26
+ has_op = ops.any? {|op| gem_version.start_with? op }
27
+ gem_version = "~> #{gem_version}" unless has_op
28
+ deps << Bundler::Dependency.new(gem_name, gem_version, "group" => gem_group, "source" => gem_source)
20
29
  end
21
30
 
22
- added = Injector.inject(deps)
31
+ added = Injector.inject(deps, options)
23
32
 
24
33
  if added.any?
25
34
  Bundler.ui.confirm "Added to Gemfile:"
26
- Bundler.ui.confirm added.map{ |g| " #{g}" }.join("\n")
35
+ Bundler.ui.confirm(added.map do |d|
36
+ name = "'#{d.name}'"
37
+ requirement = ", '#{d.requirement}'"
38
+ group = ", :group => #{d.groups.inspect}" if d.groups != Array(:default)
39
+ source = ", :source => '#{d.source}'" unless d.source.nil?
40
+ %(gem #{name}#{requirement}#{group}#{source})
41
+ end.join("\n"))
27
42
  else
28
- Bundler.ui.confirm "All injected gems were already present in the Gemfile"
43
+ Bundler.ui.confirm "All gems were already present in the Gemfile"
29
44
  end
30
45
  end
31
46
 
47
+ private
48
+
49
+ def last_version_number
50
+ definition = Bundler.definition(true)
51
+ definition.resolve_remotely!
52
+ specs = definition.index[name].sort_by(&:version)
53
+ unless options[:pre]
54
+ specs.delete_if {|b| b.respond_to?(:version) && b.version.prerelease? }
55
+ end
56
+ spec = specs.last
57
+ spec.version.to_s
58
+ end
32
59
  end
33
60
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bundler
2
4
  class CLI::Install
3
5
  attr_reader :options
@@ -10,104 +12,74 @@ module Bundler
10
12
 
11
13
  warn_if_root
12
14
 
13
- if options[:without]
14
- options[:without] = options[:without].map{|g| g.tr(' ', ':') }
15
- end
15
+ normalize_groups
16
16
 
17
- ENV['RB_USER_INSTALL'] = '1' if Bundler::FREEBSD
17
+ Bundler::SharedHelpers.set_env "RB_USER_INSTALL", "1" if Bundler::FREEBSD
18
18
 
19
- # Just disable color in deployment mode
19
+ # Disable color in deployment mode
20
20
  Bundler.ui.shell = Thor::Shell::Basic.new if options[:deployment]
21
21
 
22
- if (options[:path] || options[:deployment]) && options[:system]
23
- Bundler.ui.error "You have specified both a path to install your gems to, \n" \
24
- "as well as --system. Please choose."
25
- exit 1
26
- end
22
+ check_for_options_conflicts
27
23
 
28
- if (options["trust-policy"])
29
- unless (Bundler.rubygems.security_policies.keys.include?(options["trust-policy"]))
30
- Bundler.ui.error "Rubygems doesn't know about trust policy '#{options["trust-policy"]}'. " \
31
- "The known policies are: #{Bundler.rubygems.security_policies.keys.join(', ')}."
32
- exit 1
33
- end
34
- Bundler.settings["trust-policy"] = options["trust-policy"]
35
- else
36
- Bundler.settings["trust-policy"] = nil if Bundler.settings["trust-policy"]
37
- end
24
+ check_trust_policy
38
25
 
39
- if options[:deployment] || options[:frozen]
26
+ if options[:deployment] || options[:frozen] || Bundler.frozen_bundle?
40
27
  unless Bundler.default_lockfile.exist?
41
- flag = options[:deployment] ? '--deployment' : '--frozen'
42
- raise ProductionError, "The #{flag} flag requires a Gemfile.lock. Please make " \
43
- "sure you have checked your Gemfile.lock into version control " \
28
+ flag = "--deployment flag" if options[:deployment]
29
+ flag ||= "--frozen flag" if options[:frozen]
30
+ flag ||= "deployment setting"
31
+ raise ProductionError, "The #{flag} requires a #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)}. Please make " \
32
+ "sure you have checked your #{Bundler.default_lockfile.relative_path_from(SharedHelpers.pwd)} into version control " \
44
33
  "before deploying."
45
34
  end
46
35
 
47
- if Bundler.app_cache.exist?
48
- options[:local] = true
49
- end
36
+ options[:local] = true if Bundler.app_cache.exist?
50
37
 
51
- Bundler.settings[:frozen] = '1'
38
+ if Bundler.feature_flag.deployment_means_frozen?
39
+ Bundler.settings.set_command_option :deployment, true
40
+ else
41
+ Bundler.settings.set_command_option :frozen, true
42
+ end
52
43
  end
53
44
 
54
45
  # When install is called with --no-deployment, disable deployment mode
55
46
  if options[:deployment] == false
56
- Bundler.settings.delete(:frozen)
47
+ Bundler.settings.set_command_option :frozen, nil
57
48
  options[:system] = true
58
49
  end
59
50
 
60
- Bundler.settings[:path] = nil if options[:system]
61
- Bundler.settings[:path] = "vendor/bundle" if options[:deployment]
62
- Bundler.settings[:path] = options["path"] if options["path"]
63
- Bundler.settings[:path] ||= "bundle" if options["standalone"]
64
- Bundler.settings[:bin] = options["binstubs"] if options["binstubs"]
65
- Bundler.settings[:bin] = nil if options["binstubs"] && options["binstubs"].empty?
66
- Bundler.settings[:shebang] = options["shebang"] if options["shebang"]
67
- Bundler.settings[:jobs] = options["jobs"] if options["jobs"]
68
- Bundler.settings[:no_prune] = true if options["no-prune"]
69
- Bundler.settings[:no_install] = true if options["no-install"]
70
- Bundler.settings[:clean] = options["clean"] if options["clean"]
71
- Bundler.settings.without = options[:without]
51
+ normalize_settings
52
+
72
53
  Bundler::Fetcher.disable_endpoint = options["full-index"]
73
- Bundler.settings[:disable_shared_gems] = Bundler.settings[:path] ? '1' : nil
74
54
 
75
- # rubygems plugins sometimes hook into the gem install process
76
- Gem.load_env_plugins if Gem.respond_to?(:load_env_plugins)
55
+ if options["binstubs"]
56
+ Bundler::SharedHelpers.major_deprecation 2,
57
+ "The --binstubs option will be removed in favor of `bundle binstubs`"
58
+ end
59
+
60
+ Plugin.gemfile_install(Bundler.default_gemfile) if Bundler.feature_flag.plugins?
77
61
 
78
62
  definition = Bundler.definition
79
- definition.validate_ruby!
80
- Installer.install(Bundler.root, definition, options)
81
- Bundler.load.cache if Bundler.app_cache.exist? && !options["no-cache"] && !Bundler.settings[:frozen]
63
+ definition.validate_runtime!
64
+
65
+ installer = Installer.install(Bundler.root, definition, options)
66
+ Bundler.load.cache if Bundler.app_cache.exist? && !options["no-cache"] && !Bundler.frozen_bundle?
82
67
 
83
68
  Bundler.ui.confirm "Bundle complete! #{dependencies_count_for(definition)}, #{gems_installed_for(definition)}."
84
- confirm_without_groups
69
+ Bundler::CLI::Common.output_without_groups_message
85
70
 
86
- if Bundler.settings[:path]
87
- absolute_path = File.expand_path(Bundler.settings[:path])
88
- relative_path = absolute_path.sub(File.expand_path('.'), '.')
89
- Bundler.ui.confirm "Bundled gems are installed into #{relative_path}."
71
+ if Bundler.use_system_gems?
72
+ Bundler.ui.confirm "Use `bundle info [gemname]` to see where a bundled gem is installed."
90
73
  else
91
- Bundler.ui.confirm "Use `bundle show [gemname]` to see where a bundled gem is installed."
74
+ relative_path = Bundler.configured_bundle_path.base_path_relative_to_pwd
75
+ Bundler.ui.confirm "Bundled gems are installed into `#{relative_path}`"
92
76
  end
93
77
 
94
- Installer.post_install_messages.to_a.each do |name, msg|
95
- Bundler.ui.confirm "Post-install message from #{name}:"
96
- Bundler.ui.info msg
97
- end
78
+ Bundler::CLI::Common.output_post_install_messages installer.post_install_messages
98
79
 
99
- Installer.ambiguous_gems.to_a.each do |name, installed_from_uri, *also_found_in_uris|
100
- Bundler.ui.error "Warning: the gem '#{name}' was found in multiple sources."
101
- Bundler.ui.error "Installed from: #{installed_from_uri}"
102
- Bundler.ui.error "Also found in:"
103
- also_found_in_uris.each { |uri| Bundler.ui.error " * #{uri}" }
104
- Bundler.ui.error "You should add a source requirement to restrict this gem to your preferred source."
105
- Bundler.ui.error "For example:"
106
- Bundler.ui.error " gem '#{name}', :source => '#{installed_from_uri}'"
107
- Bundler.ui.error "Then uninstall the gem '#{name}' (or delete all bundled gems) and then install again."
108
- end
80
+ warn_ambiguous_gems
109
81
 
110
- if Bundler.settings[:clean] && Bundler.settings[:path]
82
+ if CLI::Common.clean_after_install?
111
83
  require "bundler/cli/clean"
112
84
  Bundler::CLI::Clean.new(options).run
113
85
  end
@@ -124,33 +96,122 @@ module Bundler
124
96
  WARN
125
97
  end
126
98
  raise e
99
+ rescue Gem::InvalidSpecificationException => e
100
+ Bundler.ui.warn "You have one or more invalid gemspecs that need to be fixed."
101
+ raise e
127
102
  end
128
103
 
129
104
  private
130
105
 
131
106
  def warn_if_root
132
- return if Bundler::WINDOWS || !Process.uid.zero?
107
+ return if Bundler.settings[:silence_root_warning] || Bundler::WINDOWS || !Process.uid.zero?
133
108
  Bundler.ui.warn "Don't run Bundler as root. Bundler can ask for sudo " \
134
109
  "if it is needed, and installing your bundle as root will break this " \
135
110
  "application for all non-root users on this machine.", :wrap => true
136
111
  end
137
112
 
138
- def confirm_without_groups
139
- if Bundler.settings.without.any?
140
- require "bundler/cli/common"
141
- Bundler.ui.confirm Bundler::CLI::Common.without_groups_message
142
- end
143
- end
144
-
145
113
  def dependencies_count_for(definition)
146
114
  count = definition.dependencies.count
147
- "#{count} Gemfile #{count == 1 ? 'dependency' : 'dependencies'}"
115
+ "#{count} Gemfile #{count == 1 ? "dependency" : "dependencies"}"
148
116
  end
149
117
 
150
118
  def gems_installed_for(definition)
151
119
  count = definition.specs.count
152
- "#{count} #{count == 1 ? 'gem' : 'gems'} now installed"
120
+ "#{count} #{count == 1 ? "gem" : "gems"} now installed"
121
+ end
122
+
123
+ def check_for_group_conflicts_in_cli_options
124
+ conflicting_groups = Array(options[:without]) & Array(options[:with])
125
+ return if conflicting_groups.empty?
126
+ raise InvalidOption, "You can't list a group in both with and without." \
127
+ " The offending groups are: #{conflicting_groups.join(", ")}."
128
+ end
129
+
130
+ def check_for_options_conflicts
131
+ if (options[:path] || options[:deployment]) && options[:system]
132
+ error_message = String.new
133
+ error_message << "You have specified both --path as well as --system. Please choose only one option.\n" if options[:path]
134
+ error_message << "You have specified both --deployment as well as --system. Please choose only one option.\n" if options[:deployment]
135
+ raise InvalidOption.new(error_message)
136
+ end
153
137
  end
154
138
 
139
+ def check_trust_policy
140
+ trust_policy = options["trust-policy"]
141
+ unless Bundler.rubygems.security_policies.keys.unshift(nil).include?(trust_policy)
142
+ raise InvalidOption, "RubyGems doesn't know about trust policy '#{trust_policy}'. " \
143
+ "The known policies are: #{Bundler.rubygems.security_policies.keys.join(", ")}."
144
+ end
145
+ Bundler.settings.set_command_option_if_given :"trust-policy", trust_policy
146
+ end
147
+
148
+ def normalize_groups
149
+ options[:with] &&= options[:with].join(":").tr(" ", ":").split(":")
150
+ options[:without] &&= options[:without].join(":").tr(" ", ":").split(":")
151
+
152
+ check_for_group_conflicts_in_cli_options
153
+
154
+ Bundler.settings.set_command_option :with, nil if options[:with] == []
155
+ Bundler.settings.set_command_option :without, nil if options[:without] == []
156
+
157
+ with = options.fetch(:with, [])
158
+ with |= Bundler.settings[:with].map(&:to_s)
159
+ with -= options[:without] if options[:without]
160
+
161
+ without = options.fetch(:without, [])
162
+ without |= Bundler.settings[:without].map(&:to_s)
163
+ without -= options[:with] if options[:with]
164
+
165
+ options[:with] = with
166
+ options[:without] = without
167
+ end
168
+
169
+ def normalize_settings
170
+ Bundler.settings.set_command_option :path, nil if options[:system]
171
+ Bundler.settings.temporary(:path_relative_to_cwd => false) do
172
+ Bundler.settings.set_command_option :path, "vendor/bundle" if options[:deployment]
173
+ end
174
+ Bundler.settings.set_command_option_if_given :path, options[:path]
175
+ Bundler.settings.temporary(:path_relative_to_cwd => false) do
176
+ Bundler.settings.set_command_option :path, "bundle" if options["standalone"] && Bundler.settings[:path].nil?
177
+ end
178
+
179
+ bin_option = options["binstubs"]
180
+ bin_option = nil if bin_option && bin_option.empty?
181
+ Bundler.settings.set_command_option :bin, bin_option if options["binstubs"]
182
+
183
+ Bundler.settings.set_command_option_if_given :shebang, options["shebang"]
184
+
185
+ Bundler.settings.set_command_option_if_given :jobs, options["jobs"]
186
+
187
+ Bundler.settings.set_command_option_if_given :no_prune, options["no-prune"]
188
+
189
+ Bundler.settings.set_command_option_if_given :no_install, options["no-install"]
190
+
191
+ Bundler.settings.set_command_option_if_given :clean, options["clean"]
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
200
+
201
+ options[:force] = options[:redownload]
202
+ end
203
+
204
+ def warn_ambiguous_gems
205
+ Installer.ambiguous_gems.to_a.each do |name, installed_from_uri, *also_found_in_uris|
206
+ Bundler.ui.error "Warning: the gem '#{name}' was found in multiple sources."
207
+ Bundler.ui.error "Installed from: #{installed_from_uri}"
208
+ Bundler.ui.error "Also found in:"
209
+ also_found_in_uris.each {|uri| Bundler.ui.error " * #{uri}" }
210
+ Bundler.ui.error "You should add a source requirement to restrict this gem to your preferred source."
211
+ Bundler.ui.error "For example:"
212
+ Bundler.ui.error " gem '#{name}', :source => '#{installed_from_uri}'"
213
+ Bundler.ui.error "Then uninstall the gem '#{name}' (or delete all bundled gems) and then install again."
214
+ end
215
+ end
155
216
  end
156
217
  end