bundler 2.1.4 → 2.2.6

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of bundler might be problematic. Click here for more details.

Files changed (210) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1624 -1426
  3. data/README.md +6 -8
  4. data/bundler.gemspec +4 -4
  5. data/exe/bundle +3 -0
  6. data/lib/bundler.rb +32 -8
  7. data/lib/bundler/build_metadata.rb +3 -11
  8. data/lib/bundler/cli.rb +55 -21
  9. data/lib/bundler/cli/add.rb +1 -1
  10. data/lib/bundler/cli/binstubs.rb +6 -2
  11. data/lib/bundler/cli/cache.rb +1 -7
  12. data/lib/bundler/cli/clean.rb +1 -1
  13. data/lib/bundler/cli/common.rb +14 -0
  14. data/lib/bundler/cli/console.rb +1 -1
  15. data/lib/bundler/cli/doctor.rb +1 -1
  16. data/lib/bundler/cli/exec.rb +4 -4
  17. data/lib/bundler/cli/fund.rb +36 -0
  18. data/lib/bundler/cli/gem.rb +86 -11
  19. data/lib/bundler/cli/info.rb +15 -4
  20. data/lib/bundler/cli/init.rb +2 -2
  21. data/lib/bundler/cli/inject.rb +1 -1
  22. data/lib/bundler/cli/install.rb +13 -11
  23. data/lib/bundler/cli/issue.rb +2 -2
  24. data/lib/bundler/cli/list.rb +12 -10
  25. data/lib/bundler/cli/outdated.rb +87 -66
  26. data/lib/bundler/cli/plugin.rb +10 -0
  27. data/lib/bundler/cli/pristine.rb +5 -0
  28. data/lib/bundler/cli/show.rb +1 -1
  29. data/lib/bundler/cli/update.rb +3 -1
  30. data/lib/bundler/compact_index_client.rb +1 -1
  31. data/lib/bundler/compact_index_client/cache.rb +6 -14
  32. data/lib/bundler/compact_index_client/gem_parser.rb +28 -0
  33. data/lib/bundler/compact_index_client/updater.rb +5 -13
  34. data/lib/bundler/definition.rb +66 -82
  35. data/lib/bundler/dep_proxy.rb +16 -9
  36. data/lib/bundler/dependency.rb +3 -10
  37. data/lib/bundler/dsl.rb +5 -9
  38. data/lib/bundler/endpoint_specification.rb +1 -1
  39. data/lib/bundler/env.rb +1 -1
  40. data/lib/bundler/environment_preserver.rb +26 -2
  41. data/lib/bundler/errors.rb +1 -0
  42. data/lib/bundler/feature_flag.rb +0 -3
  43. data/lib/bundler/fetcher.rb +4 -3
  44. data/lib/bundler/fetcher/base.rb +1 -1
  45. data/lib/bundler/fetcher/compact_index.rb +1 -1
  46. data/lib/bundler/fetcher/downloader.rb +1 -1
  47. data/lib/bundler/fetcher/index.rb +3 -4
  48. data/lib/bundler/friendly_errors.rb +22 -13
  49. data/lib/bundler/gem_helper.rb +32 -17
  50. data/lib/bundler/gem_helpers.rb +36 -25
  51. data/lib/bundler/gem_version_promoter.rb +4 -4
  52. data/lib/bundler/graph.rb +1 -1
  53. data/lib/bundler/index.rb +6 -2
  54. data/lib/bundler/injector.rb +22 -4
  55. data/lib/bundler/inline.rb +1 -1
  56. data/lib/bundler/installer.rb +35 -32
  57. data/lib/bundler/installer/gem_installer.rb +3 -3
  58. data/lib/bundler/installer/parallel_installer.rb +10 -10
  59. data/lib/bundler/installer/standalone.rb +2 -2
  60. data/lib/bundler/lazy_specification.rb +35 -11
  61. data/lib/bundler/lockfile_generator.rb +1 -1
  62. data/lib/bundler/lockfile_parser.rb +1 -1
  63. data/lib/bundler/man/.document +1 -0
  64. data/{man → lib/bundler/man}/bundle-add.1 +1 -1
  65. data/{man/bundle-add.ronn → lib/bundler/man/bundle-add.1.ronn} +0 -0
  66. data/{man → lib/bundler/man}/bundle-binstubs.1 +5 -3
  67. data/{man/bundle-binstubs.ronn → lib/bundler/man/bundle-binstubs.1.ronn} +2 -4
  68. data/{man → lib/bundler/man}/bundle-cache.1 +1 -1
  69. data/{man/bundle-cache.ronn → lib/bundler/man/bundle-cache.1.ronn} +0 -0
  70. data/{man → lib/bundler/man}/bundle-check.1 +1 -1
  71. data/{man/bundle-check.ronn → lib/bundler/man/bundle-check.1.ronn} +0 -0
  72. data/{man → lib/bundler/man}/bundle-clean.1 +1 -1
  73. data/{man/bundle-clean.ronn → lib/bundler/man/bundle-clean.1.ronn} +0 -0
  74. data/{man → lib/bundler/man}/bundle-config.1 +16 -25
  75. data/{man/bundle-config.ronn → lib/bundler/man/bundle-config.1.ronn} +19 -30
  76. data/{man → lib/bundler/man}/bundle-doctor.1 +1 -1
  77. data/{man/bundle-doctor.ronn → lib/bundler/man/bundle-doctor.1.ronn} +0 -0
  78. data/{man → lib/bundler/man}/bundle-exec.1 +1 -1
  79. data/{man/bundle-exec.ronn → lib/bundler/man/bundle-exec.1.ronn} +0 -0
  80. data/{man → lib/bundler/man}/bundle-gem.1 +25 -3
  81. data/{man/bundle-gem.ronn → lib/bundler/man/bundle-gem.1.ronn} +30 -7
  82. data/{man → lib/bundler/man}/bundle-info.1 +1 -1
  83. data/{man/bundle-info.ronn → lib/bundler/man/bundle-info.1.ronn} +0 -0
  84. data/{man → lib/bundler/man}/bundle-init.1 +1 -1
  85. data/{man/bundle-init.ronn → lib/bundler/man/bundle-init.1.ronn} +0 -0
  86. data/{man → lib/bundler/man}/bundle-inject.1 +1 -1
  87. data/{man/bundle-inject.ronn → lib/bundler/man/bundle-inject.1.ronn} +0 -0
  88. data/{man → lib/bundler/man}/bundle-install.1 +30 -3
  89. data/{man/bundle-install.ronn → lib/bundler/man/bundle-install.1.ronn} +25 -3
  90. data/{man → lib/bundler/man}/bundle-list.1 +7 -7
  91. data/{man/bundle-list.ronn → lib/bundler/man/bundle-list.1.ronn} +6 -6
  92. data/{man → lib/bundler/man}/bundle-lock.1 +1 -1
  93. data/{man/bundle-lock.ronn → lib/bundler/man/bundle-lock.1.ronn} +0 -0
  94. data/{man → lib/bundler/man}/bundle-open.1 +1 -1
  95. data/{man/bundle-open.ronn → lib/bundler/man/bundle-open.1.ronn} +0 -0
  96. data/{man → lib/bundler/man}/bundle-outdated.1 +1 -1
  97. data/{man/bundle-outdated.ronn → lib/bundler/man/bundle-outdated.1.ronn} +0 -0
  98. data/{man → lib/bundler/man}/bundle-platform.1 +1 -1
  99. data/{man/bundle-platform.ronn → lib/bundler/man/bundle-platform.1.ronn} +0 -0
  100. data/{man → lib/bundler/man}/bundle-pristine.1 +1 -1
  101. data/{man/bundle-pristine.ronn → lib/bundler/man/bundle-pristine.1.ronn} +0 -0
  102. data/{man → lib/bundler/man}/bundle-remove.1 +1 -1
  103. data/{man/bundle-remove.ronn → lib/bundler/man/bundle-remove.1.ronn} +0 -0
  104. data/{man → lib/bundler/man}/bundle-show.1 +1 -1
  105. data/{man/bundle-show.ronn → lib/bundler/man/bundle-show.1.ronn} +0 -0
  106. data/{man → lib/bundler/man}/bundle-update.1 +1 -1
  107. data/{man/bundle-update.ronn → lib/bundler/man/bundle-update.1.ronn} +0 -0
  108. data/{man → lib/bundler/man}/bundle-viz.1 +1 -1
  109. data/{man/bundle-viz.ronn → lib/bundler/man/bundle-viz.1.ronn} +0 -0
  110. data/{man → lib/bundler/man}/bundle.1 +1 -1
  111. data/{man/bundle.ronn → lib/bundler/man/bundle.1.ronn} +0 -0
  112. data/{man → lib/bundler/man}/gemfile.5 +4 -4
  113. data/{man → lib/bundler/man}/gemfile.5.ronn +4 -4
  114. data/{man → lib/bundler/man}/index.txt +0 -0
  115. data/lib/bundler/mirror.rb +2 -2
  116. data/lib/bundler/plugin.rb +30 -5
  117. data/lib/bundler/plugin/api/source.rb +1 -1
  118. data/lib/bundler/plugin/dsl.rb +1 -1
  119. data/lib/bundler/plugin/index.rb +10 -1
  120. data/lib/bundler/plugin/installer.rb +1 -1
  121. data/lib/bundler/plugin/installer/rubygems.rb +1 -1
  122. data/lib/bundler/plugin/source_list.rb +1 -1
  123. data/lib/bundler/psyched_yaml.rb +0 -15
  124. data/lib/bundler/remote_specification.rb +5 -2
  125. data/lib/bundler/resolver.rb +43 -19
  126. data/lib/bundler/resolver/spec_group.rb +39 -24
  127. data/lib/bundler/retry.rb +1 -1
  128. data/lib/bundler/ruby_version.rb +1 -1
  129. data/lib/bundler/rubygems_ext.rb +69 -9
  130. data/lib/bundler/rubygems_gem_installer.rb +3 -9
  131. data/lib/bundler/rubygems_integration.rb +25 -60
  132. data/lib/bundler/runtime.rb +4 -14
  133. data/lib/bundler/settings.rb +49 -46
  134. data/lib/bundler/shared_helpers.rb +2 -2
  135. data/lib/bundler/similarity_detector.rb +1 -1
  136. data/lib/bundler/source.rb +1 -1
  137. data/lib/bundler/source/git.rb +23 -21
  138. data/lib/bundler/source/git/git_proxy.rb +82 -80
  139. data/lib/bundler/source/path.rb +7 -3
  140. data/lib/bundler/source/path/installer.rb +10 -10
  141. data/lib/bundler/source/rubygems.rb +23 -17
  142. data/lib/bundler/source/rubygems/remote.rb +1 -1
  143. data/lib/bundler/source_list.rb +2 -2
  144. data/lib/bundler/spec_set.rb +8 -10
  145. data/lib/bundler/stub_specification.rb +17 -7
  146. data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +57 -47
  147. data/lib/bundler/templates/newgem/Gemfile.tt +9 -1
  148. data/lib/bundler/templates/newgem/README.md.tt +1 -2
  149. data/lib/bundler/templates/newgem/Rakefile.tt +19 -5
  150. data/lib/bundler/templates/newgem/bin/console.tt +1 -0
  151. data/lib/bundler/templates/newgem/circleci/config.yml.tt +13 -0
  152. data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +2 -0
  153. data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +18 -0
  154. data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +9 -0
  155. data/lib/bundler/templates/newgem/lib/newgem.rb.tt +4 -2
  156. data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +2 -0
  157. data/lib/bundler/templates/newgem/newgem.gemspec.tt +15 -7
  158. data/lib/bundler/templates/newgem/rubocop.yml.tt +13 -0
  159. data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +2 -0
  160. data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +2 -1
  161. data/lib/bundler/templates/newgem/test/{newgem_test.rb.tt → minitest/newgem_test.rb.tt} +2 -0
  162. data/lib/bundler/templates/newgem/test/{test_helper.rb.tt → minitest/test_helper.rb.tt} +2 -0
  163. data/lib/bundler/templates/newgem/test/test-unit/newgem_test.rb.tt +15 -0
  164. data/lib/bundler/templates/newgem/test/test-unit/test_helper.rb.tt +6 -0
  165. data/lib/bundler/ui/shell.rb +5 -5
  166. data/lib/bundler/uri_credentials_filter.rb +3 -1
  167. data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -1
  168. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +34 -1
  169. data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +2 -2
  170. data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +1 -1
  171. data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +1 -1
  172. data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +48 -46
  173. data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +82 -189
  174. data/lib/bundler/vendor/thor/lib/thor.rb +0 -7
  175. data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
  176. data/lib/bundler/vendor/thor/lib/thor/base.rb +9 -0
  177. data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
  178. data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +154 -0
  179. data/lib/bundler/vendored_persistent.rb +0 -7
  180. data/lib/bundler/vendored_tmpdir.rb +4 -0
  181. data/lib/bundler/version.rb +1 -1
  182. data/lib/bundler/worker.rb +1 -1
  183. data/lib/bundler/yaml_serializer.rb +1 -1
  184. metadata +70 -85
  185. data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +0 -26
  186. data/man/bundle-add.1.txt +0 -58
  187. data/man/bundle-binstubs.1.txt +0 -48
  188. data/man/bundle-cache.1.txt +0 -78
  189. data/man/bundle-check.1.txt +0 -33
  190. data/man/bundle-clean.1.txt +0 -26
  191. data/man/bundle-config.1.txt +0 -528
  192. data/man/bundle-doctor.1.txt +0 -44
  193. data/man/bundle-exec.1.txt +0 -178
  194. data/man/bundle-gem.1.txt +0 -91
  195. data/man/bundle-info.1.txt +0 -21
  196. data/man/bundle-init.1.txt +0 -34
  197. data/man/bundle-inject.1.txt +0 -32
  198. data/man/bundle-install.1.txt +0 -401
  199. data/man/bundle-list.1.txt +0 -43
  200. data/man/bundle-lock.1.txt +0 -93
  201. data/man/bundle-open.1.txt +0 -29
  202. data/man/bundle-outdated.1.txt +0 -131
  203. data/man/bundle-platform.1.txt +0 -57
  204. data/man/bundle-pristine.1.txt +0 -44
  205. data/man/bundle-remove.1.txt +0 -34
  206. data/man/bundle-show.1.txt +0 -27
  207. data/man/bundle-update.1.txt +0 -390
  208. data/man/bundle-viz.1.txt +0 -39
  209. data/man/bundle.1.txt +0 -116
  210. data/man/gemfile.5.txt +0 -649
