bundler 1.11.1 → 2.2.6

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 +2125 -840
  3. data/LICENSE.md +18 -19
  4. data/README.md +33 -11
  5. data/bundler.gemspec +34 -21
  6. data/exe/bundle +36 -6
  7. data/exe/bundler +2 -18
  8. data/lib/bundler.rb +435 -160
  9. data/lib/bundler/build_metadata.rb +45 -0
  10. data/lib/bundler/capistrano.rb +9 -3
  11. data/lib/bundler/cli.rb +550 -130
  12. data/lib/bundler/cli/add.rb +47 -0
  13. data/lib/bundler/cli/binstubs.rb +26 -10
  14. data/lib/bundler/cli/cache.rb +25 -17
  15. data/lib/bundler/cli/check.rb +8 -7
  16. data/lib/bundler/cli/clean.rb +8 -8
  17. data/lib/bundler/cli/common.rb +69 -9
  18. data/lib/bundler/cli/config.rb +170 -76
  19. data/lib/bundler/cli/console.rb +6 -1
  20. data/lib/bundler/cli/doctor.rb +140 -0
  21. data/lib/bundler/cli/exec.rb +63 -21
  22. data/lib/bundler/cli/fund.rb +36 -0
  23. data/lib/bundler/cli/gem.rb +158 -42
  24. data/lib/bundler/cli/info.rb +73 -0
  25. data/lib/bundler/cli/init.rb +22 -7
  26. data/lib/bundler/cli/inject.rb +38 -10
  27. data/lib/bundler/cli/install.rb +139 -104
  28. data/lib/bundler/cli/issue.rb +40 -0
  29. data/lib/bundler/cli/list.rb +60 -0
  30. data/lib/bundler/cli/lock.rb +27 -5
  31. data/lib/bundler/cli/open.rb +13 -5
  32. data/lib/bundler/cli/outdated.rb +251 -46
  33. data/lib/bundler/cli/platform.rb +6 -2
  34. data/lib/bundler/cli/plugin.rb +41 -0
  35. data/lib/bundler/cli/pristine.rb +52 -0
  36. data/lib/bundler/cli/remove.rb +18 -0
  37. data/lib/bundler/cli/show.rb +5 -4
  38. data/lib/bundler/cli/update.rb +67 -26
  39. data/lib/bundler/cli/viz.rb +11 -6
  40. data/lib/bundler/compact_index_client.rb +125 -0
  41. data/lib/bundler/compact_index_client/cache.rb +110 -0
  42. data/lib/bundler/compact_index_client/gem_parser.rb +28 -0
  43. data/lib/bundler/compact_index_client/updater.rb +104 -0
  44. data/lib/bundler/constants.rb +2 -0
  45. data/lib/bundler/current_ruby.rb +51 -174
  46. data/lib/bundler/definition.rb +533 -216
  47. data/lib/bundler/dep_proxy.rb +18 -8
  48. data/lib/bundler/dependency.rb +39 -12
  49. data/lib/bundler/deployment.rb +7 -0
  50. data/lib/bundler/deprecate.rb +31 -2
  51. data/lib/bundler/dsl.rb +188 -91
  52. data/lib/bundler/endpoint_specification.rb +51 -10
  53. data/lib/bundler/env.rb +116 -48
  54. data/lib/bundler/environment_preserver.rb +82 -0
  55. data/lib/bundler/errors.rb +108 -31
  56. data/lib/bundler/feature_flag.rb +60 -0
  57. data/lib/bundler/fetcher.rb +81 -52
  58. data/lib/bundler/fetcher/base.rb +15 -3
  59. data/lib/bundler/fetcher/compact_index.rb +140 -0
  60. data/lib/bundler/fetcher/dependency.rb +36 -42
  61. data/lib/bundler/fetcher/downloader.rb +39 -12
  62. data/lib/bundler/fetcher/index.rb +34 -9
  63. data/lib/bundler/friendly_errors.rb +132 -88
  64. data/lib/bundler/gem_helper.rb +92 -50
  65. data/lib/bundler/gem_helpers.rb +90 -5
  66. data/lib/bundler/gem_tasks.rb +3 -1
  67. data/lib/bundler/gem_version_promoter.rb +190 -0
  68. data/lib/bundler/gemdeps.rb +29 -0
  69. data/lib/bundler/graph.rb +20 -41
  70. data/lib/bundler/index.rb +74 -57
  71. data/lib/bundler/injector.rb +242 -31
  72. data/lib/bundler/inline.rb +49 -23
  73. data/lib/bundler/installer.rb +190 -74
  74. data/lib/bundler/installer/gem_installer.rb +33 -20
  75. data/lib/bundler/installer/parallel_installer.rb +201 -97
  76. data/lib/bundler/installer/standalone.rb +10 -6
  77. data/lib/bundler/lazy_specification.rb +74 -10
  78. data/lib/bundler/lockfile_generator.rb +95 -0
  79. data/lib/bundler/lockfile_parser.rb +126 -74
  80. data/lib/bundler/{ssl_certs → man}/.document +0 -0
  81. data/lib/bundler/man/bundle-add.1 +66 -0
  82. data/lib/bundler/man/bundle-add.1.ronn +46 -0
  83. data/lib/bundler/man/bundle-binstubs.1 +42 -0
  84. data/lib/bundler/man/bundle-binstubs.1.ronn +41 -0
  85. data/lib/bundler/man/bundle-cache.1 +55 -0
  86. data/{man/bundle-package.ronn → lib/bundler/man/bundle-cache.1.ronn} +22 -16
  87. data/lib/bundler/man/bundle-check.1 +31 -0
  88. data/lib/bundler/man/bundle-check.1.ronn +26 -0
  89. data/lib/bundler/man/bundle-clean.1 +24 -0
  90. data/lib/bundler/man/bundle-clean.1.ronn +18 -0
  91. data/lib/bundler/man/bundle-config.1 +488 -0
  92. data/lib/bundler/man/bundle-config.1.ronn +388 -0
  93. data/lib/bundler/man/bundle-doctor.1 +44 -0
  94. data/lib/bundler/man/bundle-doctor.1.ronn +33 -0
  95. data/lib/bundler/man/bundle-exec.1 +165 -0
  96. data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +20 -4
  97. data/lib/bundler/man/bundle-gem.1 +102 -0
  98. data/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +37 -13
  99. data/lib/bundler/man/bundle-info.1 +20 -0
  100. data/lib/bundler/man/bundle-info.1.ronn +17 -0
  101. data/lib/bundler/man/bundle-init.1 +25 -0
  102. data/lib/bundler/man/bundle-init.1.ronn +29 -0
  103. data/lib/bundler/man/bundle-inject.1 +33 -0
  104. data/lib/bundler/man/bundle-inject.1.ronn +22 -0
  105. data/lib/bundler/man/bundle-install.1 +338 -0
  106. data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +82 -76
  107. data/lib/bundler/man/bundle-list.1 +50 -0
  108. data/lib/bundler/man/bundle-list.1.ronn +33 -0
  109. data/lib/bundler/man/bundle-lock.1 +84 -0
  110. data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +47 -0
  111. data/lib/bundler/man/bundle-open.1 +32 -0
  112. data/lib/bundler/man/bundle-open.1.ronn +19 -0
  113. data/lib/bundler/man/bundle-outdated.1 +155 -0
  114. data/lib/bundler/man/bundle-outdated.1.ronn +111 -0
  115. data/lib/bundler/man/bundle-platform.1 +61 -0
  116. data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +1 -1
  117. data/lib/bundler/man/bundle-pristine.1 +34 -0
  118. data/lib/bundler/man/bundle-pristine.1.ronn +34 -0
  119. data/lib/bundler/man/bundle-remove.1 +31 -0
  120. data/lib/bundler/man/bundle-remove.1.ronn +23 -0
  121. data/lib/bundler/man/bundle-show.1 +23 -0
  122. data/lib/bundler/man/bundle-show.1.ronn +21 -0
  123. data/lib/bundler/man/bundle-update.1 +394 -0
  124. data/lib/bundler/man/bundle-update.1.ronn +350 -0
  125. data/lib/bundler/man/bundle-viz.1 +39 -0
  126. data/lib/bundler/man/bundle-viz.1.ronn +30 -0
  127. data/lib/bundler/man/bundle.1 +136 -0
  128. data/lib/bundler/man/bundle.1.ronn +111 -0
  129. data/lib/bundler/man/gemfile.5 +686 -0
  130. data/{man → lib/bundler/man}/gemfile.5.ronn +117 -95
  131. data/lib/bundler/man/index.txt +25 -0
  132. data/lib/bundler/match_platform.rb +15 -4
  133. data/lib/bundler/mirror.rb +223 -0
  134. data/lib/bundler/plugin.rb +330 -0
  135. data/lib/bundler/plugin/api.rb +81 -0
  136. data/lib/bundler/plugin/api/source.rb +304 -0
  137. data/lib/bundler/plugin/dsl.rb +53 -0
  138. data/lib/bundler/plugin/events.rb +61 -0
  139. data/lib/bundler/plugin/index.rb +182 -0
  140. data/lib/bundler/plugin/installer.rb +109 -0
  141. data/lib/bundler/plugin/installer/git.rb +38 -0
  142. data/lib/bundler/plugin/installer/rubygems.rb +27 -0
  143. data/lib/bundler/plugin/source_list.rb +27 -0
  144. data/lib/bundler/process_lock.rb +24 -0
  145. data/lib/bundler/psyched_yaml.rb +2 -6
  146. data/lib/bundler/remote_specification.rb +42 -9
  147. data/lib/bundler/resolver.rb +312 -225
  148. data/lib/bundler/resolver/spec_group.rb +122 -0
  149. data/lib/bundler/retry.rb +11 -5
  150. data/lib/bundler/ruby_dsl.rb +9 -2
  151. data/lib/bundler/ruby_version.rb +84 -61
  152. data/lib/bundler/rubygems_ext.rb +92 -53
  153. data/lib/bundler/rubygems_gem_installer.rb +84 -0
  154. data/lib/bundler/rubygems_integration.rb +320 -395
  155. data/lib/bundler/runtime.rb +87 -75
  156. data/lib/bundler/settings.rb +297 -119
  157. data/lib/bundler/settings/validator.rb +102 -0
  158. data/lib/bundler/setup.rb +13 -12
  159. data/lib/bundler/shared_helpers.rb +234 -53
  160. data/lib/bundler/similarity_detector.rb +5 -3
  161. data/lib/bundler/source.rb +63 -4
  162. data/lib/bundler/source/gemspec.rb +18 -0
  163. data/lib/bundler/source/git.rb +97 -50
  164. data/lib/bundler/source/git/git_proxy.rb +138 -65
  165. data/lib/bundler/source/metadata.rb +67 -0
  166. data/lib/bundler/source/path.rb +83 -47
  167. data/lib/bundler/source/path/installer.rb +42 -11
  168. data/lib/bundler/source/rubygems.rb +231 -116
  169. data/lib/bundler/source/rubygems/remote.rb +30 -1
  170. data/lib/bundler/source_list.rb +103 -21
  171. data/lib/bundler/spec_set.rb +96 -51
  172. data/lib/bundler/stub_specification.rb +87 -4
  173. data/lib/bundler/templates/.document +1 -0
  174. data/lib/bundler/templates/Executable +14 -1
  175. data/lib/bundler/templates/Executable.bundler +114 -0
  176. data/lib/bundler/templates/Executable.standalone +6 -4
  177. data/lib/bundler/templates/Gemfile +4 -1
  178. data/lib/bundler/templates/gems.rb +8 -0
  179. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +79 -44
  180. data/lib/bundler/templates/newgem/Gemfile.tt +18 -2
  181. data/lib/bundler/templates/newgem/LICENSE.txt.tt +1 -1
  182. data/lib/bundler/templates/newgem/README.md.tt +16 -10
  183. data/lib/bundler/templates/newgem/Rakefile.tt +22 -8
  184. data/lib/bundler/templates/newgem/bin/console.tt +2 -1
  185. data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  186. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  187. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +4 -4
  188. data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +3 -3
  189. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -0
  190. data/lib/bundler/templates/newgem/gitignore.tt +5 -1
  191. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  192. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +9 -6
  193. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +6 -4
  194. data/lib/bundler/templates/newgem/newgem.gemspec.tt +27 -28
  195. data/lib/bundler/templates/newgem/rspec.tt +1 -0
  196. data/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
  197. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +4 -4
  198. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +15 -2
  199. data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +3 -1
  200. data/lib/bundler/templates/newgem/test/minitest/test_helper.rb.tt +6 -0
  201. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  202. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  203. data/lib/bundler/templates/newgem/{.travis.yml.tt → travis.yml.tt} +2 -0
  204. data/lib/bundler/ui.rb +5 -3
  205. data/lib/bundler/ui/rg_proxy.rb +3 -1
  206. data/lib/bundler/ui/shell.rb +54 -21
  207. data/lib/bundler/ui/silent.rb +26 -1
  208. data/lib/bundler/uri_credentials_filter.rb +43 -0
  209. data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +161 -0
  210. data/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +66 -0
  211. data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +176 -0
  212. data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +3 -0
  213. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1764 -0
  214. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +11 -5
  215. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +57 -0
  216. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +81 -0
  217. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +113 -134
  218. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +36 -0
  219. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +66 -0
  220. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +62 -0
  221. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
  222. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +61 -0
  223. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +126 -0
  224. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +46 -0
  225. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +36 -0
  226. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +158 -0
  227. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +82 -8
  228. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +4 -1
  229. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +2 -0
  230. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +6 -2
  231. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +555 -150
  232. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +6 -3
  233. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +19 -12
  234. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent.rb +310 -467
  235. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +40 -0
  236. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +53 -0
  237. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +79 -0
  238. data/lib/bundler/vendor/thor/lib/thor.rb +58 -25
  239. data/lib/bundler/vendor/thor/lib/thor/actions.rb +50 -33
  240. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
  241. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +5 -3
  242. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +9 -19
  243. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +16 -8
  244. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +79 -22
  245. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +33 -20
  246. data/lib/bundler/vendor/thor/lib/thor/base.rb +110 -67
  247. data/lib/bundler/vendor/thor/lib/thor/command.rb +33 -24
  248. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +21 -1
  249. data/lib/bundler/vendor/thor/lib/thor/error.rb +81 -3
  250. data/lib/bundler/vendor/thor/lib/thor/group.rb +16 -16
  251. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +5 -5
  252. data/lib/bundler/vendor/thor/lib/thor/line_editor.rb +2 -2
  253. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +2 -0
  254. data/lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb +6 -6
  255. data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +29 -0
  256. data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -4
  257. data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +4 -7
  258. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +18 -18
  259. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +60 -26
  260. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +31 -13
  261. data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +1 -0
  262. data/lib/bundler/vendor/thor/lib/thor/runner.rb +42 -39
  263. data/lib/bundler/vendor/thor/lib/thor/shell.rb +5 -5
  264. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +109 -39
  265. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +7 -3
  266. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +5 -5
  267. data/lib/bundler/vendor/thor/lib/thor/util.rb +26 -9
  268. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  269. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
  270. data/lib/bundler/vendor/uri/lib/uri.rb +104 -0
  271. data/lib/bundler/vendor/uri/lib/uri/common.rb +744 -0
  272. data/lib/bundler/vendor/uri/lib/uri/file.rb +94 -0
  273. data/lib/bundler/vendor/uri/lib/uri/ftp.rb +267 -0
  274. data/lib/bundler/vendor/uri/lib/uri/generic.rb +1568 -0
  275. data/lib/bundler/vendor/uri/lib/uri/http.rb +88 -0
  276. data/lib/bundler/vendor/uri/lib/uri/https.rb +23 -0
  277. data/lib/bundler/vendor/uri/lib/uri/ldap.rb +261 -0
  278. data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +21 -0
  279. data/lib/bundler/vendor/uri/lib/uri/mailto.rb +294 -0
  280. data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +546 -0
  281. data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +125 -0
  282. data/lib/bundler/vendor/uri/lib/uri/version.rb +6 -0
  283. data/lib/bundler/vendored_fileutils.rb +4 -0
  284. data/lib/bundler/vendored_molinillo.rb +3 -1
  285. data/lib/bundler/vendored_persistent.rb +45 -9
  286. data/lib/bundler/vendored_thor.rb +8 -3
  287. data/lib/bundler/vendored_tmpdir.rb +4 -0
  288. data/lib/bundler/vendored_uri.rb +4 -0
  289. data/lib/bundler/version.rb +7 -4
  290. data/lib/bundler/version_ranges.rb +122 -0
  291. data/lib/bundler/vlad.rb +8 -2
  292. data/lib/bundler/worker.rb +38 -6
  293. data/lib/bundler/yaml_serializer.rb +89 -0
  294. metadata +164 -158
  295. data/.gitignore +0 -16
  296. data/.rspec +0 -3
  297. data/.rubocop.yml +0 -105
  298. data/.rubocop_todo.yml +0 -120
  299. data/.travis.yml +0 -97
  300. data/CODE_OF_CONDUCT.md +0 -42
  301. data/CONTRIBUTING.md +0 -32
  302. data/DEVELOPMENT.md +0 -118
  303. data/ISSUES.md +0 -96
  304. data/Rakefile +0 -309
  305. data/bin/rake +0 -14
  306. data/bin/rspec +0 -10
  307. data/bin/rubocop +0 -11
  308. data/exe/bundle_ruby +0 -60
  309. data/lib/bundler/cli/package.rb +0 -45
  310. data/lib/bundler/environment.rb +0 -41
  311. data/lib/bundler/gem_path_manipulation.rb +0 -8
  312. data/lib/bundler/gem_remote_fetcher.rb +0 -41
  313. data/lib/bundler/ssl_certs/AddTrustExternalCARoot-2048.pem +0 -25
  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/DigiCertHighAssuranceEVRootCA.pem +0 -23
  317. data/lib/bundler/ssl_certs/EntrustnetSecureServerCertificationAuthority.pem +0 -28
  318. data/lib/bundler/ssl_certs/GeoTrustGlobalCA.pem +0 -20
  319. data/lib/bundler/ssl_certs/certificate_manager.rb +0 -64
  320. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +0 -4
  321. data/lib/bundler/vendor/net/http/faster.rb +0 -26
  322. data/lib/bundler/vendor/net/http/persistent/ssl_reuse.rb +0 -128
  323. data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +0 -10
  324. data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +0 -98
  325. data/man/bundle-config.ronn +0 -187
  326. data/man/bundle-update.ronn +0 -188
  327. data/man/bundle.ronn +0 -98
  328. data/man/index.txt +0 -8
