bundler 1.13.6 → 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 (323) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +554 -9
  3. data/README.md +28 -5
  4. data/bundler.gemspec +40 -11
  5. data/exe/bundle +4 -8
  6. data/exe/bundle_ruby +4 -3
  7. data/lib/bundler.rb +162 -68
  8. data/lib/bundler/build_metadata.rb +53 -0
  9. data/lib/bundler/capistrano.rb +5 -0
  10. data/lib/bundler/cli.rb +360 -118
  11. data/lib/bundler/cli/add.rb +35 -0
  12. data/lib/bundler/cli/binstubs.rb +18 -10
  13. data/lib/bundler/cli/cache.rb +6 -5
  14. data/lib/bundler/cli/check.rb +4 -6
  15. data/lib/bundler/cli/clean.rb +6 -7
  16. data/lib/bundler/cli/common.rb +47 -1
  17. data/lib/bundler/cli/config.rb +26 -7
  18. data/lib/bundler/cli/console.rb +2 -1
  19. data/lib/bundler/cli/doctor.rb +63 -18
  20. data/lib/bundler/cli/exec.rb +12 -5
  21. data/lib/bundler/cli/gem.rb +59 -21
  22. data/lib/bundler/cli/info.rb +50 -0
  23. data/lib/bundler/cli/init.rb +21 -7
  24. data/lib/bundler/cli/inject.rb +13 -4
  25. data/lib/bundler/cli/install.rb +72 -101
  26. data/lib/bundler/cli/issue.rb +40 -0
  27. data/lib/bundler/cli/list.rb +58 -0
  28. data/lib/bundler/cli/lock.rb +9 -6
  29. data/lib/bundler/cli/open.rb +4 -3
  30. data/lib/bundler/cli/outdated.rb +175 -60
  31. data/lib/bundler/cli/package.rb +9 -6
  32. data/lib/bundler/cli/platform.rb +2 -1
  33. data/lib/bundler/cli/plugin.rb +1 -0
  34. data/lib/bundler/cli/pristine.rb +47 -0
  35. data/lib/bundler/cli/remove.rb +18 -0
  36. data/lib/bundler/cli/show.rb +2 -2
  37. data/lib/bundler/cli/update.rb +44 -34
  38. data/lib/bundler/cli/viz.rb +5 -1
  39. data/lib/bundler/compact_index_client.rb +109 -0
  40. data/lib/bundler/compact_index_client/cache.rb +118 -0
  41. data/lib/bundler/compact_index_client/updater.rb +116 -0
  42. data/lib/bundler/compatibility_guard.rb +14 -0
  43. data/lib/bundler/constants.rb +1 -0
  44. data/lib/bundler/current_ruby.rb +17 -8
  45. data/lib/bundler/definition.rb +353 -182
  46. data/lib/bundler/dep_proxy.rb +3 -1
  47. data/lib/bundler/dependency.rb +22 -10
  48. data/lib/bundler/deployment.rb +1 -1
  49. data/lib/bundler/deprecate.rb +15 -3
  50. data/lib/bundler/dsl.rb +122 -64
  51. data/lib/bundler/endpoint_specification.rb +13 -3
  52. data/lib/bundler/env.rb +110 -38
  53. data/lib/bundler/environment_preserver.rb +27 -6
  54. data/lib/bundler/errors.rb +24 -0
  55. data/lib/bundler/feature_flag.rb +74 -0
  56. data/lib/bundler/fetcher.rb +18 -11
  57. data/lib/bundler/fetcher/base.rb +1 -0
  58. data/lib/bundler/fetcher/compact_index.rb +7 -5
  59. data/lib/bundler/fetcher/dependency.rb +3 -2
  60. data/lib/bundler/fetcher/downloader.rb +25 -7
  61. data/lib/bundler/fetcher/index.rb +3 -2
  62. data/lib/bundler/friendly_errors.rb +33 -7
  63. data/lib/bundler/gem_helper.rb +25 -11
  64. data/lib/bundler/gem_helpers.rb +70 -1
  65. data/lib/bundler/gem_remote_fetcher.rb +1 -0
  66. data/lib/bundler/gem_tasks.rb +1 -0
  67. data/lib/bundler/gem_version_promoter.rb +17 -2
  68. data/lib/bundler/gemdeps.rb +29 -0
  69. data/lib/bundler/graph.rb +1 -0
  70. data/lib/bundler/index.rb +28 -15
  71. data/lib/bundler/injector.rb +216 -33
  72. data/lib/bundler/inline.rb +12 -12
  73. data/lib/bundler/installer.rb +139 -53
  74. data/lib/bundler/installer/gem_installer.rb +15 -5
  75. data/lib/bundler/installer/parallel_installer.rb +113 -28
  76. data/lib/bundler/installer/standalone.rb +1 -0
  77. data/lib/bundler/lazy_specification.rb +31 -3
  78. data/lib/bundler/lockfile_generator.rb +95 -0
  79. data/lib/bundler/lockfile_parser.rb +50 -37
  80. data/lib/bundler/match_platform.rb +13 -3
  81. data/lib/bundler/mirror.rb +10 -5
  82. data/lib/bundler/plugin.rb +22 -8
  83. data/lib/bundler/plugin/api.rb +2 -1
  84. data/lib/bundler/plugin/api/source.rb +17 -4
  85. data/lib/bundler/plugin/events.rb +61 -0
  86. data/lib/bundler/plugin/index.rb +9 -2
  87. data/lib/bundler/plugin/installer.rb +7 -6
  88. data/lib/bundler/plugin/source_list.rb +7 -8
  89. data/lib/bundler/process_lock.rb +24 -0
  90. data/lib/bundler/psyched_yaml.rb +10 -0
  91. data/lib/bundler/remote_specification.rb +30 -1
  92. data/lib/bundler/resolver.rb +187 -194
  93. data/lib/bundler/resolver/spec_group.rb +106 -0
  94. data/lib/bundler/retry.rb +5 -1
  95. data/lib/bundler/ruby_dsl.rb +1 -0
  96. data/lib/bundler/ruby_version.rb +12 -2
  97. data/lib/bundler/rubygems_ext.rb +23 -8
  98. data/lib/bundler/rubygems_gem_installer.rb +90 -0
  99. data/lib/bundler/rubygems_integration.rb +193 -70
  100. data/lib/bundler/runtime.rb +39 -22
  101. data/lib/bundler/settings.rb +245 -85
  102. data/lib/bundler/settings/validator.rb +102 -0
  103. data/lib/bundler/setup.rb +4 -7
  104. data/lib/bundler/shared_helpers.rb +183 -40
  105. data/lib/bundler/similarity_detector.rb +1 -0
  106. data/lib/bundler/source.rb +58 -1
  107. data/lib/bundler/source/gemspec.rb +1 -0
  108. data/lib/bundler/source/git.rb +52 -23
  109. data/lib/bundler/source/git/git_proxy.rb +30 -14
  110. data/lib/bundler/source/metadata.rb +62 -0
  111. data/lib/bundler/source/path.rb +42 -16
  112. data/lib/bundler/source/path/installer.rb +4 -2
  113. data/lib/bundler/source/rubygems.rb +171 -82
  114. data/lib/bundler/source/rubygems/remote.rb +12 -2
  115. data/lib/bundler/source_list.rb +75 -15
  116. data/lib/bundler/spec_set.rb +67 -32
  117. data/lib/bundler/ssl_certs/certificate_manager.rb +2 -1
  118. data/lib/bundler/stub_specification.rb +86 -2
  119. data/lib/bundler/templates/.document +1 -0
  120. data/lib/bundler/templates/Executable +13 -1
  121. data/lib/bundler/templates/Executable.bundler +105 -0
  122. data/lib/bundler/templates/Executable.standalone +5 -5
  123. data/lib/bundler/templates/Gemfile +3 -0
  124. data/lib/bundler/templates/gems.rb +8 -0
  125. data/lib/bundler/templates/newgem/Gemfile.tt +4 -2
  126. data/lib/bundler/templates/newgem/LICENSE.txt.tt +1 -1
  127. data/lib/bundler/templates/newgem/README.md.tt +14 -8
  128. data/lib/bundler/templates/newgem/Rakefile.tt +5 -5
  129. data/lib/bundler/templates/newgem/bin/console.tt +1 -1
  130. data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +4 -4
  131. data/lib/bundler/templates/newgem/ext/newgem/newgem.h.tt +3 -3
  132. data/lib/bundler/templates/newgem/gitignore.tt +5 -1
  133. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +7 -6
  134. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +4 -4
  135. data/lib/bundler/templates/newgem/newgem.gemspec.tt +21 -12
  136. data/lib/bundler/templates/newgem/rspec.tt +1 -0
  137. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +1 -3
  138. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +13 -1
  139. data/lib/bundler/templates/newgem/test/newgem_test.rb.tt +1 -1
  140. data/lib/bundler/templates/newgem/test/test_helper.rb.tt +3 -3
  141. data/lib/bundler/templates/newgem/{.travis.yml.tt → travis.yml.tt} +2 -0
  142. data/lib/bundler/ui.rb +1 -0
  143. data/lib/bundler/ui/rg_proxy.rb +1 -0
  144. data/lib/bundler/ui/shell.rb +30 -10
  145. data/lib/bundler/ui/silent.rb +21 -1
  146. data/lib/bundler/uri_credentials_filter.rb +1 -0
  147. data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
  148. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +2 -0
  149. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
  150. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
  151. data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +1 -0
  152. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +26 -6
  153. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +2 -1
  154. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +12 -4
  155. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +3 -2
  156. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +63 -0
  157. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +11 -3
  158. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +13 -1
  159. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +3 -2
  160. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +3 -2
  161. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +18 -5
  162. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +75 -7
  163. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +2 -1
  164. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +1 -0
  165. data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +3 -1
  166. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +499 -128
  167. data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +1 -0
  168. data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +8 -4
  169. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/faster.rb +1 -0
  170. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent.rb +27 -24
  171. data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent/ssl_reuse.rb +2 -1
  172. data/lib/bundler/vendor/thor/lib/thor.rb +46 -21
  173. data/lib/bundler/vendor/thor/lib/thor/actions.rb +24 -22
  174. data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +2 -1
  175. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  176. data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +2 -2
  177. data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +16 -8
  178. data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +66 -18
  179. data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +17 -15
  180. data/lib/bundler/vendor/thor/lib/thor/base.rb +55 -32
  181. data/lib/bundler/vendor/thor/lib/thor/command.rb +13 -11
  182. data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +21 -1
  183. data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +7 -5
  184. data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +94 -63
  185. data/lib/bundler/vendor/thor/lib/thor/error.rb +3 -3
  186. data/lib/bundler/vendor/thor/lib/thor/group.rb +13 -13
  187. data/lib/bundler/vendor/thor/lib/thor/invocation.rb +4 -5
  188. data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +2 -0
  189. data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +4 -7
  190. data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +16 -16
  191. data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +42 -21
  192. data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +13 -10
  193. data/lib/bundler/vendor/thor/lib/thor/runner.rb +31 -29
  194. data/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
  195. data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +49 -33
  196. data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -1
  197. data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +4 -4
  198. data/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
  199. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  200. data/lib/bundler/vendored_fileutils.rb +9 -0
  201. data/lib/bundler/vendored_molinillo.rb +1 -0
  202. data/lib/bundler/vendored_persistent.rb +43 -3
  203. data/lib/bundler/vendored_thor.rb +6 -2
  204. data/lib/bundler/version.rb +19 -2
  205. data/lib/bundler/version_ranges.rb +76 -0
  206. data/lib/bundler/vlad.rb +5 -0
  207. data/lib/bundler/worker.rb +30 -6
  208. data/lib/bundler/yaml_serializer.rb +4 -4
  209. data/man/bundle-add.1 +58 -0
  210. data/man/bundle-add.1.txt +52 -0
  211. data/man/bundle-add.ronn +40 -0
  212. data/{lib/bundler/man/bundle-binstubs → man/bundle-binstubs.1} +11 -1
  213. data/man/bundle-binstubs.1.txt +48 -0
  214. data/man/bundle-binstubs.ronn +15 -1
  215. data/man/bundle-check.1 +31 -0
  216. data/man/bundle-check.1.txt +33 -0
  217. data/man/bundle-check.ronn +26 -0
  218. data/man/bundle-clean.1 +24 -0
  219. data/man/bundle-clean.1.txt +26 -0
  220. data/man/bundle-clean.ronn +18 -0
  221. data/man/bundle-config.1 +497 -0
  222. data/man/bundle-config.1.txt +529 -0
  223. data/man/bundle-config.ronn +233 -61
  224. data/man/bundle-doctor.1 +44 -0
  225. data/man/bundle-doctor.1.txt +44 -0
  226. data/man/bundle-doctor.ronn +33 -0
  227. data/{lib/bundler/man/bundle-exec → man/bundle-exec.1} +6 -3
  228. data/man/bundle-exec.1.txt +178 -0
  229. data/man/bundle-exec.ronn +10 -3
  230. data/{lib/bundler/man/bundle-gem → man/bundle-gem.1} +4 -4
  231. data/man/bundle-gem.1.txt +91 -0
  232. data/man/bundle-gem.ronn +3 -2
  233. data/man/bundle-info.1 +20 -0
  234. data/man/bundle-info.1.txt +21 -0
  235. data/man/bundle-info.ronn +17 -0
  236. data/man/bundle-init.1 +25 -0
  237. data/man/bundle-init.1.txt +34 -0
  238. data/man/bundle-init.ronn +29 -0
  239. data/man/bundle-inject.1 +33 -0
  240. data/man/bundle-inject.1.txt +32 -0
  241. data/man/bundle-inject.ronn +22 -0
  242. data/{lib/bundler/man/bundle-install → man/bundle-install.1} +32 -29
  243. data/man/bundle-install.1.txt +396 -0
  244. data/man/bundle-install.ronn +45 -36
  245. data/man/bundle-list.1 +50 -0
  246. data/man/bundle-list.1.txt +43 -0
  247. data/man/bundle-list.ronn +33 -0
  248. data/{lib/bundler/man/bundle-lock → man/bundle-lock.1} +43 -2
  249. data/man/bundle-lock.1.txt +93 -0
  250. data/man/bundle-lock.ronn +47 -0
  251. data/man/bundle-open.1 +32 -0
  252. data/man/bundle-open.1.txt +29 -0
  253. data/man/bundle-open.ronn +19 -0
  254. data/man/bundle-outdated.1 +155 -0
  255. data/man/bundle-outdated.1.txt +131 -0
  256. data/man/bundle-outdated.ronn +111 -0
  257. data/{lib/bundler/man/bundle-package → man/bundle-package.1} +6 -3
  258. data/man/bundle-package.1.txt +79 -0
  259. data/man/bundle-package.ronn +7 -2
  260. data/{lib/bundler/man/bundle-platform → man/bundle-platform.1} +1 -1
  261. data/man/bundle-platform.1.txt +57 -0
  262. data/man/bundle-pristine.1 +34 -0
  263. data/man/bundle-pristine.1.txt +44 -0
  264. data/man/bundle-pristine.ronn +34 -0
  265. data/man/bundle-remove.1 +31 -0
  266. data/man/bundle-remove.1.txt +34 -0
  267. data/man/bundle-remove.ronn +23 -0
  268. data/man/bundle-show.1 +23 -0
  269. data/man/bundle-show.1.txt +27 -0
  270. data/man/bundle-show.ronn +21 -0
  271. data/man/bundle-update.1 +394 -0
  272. data/man/bundle-update.1.txt +391 -0
  273. data/man/bundle-update.ronn +172 -16
  274. data/man/bundle-viz.1 +39 -0
  275. data/man/bundle-viz.1.txt +39 -0
  276. data/man/bundle-viz.ronn +30 -0
  277. data/{lib/bundler/man/bundle → man/bundle.1} +44 -28
  278. data/man/bundle.1.txt +116 -0
  279. data/man/bundle.ronn +39 -27
  280. data/{lib/bundler/man → man}/gemfile.5 +67 -84
  281. data/man/gemfile.5.ronn +77 -55
  282. data/man/gemfile.5.txt +653 -0
  283. data/man/index.txt +25 -8
  284. metadata +118 -58
  285. data/.codeclimate.yml +0 -25
  286. data/.gitignore +0 -16
  287. data/.rspec +0 -3
  288. data/.rubocop.yml +0 -128
  289. data/.rubocop_todo.yml +0 -248
  290. data/.travis.yml +0 -108
  291. data/CODE_OF_CONDUCT.md +0 -42
  292. data/CONTRIBUTING.md +0 -36
  293. data/DEVELOPMENT.md +0 -148
  294. data/ISSUES.md +0 -100
  295. data/Rakefile +0 -333
  296. data/bin/rake +0 -19
  297. data/bin/rspec +0 -15
  298. data/bin/rubocop +0 -17
  299. data/bin/with_rubygems +0 -39
  300. data/lib/bundler/man/bundle-binstubs.txt +0 -33
  301. data/lib/bundler/man/bundle-config +0 -254
  302. data/lib/bundler/man/bundle-config.txt +0 -282
  303. data/lib/bundler/man/bundle-exec.txt +0 -171
  304. data/lib/bundler/man/bundle-gem.txt +0 -90
  305. data/lib/bundler/man/bundle-install.txt +0 -385
  306. data/lib/bundler/man/bundle-lock.txt +0 -52
  307. data/lib/bundler/man/bundle-package.txt +0 -74
  308. data/lib/bundler/man/bundle-platform.txt +0 -57
  309. data/lib/bundler/man/bundle-update +0 -221
  310. data/lib/bundler/man/bundle-update.txt +0 -227
  311. data/lib/bundler/man/bundle.txt +0 -104
  312. data/lib/bundler/man/gemfile.5.txt +0 -636
  313. data/lib/bundler/postit_trampoline.rb +0 -68
  314. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client.rb +0 -79
  315. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/cache.rb +0 -112
  316. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/updater.rb +0 -80
  317. data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/version.rb +0 -4
  318. data/lib/bundler/vendor/postit/lib/postit.rb +0 -15
  319. data/lib/bundler/vendor/postit/lib/postit/environment.rb +0 -44
  320. data/lib/bundler/vendor/postit/lib/postit/installer.rb +0 -28
  321. data/lib/bundler/vendor/postit/lib/postit/parser.rb +0 -21
  322. data/lib/bundler/vendor/postit/lib/postit/setup.rb +0 -12
  323. data/lib/bundler/vendor/postit/lib/postit/version.rb +0 -3
