bundler 1.13.6 → 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 +554 -9
- data/README.md +28 -5
- data/bundler.gemspec +40 -11
- data/exe/bundle +4 -8
- data/exe/bundle_ruby +4 -3
- data/lib/bundler.rb +162 -68
- data/lib/bundler/build_metadata.rb +53 -0
- data/lib/bundler/capistrano.rb +5 -0
- data/lib/bundler/cli.rb +360 -118
- data/lib/bundler/cli/add.rb +35 -0
- data/lib/bundler/cli/binstubs.rb +18 -10
- data/lib/bundler/cli/cache.rb +6 -5
- data/lib/bundler/cli/check.rb +4 -6
- data/lib/bundler/cli/clean.rb +6 -7
- data/lib/bundler/cli/common.rb +47 -1
- data/lib/bundler/cli/config.rb +26 -7
- data/lib/bundler/cli/console.rb +2 -1
- data/lib/bundler/cli/doctor.rb +63 -18
- data/lib/bundler/cli/exec.rb +12 -5
- data/lib/bundler/cli/gem.rb +59 -21
- data/lib/bundler/cli/info.rb +50 -0
- data/lib/bundler/cli/init.rb +21 -7
- data/lib/bundler/cli/inject.rb +13 -4
- data/lib/bundler/cli/install.rb +72 -101
- data/lib/bundler/cli/issue.rb +40 -0
- data/lib/bundler/cli/list.rb +58 -0
- data/lib/bundler/cli/lock.rb +9 -6
- data/lib/bundler/cli/open.rb +4 -3
- data/lib/bundler/cli/outdated.rb +175 -60
- data/lib/bundler/cli/package.rb +9 -6
- data/lib/bundler/cli/platform.rb +2 -1
- data/lib/bundler/cli/plugin.rb +1 -0
- data/lib/bundler/cli/pristine.rb +47 -0
- data/lib/bundler/cli/remove.rb +18 -0
- data/lib/bundler/cli/show.rb +2 -2
- data/lib/bundler/cli/update.rb +44 -34
- data/lib/bundler/cli/viz.rb +5 -1
- 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 +1 -0
- data/lib/bundler/current_ruby.rb +17 -8
- data/lib/bundler/definition.rb +353 -182
- data/lib/bundler/dep_proxy.rb +3 -1
- data/lib/bundler/dependency.rb +22 -10
- data/lib/bundler/deployment.rb +1 -1
- data/lib/bundler/deprecate.rb +15 -3
- data/lib/bundler/dsl.rb +122 -64
- data/lib/bundler/endpoint_specification.rb +13 -3
- data/lib/bundler/env.rb +110 -38
- data/lib/bundler/environment_preserver.rb +27 -6
- data/lib/bundler/errors.rb +24 -0
- data/lib/bundler/feature_flag.rb +74 -0
- data/lib/bundler/fetcher.rb +18 -11
- data/lib/bundler/fetcher/base.rb +1 -0
- data/lib/bundler/fetcher/compact_index.rb +7 -5
- data/lib/bundler/fetcher/dependency.rb +3 -2
- data/lib/bundler/fetcher/downloader.rb +25 -7
- data/lib/bundler/fetcher/index.rb +3 -2
- data/lib/bundler/friendly_errors.rb +33 -7
- data/lib/bundler/gem_helper.rb +25 -11
- data/lib/bundler/gem_helpers.rb +70 -1
- data/lib/bundler/gem_remote_fetcher.rb +1 -0
- data/lib/bundler/gem_tasks.rb +1 -0
- data/lib/bundler/gem_version_promoter.rb +17 -2
- data/lib/bundler/gemdeps.rb +29 -0
- data/lib/bundler/graph.rb +1 -0
- data/lib/bundler/index.rb +28 -15
- data/lib/bundler/injector.rb +216 -33
- data/lib/bundler/inline.rb +12 -12
- data/lib/bundler/installer.rb +139 -53
- data/lib/bundler/installer/gem_installer.rb +15 -5
- data/lib/bundler/installer/parallel_installer.rb +113 -28
- data/lib/bundler/installer/standalone.rb +1 -0
- data/lib/bundler/lazy_specification.rb +31 -3
- data/lib/bundler/lockfile_generator.rb +95 -0
- data/lib/bundler/lockfile_parser.rb +50 -37
- data/lib/bundler/match_platform.rb +13 -3
- data/lib/bundler/mirror.rb +10 -5
- data/lib/bundler/plugin.rb +22 -8
- data/lib/bundler/plugin/api.rb +2 -1
- data/lib/bundler/plugin/api/source.rb +17 -4
- data/lib/bundler/plugin/events.rb +61 -0
- data/lib/bundler/plugin/index.rb +9 -2
- data/lib/bundler/plugin/installer.rb +7 -6
- data/lib/bundler/plugin/source_list.rb +7 -8
- data/lib/bundler/process_lock.rb +24 -0
- data/lib/bundler/psyched_yaml.rb +10 -0
- data/lib/bundler/remote_specification.rb +30 -1
- data/lib/bundler/resolver.rb +187 -194
- data/lib/bundler/resolver/spec_group.rb +106 -0
- data/lib/bundler/retry.rb +5 -1
- data/lib/bundler/ruby_dsl.rb +1 -0
- data/lib/bundler/ruby_version.rb +12 -2
- data/lib/bundler/rubygems_ext.rb +23 -8
- data/lib/bundler/rubygems_gem_installer.rb +90 -0
- data/lib/bundler/rubygems_integration.rb +193 -70
- data/lib/bundler/runtime.rb +39 -22
- data/lib/bundler/settings.rb +245 -85
- data/lib/bundler/settings/validator.rb +102 -0
- data/lib/bundler/setup.rb +4 -7
- data/lib/bundler/shared_helpers.rb +183 -40
- data/lib/bundler/similarity_detector.rb +1 -0
- data/lib/bundler/source.rb +58 -1
- data/lib/bundler/source/gemspec.rb +1 -0
- data/lib/bundler/source/git.rb +52 -23
- data/lib/bundler/source/git/git_proxy.rb +30 -14
- data/lib/bundler/source/metadata.rb +62 -0
- data/lib/bundler/source/path.rb +42 -16
- data/lib/bundler/source/path/installer.rb +4 -2
- data/lib/bundler/source/rubygems.rb +171 -82
- data/lib/bundler/source/rubygems/remote.rb +12 -2
- data/lib/bundler/source_list.rb +75 -15
- data/lib/bundler/spec_set.rb +67 -32
- data/lib/bundler/ssl_certs/certificate_manager.rb +2 -1
- data/lib/bundler/stub_specification.rb +86 -2
- data/lib/bundler/templates/.document +1 -0
- data/lib/bundler/templates/Executable +13 -1
- data/lib/bundler/templates/Executable.bundler +105 -0
- data/lib/bundler/templates/Executable.standalone +5 -5
- data/lib/bundler/templates/Gemfile +3 -0
- data/lib/bundler/templates/gems.rb +8 -0
- 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 +14 -8
- data/lib/bundler/templates/newgem/Rakefile.tt +5 -5
- data/lib/bundler/templates/newgem/bin/console.tt +1 -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 +21 -12
- data/lib/bundler/templates/newgem/rspec.tt +1 -0
- data/lib/bundler/templates/newgem/spec/newgem_spec.rb.tt +1 -3
- data/lib/bundler/templates/newgem/spec/spec_helper.rb.tt +13 -1
- data/lib/bundler/templates/newgem/test/newgem_test.rb.tt +1 -1
- data/lib/bundler/templates/newgem/test/test_helper.rb.tt +3 -3
- data/lib/bundler/templates/newgem/{.travis.yml.tt → travis.yml.tt} +2 -0
- data/lib/bundler/ui.rb +1 -0
- data/lib/bundler/ui/rg_proxy.rb +1 -0
- data/lib/bundler/ui/shell.rb +30 -10
- data/lib/bundler/ui/silent.rb +21 -1
- data/lib/bundler/uri_credentials_filter.rb +1 -0
- data/lib/bundler/vendor/fileutils/lib/fileutils.rb +1638 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo.rb +2 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb +26 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb +7 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb +1 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb +26 -6
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb +2 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb +12 -4
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb +3 -2
- 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 +11 -3
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb +13 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb +3 -2
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb +3 -2
- data/lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb +18 -5
- data/lib/bundler/vendor/molinillo/lib/molinillo/errors.rb +75 -7
- data/lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb +2 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb +1 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb +3 -1
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb +499 -128
- data/lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb +1 -0
- data/lib/bundler/vendor/molinillo/lib/molinillo/state.rb +8 -4
- 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/lib/thor.rb +46 -21
- data/lib/bundler/vendor/thor/lib/thor/actions.rb +24 -22
- data/lib/bundler/vendor/thor/lib/thor/actions/create_file.rb +2 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/create_link.rb +2 -1
- data/lib/bundler/vendor/thor/lib/thor/actions/directory.rb +2 -2
- data/lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb +16 -8
- data/lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb +66 -18
- data/lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb +17 -15
- data/lib/bundler/vendor/thor/lib/thor/base.rb +55 -32
- data/lib/bundler/vendor/thor/lib/thor/command.rb +13 -11
- data/lib/bundler/vendor/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 +7 -5
- data/lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb +94 -63
- data/lib/bundler/vendor/thor/lib/thor/error.rb +3 -3
- data/lib/bundler/vendor/thor/lib/thor/group.rb +13 -13
- data/lib/bundler/vendor/thor/lib/thor/invocation.rb +4 -5
- data/lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb +2 -0
- data/lib/bundler/vendor/thor/lib/thor/parser/argument.rb +4 -7
- data/lib/bundler/vendor/thor/lib/thor/parser/arguments.rb +16 -16
- data/lib/bundler/vendor/thor/lib/thor/parser/option.rb +42 -21
- data/lib/bundler/vendor/thor/lib/thor/parser/options.rb +13 -10
- data/lib/bundler/vendor/thor/lib/thor/runner.rb +31 -29
- data/lib/bundler/vendor/thor/lib/thor/shell.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/shell/basic.rb +49 -33
- data/lib/bundler/vendor/thor/lib/thor/shell/color.rb +1 -1
- data/lib/bundler/vendor/thor/lib/thor/shell/html.rb +4 -4
- data/lib/bundler/vendor/thor/lib/thor/util.rb +8 -7
- data/lib/bundler/vendor/thor/lib/thor/version.rb +1 -1
- data/lib/bundler/vendored_fileutils.rb +9 -0
- data/lib/bundler/vendored_molinillo.rb +1 -0
- data/lib/bundler/vendored_persistent.rb +43 -3
- data/lib/bundler/vendored_thor.rb +6 -2
- data/lib/bundler/version.rb +19 -2
- data/lib/bundler/version_ranges.rb +76 -0
- data/lib/bundler/vlad.rb +5 -0
- data/lib/bundler/worker.rb +30 -6
- data/lib/bundler/yaml_serializer.rb +4 -4
- data/man/bundle-add.1 +58 -0
- data/man/bundle-add.1.txt +52 -0
- data/man/bundle-add.ronn +40 -0
- data/{lib/bundler/man/bundle-binstubs → man/bundle-binstubs.1} +11 -1
- data/man/bundle-binstubs.1.txt +48 -0
- data/man/bundle-binstubs.ronn +15 -1
- 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 +233 -61
- data/man/bundle-doctor.1 +44 -0
- data/man/bundle-doctor.1.txt +44 -0
- data/man/bundle-doctor.ronn +33 -0
- data/{lib/bundler/man/bundle-exec → man/bundle-exec.1} +6 -3
- data/man/bundle-exec.1.txt +178 -0
- data/man/bundle-exec.ronn +10 -3
- data/{lib/bundler/man/bundle-gem → man/bundle-gem.1} +4 -4
- data/man/bundle-gem.1.txt +91 -0
- data/man/bundle-gem.ronn +3 -2
- 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/{lib/bundler/man/bundle-install → man/bundle-install.1} +32 -29
- data/man/bundle-install.1.txt +396 -0
- data/man/bundle-install.ronn +45 -36
- data/man/bundle-list.1 +50 -0
- data/man/bundle-list.1.txt +43 -0
- data/man/bundle-list.ronn +33 -0
- data/{lib/bundler/man/bundle-lock → man/bundle-lock.1} +43 -2
- data/man/bundle-lock.1.txt +93 -0
- data/man/bundle-lock.ronn +47 -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/{lib/bundler/man/bundle-package → man/bundle-package.1} +6 -3
- data/man/bundle-package.1.txt +79 -0
- data/man/bundle-package.ronn +7 -2
- data/{lib/bundler/man/bundle-platform → man/bundle-platform.1} +1 -1
- data/man/bundle-platform.1.txt +57 -0
- 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 +172 -16
- data/man/bundle-viz.1 +39 -0
- data/man/bundle-viz.1.txt +39 -0
- data/man/bundle-viz.ronn +30 -0
- data/{lib/bundler/man/bundle → man/bundle.1} +44 -28
- data/man/bundle.1.txt +116 -0
- data/man/bundle.ronn +39 -27
- data/{lib/bundler/man → man}/gemfile.5 +67 -84
- data/man/gemfile.5.ronn +77 -55
- data/man/gemfile.5.txt +653 -0
- data/man/index.txt +25 -8
- metadata +118 -58
- data/.codeclimate.yml +0 -25
- data/.gitignore +0 -16
- data/.rspec +0 -3
- data/.rubocop.yml +0 -128
- data/.rubocop_todo.yml +0 -248
- data/.travis.yml +0 -108
- data/CODE_OF_CONDUCT.md +0 -42
- data/CONTRIBUTING.md +0 -36
- data/DEVELOPMENT.md +0 -148
- data/ISSUES.md +0 -100
- data/Rakefile +0 -333
- data/bin/rake +0 -19
- data/bin/rspec +0 -15
- data/bin/rubocop +0 -17
- data/bin/with_rubygems +0 -39
- data/lib/bundler/man/bundle-binstubs.txt +0 -33
- data/lib/bundler/man/bundle-config +0 -254
- data/lib/bundler/man/bundle-config.txt +0 -282
- data/lib/bundler/man/bundle-exec.txt +0 -171
- data/lib/bundler/man/bundle-gem.txt +0 -90
- data/lib/bundler/man/bundle-install.txt +0 -385
- data/lib/bundler/man/bundle-lock.txt +0 -52
- data/lib/bundler/man/bundle-package.txt +0 -74
- data/lib/bundler/man/bundle-platform.txt +0 -57
- data/lib/bundler/man/bundle-update +0 -221
- data/lib/bundler/man/bundle-update.txt +0 -227
- data/lib/bundler/man/bundle.txt +0 -104
- data/lib/bundler/man/gemfile.5.txt +0 -636
- data/lib/bundler/postit_trampoline.rb +0 -68
- data/lib/bundler/vendor/compact_index_client/lib/compact_index_client.rb +0 -79
- data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/cache.rb +0 -112
- data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/updater.rb +0 -80
- data/lib/bundler/vendor/compact_index_client/lib/compact_index_client/version.rb +0 -4
- data/lib/bundler/vendor/postit/lib/postit.rb +0 -15
- data/lib/bundler/vendor/postit/lib/postit/environment.rb +0 -44
- data/lib/bundler/vendor/postit/lib/postit/installer.rb +0 -28
- data/lib/bundler/vendor/postit/lib/postit/parser.rb +0 -21
- data/lib/bundler/vendor/postit/lib/postit/setup.rb +0 -12
- data/lib/bundler/vendor/postit/lib/postit/version.rb +0 -3
@@ -10,8 +10,8 @@ class Bundler::Thor
|
|
10
10
|
|
11
11
|
type = options[:type]
|
12
12
|
|
13
|
-
|
14
|
-
|
13
|
+
raise ArgumentError, "#{class_name} name can't be nil." if name.nil?
|
14
|
+
raise ArgumentError, "Type :#{type} is not valid for #{class_name.downcase}s." if type && !valid_type?(type)
|
15
15
|
|
16
16
|
@name = name.to_s
|
17
17
|
@description = options[:desc]
|
@@ -44,11 +44,8 @@ class Bundler::Thor
|
|
44
44
|
protected
|
45
45
|
|
46
46
|
def validate!
|
47
|
-
if required? && !default.nil?
|
48
|
-
|
49
|
-
elsif @enum && !@enum.is_a?(Array)
|
50
|
-
fail ArgumentError, "An argument cannot have an enum other than an array."
|
51
|
-
end
|
47
|
+
raise ArgumentError, "An argument cannot be required and have default value." if required? && !default.nil?
|
48
|
+
raise ArgumentError, "An argument cannot have an enum other than an array." if @enum && !@enum.is_a?(Array)
|
52
49
|
end
|
53
50
|
|
54
51
|
def valid_type?(type)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class Bundler::Thor
|
2
2
|
class Arguments #:nodoc: # rubocop:disable ClassLength
|
3
|
-
NUMERIC = /(\d*\.\d+|\d+)/
|
3
|
+
NUMERIC = /[-+]?(\d*\.\d+|\d+)/
|
4
4
|
|
5
5
|
# Receives an array of args and returns two arrays, one with arguments
|
6
6
|
# and one with switches.
|
@@ -24,7 +24,8 @@ class Bundler::Thor
|
|
24
24
|
# Takes an array of Bundler::Thor::Argument objects.
|
25
25
|
#
|
26
26
|
def initialize(arguments = [])
|
27
|
-
@assigns
|
27
|
+
@assigns = {}
|
28
|
+
@non_assigned_required = []
|
28
29
|
@switches = arguments
|
29
30
|
|
30
31
|
arguments.each do |argument|
|
@@ -49,7 +50,7 @@ class Bundler::Thor
|
|
49
50
|
@assigns
|
50
51
|
end
|
51
52
|
|
52
|
-
def remaining
|
53
|
+
def remaining
|
53
54
|
@pile
|
54
55
|
end
|
55
56
|
|
@@ -73,7 +74,7 @@ class Bundler::Thor
|
|
73
74
|
end
|
74
75
|
|
75
76
|
def unshift(arg)
|
76
|
-
if arg.
|
77
|
+
if arg.is_a?(Array)
|
77
78
|
@pile = arg + @pile
|
78
79
|
else
|
79
80
|
@pile.unshift(arg)
|
@@ -99,6 +100,7 @@ class Bundler::Thor
|
|
99
100
|
|
100
101
|
while current_is_value? && peek.include?(":")
|
101
102
|
key, value = shift.split(":", 2)
|
103
|
+
raise MalformattedArgumentError, "You can't specify '#{key}' more than once in option '#{name}'; got #{key}:#{hash[key]} and #{key}:#{value}" if hash.include? key
|
102
104
|
hash[key] = value
|
103
105
|
end
|
104
106
|
hash
|
@@ -128,13 +130,13 @@ class Bundler::Thor
|
|
128
130
|
return shift if peek.is_a?(Numeric)
|
129
131
|
|
130
132
|
unless peek =~ NUMERIC && $& == peek
|
131
|
-
|
133
|
+
raise MalformattedArgumentError, "Expected numeric value for '#{name}'; got #{peek.inspect}"
|
132
134
|
end
|
133
135
|
|
134
136
|
value = $&.index(".") ? shift.to_f : shift.to_i
|
135
137
|
if @switches.is_a?(Hash) && switch = @switches[name]
|
136
138
|
if switch.enum && !switch.enum.include?(value)
|
137
|
-
|
139
|
+
raise MalformattedArgumentError, "Expected '#{name}' to be one of #{switch.enum.join(', ')}; got #{value}"
|
138
140
|
end
|
139
141
|
end
|
140
142
|
value
|
@@ -150,9 +152,9 @@ class Bundler::Thor
|
|
150
152
|
nil
|
151
153
|
else
|
152
154
|
value = shift
|
153
|
-
if @switches.is_a?(Hash) && switch = @switches[name]
|
155
|
+
if @switches.is_a?(Hash) && switch = @switches[name]
|
154
156
|
if switch.enum && !switch.enum.include?(value)
|
155
|
-
|
157
|
+
raise MalformattedArgumentError, "Expected '#{name}' to be one of #{switch.enum.join(', ')}; got #{value}"
|
156
158
|
end
|
157
159
|
end
|
158
160
|
value
|
@@ -162,14 +164,12 @@ class Bundler::Thor
|
|
162
164
|
# Raises an error if @non_assigned_required array is not empty.
|
163
165
|
#
|
164
166
|
def check_requirement!
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
fail RequiredArgumentMissingError, "No value provided for required #{class_name} '#{names}'"
|
172
|
-
end
|
167
|
+
return if @non_assigned_required.empty?
|
168
|
+
names = @non_assigned_required.map do |o|
|
169
|
+
o.respond_to?(:switch_name) ? o.switch_name : o.human_name
|
170
|
+
end.join("', '")
|
171
|
+
class_name = self.class.name.split("::").last.downcase
|
172
|
+
raise RequiredArgumentMissingError, "No value provided for required #{class_name} '#{names}'"
|
173
173
|
end
|
174
174
|
end
|
175
175
|
end
|
@@ -5,6 +5,7 @@ class Bundler::Thor
|
|
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)
|
9
10
|
super
|
10
11
|
@lazy_default = options[:lazy_default]
|
@@ -40,31 +41,33 @@ class Bundler::Thor
|
|
40
41
|
#
|
41
42
|
# By default all options are optional, unless :required is given.
|
42
43
|
#
|
43
|
-
def self.parse(key, value)
|
44
|
+
def self.parse(key, value)
|
44
45
|
if key.is_a?(Array)
|
45
46
|
name, *aliases = key
|
46
47
|
else
|
47
|
-
name
|
48
|
+
name = key
|
49
|
+
aliases = []
|
48
50
|
end
|
49
51
|
|
50
52
|
name = name.to_s
|
51
53
|
default = value
|
52
54
|
|
53
55
|
type = case value
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
56
|
+
when Symbol
|
57
|
+
default = nil
|
58
|
+
if VALID_TYPES.include?(value)
|
59
|
+
value
|
60
|
+
elsif required = (value == :required) # rubocop:disable AssignmentInCondition
|
61
|
+
:string
|
62
|
+
end
|
63
|
+
when TrueClass, FalseClass
|
64
|
+
:boolean
|
65
|
+
when Numeric
|
66
|
+
:numeric
|
67
|
+
when Hash, Array, String
|
68
|
+
value.class.name.downcase.to_sym
|
69
|
+
end
|
70
|
+
|
68
71
|
new(name.to_s, :required => required, :type => type, :default => default, :aliases => aliases)
|
69
72
|
end
|
70
73
|
|
@@ -78,15 +81,15 @@ class Bundler::Thor
|
|
78
81
|
|
79
82
|
def usage(padding = 0)
|
80
83
|
sample = if banner && !banner.to_s.empty?
|
81
|
-
"#{switch_name}=#{banner}"
|
84
|
+
"#{switch_name}=#{banner}".dup
|
82
85
|
else
|
83
86
|
switch_name
|
84
87
|
end
|
85
88
|
|
86
|
-
sample = "[#{sample}]" unless required?
|
89
|
+
sample = "[#{sample}]".dup unless required?
|
87
90
|
|
88
91
|
if boolean?
|
89
|
-
sample << ", [#{dasherize(
|
92
|
+
sample << ", [#{dasherize('no-' + human_name)}]" unless (name == "force") || name.start_with?("no-")
|
90
93
|
end
|
91
94
|
|
92
95
|
if aliases.empty?
|
@@ -107,7 +110,25 @@ class Bundler::Thor
|
|
107
110
|
protected
|
108
111
|
|
109
112
|
def validate!
|
110
|
-
|
113
|
+
raise ArgumentError, "An option cannot be boolean and required." if boolean? && required?
|
114
|
+
validate_default_type! if @check_default_type
|
115
|
+
end
|
116
|
+
|
117
|
+
def validate_default_type!
|
118
|
+
default_type = case @default
|
119
|
+
when nil
|
120
|
+
return
|
121
|
+
when TrueClass, FalseClass
|
122
|
+
required? ? :string : :boolean
|
123
|
+
when Numeric
|
124
|
+
:numeric
|
125
|
+
when Symbol
|
126
|
+
:string
|
127
|
+
when Hash, Array, String
|
128
|
+
@default.class.name.downcase.to_sym
|
129
|
+
end
|
130
|
+
|
131
|
+
raise ArgumentError, "Expected #{@type} default value for '#{switch_name}'; got #{@default.inspect} (#{default_type})" unless default_type == @type
|
111
132
|
end
|
112
133
|
|
113
134
|
def dasherized?
|
@@ -119,7 +140,7 @@ class Bundler::Thor
|
|
119
140
|
end
|
120
141
|
|
121
142
|
def dasherize(str)
|
122
|
-
(str.length > 1 ? "--" : "-") + str.
|
143
|
+
(str.length > 1 ? "--" : "-") + str.tr("_", "-")
|
123
144
|
end
|
124
145
|
end
|
125
146
|
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,9 @@ 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 = []
|
44
47
|
|
45
48
|
options.each do |option|
|
46
49
|
@switches[option.switch_name] = option
|
@@ -52,7 +55,7 @@ class Bundler::Thor
|
|
52
55
|
end
|
53
56
|
end
|
54
57
|
|
55
|
-
def remaining
|
58
|
+
def remaining
|
56
59
|
@extra
|
57
60
|
end
|
58
61
|
|
@@ -109,7 +112,7 @@ class Bundler::Thor
|
|
109
112
|
end
|
110
113
|
end
|
111
114
|
|
112
|
-
check_requirement!
|
115
|
+
check_requirement! unless @disable_required_check
|
113
116
|
|
114
117
|
assigns = Bundler::Thor::CoreExt::HashWithIndifferentAccess.new(@assigns)
|
115
118
|
assigns.freeze
|
@@ -119,7 +122,7 @@ class Bundler::Thor
|
|
119
122
|
def check_unknown!
|
120
123
|
# an unknown option starts with - or -- and has no more --'s afterward.
|
121
124
|
unknown = @extra.select { |str| str =~ /^--?(?:(?!--).)*$/ }
|
122
|
-
|
125
|
+
raise UnknownArgumentError, "Unknown switches '#{unknown.join(', ')}'" unless unknown.empty?
|
123
126
|
end
|
124
127
|
|
125
128
|
protected
|
@@ -186,7 +189,7 @@ class Bundler::Thor
|
|
186
189
|
shift
|
187
190
|
false
|
188
191
|
else
|
189
|
-
|
192
|
+
!no_or_skip?(switch)
|
190
193
|
end
|
191
194
|
else
|
192
195
|
@switches.key?(switch) || !no_or_skip?(switch)
|
@@ -207,7 +210,7 @@ class Bundler::Thor
|
|
207
210
|
elsif option.lazy_default
|
208
211
|
return option.lazy_default
|
209
212
|
else
|
210
|
-
|
213
|
+
raise MalformattedArgumentError, "No value provided for option '#{switch}'"
|
211
214
|
end
|
212
215
|
end
|
213
216
|
|
@@ -2,19 +2,25 @@ require "bundler/vendor/thor/lib/thor"
|
|
2
2
|
require "bundler/vendor/thor/lib/thor/group"
|
3
3
|
require "bundler/vendor/thor/lib/thor/core_ext/io_binary_read"
|
4
4
|
|
5
|
-
require "fileutils"
|
6
|
-
require "open-uri"
|
7
5
|
require "yaml"
|
8
|
-
require "digest
|
6
|
+
require "digest"
|
9
7
|
require "pathname"
|
10
8
|
|
11
9
|
class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLength
|
12
10
|
map "-T" => :list, "-i" => :install, "-u" => :update, "-v" => :version
|
13
11
|
|
12
|
+
def self.banner(command, all = false, subcommand = false)
|
13
|
+
"thor " + command.formatted_usage(self, all, subcommand)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.exit_on_failure?
|
17
|
+
true
|
18
|
+
end
|
19
|
+
|
14
20
|
# Override Bundler::Thor#help so it can give information about any class and any method.
|
15
21
|
#
|
16
22
|
def help(meth = nil)
|
17
|
-
if meth && !
|
23
|
+
if meth && !respond_to?(meth)
|
18
24
|
initialize_thorfiles(meth)
|
19
25
|
klass, command = Bundler::Thor::Util.find_class_and_command_by_namespace(meth)
|
20
26
|
self.class.handle_no_command_error(command, false) if klass.nil?
|
@@ -45,16 +51,18 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
45
51
|
# command in said directory.
|
46
52
|
begin
|
47
53
|
if File.directory?(File.expand_path(name))
|
48
|
-
base
|
49
|
-
|
54
|
+
base = File.join(name, "main.thor")
|
55
|
+
package = :directory
|
56
|
+
contents = open(base, &:read)
|
50
57
|
else
|
51
|
-
base
|
52
|
-
|
58
|
+
base = name
|
59
|
+
package = :file
|
60
|
+
contents = open(name, &:read)
|
53
61
|
end
|
54
62
|
rescue OpenURI::HTTPError
|
55
63
|
raise Error, "Error opening URI '#{name}'"
|
56
64
|
rescue Errno::ENOENT
|
57
|
-
|
65
|
+
raise Error, "Error opening file '#{name}'"
|
58
66
|
end
|
59
67
|
|
60
68
|
say "Your Bundler::Thorfile contains:"
|
@@ -82,7 +90,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
82
90
|
end
|
83
91
|
|
84
92
|
thor_yaml[as] = {
|
85
|
-
:filename => Digest
|
93
|
+
:filename => Digest(:MD5).hexdigest(name + as),
|
86
94
|
:location => location,
|
87
95
|
:namespaces => Bundler::Thor::Util.namespaces_in_content(contents, base)
|
88
96
|
}
|
@@ -94,6 +102,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
94
102
|
if package == :file
|
95
103
|
File.open(destination, "w") { |f| f.puts contents }
|
96
104
|
else
|
105
|
+
require "fileutils"
|
97
106
|
FileUtils.cp_r(name, destination)
|
98
107
|
end
|
99
108
|
|
@@ -108,9 +117,10 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
108
117
|
|
109
118
|
desc "uninstall NAME", "Uninstall a named Bundler::Thor module"
|
110
119
|
def uninstall(name)
|
111
|
-
|
120
|
+
raise Error, "Can't find module '#{name}'" unless thor_yaml[name]
|
112
121
|
say "Uninstalling #{name}."
|
113
|
-
|
122
|
+
require "fileutils"
|
123
|
+
FileUtils.rm_rf(File.join(thor_root, (thor_yaml[name][:filename]).to_s))
|
114
124
|
|
115
125
|
thor_yaml.delete(name)
|
116
126
|
save_yaml(thor_yaml)
|
@@ -120,7 +130,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
120
130
|
|
121
131
|
desc "update NAME", "Update a Bundler::Thor file from its original location"
|
122
132
|
def update(name)
|
123
|
-
|
133
|
+
raise Error, "Can't find module '#{name}'" if !thor_yaml[name] || !thor_yaml[name][:location]
|
124
134
|
|
125
135
|
say "Updating '#{name}' from #{thor_yaml[name][:location]}"
|
126
136
|
|
@@ -128,6 +138,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
128
138
|
self.options = options.merge("as" => name)
|
129
139
|
|
130
140
|
if File.directory? File.expand_path(name)
|
141
|
+
require "fileutils"
|
131
142
|
FileUtils.rm_rf(File.join(thor_root, old_filename))
|
132
143
|
|
133
144
|
thor_yaml.delete(old_filename)
|
@@ -138,9 +149,7 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
138
149
|
filename = install(thor_yaml[name][:location])
|
139
150
|
end
|
140
151
|
|
141
|
-
unless filename == old_filename
|
142
|
-
File.delete(File.join(thor_root, old_filename))
|
143
|
-
end
|
152
|
+
File.delete(File.join(thor_root, old_filename)) unless filename == old_filename
|
144
153
|
end
|
145
154
|
|
146
155
|
desc "installed", "List the installed Bundler::Thor modules and commands"
|
@@ -168,10 +177,6 @@ class Bundler::Thor::Runner < Bundler::Thor #:nodoc: # rubocop:disable ClassLeng
|
|
168
177
|
|
169
178
|
private
|
170
179
|
|
171
|
-
def self.banner(command, all = false, subcommand = false)
|
172
|
-
"thor " + command.formatted_usage(self, all, subcommand)
|
173
|
-
end
|
174
|
-
|
175
180
|
def thor_root
|
176
181
|
Bundler::Thor::Util.thor_root
|
177
182
|
end
|
@@ -190,6 +195,7 @@ private
|
|
190
195
|
yaml_file = File.join(thor_root, "thor.yml")
|
191
196
|
|
192
197
|
unless File.exist?(yaml_file)
|
198
|
+
require "fileutils"
|
193
199
|
FileUtils.mkdir_p(thor_root)
|
194
200
|
yaml_file = File.join(thor_root, "thor.yml")
|
195
201
|
FileUtils.touch(yaml_file)
|
@@ -198,10 +204,6 @@ private
|
|
198
204
|
File.open(yaml_file, "w") { |f| f.puts yaml.to_yaml }
|
199
205
|
end
|
200
206
|
|
201
|
-
def self.exit_on_failure?
|
202
|
-
true
|
203
|
-
end
|
204
|
-
|
205
207
|
# Load the Bundler::Thorfiles. If relevant_to is supplied, looks for specific files
|
206
208
|
# in the thor_root instead of loading them all.
|
207
209
|
#
|
@@ -263,11 +265,11 @@ private
|
|
263
265
|
def thorfiles_relevant_to(meth)
|
264
266
|
lookup = [meth, meth.split(":")[0...-1].join(":")]
|
265
267
|
|
266
|
-
files = thor_yaml.select do |
|
268
|
+
files = thor_yaml.select do |_, v|
|
267
269
|
v[:namespaces] && !(v[:namespaces] & lookup).empty?
|
268
270
|
end
|
269
271
|
|
270
|
-
files.map { |
|
272
|
+
files.map { |_, v| File.join(thor_root, (v[:filename]).to_s) }
|
271
273
|
end
|
272
274
|
|
273
275
|
# Display information about the given klasses. If with_module is given,
|
@@ -276,7 +278,7 @@ private
|
|
276
278
|
def display_klasses(with_modules = false, show_internal = false, klasses = Bundler::Thor::Base.subclasses)
|
277
279
|
klasses -= [Bundler::Thor, Bundler::Thor::Runner, Bundler::Thor::Group] unless show_internal
|
278
280
|
|
279
|
-
|
281
|
+
raise Error, "No Bundler::Thor commands available" if klasses.empty?
|
280
282
|
show_modules if with_modules && !thor_yaml.empty?
|
281
283
|
|
282
284
|
list = Hash.new { |h, k| h[k] = [] }
|
@@ -306,8 +308,8 @@ private
|
|
306
308
|
alias_method :display_tasks, :display_commands
|
307
309
|
|
308
310
|
def show_modules #:nodoc:
|
309
|
-
info
|
310
|
-
labels = %w
|
311
|
+
info = []
|
312
|
+
labels = %w(Modules Namespaces)
|
311
313
|
|
312
314
|
info << labels
|
313
315
|
info << ["-" * labels[0].size, "-" * labels[1].size]
|