@@ -0,0 +1,9 @@
1
+ image: ruby:<%= RUBY_VERSION %>
2
+
3
+ before_script:
4
+ - gem install bundler -v <%= Bundler::VERSION %>
5
+ - bundle install
6
+
7
+ example_job:
8
+ script:
9
+ - bundle exec rake
@@ -1,6 +1,8 @@
1
- require "<%= config[:namespaced_path] %>/version"
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "<%= File.basename(config[:namespaced_path]) %>/version"
2
4
  <%- if config[:ext] -%>
3
- require "<%= config[:namespaced_path] %>/<%= config[:underscored_name] %>"
5
+ require_relative "<%= File.basename(config[:namespaced_path]) %>/<%= config[:underscored_name] %>"
4
6
  <%- end -%>
5
7
 
6
8
  <%- config[:constant_array].each_with_index do |c, i| -%>
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  <%- config[:constant_array].each_with_index do |c, i| -%>
2
4
  <%= " " * i %>module <%= c %>
3
5
  <%- end -%>
@@ -1,4 +1,6 @@
1
- require_relative 'lib/<%=config[:namespaced_path]%>/version'
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/<%=config[:namespaced_path]%>/version"
2
4
 
3
5
  Gem::Specification.new do |spec|
4
6
  spec.name = <%= config[:name].inspect %>