@@ -1,4 +1,6 @@
1
1
  # frozen_string_literal: true
2
+
3
+ require 'bundler/vendor/molinillo/lib/molinillo/compatibility'
2
4
  require 'bundler/vendor/molinillo/lib/molinillo/gem_metadata'
3
5
  require 'bundler/vendor/molinillo/lib/molinillo/errors'
4
6
  require 'bundler/vendor/molinillo/lib/molinillo/resolver'
@@ -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
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler::Molinillo
3
4
  # @!visibility private
4
5
  module Delegates
@@ -45,6 +46,12 @@ module Bundler::Molinillo
45
46
  current_state = state || Bundler::Molinillo::ResolutionState.empty
46
47
  current_state.conflicts
47
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
48
55
  end
49
56
  end
50
57
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler::Molinillo
3
4
  module Delegates
4
5
  # Delegates all {Bundler::Molinillo::SpecificationProvider} methods to a
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'set'
3
4
  require 'tsort'
4
5
 
@@ -98,18 +99,27 @@ module Bundler::Molinillo
98
99
  "#{self.class}:#{vertices.values.inspect}"
99
100
  end
100
101
 
102
+ # @param [Hash] options options for dot output.
101
103
  # @return [String] Returns a dot format representation of the graph
102
- def to_dot
104
+ def to_dot(options = {})
105
+ edge_label = options.delete(:edge_label)
106
+ raise ArgumentError, "Unknown options: #{options.keys}" unless options.empty?
107
+
103
108
  dot_vertices = []
