thor 0.18.1 → 0.19.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|