@@ -6,13 +8,13 @@ Gem::Specification.new do |spec|
6
8
  spec.authors = [<%= config[:author].inspect %>]
7
9
  spec.email = [<%= config[:email].inspect %>]
8
10
 
9
- spec.summary = %q{TODO: Write a short summary, because RubyGems requires one.}
10
- spec.description = %q{TODO: Write a longer description or delete this line.}
11
+ spec.summary = "TODO: Write a short summary, because RubyGems requires one."
12
+ spec.description = "TODO: Write a longer description or delete this line."
11
13
  spec.homepage = "TODO: Put your gem's website or public repo URL here."
12
14
  <%- if config[:mit] -%>
13
15
  spec.license = "MIT"
14
16
  <%- end -%>
15
- spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
17
+ spec.required_ruby_version = Gem::Requirement.new(">= <%= config[:required_ruby_version] %>")
16
18
 
17
19
  spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
18
20
 
@@ -22,13 +24,19 @@ Gem::Specification.new do |spec|
22
24
 
23
25
  # Specify which files should be added to the gem when it is released.
24
26
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
25
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
26
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
27
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
28
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
27
29
  end
28
30
  spec.bindir = "exe"
29
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
30
32
  spec.require_paths = ["lib"]
31
33
  <%- if config[:ext] -%>