@@ -1,5 +1,11 @@
1
- require 'bundler/vendor/molinillo/lib/molinillo/gem_metadata'
2
- require 'bundler/vendor/molinillo/lib/molinillo/errors'
3
- require 'bundler/vendor/molinillo/lib/molinillo/resolver'
4
- require 'bundler/vendor/molinillo/lib/molinillo/modules/ui'
5
- require 'bundler/vendor/molinillo/lib/molinillo/modules/specification_provider'
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'molinillo/gem_metadata'
4
+ require_relative 'molinillo/errors'
5
+ require_relative 'molinillo/resolver'
6
+ require_relative 'molinillo/modules/ui'
7
+ require_relative 'molinillo/modules/specification_provider'
8
+
9
+ # Bundler::Molinillo is a generic dependency resolution algorithm.
10
+ module Bundler::Molinillo
11
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler::Molinillo
4
+ # @!visibility private
5
+ module Delegates
6
+ # Delegates all {Bundler::Molinillo::ResolutionState} methods to a `#state` property.
7
+ module ResolutionState
8
+ # (see Bundler::Molinillo::ResolutionState#name)
9
+ def name
10
+ current_state = state || Bundler::Molinillo::ResolutionState.empty
11
+ current_state.name
12
+ end
13
+
14
+ # (see Bundler::Molinillo::ResolutionState#requirements)
15
+ def requirements
16
+ current_state = state || Bundler::Molinillo::ResolutionState.empty
17
+ current_state.requirements
18
+ end
19
+
20
+ # (see Bundler::Molinillo::ResolutionState#activated)
21
+ def activated
22
+ current_state = state || Bundler::Molinillo::ResolutionState.empty
23
+ current_state.activated
24
+ end
25
+
26
+ # (see Bundler::Molinillo::ResolutionState#requirement)
27
+ def requirement
28
+ current_state = state || Bundler::Molinillo::ResolutionState.empty
29
+ current_state.requirement
30
+ end
31
+
32
+ # (see Bundler::Molinillo::ResolutionState#possibilities)
33
+ def possibilities
34
+ current_state = state || Bundler::Molinillo::ResolutionState.empty
35
+ current_state.possibilities
36
+ end
37
+
38
+ # (see Bundler::Molinillo::ResolutionState#depth)
39
+ def depth
40
+ current_state = state || Bundler::Molinillo::ResolutionState.empty
41
+ current_state.depth
42
+ end
43
+
44
+ # (see Bundler::Molinillo::ResolutionState#conflicts)
45
+ def conflicts
46
+ current_state = state || Bundler::Molinillo::ResolutionState.empty
47
+ current_state.conflicts
48
+ end
49
+
50
+ # (see Bundler::Molinillo::ResolutionState#unused_unwind_options)
51
+ def unused_unwind_options
52
+ current_state = state || Bundler::Molinillo::ResolutionState.empty
53
+ current_state.unused_unwind_options
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler::Molinillo
4
+ module Delegates
5
+ # Delegates all {Bundler::Molinillo::SpecificationProvider} methods to a
6
+ # `#specification_provider` property.
7
+ module SpecificationProvider
8
+ # (see Bundler::Molinillo::SpecificationProvider#search_for)
9
+ def search_for(dependency)
10
+ with_no_such_dependency_error_handling do
11
+ specification_provider.search_for(dependency)
12
+ end
13
+ end
14
+
15
+ # (see Bundler::Molinillo::SpecificationProvider#dependencies_for)
16
+ def dependencies_for(specification)
17
+ with_no_such_dependency_error_handling do
18
+ specification_provider.dependencies_for(specification)
19
+ end
20
+ end
21
+
22
+ # (see Bundler::Molinillo::SpecificationProvider#requirement_satisfied_by?)
23
+ def requirement_satisfied_by?(requirement, activated, spec)
24
+ with_no_such_dependency_error_handling do
25
+ specification_provider.requirement_satisfied_by?(requirement, activated, spec)
26
+ end
27
+ end
28
+
29
+ # (see Bundler::Molinillo::SpecificationProvider#name_for)
30
+ def name_for(dependency)
31
+ with_no_such_dependency_error_handling do
32
+ specification_provider.name_for(dependency)
33
+ end
34
+ end
35
+
36
+ # (see Bundler::Molinillo::SpecificationProvider#name_for_explicit_dependency_source)
37
+ def name_for_explicit_dependency_source
38
+ with_no_such_dependency_error_handling do
39
+ specification_provider.name_for_explicit_dependency_source
40
+ end
41
+ end
42
+
43
+ # (see Bundler::Molinillo::SpecificationProvider#name_for_locking_dependency_source)
44
+ def name_for_locking_dependency_source
45
+ with_no_such_dependency_error_handling do
46
+ specification_provider.name_for_locking_dependency_source
47
+ end
48
+ end
49
+
50
+ # (see Bundler::Molinillo::SpecificationProvider#sort_dependencies)
51
+ def sort_dependencies(dependencies, activated, conflicts)
52
+ with_no_such_dependency_error_handling do
53
+ specification_provider.sort_dependencies(dependencies, activated, conflicts)
54
+ end
55
+ end
56
+
57
+ # (see Bundler::Molinillo::SpecificationProvider#allow_missing?)
58
+ def allow_missing?(dependency)
59
+ with_no_such_dependency_error_handling do
60
+ specification_provider.allow_missing?(dependency)
61
+ end
62
+ end
63
+
64
+ private
65
+
66
+ # Ensures any raised {NoSuchDependencyError} has its
67
+ # {NoSuchDependencyError#required_by} set.
68
+ # @yield
69
+ def with_no_such_dependency_error_handling
70
+ yield
71
+ rescue NoSuchDependencyError => error
72
+ if state
73
+ vertex = activated.vertex_named(name_for(error.dependency))
74
+ error.required_by += vertex.incoming_edges.map { |e| e.origin.name }
75
+ error.required_by << name_for_explicit_dependency_source unless vertex.explicit_requirements.empty?
76
+ end
77
+ raise
78
+ end
79
+ end
80
+ end
81
+ end
@@ -1,6 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'set'
2
4
  require 'tsort'