104
109
  dot_edges = []
105
110
  vertices.each do |n, v|
106
111
  dot_vertices << " #{n} [label=\"{#{n}|#{v.payload}}\"]"
107
112
  v.outgoing_edges.each do |e|
108
- dot_edges << " #{e.origin.name} -> #{e.destination.name} [label=\"#{e.requirement}\"]"
113
+ label = edge_label ? edge_label.call(e) : e.requirement
114
+ dot_edges << " #{e.origin.name} -> #{e.destination.name} [label=#{label.to_s.dump}]"
109
115
  end
110
116
  end
117
+
118
+ dot_vertices.uniq!
111
119
  dot_vertices.sort!
120
+ dot_edges.uniq!
112
121
  dot_edges.sort!
122
+
113
123
  dot = dot_vertices.unshift('digraph G {').push('') + dot_edges.push('}')
114
124
  dot.join("\n")
115
125
  end
@@ -119,10 +129,12 @@ module Bundler::Molinillo
119
129
  # {Vertex#successors}
120
130
  def ==(other)
121
131
  return false unless other
132
+ return true if equal?(other)
122
133
  vertices.each do |name, vertex|
123
134
  other_vertex = other.vertex_named(name)
124
135
  return false unless other_vertex
125
- return false unless other_vertex.successors.map(&:name).to_set == vertex.successors.map(&:name).to_set
136
+ return false unless vertex.payload == other_vertex.payload
137
+ return false unless other_vertex.successors.to_set == vertex.successors.to_set
126
138
  end
