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