3
5
 
6
+ require_relative 'dependency_graph/log'
7
+ require_relative 'dependency_graph/vertex'
8
+
4
9
  module Bundler::Molinillo
5
10
  # A directed acyclic graph that is tuned to hold named dependencies
6
11
  class DependencyGraph
@@ -9,13 +14,16 @@ module Bundler::Molinillo
9
14
  # Enumerates through the vertices of the graph.
10
15
  # @return [Array<Vertex>] The graph's vertices.
11
16
  def each
17
+ return vertices.values.each unless block_given?
12
18
  vertices.values.each { |v| yield v }
13
19
  end
14
20
 
15
21
  include TSort
16
22
 
17
- alias_method :tsort_each_node, :each
23
+ # @!visibility private
24
+ alias tsort_each_node each
18
25
 
26
+ # @!visibility private
19
27
  def tsort_each_child(vertex, &block)
20
28
  vertex.successors.each(&block)
21
29
  end
@@ -41,15 +49,36 @@ module Bundler::Molinillo
41
49
  # by {Vertex#name}
42
50
  attr_reader :vertices
43
51
 
52
+ # @return [Log] the op log for this graph
53
+ attr_reader :log
54
+
55
+ # Initializes an empty dependency graph
44
56
  def initialize
45
57
  @vertices = {}