127
139
  end
128
140
 
@@ -134,9 +146,10 @@ module Bundler::Molinillo
134
146
  def add_child_vertex(name, payload, parent_names, requirement)
135
147
  root = !parent_names.delete(nil) { true }
136
148
  vertex = add_vertex(name, payload, root)
149
+ vertex.explicit_requirements << requirement if root
137
150
  parent_names.each do |parent_name|
138
- parent_node = vertex_named(parent_name)
139
- add_edge(parent_node, vertex, requirement)
151
+ parent_vertex = vertex_named(parent_name)
152
+ add_edge(parent_vertex, vertex, requirement)
140
153
  end
141
154
  vertex
142
155
  end
@@ -152,7 +165,7 @@ module Bundler::Molinillo
152
165
  # Detaches the {#vertex_named} `name` {Vertex} from the graph, recursively
153
166
  # removing any non-root vertices that were orphaned in the process
154
167
  # @param [String] name
155
- # @return [void]
168
+ # @return [Array<Vertex>] the vertices which have been detached
156
169
  def detach_vertex_named(name)
157
170
  log.detach_vertex_named(self, name)
158
171
  end
@@ -182,6 +195,13 @@ module Bundler::Molinillo
182
195
  add_edge_no_circular(origin, destination, requirement)
183
196
  end