32
34
  spec.extensions = ["ext/<%= config[:underscored_name] %>/extconf.rb"]
33
35
  <%- end -%>
36
+
37
+ # Uncomment to register a new dependency of your gem
38
+ # spec.add_dependency "example-gem", "~> 1.0"
39
+
40
+ # For more information and examples about making a new gem, checkout our
41
+ # guide at: https://bundler.io/guides/creating_gem.html
34
42
  end
@@ -0,0 +1,13 @@
1
+ AllCops:
2
+ TargetRubyVersion: <%= ::Gem::Version.new(config[:required_ruby_version]).segments[0..1].join(".") %>
3
+
4
+ Style/StringLiterals:
5
+ Enabled: true
6
+ EnforcedStyle: double_quotes
7
+
8
+ Style/StringLiteralsInInterpolation:
9
+ Enabled: true
10
+ EnforcedStyle: double_quotes
11
+
12
+ Layout/LineLength:
13
+ Max: 120
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  RSpec.describe <%= config[:constant_name] %> do
2
4
  it "has a version number" do
3
5
  expect(<%= config[:constant_name] %>::VERSION).not_to be nil
@@ -1,4 +1,5 @@
1
- require "bundler/setup"
1
+ # frozen_string_literal: true
2
+
2
3
  require "<%= config[:namespaced_path] %>"
3
4
 
4
5
  RSpec.configure do |config|
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class <%= config[:constant_name] %>Test < Minitest::Test
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  $LOAD_PATH.unshift File.expand_path("../lib", __dir__)
2
4
  require "<%= config[:namespaced_path] %>"
3
5
 
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class <%= config[:constant_name] %>Test < Test::Unit::TestCase
6
+ test "VERSION" do
7
+ assert do
8
+ ::<%= config[:constant_name] %>.const_defined?(:VERSION)
9
+ end
10
+ end
11
+
12
+ test "something useful" do
13
+ assert_equal("expected", "actual")
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ $LOAD_PATH.unshift File.expand_path("../lib", __dir__)
4
+ require "<%= config[:namespaced_path] %>"
5
+
6
+ require "test-unit"
@@ -28,17 +28,17 @@ module Bundler
28
28
  tell_me(msg, :green, newline) if level("confirm")