58
+ @log = Log.new
59
+ end
60
+
61
+ # Tags the current state of the dependency as the given tag
62
+ # @param [Object] tag an opaque tag for the current state of the graph
63
+ # @return [Void]
64
+ def tag(tag)
65
+ log.tag(self, tag)
66
+ end
67
+
68
+ # Rewinds the graph to the state tagged as `tag`
69
+ # @param [Object] tag the tag to rewind to
70
+ # @return [Void]
71
+ def rewind_to(tag)
72
+ log.rewind_to(self, tag)
46
73
  end
47
74
 
48
75
  # Initializes a copy of a {DependencyGraph}, ensuring that all {#vertices}
49
76
  # are properly copied.
77
+ # @param [DependencyGraph] other the graph to copy.
50
78
  def initialize_copy(other)
51
79
  super
52
80
  @vertices = {}
81
+ @log = other.log.dup
53
82
  traverse = lambda do |new_v, old_v|
54
83
  return if new_v.outgoing_edges.size == old_v.outgoing_edges.size
55
84
  old_v.outgoing_edges.each do |edge|
@@ -70,15 +99,43 @@ module Bundler::Molinillo
70
99
  "#{self.class}:#{vertices.values.inspect}"
71
100
  end
72
101
 
102
+ # @param [Hash] options options for dot output.
103
+ # @return [String] Returns a dot format representation of the graph
104
+ def to_dot(options = {})
105
+ edge_label = options.delete(:edge_label)
106
+ raise ArgumentError, "Unknown options: #{options.keys}" unless options.empty?
107
+
108
+ dot_vertices = []
109
+ dot_edges = []
110
+ vertices.each do |n, v|
111
+ dot_vertices << " #{n} [label=\"{#{n}|#{v.payload}}\"]"
112
+ v.outgoing_edges.each do |e|
113
+ label = edge_label ? edge_label.call(e) : e.requirement
114
+ dot_edges << " #{e.origin.name} -> #{e.destination.name} [label=#{label.to_s.dump}]"
115
+ end
116
+ end
117
+
118
+ dot_vertices.uniq!
119
+ dot_vertices.sort!
120
+ dot_edges.uniq!
121
+ dot_edges.sort!
122
+
123
+ dot = dot_vertices.unshift('digraph G {').push('') + dot_edges.push('}')
124
+ dot.join("\n")
125
+ end
126
+
127
+ # @param [DependencyGraph] other
73
128
  # @return [Boolean] whether the two dependency graphs are equal, determined