184
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
+
185
205
  # Sets the payload of the vertex with the given name
186
206
  # @param [String] name the name of the vertex
187
207
  # @param [Object] payload the payload
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler::Molinillo
3
4
  class DependencyGraph
4
5
  # An action that modifies a {DependencyGraph} that is reversible.
@@ -7,7 +8,7 @@ module Bundler::Molinillo
7
8
  # rubocop:disable Lint/UnusedMethodArgument
8
9
 
9
10
  # @return [Symbol] The name of the action.
10
- def self.name
11
+ def self.action_name
11
12
  raise 'Abstract'
12
13
  end
13
14
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/action'
3
4
  module Bundler::Molinillo
4
5
  class DependencyGraph
@@ -7,8 +8,8 @@ module Bundler::Molinillo
7
8
  class AddEdgeNoCircular < Action
8
9
  # @!group Action
9
10
 
10
- # (see Action.name)
11
- def self.name
11
+ # (see Action.action_name)
12
+ def self.action_name
12
13
  :add_vertex
13
14
  end
14
15
 
@@ -23,8 +24,8 @@ module Bundler::Molinillo
23
24
  # (see Action#down)
24
25
  def down(graph)
25
26
  edge = make_edge(graph)
26
- edge.origin.outgoing_edges.delete(edge)
27
- edge.destination.incoming_edges.delete(edge)
27
+ delete_first(edge.origin.outgoing_edges, edge)
28
+ delete_first(edge.destination.incoming_edges, edge)
28
29
  end