29
29
  end
30
30
 
31
- def warn(msg, newline = nil)
31
+ def warn(msg, newline = nil, color = :yellow)
32
32
  return unless level("warn")
33
33
  return if @warning_history.include? msg
34
34
  @warning_history << msg
35
35
 
36
- tell_err(msg, :yellow, newline)
36
+ tell_err(msg, color, newline)
37
37
  end
38
38
 
39
- def error(msg, newline = nil)
39
+ def error(msg, newline = nil, color = :red)
40
40
  return unless level("error")
41
- tell_err(msg, :red, newline)
41
+ tell_err(msg, color, newline)
42
42
  end
43
43
 
44
44
  def debug(msg, newline = nil)
@@ -92,7 +92,7 @@ module Bundler
92
92
  []
93
93
  end
94
94
 
95
- private
95
+ private
96
96
 
97
97
  # valimism
98
98
  def tell_me(msg, color = nil, newline = nil)
@@ -2,12 +2,14 @@
2
2
 
3
3
  module Bundler
4
4
  module URICredentialsFilter
5
- module_function
5
+ module_function
6
6
 
7
7
  def credential_filtered_uri(uri_to_anonymize)
8
8
  return uri_to_anonymize if uri_to_anonymize.nil?
9
9
  uri = uri_to_anonymize.dup
10
10
  if uri.is_a?(String)
11
+ return uri if File.exist?(uri)
12
+
11
13
  require_relative "vendored_uri"
12
14
  uri = Bundler::URI(uri)
13
15
  end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'molinillo/compatibility'
4
3
  require_relative 'molinillo/gem_metadata'
5
4
  require_relative 'molinillo/errors'
6
5
  require_relative 'molinillo/resolver'
@@ -124,6 +124,7 @@ module Bundler::Molinillo
124
124
  dot.join("\n")
125
125
  end
126
126
 
127
+ # @param [DependencyGraph] other
127
128
  # @return [Boolean] whether the two dependency graphs are equal, determined
128
129
  # by a recursive traversal of each {#root_vertices} and its
129
130
  # {Vertex#successors}
@@ -190,7 +191,7 @@ module Bundler::Molinillo
190
191
  # @return [Edge] the added edge
191
192
  def add_edge(origin, destination, requirement)
192
193
  if destination.path_to?(origin)
193
- raise CircularDependencyError.new([origin, destination])
194
+ raise CircularDependencyError.new(path(destination, origin))
194
195
  end
195
196
  add_edge_no_circular(origin, destination, requirement)
196
197
  end
@@ -219,5 +220,37 @@ module Bundler::Molinillo
219
220
  def add_edge_no_circular(origin, destination, requirement)
220
221
  log.add_edge_no_circular(self, origin.name, destination.name, requirement)
221
222
  end
223
+
224
+ # Returns the path between two vertices
225
+ # @raise [ArgumentError] if there is no path between the vertices
226
+ # @param [Vertex] from
227
+ # @param [Vertex] to
228
+ # @return [Array<Vertex>] the shortest path from `from` to `to`
229
+ def path(from, to)
230
+ distances = Hash.new(vertices.size + 1)
231
+ distances[from.name] = 0
232
+ predecessors = {}
233
+ each do |vertex|
234
+ vertex.successors.each do |successor|
235
+ if distances[successor.name] > distances[vertex.name] + 1
236
+ distances[successor.name] = distances[vertex.name] + 1
237
+ predecessors[successor] = vertex
238
+ end
239
+ end
240
+ end
241
+
242
+ path = [to]
243
+ while before = predecessors[to]
244
+ path << before
245
+ to = before
246
+ break if to == from
247
+ end
248
+
249
+ unless path.last.equal?(from)
250
+ raise ArgumentError, "There is no path from #{from.name} to #{to.name}"
251
+ end
252
+
253
+ path.reverse
254
+ end
222
255
  end
223
256
  end
@@ -14,11 +14,11 @@ module Bundler::Molinillo
14
14
  end
15
15
 
16
16
  # (see Action#up)
17
- def up(_graph)
17
+ def up(graph)
18
18
  end
19
19
 
20
20
  # (see Action#down)
21
- def down(_graph)
21
+ def down(graph)
22
22
  end
23
23
 
24
24
  # @!group Tag
@@ -65,7 +65,7 @@ module Bundler::Molinillo
65
65
  # @param [SpecificationProvider] specification_provider see {#specification_provider}
66
66
  def initialize(conflicts, specification_provider)
67
67
  pairs = []
68
- Compatibility.flat_map(conflicts.values.flatten, &:requirements).each do |conflicting|
68
+ conflicts.values.flat_map(&:requirements).each do |conflicting|
69
69
  conflicting.each do |source, conflict_requirements|
