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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bundler
2
4
  class SimilarityDetector
3
5
  SimilarityScore = Struct.new(:string, :distance)
@@ -8,56 +10,54 @@ module Bundler
8
10
  end
9
11
 
10
12
  # return an array of words similar to 'word' from the corpus
11
- def similar_words(word, limit=3)
12
- words_by_similarity = @corpus.map{|w| SimilarityScore.new(w, levenshtein_distance(word, w))}
13
- words_by_similarity.select{|s| s.distance<=limit}.sort_by(&:distance).map(&:string)
13
+ def similar_words(word, limit = 3)
14
+ words_by_similarity = @corpus.map {|w| SimilarityScore.new(w, levenshtein_distance(word, w)) }
15
+ words_by_similarity.select {|s| s.distance <= limit }.sort_by(&:distance).map(&:string)
14
16
  end
15
17
 
16
18
  # return the result of 'similar_words', concatenated into a list
17
19
  # (eg "a, b, or c")
18
- def similar_word_list(word, limit=3)
19
- words = similar_words(word,limit)
20
- if words.length==1
20
+ def similar_word_list(word, limit = 3)
21
+ words = similar_words(word, limit)
22
+ if words.length == 1
21
23
  words[0]
22
- elsif words.length>1
23
- [words[0..-2].join(', '), words[-1]].join(' or ')
24
+ elsif words.length > 1
25
+ [words[0..-2].join(", "), words[-1]].join(" or ")
24
26
  end
25
27
  end
26
28
 
27
-
28
29
  protected
30
+
29
31
  # http://www.informit.com/articles/article.aspx?p=683059&seqNum=36
30
- def levenshtein_distance(this, that, ins=2, del=2, sub=1)
32
+ def levenshtein_distance(this, that, ins = 2, del = 2, sub = 1)
31
33
  # ins, del, sub are weighted costs
32
34
  return nil if this.nil?
33
35
  return nil if that.nil?
34
- dm = [] # distance matrix
36
+ dm = [] # distance matrix
35
37
 
36
38
  # Initialize first row values
37
- dm[0] = (0..this.length).collect { |i| i * ins }
39
+ dm[0] = (0..this.length).collect {|i| i * ins }
38
40
  fill = [0] * (this.length - 1)
39
41
 
40
42
  # Initialize first column values
41
- for i in 1..that.length
43
+ (1..that.length).each do |i|
42
44
  dm[i] = [i * del, fill.flatten]
43
45
  end
44
46
 
45
47
  # populate matrix
46
- for i in 1..that.length
47
- for j in 1..this.length
48
+ (1..that.length).each do |i|
49
+ (1..this.length).each do |j|
48
50
  # critical comparison
49
51
  dm[i][j] = [
50
- dm[i-1][j-1] +
51
- (this[j-1] == that[i-1] ? 0 : sub),
52
- dm[i][j-1] + ins,
53
- dm[i-1][j] + del
54
- ].min
52
+ dm[i - 1][j - 1] + (this[j - 1] == that[i - 1] ? 0 : sub),
53
+ dm[i][j - 1] + ins,
54
+ dm[i - 1][j] + del
55
+ ].min
55
56
  end
56
57
  end
57
58
 
58
59
  # The last value in matrix is the Levenshtein distance between the strings
59
60
  dm[that.length][this.length]
60
61
  end
61
-
62
62
  end
63
63
  end
@@ -1,18 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Bundler
2
4
  class Source
3
- autoload :Rubygems, 'bundler/source/rubygems'
4
- autoload :Path, 'bundler/source/path'
5
- autoload :Git, 'bundler/source/git'
6
-
7
- def self.mirror_for(uri)
8
- uri = URI(uri.to_s) unless uri.is_a?(URI)
9
-
10
- # Settings keys are all downcased
11
- mirrors = Bundler.settings.gem_mirrors
12
- normalized_key = URI(uri.to_s.downcase)
13
-
14
- mirrors[normalized_key] || uri
15
- end
5
+ autoload :Gemspec, "bundler/source/gemspec"
6
+ autoload :Git, "bundler/source/git"
7
+ autoload :Metadata, "bundler/source/metadata"
8
+ autoload :Path, "bundler/source/path"
9
+ autoload :Rubygems, "bundler/source/rubygems"
16
10
 