29
30
 
30
31
  # @!group AddEdgeNoCircular
@@ -53,6 +54,13 @@ module Bundler::Molinillo
53
54
  @destination = destination
54
55
  @requirement = requirement
55
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
56
64
  end
57
65
  end
58
66
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/action'
3
4
  module Bundler::Molinillo
4
5
  class DependencyGraph
@@ -7,8 +8,8 @@ module Bundler::Molinillo
7
8
  class AddVertex < Action # :nodoc:
8
9
  # @!group Action
9
10
 
10
- # (see Action.name)
11
- def self.name
11
+ # (see Action.action_name)
12
+ def self.action_name
12
13
  :add_vertex
13
14
  end
14
15
 
@@ -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
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/action'
3
4
  module Bundler::Molinillo
4
5
  class DependencyGraph
@@ -8,22 +9,29 @@ module Bundler::Molinillo
8
9
  # @!group Action
9
10
 
10
11
  # (see Action#name)
11
- def self.name
12
+ def self.action_name
12
13
  :add_vertex
13
14
  end
14
15
 
15
16
  # (see Action#up)
16
17
  def up(graph)
17
- return unless @vertex = graph.vertices.delete(name)
18
+ return [] unless @vertex = graph.vertices.delete(name)
19
+
20
+ removed_vertices = [@vertex]
18
21
  @vertex.outgoing_edges.each do |e|