74
129
  # by a recursive traversal of each {#root_vertices} and its
75
130
  # {Vertex#successors}
76
131
  def ==(other)
77
132
  return false unless other
133
+ return true if equal?(other)
78
134
  vertices.each do |name, vertex|
79
135
  other_vertex = other.vertex_named(name)
80
136
  return false unless other_vertex
81
- return false unless other_vertex.successors.map(&:name).to_set == vertex.successors.map(&:name).to_set
137
+ return false unless vertex.payload == other_vertex.payload
138
+ return false unless other_vertex.successors.to_set == vertex.successors.to_set
82
139
  end
83
140
  end
84
141
 
@@ -88,39 +145,30 @@ module Bundler::Molinillo
88
145
  # @param [Object] requirement the requirement that is requiring the child
89
146
  # @return [void]
90
147
  def add_child_vertex(name, payload, parent_names, requirement)
91
- vertex = add_vertex(name, payload)
148
+ root = !parent_names.delete(nil) { true }
149
+ vertex = add_vertex(name, payload, root)
150
+ vertex.explicit_requirements << requirement if root
92
151
  parent_names.each do |parent_name|
93
- unless parent_name
94
- vertex.root = true
95
- next
96
- end
97
- parent_node = vertex_named(parent_name)
98
- add_edge(parent_node, vertex, requirement)
152
+ parent_vertex = vertex_named(parent_name)
153
+ add_edge(parent_vertex, vertex, requirement)
99
154
  end