17
11
  attr_accessor :dependency_names
18
12
 
@@ -22,12 +16,13 @@ module Bundler
22
16
 
23
17
  def version_message(spec)
24
18
  message = "#{spec.name} #{spec.version}"
19
+ message += " (#{spec.platform})" if spec.platform != Gem::Platform::RUBY && !spec.platform.nil?
25
20
 
26
21
  if Bundler.locked_gems
27
- locked_spec = Bundler.locked_gems.specs.find { |s| s.name == spec.name }
22
+ locked_spec = Bundler.locked_gems.specs.find {|s| s.name == spec.name }
28
23
  locked_spec_version = locked_spec.version if locked_spec
29
24
  if locked_spec_version && spec.version != locked_spec_version
30
- message << " (was #{locked_spec_version})"
25
+ message += Bundler.ui.add_color(" (was #{locked_spec_version})", version_color(spec.version, locked_spec_version))
31
26
  end
32
27
  end
33
28
 
@@ -37,5 +32,63 @@ module Bundler
37
32
  def can_lock?(spec)
38
33
  spec.source == self
39
34
  end
35
+
36
+ # it's possible that gems from one source depend on gems from some
37
+ # other source, so now we download gemspecs and iterate over those
38
+ # dependencies, looking for gems we don't have info on yet.
39
+ def double_check_for(*); end
40
+
41
+ def dependency_names_to_double_check
42
+ specs.dependency_names
43
+ end
44
+
45
+ def include?(other)
46
+ other == self
47
+ end
48
+
49
+ def inspect
50
+ "#<#{self.class}:0x#{object_id} #{self}>"
51
+ end
52
+
53
+ def path?
54
+ instance_of?(Bundler::Source::Path)
55
+ end
56
+
57
+ def extension_cache_path(spec)
58
+ return unless Bundler.feature_flag.global_gem_cache?
59
+ return unless source_slug = extension_cache_slug(spec)
60
+ Bundler.user_cache.join(
61
+ "extensions", Gem::Platform.local.to_s, Bundler.ruby_scope,
62
+ source_slug, spec.full_name
63
+ )
64
+ end
65
+
66
+ private
67
+
68
+ def version_color(spec_version, locked_spec_version)
69
+ if Gem::Version.correct?(spec_version) && Gem::Version.correct?(locked_spec_version)
70
+ # display yellow if there appears to be a regression
71
+ earlier_version?(spec_version, locked_spec_version) ? :yellow : :green
72
+ else
73
+ # default to green if the versions cannot be directly compared
74
+ :green
75
+ end
76
+ end
77
+
78
+ def earlier_version?(spec_version, locked_spec_version)
79
+ Gem::Version.new(spec_version) < Gem::Version.new(locked_spec_version)
80
+ end
81
+
82
+ def print_using_message(message)
83
+ if !message.include?("(was ") && Bundler.feature_flag.suppress_install_using_messages?
84
+ Bundler.ui.debug message
85
+ else
86
+ Bundler.ui.info message
87
+ end
88
+ end
89
+
90
+ def extension_cache_slug(_)
91
+ nil
92
+ end
40
93
  end
41
94
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class Source
5
+ class Gemspec < Path
6
+ attr_reader :gemspec
7
+
8
+ def initialize(options)
9
+ super
10
+ @gemspec = options["gemspec"]
11
+ end
12
+
13
+ def as_path_source
14
+ Path.new(options)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,12 +1,12 @@
1
- require 'fileutils'
2
- require 'uri'
3
- require 'digest/sha1'
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/vendored_fileutils"
4
+ require "uri"
4
5
 