19
22
  v = e.destination
20
23
  v.incoming_edges.delete(e)
21
- graph.detach_vertex_named(v.name) unless v.root? || v.predecessors.any?
24
+ if !v.root? && v.incoming_edges.empty?
25
+ removed_vertices.concat graph.detach_vertex_named(v.name)
26
+ end
22
27
  end
28
+
23
29
  @vertex.incoming_edges.each do |e|
24
30
  v = e.origin
25
31
  v.outgoing_edges.delete(e)
26
32
  end
33
+
34
+ removed_vertices
27
35
  end
28
36
 
29
37
  # (see Action#down)
@@ -1,6 +1,8 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular'
3
4
  require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex'
5
+ require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge'
4
6
  require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named'
5
7
  require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload'
6
8
  require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag'
@@ -40,6 +42,16 @@ module Bundler::Molinillo
40
42
  push_action(graph, AddEdgeNoCircular.new(origin, destination, requirement))
41
43
  end
42
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
+
43
55
  # @macro action
44
56
  def set_payload(graph, name, payload)
45
57
  push_action(graph, SetPayload.new(name, payload))
@@ -92,7 +104,7 @@ module Bundler::Molinillo
92
104
  loop do
93
105
  action = pop!(graph)
94
106
  raise "No tag #{tag.inspect} found" unless action
95
- break if action.class.name == :tag && action.tag == tag
107
+ break if action.class.action_name == :tag && action.tag == tag
96
108
  end
97
109
  end
98
110
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/action'
3
4
  module Bundler::Molinillo
4
5
  class DependencyGraph
