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,16 +1,18 @@
|
|
1
1
|
class Bundler::Thor
|
2
2
|
class Option < Argument #:nodoc:
|
3
|
-
attr_reader :aliases, :group, :lazy_default, :hide
|
3
|
+
attr_reader :aliases, :group, :lazy_default, :hide, :repeatable
|
4
4
|
|
5
5
|
VALID_TYPES = [:boolean, :numeric, :hash, :array, :string]
|
6
6
|
|
7
7
|
def initialize(name, options = {})
|
8
|
+
@check_default_type = options[:check_default_type]
|
8
9
|
options[:required] = false unless options.key?(:required)
|
10
|
+
@repeatable = options.fetch(:repeatable, false)
|
9
11
|
super
|
10
|
-
@lazy_default
|
11
|
-
@group
|
12
|
-
@aliases
|
13
|
-
@hide
|
12
|
+
@lazy_default = options[:lazy_default]
|
13
|
+
@group = options[:group].to_s.capitalize if options[:group]
|
14
|
+
@aliases = Array(options[:aliases])
|
15
|
+
@hide = options[:hide]
|
14
16
|
end
|
15
17
|
|
16
18
|
# This parse quick options given as method_options. It makes several
|
@@ -40,31 +42,33 @@ class Bundler::Thor
|
|
40
42
|
#
|
41
43
|
# By default all options are optional, unless :required is given.
|
42
44
|
#
|
43
|
-
def self.parse(key, value)
|
45
|
+
def self.parse(key, value)
|
44
46
|
if key.is_a?(Array)
|
45
47
|
name, *aliases = key
|
46
48
|
else
|
47
|
-
name
|
49
|
+
name = key
|
50
|
+
aliases = []
|
48
51
|
end
|
49
52
|
|
50
53
|
name = name.to_s
|
51
54
|
default = value
|
52
55
|
|
53
56
|
type = case value
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
57
|
+
when Symbol
|
58
|
+
default = nil
|
59
|
+
if VALID_TYPES.include?(value)
|
60
|
+
value
|
61
|
+
elsif required = (value == :required) # rubocop:disable AssignmentInCondition
|
62
|
+
:string
|
63
|
+
end
|
64
|
+
when TrueClass, FalseClass
|
65
|
+
:boolean
|
66
|
+
when Numeric
|
67
|
+
:numeric
|
68
|
+
when Hash, Array, String
|
69
|
+
value.class.name.downcase.to_sym
|
70
|
+
end
|
71
|
+
|
68
72
|
new(name.to_s, :required => required, :type => type, :default => default, :aliases => aliases)
|
69
73
|
end
|
70
74
|
|
@@ -78,15 +82,15 @@ class Bundler::Thor
|
|
78
82
|
|
79
83
|
def usage(padding = 0)
|
80
84
|
sample = if banner && !banner.to_s.empty?
|
81
|
-
"#{switch_name}=#{banner}"
|
85
|
+
"#{switch_name}=#{banner}".dup
|
82
86
|
else
|
83
87
|
switch_name
|
84
88
|
end
|
85
89
|
|
86
|
-
sample = "[#{sample}]" unless required?
|
90
|
+
sample = "[#{sample}]".dup unless required?
|
87
91
|
|
88
92
|
if boolean?
|
89
|
-
sample << ", [#{dasherize(
|
93
|
+
sample << ", [#{dasherize('no-' + human_name)}]" unless (name == "force") || name.start_with?("no-")
|
90
94
|
end
|
91
95
|
|
92
96
|
if aliases.empty?
|
@@ -107,7 +111,37 @@ class Bundler::Thor
|
|
107
111
|
protected
|
108
112
|
|
109
113
|
def validate!
|
110
|
-
|
114
|
+
raise ArgumentError, "An option cannot be boolean and required." if boolean? && required?
|
115
|
+
validate_default_type!
|
116
|
+
end
|
117
|
+
|
118
|
+
def validate_default_type!
|
119
|
+
default_type = case @default
|
120
|
+
when nil
|
121
|
+
return
|
122
|
+
when TrueClass, FalseClass
|
123
|
+
required? ? :string : :boolean
|
124
|
+
when Numeric
|
125
|
+
:numeric
|
126
|
+
when Symbol
|
127
|
+
:string
|
128
|
+
when Hash, Array, String
|
129
|
+
@default.class.name.downcase.to_sym
|
130
|
+
end
|
131
|
+
|
132
|
+
expected_type = (@repeatable && @type != :hash) ? :array : @type
|
133
|
+
|
134
|
+
if default_type != expected_type
|
135
|
+
err = "Expected #{expected_type} default value for '#{switch_name}'; got #{@default.inspect} (#{default_type})"
|
136
|
+
|
137
|
+
if @check_default_type
|
138
|
+
raise ArgumentError, err
|
139
|
+
elsif @check_default_type == nil
|
140
|
+
Bundler::Thor.deprecation_warning "#{err}.\n" +
|
141
|
+
'This will be rejected in the future unless you explicitly pass the options `check_default_type: false`' +
|
142
|
+
' or call `allow_incompatible_default_type!` in your code'
|
143
|
+
end
|
144
|
+
end
|
111
145
|
end
|
112
146
|
|
113
147
|
def dasherized?
|
@@ -119,7 +153,7 @@ class Bundler::Thor
|
|
119
153
|
end
|
120
154
|
|
121
155
|
def dasherize(str)
|
122
|
-
(str.length > 1 ? "--" : "-") + str.
|
156
|
+
(str.length > 1 ? "--" : "-") + str.tr("_", "-")
|
123
157
|
end
|
124
158
|
end
|
125
159
|
end
|
@@ -14,23 +14,24 @@ class Bundler::Thor
|
|
14
14
|
when true
|
15
15
|
"--#{key}"
|
16
16
|
when Array
|
17
|
-
"--#{key} #{value.map
|
17
|
+
"--#{key} #{value.map(&:inspect).join(' ')}"
|
18
18
|
when Hash
|
19
19
|
"--#{key} #{value.map { |k, v| "#{k}:#{v}" }.join(' ')}"
|
20
20
|
when nil, false
|
21
|
-
|
21
|
+
nil
|
22
22
|
else
|
23
23
|
"--#{key} #{value.inspect}"
|
24
24
|
end
|
25
|
-
end.join(" ")
|
25
|
+
end.compact.join(" ")
|
26
26
|
end
|
27
27
|
|
28
28
|
# Takes a hash of Bundler::Thor::Option and a hash with defaults.
|
29
29
|
#
|
30
30
|
# If +stop_on_unknown+ is true, #parse will stop as soon as it encounters
|
31
31
|
# an unknown option or a regular argument.
|
32
|
-
def initialize(hash_options = {}, defaults = {}, stop_on_unknown = false)
|
32
|
+
def initialize(hash_options = {}, defaults = {}, stop_on_unknown = false, disable_required_check = false)
|
33
33
|
@stop_on_unknown = stop_on_unknown
|
34
|
+
@disable_required_check = disable_required_check
|
34
35
|
options = hash_options.values
|
35
36
|
super(options)
|
36
37
|
|
@@ -40,7 +41,10 @@ class Bundler::Thor
|
|
40
41
|
@non_assigned_required.delete(hash_options[key])
|
41
42
|
end
|
42
43
|
|
43
|
-
@shorts
|
44
|
+
@shorts = {}
|
45
|
+
@switches = {}
|
46
|
+
@extra = []
|
47
|
+
@stopped_parsing_after_extra_index = nil
|
44
48
|
|
45
49
|
options.each do |option|
|
46
50
|
@switches[option.switch_name] = option
|
@@ -52,7 +56,7 @@ class Bundler::Thor
|
|
52
56
|
end
|
53
57
|
end
|
54
58
|
|
55
|
-
def remaining
|
59
|
+
def remaining
|
56
60
|
@extra
|
57
61
|
end
|
58
62
|
|
@@ -63,6 +67,7 @@ class Bundler::Thor
|
|
63
67
|
if result == OPTS_END
|
64
68
|
shift
|
65
69
|
@parsing_options = false
|
70
|
+
@stopped_parsing_after_extra_index ||= @extra.size
|
66
71
|
super
|
67
72
|
else
|
68
73
|
result
|
@@ -92,10 +97,12 @@ class Bundler::Thor
|
|
92
97
|
|
93
98
|
switch = normalize_switch(switch)
|
94
99
|
option = switch_option(switch)
|
95
|
-
|
100
|
+
result = parse_peek(switch, option)
|
101
|
+
assign_result!(option, result)
|
96
102
|
elsif @stop_on_unknown
|
97
103
|
@parsing_options = false
|
98
104
|
@extra << shifted
|
105
|
+
@stopped_parsing_after_extra_index ||= @extra.size
|
99
106
|
@extra << shift while peek
|
100
107
|
break
|
101
108
|
elsif match
|
@@ -109,7 +116,7 @@ class Bundler::Thor
|
|
109
116
|
end
|
110
117
|
end
|
111
118
|
|
112
|
-
check_requirement!
|
119
|
+
check_requirement! unless @disable_required_check
|
113
120
|
|
114
121
|
assigns = Bundler::Thor::CoreExt::HashWithIndifferentAccess.new(@assigns)
|
115
122
|
assigns.freeze
|
@@ -117,13 +124,24 @@ class Bundler::Thor
|
|
117
124
|
end
|
118
125
|
|
119
126
|
def check_unknown!
|
127
|
+
to_check = @stopped_parsing_after_extra_index ? @extra[0...@stopped_parsing_after_extra_index] : @extra
|
128
|
+
|
120
129
|
# an unknown option starts with - or -- and has no more --'s afterward.
|
121
|
-
unknown =
|
122
|
-
|
130
|
+
unknown = to_check.select { |str| str =~ /^--?(?:(?!--).)*$/ }
|
131
|
+
raise UnknownArgumentError.new(@switches.keys, unknown) unless unknown.empty?
|
123
132
|
end
|
124
133
|
|
125
134
|
protected
|
126
135
|
|
136
|
+
def assign_result!(option, result)
|
137
|
+
if option.repeatable && option.type == :hash
|
138
|
+
(@assigns[option.human_name] ||= {}).merge!(result)
|
139
|
+
elsif option.repeatable
|
140
|
+
(@assigns[option.human_name] ||= []) << result
|
141
|
+
else
|
142
|
+
@assigns[option.human_name] = result
|
143
|
+
end
|
144
|
+
end
|
127
145
|
# Check if the current value in peek is a registered switch.
|
128
146
|
#
|
129
147
|
# Two booleans are returned. The first is true if the current value
|
@@ -153,7 +171,7 @@ class Bundler::Thor
|
|
153
171
|
end
|
154
172
|
|
155
173
|
def switch?(arg)
|
156
|
-
switch_option(normalize_switch(arg))
|
174
|
+
!switch_option(normalize_switch(arg)).nil?
|
157
175
|
end
|
158
176
|
|
159
177
|
def switch_option(arg)
|
@@ -186,7 +204,7 @@ class Bundler::Thor
|
|
186
204
|
shift
|
187
205
|
false
|
188
206
|
else
|
189
|
-
|
207
|
+
@switches.key?(switch) || !no_or_skip?(switch)
|
190
208
|
end
|
191
209
|
else
|
192
210
|
@switches.key?(switch) || !no_or_skip?(switch)
|
@@ -207,7 +225,7 @@ class Bundler::Thor
|
|
207
225
|
elsif option.lazy_default
|
208
226
|
return option.lazy_default
|
209
227
|
else
|
210
|
-
|
228
|
+
raise MalformattedArgumentError, "No value provided for option '#{switch}'"
|
211
229
|
end
|
212
230
|
end
|
213
231
|
|
@@ -25,6 +25,7 @@ class Bundler::Thor
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def self.included(base)
|
28
|
+
super(base)
|
28
29
|
# Hack. Make rakefile point to invoker, so rdoc task is generated properly.
|
29
30
|
rakefile = File.basename(caller[0].match(/(.*):\d+/)[1])
|
30
31
|
Rake.application.instance_variable_set(:@rakefile, rakefile)
|
@@ -1,20 +1,27 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require "bundler/vendor/thor/lib/thor/core_ext/io_binary_read"
|
1
|
+
require_relative "../thor"
|
2
|
+
require_relative "group"
|
4
3
|
|
5
|
-
require "fileutils"
|
6
|
-
require "open-uri"
|
7
4
|
require "yaml"
|
8
5
|
require "digest/md5"
|
9
6
|
require "pathname"
|
10
7
|
|
11
8
|
class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLength
|
9
|
+
autoload :OpenURI, "open-uri"
|
10
|
+
|
12
11
|
map "-T" => :list, "-i" => :install, "-u" => :update, "-v" => :version
|
13
12
|
|
13
|
+
def self.banner(command, all = false, subcommand = false)
|
14
|
+
"thor " + command.formatted_usage(self, all, subcommand)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.exit_on_failure?
|
18
|
+
true
|
19
|
+
end
|
20
|
+
|
14
21
|
# Override Bundler::Thor#help so it can give information about any class and any method.
|
15
22
|
#
|
16
23
|
def help(meth = nil)
|
17
|
-
if meth && !
|
24
|
+
if meth && !respond_to?(meth)
|
18
25
|
initialize_thorfiles(meth)
|
19
26
|
klass, command = Bundler::Thor::Util.find_class_and_command_by_namespace(meth)
|
20
27
|
self.class.handle_no_command_error(command, false) if klass.nil?
|
@@ -45,19 +52,21 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
45
52
|
# command in said directory.
|
46
53
|
begin
|
47
54
|
if File.directory?(File.expand_path(name))
|
48
|
-
base
|
49
|
-
|
55
|
+
base = File.join(name, "main.thor")
|
56
|
+
package = :directory
|
57
|
+
contents = open(base, &:read)
|
50
58
|
else
|
51
|
-
base
|
52
|
-
|
59
|
+
base = name
|
60
|
+
package = :file
|
61
|
+
contents = open(name, &:read)
|
53
62
|
end
|
54
63
|
rescue OpenURI::HTTPError
|
55
64
|
raise Error, "Error opening URI '#{name}'"
|
56
65
|
rescue Errno::ENOENT
|
57
|
-
|
66
|
+
raise Error, "Error opening file '#{name}'"
|
58
67
|
end
|
59
68
|
|
60
|
-
say "Your
|
69
|
+
say "Your Thorfile contains:"
|
61
70
|
say contents
|
62
71
|
|
63
72
|
unless options["force"]
|
@@ -94,6 +103,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
94
103
|
if package == :file
|
95
104
|
File.open(destination, "w") { |f| f.puts contents }
|
96
105
|
else
|
106
|
+
require "fileutils"
|
97
107
|
FileUtils.cp_r(name, destination)
|
98
108
|
end
|
99
109
|
|
@@ -102,15 +112,16 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
102
112
|
|
103
113
|
desc "version", "Show Bundler::Thor version"
|
104
114
|
def version
|
105
|
-
|
115
|
+
require_relative "version"
|
106
116
|
say "Bundler::Thor #{Bundler::Thor::VERSION}"
|
107
117
|
end
|
108
118
|
|
109
119
|
desc "uninstall NAME", "Uninstall a named Bundler::Thor module"
|
110
120
|
def uninstall(name)
|
111
|
-
|
121
|
+
raise Error, "Can't find module '#{name}'" unless thor_yaml[name]
|
112
122
|
say "Uninstalling #{name}."
|
113
|
-
|
123
|
+
require "fileutils"
|
124
|
+
FileUtils.rm_rf(File.join(thor_root, (thor_yaml[name][:filename]).to_s))
|
114
125
|
|
115
126
|
thor_yaml.delete(name)
|
116
127
|
save_yaml(thor_yaml)
|
@@ -120,7 +131,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
120
131
|
|
121
132
|
desc "update NAME", "Update a Bundler::Thor file from its original location"
|
122
133
|
def update(name)
|
123
|
-
|
134
|
+
raise Error, "Can't find module '#{name}'" if !thor_yaml[name] || !thor_yaml[name][:location]
|
124
135
|
|
125
136
|
say "Updating '#{name}' from #{thor_yaml[name][:location]}"
|
126
137
|
|
@@ -128,6 +139,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
128
139
|
self.options = options.merge("as" => name)
|
129
140
|
|
130
141
|
if File.directory? File.expand_path(name)
|
142
|
+
require "fileutils"
|
131
143
|
FileUtils.rm_rf(File.join(thor_root, old_filename))
|
132
144
|
|
133
145
|
thor_yaml.delete(old_filename)
|
@@ -138,9 +150,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
138
150
|
filename = install(thor_yaml[name][:location])
|
139
151
|
end
|
140
152
|
|
141
|
-
unless filename == old_filename
|
142
|
-
File.delete(File.join(thor_root, old_filename))
|
143
|
-
end
|
153
|
+
File.delete(File.join(thor_root, old_filename)) unless filename == old_filename
|
144
154
|
end
|
145
155
|
|
146
156
|
desc "installed", "List the installed Bundler::Thor modules and commands"
|
@@ -168,10 +178,6 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
168
178
|
|
169
179
|
private
|
170
180
|
|
171
|
-
def self.banner(command, all = false, subcommand = false)
|
172
|
-
"thor " + command.formatted_usage(self, all, subcommand)
|
173
|
-
end
|
174
|
-
|
175
181
|
def thor_root
|
176
182
|
Bundler::Thor::Util.thor_root
|
177
183
|
end
|
@@ -190,6 +196,7 @@ private
|
|
190
196
|
yaml_file = File.join(thor_root, "thor.yml")
|
191
197
|
|
192
198
|
unless File.exist?(yaml_file)
|
199
|
+
require "fileutils"
|
193
200
|
FileUtils.mkdir_p(thor_root)
|
194
201
|
yaml_file = File.join(thor_root, "thor.yml")
|
195
202
|
FileUtils.touch(yaml_file)
|
@@ -198,11 +205,7 @@ private
|
|
198
205
|
File.open(yaml_file, "w") { |f| f.puts yaml.to_yaml }
|
199
206
|
end
|
200
207
|
|
201
|
-
|
202
|
-
true
|
203
|
-
end
|
204
|
-
|
205
|
-
# Load the Bundler::Thorfiles. If relevant_to is supplied, looks for specific files
|
208
|
+
# Load the Thorfiles. If relevant_to is supplied, looks for specific files
|
206
209
|
# in the thor_root instead of loading them all.
|
207
210
|
#
|
208
211
|
# By default, it also traverses the current path until find Bundler::Thor files, as
|
@@ -215,11 +218,11 @@ private
|
|
215
218
|
end
|
216
219
|
end
|
217
220
|
|
218
|
-
# Finds
|
221
|
+
# Finds Thorfiles by traversing from your current directory down to the root
|
219
222
|
# directory of your system. If at any time we find a Bundler::Thor file, we stop.
|
220
223
|
#
|
221
|
-
# We also ensure that system-wide
|
222
|
-
#
|
224
|
+
# We also ensure that system-wide Thorfiles are loaded first, so local
|
225
|
+
# Thorfiles can override them.
|
223
226
|
#
|
224
227
|
# ==== Example
|
225
228
|
#
|
@@ -227,7 +230,7 @@ private
|
|
227
230
|
#
|
228
231
|
# 1. /Users/wycats/dev/thor
|
229
232
|
# 2. /Users/wycats/dev
|
230
|
-
# 3. /Users/wycats <-- we find a
|
233
|
+
# 3. /Users/wycats <-- we find a Thorfile here, so we stop
|
231
234
|
#
|
232
235
|
# Suppose we start at c:\Documents and Settings\james\dev\thor ...
|
233
236
|
#
|
@@ -235,7 +238,7 @@ private
|
|
235
238
|
# 2. c:\Documents and Settings\james\dev
|
236
239
|
# 3. c:\Documents and Settings\james
|
237
240
|
# 4. c:\Documents and Settings
|
238
|
-
# 5. c:\ <-- no
|
241
|
+
# 5. c:\ <-- no Thorfiles found!
|
239
242
|
#
|
240
243
|
def thorfiles(relevant_to = nil, skip_lookup = false)
|
241
244
|
thorfiles = []
|
@@ -256,18 +259,18 @@ private
|
|
256
259
|
end
|
257
260
|
end
|
258
261
|
|
259
|
-
# Load
|
262
|
+
# Load Thorfiles relevant to the given method. If you provide "foo:bar" it
|
260
263
|
# will load all thor files in the thor.yaml that has "foo" e "foo:bar"
|
261
264
|
# namespaces registered.
|
262
265
|
#
|
263
266
|
def thorfiles_relevant_to(meth)
|
264
267
|
lookup = [meth, meth.split(":")[0...-1].join(":")]
|
265
268
|
|
266
|
-
files = thor_yaml.select do |
|
269
|
+
files = thor_yaml.select do |_, v|
|
267
270
|
v[:namespaces] && !(v[:namespaces] & lookup).empty?
|
268
271
|
end
|
269
272
|
|
270
|
-
files.map { |
|
273
|
+
files.map { |_, v| File.join(thor_root, (v[:filename]).to_s) }
|
271
274
|
end
|
272
275
|
|
273
276
|
# Display information about the given klasses. If with_module is given,
|
@@ -276,7 +279,7 @@ private
|
|
276
279
|
def display_klasses(with_modules = false, show_internal = false, klasses = Bundler::Thor::Base.subclasses)
|
277
280
|
klasses -= [Bundler::Thor, Bundler::Thor::Runner, Bundler::Thor::Group] unless show_internal
|
278
281
|
|
279
|
-
|
282
|
+
raise Error, "No Bundler::Thor commands available" if klasses.empty?
|
280
283
|
show_modules if with_modules && !thor_yaml.empty?
|
281
284
|
|
282
285
|
list = Hash.new { |h, k| h[k] = [] }
|
@@ -306,8 +309,8 @@ private
|
|
306
309
|
alias_method :display_tasks, :display_commands
|
307
310
|
|
308
311
|
def show_modules #:nodoc:
|
309
|
-
info
|
310
|
-
labels = %w
|
312
|
+
info = []
|
313
|
+
labels = %w(Modules Namespaces)
|
311
314
|
|
312
315
|
info << labels
|
313
316
|
info << ["-" * labels[0].size, "-" * labels[1].size]
|