5
6
  module Bundler
6
7
  class Source
7
-
8
8
  class Git < Path
9
- autoload :GitProxy, 'bundler/source/git/git_proxy'
9
+ autoload :GitProxy, "bundler/source/git/git_proxy"
10
10
 
11
11
  attr_reader :uri, :ref, :branch, :options, :submodules
12
12
 
@@ -18,14 +18,15 @@ module Bundler
18
18
  @allow_remote = false
19
19
 
20
20
  # Stringify options that could be set as symbols
21
- %w(ref branch tag revision).each{|k| options[k] = options[k].to_s if options[k] }
21
+ %w[ref branch tag revision].each {|k| options[k] = options[k].to_s if options[k] }
22
22
 
23
- @uri = options["uri"] || ''
23
+ @uri = options["uri"] || ""
24
+ @safe_uri = URICredentialsFilter.credential_filtered_uri(@uri)
24
25
  @branch = options["branch"]
25
- @ref = options["ref"] || options["branch"] || options["tag"] || 'master'
26
+ @ref = options["ref"] || options["branch"] || options["tag"] || "master"
26
27
  @submodules = options["submodules"]
27
28
  @name = options["name"]
28
- @version = options["version"]
29
+ @version = options["version"].to_s.strip.gsub("-", ".pre.")
29
30
 
30
31
  @copied = false
31
32
  @local = false
@@ -36,10 +37,10 @@ module Bundler
36
37
  end
37
38
 
38
39
  def to_lock
39
- out = "GIT\n"
40
+ out = String.new("GIT\n")
40
41
  out << " remote: #{@uri}\n"
41
42
  out << " revision: #{revision}\n"
42
- %w(ref branch tag submodules).each do |opt|
43
+ %w[ref branch tag submodules].each do |opt|
43
44
  out << " #{opt}: #{options[opt]}\n" if options[opt]
44
45
  end
45
46
  out << " glob: #{@glob}\n" unless @glob == DEFAULT_GLOB
@@ -50,31 +51,38 @@ module Bundler
50
51
  [self.class, uri, ref, branch, name, version, submodules].hash
51
52
  end
52
53
 
53
- def eql?(o)
54
- o.is_a?(Git) &&
55
- uri == o.uri &&
56
- ref == o.ref &&
57
- branch == o.branch &&
58
- name == o.name &&
59
- version == o.version &&
60
- submodules == o.submodules
54
+ def eql?(other)
55
+ other.is_a?(Git) && uri == other.uri && ref == other.ref &&
56
+ branch == other.branch && name == other.name &&
57
+ version == other.version && submodules == other.submodules
61
58
  end
62
59
 
63
- alias == eql?
60
+ alias_method :==, :eql?
64
61
 
65
62
  def to_s
66
63
  at = if local?
67
64
  path
68
- elsif options["ref"]
69
- shortref_for_display(options["ref"])
65
+ elsif user_ref = options["ref"]
66
+ if ref =~ /\A[a-z0-9]{4,}\z/i
67
+ shortref_for_display(user_ref)
68
+ else
69
+ user_ref
70
+ end
70
71
  else
71
72
  ref
72
73
  end
73
- "#{uri} (at #{at})"
74
+
75
+ rev = begin
76
+ "@#{shortref_for_display(revision)}"
77
+ rescue GitError
78
+ nil
79
+ end
80
+
81
+ "#{@safe_uri} (at #{at}#{rev})"
74
82
  end
75
83
 
76
84
  def name
77
- File.basename(@uri, '.git')
85
+ File.basename(@uri, ".git")
78
86
  end
79
87
 
80
88
  # This is the path which is going to contain a specific
@@ -83,6 +91,7 @@ module Bundler
83
91
  def install_path
84
92
  @install_path ||= begin