100
155
  vertex
101
156
  end
102
157
 
158
+ # Adds a vertex with the given name, or updates the existing one.
103
159
  # @param [String] name
104
160
  # @param [Object] payload
105
161
  # @return [Vertex] the vertex that was added to `self`
106
162
  def add_vertex(name, payload, root = false)
107
- vertex = vertices[name] ||= Vertex.new(name, payload)
108
- vertex.payload ||= payload
109
- vertex.root ||= root
110
- vertex
163
+ log.add_vertex(self, name, payload, root)
111
164
  end
112
165
 
113
166
  # Detaches the {#vertex_named} `name` {Vertex} from the graph, recursively
114
167
  # removing any non-root vertices that were orphaned in the process
115
168
  # @param [String] name
116
- # @return [void]
169
+ # @return [Array<Vertex>] the vertices which have been detached
117
170
  def detach_vertex_named(name)
118
- return unless vertex = vertices.delete(name)
119
- vertex.outgoing_edges.each do |e|
120
- v = e.destination
121
- v.incoming_edges.delete(e)
122
- detach_vertex_named(v.name) unless v.root? || v.predecessors.any?
123
- end
171
+ log.detach_vertex_named(self, name)
124
172
  end
125
173
 
126
174
  # @param [String] name
@@ -143,135 +191,66 @@ module Bundler::Molinillo
143
191
  # @return [Edge] the added edge
