bundler 1.9.0 → 1.17.3
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of bundler might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/CHANGELOG.md +1157 -6
- data/README.md +33 -6
- data/bundler.gemspec +51 -18
- data/exe/bundle +31 -0
- data/{bin → exe}/bundle_ruby +10 -6
- data/exe/bundler +4 -0
- data/lib/bundler.rb +326 -207
- data/lib/bundler/build_metadata.rb +53 -0
- data/lib/bundler/capistrano.rb +9 -3
- data/lib/bundler/cli.rb +522 -141
- data/lib/bundler/cli/add.rb +35 -0
- data/lib/bundler/cli/binstubs.rb +22 -11
- data/lib/bundler/cli/cache.rb +7 -6
- data/lib/bundler/cli/check.rb +11 -8
- data/lib/bundler/cli/clean.rb +7 -8
- data/lib/bundler/cli/common.rb +53 -7
- data/lib/bundler/cli/config.rb +84 -49
- data/lib/bundler/cli/console.rb +13 -8
- data/lib/bundler/cli/doctor.rb +140 -0
- data/lib/bundler/cli/exec.rb +77 -16
- data/lib/bundler/cli/gem.rb +120 -52
- data/lib/bundler/cli/info.rb +50 -0
- data/lib/bundler/cli/init.rb +21 -7
- data/lib/bundler/cli/inject.rb +37 -10
- data/lib/bundler/cli/install.rb +139 -78
- data/lib/bundler/cli/issue.rb +40 -0
- data/lib/bundler/cli/list.rb +58 -0
- data/lib/bundler/cli/lock.rb +63 -0
- data/lib/bundler/cli/open.rb +9 -6
- data/lib/bundler/cli/outdated.rb +221 -35
- data/lib/bundler/cli/package.rb +11 -7
- data/lib/bundler/cli/platform.rb +7 -4
- data/lib/bundler/cli/plugin.rb +24 -0
- data/lib/bundler/cli/pristine.rb +47 -0
- data/lib/bundler/cli/remove.rb +18 -0
- data/lib/bundler/cli/show.rb +11 -10
- data/lib/bundler/cli/update.rb +47 -29
- data/lib/bundler/cli/viz.rb +12 -8
- data/lib/bundler/compact_index_client.rb +109 -0
- data/lib/bundler/compact_index_client/cache.rb +118 -0
- data/lib/bundler/compact_index_client/updater.rb +116 -0
- data/lib/bundler/compatibility_guard.rb +14 -0
- data/lib/bundler/constants.rb +3 -1
- data/lib/bundler/current_ruby.rb +47 -137
- data/lib/bundler/definition.rb +599 -230
- data/lib/bundler/dep_proxy.rb +15 -10
- data/lib/bundler/dependency.rb +54 -25
- data/lib/bundler/deployment.rb +12 -2
- data/lib/bundler/deprecate.rb +33 -4
- data/lib/bundler/dsl.rb +383 -99
- data/lib/bundler/endpoint_specification.rb +72 -7
- data/lib/bundler/env.rb +121 -41
- data/lib/bundler/environment_preserver.rb +59 -0
- data/lib/bundler/errors.rb +158 -0
- data/lib/bundler/feature_flag.rb +74 -0
- data/lib/bundler/fetcher.rb +171 -280
- data/lib/bundler/fetcher/base.rb +52 -0
- data/lib/bundler/fetcher/compact_index.rb +126 -0
- data/lib/bundler/fetcher/dependency.rb +82 -0
- data/lib/bundler/fetcher/downloader.rb +84 -0
- data/lib/bundler/fetcher/index.rb +52 -0
- data/lib/bundler/friendly_errors.rb +113 -58
- data/lib/bundler/gem_helper.rb +73 -46
- data/lib/bundler/gem_helpers.rb +85 -9
- data/lib/bundler/gem_remote_fetcher.rb +43 -0
- data/lib/bundler/gem_tasks.rb +6 -1
- data/lib/bundler/gem_version_promoter.rb +190 -0
- data/lib/bundler/gemdeps.rb +29 -0
- data/lib/bundler/graph.rb +32 -49
- data/lib/bundler/index.rb +79 -67
- data/lib/bundler/injector.rb +219 -30
- data/lib/bundler/inline.rb +74 -0
- data/lib/bundler/installer.rb +191 -206
- data/lib/bundler/installer/gem_installer.rb +85 -0
- data/lib/bundler/installer/parallel_installer.rb +233 -0
- data/lib/bundler/installer/standalone.rb +53 -0
- data/lib/bundler/lazy_specification.rb +53 -13
- data/lib/bundler/lockfile_generator.rb +95 -0
- data/lib/bundler/lockfile_parser.rb +157 -62
- data/lib/bundler/match_platform.rb +15 -4
- data/lib/bundler/mirror.rb +223 -0
- data/lib/bundler/plugin.rb +292 -0
- data/lib/bundler/plugin/api.rb +81 -0
- data/lib/bundler/plugin/api/source.rb +306 -0
- data/lib/bundler/plugin/dsl.rb +53 -0
- data/lib/bundler/plugin/events.rb +61 -0
- data/lib/bundler/plugin/index.rb +162 -0
- data/lib/bundler/plugin/installer.rb +96 -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 +17 -6
- data/lib/bundler/remote_specification.rb +68 -11
- data/lib/bundler/resolver.rb +263 -229
- data/lib/bundler/resolver/spec_group.rb +106 -0
- data/lib/bundler/retry.rb +25 -19
- data/lib/bundler/ruby_dsl.rb +9 -2
- data/lib/bundler/ruby_version.rb +101 -66
- data/lib/bundler/rubygems_ext.rb +77 -37
- data/lib/bundler/rubygems_gem_installer.rb +106 -0
- data/lib/bundler/rubygems_integration.rb +450 -163
- data/lib/bundler/runtime.rb +133 -103
- data/lib/bundler/settings.rb +344 -83
- data/lib/bundler/settings/validator.rb +102 -0
- data/lib/bundler/setup.rb +7 -3
- data/lib/bundler/shared_helpers.rb +284 -54
- data/lib/bundler/similarity_detector.rb +21 -21
- data/lib/bundler/source.rb +68 -15
- data/lib/bundler/source/gemspec.rb +18 -0
- data/lib/bundler/source/git.rb +90 -55
- data/lib/bundler/source/git/git_proxy.rb +135 -35
- data/lib/bundler/source/metadata.rb +62 -0
- data/lib/bundler/source/path.rb +84 -61
- data/lib/bundler/source/path/installer.rb +53 -17
- data/lib/bundler/source/rubygems.rb +282 -122
- data/lib/bundler/source/rubygems/remote.rb +69 -0
- data/lib/bundler/source_list.rb +107 -22
- data/lib/bundler/spec_set.rb +83 -45
- data/lib/bundler/ssl_certs/certificate_manager.rb +8 -7
- data/lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem +21 -0
- data/lib/bundler/ssl_certs/{DigiCertHighAssuranceEVRootCA.pem → rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem} +0 -0
- data/lib/bundler/ssl_certs/{AddTrustExternalCARoot-2048.pem → rubygems.org/AddTrustExternalCARoot.pem} +0 -0
- data/lib/bundler/stub_specification.rb +108 -0
- data/lib/bundler/templates/.document +1 -0
- data/lib/bundler/templates/Executable +19 -6
- data/lib/bundler/templates/Executable.bundler +105 -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 +68 -7
- data/lib/bundler/templates/newgem/Gemfile.tt +4 -2
- data/lib/bundler/templates/newgem/LICENSE.txt.tt +1 -1
- data/lib/bundler/templates/newgem/README.md.tt +19 -11
- data/lib/bundler/templates/newgem/Rakefile.tt +10 -6
- data/lib/bundler/templates/newgem/bin/console.tt +1 -1
- data/lib/bundler/templates/newgem/bin/setup.tt +2 -1
- 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/gitignore.tt +5 -1
- data/lib/bundler/templates/newgem/lib/newgem.rb.tt +7 -6
- data/lib/bundler/templates/newgem/lib/newgem/version.rb.tt +4 -4
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +31 -15
- data/lib/bundler/templates/newgem/rspec.tt +1 -0
- data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +3 -5
- data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +14 -2
- data/lib/bundler/templates/newgem/test/{test_newgem.rb.tt → newgem_test.rb.tt} +2 -2
- data/lib/bundler/templates/newgem/test/test_helper.rb.tt +4 -0
- data/lib/bundler/templates/newgem/travis.yml.tt +7 -0
- data/lib/bundler/ui.rb +5 -3
- data/lib/bundler/ui/rg_proxy.rb +5 -7
- data/lib/bundler/ui/shell.rb +69 -18
- data/lib/bundler/ui/silent.rb +26 -1
- data/lib/bundler/uri_credentials_filter.rb +37 -0
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +12 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
- 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 +223 -0
- 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 +136 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +143 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +6 -0
- data/lib/bundler/vendor/{Molinillo-0.2.1 → molinillo}/lib/molinillo/modules/specification_provider.rb +11 -0
- data/lib/bundler/vendor/{Molinillo-0.2.1 → molinillo}/lib/molinillo/modules/ui.rb +6 -2
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +837 -0
- data/lib/bundler/vendor/{Molinillo-0.2.1 → molinillo}/lib/molinillo/resolver.rb +6 -3
- data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +58 -0
- data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/faster.rb +1 -0
- data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent.rb +27 -24
- data/lib/bundler/vendor/{net → net-http-persistent/lib/net}/http/persistent/ssl_reuse.rb +2 -1
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor.rb +47 -22
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions.rb +31 -29
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/create_file.rb +3 -2
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/create_link.rb +3 -2
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/directory.rb +3 -3
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/empty_directory.rb +16 -8
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/file_manipulation.rb +66 -18
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/actions/inject_into_file.rb +18 -16
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/base.rb +67 -44
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/command.rb +13 -11
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/core_ext/hash_with_indifferent_access.rb +21 -1
- data/lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb +12 -0
- data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +129 -0
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/error.rb +3 -3
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/group.rb +14 -14
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/invocation.rb +4 -5
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/line_editor.rb +2 -2
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/line_editor/basic.rb +2 -0
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/line_editor/readline.rb +0 -0
- data/lib/bundler/vendor/thor/lib/thor/parser.rb +4 -0
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/parser/argument.rb +4 -7
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/parser/arguments.rb +16 -16
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/parser/option.rb +42 -21
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/parser/options.rb +13 -10
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/rake_compat.rb +1 -1
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/runner.rb +35 -33
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/shell.rb +4 -4
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/shell/basic.rb +49 -33
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/shell/color.rb +2 -2
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/shell/html.rb +5 -5
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/util.rb +8 -7
- data/lib/bundler/vendor/{thor-0.19.1 → thor}/lib/thor/version.rb +1 -1
- data/lib/bundler/vendored_fileutils.rb +9 -0
- data/lib/bundler/vendored_molinillo.rb +4 -5
- data/lib/bundler/vendored_persistent.rb +45 -4
- data/lib/bundler/vendored_thor.rb +8 -5
- data/lib/bundler/version.rb +23 -1
- data/lib/bundler/version_ranges.rb +76 -0
- data/lib/bundler/vlad.rb +8 -2
- data/lib/bundler/worker.rb +39 -6
- data/lib/bundler/yaml_serializer.rb +90 -0
- data/man/bundle-add.1 +58 -0
- data/man/bundle-add.1.txt +52 -0
- data/man/bundle-add.ronn +40 -0
- data/man/bundle-binstubs.1 +40 -0
- data/man/bundle-binstubs.1.txt +48 -0
- data/man/bundle-binstubs.ronn +43 -0
- data/man/bundle-check.1 +31 -0
- data/man/bundle-check.1.txt +33 -0
- data/man/bundle-check.ronn +26 -0
- data/man/bundle-clean.1 +24 -0
- data/man/bundle-clean.1.txt +26 -0
- data/man/bundle-clean.ronn +18 -0
- data/man/bundle-config.1 +497 -0
- data/man/bundle-config.1.txt +529 -0
- data/man/bundle-config.ronn +256 -31
- data/man/bundle-doctor.1 +44 -0
- data/man/bundle-doctor.1.txt +44 -0
- data/man/bundle-doctor.ronn +33 -0
- data/man/bundle-exec.1 +165 -0
- data/man/bundle-exec.1.txt +178 -0
- data/man/bundle-exec.ronn +19 -3
- data/man/bundle-gem.1 +80 -0
- data/man/bundle-gem.1.txt +91 -0
- data/man/bundle-gem.ronn +78 -0
- data/man/bundle-info.1 +20 -0
- data/man/bundle-info.1.txt +21 -0
- data/man/bundle-info.ronn +17 -0
- data/man/bundle-init.1 +25 -0
- data/man/bundle-init.1.txt +34 -0
- data/man/bundle-init.ronn +29 -0
- data/man/bundle-inject.1 +33 -0
- data/man/bundle-inject.1.txt +32 -0
- data/man/bundle-inject.ronn +22 -0
- data/man/bundle-install.1 +308 -0
- data/man/bundle-install.1.txt +396 -0
- data/man/bundle-install.ronn +64 -67
- data/man/bundle-list.1 +50 -0
- data/man/bundle-list.1.txt +43 -0
- data/man/bundle-list.ronn +33 -0
- data/man/bundle-lock.1 +84 -0
- data/man/bundle-lock.1.txt +93 -0
- data/man/bundle-lock.ronn +94 -0
- data/man/bundle-open.1 +32 -0
- data/man/bundle-open.1.txt +29 -0
- data/man/bundle-open.ronn +19 -0
- data/man/bundle-outdated.1 +155 -0
- data/man/bundle-outdated.1.txt +131 -0
- data/man/bundle-outdated.ronn +111 -0
- data/man/bundle-package.1 +55 -0
- data/man/bundle-package.1.txt +79 -0
- data/man/bundle-package.ronn +14 -8
- data/man/bundle-platform.1 +61 -0
- data/man/bundle-platform.1.txt +57 -0
- data/man/bundle-platform.ronn +1 -1
- data/man/bundle-pristine.1 +34 -0
- data/man/bundle-pristine.1.txt +44 -0
- data/man/bundle-pristine.ronn +34 -0
- data/man/bundle-remove.1 +31 -0
- data/man/bundle-remove.1.txt +34 -0
- data/man/bundle-remove.ronn +23 -0
- data/man/bundle-show.1 +23 -0
- data/man/bundle-show.1.txt +27 -0
- data/man/bundle-show.ronn +21 -0
- data/man/bundle-update.1 +394 -0
- data/man/bundle-update.1.txt +391 -0
- data/man/bundle-update.ronn +180 -18
- data/man/bundle-viz.1 +39 -0
- data/man/bundle-viz.1.txt +39 -0
- data/man/bundle-viz.ronn +30 -0
- data/man/bundle.1 +136 -0
- data/man/bundle.1.txt +116 -0
- data/man/bundle.ronn +46 -33
- data/man/gemfile.5 +689 -0
- data/man/gemfile.5.ronn +127 -79
- data/man/gemfile.5.txt +653 -0
- data/man/index.txt +25 -7
- metadata +242 -95
- data/.gitignore +0 -16
- data/.rspec +0 -3
- data/.travis.yml +0 -110
- data/CODE_OF_CONDUCT.md +0 -40
- data/CONTRIBUTING.md +0 -32
- data/DEVELOPMENT.md +0 -119
- data/ISSUES.md +0 -96
- data/Rakefile +0 -302
- data/UPGRADING.md +0 -103
- data/bin/bundle +0 -21
- data/bin/bundler +0 -21
- data/lib/bundler/anonymizable_uri.rb +0 -32
- data/lib/bundler/environment.rb +0 -42
- data/lib/bundler/gem_installer.rb +0 -9
- data/lib/bundler/gem_path_manipulation.rb +0 -8
- data/lib/bundler/ssl_certs/AddTrustExternalCARoot.pem +0 -32
- data/lib/bundler/ssl_certs/Class3PublicPrimaryCertificationAuthority.pem +0 -14
- data/lib/bundler/ssl_certs/EntrustnetSecureServerCertificationAuthority.pem +0 -28
- data/lib/bundler/ssl_certs/GeoTrustGlobalCA.pem +0 -20
- data/lib/bundler/templates/newgem/.travis.yml.tt +0 -3
- data/lib/bundler/templates/newgem/test/minitest_helper.rb.tt +0 -4
- data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo.rb +0 -5
- data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/dependency_graph.rb +0 -266
- data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/errors.rb +0 -69
- data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/gem_metadata.rb +0 -3
- data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/resolution.rb +0 -412
- data/lib/bundler/vendor/Molinillo-0.2.1/lib/molinillo/state.rb +0 -43
- data/lib/bundler/vendor/thor-0.19.1/lib/thor/core_ext/io_binary_read.rb +0 -10
- data/lib/bundler/vendor/thor-0.19.1/lib/thor/core_ext/ordered_hash.rb +0 -98
- data/lib/bundler/vendor/thor-0.19.1/lib/thor/parser.rb +0 -4
data/UPGRADING.md
DELETED
@@ -1,103 +0,0 @@
|
|
1
|
-
## Bundler 0.9 to 1.0 and above
|
2
|
-
|
3
|
-
Upgrading from Bundler 0.9 to 1.0 is relatively painless. The
|
4
|
-
Gemfile API is the same, so your old Gemfiles should continue
|
5
|
-
to work.
|
6
|
-
|
7
|
-
The "env" file that 0.9 created at `.bundle/environment.rb` has been
|
8
|
-
removed. As a side effect of this, Passenger will only find your
|
9
|
-
bundled gems if you install with `bundle install --deployment`.
|
10
|
-
Alternatively, you can tell Passenger where you gems are installed,
|
11
|
-
[something like this](http://andre.arko.net/2010/08/16/using-passengerpane-with-gem_home-set/).
|
12
|
-
|
13
|
-
The `bundle lock` command is no longer needed, as the
|
14
|
-
Gemfile.lock file is now automatically generated by `bundle install`.
|
15
|
-
If you have not yet done so, add your Gemfile.lock to source control
|
16
|
-
and check it in.
|
17
|
-
|
18
|
-
Running `bundle install` no longer updates the versions of your gems.
|
19
|
-
If you need to update just one gem, run `bundle update GEMNAME`. To
|
20
|
-
update all gems to the newest versions possible, run `bundle update`.
|
21
|
-
|
22
|
-
Bundler now supports multiple platforms, using a block syntax to
|
23
|
-
declare platform-specific gems:
|
24
|
-
|
25
|
-
platform :jruby do
|
26
|
-
gem "jruby-maven-plugins"
|
27
|
-
end
|
28
|
-
|
29
|
-
Deploying using Bundler is even easier than it was before, as Bundler
|
30
|
-
now includes a Capistrano recipe. Simply add this line to the top of
|
31
|
-
your deploy.rb file to run Bundler automatically as part of deploying:
|
32
|
-
|
33
|
-
require 'bundler/capistrano'
|
34
|
-
|
35
|
-
For more details on deploying using bundler, see the documentation
|
36
|
-
for the bundler cap task, and the [documentation on deploying](http://bundler.io/deploying.html).
|
37
|
-
|
38
|
-
|
39
|
-
## Bundler 0.8 to 0.9 and above
|
40
|
-
|
41
|
-
Upgrading to Bundler 0.9 from Bundler 0.8 requires upgrading several
|
42
|
-
API calls in your Gemfile, and some workarounds if you are using Rails 2.3.
|
43
|
-
|
44
|
-
### Gemfile Removals
|
45
|
-
|
46
|
-
Bundler 0.9 removes the following Bundler 0.8 Gemfile APIs:
|
47
|
-
|
48
|
-
1. `disable_system_gems`: This is now the default (and only) option
|
49
|
-
for bundler. Bundler uses the system gems you have specified
|
50
|
-
in the Gemfile, and only the system gems you have specified
|
51
|
-
(and their dependencies)
|
52
|
-
2. `disable_rubygems`: This is no longer supported. We are looking
|
53
|
-
into ways to get the fastest performance out of each supported
|
54
|
-
scenario, and we will make speed the default where possible.
|
55
|
-
3. `clear_sources`: Bundler now defaults to an empty source
|
56
|
-
list. If you want to include Rubygems, you can add the source
|
57
|
-
via source "http://gemcutter.org". If you use bundle init, this
|
58
|
-
source will be automatically added for you in the generated
|
59
|
-
Gemfile
|
60
|
-
4. `bundle_path`: You can specify this setting when installing
|
61
|
-
via `bundle install /path/to/bundle`. Bundler will remember
|
62
|
-
where you installed the dependencies to on a particular
|
63
|
-
machine for future installs, loads, setups, etc.
|
64
|
-
5. `bin_path`: Bundler no longer generates executables in the root
|
65
|
-
of your app. You should use `bundle exec` to execute executables
|
66
|
-
in the current context.
|
67
|
-
|
68
|
-
### Gemfile Changes
|
69
|
-
|
70
|
-
Bundler 0.9 changes the following Bundler 0.8 Gemfile APIs:
|
71
|
-
|
72
|
-
1. Bundler 0.8 supported :only and :except as APIs for describing
|
73
|
-
groups of gems. Bundler 0.9 supports a single `group` method,
|
74
|
-
which you can use to group gems together. See the above "Group"
|
75
|
-
section for more information.
|
76
|
-
|
77
|
-
This means that `gem "foo", :only => :production` becomes
|
78
|
-
`gem "foo", :group => :production`, and
|
79
|
-
`only :production { gem "foo" }` becomes
|
80
|
-
`group :production { gem "foo" }`
|
81
|
-
|
82
|
-
The short version is: group your gems together logically, and
|
83
|
-
use the available commands to make use of the groups you've
|
84
|
-
created.
|
85
|
-
|
86
|
-
2. `:require_as` becomes `:require`
|
87
|
-
|
88
|
-
3. `:vendored_at` is fully removed; you should use `:path`
|
89
|
-
|
90
|
-
### API Changes
|
91
|
-
|
92
|
-
1. `Bundler.require_env(:environment)` becomes
|
93
|
-
`Bundler.require(:multiple, :groups)`. You must
|
94
|
-
now specify the default group (the default group is the
|
95
|
-
group made up of the gems not assigned to any group)
|
96
|
-
explicitly. So `Bundler.require_env(:test)` becomes
|
97
|
-
`Bundler.require(:default, :test)`
|
98
|
-
|
99
|
-
2. `require 'vendor/gems/environment'`: In unlocked
|
100
|
-
mode, where using system gems, this becomes
|
101
|
-
`Bundler.setup(:multiple, :groups)`. If you don't
|
102
|
-
specify any groups, this puts all groups on the load
|
103
|
-
path. In locked mode, it becomes `require '.bundle/environment'`
|
data/bin/bundle
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
# Exit cleanly from an early interrupt
|
4
|
-
Signal.trap("INT") { exit 1 }
|
5
|
-
|
6
|
-
require 'bundler'
|
7
|
-
# Check if an older version of bundler is installed
|
8
|
-
$LOAD_PATH.each do |path|
|
9
|
-
if path =~ %r'/bundler-0\.(\d+)' && $1.to_i < 9
|
10
|
-
err = "Looks like you have a version of bundler that's older than 0.9.\n"
|
11
|
-
err << "Please remove your old versions.\n"
|
12
|
-
err << "An easy way to do this is by running `gem cleanup bundler`."
|
13
|
-
abort(err)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
require 'bundler/friendly_errors'
|
18
|
-
Bundler.with_friendly_errors do
|
19
|
-
require 'bundler/cli'
|
20
|
-
Bundler::CLI.start(ARGV, :debug => true)
|
21
|
-
end
|
data/bin/bundler
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
# Exit cleanly from an early interrupt
|
4
|
-
Signal.trap("INT") { exit 1 }
|
5
|
-
|
6
|
-
require 'bundler'
|
7
|
-
# Check if an older version of bundler is installed
|
8
|
-
$LOAD_PATH.each do |path|
|
9
|
-
if path =~ %r'/bundler-0.(\d+)' && $1.to_i < 9
|
10
|
-
err = "Looks like you have a version of bundler that's older than 0.9.\n"
|
11
|
-
err << "Please remove your old versions.\n"
|
12
|
-
err << "An easy way to do this is by running `gem cleanup bundler`."
|
13
|
-
abort(err)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
require 'bundler/friendly_errors'
|
18
|
-
Bundler.with_friendly_errors do
|
19
|
-
require 'bundler/cli'
|
20
|
-
Bundler::CLI.start(ARGV, :debug => true)
|
21
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module Bundler
|
2
|
-
class AnonymizableURI
|
3
|
-
attr_reader :original_uri,
|
4
|
-
:without_credentials
|
5
|
-
|
6
|
-
def initialize(original_uri, fallback_auth = nil)
|
7
|
-
@original_uri = apply_auth(original_uri, fallback_auth).freeze
|
8
|
-
@without_credentials = remove_auth(@original_uri).freeze
|
9
|
-
end
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def apply_auth(uri, auth = nil)
|
14
|
-
if auth && uri.userinfo.nil?
|
15
|
-
uri = uri.dup
|
16
|
-
uri.userinfo = auth
|
17
|
-
end
|
18
|
-
|
19
|
-
uri
|
20
|
-
end
|
21
|
-
|
22
|
-
def remove_auth(uri)
|
23
|
-
if uri.userinfo
|
24
|
-
uri = uri.dup
|
25
|
-
uri.user = uri.password = nil
|
26
|
-
end
|
27
|
-
|
28
|
-
uri
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
end
|
data/lib/bundler/environment.rb
DELETED
@@ -1,42 +0,0 @@
|
|
1
|
-
module Bundler
|
2
|
-
class Environment
|
3
|
-
attr_reader :root
|
4
|
-
|
5
|
-
def initialize(root, definition)
|
6
|
-
@root = root
|
7
|
-
@definition = definition
|
8
|
-
|
9
|
-
env_file = Bundler.app_config_path.join('environment.rb')
|
10
|
-
env_file.rmtree if env_file.exist?
|
11
|
-
end
|
12
|
-
|
13
|
-
def inspect
|
14
|
-
@definition.to_lock.inspect
|
15
|
-
end
|
16
|
-
|
17
|
-
def requested_specs
|
18
|
-
@definition.requested_specs
|
19
|
-
end
|
20
|
-
|
21
|
-
def specs
|
22
|
-
@definition.specs
|
23
|
-
end
|
24
|
-
|
25
|
-
def dependencies
|
26
|
-
@definition.dependencies
|
27
|
-
end
|
28
|
-
|
29
|
-
def current_dependencies
|
30
|
-
@definition.current_dependencies
|
31
|
-
end
|
32
|
-
|
33
|
-
def lock
|
34
|
-
@definition.lock(Bundler.default_lockfile)
|
35
|
-
end
|
36
|
-
|
37
|
-
def update(*gems)
|
38
|
-
# Nothing
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
@@ -1,8 +0,0 @@
|
|
1
|
-
module Bundler
|
2
|
-
def self.preserve_gem_path
|
3
|
-
original_gem_path = ENV["_ORIGINAL_GEM_PATH"]
|
4
|
-
gem_path = ENV["GEM_PATH"]
|
5
|
-
ENV["_ORIGINAL_GEM_PATH"] = gem_path if original_gem_path.nil? || original_gem_path == ""
|
6
|
-
ENV["GEM_PATH"] = original_gem_path if gem_path.nil? || gem_path == ""
|
7
|
-
end
|
8
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
-----BEGIN CERTIFICATE-----
|
2
|
-
MIIFdDCCBFygAwIBAgIQJ2buVutJ846r13Ci/ITeIjANBgkqhkiG9w0BAQwFADBv
|
3
|
-
MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFk
|
4
|
-
ZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBF
|
5
|
-
eHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFow
|
6
|
-
gYUxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
|
7
|
-
BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYD
|
8
|
-
VQQDEyJDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkq
|
9
|
-
hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkehUktIKVrGsDSTdxc9EZ3SZKzejfSNw
|
10
|
-
AHG8U9/E+ioSj0t/EFa9n3Byt2F/yUsPF6c947AEYe7/EZfH9IY+Cvo+XPmT5jR6
|
11
|
-
2RRr55yzhaCCenavcZDX7P0N+pxs+t+wgvQUfvm+xKYvT3+Zf7X8Z0NyvQwA1onr
|
12
|
-
ayzT7Y+YHBSrfuXjbvzYqOSSJNpDa2K4Vf3qwbxstovzDo2a5JtsaZn4eEgwRdWt
|
13
|
-
4Q08RWD8MpZRJ7xnw8outmvqRsfHIKCxH2XeSAi6pE6p8oNGN4Tr6MyBSENnTnIq
|
14
|
-
m1y9TBsoilwie7SrmNnu4FGDwwlGTm0+mfqVF9p8M1dBPI1R7Qu2XK8sYxrfV8g/
|
15
|
-
vOldxJuvRZnio1oktLqpVj3Pb6r/SVi+8Kj/9Lit6Tf7urj0Czr56ENCHonYhMsT
|
16
|
-
8dm74YlguIwoVqwUHZwK53Hrzw7dPamWoUi9PPevtQ0iTMARgexWO/bTouJbt7IE
|
17
|
-
IlKVgJNp6I5MZfGRAy1wdALqi2cVKWlSArvX31BqVUa/oKMoYX9w0MOiqiwhqkfO
|
18
|
-
KJwGRXa/ghgntNWutMtQ5mv0TIZxMOmm3xaG4Nj/QN370EKIf6MzOi5cHkERgWPO
|
19
|
-
GHFrK+ymircxXDpqR+DDeVnWIBqv8mqYqnK8V0rSS527EPywTEHl7R09XiidnMy/
|
20
|
-
s1Hap0flhFMCAwEAAaOB9DCB8TAfBgNVHSMEGDAWgBStvZh6NLQm9/rEJlTvA73g
|
21
|
-
JMtUGjAdBgNVHQ4EFgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQD
|
22
|
-
AgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAGBgRVHSAAMEQGA1UdHwQ9
|
23
|
-
MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9BZGRUcnVzdEV4dGVy
|
24
|
-
bmFsQ0FSb290LmNybDA1BggrBgEFBQcBAQQpMCcwJQYIKwYBBQUHMAGGGWh0dHA6
|
25
|
-
Ly9vY3NwLnVzZXJ0cnVzdC5jb20wDQYJKoZIhvcNAQEMBQADggEBAGS/g/FfmoXQ
|
26
|
-
zbihKVcN6Fr30ek+8nYEbvFScLsePP9NDXRqzIGCJdPDoCpdTPW6i6FtxFQJdcfj
|
27
|
-
Jw5dhHk3QBN39bSsHNA7qxcS1u80GH4r6XnTq1dFDK8o+tDb5VCViLvfhVdpfZLY
|
28
|
-
Uspzgb8c8+a4bmYRBbMelC1/kZWSWfFMzqORcUx8Rww7Cxn2obFshj5cqsQugsv5
|
29
|
-
B5a6SE2Q8pTIqXOi6wZ7I53eovNNVZ96YUWYGGjHXkBrI/V5eu+MtWuLt29G9Hvx
|
30
|
-
PUsE2JOAWVrgQSQdso8VYFhH2+9uRv0V9dlfmrPb2LjkQLPNlzmuhbsdjrzch5vR
|
31
|
-
pu/xO28QOG8=
|
32
|
-
-----END CERTIFICATE-----
|
@@ -1,14 +0,0 @@
|
|
1
|
-
-----BEGIN CERTIFICATE-----
|
2
|
-
MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
|
3
|
-
A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
|
4
|
-
cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
|
5
|
-
MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
|
6
|
-
BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
|
7
|
-
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
|
8
|
-
ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
|
9
|
-
BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
|
10
|
-
I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
|
11
|
-
CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
|
12
|
-
lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
|
13
|
-
AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
|
14
|
-
-----END CERTIFICATE-----
|
@@ -1,28 +0,0 @@
|
|
1
|
-
-----BEGIN CERTIFICATE-----
|
2
|
-
MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
|
3
|
-
VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
|
4
|
-
ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
|
5
|
-
KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
|
6
|
-
ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
|
7
|
-
MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
|
8
|
-
ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
|
9
|
-
b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
|
10
|
-
bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
|
11
|
-
U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
|
12
|
-
A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
|
13
|
-
I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
|
14
|
-
wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
|
15
|
-
AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
|
16
|
-
oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
|
17
|
-
BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
|
18
|
-
dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
|
19
|
-
MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
|
20
|
-
b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
|
21
|
-
dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
|
22
|
-
MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
|
23
|
-
E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
|
24
|
-
MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
|
25
|
-
hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
|
26
|
-
95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
|
27
|
-
2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
|
28
|
-
-----END CERTIFICATE-----
|
@@ -1,20 +0,0 @@
|
|
1
|
-
-----BEGIN CERTIFICATE-----
|
2
|
-
MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
|
3
|
-
MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
|
4
|
-
YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
|
5
|
-
EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
|
6
|
-
R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
|
7
|
-
9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
|
8
|
-
fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
|
9
|
-
iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
|
10
|
-
1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
|
11
|
-
bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
|
12
|
-
MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
|
13
|
-
ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
|
14
|
-
uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
|
15
|
-
Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
|
16
|
-
tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
|
17
|
-
PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
|
18
|
-
hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
|
19
|
-
5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
|
20
|
-
-----END CERTIFICATE-----
|
@@ -1,266 +0,0 @@
|
|
1
|
-
require 'set'
|
2
|
-
require 'tsort'
|
3
|
-
|
4
|
-
module Bundler::Molinillo
|
5
|
-
# A directed acyclic graph that is tuned to hold named dependencies
|
6
|
-
class DependencyGraph
|
7
|
-
include Enumerable
|
8
|
-
|
9
|
-
# Enumerates through the vertices of the graph.
|
10
|
-
# @return [Array<Vertex>] The graph's vertices.
|
11
|
-
def each
|
12
|
-
vertices.values.each { |v| yield v }
|
13
|
-
end
|
14
|
-
|
15
|
-
include TSort
|
16
|
-
|
17
|
-
alias_method :tsort_each_node, :each
|
18
|
-
|
19
|
-
def tsort_each_child(vertex, &block)
|
20
|
-
vertex.successors.each(&block)
|
21
|
-
end
|
22
|
-
|
23
|
-
# Topologically sorts the given vertices.
|
24
|
-
# @param [Enumerable<Vertex>] vertices the vertices to be sorted, which must
|
25
|
-
# all belong to the same graph.
|
26
|
-
# @return [Array<Vertex>] The sorted vertices.
|
27
|
-
def self.tsort(vertices)
|
28
|
-
TSort.tsort(
|
29
|
-
lambda { |b| vertices.each(&b) },
|
30
|
-
lambda { |v, &b| (v.successors & vertices).each(&b) }
|
31
|
-
)
|
32
|
-
end
|
33
|
-
|
34
|
-
# A directed edge of a {DependencyGraph}
|
35
|
-
# @attr [Vertex] origin The origin of the directed edge
|
36
|
-
# @attr [Vertex] destination The destination of the directed edge
|
37
|
-
# @attr [Array] requirements The requirements the directed edge represents
|
38
|
-
Edge = Struct.new(:origin, :destination, :requirements)
|
39
|
-
|
40
|
-
# @return [{String => Vertex}] vertices that have no {Vertex#predecessors},
|
41
|
-
# keyed by by {Vertex#name}
|
42
|
-
attr_reader :root_vertices
|
43
|
-
# @return [{String => Vertex}] the vertices of the dependency graph, keyed
|
44
|
-
# by {Vertex#name}
|
45
|
-
attr_reader :vertices
|
46
|
-
# @return [Set<Edge>] the edges of the dependency graph
|
47
|
-
attr_reader :edges
|
48
|
-
|
49
|
-
def initialize
|
50
|
-
@vertices = {}
|
51
|
-
@edges = Set.new
|
52
|
-
@root_vertices = {}
|
53
|
-
end
|
54
|
-
|
55
|
-
# Initializes a copy of a {DependencyGraph}, ensuring that all {#vertices}
|
56
|
-
# have the correct {Vertex#graph} set
|
57
|
-
def initialize_copy(other)
|
58
|
-
super
|
59
|
-
@vertices = other.vertices.reduce({}) do |vertices, (name, vertex)|
|
60
|
-
vertices.tap do |hash|
|
61
|
-
hash[name] = vertex.dup.tap { |v| v.graph = self }
|
62
|
-
end
|
63
|
-
end
|
64
|
-
@root_vertices = Hash[vertices.select { |n, _v| other.root_vertices[n] }]
|
65
|
-
@edges = other.edges.map do |edge|
|
66
|
-
Edge.new(
|
67
|
-
vertex_named(edge.origin.name),
|
68
|
-
vertex_named(edge.destination.name),
|
69
|
-
edge.requirements.dup
|
70
|
-
)
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
# @return [String] a string suitable for debugging
|
75
|
-
def inspect
|
76
|
-
"#{self.class}:#{vertices.values.inspect}"
|
77
|
-
end
|
78
|
-
|
79
|
-
# @return [Boolean] whether the two dependency graphs are equal, determined
|
80
|
-
# by a recursive traversal of each {#root_vertices} and its
|
81
|
-
# {Vertex#successors}
|
82
|
-
def ==(other)
|
83
|
-
root_vertices == other.root_vertices
|
84
|
-
end
|
85
|
-
|
86
|
-
# @param [String] name
|
87
|
-
# @param [Object] payload
|
88
|
-
# @param [Array<String>] parent_names
|
89
|
-
# @param [Object] requirement the requirement that is requiring the child
|
90
|
-
# @return [void]
|
91
|
-
def add_child_vertex(name, payload, parent_names, requirement)
|
92
|
-
is_root = parent_names.include?(nil)
|
93
|
-
parent_nodes = parent_names.compact.map { |n| vertex_named(n) }
|
94
|
-
vertex = vertex_named(name) || if is_root
|
95
|
-
add_root_vertex(name, payload)
|
96
|
-
else
|
97
|
-
add_vertex(name, payload)
|
98
|
-
end
|
99
|
-
vertex.payload ||= payload
|
100
|
-
parent_nodes.each do |parent_node|
|
101
|
-
add_edge(parent_node, vertex, requirement)
|
102
|
-
end
|
103
|
-
vertex
|
104
|
-
end
|
105
|
-
|
106
|
-
# @param [String] name
|
107
|
-
# @param [Object] payload
|
108
|
-
# @return [Vertex] the vertex that was added to `self`
|
109
|
-
def add_vertex(name, payload)
|
110
|
-
vertex = vertices[name] ||= Vertex.new(self, name, payload)
|
111
|
-
vertex.tap { |v| v.payload = payload }
|
112
|
-
end
|
113
|
-
|
114
|
-
# @param [String] name
|
115
|
-
# @param [Object] payload
|
116
|
-
# @return [Vertex] the vertex that was added to `self`
|
117
|
-
def add_root_vertex(name, payload)
|
118
|
-
add_vertex(name, payload).tap { |v| root_vertices[name] = v }
|
119
|
-
end
|
120
|
-
|
121
|
-
# Detaches the {#vertex_named} `name` {Vertex} from the graph, recursively
|
122
|
-
# removing any non-root vertices that were orphaned in the process
|
123
|
-
# @param [String] name
|
124
|
-
# @return [void]
|
125
|
-
def detach_vertex_named(name)
|
126
|
-
vertex = vertex_named(name)
|
127
|
-
return unless vertex
|
128
|
-
successors = vertex.successors
|
129
|
-
vertices.delete(name)
|
130
|
-
edges.reject! { |e| e.origin == vertex || e.destination == vertex }
|
131
|
-
successors.each { |v| detach_vertex_named(v.name) unless root_vertices[v.name] || v.predecessors.any? }
|
132
|
-
end
|
133
|
-
|
134
|
-
# @param [String] name
|
135
|
-
# @return [Vertex,nil] the vertex with the given name
|
136
|
-
def vertex_named(name)
|
137
|
-
vertices[name]
|
138
|
-
end
|
139
|
-
|
140
|
-
# @param [String] name
|
141
|
-
# @return [Vertex,nil] the root vertex with the given name
|
142
|
-
def root_vertex_named(name)
|
143
|
-
root_vertices[name]
|
144
|
-
end
|
145
|
-
|
146
|
-
# Adds a new {Edge} to the dependency graph
|
147
|
-
# @param [Vertex] origin
|
148
|
-
# @param [Vertex] destination
|
149
|
-
# @param [Object] requirement the requirement that this edge represents
|
150
|
-
# @return [Edge] the added edge
|
151
|
-
def add_edge(origin, destination, requirement)
|
152
|
-
if origin == destination || destination.path_to?(origin)
|
153
|
-
raise CircularDependencyError.new([origin, destination])
|
154
|
-
end
|
155
|
-
Edge.new(origin, destination, [requirement]).tap { |e| edges << e }
|
156
|
-
end
|
157
|
-
|
158
|
-
# A vertex in a {DependencyGraph} that encapsulates a {#name} and a
|
159
|
-
# {#payload}
|
160
|
-
class Vertex
|
161
|
-
# @return [DependencyGraph] the graph this vertex is a node of
|
162
|
-
attr_accessor :graph
|
163
|
-
|
164
|
-
# @return [String] the name of the vertex
|
165
|
-
attr_accessor :name
|
166
|
-
|
167
|
-
# @return [Object] the payload the vertex holds
|
168
|
-
attr_accessor :payload
|
169
|
-
|
170
|
-
# @return [Arrary<Object>] the explicit requirements that required
|
171
|
-
# this vertex
|
172
|
-
attr_reader :explicit_requirements
|
173
|
-
|
174
|
-
# @param [DependencyGraph] graph see {#graph}
|
175
|
-
# @param [String] name see {#name}
|
176
|
-
# @param [Object] payload see {#payload}
|
177
|
-
def initialize(graph, name, payload)
|
178
|
-
@graph = graph
|
179
|
-
@name = name
|
180
|
-
@payload = payload
|
181
|
-
@explicit_requirements = []
|
182
|
-
end
|
183
|
-
|
184
|
-
# @return [Array<Object>] all of the requirements that required
|
185
|
-
# this vertex
|
186
|
-
def requirements
|
187
|
-
incoming_edges.map(&:requirements).flatten + explicit_requirements
|
188
|
-
end
|
189
|
-
|
190
|
-
# @return [Array<Edge>] the edges of {#graph} that have `self` as their
|
191
|
-
# {Edge#origin}
|
192
|
-
def outgoing_edges
|
193
|
-
graph.edges.select { |e| e.origin.shallow_eql?(self) }
|
194
|
-
end
|
195
|
-
|
196
|
-
# @return [Array<Edge>] the edges of {#graph} that have `self` as their
|
197
|
-
# {Edge#destination}
|
198
|
-
def incoming_edges
|
199
|
-
graph.edges.select { |e| e.destination.shallow_eql?(self) }
|
200
|
-
end
|
201
|
-
|
202
|
-
# @return [Set<Vertex>] the vertices of {#graph} that have an edge with
|
203
|
-
# `self` as their {Edge#destination}
|
204
|
-
def predecessors
|
205
|
-
incoming_edges.map(&:origin).to_set
|
206
|
-
end
|
207
|
-
|
208
|
-
# @return [Set<Vertex>] the vertices of {#graph} that have an edge with
|
209
|
-
# `self` as their {Edge#origin}
|
210
|
-
def successors
|
211
|
-
outgoing_edges.map(&:destination).to_set
|
212
|
-
end
|
213
|
-
|
214
|
-
# @return [Set<Vertex>] the vertices of {#graph} where `self` is an
|
215
|
-
# {#ancestor?}
|
216
|
-
def recursive_successors
|
217
|
-
successors + successors.map(&:recursive_successors).reduce(Set.new, &:+)
|
218
|
-
end
|
219
|
-
|
220
|
-
# @return [String] a string suitable for debugging
|
221
|
-
def inspect
|
222
|
-
"#{self.class}:#{name}(#{payload.inspect})"
|
223
|
-
end
|
224
|
-
|
225
|
-
# @return [Boolean] whether the two vertices are equal, determined
|
226
|
-
# by a recursive traversal of each {Vertex#successors}
|
227
|
-
def ==(other)
|
228
|
-
shallow_eql?(other) &&
|
229
|
-
successors == other.successors
|
230
|
-
end
|
231
|
-
|
232
|
-
# @return [Boolean] whether the two vertices are equal, determined
|
233
|
-
# solely by {#name} and {#payload} equality
|
234
|
-
def shallow_eql?(other)
|
235
|
-
other &&
|
236
|
-
name == other.name &&
|
237
|
-
payload == other.payload
|
238
|
-
end
|
239
|
-
|
240
|
-
alias_method :eql?, :==
|
241
|
-
|
242
|
-
# @return [Fixnum] a hash for the vertex based upon its {#name}
|
243
|
-
def hash
|
244
|
-
name.hash
|
245
|
-
end
|
246
|
-
|
247
|
-
# Is there a path from `self` to `other` following edges in the
|
248
|
-
# dependency graph?
|
249
|
-
# @return true iff there is a path following edges within this {#graph}
|
250
|
-
def path_to?(other)
|
251
|
-
successors.include?(other) || successors.any? { |v| v.path_to?(other) }
|
252
|
-
end
|
253
|
-
|
254
|
-
alias_method :descendent?, :path_to?
|
255
|
-
|
256
|
-
# Is there a path from `other` to `self` following edges in the
|
257
|
-
# dependency graph?
|
258
|
-
# @return true iff there is a path following edges within this {#graph}
|
259
|
-
def ancestor?(other)
|
260
|
-
predecessors.include?(other) || predecessors.any? { |v| v.ancestor?(other) }
|
261
|
-
end
|
262
|
-
|
263
|
-
alias_method :is_reachable_from?, :ancestor?
|
264
|
-
end
|
265
|
-
end
|
266
|
-
end
|