@@ -7,8 +8,8 @@ module Bundler::Molinillo
7
8
  class SetPayload < Action # :nodoc:
8
9
  # @!group Action
9
10
 
10
- # (see Action.name)
11
- def self.name
11
+ # (see Action.action_name)
12
+ def self.action_name
12
13
  :set_payload
13
14
  end
14
15
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'bundler/vendor/molinillo/lib/molinillo/dependency_graph/action'
3
4
  module Bundler::Molinillo
4
5
  class DependencyGraph
@@ -7,8 +8,8 @@ module Bundler::Molinillo
7
8
  class Tag < Action
8
9
  # @!group Action
9
10
 
10
- # (see Action.name)
11
- def self.name
11
+ # (see Action.action_name)
12
+ def self.action_name
12
13
  :tag
13
14
  end
14
15
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Bundler::Molinillo
3
4
  class DependencyGraph
4
5
  # A vertex in a {DependencyGraph} that encapsulates a {#name} and a
@@ -10,7 +11,7 @@ module Bundler::Molinillo
10
11
  # @return [Object] the payload the vertex holds
11
12
  attr_accessor :payload
12
13
 
13
- # @return [Arrary<Object>] the explicit requirements that required
14
+ # @return [Array<Object>] the explicit requirements that required
14
15
  # this vertex
15
16
  attr_reader :explicit_requirements
16
17
 
@@ -32,7 +33,7 @@ module Bundler::Molinillo
32
33
  # @return [Array<Object>] all of the requirements that required
33
34
  # this vertex
34
35
  def requirements
35
- incoming_edges.map(&:requirement) + explicit_requirements
36
+ (incoming_edges.map(&:requirement) + explicit_requirements).uniq
36
37
  end
37
38
 
38
39
  # @return [Array<Edge>] the edges of {#graph} that have `self` as their
@@ -53,7 +54,7 @@ module Bundler::Molinillo
53
54
  # {#descendent?}
54
55
  def recursive_predecessors
55
56
  vertices = predecessors
56
- vertices += vertices.map(&:recursive_predecessors).flatten(1)
57
+ vertices += Compatibility.flat_map(vertices, &:recursive_predecessors)
57
58
  vertices.uniq!
58
59
  vertices
59
60
  end
@@ -68,7 +69,7 @@ module Bundler::Molinillo
68
69
  # {#ancestor?}
69
70
  def recursive_successors
70
71
  vertices = successors
71
- vertices += vertices.map(&:recursive_successors).flatten(1)
72
+ vertices += Compatibility.flat_map(vertices, &:recursive_successors)
72
73
  vertices.uniq!
73
74
  vertices
74
75
  end
@@ -81,6 +82,7 @@ module Bundler::Molinillo
81
82
  # @return [Boolean] whether the two vertices are equal, determined
82
83
  # by a recursive traversal of each {Vertex#successors}
83
84
  def ==(other)
85
+ return true if equal?(other)
84
86
  shallow_eql?(other) &&
85
87
  successors.to_set == other.successors.to_set
86
88
  end
@@ -89,6 +91,7 @@ module Bundler::Molinillo
89
91
  # @return [Boolean] whether the two vertices are equal, determined
90
92
  # solely by {#name} and {#payload} equality
91
93
  def shallow_eql?(other)
94
+ return true if equal?(other)
92
95
  other &&
93
96
  name == other.name &&
94
97
  payload == other.payload
@@ -105,11 +108,21 @@ module Bundler::Molinillo
105
108
  # dependency graph?
106
109
  # @return true iff there is a path following edges within this {#graph}
107
110
  def path_to?(other)
108
- equal?(other) || successors.any? { |v| v.path_to?(other) }
111
+ _path_to?(other)
109
112
  end
110
113
 
111
114
  alias descendent? path_to?
112
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
+
113
126
  # Is there a path from `other` to `self` following edges in the
114
127
  # dependency graph?
115
128
  # @return true iff there is a path following edges within this {#graph}