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,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/vendor/molinillo/lib/molinillo/compatibility'
4
+ require 'bundler/vendor/molinillo/lib/molinillo/gem_metadata'
5
+ require 'bundler/vendor/molinillo/lib/molinillo/errors'
6
+ require 'bundler/vendor/molinillo/lib/molinillo/resolver'
7
+ require 'bundler/vendor/molinillo/lib/molinillo/modules/ui'
8
+ require 'bundler/vendor/molinillo/lib/molinillo/modules/specification_provider'
9
+
10
+ # Bundler::Molinillo is a generic dependency resolution algorithm.
11
+ module Bundler::Molinillo
12
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler::Molinillo
4
+ # Hacks needed for old Ruby versions.
5
+ module Compatibility
6
+ module_function
7
+
8
+ if [].respond_to?(:flat_map)
9
+ # Flat map
10
+ # @param [Enumerable] enum an enumerable object
11
+ # @block the block to flat-map with
12
+ # @return The enum, flat-mapped
13
+ def flat_map(enum, &blk)
14
+ enum.flat_map(&blk)
15
+ end
16
+ else
17
+ # Flat map
18
+ # @param [Enumerable] enum an enumerable object
19
+ # @block the block to flat-map with
20
+ # @return The enum, flat-mapped
21
+ def flat_map(enum, &blk)
22
+ enum.map(&blk).flatten(1)
23
+ end
24
+ end
25
+ end
26
+ 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
@@ -0,0 +1,223 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'set'
4
+ require 'tsort'
5
+
6
+ require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/log'
7
+ require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex'
8
+
9
+ module Bundler::Molinillo
10
+ # A directed acyclic graph that is tuned to hold named dependencies
11
+ class DependencyGraph
12
+ include Enumerable
13
+
14
+ # Enumerates through the vertices of the graph.
15
+ # @return [Array<Vertex>] The graph's vertices.
16
+ def each
17
+ return vertices.values.each unless block_given?
18
+ vertices.values.each { |v| yield v }
19
+ end
20
+
21
+ include TSort
22
+
23
+ # @!visibility private
24
+ alias tsort_each_node each
25
+
26
+ # @!visibility private
27
+ def tsort_each_child(vertex, &block)
28
+ vertex.successors.each(&block)
29
+ end
30
+
31
+ # Topologically sorts the given vertices.
32
+ # @param [Enumerable<Vertex>] vertices the vertices to be sorted, which must
33
+ # all belong to the same graph.
34
+ # @return [Array<Vertex>] The sorted vertices.
35
+ def self.tsort(vertices)
36
+ TSort.tsort(
37
+ lambda { |b| vertices.each(&b) },
38
+ lambda { |v, &b| (v.successors & vertices).each(&b) }
39
+ )
40
+ end
41
+
42
+ # A directed edge of a {DependencyGraph}
43
+ # @attr [Vertex] origin The origin of the directed edge
44
+ # @attr [Vertex] destination The destination of the directed edge
45
+ # @attr [Object] requirement The requirement the directed edge represents
46
+ Edge = Struct.new(:origin, :destination, :requirement)
47
+
48
+ # @return [{String => Vertex}] the vertices of the dependency graph, keyed
49
+ # by {Vertex#name}
50
+ attr_reader :vertices
51
+
52
+ # @return [Log] the op log for this graph
53
+ attr_reader :log
54
+
55
+ # Initializes an empty dependency graph
56
+ def initialize
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)
73
+ end
74
+
75
+ # Initializes a copy of a {DependencyGraph}, ensuring that all {#vertices}
76
+ # are properly copied.
77
+ # @param [DependencyGraph] other the graph to copy.
78
+ def initialize_copy(other)
79
+ super
80
+ @vertices = {}
81
+ @log = other.log.dup
82
+ traverse = lambda do |new_v, old_v|
83
+ return if new_v.outgoing_edges.size == old_v.outgoing_edges.size
84
+ old_v.outgoing_edges.each do |edge|
85
+ destination = add_vertex(edge.destination.name, edge.destination.payload)
86
+ add_edge_no_circular(new_v, destination, edge.requirement)
87
+ traverse.call(destination, edge.destination)
88
+ end
89
+ end
90
+ other.vertices.each do |name, vertex|
91
+ new_vertex = add_vertex(name, vertex.payload, vertex.root?)
92
+ new_vertex.explicit_requirements.replace(vertex.explicit_requirements)
93
+ traverse.call(new_vertex, vertex)
94
+ end
95
+ end
96
+
97
+ # @return [String] a string suitable for debugging
98
+ def inspect
99
+ "#{self.class}:#{vertices.values.inspect}"
100
+ end
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
+ # @return [Boolean] whether the two dependency graphs are equal, determined
128
+ # by a recursive traversal of each {#root_vertices} and its
129
+ # {Vertex#successors}
130
+ def ==(other)
131
+ return false unless other
132
+ return true if equal?(other)
133
+ vertices.each do |name, vertex|
134
+ other_vertex = other.vertex_named(name)
135
+ return false unless other_vertex
136
+ return false unless vertex.payload == other_vertex.payload
137
+ return false unless other_vertex.successors.to_set == vertex.successors.to_set
138
+ end
139
+ end
140
+
141
+ # @param [String] name
142
+ # @param [Object] payload
143
+ # @param [Array<String>] parent_names
144
+ # @param [Object] requirement the requirement that is requiring the child
145
+ # @return [void]
146
+ def add_child_vertex(name, payload, parent_names, requirement)
147
+ root = !parent_names.delete(nil) { true }
148
+ vertex = add_vertex(name, payload, root)
149
+ vertex.explicit_requirements << requirement if root
150
+ parent_names.each do |parent_name|
151
+ parent_vertex = vertex_named(parent_name)
152
+ add_edge(parent_vertex, vertex, requirement)
153
+ end
154
+ vertex
155
+ end
156
+
157
+ # Adds a vertex with the given name, or updates the existing one.
158
+ # @param [String] name
159
+ # @param [Object] payload
160
+ # @return [Vertex] the vertex that was added to `self`
161
+ def add_vertex(name, payload, root = false)
162
+ log.add_vertex(self, name, payload, root)
163
+ end
164
+
165
+ # Detaches the {#vertex_named} `name` {Vertex} from the graph, recursively
166
+ # removing any non-root vertices that were orphaned in the process
167
+ # @param [String] name
168
+ # @return [Array<Vertex>] the vertices which have been detached
169
+ def detach_vertex_named(name)
170
+ log.detach_vertex_named(self, name)
171
+ end
172
+
173
+ # @param [String] name
174
+ # @return [Vertex,nil] the vertex with the given name
175
+ def vertex_named(name)
176
+ vertices[name]
177
+ end
178
+
179
+ # @param [String] name
180
+ # @return [Vertex,nil] the root vertex with the given name
181
+ def root_vertex_named(name)
182
+ vertex = vertex_named(name)
183
+ vertex if vertex && vertex.root?
184
+ end
185
+
186
+ # Adds a new {Edge} to the dependency graph
187
+ # @param [Vertex] origin
188
+ # @param [Vertex] destination
189
+ # @param [Object] requirement the requirement that this edge represents
190
+ # @return [Edge] the added edge
191
+ def add_edge(origin, destination, requirement)
192
+ if destination.path_to?(origin)
193
+ raise CircularDependencyError.new([origin, destination])
194
+ end
195
+ add_edge_no_circular(origin, destination, requirement)
196
+ end
197
+
198
+ # Deletes an {Edge} from the dependency graph
199
+ # @param [Edge] edge
200
+ # @return [Void]
201
+ def delete_edge(edge)
202
+ log.delete_edge(self, edge.origin.name, edge.destination.name, edge.requirement)
203
+ end
204
+
205
+ # Sets the payload of the vertex with the given name
206
+ # @param [String] name the name of the vertex
207
+ # @param [Object] payload the payload
208
+ # @return [Void]
209
+ def set_payload(name, payload)
210
+ log.set_payload(self, name, payload)
211
+ end
212
+
213
+ private
214
+
215
+ # Adds a new {Edge} to the dependency graph without checking for
216
+ # circularity.
217
+ # @param (see #add_edge)
218
+ # @return (see #add_edge)
219
+ def add_edge_no_circular(origin, destination, requirement)
220
+ log.add_edge_no_circular(self, origin.name, destination.name, requirement)
221
+ end
222
+ end
223
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler::Molinillo
4
+ class DependencyGraph
5
+ # An action that modifies a {DependencyGraph} that is reversible.
6
+ # @abstract
7
+ class Action
8
+ # rubocop:disable Lint/UnusedMethodArgument
9
+
10
+ # @return [Symbol] The name of the action.
11
+ def self.action_name
12
+ raise 'Abstract'
13
+ end
14
+
15
+ # Performs the action on the given graph.
16
+ # @param [DependencyGraph] graph the graph to perform the action on.
17
+ # @return [Void]
18
+ def up(graph)
19
+ raise 'Abstract'
20
+ end
21
+
22
+ # Reverses the action on the given graph.
23
+ # @param [DependencyGraph] graph the graph to reverse the action on.
24
+ # @return [Void]
25
+ def down(graph)
26
+ raise 'Abstract'
27
+ end
28
+
29
+ # @return [Action,Nil] The previous action
30
+ attr_accessor :previous
31
+
32
+ # @return [Action,Nil] The next action
33
+ attr_accessor :next
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/action'
4
+ module Bundler::Molinillo
5
+ class DependencyGraph
6
+ # @!visibility private
7
+ # (see DependencyGraph#add_edge_no_circular)
8
+ class AddEdgeNoCircular < Action
9
+ # @!group Action
10
+
11
+ # (see Action.action_name)
12
+ def self.action_name
13
+ :add_vertex
14
+ end
15
+
16
+ # (see Action#up)
17
+ def up(graph)
18
+ edge = make_edge(graph)
19
+ edge.origin.outgoing_edges << edge
20
+ edge.destination.incoming_edges << edge
21
+ edge
22
+ end
23
+
24
+ # (see Action#down)
25
+ def down(graph)
26
+ edge = make_edge(graph)
27
+ delete_first(edge.origin.outgoing_edges, edge)
28
+ delete_first(edge.destination.incoming_edges, edge)
29
+ end
30
+
31
+ # @!group AddEdgeNoCircular
32
+
33
+ # @return [String] the name of the origin of the edge
34
+ attr_reader :origin
35
+
36
+ # @return [String] the name of the destination of the edge
37
+ attr_reader :destination
38
+
39
+ # @return [Object] the requirement that the edge represents
40
+ attr_reader :requirement
41
+
42
+ # @param [DependencyGraph] graph the graph to find vertices from
43
+ # @return [Edge] The edge this action adds
44
+ def make_edge(graph)
45
+ Edge.new(graph.vertex_named(origin), graph.vertex_named(destination), requirement)
46
+ end
47
+
48
+ # Initialize an action to add an edge to a dependency graph
49
+ # @param [String] origin the name of the origin of the edge
50
+ # @param [String] destination the name of the destination of the edge
51
+ # @param [Object] requirement the requirement that the edge represents
52
+ def initialize(origin, destination, requirement)
53
+ @origin = origin
54
+ @destination = destination
55
+ @requirement = requirement
56
+ end
57
+
58
+ private
59
+
60
+ def delete_first(array, item)
61
+ return unless index = array.index(item)
62
+ array.delete_at(index)
63
+ end
64
+ end
65
+ end
66
+ end