144
192
  def add_edge(origin, destination, requirement)
145
193
  if destination.path_to?(origin)
146
- raise CircularDependencyError.new([origin, destination])
194
+ raise CircularDependencyError.new(path(destination, origin))
147
195
  end
148
196
  add_edge_no_circular(origin, destination, requirement)
149
197
  end
150
198
 
151
- private
152
-
153
- def add_edge_no_circular(origin, destination, requirement)
154
- edge = Edge.new(origin, destination, requirement)
155
- origin.outgoing_edges << edge
156
- destination.incoming_edges << edge
157
- edge
199
+ # Deletes an {Edge} from the dependency graph
200
+ # @param [Edge] edge
201
+ # @return [Void]
202
+ def delete_edge(edge)
203
+ log.delete_edge(self, edge.origin.name, edge.destination.name, edge.requirement)
158
204
  end
159
205
 
160
- # A vertex in a {DependencyGraph} that encapsulates a {#name} and a
161
- # {#payload}
162
- class Vertex
163
- # @return [String] the name of the vertex
164
- attr_accessor :name
165
-
166
- # @return [Object] the payload the vertex holds
167
- attr_accessor :payload
168
-
169
- # @return [Arrary<Object>] the explicit requirements that required
170
- # this vertex
171
- attr_reader :explicit_requirements
172
-
173
- # @return [Boolean] whether the vertex is considered a root vertex
174
- attr_accessor :root
175
- alias_method :root?, :root
176
-
177
- # @param [String] name see {#name}
178
- # @param [Object] payload see {#payload}
179
- def initialize(name, payload)
180
- @name = name
181
- @payload = payload
182
- @explicit_requirements = []
183
- @outgoing_edges = []
184
- @incoming_edges = []
185
- end
186
-
187
- # @return [Array<Object>] all of the requirements that required
188
- # this vertex
189
- def requirements
190
- incoming_edges.map(&:requirement) + explicit_requirements
191
- end
192
-
193
- # @return [Array<Edge>] the edges of {#graph} that have `self` as their
194
- # {Edge#origin}
195
- attr_accessor :outgoing_edges
196
-
197
- # @return [Array<Edge>] the edges of {#graph} that have `self` as their
198
- # {Edge#destination}
199
- attr_accessor :incoming_edges
200
-
201
- # @return [Array<Vertex>] the vertices of {#graph} that have an edge with
202
- # `self` as their {Edge#destination}
203
- def predecessors
204
- incoming_edges.map(&:origin)
205
- end
206
-
207
- # @return [Array<Vertex>] the vertices of {#graph} where `self` is a
208
- # {#descendent?}
209
- def recursive_predecessors
210
- vertices = predecessors
211
- vertices += vertices.map(&:recursive_predecessors).flatten(1)
212
- vertices.uniq!
213
- vertices
214
- end
215
-
216
- # @return [Array<Vertex>] the vertices of {#graph} that have an edge with
217
- # `self` as their {Edge#origin}
218
- def successors
219
- outgoing_edges.map(&:destination)
220
- end
221
-
222
- # @return [Array<Vertex>] the vertices of {#graph} where `self` is an
223
- # {#ancestor?}
224
- def recursive_successors
225
- vertices = successors
226
- vertices += vertices.map(&:recursive_successors).flatten(1)
227
- vertices.uniq!
228
- vertices
229
- end
230
-
231
- # @return [String] a string suitable for debugging
232
- def inspect
233
- "#{self.class}:#{name}(#{payload.inspect})"
234
- end
235
-
236
- # @return [Boolean] whether the two vertices are equal, determined
237
- # by a recursive traversal of each {Vertex#successors}
238
- def ==(other)
239
- shallow_eql?(other) &&
240
- successors.to_set == other.successors.to_set
241
- end
206
+ # Sets the payload of the vertex with the given name
207
+ # @param [String] name the name of the vertex
208
+ # @param [Object] payload the payload
209
+ # @return [Void]
210
+ def set_payload(name, payload)
211
+ log.set_payload(self, name, payload)
212
+ end
242
213
 