70
70
  conflict_requirements.each do |c|
71
71
  pairs << [c, source]
@@ -2,5 +2,5 @@
2
2
 
3
3
  module Bundler::Molinillo
4
4
  # The version of Bundler::Molinillo.
5
- VERSION = '0.6.6'.freeze
5
+ VERSION = '0.7.0'.freeze
6
6
  end
@@ -207,7 +207,7 @@ module Bundler::Molinillo
207
207
  def start_resolution
208
208
  @started_at = Time.now
209
209
 
210
- handle_missing_or_push_dependency_state(initial_state)
210
+ push_initial_state
211
211
 
212
212
  debug { "Starting resolution (#{@started_at})\nUser-requested dependencies: #{original_requested}" }
213
213
  resolver_ui.before_resolution
@@ -273,10 +273,10 @@ module Bundler::Molinillo
273
273
  states.last
274
274
  end
275
275
 
276
- # Creates the initial state for the resolution, based upon the
276
+ # Creates and pushes the initial state for the resolution, based upon the
277
277
  # {#requested} dependencies
278
- # @return [DependencyState] the initial state for the resolution
279
- def initial_state
278
+ # @return [void]
279
+ def push_initial_state
280
280
  graph = DependencyGraph.new.tap do |dg|
281
281
  original_requested.each do |requested|
282
282
  vertex = dg.add_vertex(name_for(requested), nil, true)
@@ -285,18 +285,7 @@ module Bundler::Molinillo
285
285
  dg.tag(:initial_state)
286
286
  end
287
287
 
288
- requirements = sort_dependencies(original_requested, graph, {})
289
- initial_requirement = requirements.shift
290
- DependencyState.new(
291
- initial_requirement && name_for(initial_requirement),
292
- requirements,
293
- graph,
294
- initial_requirement,
295
- possibilities_for_requirement(initial_requirement, graph),
296
- 0,
297
- {},
298
- []
299
- )
288
+ push_state_for_requirements(original_requested, true, graph)
300
289
  end
301
290
 
302
291
  # Unwinds the states stack because a conflict has been encountered
@@ -340,11 +329,11 @@ module Bundler::Molinillo
340
329
 
341
330
  # Look for past conflicts that could be unwound to affect the
342
331
  # requirement tree for the current conflict
332
+ all_reqs = last_detail_for_current_unwind.all_requirements
333
+ all_reqs_size = all_reqs.size
343
334
  relevant_unused_unwinds = unused_unwind_options.select do |alternative|
344
- intersecting_requirements =
345
- last_detail_for_current_unwind.all_requirements &
346
- alternative.requirements_unwound_to_instead
347
- next if intersecting_requirements.empty?
335
+ diff_reqs = all_reqs - alternative.requirements_unwound_to_instead
336
+ next if diff_reqs.size == all_reqs_size
348
337
  # Find the highest index unwind whilst looping through
349
338
  current_detail = alternative if alternative > current_detail
350
339
  alternative
@@ -355,13 +344,17 @@ module Bundler::Molinillo
355
344
  state.unused_unwind_options += unwind_details.reject { |detail| detail.state_index == -1 }
356
345
 
357
346
  # Update the requirements_unwound_to_instead on any relevant unused unwinds
358
- relevant_unused_unwinds.each { |d| d.requirements_unwound_to_instead << current_detail.state_requirement }
359
- unwind_details.each { |d| d.requirements_unwound_to_instead << current_detail.state_requirement }
347
+ relevant_unused_unwinds.each do |d|
348
+ (d.requirements_unwound_to_instead << current_detail.state_requirement).uniq!
349
+ end
350
+ unwind_details.each do |d|
351
+ (d.requirements_unwound_to_instead << current_detail.state_requirement).uniq!
352
+ end
360
353
 
361
354
  current_detail
362
355
  end
363
356
 
364
- # @param [Array<Object>] array of requirements that combine to create a conflict
357
+ # @param [Array<Object>] binding_requirements array of requirements that combine to create a conflict
365
358
  # @return [Array<UnwindDetails>] array of UnwindDetails that have a chance
366
359
  # of resolving the passed requirements
367
360
  def unwind_options_for_requirements(binding_requirements)
@@ -429,7 +422,7 @@ module Bundler::Molinillo
429
422
  end
430
423
 
431
424
  # @param [DependencyState] state
432
- # @param [Array] array of requirements
425
+ # @param [Array] binding_requirements array of requirements
433
426
  # @return [Boolean] whether or not the given state has any possibilities
434
427
  # that could satisfy the given requirements
435
428
  def conflict_fixing_possibilities?(state, binding_requirements)
@@ -444,7 +437,8 @@ module Bundler::Molinillo
444
437
 
445
438
  # Filter's a state's possibilities to remove any that would not fix the
446
439
  # conflict we've just rewound from