85
93
  git_scope = "#{base_name}-#{shortref_for_path(revision)}"
94
+
86
95
  path = Bundler.install_path.join(git_scope)
87
96
 
88
97
  if !path.exist? && Bundler.requires_sudo?
@@ -93,7 +102,7 @@ module Bundler
93
102
  end
94
103
  end
95
104
 
96
- alias :path :install_path
105
+ alias_method :path, :install_path
97
106
 
98
107
  def extension_dir_name
99
108
  "#{base_name}-#{shortref_for_path(revision)}"
@@ -101,6 +110,8 @@ module Bundler
101
110
 
102
111
  def unlock!
103
112
  git_proxy.revision = nil
113
+ options["revision"] = nil
114
+
104
115
  @unlocked = true
105
116
  end
106
117
 
@@ -143,14 +154,11 @@ module Bundler
143
154
  changed
144
155
  end
145
156
 
146
- # TODO: actually cache git specs
147
157
  def specs(*)
148
- if has_app_cache? && !local?
149
- set_local!(app_cache_path)
150
- end
158
+ set_local!(app_cache_path) if has_app_cache? && !local?
151
159
 
152
160
  if requires_checkout? && !@copied
153
- git_proxy.checkout
161
+ fetch
154
162
  git_proxy.copy_to(install_path, submodules)
155
163
  serialize_gemspecs_in(install_path)
156
164
  @copied = true
@@ -159,24 +167,27 @@ module Bundler
159
167
  local_specs
160
168
  end
161
169
 
162
- def install(spec)
163
- debug = nil
164
- if requires_checkout? && !@copied
165
- debug = " * Checking out revision: #{ref}"
170
+ def install(spec, options = {})
171
+ force = options[:force]
172
+
173
+ print_using_message "Using #{version_message(spec)} from #{self}"
174
+
175
+ if (requires_checkout? && !@copied) || force
176
+ Bundler.ui.debug " * Checking out revision: #{ref}"
166
177
  git_proxy.copy_to(install_path, submodules)
167
178
  serialize_gemspecs_in(install_path)
168
179
  @copied = true
169
180
  end
170
- generate_bin(spec)
171
- if requires_checkout? && spec.post_install_message
172
- Installer.post_install_messages[spec.name] = spec.post_install_message
173
- end
174
- ["Using #{version_message(spec)} from #{to_s}", nil, debug]
181
+
182
+ generate_bin_options = { :disable_extensions => !Bundler.rubygems.spec_missing_extensions?(spec), :build_args => options[:build_args] }
183
+ generate_bin(spec, generate_bin_options)
184
+
185
+ requires_checkout? ? spec.post_install_message : nil
175
186
  end
176
187
 
177
188
  def cache(spec, custom_path = nil)
178
189
  app_cache_path = app_cache_path(custom_path)
179
- return unless Bundler.settings[:cache_all]
190
+ return unless Bundler.feature_flag.cache_all?
180
191
  return if path == app_cache_path
181
192
  cached!
182
193
  FileUtils.rm_rf(app_cache_path)
@@ -189,7 +200,7 @@ module Bundler
189
200
  super
190
201
  rescue PathError => e
191
202
  Bundler.ui.trace e
192
- raise GitError, "#{to_s} is not yet checked out. Run `bundle install` first."
203
+ raise GitError, "#{self} is not yet checked out. Run `bundle install` first."
193
204
  end
194
205
 
195
206
  # This is the path which is going to contain a cache
@@ -198,13 +209,11 @@ module Bundler
198
209
  # When using local git repos, this is set to the local repo.
199
210
  def cache_path
200
211
  @cache_path ||= begin
201
- git_scope = "#{base_name}-#{uri_hash}"
202
-
203
- if Bundler.requires_sudo?
204
- Bundler.user_bundle_path.join("cache/git", git_scope)
212
+ if Bundler.requires_sudo? || Bundler.feature_flag.global_gem_cache?
213
+ Bundler.user_cache
205
214
  else
