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,62 @@
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_vertex)
8
+ class AddVertex < Action # :nodoc:
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
+ if existing = graph.vertices[name]
19
+ @existing_payload = existing.payload
20
+ @existing_root = existing.root
21
+ end
22
+ vertex = existing || Vertex.new(name, payload)
23
+ graph.vertices[vertex.name] = vertex
24
+ vertex.payload ||= payload
25
+ vertex.root ||= root
26
+ vertex
27
+ end
28
+
29
+ # (see Action#down)
30
+ def down(graph)
31
+ if defined?(@existing_payload)
32
+ vertex = graph.vertices[name]
33
+ vertex.payload = @existing_payload
34
+ vertex.root = @existing_root
35
+ else
36
+ graph.vertices.delete(name)
37
+ end
38
+ end
39
+
40
+ # @!group AddVertex
41
+
42
+ # @return [String] the name of the vertex
43
+ attr_reader :name
44
+
45
+ # @return [Object] the payload for the vertex
46
+ attr_reader :payload
47
+
48
+ # @return [Boolean] whether the vertex is root or not
49
+ attr_reader :root
50
+
51
+ # Initialize an action to add a vertex to a dependency graph
52
+ # @param [String] name the name of the vertex
53
+ # @param [Object] payload the payload for the vertex
54
+ # @param [Boolean] root whether the vertex is root or not
55
+ def initialize(name, payload, root)
56
+ @name = name
57
+ @payload = payload
58
+ @root = root
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,63 @@
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#delete_edge)
8
+ class DeleteEdge < Action
9
+ # @!group Action
10
+
11
+ # (see Action.action_name)
12
+ def self.action_name
13
+ :delete_edge
14
+ end
15
+
16
+ # (see Action#up)
17
+ def up(graph)
18
+ edge = make_edge(graph)
19
+ edge.origin.outgoing_edges.delete(edge)
20
+ edge.destination.incoming_edges.delete(edge)
21
+ end
22
+
23
+ # (see Action#down)
24
+ def down(graph)
25
+ edge = make_edge(graph)
26
+ edge.origin.outgoing_edges << edge
27
+ edge.destination.incoming_edges << edge
28
+ edge
29
+ end
30
+
31
+ # @!group DeleteEdge
32
+
33
+ # @return [String] the name of the origin of the edge
34
+ attr_reader :origin_name
35
+
36
+ # @return [String] the name of the destination of the edge
37
+ attr_reader :destination_name
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(
46
+ graph.vertex_named(origin_name),
47
+ graph.vertex_named(destination_name),
48
+ requirement
49
+ )
50
+ end
51
+
52
+ # Initialize an action to add an edge to a dependency graph
53
+ # @param [String] origin_name the name of the origin of the edge
54
+ # @param [String] destination_name the name of the destination of the edge
55
+ # @param [Object] requirement the requirement that the edge represents
56
+ def initialize(origin_name, destination_name, requirement)
57
+ @origin_name = origin_name
58
+ @destination_name = destination_name
59
+ @requirement = requirement
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,61 @@
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#detach_vertex_named
8
+ class DetachVertexNamed < Action
9
+ # @!group Action
10
+
11
+ # (see Action#name)
12
+ def self.action_name
13
+ :add_vertex
14
+ end
15
+
16
+ # (see Action#up)
17
+ def up(graph)
18
+ return [] unless @vertex = graph.vertices.delete(name)
19
+
20
+ removed_vertices = [@vertex]
21
+ @vertex.outgoing_edges.each do |e|
22
+ v = e.destination
23
+ v.incoming_edges.delete(e)
24
+ if !v.root? && v.incoming_edges.empty?
25
+ removed_vertices.concat graph.detach_vertex_named(v.name)
26
+ end
27
+ end
28
+
29
+ @vertex.incoming_edges.each do |e|
30
+ v = e.origin
31
+ v.outgoing_edges.delete(e)
32
+ end
33
+
34
+ removed_vertices
35
+ end
36
+
37
+ # (see Action#down)
38
+ def down(graph)
39
+ return unless @vertex
40
+ graph.vertices[@vertex.name] = @vertex
41
+ @vertex.outgoing_edges.each do |e|
42
+ e.destination.incoming_edges << e
43
+ end
44
+ @vertex.incoming_edges.each do |e|
45
+ e.origin.outgoing_edges << e
46
+ end
47
+ end
48
+
49
+ # @!group DetachVertexNamed
50
+
51
+ # @return [String] the name of the vertex to detach
52
+ attr_reader :name
53
+
54
+ # Initialize an action to detach a vertex from a dependency graph
55
+ # @param [String] name the name of the vertex to detach
56
+ def initialize(name)
57
+ @name = name
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular'
4
+ require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex'
5
+ require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge'
6
+ require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named'
7
+ require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload'
8
+ require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag'
9
+
10
+ module Bundler::Molinillo
11
+ class DependencyGraph
12
+ # A log for dependency graph actions
13
+ class Log
14
+ # Initializes an empty log
15
+ def initialize
16
+ @current_action = @first_action = nil
17
+ end
18
+
19
+ # @!macro [new] action
20
+ # {include:DependencyGraph#$0}
21
+ # @param [Graph] graph the graph to perform the action on
22
+ # @param (see DependencyGraph#$0)
23
+ # @return (see DependencyGraph#$0)
24
+
25
+ # @macro action
26
+ def tag(graph, tag)
27
+ push_action(graph, Tag.new(tag))
28
+ end
29
+
30
+ # @macro action
31
+ def add_vertex(graph, name, payload, root)
32
+ push_action(graph, AddVertex.new(name, payload, root))
33
+ end
34
+
35
+ # @macro action
36
+ def detach_vertex_named(graph, name)
37
+ push_action(graph, DetachVertexNamed.new(name))
38
+ end
39
+
40
+ # @macro action
41
+ def add_edge_no_circular(graph, origin, destination, requirement)
42
+ push_action(graph, AddEdgeNoCircular.new(origin, destination, requirement))
43
+ end
44
+
45
+ # {include:DependencyGraph#delete_edge}
46
+ # @param [Graph] graph the graph to perform the action on
47
+ # @param [String] origin_name
48
+ # @param [String] destination_name
49
+ # @param [Object] requirement
50
+ # @return (see DependencyGraph#delete_edge)
51
+ def delete_edge(graph, origin_name, destination_name, requirement)
52
+ push_action(graph, DeleteEdge.new(origin_name, destination_name, requirement))
53
+ end
54
+
55
+ # @macro action
56
+ def set_payload(graph, name, payload)
57
+ push_action(graph, SetPayload.new(name, payload))
58
+ end
59
+
60
+ # Pops the most recent action from the log and undoes the action
61
+ # @param [DependencyGraph] graph
62
+ # @return [Action] the action that was popped off the log
63
+ def pop!(graph)
64
+ return unless action = @current_action
65
+ unless @current_action = action.previous
66
+ @first_action = nil
67
+ end
68
+ action.down(graph)
69
+ action
70
+ end
71
+
72
+ extend Enumerable
73
+
74
+ # @!visibility private
75
+ # Enumerates each action in the log
76
+ # @yield [Action]
77
+ def each
78
+ return enum_for unless block_given?
79
+ action = @first_action
80
+ loop do
81
+ break unless action
82
+ yield action
83
+ action = action.next
84
+ end
85
+ self
86
+ end
87
+
88
+ # @!visibility private
89
+ # Enumerates each action in the log in reverse order
90
+ # @yield [Action]
91
+ def reverse_each
92
+ return enum_for(:reverse_each) unless block_given?
93
+ action = @current_action
94
+ loop do
95
+ break unless action
96
+ yield action
97
+ action = action.previous
98
+ end
99
+ self
100
+ end
101
+
102
+ # @macro action
103
+ def rewind_to(graph, tag)
104
+ loop do
105
+ action = pop!(graph)
106
+ raise "No tag #{tag.inspect} found" unless action
107
+ break if action.class.action_name == :tag && action.tag == tag
108
+ end
109
+ end
110
+
111
+ private
112
+
113
+ # Adds the given action to the log, running the action
114
+ # @param [DependencyGraph] graph
115
+ # @param [Action] action
116
+ # @return The value returned by `action.up`
117
+ def push_action(graph, action)
118
+ action.previous = @current_action
119
+ @current_action.next = action if @current_action
120
+ @current_action = action
121
+ @first_action ||= action
122
+ action.up(graph)
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,46 @@
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#set_payload
8
+ class SetPayload < Action # :nodoc:
9
+ # @!group Action
10
+
11
+ # (see Action.action_name)
12
+ def self.action_name
13
+ :set_payload
14
+ end
15
+
16
+ # (see Action#up)
17
+ def up(graph)
18
+ vertex = graph.vertex_named(name)
19
+ @old_payload = vertex.payload
20
+ vertex.payload = payload
21
+ end
22
+
23
+ # (see Action#down)
24
+ def down(graph)
25
+ graph.vertex_named(name).payload = @old_payload
26
+ end
27
+
28
+ # @!group SetPayload
29
+
30
+ # @return [String] the name of the vertex
31
+ attr_reader :name
32
+
33
+ # @return [Object] the payload for the vertex
34
+ attr_reader :payload
35
+
36
+ # Initialize an action to add set the payload for a vertex in a dependency
37
+ # graph
38
+ # @param [String] name the name of the vertex
39
+ # @param [Object] payload the payload for the vertex
40
+ def initialize(name, payload)
41
+ @name = name
42
+ @payload = payload
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,36 @@
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#tag
8
+ class Tag < Action
9
+ # @!group Action
10
+
11
+ # (see Action.action_name)
12
+ def self.action_name
13
+ :tag
14
+ end
15
+
16
+ # (see Action#up)
17
+ def up(_graph)
18
+ end
19
+
20
+ # (see Action#down)
21
+ def down(_graph)
22
+ end
23
+
24
+ # @!group Tag
25
+
26
+ # @return [Object] An opaque tag
27
+ attr_reader :tag
28
+
29
+ # Initialize an action to tag a state of a dependency graph
30
+ # @param [Object] tag an opaque tag
31
+ def initialize(tag)
32
+ @tag = tag
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,136 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler::Molinillo
4
+ class DependencyGraph
5
+ # A vertex in a {DependencyGraph} that encapsulates a {#name} and a
6
+ # {#payload}
7
+ class Vertex
8
+ # @return [String] the name of the vertex
9
+ attr_accessor :name
10
+
11
+ # @return [Object] the payload the vertex holds
12
+ attr_accessor :payload
13
+
14
+ # @return [Array<Object>] the explicit requirements that required
15
+ # this vertex
16
+ attr_reader :explicit_requirements
17
+
18
+ # @return [Boolean] whether the vertex is considered a root vertex
19
+ attr_accessor :root
20
+ alias root? root
21
+
22
+ # Initializes a vertex with the given name and payload.
23
+ # @param [String] name see {#name}
24
+ # @param [Object] payload see {#payload}
25
+ def initialize(name, payload)
26
+ @name = name.frozen? ? name : name.dup.freeze
27
+ @payload = payload
28
+ @explicit_requirements = []
29
+ @outgoing_edges = []
30
+ @incoming_edges = []
31
+ end
32
+
33
+ # @return [Array<Object>] all of the requirements that required
34
+ # this vertex
35
+ def requirements
36
+ (incoming_edges.map(&:requirement) + explicit_requirements).uniq
37
+ end
38
+
39
+ # @return [Array<Edge>] the edges of {#graph} that have `self` as their
40
+ # {Edge#origin}
41
+ attr_accessor :outgoing_edges
42
+
43
+ # @return [Array<Edge>] the edges of {#graph} that have `self` as their
44
+ # {Edge#destination}
45
+ attr_accessor :incoming_edges
46
+
47
+ # @return [Array<Vertex>] the vertices of {#graph} that have an edge with
48
+ # `self` as their {Edge#destination}
49
+ def predecessors
50
+ incoming_edges.map(&:origin)
51
+ end
52
+
53
+ # @return [Array<Vertex>] the vertices of {#graph} where `self` is a
54
+ # {#descendent?}
55
+ def recursive_predecessors
56
+ vertices = predecessors
57
+ vertices += Compatibility.flat_map(vertices, &:recursive_predecessors)
58
+ vertices.uniq!
59
+ vertices
60
+ end
61
+
62
+ # @return [Array<Vertex>] the vertices of {#graph} that have an edge with
63
+ # `self` as their {Edge#origin}
64
+ def successors
65
+ outgoing_edges.map(&:destination)
66
+ end
67
+
68
+ # @return [Array<Vertex>] the vertices of {#graph} where `self` is an
69
+ # {#ancestor?}
70
+ def recursive_successors
71
+ vertices = successors
72
+ vertices += Compatibility.flat_map(vertices, &:recursive_successors)
73
+ vertices.uniq!
74
+ vertices
75
+ end
76
+
77
+ # @return [String] a string suitable for debugging
78
+ def inspect
79
+ "#{self.class}:#{name}(#{payload.inspect})"
80
+ end
81
+
82
+ # @return [Boolean] whether the two vertices are equal, determined
83
+ # by a recursive traversal of each {Vertex#successors}
84
+ def ==(other)
85
+ return true if equal?(other)
86
+ shallow_eql?(other) &&
87
+ successors.to_set == other.successors.to_set
88
+ end
89
+
90
+ # @param [Vertex] other the other vertex to compare to
91
+ # @return [Boolean] whether the two vertices are equal, determined
92
+ # solely by {#name} and {#payload} equality
93
+ def shallow_eql?(other)
94
+ return true if equal?(other)
95
+ other &&
96
+ name == other.name &&
97
+ payload == other.payload
98
+ end
99
+
100
+ alias eql? ==
101
+
102
+ # @return [Fixnum] a hash for the vertex based upon its {#name}
103
+ def hash
104
+ name.hash
105
+ end
106
+
107
+ # Is there a path from `self` to `other` following edges in the
108
+ # dependency graph?
109
+ # @return true iff there is a path following edges within this {#graph}
110
+ def path_to?(other)
111
+ _path_to?(other)
112
+ end
113
+
114
+ alias descendent? path_to?
115
+
116
+ # @param [Vertex] other the vertex to check if there's a path to
117
+ # @param [Set<Vertex>] visited the vertices of {#graph} that have been visited
118
+ # @return [Boolean] whether there is a path to `other` from `self`
119
+ def _path_to?(other, visited = Set.new)
120
+ return false unless visited.add?(self)
121
+ return true if equal?(other)
122
+ successors.any? { |v| v._path_to?(other, visited) }
123
+ end
124
+ protected :_path_to?
125
+
126
+ # Is there a path from `other` to `self` following edges in the
127
+ # dependency graph?
128
+ # @return true iff there is a path following edges within this {#graph}
129
+ def ancestor?(other)
130
+ other.path_to?(self)
131
+ end
132
+
133
+ alias is_reachable_from? ancestor?
134
+ end
135
+ end
136
+ end