243
- # @return [Boolean] whether the two vertices are equal, determined
244
- # solely by {#name} and {#payload} equality
245
- def shallow_eql?(other)
246
- other &&
247
- name == other.name &&
248
- payload == other.payload
249
- end
214
+ private
250
215
 
251
- alias_method :eql?, :==
216
+ # Adds a new {Edge} to the dependency graph without checking for
217
+ # circularity.
218
+ # @param (see #add_edge)
219
+ # @return (see #add_edge)
220
+ def add_edge_no_circular(origin, destination, requirement)
221
+ log.add_edge_no_circular(self, origin.name, destination.name, requirement)
222
+ end
252
223
 
253
- # @return [Fixnum] a hash for the vertex based upon its {#name}
254
- def hash
255
- name.hash
224
+ # Returns the path between two vertices
225
+ # @raise [ArgumentError] if there is no path between the vertices
226
+ # @param [Vertex] from
227
+ # @param [Vertex] to
228
+ # @return [Array<Vertex>] the shortest path from `from` to `to`
229
+ def path(from, to)
230
+ distances = Hash.new(vertices.size + 1)
231
+ distances[from.name] = 0
232
+ predecessors = {}
233
+ each do |vertex|
234
+ vertex.successors.each do |successor|
235
+ if distances[successor.name] > distances[vertex.name] + 1
236
+ distances[successor.name] = distances[vertex.name] + 1
237
+ predecessors[successor] = vertex
238
+ end
239
+ end
256
240
  end
257
241
 
258
- # Is there a path from `self` to `other` following edges in the
259
- # dependency graph?
260
- # @return true iff there is a path following edges within this {#graph}
261
- def path_to?(other)
262
- equal?(other) || successors.any? { |v| v.path_to?(other) }
242
+ path = [to]
243
+ while before = predecessors[to]
244
+ path << before
245
+ to = before
246
+ break if to == from
263
247
  end
264
248
 
265
- alias_method :descendent?, :path_to?
266
-
267
- # Is there a path from `other` to `self` following edges in the
268
- # dependency graph?
269
- # @return true iff there is a path following edges within this {#graph}
270
- def ancestor?(other)
271
- other.path_to?(self)
249
+ unless path.last.equal?(from)
250
+ raise ArgumentError, "There is no path from #{from.name} to #{to.name}"
272
251
  end
273
252
 
274
- alias_method :is_reachable_from?, :ancestor?
253
+ path.reverse
275
254
  end
276
255
  end
277
256
  end