206
- Bundler.cache.join("git", git_scope)
207
- end
215
+ Bundler.bundle_path.join("cache", "bundler")
216
+ end.join("git", git_scope)
208
217
  end
209
218
  end
210
219
 
@@ -220,17 +229,19 @@ module Bundler
220
229
  @allow_remote || @allow_cached
221
230
  end
222
231
 
223
- private
232
+ private
224
233
 
225
234
  def serialize_gemspecs_in(destination)
226
- expanded_path = destination.expand_path(Bundler.root)
227
- Dir["#{expanded_path}/#{@glob}"].each do |spec_path|
235
+ destination = destination.expand_path(Bundler.root) if destination.relative?
236
+ Dir["#{destination}/#{@glob}"].each do |spec_path|
228
237
  # Evaluate gemspecs and cache the result. Gemspecs
229
238
  # in git might require git or other dependencies.
230
239
  # The gemspecs we cache should already be evaluated.
231
240
  spec = Bundler.load_gemspec(spec_path)
232
241
  next unless spec
233
- File.open(spec_path, 'wb') {|file| file.write(spec.to_ruby) }
242
+ Bundler.rubygems.set_installed_by_version(spec)
243
+ Bundler.rubygems.validate(spec)
244
+ File.open(spec_path, "wb") {|file| file.write(spec.to_ruby) }
234
245
  end
235
246
  end
236
247
 
@@ -253,7 +264,7 @@ module Bundler
253
264
  end
254
265
 
255
266
  def base_name
256
- File.basename(uri.sub(%r{^(\w+://)?([^/:]+:)?(//\w*/)?(\w*/)*},''),".git")
267
+ File.basename(uri.sub(%r{^(\w+://)?([^/:]+:)?(//\w*/)?(\w*/)*}, ""), ".git")
257
268
  end
258
269
 
259
270
  def shortref_for_display(ref)
@@ -268,12 +279,12 @@ module Bundler
268
279
  if uri =~ %r{^\w+://(\w+@)?}
269
280
  # Downcase the domain component of the URI
270
281
  # and strip off a trailing slash, if one is present
271
- input = URI.parse(uri).normalize.to_s.sub(%r{/$},'')
282
+ input = URI.parse(uri).normalize.to_s.sub(%r{/$}, "")
272
283
  else
273
284
  # If there is no URI scheme, assume it is an ssh/git URI
274
285
  input = uri
275
286
  end
276
- Digest::SHA1.hexdigest(input)
287
+ SharedHelpers.digest(:SHA1).hexdigest(input)
277
288
  end
278
289
 
279
290
  def cached_revision
@@ -288,7 +299,31 @@ module Bundler
288
299
  @git_proxy ||= GitProxy.new(cache_path, uri, ref, cached_revision, self)
289
300
  end
290
301
 
291
- end
302
+ def fetch
303
+ git_proxy.checkout
304
+ rescue GitError => e
305
+ raise unless Bundler.feature_flag.allow_offline_install?
306
+ Bundler.ui.warn "Using cached git data because of network errors:\n#{e}"
307
+ end
308
+
309
+ # no-op, since we validate when re-serializing the gemspec
310
+ def validate_spec(_spec); end
292
311
 
312
+ if Bundler.rubygems.stubs_provide_full_functionality?
313
+ def load_gemspec(file)
314
+ stub = Gem::StubSpecification.gemspec_stub(file, install_path.parent, install_path.parent)
315
+ stub.full_gem_path = Pathname.new(file).dirname.expand_path(root).to_s.untaint
316
+ StubSpecification.from_stub(stub)
317
+ end
318
+ end
319
+
320
+ def git_scope
321
+ "#{base_name}-#{uri_hash}"
322
+ end
323
+
324
+ def extension_cache_slug(_)
325
+ extension_dir_name
326
+ end
327
+ end
293
328
  end
294
329
  end