447
- # @param [UnwindDetails] details of the conflict just unwound from
440
+ # @param [UnwindDetails] unwind_details details of the conflict just
441
+ # unwound from
448
442
  # @return [void]
449
443
  def filter_possibilities_after_unwind(unwind_details)
450
444
  return unless state && !state.possibilities.empty?
@@ -458,7 +452,7 @@ module Bundler::Molinillo
458
452
 
459
453
  # Filter's a state's possibilities to remove any that would not satisfy
460
454
  # the requirements in the conflict we've just rewound from
461
- # @param [UnwindDetails] details of the conflict just unwound from
455
+ # @param [UnwindDetails] unwind_details details of the conflict just unwound from
462
456
  # @return [void]
463
457
  def filter_possibilities_for_primary_unwind(unwind_details)
464
458
  unwinds_to_state = unused_unwind_options.select { |uw| uw.state_index == unwind_details.state_index }
@@ -491,7 +485,7 @@ module Bundler::Molinillo
491
485
 
492
486
  # Filter's a state's possibilities to remove any that would (eventually)
493
487
  # create a requirement in the conflict we've just rewound from
494
- # @param [UnwindDetails] details of the conflict just unwound from
488
+ # @param [UnwindDetails] unwind_details details of the conflict just unwound from
495
489
  # @return [void]
496
490
  def filter_possibilities_for_parent_unwind(unwind_details)
497
491
  unwinds_to_state = unused_unwind_options.select { |uw| uw.state_index == unwind_details.state_index }
@@ -500,7 +494,7 @@ module Bundler::Molinillo
500
494
  primary_unwinds = unwinds_to_state.select(&:unwinding_to_primary_requirement?).uniq
501
495
  parent_unwinds = unwinds_to_state.uniq - primary_unwinds
502
496
 
503
- allowed_possibility_sets = Compatibility.flat_map(primary_unwinds) do |unwind|
497
+ allowed_possibility_sets = primary_unwinds.flat_map do |unwind|
504
498
  states[unwind.state_index].possibilities.select do |possibility_set|
505
499
  possibility_set.possibilities.any? do |poss|
506
500
  possibility_satisfies_requirements?(poss, unwind.conflicting_requirements)
@@ -508,7 +502,7 @@ module Bundler::Molinillo
508
502
  end
509
503
  end
510
504
 
511
- requirements_to_avoid = Compatibility.flat_map(parent_unwinds, &:sub_dependencies_to_avoid)
505
+ requirements_to_avoid = parent_unwinds.flat_map(&:sub_dependencies_to_avoid)
512
506
 
513
507
  state.possibilities.reject! do |possibility_set|
514
508
  !allowed_possibility_sets.include?(possibility_set) &&
@@ -524,12 +518,12 @@ module Bundler::Molinillo
524
518
 
525
519
  possible_binding_requirements = conflict.requirements.values.flatten(1).uniq
526
520
 
527
- # When theres a `CircularDependency` error the conflicting requirement
528
- # (the one causing the circular) wont be `conflict.requirement`
529
- # (which wont be for the right state, because we wont have created it,
530
- # because its circular).
531
- # We need to make sure we have that requirement in the conflicts list,
532
- # otherwise we wont be able to unwind properly, so we just return all
521
+ # When there's a `CircularDependency` error the conflicting requirement
522
+ # (the one causing the circular) won't be `conflict.requirement`
523
+ # (which won't be for the right state, because we won't have created it,
524
+ # because it's circular).
525
+ # We need to make sure we have that requirement in the conflict's list,
526
+ # otherwise we won't be able to unwind properly, so we just return all
533
527
  # the requirements for the conflict.
534
528
  return possible_binding_requirements if conflict.underlying_error
535
529
 
@@ -558,8 +552,8 @@ module Bundler::Molinillo
558
552
  end
559
553
 
560
554
  # @param [Object] requirement we wish to check
561
- # @param [Array] array of requirements
562
- # @param [Array] array of possibilities the requirements will be used to filter
555
+ # @param [Array] possible_binding_requirements array of requirements
556
+ # @param [Array] possibilities array of possibilities the requirements will be used to filter
563
557
  # @return [Boolean] whether or not the given requirement is required to filter
564
558
  # out all elements of the array of possibilities.
565
559
  def binding_requirement_in_set?(requirement, possible_binding_requirements, possibilities)
@@ -568,6 +562,7 @@ module Bundler::Molinillo
568
562
  end
569
563
  end
570
564
 
565
+ # @param [Object] requirement
571
566
  # @return [Object] the requirement that led to `requirement` being added
572
567
  # to the list of requirements.
573
568
  def parent_of(requirement)
@@ -577,6 +572,7 @@ module Bundler::Molinillo
577
572
  parent_state.requirement
578
573
  end
579
574
 
575
+ # @param [String] name
580
576
  # @return [Object] the requirement that led to a version of a possibility
581
577
  # with the given name being activated.
