bundler 2.2.29 → 2.5.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1129 -4
- data/README.md +4 -8
- data/bundler.gemspec +11 -11
- data/exe/bundle +5 -26
- data/exe/bundler +1 -1
- data/lib/bundler/.document +1 -0
- data/lib/bundler/build_metadata.rb +4 -4
- data/lib/bundler/capistrano.rb +1 -1
- data/lib/bundler/checksum.rb +254 -0
- data/lib/bundler/ci_detector.rb +75 -0
- data/lib/bundler/cli/add.rb +4 -4
- data/lib/bundler/cli/binstubs.rb +10 -6
- data/lib/bundler/cli/cache.rb +1 -1
- data/lib/bundler/cli/check.rb +3 -3
- data/lib/bundler/cli/common.rb +13 -3
- data/lib/bundler/cli/config.rb +18 -8
- data/lib/bundler/cli/console.rb +5 -4
- data/lib/bundler/cli/doctor.rb +12 -5
- data/lib/bundler/cli/exec.rb +1 -1
- data/lib/bundler/cli/fund.rb +1 -1
- data/lib/bundler/cli/gem.rb +141 -48
- data/lib/bundler/cli/info.rb +27 -17
- data/lib/bundler/cli/init.rb +6 -2
- data/lib/bundler/cli/install.rb +22 -39
- data/lib/bundler/cli/issue.rb +5 -4
- data/lib/bundler/cli/lock.rb +36 -29
- data/lib/bundler/cli/open.rb +9 -9
- data/lib/bundler/cli/outdated.rb +19 -12
- data/lib/bundler/cli/platform.rb +8 -6
- data/lib/bundler/cli/plugin.rb +9 -15
- data/lib/bundler/cli/pristine.rb +38 -30
- data/lib/bundler/cli/show.rb +3 -3
- data/lib/bundler/cli/update.rb +12 -7
- data/lib/bundler/cli/viz.rb +1 -1
- data/lib/bundler/cli.rb +266 -285
- data/lib/bundler/compact_index_client/cache.rb +53 -67
- data/lib/bundler/compact_index_client/cache_file.rb +153 -0
- data/lib/bundler/compact_index_client/gem_parser.rb +7 -3
- data/lib/bundler/compact_index_client/parser.rb +84 -0
- data/lib/bundler/compact_index_client/updater.rb +83 -76
- data/lib/bundler/compact_index_client.rb +59 -87
- data/lib/bundler/constants.rb +9 -2
- data/lib/bundler/current_ruby.rb +12 -16
- data/lib/bundler/definition.rb +509 -319
- data/lib/bundler/dependency.rb +33 -71
- data/lib/bundler/digest.rb +71 -0
- data/lib/bundler/dsl.rb +88 -69
- data/lib/bundler/endpoint_specification.rb +32 -15
- data/lib/bundler/env.rb +5 -7
- data/lib/bundler/environment_preserver.rb +8 -22
- data/lib/bundler/errors.rb +101 -13
- data/lib/bundler/feature_flag.rb +0 -2
- data/lib/bundler/fetcher/base.rb +11 -11
- data/lib/bundler/fetcher/compact_index.rb +32 -52
- data/lib/bundler/fetcher/dependency.rb +3 -7
- data/lib/bundler/fetcher/downloader.rb +17 -16
- data/lib/bundler/fetcher/gem_remote_fetcher.rb +16 -0
- data/lib/bundler/fetcher/index.rb +2 -29
- data/lib/bundler/fetcher.rb +87 -79
- data/lib/bundler/force_platform.rb +18 -0
- data/lib/bundler/friendly_errors.rb +29 -40
- data/lib/bundler/gem_helper.rb +11 -23
- data/lib/bundler/gem_helpers.rb +30 -6
- data/lib/bundler/gem_version_promoter.rb +68 -109
- data/lib/bundler/graph.rb +9 -9
- data/lib/bundler/index.rb +71 -79
- data/lib/bundler/injector.rb +23 -11
- data/lib/bundler/inline.rb +11 -23
- data/lib/bundler/installer/gem_installer.rb +18 -11
- data/lib/bundler/installer/parallel_installer.rb +17 -65
- data/lib/bundler/installer/standalone.rb +56 -15
- data/lib/bundler/installer.rb +35 -61
- data/lib/bundler/lazy_specification.rb +92 -61
- data/lib/bundler/lockfile_generator.rb +12 -3
- data/lib/bundler/lockfile_parser.rb +137 -70
- data/lib/bundler/man/bundle-add.1 +19 -26
- data/lib/bundler/man/bundle-add.1.ronn +16 -4
- data/lib/bundler/man/bundle-binstubs.1 +4 -16
- data/lib/bundler/man/bundle-cache.1 +9 -24
- data/lib/bundler/man/bundle-cache.1.ronn +9 -2
- data/lib/bundler/man/bundle-check.1 +5 -12
- data/lib/bundler/man/bundle-check.1.ronn +3 -0
- data/lib/bundler/man/bundle-clean.1 +4 -11
- data/lib/bundler/man/bundle-clean.1.ronn +1 -1
- data/lib/bundler/man/bundle-config.1 +47 -224
- data/lib/bundler/man/bundle-config.1.ronn +40 -28
- data/lib/bundler/man/bundle-console.1 +35 -0
- data/lib/bundler/man/bundle-console.1.ronn +44 -0
- data/lib/bundler/man/bundle-doctor.1 +4 -18
- data/lib/bundler/man/bundle-exec.1 +16 -77
- data/lib/bundler/man/bundle-exec.1.ronn +8 -9
- data/lib/bundler/man/bundle-gem.1 +45 -72
- data/lib/bundler/man/bundle-gem.1.ronn +32 -5
- data/lib/bundler/man/bundle-help.1 +9 -0
- data/lib/bundler/man/bundle-help.1.ronn +12 -0
- data/lib/bundler/man/bundle-info.1 +5 -11
- data/lib/bundler/man/bundle-info.1.ronn +3 -3
- data/lib/bundler/man/bundle-init.1 +6 -11
- data/lib/bundler/man/bundle-init.1.ronn +2 -0
- data/lib/bundler/man/bundle-inject.1 +8 -18
- data/lib/bundler/man/bundle-inject.1.ronn +3 -1
- data/lib/bundler/man/bundle-install.1 +32 -155
- data/lib/bundler/man/bundle-install.1.ronn +11 -33
- data/lib/bundler/man/bundle-list.1 +4 -19
- data/lib/bundler/man/bundle-lock.1 +5 -29
- data/lib/bundler/man/bundle-open.1 +18 -18
- data/lib/bundler/man/bundle-open.1.ronn +9 -1
- data/lib/bundler/man/bundle-outdated.1 +17 -72
- data/lib/bundler/man/bundle-outdated.1.ronn +13 -18
- data/lib/bundler/man/bundle-platform.1 +16 -28
- data/lib/bundler/man/bundle-platform.1.ronn +14 -7
- data/lib/bundler/man/bundle-plugin.1 +58 -0
- data/lib/bundler/man/bundle-plugin.1.ronn +63 -0
- data/lib/bundler/man/bundle-pristine.1 +5 -16
- data/lib/bundler/man/bundle-remove.1 +4 -14
- data/lib/bundler/man/bundle-show.1 +3 -10
- data/lib/bundler/man/bundle-update.1 +19 -138
- data/lib/bundler/man/bundle-update.1.ronn +2 -1
- data/lib/bundler/man/bundle-version.1 +22 -0
- data/lib/bundler/man/bundle-version.1.ronn +24 -0
- data/lib/bundler/man/bundle-viz.1 +6 -15
- data/lib/bundler/man/bundle-viz.1.ronn +2 -0
- data/lib/bundler/man/bundle.1 +17 -51
- data/lib/bundler/man/bundle.1.ronn +12 -7
- data/lib/bundler/man/gemfile.5 +130 -346
- data/lib/bundler/man/gemfile.5.ronn +121 -86
- data/lib/bundler/man/index.txt +4 -0
- data/lib/bundler/match_metadata.rb +17 -0
- data/lib/bundler/match_platform.rb +1 -2
- data/lib/bundler/match_remote_metadata.rb +29 -0
- data/lib/bundler/mirror.rb +8 -10
- data/lib/bundler/plugin/api/source.rb +9 -13
- data/lib/bundler/plugin/index.rb +13 -5
- data/lib/bundler/plugin/installer/git.rb +0 -4
- data/lib/bundler/plugin/installer/path.rb +18 -0
- data/lib/bundler/plugin/installer/rubygems.rb +0 -8
- data/lib/bundler/plugin/installer.rb +42 -19
- data/lib/bundler/plugin/source_list.rb +4 -4
- data/lib/bundler/plugin.rb +16 -7
- data/lib/bundler/process_lock.rb +1 -1
- data/lib/bundler/remote_specification.rb +11 -5
- data/lib/bundler/resolver/base.rb +111 -0
- data/lib/bundler/resolver/candidate.rb +82 -0
- data/lib/bundler/resolver/incompatibility.rb +15 -0
- data/lib/bundler/resolver/package.rb +81 -0
- data/lib/bundler/resolver/root.rb +25 -0
- data/lib/bundler/resolver/spec_group.rb +53 -66
- data/lib/bundler/resolver.rb +419 -307
- data/lib/bundler/retry.rb +1 -1
- data/lib/bundler/ruby_dsl.rb +42 -7
- data/lib/bundler/ruby_version.rb +16 -22
- data/lib/bundler/rubygems_ext.rb +250 -64
- data/lib/bundler/rubygems_gem_installer.rb +90 -64
- data/lib/bundler/rubygems_integration.rb +81 -190
- data/lib/bundler/runtime.rb +8 -13
- data/lib/bundler/safe_marshal.rb +31 -0
- data/lib/bundler/self_manager.rb +206 -0
- data/lib/bundler/settings.rb +139 -57
- data/lib/bundler/setup.rb +13 -1
- data/lib/bundler/shared_helpers.rb +67 -36
- data/lib/bundler/source/git/git_proxy.rb +285 -82
- data/lib/bundler/source/git.rb +81 -41
- data/lib/bundler/source/metadata.rb +17 -16
- data/lib/bundler/source/path/installer.rb +1 -22
- data/lib/bundler/source/path.rb +13 -25
- data/lib/bundler/source/rubygems/remote.rb +1 -1
- data/lib/bundler/source/rubygems.rb +164 -234
- data/lib/bundler/source/rubygems_aggregate.rb +1 -1
- data/lib/bundler/source.rb +7 -6
- data/lib/bundler/source_list.rb +40 -32
- data/lib/bundler/source_map.rb +15 -2
- data/lib/bundler/spec_set.rb +156 -46
- data/lib/bundler/stub_specification.rb +18 -5
- data/lib/bundler/templates/Executable +3 -5
- data/lib/bundler/templates/Executable.bundler +7 -12
- data/lib/bundler/templates/Executable.standalone +4 -4
- data/lib/bundler/templates/Gemfile +0 -2
- data/lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt +77 -29
- data/lib/bundler/templates/newgem/Cargo.toml.tt +7 -0
- data/lib/bundler/templates/newgem/Gemfile.tt +8 -2
- data/lib/bundler/templates/newgem/README.md.tt +7 -11
- data/lib/bundler/templates/newgem/Rakefile.tt +28 -4
- data/lib/bundler/templates/newgem/bin/console.tt +0 -4
- data/lib/bundler/templates/newgem/circleci/config.yml.tt +12 -0
- data/lib/bundler/templates/newgem/ext/newgem/Cargo.toml.tt +15 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf-c.rb.tt +10 -0
- data/lib/bundler/templates/newgem/ext/newgem/extconf-rust.rb.tt +6 -0
- data/lib/bundler/templates/newgem/ext/newgem/newgem.c.tt +1 -1
- data/lib/bundler/templates/newgem/ext/newgem/src/lib.rs.tt +12 -0
- data/lib/bundler/templates/newgem/github/workflows/main.yml.tt +13 -3
- data/lib/bundler/templates/newgem/gitignore.tt +3 -0
- data/lib/bundler/templates/newgem/gitlab-ci.yml.tt +13 -4
- data/lib/bundler/templates/newgem/newgem.gemspec.tt +25 -17
- data/lib/bundler/templates/newgem/rubocop.yml.tt +0 -5
- data/lib/bundler/templates/newgem/sig/newgem.rbs.tt +8 -0
- data/lib/bundler/templates/newgem/standard.yml.tt +3 -0
- data/lib/bundler/templates/newgem/test/minitest/{newgem_test.rb.tt → test_newgem.rb.tt} +1 -1
- data/lib/bundler/ui/rg_proxy.rb +1 -1
- data/lib/bundler/ui/shell.rb +38 -15
- data/lib/bundler/ui/silent.rb +21 -5
- data/lib/bundler/uri_credentials_filter.rb +2 -2
- data/lib/bundler/uri_normalizer.rb +23 -0
- data/lib/bundler/vendor/.document +1 -0
- data/lib/bundler/vendor/connection_pool/.document +1 -0
- data/lib/bundler/vendor/connection_pool/LICENSE +20 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb +19 -21
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/version.rb +1 -1
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/wrapper.rb +56 -0
- data/lib/bundler/vendor/connection_pool/lib/connection_pool.rb +92 -78
- data/lib/bundler/vendor/fileutils/.document +1 -0
- data/lib/bundler/vendor/fileutils/LICENSE.txt +22 -0
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1340 -410
- data/lib/bundler/vendor/net-http-persistent/.document +1 -0
- data/lib/bundler/vendor/net-http-persistent/README.rdoc +82 -0
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/connection.rb +4 -3
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/pool.rb +23 -11
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/timed_stack_multi.rb +1 -1
- data/lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb +57 -57
- data/lib/bundler/vendor/pub_grub/.document +1 -0
- data/lib/bundler/vendor/pub_grub/LICENSE.txt +21 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/assignment.rb +20 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/basic_package_source.rb +189 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/failure_writer.rb +182 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/incompatibility.rb +150 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/package.rb +43 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/partial_solution.rb +121 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/rubygems.rb +45 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/solve_failure.rb +19 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/static_package_source.rb +61 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/term.rb +105 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version.rb +3 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_constraint.rb +129 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_range.rb +411 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_solver.rb +248 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub/version_union.rb +178 -0
- data/lib/bundler/vendor/pub_grub/lib/pub_grub.rb +31 -0
- data/lib/bundler/vendor/thor/.document +1 -0
- data/lib/bundler/vendor/thor/LICENSE.md +20 -0
- data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +3 -2
- data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +12 -14
- data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +16 -6
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +21 -17
- data/lib/bundler/vendor/thor/lib/thor/base.rb +140 -14
- data/lib/bundler/vendor/thor/lib/thor/command.rb +13 -4
- data/lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb +10 -0
- data/lib/bundler/vendor/thor/lib/thor/error.rb +16 -20
- data/lib/bundler/vendor/thor/lib/thor/group.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/invocation.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/nested_context.rb +2 -2
- data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +20 -1
- data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +33 -17
- data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +27 -8
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +63 -7
- data/lib/bundler/vendor/thor/lib/thor/rake_compat.rb +2 -2
- data/lib/bundler/vendor/thor/lib/thor/runner.rb +40 -30
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +48 -154
- data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -46
- data/lib/bundler/vendor/thor/lib/thor/shell/column_printer.rb +29 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +0 -45
- data/lib/bundler/vendor/thor/lib/thor/shell/table_printer.rb +134 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/terminal.rb +42 -0
- data/lib/bundler/vendor/thor/lib/thor/shell/wrapped_printer.rb +38 -0
- data/lib/bundler/vendor/thor/lib/thor/shell.rb +2 -2
- data/lib/bundler/vendor/thor/lib/thor/util.rb +9 -8
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor.rb +155 -8
- data/lib/bundler/vendor/tsort/.document +1 -0
- data/lib/bundler/vendor/tsort/LICENSE.txt +22 -0
- data/lib/bundler/vendor/tsort/lib/tsort.rb +455 -0
- data/lib/bundler/vendor/uri/.document +1 -0
- data/lib/bundler/vendor/uri/LICENSE.txt +22 -0
- data/lib/bundler/vendor/uri/lib/uri/common.rb +316 -207
- data/lib/bundler/vendor/uri/lib/uri/file.rb +7 -1
- data/lib/bundler/vendor/uri/lib/uri/ftp.rb +2 -2
- data/lib/bundler/vendor/uri/lib/uri/generic.rb +33 -13
- data/lib/bundler/vendor/uri/lib/uri/http.rb +40 -3
- data/lib/bundler/vendor/uri/lib/uri/https.rb +2 -2
- data/lib/bundler/vendor/uri/lib/uri/ldap.rb +2 -2
- data/lib/bundler/vendor/uri/lib/uri/ldaps.rb +2 -1
- data/lib/bundler/vendor/uri/lib/uri/mailto.rb +2 -3
- data/lib/bundler/vendor/uri/lib/uri/rfc2396_parser.rb +16 -23
- data/lib/bundler/vendor/uri/lib/uri/rfc3986_parser.rb +105 -47
- data/lib/bundler/vendor/uri/lib/uri/version.rb +1 -1
- data/lib/bundler/vendor/uri/lib/uri/ws.rb +83 -0
- data/lib/bundler/vendor/uri/lib/uri/wss.rb +23 -0
- data/lib/bundler/vendor/uri/lib/uri.rb +3 -3
- data/lib/bundler/vendored_net_http.rb +23 -0
- data/lib/bundler/vendored_persistent.rb +0 -36
- data/lib/bundler/{vendored_molinillo.rb → vendored_pub_grub.rb} +1 -1
- data/lib/bundler/vendored_timeout.rb +12 -0
- data/lib/bundler/{vendored_tmpdir.rb → vendored_tsort.rb} +1 -1
- data/lib/bundler/vendored_uri.rb +18 -1
- data/lib/bundler/version.rb +5 -1
- data/lib/bundler/vlad.rb +1 -1
- data/lib/bundler/worker.rb +7 -9
- data/lib/bundler/yaml_serializer.rb +21 -12
- data/lib/bundler.rb +114 -121
- metadata +87 -41
- data/lib/bundler/dep_proxy.rb +0 -55
- data/lib/bundler/gemdeps.rb +0 -29
- data/lib/bundler/psyched_yaml.rb +0 -22
- data/lib/bundler/templates/gems.rb +0 -8
- data/lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt +0 -5
- data/lib/bundler/templates/newgem/travis.yml.tt +0 -6
- data/lib/bundler/vendor/connection_pool/lib/connection_pool/monotonic_time.rb +0 -66
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +0 -57
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +0 -88
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +0 -36
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +0 -66
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +0 -62
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb +0 -63
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb +0 -61
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +0 -126
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +0 -46
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +0 -36
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +0 -164
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +0 -255
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +0 -143
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +0 -6
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +0 -112
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +0 -67
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +0 -839
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +0 -46
- data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +0 -58
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +0 -11
- data/lib/bundler/vendor/tmpdir/lib/tmpdir.rb +0 -154
- data/lib/bundler/version_ranges.rb +0 -122
@@ -1,5 +1,5 @@
|
|
1
1
|
class Bundler::Thor
|
2
|
-
class Options < Arguments #:nodoc:
|
2
|
+
class Options < Arguments #:nodoc:
|
3
3
|
LONG_RE = /^(--\w+(?:-\w+)*)$/
|
4
4
|
SHORT_RE = /^(-[a-z])$/i
|
5
5
|
EQ_RE = /^(--\w+(?:-\w+)*|-[a-z])=(.*)$/i
|
@@ -29,8 +29,10 @@ class Bundler::Thor
|
|
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, disable_required_check = false)
|
32
|
+
def initialize(hash_options = {}, defaults = {}, stop_on_unknown = false, disable_required_check = false, relations = {})
|
33
33
|
@stop_on_unknown = stop_on_unknown
|
34
|
+
@exclusives = (relations[:exclusive_option_names] || []).select{|array| !array.empty?}
|
35
|
+
@at_least_ones = (relations[:at_least_one_option_names] || []).select{|array| !array.empty?}
|
34
36
|
@disable_required_check = disable_required_check
|
35
37
|
options = hash_options.values
|
36
38
|
super(options)
|
@@ -45,12 +47,12 @@ class Bundler::Thor
|
|
45
47
|
@switches = {}
|
46
48
|
@extra = []
|
47
49
|
@stopped_parsing_after_extra_index = nil
|
50
|
+
@is_treated_as_value = false
|
48
51
|
|
49
52
|
options.each do |option|
|
50
53
|
@switches[option.switch_name] = option
|
51
54
|
|
52
|
-
option.aliases.each do |
|
53
|
-
name = short.to_s.sub(/^(?!\-)/, "-")
|
55
|
+
option.aliases.each do |name|
|
54
56
|
@shorts[name] ||= option.switch_name
|
55
57
|
end
|
56
58
|
end
|
@@ -74,8 +76,19 @@ class Bundler::Thor
|
|
74
76
|
end
|
75
77
|
end
|
76
78
|
|
77
|
-
def
|
79
|
+
def shift
|
80
|
+
@is_treated_as_value = false
|
81
|
+
super
|
82
|
+
end
|
83
|
+
|
84
|
+
def unshift(arg, is_value: false)
|
85
|
+
@is_treated_as_value = is_value
|
86
|
+
super(arg)
|
87
|
+
end
|
88
|
+
|
89
|
+
def parse(args) # rubocop:disable Metrics/MethodLength
|
78
90
|
@pile = args.dup
|
91
|
+
@is_treated_as_value = false
|
79
92
|
@parsing_options = true
|
80
93
|
|
81
94
|
while peek
|
@@ -88,7 +101,10 @@ class Bundler::Thor
|
|
88
101
|
when SHORT_SQ_RE
|
89
102
|
unshift($1.split("").map { |f| "-#{f}" })
|
90
103
|
next
|
91
|
-
when EQ_RE
|
104
|
+
when EQ_RE
|
105
|
+
unshift($2, is_value: true)
|
106
|
+
switch = $1
|
107
|
+
when SHORT_NUM
|
92
108
|
unshift($2)
|
93
109
|
switch = $1
|
94
110
|
when LONG_RE, SHORT_RE
|
@@ -117,12 +133,38 @@ class Bundler::Thor
|
|
117
133
|
end
|
118
134
|
|
119
135
|
check_requirement! unless @disable_required_check
|
136
|
+
check_exclusive!
|
137
|
+
check_at_least_one!
|
120
138
|
|
121
139
|
assigns = Bundler::Thor::CoreExt::HashWithIndifferentAccess.new(@assigns)
|
122
140
|
assigns.freeze
|
123
141
|
assigns
|
124
142
|
end
|
125
143
|
|
144
|
+
def check_exclusive!
|
145
|
+
opts = @assigns.keys
|
146
|
+
# When option A and B are exclusive, if A and B are given at the same time,
|
147
|
+
# the diffrence of argument array size will decrease.
|
148
|
+
found = @exclusives.find{ |ex| (ex - opts).size < ex.size - 1 }
|
149
|
+
if found
|
150
|
+
names = names_to_switch_names(found & opts).map{|n| "'#{n}'"}
|
151
|
+
class_name = self.class.name.split("::").last.downcase
|
152
|
+
fail ExclusiveArgumentError, "Found exclusive #{class_name} #{names.join(", ")}"
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def check_at_least_one!
|
157
|
+
opts = @assigns.keys
|
158
|
+
# When at least one is required of the options A and B,
|
159
|
+
# if the both options were not given, none? would be true.
|
160
|
+
found = @at_least_ones.find{ |one_reqs| one_reqs.none?{ |o| opts.include? o} }
|
161
|
+
if found
|
162
|
+
names = names_to_switch_names(found).map{|n| "'#{n}'"}
|
163
|
+
class_name = self.class.name.split("::").last.downcase
|
164
|
+
fail AtLeastOneRequiredArgumentError, "Not found at least one of required #{class_name} #{names.join(", ")}"
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
126
168
|
def check_unknown!
|
127
169
|
to_check = @stopped_parsing_after_extra_index ? @extra[0...@stopped_parsing_after_extra_index] : @extra
|
128
170
|
|
@@ -133,6 +175,17 @@ class Bundler::Thor
|
|
133
175
|
|
134
176
|
protected
|
135
177
|
|
178
|
+
# Option names changes to swith name or human name
|
179
|
+
def names_to_switch_names(names = [])
|
180
|
+
@switches.map do |_, o|
|
181
|
+
if names.include? o.name
|
182
|
+
o.respond_to?(:switch_name) ? o.switch_name : o.human_name
|
183
|
+
else
|
184
|
+
nil
|
185
|
+
end
|
186
|
+
end.compact
|
187
|
+
end
|
188
|
+
|
136
189
|
def assign_result!(option, result)
|
137
190
|
if option.repeatable && option.type == :hash
|
138
191
|
(@assigns[option.human_name] ||= {}).merge!(result)
|
@@ -148,6 +201,7 @@ class Bundler::Thor
|
|
148
201
|
# Two booleans are returned. The first is true if the current value
|
149
202
|
# starts with a hyphen; the second is true if it is a registered switch.
|
150
203
|
def current_is_switch?
|
204
|
+
return [false, false] if @is_treated_as_value
|
151
205
|
case peek
|
152
206
|
when LONG_RE, SHORT_RE, EQ_RE, SHORT_NUM
|
153
207
|
[true, switch?($1)]
|
@@ -159,6 +213,7 @@ class Bundler::Thor
|
|
159
213
|
end
|
160
214
|
|
161
215
|
def current_is_switch_formatted?
|
216
|
+
return false if @is_treated_as_value
|
162
217
|
case peek
|
163
218
|
when LONG_RE, SHORT_RE, EQ_RE, SHORT_NUM, SHORT_SQ_RE
|
164
219
|
true
|
@@ -168,6 +223,7 @@ class Bundler::Thor
|
|
168
223
|
end
|
169
224
|
|
170
225
|
def current_is_value?
|
226
|
+
return true if @is_treated_as_value
|
171
227
|
peek && (!parsing_options? || super)
|
172
228
|
end
|
173
229
|
|
@@ -176,7 +232,7 @@ class Bundler::Thor
|
|
176
232
|
end
|
177
233
|
|
178
234
|
def switch_option(arg)
|
179
|
-
if match = no_or_skip?(arg) # rubocop:disable AssignmentInCondition
|
235
|
+
if match = no_or_skip?(arg) # rubocop:disable Lint/AssignmentInCondition
|
180
236
|
@switches[arg] || @switches["--#{match}"]
|
181
237
|
else
|
182
238
|
@switches[arg]
|
@@ -41,7 +41,7 @@ instance_eval do
|
|
41
41
|
def task(*)
|
42
42
|
task = super
|
43
43
|
|
44
|
-
if klass = Bundler::Thor::RakeCompat.rake_classes.last # rubocop:disable AssignmentInCondition
|
44
|
+
if klass = Bundler::Thor::RakeCompat.rake_classes.last # rubocop:disable Lint/AssignmentInCondition
|
45
45
|
non_namespaced_name = task.name.split(":").last
|
46
46
|
|
47
47
|
description = non_namespaced_name
|
@@ -59,7 +59,7 @@ instance_eval do
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def namespace(name)
|
62
|
-
if klass = Bundler::Thor::RakeCompat.rake_classes.last # rubocop:disable AssignmentInCondition
|
62
|
+
if klass = Bundler::Thor::RakeCompat.rake_classes.last # rubocop:disable Lint/AssignmentInCondition
|
63
63
|
const_name = Bundler::Thor::Util.camel_case(name.to_s).to_sym
|
64
64
|
klass.const_set(const_name, Class.new(Bundler::Thor))
|
65
65
|
new_klass = klass.const_get(const_name)
|
@@ -2,12 +2,10 @@ require_relative "../thor"
|
|
2
2
|
require_relative "group"
|
3
3
|
|
4
4
|
require "yaml"
|
5
|
-
require "digest/
|
5
|
+
require "digest/sha2"
|
6
6
|
require "pathname"
|
7
7
|
|
8
|
-
class Bundler::Thor::Runner < Bundler::Thor #:nodoc:
|
9
|
-
autoload :OpenURI, "open-uri"
|
10
|
-
|
8
|
+
class Bundler::Thor::Runner < Bundler::Thor #:nodoc:
|
11
9
|
map "-T" => :list, "-i" => :install, "-u" => :update, "-v" => :version
|
12
10
|
|
13
11
|
def self.banner(command, all = false, subcommand = false)
|
@@ -25,7 +23,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
25
23
|
initialize_thorfiles(meth)
|
26
24
|
klass, command = Bundler::Thor::Util.find_class_and_command_by_namespace(meth)
|
27
25
|
self.class.handle_no_command_error(command, false) if klass.nil?
|
28
|
-
klass.start(["-h", command].compact, :
|
26
|
+
klass.start(["-h", command].compact, shell: shell)
|
29
27
|
else
|
30
28
|
super
|
31
29
|
end
|
@@ -40,30 +38,42 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
40
38
|
klass, command = Bundler::Thor::Util.find_class_and_command_by_namespace(meth)
|
41
39
|
self.class.handle_no_command_error(command, false) if klass.nil?
|
42
40
|
args.unshift(command) if command
|
43
|
-
klass.start(args, :
|
41
|
+
klass.start(args, shell: shell)
|
44
42
|
end
|
45
43
|
|
46
44
|
desc "install NAME", "Install an optionally named Bundler::Thor file into your system commands"
|
47
|
-
method_options :
|
48
|
-
def install(name) # rubocop:disable MethodLength
|
45
|
+
method_options as: :string, relative: :boolean, force: :boolean
|
46
|
+
def install(name) # rubocop:disable Metrics/MethodLength
|
49
47
|
initialize_thorfiles
|
50
48
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
49
|
+
is_uri = name =~ %r{^https?\://}
|
50
|
+
|
51
|
+
if is_uri
|
52
|
+
base = name
|
53
|
+
package = :file
|
54
|
+
require "open-uri"
|
55
|
+
begin
|
56
|
+
contents = URI.open(name, &:read)
|
57
|
+
rescue OpenURI::HTTPError
|
58
|
+
raise Error, "Error opening URI '#{name}'"
|
59
|
+
end
|
60
|
+
else
|
61
|
+
# If a directory name is provided as the argument, look for a 'main.thor'
|
62
|
+
# command in said directory.
|
63
|
+
begin
|
64
|
+
if File.directory?(File.expand_path(name))
|
65
|
+
base = File.join(name, "main.thor")
|
66
|
+
package = :directory
|
67
|
+
contents = File.open(base, &:read)
|
68
|
+
else
|
69
|
+
base = name
|
70
|
+
package = :file
|
71
|
+
require "open-uri"
|
72
|
+
contents = URI.open(name, &:read)
|
73
|
+
end
|
74
|
+
rescue Errno::ENOENT
|
75
|
+
raise Error, "Error opening file '#{name}'"
|
62
76
|
end
|
63
|
-
rescue OpenURI::HTTPError
|
64
|
-
raise Error, "Error opening URI '#{name}'"
|
65
|
-
rescue Errno::ENOENT
|
66
|
-
raise Error, "Error opening file '#{name}'"
|
67
77
|
end
|
68
78
|
|
69
79
|
say "Your Thorfile contains:"
|
@@ -84,16 +94,16 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
84
94
|
as = basename if as.empty?
|
85
95
|
end
|
86
96
|
|
87
|
-
location = if options[:relative] ||
|
97
|
+
location = if options[:relative] || is_uri
|
88
98
|
name
|
89
99
|
else
|
90
100
|
File.expand_path(name)
|
91
101
|
end
|
92
102
|
|
93
103
|
thor_yaml[as] = {
|
94
|
-
:
|
95
|
-
:
|
96
|
-
:
|
104
|
+
filename: Digest::SHA256.hexdigest(name + as),
|
105
|
+
location: location,
|
106
|
+
namespaces: Bundler::Thor::Util.namespaces_in_content(contents, base)
|
97
107
|
}
|
98
108
|
|
99
109
|
save_yaml(thor_yaml)
|
@@ -154,14 +164,14 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
154
164
|
end
|
155
165
|
|
156
166
|
desc "installed", "List the installed Bundler::Thor modules and commands"
|
157
|
-
method_options :
|
167
|
+
method_options internal: :boolean
|
158
168
|
def installed
|
159
169
|
initialize_thorfiles(nil, true)
|
160
170
|
display_klasses(true, options["internal"])
|
161
171
|
end
|
162
172
|
|
163
173
|
desc "list [SEARCH]", "List the available thor commands (--substring means .*SEARCH)"
|
164
|
-
method_options :
|
174
|
+
method_options substring: :boolean, group: :string, all: :boolean, debug: :boolean
|
165
175
|
def list(search = "")
|
166
176
|
initialize_thorfiles
|
167
177
|
|
@@ -303,7 +313,7 @@ private
|
|
303
313
|
say shell.set_color(namespace, :blue, true)
|
304
314
|
say "-" * namespace.size
|
305
315
|
|
306
|
-
print_table(list, :
|
316
|
+
print_table(list, truncate: true)
|
307
317
|
say
|
308
318
|
end
|
309
319
|
alias_method :display_tasks, :display_commands
|
@@ -1,8 +1,10 @@
|
|
1
|
+
require_relative "column_printer"
|
2
|
+
require_relative "table_printer"
|
3
|
+
require_relative "wrapped_printer"
|
4
|
+
|
1
5
|
class Bundler::Thor
|
2
6
|
module Shell
|
3
7
|
class Basic
|
4
|
-
DEFAULT_TERMINAL_WIDTH = 80
|
5
|
-
|
6
8
|
attr_accessor :base
|
7
9
|
attr_reader :padding
|
8
10
|
|
@@ -103,6 +105,23 @@ class Bundler::Thor
|
|
103
105
|
stdout.flush
|
104
106
|
end
|
105
107
|
|
108
|
+
# Say (print) an error to the user. If the sentence ends with a whitespace
|
109
|
+
# or tab character, a new line is not appended (print + flush). Otherwise
|
110
|
+
# are passed straight to puts (behavior got from Highline).
|
111
|
+
#
|
112
|
+
# ==== Example
|
113
|
+
# say_error("error: something went wrong")
|
114
|
+
#
|
115
|
+
def say_error(message = "", color = nil, force_new_line = (message.to_s !~ /( |\t)\Z/))
|
116
|
+
return if quiet?
|
117
|
+
|
118
|
+
buffer = prepare_message(message, *color)
|
119
|
+
buffer << "\n" if force_new_line && !message.to_s.end_with?("\n")
|
120
|
+
|
121
|
+
stderr.print(buffer)
|
122
|
+
stderr.flush
|
123
|
+
end
|
124
|
+
|
106
125
|
# Say a status with the given color and appends the message. Since this
|
107
126
|
# method is used frequently by actions, it allows nil or false to be given
|
108
127
|
# in log_status, avoiding the message from being shown. If a Symbol is
|
@@ -111,13 +130,14 @@ class Bundler::Thor
|
|
111
130
|
def say_status(status, message, log_status = true)
|
112
131
|
return if quiet? || log_status == false
|
113
132
|
spaces = " " * (padding + 1)
|
114
|
-
color = log_status.is_a?(Symbol) ? log_status : :green
|
115
|
-
|
116
133
|
status = status.to_s.rjust(12)
|
134
|
+
margin = " " * status.length + spaces
|
135
|
+
|
136
|
+
color = log_status.is_a?(Symbol) ? log_status : :green
|
117
137
|
status = set_color status, color, true if color
|
118
138
|
|
119
|
-
|
120
|
-
buffer = "#{
|
139
|
+
message = message.to_s.chomp.gsub(/(?<!\A)^/, margin)
|
140
|
+
buffer = "#{status}#{spaces}#{message}\n"
|
121
141
|
|
122
142
|
stdout.print(buffer)
|
123
143
|
stdout.flush
|
@@ -127,14 +147,14 @@ class Bundler::Thor
|
|
127
147
|
# "yes".
|
128
148
|
#
|
129
149
|
def yes?(statement, color = nil)
|
130
|
-
!!(ask(statement, color, :
|
150
|
+
!!(ask(statement, color, add_to_history: false) =~ is?(:yes))
|
131
151
|
end
|
132
152
|
|
133
153
|
# Make a question the to user and returns true if the user replies "n" or
|
134
154
|
# "no".
|
135
155
|
#
|
136
156
|
def no?(statement, color = nil)
|
137
|
-
!!(ask(statement, color, :
|
157
|
+
!!(ask(statement, color, add_to_history: false) =~ is?(:no))
|
138
158
|
end
|
139
159
|
|
140
160
|
# Prints values in columns
|
@@ -143,16 +163,8 @@ class Bundler::Thor
|
|
143
163
|
# Array[String, String, ...]
|
144
164
|
#
|
145
165
|
def print_in_columns(array)
|
146
|
-
|
147
|
-
|
148
|
-
array.each_with_index do |value, index|
|
149
|
-
# Don't output trailing spaces when printing the last column
|
150
|
-
if ((((index + 1) % (terminal_width / colwidth))).zero? && !index.zero?) || index + 1 == array.length
|
151
|
-
stdout.puts value
|
152
|
-
else
|
153
|
-
stdout.printf("%-#{colwidth}s", value)
|
154
|
-
end
|
155
|
-
end
|
166
|
+
printer = ColumnPrinter.new(stdout)
|
167
|
+
printer.print(array)
|
156
168
|
end
|
157
169
|
|
158
170
|
# Prints a table.
|
@@ -163,58 +175,11 @@ class Bundler::Thor
|
|
163
175
|
# ==== Options
|
164
176
|
# indent<Integer>:: Indent the first column by indent value.
|
165
177
|
# colwidth<Integer>:: Force the first column to colwidth spaces wide.
|
178
|
+
# borders<Boolean>:: Adds ascii borders.
|
166
179
|
#
|
167
|
-
def print_table(array, options = {}) # rubocop:disable MethodLength
|
168
|
-
|
169
|
-
|
170
|
-
formats = []
|
171
|
-
indent = options[:indent].to_i
|
172
|
-
colwidth = options[:colwidth]
|
173
|
-
options[:truncate] = terminal_width if options[:truncate] == true
|
174
|
-
|
175
|
-
formats << "%-#{colwidth + 2}s".dup if colwidth
|
176
|
-
start = colwidth ? 1 : 0
|
177
|
-
|
178
|
-
colcount = array.max { |a, b| a.size <=> b.size }.size
|
179
|
-
|
180
|
-
maximas = []
|
181
|
-
|
182
|
-
start.upto(colcount - 1) do |index|
|
183
|
-
maxima = array.map { |row| row[index] ? row[index].to_s.size : 0 }.max
|
184
|
-
maximas << maxima
|
185
|
-
formats << if index == colcount - 1
|
186
|
-
# Don't output 2 trailing spaces when printing the last column
|
187
|
-
"%-s".dup
|
188
|
-
else
|
189
|
-
"%-#{maxima + 2}s".dup
|
190
|
-
end
|
191
|
-
end
|
192
|
-
|
193
|
-
formats[0] = formats[0].insert(0, " " * indent)
|
194
|
-
formats << "%s"
|
195
|
-
|
196
|
-
array.each do |row|
|
197
|
-
sentence = "".dup
|
198
|
-
|
199
|
-
row.each_with_index do |column, index|
|
200
|
-
maxima = maximas[index]
|
201
|
-
|
202
|
-
f = if column.is_a?(Numeric)
|
203
|
-
if index == row.size - 1
|
204
|
-
# Don't output 2 trailing spaces when printing the last column
|
205
|
-
"%#{maxima}s"
|
206
|
-
else
|
207
|
-
"%#{maxima}s "
|
208
|
-
end
|
209
|
-
else
|
210
|
-
formats[index]
|
211
|
-
end
|
212
|
-
sentence << f % column.to_s
|
213
|
-
end
|
214
|
-
|
215
|
-
sentence = truncate(sentence, options[:truncate]) if options[:truncate]
|
216
|
-
stdout.puts sentence
|
217
|
-
end
|
180
|
+
def print_table(array, options = {}) # rubocop:disable Metrics/MethodLength
|
181
|
+
printer = TablePrinter.new(stdout, options)
|
182
|
+
printer.print(array)
|
218
183
|
end
|
219
184
|
|
220
185
|
# Prints a long string, word-wrapping the text to the current width of the
|
@@ -227,33 +192,8 @@ class Bundler::Thor
|
|
227
192
|
# indent<Integer>:: Indent each line of the printed paragraph by indent value.
|
228
193
|
#
|
229
194
|
def print_wrapped(message, options = {})
|
230
|
-
|
231
|
-
|
232
|
-
paras = message.split("\n\n")
|
233
|
-
|
234
|
-
paras.map! do |unwrapped|
|
235
|
-
words = unwrapped.split(" ")
|
236
|
-
counter = words.first.length
|
237
|
-
words.inject do |memo, word|
|
238
|
-
word = word.gsub(/\n\005/, "\n").gsub(/\005/, "\n")
|
239
|
-
counter = 0 if word.include? "\n"
|
240
|
-
if (counter + word.length + 1) < width
|
241
|
-
memo = "#{memo} #{word}"
|
242
|
-
counter += (word.length + 1)
|
243
|
-
else
|
244
|
-
memo = "#{memo}\n#{word}"
|
245
|
-
counter = word.length
|
246
|
-
end
|
247
|
-
memo
|
248
|
-
end
|
249
|
-
end.compact!
|
250
|
-
|
251
|
-
paras.each do |para|
|
252
|
-
para.split("\n").each do |line|
|
253
|
-
stdout.puts line.insert(0, " " * indent)
|
254
|
-
end
|
255
|
-
stdout.puts unless para == paras.last
|
256
|
-
end
|
195
|
+
printer = WrappedPrinter.new(stdout, options)
|
196
|
+
printer.print(message)
|
257
197
|
end
|
258
198
|
|
259
199
|
# Deals with file collision and returns true if the file should be
|
@@ -271,7 +211,7 @@ class Bundler::Thor
|
|
271
211
|
loop do
|
272
212
|
answer = ask(
|
273
213
|
%[Overwrite #{destination}? (enter "h" for help) #{options}],
|
274
|
-
:
|
214
|
+
add_to_history: false
|
275
215
|
)
|
276
216
|
|
277
217
|
case answer
|
@@ -298,24 +238,11 @@ class Bundler::Thor
|
|
298
238
|
|
299
239
|
say "Please specify merge tool to `THOR_MERGE` env."
|
300
240
|
else
|
301
|
-
say file_collision_help
|
241
|
+
say file_collision_help(block_given?)
|
302
242
|
end
|
303
243
|
end
|
304
244
|
end
|
305
245
|
|
306
|
-
# This code was copied from Rake, available under MIT-LICENSE
|
307
|
-
# Copyright (c) 2003, 2004 Jim Weirich
|
308
|
-
def terminal_width
|
309
|
-
result = if ENV["THOR_COLUMNS"]
|
310
|
-
ENV["THOR_COLUMNS"].to_i
|
311
|
-
else
|
312
|
-
unix? ? dynamic_width : DEFAULT_TERMINAL_WIDTH
|
313
|
-
end
|
314
|
-
result < 10 ? DEFAULT_TERMINAL_WIDTH : result
|
315
|
-
rescue
|
316
|
-
DEFAULT_TERMINAL_WIDTH
|
317
|
-
end
|
318
|
-
|
319
246
|
# Called if something goes wrong during the execution. This is used by Bundler::Thor
|
320
247
|
# internally and should not be used inside your scripts. If something went
|
321
248
|
# wrong, you can always raise an exception. If you raise a Bundler::Thor::Error, it
|
@@ -366,16 +293,21 @@ class Bundler::Thor
|
|
366
293
|
end
|
367
294
|
end
|
368
295
|
|
369
|
-
def file_collision_help #:nodoc:
|
370
|
-
<<-HELP
|
296
|
+
def file_collision_help(block_given) #:nodoc:
|
297
|
+
help = <<-HELP
|
371
298
|
Y - yes, overwrite
|
372
299
|
n - no, do not overwrite
|
373
300
|
a - all, overwrite this and all others
|
374
301
|
q - quit, abort
|
375
|
-
d - diff, show the differences between the old and the new
|
376
302
|
h - help, show this help
|
377
|
-
m - merge, run merge tool
|
378
303
|
HELP
|
304
|
+
if block_given
|
305
|
+
help << <<-HELP
|
306
|
+
d - diff, show the differences between the old and the new
|
307
|
+
m - merge, run merge tool
|
308
|
+
HELP
|
309
|
+
end
|
310
|
+
help
|
379
311
|
end
|
380
312
|
|
381
313
|
def show_diff(destination, content) #:nodoc:
|
@@ -393,46 +325,8 @@ class Bundler::Thor
|
|
393
325
|
mute? || (base && base.options[:quiet])
|
394
326
|
end
|
395
327
|
|
396
|
-
# Calculate the dynamic width of the terminal
|
397
|
-
def dynamic_width
|
398
|
-
@dynamic_width ||= (dynamic_width_stty.nonzero? || dynamic_width_tput)
|
399
|
-
end
|
400
|
-
|
401
|
-
def dynamic_width_stty
|
402
|
-
`stty size 2>/dev/null`.split[1].to_i
|
403
|
-
end
|
404
|
-
|
405
|
-
def dynamic_width_tput
|
406
|
-
`tput cols 2>/dev/null`.to_i
|
407
|
-
end
|
408
|
-
|
409
328
|
def unix?
|
410
|
-
|
411
|
-
end
|
412
|
-
|
413
|
-
def truncate(string, width)
|
414
|
-
as_unicode do
|
415
|
-
chars = string.chars.to_a
|
416
|
-
if chars.length <= width
|
417
|
-
chars.join
|
418
|
-
else
|
419
|
-
chars[0, width - 3].join + "..."
|
420
|
-
end
|
421
|
-
end
|
422
|
-
end
|
423
|
-
|
424
|
-
if "".respond_to?(:encode)
|
425
|
-
def as_unicode
|
426
|
-
yield
|
427
|
-
end
|
428
|
-
else
|
429
|
-
def as_unicode
|
430
|
-
old = $KCODE
|
431
|
-
$KCODE = "U"
|
432
|
-
yield
|
433
|
-
ensure
|
434
|
-
$KCODE = old
|
435
|
-
end
|
329
|
+
Terminal.unix?
|
436
330
|
end
|
437
331
|
|
438
332
|
def ask_simply(statement, color, options)
|
@@ -105,52 +105,7 @@ class Bundler::Thor
|
|
105
105
|
end
|
106
106
|
|
107
107
|
def are_colors_disabled?
|
108
|
-
!ENV[
|
109
|
-
end
|
110
|
-
|
111
|
-
# Overwrite show_diff to show diff with colors if Diff::LCS is
|
112
|
-
# available.
|
113
|
-
#
|
114
|
-
def show_diff(destination, content) #:nodoc:
|
115
|
-
if diff_lcs_loaded? && ENV["THOR_DIFF"].nil? && ENV["RAILS_DIFF"].nil?
|
116
|
-
actual = File.binread(destination).to_s.split("\n")
|
117
|
-
content = content.to_s.split("\n")
|
118
|
-
|
119
|
-
Diff::LCS.sdiff(actual, content).each do |diff|
|
120
|
-
output_diff_line(diff)
|
121
|
-
end
|
122
|
-
else
|
123
|
-
super
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
def output_diff_line(diff) #:nodoc:
|
128
|
-
case diff.action
|
129
|
-
when "-"
|
130
|
-
say "- #{diff.old_element.chomp}", :red, true
|
131
|
-
when "+"
|
132
|
-
say "+ #{diff.new_element.chomp}", :green, true
|
133
|
-
when "!"
|
134
|
-
say "- #{diff.old_element.chomp}", :red, true
|
135
|
-
say "+ #{diff.new_element.chomp}", :green, true
|
136
|
-
else
|
137
|
-
say " #{diff.old_element.chomp}", nil, true
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
# Check if Diff::LCS is loaded. If it is, use it to create pretty output
|
142
|
-
# for diff.
|
143
|
-
#
|
144
|
-
def diff_lcs_loaded? #:nodoc:
|
145
|
-
return true if defined?(Diff::LCS)
|
146
|
-
return @diff_lcs_loaded unless @diff_lcs_loaded.nil?
|
147
|
-
|
148
|
-
@diff_lcs_loaded = begin
|
149
|
-
require "diff/lcs"
|
150
|
-
true
|
151
|
-
rescue LoadError
|
152
|
-
false
|
153
|
-
end
|
108
|
+
!ENV["NO_COLOR"].nil? && !ENV["NO_COLOR"].empty?
|
154
109
|
end
|
155
110
|
end
|
156
111
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative "terminal"
|
2
|
+
|
3
|
+
class Bundler::Thor
|
4
|
+
module Shell
|
5
|
+
class ColumnPrinter
|
6
|
+
attr_reader :stdout, :options
|
7
|
+
|
8
|
+
def initialize(stdout, options = {})
|
9
|
+
@stdout = stdout
|
10
|
+
@options = options
|
11
|
+
@indent = options[:indent].to_i
|
12
|
+
end
|
13
|
+
|
14
|
+
def print(array)
|
15
|
+
return if array.empty?
|
16
|
+
colwidth = (array.map { |el| el.to_s.size }.max || 0) + 2
|
17
|
+
array.each_with_index do |value, index|
|
18
|
+
# Don't output trailing spaces when printing the last column
|
19
|
+
if ((((index + 1) % (Terminal.terminal_width / colwidth))).zero? && !index.zero?) || index + 1 == array.length
|
20
|
+
stdout.puts value
|
21
|
+
else
|
22
|
+
stdout.printf("%-#{colwidth}s", value)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|