thor 0.18.1 → 0.19.0
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 +7 -0
- data/README.md +13 -7
- data/Thorfile +4 -5
- data/bin/thor +1 -1
- data/lib/thor.rb +78 -67
- data/lib/thor/actions.rb +57 -56
- data/lib/thor/actions/create_file.rb +33 -35
- data/lib/thor/actions/create_link.rb +2 -3
- data/lib/thor/actions/directory.rb +37 -38
- data/lib/thor/actions/empty_directory.rb +67 -69
- data/lib/thor/actions/file_manipulation.rb +17 -15
- data/lib/thor/actions/inject_into_file.rb +27 -29
- data/lib/thor/base.rb +193 -189
- data/lib/thor/command.rb +20 -23
- data/lib/thor/core_ext/hash_with_indifferent_access.rb +21 -24
- data/lib/thor/core_ext/io_binary_read.rb +2 -4
- data/lib/thor/core_ext/ordered_hash.rb +9 -11
- data/lib/thor/error.rb +5 -1
- data/lib/thor/group.rb +53 -54
- data/lib/thor/invocation.rb +44 -38
- data/lib/thor/line_editor.rb +17 -0
- data/lib/thor/line_editor/basic.rb +35 -0
- data/lib/thor/line_editor/readline.rb +88 -0
- data/lib/thor/parser.rb +4 -4
- data/lib/thor/parser/argument.rb +28 -29
- data/lib/thor/parser/arguments.rb +102 -98
- data/lib/thor/parser/option.rb +26 -22
- data/lib/thor/parser/options.rb +86 -86
- data/lib/thor/rake_compat.rb +9 -10
- data/lib/thor/runner.rb +141 -141
- data/lib/thor/shell.rb +27 -34
- data/lib/thor/shell/basic.rb +91 -63
- data/lib/thor/shell/color.rb +44 -43
- data/lib/thor/shell/html.rb +59 -60
- data/lib/thor/util.rb +24 -27
- data/lib/thor/version.rb +1 -1
- data/spec/actions/create_file_spec.rb +25 -27
- data/spec/actions/create_link_spec.rb +19 -18
- data/spec/actions/directory_spec.rb +31 -31
- data/spec/actions/empty_directory_spec.rb +18 -18
- data/spec/actions/file_manipulation_spec.rb +38 -28
- data/spec/actions/inject_into_file_spec.rb +13 -13
- data/spec/actions_spec.rb +43 -43
- data/spec/base_spec.rb +45 -38
- data/spec/command_spec.rb +13 -14
- data/spec/core_ext/hash_with_indifferent_access_spec.rb +19 -19
- data/spec/core_ext/ordered_hash_spec.rb +6 -6
- data/spec/exit_condition_spec.rb +4 -4
- data/spec/fixtures/invoke.thor +19 -0
- data/spec/fixtures/script.thor +1 -1
- data/spec/group_spec.rb +30 -24
- data/spec/helper.rb +28 -15
- data/spec/invocation_spec.rb +39 -19
- data/spec/line_editor/basic_spec.rb +28 -0
- data/spec/line_editor/readline_spec.rb +69 -0
- data/spec/line_editor_spec.rb +43 -0
- data/spec/parser/argument_spec.rb +12 -12
- data/spec/parser/arguments_spec.rb +11 -11
- data/spec/parser/option_spec.rb +33 -25
- data/spec/parser/options_spec.rb +66 -52
- data/spec/quality_spec.rb +75 -0
- data/spec/rake_compat_spec.rb +10 -10
- data/spec/register_spec.rb +60 -30
- data/spec/runner_spec.rb +67 -62
- data/spec/sandbox/application.rb +2 -0
- data/spec/sandbox/app{1}/README +3 -0
- data/spec/sandbox/bundle/execute.rb +6 -0
- data/spec/sandbox/bundle/main.thor +1 -0
- data/spec/sandbox/command.thor +10 -0
- data/spec/sandbox/doc/%file_name%.rb.tt +1 -0
- data/spec/sandbox/doc/COMMENTER +11 -0
- data/spec/sandbox/doc/README +3 -0
- data/spec/sandbox/doc/block_helper.rb +3 -0
- data/spec/sandbox/doc/config.rb +1 -0
- data/spec/sandbox/doc/config.yaml.tt +1 -0
- data/spec/sandbox/doc/excluding/%file_name%.rb.tt +1 -0
- data/spec/sandbox/enum.thor +10 -0
- data/spec/sandbox/group.thor +128 -0
- data/spec/sandbox/invoke.thor +131 -0
- data/spec/sandbox/path with spaces b/data/spec/sandbox/path with → spaces +0 -0
- data/spec/sandbox/preserve/script.sh +3 -0
- data/spec/sandbox/script.thor +220 -0
- data/spec/sandbox/subcommand.thor +17 -0
- data/spec/shell/basic_spec.rb +107 -86
- data/spec/shell/color_spec.rb +32 -8
- data/spec/shell/html_spec.rb +3 -4
- data/spec/shell_spec.rb +7 -7
- data/spec/subcommand_spec.rb +20 -2
- data/spec/thor_spec.rb +111 -97
- data/spec/util_spec.rb +30 -30
- data/thor.gemspec +14 -14
- metadata +69 -25
data/spec/shell_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "helper"
|
2
2
|
|
3
3
|
describe Thor::Shell do
|
4
4
|
def shell
|
@@ -7,29 +7,29 @@ describe Thor::Shell do
|
|
7
7
|
|
8
8
|
describe "#initialize" do
|
9
9
|
it "sets shell value" do
|
10
|
-
base = MyCounter.new [1, 2], {
|
10
|
+
base = MyCounter.new [1, 2], {}, :shell => shell
|
11
11
|
expect(base.shell).to eq(shell)
|
12
12
|
end
|
13
13
|
|
14
14
|
it "sets the base value on the shell if an accessor is available" do
|
15
|
-
base = MyCounter.new [1, 2], {
|
15
|
+
base = MyCounter.new [1, 2], {}, :shell => shell
|
16
16
|
expect(shell.base).to eq(base)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
describe "#shell" do
|
21
21
|
it "returns the shell in use" do
|
22
|
-
expect(MyCounter.new([1,2]).shell).to be_kind_of(Thor::Base.shell)
|
22
|
+
expect(MyCounter.new([1, 2]).shell).to be_kind_of(Thor::Base.shell)
|
23
23
|
end
|
24
24
|
|
25
25
|
it "uses $THOR_SHELL" do
|
26
26
|
class Thor::Shell::TestShell < Thor::Shell::Basic; end
|
27
27
|
|
28
28
|
expect(Thor::Base.shell).to eq(shell.class)
|
29
|
-
ENV[
|
29
|
+
ENV["THOR_SHELL"] = "TestShell"
|
30
30
|
Thor::Base.shell = nil
|
31
31
|
expect(Thor::Base.shell).to eq(Thor::Shell::TestShell)
|
32
|
-
ENV[
|
32
|
+
ENV["THOR_SHELL"] = ""
|
33
33
|
Thor::Base.shell = shell.class
|
34
34
|
expect(Thor::Base.shell).to eq(shell.class)
|
35
35
|
end
|
@@ -37,7 +37,7 @@ describe Thor::Shell do
|
|
37
37
|
|
38
38
|
describe "with_padding" do
|
39
39
|
it "uses padding for inside block outputs" do
|
40
|
-
base = MyCounter.new([1,2])
|
40
|
+
base = MyCounter.new([1, 2])
|
41
41
|
base.with_padding do
|
42
42
|
expect(capture(:stdout) { base.say_status :padding, "cool" }.strip).to eq("padding cool")
|
43
43
|
end
|
data/spec/subcommand_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "helper"
|
2
2
|
|
3
3
|
describe Thor do
|
4
4
|
|
@@ -18,13 +18,31 @@ describe Thor do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
it "ignores unknown options (the subcommand class will handle them)" do
|
21
|
-
expect(capture(:stdout) { Scripts::MyDefaults.start(%w[barn paint blue --coats 4])}.strip).to eq("4 coats of blue paint")
|
21
|
+
expect(capture(:stdout) { Scripts::MyDefaults.start(%w[barn paint blue --coats 4]) }.strip).to eq("4 coats of blue paint")
|
22
22
|
end
|
23
23
|
|
24
24
|
it "passes parsed options to subcommands" do
|
25
25
|
output = capture(:stdout) { TestSubcommands::Parent.start(%w[sub print_opt --opt output]) }
|
26
26
|
expect(output).to eq("output")
|
27
27
|
end
|
28
|
+
|
29
|
+
it "accepts the help switch and calls the help command on the subcommand" do
|
30
|
+
output = capture(:stdout) { TestSubcommands::Parent.start(%w[sub print_opt --help]) }
|
31
|
+
sub_help = capture(:stdout) { TestSubcommands::Parent.start(%w[sub help print_opt]) }
|
32
|
+
expect(output).to eq(sub_help)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "accepts the help short switch and calls the help command on the subcommand" do
|
36
|
+
output = capture(:stdout) { TestSubcommands::Parent.start(%w[sub print_opt -h]) }
|
37
|
+
sub_help = capture(:stdout) { TestSubcommands::Parent.start(%w[sub help print_opt]) }
|
38
|
+
expect(output).to eq(sub_help)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "the help command on the subcommand and after it should result in the same output" do
|
42
|
+
output = capture(:stdout) { TestSubcommands::Parent.start(%w[sub help])}
|
43
|
+
sub_help = capture(:stdout) { TestSubcommands::Parent.start(%w[help sub])}
|
44
|
+
expect(output).to eq(sub_help)
|
45
|
+
end
|
28
46
|
end
|
29
47
|
|
30
48
|
end
|
data/spec/thor_spec.rb
CHANGED
@@ -1,61 +1,61 @@
|
|
1
|
-
require
|
1
|
+
require "helper"
|
2
2
|
|
3
3
|
describe Thor do
|
4
4
|
describe "#method_option" do
|
5
5
|
it "sets options to the next method to be invoked" do
|
6
|
-
args = [
|
7
|
-
|
8
|
-
expect(options).to eq(
|
6
|
+
args = %w[foo bar --force]
|
7
|
+
_, options = MyScript.start(args)
|
8
|
+
expect(options).to eq("force" => true)
|
9
9
|
end
|
10
10
|
|
11
11
|
describe ":lazy_default" do
|
12
12
|
it "is absent when option is not specified" do
|
13
|
-
|
13
|
+
_, options = MyScript.start(%w[with_optional])
|
14
14
|
expect(options).to eq({})
|
15
15
|
end
|
16
16
|
|
17
17
|
it "sets a default that can be overridden for strings" do
|
18
|
-
|
19
|
-
expect(options).to eq(
|
18
|
+
_, options = MyScript.start(%w[with_optional --lazy])
|
19
|
+
expect(options).to eq("lazy" => "yes")
|
20
20
|
|
21
|
-
|
22
|
-
expect(options).to eq(
|
21
|
+
_, options = MyScript.start(%w[with_optional --lazy yesyes!])
|
22
|
+
expect(options).to eq("lazy" => "yesyes!")
|
23
23
|
end
|
24
24
|
|
25
25
|
it "sets a default that can be overridden for numerics" do
|
26
|
-
|
27
|
-
expect(options).to eq(
|
26
|
+
_, options = MyScript.start(%w[with_optional --lazy-numeric])
|
27
|
+
expect(options).to eq("lazy_numeric" => 42)
|
28
28
|
|
29
|
-
|
30
|
-
expect(options).to eq(
|
29
|
+
_, options = MyScript.start(%w[with_optional --lazy-numeric 20000])
|
30
|
+
expect(options).to eq("lazy_numeric" => 20_000)
|
31
31
|
end
|
32
32
|
|
33
33
|
it "sets a default that can be overridden for arrays" do
|
34
|
-
|
35
|
-
expect(options).to eq(
|
34
|
+
_, options = MyScript.start(%w[with_optional --lazy-array])
|
35
|
+
expect(options).to eq("lazy_array" => %w[eat at joes])
|
36
36
|
|
37
|
-
|
38
|
-
expect(options).to eq(
|
37
|
+
_, options = MyScript.start(%w[with_optional --lazy-array hello there])
|
38
|
+
expect(options).to eq("lazy_array" => %w[hello there])
|
39
39
|
end
|
40
40
|
|
41
41
|
it "sets a default that can be overridden for hashes" do
|
42
|
-
|
43
|
-
expect(options).to eq(
|
42
|
+
_, options = MyScript.start(%w[with_optional --lazy-hash])
|
43
|
+
expect(options).to eq("lazy_hash" => {"swedish" => "meatballs"})
|
44
44
|
|
45
|
-
|
46
|
-
expect(options).to eq(
|
45
|
+
_, options = MyScript.start(%w[with_optional --lazy-hash polish:sausage])
|
46
|
+
expect(options).to eq("lazy_hash" => {"polish" => "sausage"})
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
50
|
describe "when :for is supplied" do
|
51
51
|
it "updates an already defined command" do
|
52
|
-
|
52
|
+
_, options = MyChildScript.start(%w[animal horse --other=fish])
|
53
53
|
expect(options[:other]).to eq("fish")
|
54
54
|
end
|
55
55
|
|
56
56
|
describe "and the target is on the parent class" do
|
57
57
|
it "updates an already defined command" do
|
58
|
-
args = [
|
58
|
+
args = %w[example_default_command my_param --new-option=verified]
|
59
59
|
options = Scripts::MyScript.start(args)
|
60
60
|
expect(options[:new_option]).to eq("verified")
|
61
61
|
end
|
@@ -81,7 +81,7 @@ describe Thor do
|
|
81
81
|
end
|
82
82
|
|
83
83
|
it "invokes the default command if no command is specified even if switches are given" do
|
84
|
-
expect(MyScript.start([
|
84
|
+
expect(MyScript.start(%w[--with option])).to eq("with" => "option")
|
85
85
|
end
|
86
86
|
|
87
87
|
it "inherits the default command from parent" do
|
@@ -98,37 +98,37 @@ describe Thor do
|
|
98
98
|
|
99
99
|
desc "exec", "Run a command"
|
100
100
|
def exec(*args)
|
101
|
-
|
101
|
+
[options, args]
|
102
102
|
end
|
103
103
|
|
104
104
|
desc "boring", "An ordinary command"
|
105
105
|
def boring(*args)
|
106
|
-
|
106
|
+
[options, args]
|
107
107
|
end
|
108
108
|
end
|
109
109
|
|
110
110
|
it "passes remaining args to command when it encounters a non-option" do
|
111
|
-
expect(my_script.start(%w[exec command --verbose])).to eq [{}, [
|
111
|
+
expect(my_script.start(%w[exec command --verbose])).to eq [{}, %w[command --verbose]]
|
112
112
|
end
|
113
113
|
|
114
114
|
it "passes remaining args to command when it encounters an unknown option" do
|
115
|
-
expect(my_script.start(%w[exec --foo command --bar])).to eq [{}, [
|
115
|
+
expect(my_script.start(%w[exec --foo command --bar])).to eq [{}, %w[--foo command --bar]]
|
116
116
|
end
|
117
117
|
|
118
118
|
it "still accepts options that are given before non-options" do
|
119
|
-
expect(my_script.start(%w[exec --verbose command --foo])).to eq [{"verbose" => true}, [
|
119
|
+
expect(my_script.start(%w[exec --verbose command --foo])).to eq [{"verbose" => true}, %w[command --foo]]
|
120
120
|
end
|
121
121
|
|
122
122
|
it "still accepts options that require a value" do
|
123
|
-
expect(my_script.start(%w[exec --mode rashly command])).to eq [{"mode" => "rashly"}, [
|
123
|
+
expect(my_script.start(%w[exec --mode rashly command])).to eq [{"mode" => "rashly"}, %w[command]]
|
124
124
|
end
|
125
125
|
|
126
126
|
it "still passes everything after -- to command" do
|
127
|
-
expect(my_script.start(%w[exec -- --verbose])).to eq [{}, [
|
127
|
+
expect(my_script.start(%w[exec -- --verbose])).to eq [{}, %w[--verbose]]
|
128
128
|
end
|
129
129
|
|
130
130
|
it "does not affect ordinary commands" do
|
131
|
-
expect(my_script.start(%w[boring command --verbose])).to eq [{"verbose" => true}, [
|
131
|
+
expect(my_script.start(%w[boring command --verbose])).to eq [{"verbose" => true}, %w[command]]
|
132
132
|
end
|
133
133
|
|
134
134
|
context "when provided with multiple command names" do
|
@@ -136,9 +136,9 @@ describe Thor do
|
|
136
136
|
stop_on_unknown_option! :foo, :bar
|
137
137
|
end
|
138
138
|
it "affects all specified commands" do
|
139
|
-
expect(klass.stop_on_unknown_option?(
|
140
|
-
expect(klass.stop_on_unknown_option?(
|
141
|
-
expect(klass.stop_on_unknown_option?(
|
139
|
+
expect(klass.stop_on_unknown_option?(double(:name => "foo"))).to be true
|
140
|
+
expect(klass.stop_on_unknown_option?(double(:name => "bar"))).to be true
|
141
|
+
expect(klass.stop_on_unknown_option?(double(:name => "baz"))).to be false
|
142
142
|
end
|
143
143
|
end
|
144
144
|
|
@@ -148,21 +148,25 @@ describe Thor do
|
|
148
148
|
stop_on_unknown_option! :bar
|
149
149
|
end
|
150
150
|
it "affects all specified commands" do
|
151
|
-
expect(klass.stop_on_unknown_option?(
|
152
|
-
expect(klass.stop_on_unknown_option?(
|
153
|
-
expect(klass.stop_on_unknown_option?(
|
151
|
+
expect(klass.stop_on_unknown_option?(double(:name => "foo"))).to be true
|
152
|
+
expect(klass.stop_on_unknown_option?(double(:name => "bar"))).to be true
|
153
|
+
expect(klass.stop_on_unknown_option?(double(:name => "baz"))).to be false
|
154
154
|
end
|
155
155
|
end
|
156
|
+
|
157
|
+
it "doesn't break new" do
|
158
|
+
expect(my_script.new).to be_a(Thor)
|
159
|
+
end
|
156
160
|
end
|
157
161
|
|
158
162
|
describe "#map" do
|
159
163
|
it "calls the alias of a method if one is provided" do
|
160
|
-
expect(MyScript.start([
|
164
|
+
expect(MyScript.start(%w[-T fish])).to eq(%w[fish])
|
161
165
|
end
|
162
166
|
|
163
|
-
it "calls the alias of a method if several are provided via
|
164
|
-
expect(MyScript.start([
|
165
|
-
expect(MyScript.start([
|
167
|
+
it "calls the alias of a method if several are provided via #map" do
|
168
|
+
expect(MyScript.start(%w[-f fish])).to eq(["fish", {}])
|
169
|
+
expect(MyScript.start(%w[--foo fish])).to eq(["fish", {}])
|
166
170
|
end
|
167
171
|
|
168
172
|
it "inherits all mappings from parent" do
|
@@ -172,27 +176,27 @@ describe Thor do
|
|
172
176
|
|
173
177
|
describe "#package_name" do
|
174
178
|
it "provides a proper description for a command when the package_name is assigned" do
|
175
|
-
content = capture(:stdout) { PackageNameScript.start([
|
179
|
+
content = capture(:stdout) { PackageNameScript.start(%w[help]) }
|
176
180
|
expect(content).to match(/Baboon commands:/m)
|
177
181
|
end
|
178
182
|
|
179
183
|
# TODO: remove this, might be redundant, just wanted to prove full coverage
|
180
184
|
it "provides a proper description for a command when the package_name is NOT assigned" do
|
181
|
-
content = capture(:stdout) { MyScript.start([
|
185
|
+
content = capture(:stdout) { MyScript.start(%w[help]) }
|
182
186
|
expect(content).to match(/Commands:/m)
|
183
187
|
end
|
184
188
|
end
|
185
189
|
|
186
190
|
describe "#desc" do
|
187
191
|
it "provides description for a command" do
|
188
|
-
content = capture(:stdout) { MyScript.start([
|
192
|
+
content = capture(:stdout) { MyScript.start(%w[help]) }
|
189
193
|
expect(content).to match(/thor my_script:zoo\s+# zoo around/m)
|
190
194
|
end
|
191
195
|
|
192
196
|
it "provides no namespace if $thor_runner is false" do
|
193
197
|
begin
|
194
198
|
$thor_runner = false
|
195
|
-
content = capture(:stdout) { MyScript.start([
|
199
|
+
content = capture(:stdout) { MyScript.start(%w[help]) }
|
196
200
|
expect(content).to match(/thor zoo\s+# zoo around/m)
|
197
201
|
ensure
|
198
202
|
$thor_runner = true
|
@@ -201,17 +205,17 @@ describe Thor do
|
|
201
205
|
|
202
206
|
describe "when :for is supplied" do
|
203
207
|
it "overwrites a previous defined command" do
|
204
|
-
expect(capture(:stdout) { MyChildScript.start([
|
208
|
+
expect(capture(:stdout) { MyChildScript.start(%w[help]) }).to match(/animal KIND \s+# fish around/m)
|
205
209
|
end
|
206
210
|
end
|
207
211
|
|
208
212
|
describe "when :hide is supplied" do
|
209
213
|
it "does not show the command in help" do
|
210
|
-
expect(capture(:stdout) { MyScript.start([
|
214
|
+
expect(capture(:stdout) { MyScript.start(%w[help]) }).not_to match(/this is hidden/m)
|
211
215
|
end
|
212
216
|
|
213
|
-
it "but the command is still
|
214
|
-
expect(MyScript.start([
|
217
|
+
it "but the command is still invokable, does not show the command in help" do
|
218
|
+
expect(MyScript.start(%w[hidden yesyes])).to eq(%w[yesyes])
|
215
219
|
end
|
216
220
|
end
|
217
221
|
end
|
@@ -224,30 +228,30 @@ describe Thor do
|
|
224
228
|
end
|
225
229
|
|
226
230
|
it "overwrites default options if called on the method scope" do
|
227
|
-
args = [
|
231
|
+
args = %w[zoo --force --param feathers]
|
228
232
|
options = MyChildScript.start(args)
|
229
|
-
expect(options).to eq(
|
233
|
+
expect(options).to eq("force" => true, "param" => "feathers")
|
230
234
|
end
|
231
235
|
|
232
236
|
it "allows default options to be merged with method options" do
|
233
|
-
args = [
|
237
|
+
args = %w[animal bird --force --param 1.0 --other tweets]
|
234
238
|
arg, options = MyChildScript.start(args)
|
235
|
-
expect(arg).to eq(
|
236
|
-
expect(options).to eq(
|
239
|
+
expect(arg).to eq("bird")
|
240
|
+
expect(options).to eq("force" => true, "param" => 1.0, "other" => "tweets")
|
237
241
|
end
|
238
242
|
end
|
239
243
|
|
240
244
|
describe "#start" do
|
241
245
|
it "calls a no-param method when no params are passed" do
|
242
|
-
expect(MyScript.start([
|
246
|
+
expect(MyScript.start(%w[zoo])).to eq(true)
|
243
247
|
end
|
244
248
|
|
245
249
|
it "calls a single-param method when a single param is passed" do
|
246
|
-
expect(MyScript.start([
|
250
|
+
expect(MyScript.start(%w[animal fish])).to eq(%w[fish])
|
247
251
|
end
|
248
252
|
|
249
253
|
it "does not set options in attributes" do
|
250
|
-
expect(MyScript.start([
|
254
|
+
expect(MyScript.start(%w[with_optional --all])).to eq([nil, {"all" => true}, []])
|
251
255
|
end
|
252
256
|
|
253
257
|
it "raises an error if the wrong number of params are provided" do
|
@@ -255,56 +259,66 @@ describe Thor do
|
|
255
259
|
stderr = capture(:stderr) { Scripts::Arities.start(args) }
|
256
260
|
expect(stderr.strip).to eq(msg)
|
257
261
|
end
|
258
|
-
arity_asserter.call [
|
259
|
-
|
260
|
-
arity_asserter.call [
|
261
|
-
|
262
|
-
arity_asserter.call [
|
263
|
-
|
262
|
+
arity_asserter.call %w[zero_args one], %Q(ERROR: "thor zero_args" was called with arguments ["one"]
|
263
|
+
Usage: "thor scripts:arities:zero_args")
|
264
|
+
arity_asserter.call %w[one_arg], %Q(ERROR: "thor one_arg" was called with no arguments
|
265
|
+
Usage: "thor scripts:arities:one_arg ARG")
|
266
|
+
arity_asserter.call %w[one_arg one two], %Q(ERROR: "thor one_arg" was called with arguments ["one", "two"]
|
267
|
+
Usage: "thor scripts:arities:one_arg ARG")
|
268
|
+
arity_asserter.call %w[one_arg one two], %Q(ERROR: "thor one_arg" was called with arguments ["one", "two"]
|
269
|
+
Usage: "thor scripts:arities:one_arg ARG")
|
270
|
+
arity_asserter.call %w[two_args one], %Q(ERROR: "thor two_args" was called with arguments ["one"]
|
271
|
+
Usage: "thor scripts:arities:two_args ARG1 ARG2")
|
272
|
+
arity_asserter.call %w[optional_arg one two], %Q(ERROR: "thor optional_arg" was called with arguments ["one", "two"]
|
273
|
+
Usage: "thor scripts:arities:optional_arg [ARG]")
|
264
274
|
end
|
265
275
|
|
266
276
|
it "raises an error if the invoked command does not exist" do
|
267
|
-
expect(capture(:stderr) { Amazing.start([
|
277
|
+
expect(capture(:stderr) { Amazing.start(%w[animal]) }.strip).to eq('Could not find command "animal" in "amazing" namespace.')
|
268
278
|
end
|
269
279
|
|
270
280
|
it "calls method_missing if an unknown method is passed in" do
|
271
|
-
expect(MyScript.start([
|
281
|
+
expect(MyScript.start(%w[unk hello])).to eq([:unk, %w[hello]])
|
272
282
|
end
|
273
283
|
|
274
284
|
it "does not call a private method no matter what" do
|
275
|
-
expect(capture(:stderr) { MyScript.start([
|
285
|
+
expect(capture(:stderr) { MyScript.start(%w[what]) }.strip).to eq('Could not find command "what" in "my_script" namespace.')
|
276
286
|
end
|
277
287
|
|
278
288
|
it "uses command default options" do
|
279
|
-
options = MyChildScript.start([
|
280
|
-
expect(options).to eq(
|
289
|
+
options = MyChildScript.start(%w[animal fish]).last
|
290
|
+
expect(options).to eq("other" => "method default")
|
281
291
|
end
|
282
292
|
|
283
293
|
it "raises when an exception happens within the command call" do
|
284
|
-
expect{ MyScript.start([
|
294
|
+
expect { MyScript.start(%w[call_myself_with_wrong_arity]) }.to raise_error(ArgumentError)
|
285
295
|
end
|
286
296
|
|
287
297
|
context "when the user enters an unambiguous substring of a command" do
|
288
298
|
it "invokes a command" do
|
289
|
-
expect(MyScript.start([
|
299
|
+
expect(MyScript.start(%w[z])).to eq(MyScript.start(%w[zoo]))
|
290
300
|
end
|
291
301
|
|
292
302
|
it "invokes a command, even when there's an alias it resolves to the same command" do
|
293
|
-
expect(MyScript.start([
|
303
|
+
expect(MyScript.start(%w[hi arg])).to eq(MyScript.start(%w[hidden arg]))
|
294
304
|
end
|
295
305
|
|
296
306
|
it "invokes an alias" do
|
297
|
-
expect(MyScript.start([
|
307
|
+
expect(MyScript.start(%w[animal_pri])).to eq(MyScript.start(%w[zoo]))
|
298
308
|
end
|
299
309
|
end
|
300
310
|
|
301
311
|
context "when the user enters an ambiguous substring of a command" do
|
302
|
-
it "raises an exception that explains the ambiguity" do
|
303
|
-
|
312
|
+
it "raises an exception and displays a message that explains the ambiguity" do
|
313
|
+
shell = Thor::Base.shell.new
|
314
|
+
expect(shell).to receive(:error).with("Ambiguous command call matches [call_myself_with_wrong_arity, call_unexistent_method]")
|
315
|
+
MyScript.start(%w[call], :shell => shell)
|
304
316
|
end
|
305
317
|
|
306
318
|
it "raises an exception when there is an alias" do
|
307
|
-
|
319
|
+
shell = Thor::Base.shell.new
|
320
|
+
expect(shell).to receive(:error).with("Ambiguous command f matches [foo, fu]")
|
321
|
+
MyScript.start(%w[f], :shell => shell)
|
308
322
|
end
|
309
323
|
end
|
310
324
|
|
@@ -329,7 +343,7 @@ describe Thor do
|
|
329
343
|
end
|
330
344
|
|
331
345
|
it "uses the maximum terminal size to show commands" do
|
332
|
-
@shell.
|
346
|
+
expect(@shell).to receive(:terminal_width).and_return(80)
|
333
347
|
content = capture(:stdout) { MyScript.help(shell) }
|
334
348
|
expect(content).to match(/aaa\.\.\.$/)
|
335
349
|
end
|
@@ -371,9 +385,9 @@ END
|
|
371
385
|
end
|
372
386
|
|
373
387
|
it "raises an error if the command can't be found" do
|
374
|
-
expect
|
388
|
+
expect do
|
375
389
|
MyScript.command_help(shell, "unknown")
|
376
|
-
|
390
|
+
end.to raise_error(Thor::UndefinedCommandError, 'Could not find command "unknown" in "my_script" namespace.')
|
377
391
|
end
|
378
392
|
|
379
393
|
it "normalizes names before claiming they don't exist" do
|
@@ -393,36 +407,36 @@ HELP
|
|
393
407
|
end
|
394
408
|
|
395
409
|
it "doesn't assign the long description to the next command without one" do
|
396
|
-
expect(capture(:stdout)
|
410
|
+
expect(capture(:stdout) do
|
397
411
|
MyScript.command_help(shell, "name_with_dashes")
|
398
|
-
|
412
|
+
end).not_to match(/so very long/i)
|
399
413
|
end
|
400
414
|
end
|
401
415
|
|
402
416
|
describe "instance method" do
|
403
417
|
it "calls the class method" do
|
404
|
-
expect(capture(:stdout) { MyScript.start([
|
418
|
+
expect(capture(:stdout) { MyScript.start(%w[help]) }).to match(/Commands:/)
|
405
419
|
end
|
406
420
|
|
407
421
|
it "calls the class method" do
|
408
|
-
expect(capture(:stdout) { MyScript.start([
|
422
|
+
expect(capture(:stdout) { MyScript.start(%w[help foo]) }).to match(/Usage:/)
|
409
423
|
end
|
410
424
|
end
|
411
425
|
end
|
412
426
|
|
413
427
|
describe "when creating commands" do
|
414
428
|
it "prints a warning if a public method is created without description or usage" do
|
415
|
-
expect(capture(:stdout)
|
429
|
+
expect(capture(:stdout) do
|
416
430
|
klass = Class.new(Thor)
|
417
431
|
klass.class_eval "def hello_from_thor; end"
|
418
|
-
|
432
|
+
end).to match(/\[WARNING\] Attempted to create command "hello_from_thor" without usage or description/)
|
419
433
|
end
|
420
434
|
|
421
435
|
it "does not print if overwriting a previous command" do
|
422
|
-
expect(capture(:stdout)
|
436
|
+
expect(capture(:stdout) do
|
423
437
|
klass = Class.new(Thor)
|
424
438
|
klass.class_eval "def help; end"
|
425
|
-
|
439
|
+
end).to be_empty
|
426
440
|
end
|
427
441
|
end
|
428
442
|
|
@@ -437,9 +451,9 @@ HELP
|
|
437
451
|
end
|
438
452
|
end
|
439
453
|
|
440
|
-
expect(klass.start([
|
441
|
-
expect(klass.start([
|
442
|
-
expect(klass.start([
|
454
|
+
expect(klass.start(%w[hi jose])).to eq("Hi jose")
|
455
|
+
expect(klass.start(%w[hi jose --loud])).to eq("Hi JOSE")
|
456
|
+
expect(klass.start(%w[hi --loud jose])).to eq("Hi JOSE")
|
443
457
|
end
|
444
458
|
|
445
459
|
it "passes through unknown options" do
|
@@ -450,8 +464,8 @@ HELP
|
|
450
464
|
end
|
451
465
|
end
|
452
466
|
|
453
|
-
expect(klass.start([
|
454
|
-
expect(klass.start([
|
467
|
+
expect(klass.start(%w[unknown foo --bar baz bat --bam])).to eq(%w[foo --bar baz bat --bam])
|
468
|
+
expect(klass.start(%w[unknown --bar baz])).to eq(%w[--bar baz])
|
455
469
|
end
|
456
470
|
|
457
471
|
it "does not pass through unknown options with strict args" do
|
@@ -464,8 +478,8 @@ HELP
|
|
464
478
|
end
|
465
479
|
end
|
466
480
|
|
467
|
-
expect(klass.start([
|
468
|
-
expect(klass.start([
|
481
|
+
expect(klass.start(%w[unknown --bar baz])).to eq([])
|
482
|
+
expect(klass.start(%w[unknown foo --bar baz])).to eq(%w[foo])
|
469
483
|
end
|
470
484
|
|
471
485
|
it "strict args works in the inheritance chain" do
|
@@ -480,12 +494,12 @@ HELP
|
|
480
494
|
end
|
481
495
|
end
|
482
496
|
|
483
|
-
expect(klass.start([
|
484
|
-
expect(klass.start([
|
497
|
+
expect(klass.start(%w[unknown --bar baz])).to eq([])
|
498
|
+
expect(klass.start(%w[unknown foo --bar baz])).to eq(%w[foo])
|
485
499
|
end
|
486
500
|
|
487
501
|
it "send as a command name" do
|
488
|
-
expect(MyScript.start([
|
502
|
+
expect(MyScript.start(%w[send])).to eq(true)
|
489
503
|
end
|
490
504
|
end
|
491
505
|
end
|