582
578
  def requirement_for_existing_name(name)
@@ -585,6 +581,7 @@ module Bundler::Molinillo
585
581
  states.find { |s| s.name == name }.requirement
586
582
  end
587
583
 
584
+ # @param [Object] requirement
588
585
  # @return [ResolutionState] the state whose `requirement` is the given
589
586
  # `requirement`.
590
587
  def find_state_for(requirement)
@@ -592,6 +589,7 @@ module Bundler::Molinillo
592
589
  states.find { |i| requirement == i.requirement }
593
590
  end
594
591
 
592
+ # @param [Object] underlying_error
595
593
  # @return [Conflict] a {Conflict} that reflects the failure to activate
596
594
  # the {#possibility} in conjunction with the current {#state}
597
595
  def create_conflict(underlying_error = nil)
@@ -628,6 +626,7 @@ module Bundler::Molinillo
628
626
  vertex.requirements.map { |r| requirement_tree_for(r) }
629
627
  end
630
628
 
629
+ # @param [Object] requirement
631
630
  # @return [Array<Object>] the list of requirements that led to
632
631
  # `requirement` being required.
633
632
  def requirement_tree_for(requirement)
@@ -673,9 +672,8 @@ module Bundler::Molinillo
673
672
  attempt_to_filter_existing_spec(existing_vertex)
674
673
  else
675
674
  latest = possibility.latest_version
676
- # use reject!(!satisfied) for 1.8.7 compatibility
677
- possibility.possibilities.reject! do |possibility|
678
- !requirement_satisfied_by?(requirement, activated, possibility)
675
+ possibility.possibilities.select! do |possibility|
676
+ requirement_satisfied_by?(requirement, activated, possibility)
679
677
  end
680
678
  if possibility.latest_version.nil?
681
679
  # ensure there's a possibility for better error messages
@@ -705,7 +703,7 @@ module Bundler::Molinillo
705
703
 
706
704
  # Generates a filtered version of the existing vertex's `PossibilitySet` using the
707
705
  # current state's `requirement`
708
- # @param [Object] existing vertex
706
+ # @param [Object] vertex existing vertex
709
707
  # @return [PossibilitySet] filtered possibility set
710
708
  def filtered_possibility_set(vertex)
711
709
  PossibilitySet.new(vertex.payload.dependencies, vertex.payload.possibilities & possibility.possibilities)
@@ -730,7 +728,7 @@ module Bundler::Molinillo
730
728
  end
731
729
 
732
730
  # Requires the dependencies that the recently activated spec has
733
- # @param [Object] activated_possibility the PossibilitySet that has just been
731
+ # @param [Object] possibility_set the PossibilitySet that has just been
734
732
  # activated
735
733
  # @return [void]
736
734
  def require_nested_dependencies_for(possibility_set)
@@ -749,6 +747,8 @@ module Bundler::Molinillo
749
747
  # Pushes a new {DependencyState} that encapsulates both existing and new
750
748
  # requirements
751
749
  # @param [Array] new_requirements
750
+ # @param [Boolean] requires_sort
751
+ # @param [Object] new_activated
752
752
  # @return [void]
753
753
  def push_state_for_requirements(new_requirements, requires_sort = true, new_activated = activated)
754
754
  new_requirements = sort_dependencies(new_requirements.uniq, new_activated, conflicts) if requires_sort
@@ -767,7 +767,8 @@ module Bundler::Molinillo
767
767
 
768
768
  # Checks a proposed requirement with any existing locked requirement
769
769
  # before generating an array of possibilities for it.
770
- # @param [Object] the proposed requirement
770
+ # @param [Object] requirement the proposed requirement
771
+ # @param [Object] activated
771
772
  # @return [Array] possibilities
772
773
  def possibilities_for_requirement(requirement, activated = self.activated)
773
774
  return [] unless requirement
@@ -778,7 +779,8 @@ module Bundler::Molinillo
778
779
  group_possibilities(search_for(requirement))
779
780
  end
780
781
 
781
- # @param [Object] the proposed requirement
782
+ # @param [Object] requirement the proposed requirement
783
+ # @param [Object] activated
782
784
  # @return [Array] possibility set containing only the locked requirement, if any
783
785
  def locked_requirement_possibility_set(requirement, activated = self.activated)
784
786
  all_possibilities = search_for(requirement)
@@ -797,8 +799,8 @@ module Bundler::Molinillo
797
799
  # Build an array of PossibilitySets, with each element representing a group of
798
800
  # dependency versions that all have the same sub-dependency version constraints
799
801
  # and are contiguous.
800
- # @param [Array] an array of possibilities
801
- # @return [Array] an array of possibility sets
802
+ # @param [Array] possibilities an array of possibilities
803
+ # @return [Array<PossibilitySet>] an array of possibility sets
802
804
  def group_possibilities(possibilities)
803
805
  possibility_sets = []
804
806
  current_possibility_set = nil