thor 0.16.0 → 1.2.1

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.
Files changed (93) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING.md +15 -0
  3. data/README.md +23 -6
  4. data/bin/thor +1 -1
  5. data/lib/thor/actions/create_file.rb +34 -35
  6. data/lib/thor/actions/create_link.rb +9 -5
  7. data/lib/thor/actions/directory.rb +33 -23
  8. data/lib/thor/actions/empty_directory.rb +75 -85
  9. data/lib/thor/actions/file_manipulation.rb +103 -36
  10. data/lib/thor/actions/inject_into_file.rb +46 -36
  11. data/lib/thor/actions.rb +90 -68
  12. data/lib/thor/base.rb +302 -244
  13. data/lib/thor/command.rb +142 -0
  14. data/lib/thor/core_ext/hash_with_indifferent_access.rb +52 -24
  15. data/lib/thor/error.rb +90 -10
  16. data/lib/thor/group.rb +70 -74
  17. data/lib/thor/invocation.rb +63 -55
  18. data/lib/thor/line_editor/basic.rb +37 -0
  19. data/lib/thor/line_editor/readline.rb +88 -0
  20. data/lib/thor/line_editor.rb +17 -0
  21. data/lib/thor/nested_context.rb +29 -0
  22. data/lib/thor/parser/argument.rb +24 -28
  23. data/lib/thor/parser/arguments.rb +110 -102
  24. data/lib/thor/parser/option.rb +53 -15
  25. data/lib/thor/parser/options.rb +174 -97
  26. data/lib/thor/parser.rb +4 -4
  27. data/lib/thor/rake_compat.rb +12 -11
  28. data/lib/thor/runner.rb +159 -155
  29. data/lib/thor/shell/basic.rb +216 -93
  30. data/lib/thor/shell/color.rb +53 -40
  31. data/lib/thor/shell/html.rb +61 -58
  32. data/lib/thor/shell.rb +29 -36
  33. data/lib/thor/util.rb +231 -213
  34. data/lib/thor/version.rb +1 -1
  35. data/lib/thor.rb +303 -166
  36. data/thor.gemspec +27 -24
  37. metadata +36 -226
  38. data/.gitignore +0 -44
  39. data/.rspec +0 -2
  40. data/.travis.yml +0 -7
  41. data/CHANGELOG.rdoc +0 -134
  42. data/Gemfile +0 -15
  43. data/Thorfile +0 -30
  44. data/bin/rake2thor +0 -86
  45. data/lib/thor/core_ext/dir_escape.rb +0 -0
  46. data/lib/thor/core_ext/file_binary_read.rb +0 -9
  47. data/lib/thor/core_ext/ordered_hash.rb +0 -100
  48. data/lib/thor/task.rb +0 -132
  49. data/spec/actions/create_file_spec.rb +0 -170
  50. data/spec/actions/create_link_spec.rb +0 -81
  51. data/spec/actions/directory_spec.rb +0 -149
  52. data/spec/actions/empty_directory_spec.rb +0 -130
  53. data/spec/actions/file_manipulation_spec.rb +0 -370
  54. data/spec/actions/inject_into_file_spec.rb +0 -135
  55. data/spec/actions_spec.rb +0 -331
  56. data/spec/base_spec.rb +0 -279
  57. data/spec/core_ext/hash_with_indifferent_access_spec.rb +0 -43
  58. data/spec/core_ext/ordered_hash_spec.rb +0 -115
  59. data/spec/exit_condition_spec.rb +0 -19
  60. data/spec/fixtures/application.rb +0 -2
  61. data/spec/fixtures/app{1}/README +0 -3
  62. data/spec/fixtures/bundle/execute.rb +0 -6
  63. data/spec/fixtures/bundle/main.thor +0 -1
  64. data/spec/fixtures/doc/%file_name%.rb.tt +0 -1
  65. data/spec/fixtures/doc/COMMENTER +0 -10
  66. data/spec/fixtures/doc/README +0 -3
  67. data/spec/fixtures/doc/block_helper.rb +0 -3
  68. data/spec/fixtures/doc/components/.empty_directory +0 -0
  69. data/spec/fixtures/doc/config.rb +0 -1
  70. data/spec/fixtures/doc/config.yaml.tt +0 -1
  71. data/spec/fixtures/enum.thor +0 -10
  72. data/spec/fixtures/group.thor +0 -114
  73. data/spec/fixtures/invoke.thor +0 -112
  74. data/spec/fixtures/path with spaces +0 -0
  75. data/spec/fixtures/script.thor +0 -190
  76. data/spec/fixtures/task.thor +0 -10
  77. data/spec/group_spec.rb +0 -216
  78. data/spec/invocation_spec.rb +0 -100
  79. data/spec/parser/argument_spec.rb +0 -53
  80. data/spec/parser/arguments_spec.rb +0 -66
  81. data/spec/parser/option_spec.rb +0 -202
  82. data/spec/parser/options_spec.rb +0 -330
  83. data/spec/rake_compat_spec.rb +0 -72
  84. data/spec/register_spec.rb +0 -135
  85. data/spec/runner_spec.rb +0 -241
  86. data/spec/shell/basic_spec.rb +0 -300
  87. data/spec/shell/color_spec.rb +0 -81
  88. data/spec/shell/html_spec.rb +0 -32
  89. data/spec/shell_spec.rb +0 -47
  90. data/spec/spec_helper.rb +0 -59
  91. data/spec/task_spec.rb +0 -80
  92. data/spec/thor_spec.rb +0 -418
  93. data/spec/util_spec.rb +0 -196
@@ -1,66 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
- require 'thor/parser'
3
-
4
- describe Thor::Arguments do
5
- def create(opts={})
6
- arguments = opts.map do |type, default|
7
- options = {:required => default.nil?, :type => type, :default => default}
8
- Thor::Argument.new(type.to_s, options)
9
- end
10
-
11
- arguments.sort!{ |a,b| b.name <=> a.name }
12
- @opt = Thor::Arguments.new(arguments)
13
- end
14
-
15
- def parse(*args)
16
- @opt.parse(args)
17
- end
18
-
19
- describe "#parse" do
20
- it "parses arguments in the given order" do
21
- create :string => nil, :numeric => nil
22
- parse("name", "13")["string"].should == "name"
23
- parse("name", "13")["numeric"].should == 13
24
- end
25
-
26
- it "accepts hashes" do
27
- create :string => nil, :hash => nil
28
- parse("product", "title:string", "age:integer")["string"].should == "product"
29
- parse("product", "title:string", "age:integer")["hash"].should == { "title" => "string", "age" => "integer"}
30
- parse("product", "url:http://www.amazon.com/gp/product/123")["hash"].should == { "url" => "http://www.amazon.com/gp/product/123" }
31
- end
32
-
33
- it "accepts arrays" do
34
- create :string => nil, :array => nil
35
- parse("product", "title", "age")["string"].should == "product"
36
- parse("product", "title", "age")["array"].should == %w(title age)
37
- end
38
-
39
- describe "with no inputs" do
40
- it "and no arguments returns an empty hash" do
41
- create
42
- parse.should == {}
43
- end
44
-
45
- it "and required arguments raises an error" do
46
- create :string => nil, :numeric => nil
47
- lambda { parse }.should raise_error(Thor::RequiredArgumentMissingError, "No value provided for required arguments 'string', 'numeric'")
48
- end
49
-
50
- it "and default arguments returns default values" do
51
- create :string => "name", :numeric => 13
52
- parse.should == { "string" => "name", "numeric" => 13 }
53
- end
54
- end
55
-
56
- it "returns the input if it's already parsed" do
57
- create :string => nil, :hash => nil, :array => nil, :numeric => nil
58
- parse("", 0, {}, []).should == { "string" => "", "numeric" => 0, "hash" => {}, "array" => [] }
59
- end
60
-
61
- it "returns the default value if none is provided" do
62
- create :string => "foo", :numeric => 3.0
63
- parse("bar").should == { "string" => "bar", "numeric" => 3.0 }
64
- end
65
- end
66
- end
@@ -1,202 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
- require 'thor/parser'
3
-
4
- describe Thor::Option do
5
- def parse(key, value)
6
- Thor::Option.parse(key, value)
7
- end
8
-
9
- def option(name, options={})
10
- @option ||= Thor::Option.new(name, options)
11
- end
12
-
13
- describe "#parse" do
14
-
15
- describe "with value as a symbol" do
16
- describe "and symbol is a valid type" do
17
- it "has type equals to the symbol" do
18
- parse(:foo, :string).type.should == :string
19
- parse(:foo, :numeric).type.should == :numeric
20
- end
21
-
22
- it "has not default value" do
23
- parse(:foo, :string).default.should be_nil
24
- parse(:foo, :numeric).default.should be_nil
25
- end
26
- end
27
-
28
- describe "equals to :required" do
29
- it "has type equals to :string" do
30
- parse(:foo, :required).type.should == :string
31
- end
32
-
33
- it "has no default value" do
34
- parse(:foo, :required).default.should be_nil
35
- end
36
- end
37
-
38
- describe "and symbol is not a reserved key" do
39
- it "has type equals to :string" do
40
- parse(:foo, :bar).type.should == :string
41
- end
42
-
43
- it "has no default value" do
44
- parse(:foo, :bar).default.should be_nil
45
- end
46
- end
47
- end
48
-
49
- describe "with value as hash" do
50
- it "has default type :hash" do
51
- parse(:foo, :a => :b).type.should == :hash
52
- end
53
-
54
- it "has default value equals to the hash" do
55
- parse(:foo, :a => :b).default.should == { :a => :b }
56
- end
57
- end
58
-
59
- describe "with value as array" do
60
- it "has default type :array" do
61
- parse(:foo, [:a, :b]).type.should == :array
62
- end
63
-
64
- it "has default value equals to the array" do
65
- parse(:foo, [:a, :b]).default.should == [:a, :b]
66
- end
67
- end
68
-
69
- describe "with value as string" do
70
- it "has default type :string" do
71
- parse(:foo, "bar").type.should == :string
72
- end
73
-
74
- it "has default value equals to the string" do
75
- parse(:foo, "bar").default.should == "bar"
76
- end
77
- end
78
-
79
- describe "with value as numeric" do
80
- it "has default type :numeric" do
81
- parse(:foo, 2.0).type.should == :numeric
82
- end
83
-
84
- it "has default value equals to the numeric" do
85
- parse(:foo, 2.0).default.should == 2.0
86
- end
87
- end
88
-
89
- describe "with value as boolean" do
90
- it "has default type :boolean" do
91
- parse(:foo, true).type.should == :boolean
92
- parse(:foo, false).type.should == :boolean
93
- end
94
-
95
- it "has default value equals to the boolean" do
96
- parse(:foo, true).default.should == true
97
- parse(:foo, false).default.should == false
98
- end
99
- end
100
-
101
- describe "with key as a symbol" do
102
- it "sets the name equals to the key" do
103
- parse(:foo, true).name.should == "foo"
104
- end
105
- end
106
-
107
- describe "with key as an array" do
108
- it "sets the first items in the array to the name" do
109
- parse([:foo, :bar, :baz], true).name.should == "foo"
110
- end
111
-
112
- it "sets all other items as aliases" do
113
- parse([:foo, :bar, :baz], true).aliases.should == [:bar, :baz]
114
- end
115
- end
116
- end
117
-
118
- it "returns the switch name" do
119
- option("foo").switch_name.should == "--foo"
120
- option("--foo").switch_name.should == "--foo"
121
- end
122
-
123
- it "returns the human name" do
124
- option("foo").human_name.should == "foo"
125
- option("--foo").human_name.should == "foo"
126
- end
127
-
128
- it "converts underscores to dashes" do
129
- option("foo_bar").switch_name.should == "--foo-bar"
130
- end
131
-
132
- it "can be required and have default values" do
133
- option = option("foo", :required => true, :type => :string, :default => "bar")
134
- option.default.should == "bar"
135
- option.should be_required
136
- end
137
-
138
- it "cannot be required and have type boolean" do
139
- lambda {
140
- option("foo", :required => true, :type => :boolean)
141
- }.should raise_error(ArgumentError, "An option cannot be boolean and required.")
142
- end
143
-
144
- it "allows type predicates" do
145
- parse(:foo, :string).should be_string
146
- parse(:foo, :boolean).should be_boolean
147
- parse(:foo, :numeric).should be_numeric
148
- end
149
-
150
- it "raises an error on method missing" do
151
- lambda {
152
- parse(:foo, :string).unknown?
153
- }.should raise_error(NoMethodError)
154
- end
155
-
156
- describe "#usage" do
157
-
158
- it "returns usage for string types" do
159
- parse(:foo, :string).usage.should == "[--foo=FOO]"
160
- end
161
-
162
- it "returns usage for numeric types" do
163
- parse(:foo, :numeric).usage.should == "[--foo=N]"
164
- end
165
-
166
- it "returns usage for array types" do
167
- parse(:foo, :array).usage.should == "[--foo=one two three]"
168
- end
169
-
170
- it "returns usage for hash types" do
171
- parse(:foo, :hash).usage.should == "[--foo=key:value]"
172
- end
173
-
174
- it "returns usage for boolean types" do
175
- parse(:foo, :boolean).usage.should == "[--foo]"
176
- end
177
-
178
- it "uses padding when no aliases is given" do
179
- parse(:foo, :boolean).usage(4).should == " [--foo]"
180
- end
181
-
182
- it "uses banner when supplied" do
183
- option(:foo, :required => false, :type => :string, :banner => "BAR").usage.should == "[--foo=BAR]"
184
- end
185
-
186
- it "checkes when banner is an empty string" do
187
- option(:foo, :required => false, :type => :string, :banner => "").usage.should == "[--foo]"
188
- end
189
-
190
- describe "with required values" do
191
- it "does not show the usage between brackets" do
192
- parse(:foo, :required).usage.should == "--foo=FOO"
193
- end
194
- end
195
-
196
- describe "with aliases" do
197
- it "does not show the usage between brackets" do
198
- parse([:foo, "-f", "-b"], :required).usage.should == "-f, -b, --foo=FOO"
199
- end
200
- end
201
- end
202
- end
@@ -1,330 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
- require 'thor/parser'
3
-
4
- describe Thor::Options do
5
- def create(opts, defaults={})
6
- opts.each do |key, value|
7
- opts[key] = Thor::Option.parse(key, value) unless value.is_a?(Thor::Option)
8
- end
9
-
10
- @opt = Thor::Options.new(opts, defaults)
11
- end
12
-
13
- def parse(*args)
14
- @opt.parse(args.flatten)
15
- end
16
-
17
- def check_unknown!
18
- @opt.check_unknown!
19
- end
20
-
21
- describe "#to_switches" do
22
- it "turns true values into a flag" do
23
- Thor::Options.to_switches(:color => true).should == "--color"
24
- end
25
-
26
- it "ignores nil" do
27
- Thor::Options.to_switches(:color => nil).should == ""
28
- end
29
-
30
- it "ignores false" do
31
- Thor::Options.to_switches(:color => false).should == ""
32
- end
33
-
34
- it "writes --name value for anything else" do
35
- Thor::Options.to_switches(:format => "specdoc").should == '--format "specdoc"'
36
- end
37
-
38
- it "joins several values" do
39
- switches = Thor::Options.to_switches(:color => true, :foo => "bar").split(' ').sort
40
- switches.should == ['"bar"', "--color", "--foo"]
41
- end
42
-
43
- it "accepts arrays" do
44
- Thor::Options.to_switches(:count => [1,2,3]).should == "--count 1 2 3"
45
- end
46
-
47
- it "accepts hashes" do
48
- Thor::Options.to_switches(:count => {:a => :b}).should == "--count a:b"
49
- end
50
-
51
- it "accepts underscored options" do
52
- Thor::Options.to_switches(:under_score_option => "foo bar").should == '--under_score_option "foo bar"'
53
- end
54
-
55
- end
56
-
57
- describe "#parse" do
58
- it "allows multiple aliases for a given switch" do
59
- create ["--foo", "--bar", "--baz"] => :string
60
- parse("--foo", "12")["foo"].should == "12"
61
- parse("--bar", "12")["foo"].should == "12"
62
- parse("--baz", "12")["foo"].should == "12"
63
- end
64
-
65
- it "allows custom short names" do
66
- create "-f" => :string
67
- parse("-f", "12").should == {"f" => "12"}
68
- end
69
-
70
- it "allows custom short-name aliases" do
71
- create ["--bar", "-f"] => :string
72
- parse("-f", "12").should == {"bar" => "12"}
73
- end
74
-
75
- it "accepts conjoined short switches" do
76
- create ["--foo", "-f"] => true, ["--bar", "-b"] => true, ["--app", "-a"] => true
77
- opts = parse("-fba")
78
- opts["foo"].should be_true
79
- opts["bar"].should be_true
80
- opts["app"].should be_true
81
- end
82
-
83
- it "accepts conjoined short switches with input" do
84
- create ["--foo", "-f"] => true, ["--bar", "-b"] => true, ["--app", "-a"] => :required
85
- opts = parse "-fba", "12"
86
- opts["foo"].should be_true
87
- opts["bar"].should be_true
88
- opts["app"].should == "12"
89
- end
90
-
91
- it "returns the default value if none is provided" do
92
- create :foo => "baz", :bar => :required
93
- parse("--bar", "boom")["foo"].should == "baz"
94
- end
95
-
96
- it "returns the default value from defaults hash to required arguments" do
97
- create Hash[:bar => :required], Hash[:bar => "baz"]
98
- parse["bar"].should == "baz"
99
- end
100
-
101
- it "gives higher priority to defaults given in the hash" do
102
- create Hash[:bar => true], Hash[:bar => false]
103
- parse["bar"].should == false
104
- end
105
-
106
- it "raises an error for unknown switches" do
107
- create :foo => "baz", :bar => :required
108
- parse("--bar", "baz", "--baz", "unknown")
109
- lambda { check_unknown! }.should raise_error(Thor::UnknownArgumentError, "Unknown switches '--baz'")
110
- end
111
-
112
- it "skips leading non-switches" do
113
- create(:foo => "baz")
114
-
115
- parse("asdf", "--foo", "bar").should == {"foo" => "bar"}
116
- end
117
-
118
- it "correctly recognizes things that look kind of like options, but aren't, as not options" do
119
- create(:foo => "baz")
120
- parse("--asdf---asdf", "baz", "--foo", "--asdf---dsf--asdf").should == {"foo" => "--asdf---dsf--asdf"}
121
- check_unknown!
122
- end
123
-
124
- it "accepts underscores in commandline args hash for boolean" do
125
- create :foo_bar => :boolean
126
- parse("--foo_bar")["foo_bar"].should == true
127
- parse("--no_foo_bar")["foo_bar"].should == false
128
- end
129
-
130
- it "accepts underscores in commandline args hash for strings" do
131
- create :foo_bar => :string, :baz_foo => :string
132
- parse("--foo_bar", "baz")["foo_bar"].should == "baz"
133
- parse("--baz_foo", "foo bar")["baz_foo"].should == "foo bar"
134
- end
135
-
136
- describe "with no input" do
137
- it "and no switches returns an empty hash" do
138
- create({})
139
- parse.should == {}
140
- end
141
-
142
- it "and several switches returns an empty hash" do
143
- create "--foo" => :boolean, "--bar" => :string
144
- parse.should == {}
145
- end
146
-
147
- it "and a required switch raises an error" do
148
- create "--foo" => :required
149
- lambda { parse }.should raise_error(Thor::RequiredArgumentMissingError, "No value provided for required options '--foo'")
150
- end
151
- end
152
-
153
- describe "with one required and one optional switch" do
154
- before do
155
- create "--foo" => :required, "--bar" => :boolean
156
- end
157
-
158
- it "raises an error if the required switch has no argument" do
159
- lambda { parse("--foo") }.should raise_error(Thor::MalformattedArgumentError)
160
- end
161
-
162
- it "raises an error if the required switch isn't given" do
163
- lambda { parse("--bar") }.should raise_error(Thor::RequiredArgumentMissingError)
164
- end
165
-
166
- it "raises an error if the required switch is set to nil" do
167
- lambda { parse("--no-foo") }.should raise_error(Thor::RequiredArgumentMissingError)
168
- end
169
-
170
- it "does not raises an error if the required option has a default value" do
171
- options = {:required => true, :type => :string, :default => "baz"}
172
- create :foo => Thor::Option.new("foo", options), :bar => :boolean
173
- lambda { parse("--bar") }.should_not raise_error
174
- end
175
- end
176
-
177
- describe "with :string type" do
178
- before do
179
- create ["--foo", "-f"] => :required
180
- end
181
-
182
- it "accepts a switch <value> assignment" do
183
- parse("--foo", "12")["foo"].should == "12"
184
- end
185
-
186
- it "accepts a switch=<value> assignment" do
187
- parse("-f=12")["foo"].should == "12"
188
- parse("--foo=12")["foo"].should == "12"
189
- parse("--foo=bar=baz")["foo"].should == "bar=baz"
190
- end
191
-
192
- it "must accept underscores switch=value assignment" do
193
- create :foo_bar => :required
194
- parse("--foo_bar=http://example.com/under_score/")["foo_bar"].should == "http://example.com/under_score/"
195
- end
196
-
197
- it "accepts a --no-switch format" do
198
- create "--foo" => "bar"
199
- parse("--no-foo")["foo"].should be_nil
200
- end
201
-
202
- it "does not consume an argument for --no-switch format" do
203
- create "--cheese" => :string
204
- parse('burger', '--no-cheese', 'fries')["cheese"].should be_nil
205
- end
206
-
207
- it "accepts a --switch format on non required types" do
208
- create "--foo" => :string
209
- parse("--foo")["foo"].should == "foo"
210
- end
211
-
212
- it "accepts a --switch format on non required types with default values" do
213
- create "--baz" => :string, "--foo" => "bar"
214
- parse("--baz", "bang", "--foo")["foo"].should == "bar"
215
- end
216
-
217
- it "overwrites earlier values with later values" do
218
- parse("--foo=bar", "--foo", "12")["foo"].should == "12"
219
- parse("--foo", "12", "--foo", "13")["foo"].should == "13"
220
- end
221
- end
222
-
223
- describe "with :boolean type" do
224
- before do
225
- create "--foo" => false
226
- end
227
-
228
- it "accepts --opt assignment" do
229
- parse("--foo")["foo"].should == true
230
- parse("--foo", "--bar")["foo"].should == true
231
- end
232
-
233
- it "uses the default value if no switch is given" do
234
- parse("")["foo"].should == false
235
- end
236
-
237
- it "accepts --opt=value assignment" do
238
- parse("--foo=true")["foo"].should == true
239
- parse("--foo=false")["foo"].should == false
240
- end
241
-
242
- it "accepts --[no-]opt variant, setting false for value" do
243
- parse("--no-foo")["foo"].should == false
244
- end
245
-
246
- it "accepts --[skip-]opt variant, setting false for value" do
247
- parse("--skip-foo")["foo"].should == false
248
- end
249
-
250
- it "will prefer 'no-opt' variant over inverting 'opt' if explicitly set" do
251
- create "--no-foo" => true
252
- parse("--no-foo")["no-foo"].should == true
253
- end
254
-
255
- it "will prefer 'skip-opt' variant over inverting 'opt' if explicitly set" do
256
- create "--skip-foo" => true
257
- parse("--skip-foo")["skip-foo"].should == true
258
- end
259
-
260
- it "accepts inputs in the human name format" do
261
- create :foo_bar => :boolean
262
- parse("--foo-bar")["foo_bar"].should == true
263
- parse("--no-foo-bar")["foo_bar"].should == false
264
- parse("--skip-foo-bar")["foo_bar"].should == false
265
- end
266
-
267
- it "doesn't eat the next part of the param" do
268
- create :foo => :boolean
269
- parse("--foo", "bar").should == {"foo" => true}
270
- @opt.remaining.should == ["bar"]
271
- end
272
- end
273
-
274
- describe "with :hash type" do
275
- before do
276
- create "--attributes" => :hash
277
- end
278
-
279
- it "accepts a switch=<value> assignment" do
280
- parse("--attributes=name:string", "age:integer")["attributes"].should == {"name" => "string", "age" => "integer"}
281
- end
282
-
283
- it "accepts a switch <value> assignment" do
284
- parse("--attributes", "name:string", "age:integer")["attributes"].should == {"name" => "string", "age" => "integer"}
285
- end
286
-
287
- it "must not mix values with other switches" do
288
- parse("--attributes", "name:string", "age:integer", "--baz", "cool")["attributes"].should == {"name" => "string", "age" => "integer"}
289
- end
290
- end
291
-
292
- describe "with :array type" do
293
- before do
294
- create "--attributes" => :array
295
- end
296
-
297
- it "accepts a switch=<value> assignment" do
298
- parse("--attributes=a", "b", "c")["attributes"].should == ["a", "b", "c"]
299
- end
300
-
301
- it "accepts a switch <value> assignment" do
302
- parse("--attributes", "a", "b", "c")["attributes"].should == ["a", "b", "c"]
303
- end
304
-
305
- it "must not mix values with other switches" do
306
- parse("--attributes", "a", "b", "c", "--baz", "cool")["attributes"].should == ["a", "b", "c"]
307
- end
308
- end
309
-
310
- describe "with :numeric type" do
311
- before do
312
- create "n" => :numeric, "m" => 5
313
- end
314
-
315
- it "accepts a -nXY assignment" do
316
- parse("-n12")["n"].should == 12
317
- end
318
-
319
- it "converts values to numeric types" do
320
- parse("-n", "3", "-m", ".5").should == {"n" => 3, "m" => 0.5}
321
- end
322
-
323
- it "raises error when value isn't numeric" do
324
- lambda { parse("-n", "foo") }.should raise_error(Thor::MalformattedArgumentError,
325
- "Expected numeric value for '-n'; got \"foo\"")
326
- end
327
- end
328
-
329
- end
330
- end
@@ -1,72 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
- require 'thor/rake_compat'
3
- require 'rake/tasklib'
4
-
5
- $main = self
6
-
7
- class RakeTask < Rake::TaskLib
8
- def initialize
9
- define
10
- end
11
-
12
- def define
13
- $main.instance_eval do
14
- desc "Say it's cool"
15
- task :cool do
16
- puts "COOL"
17
- end
18
-
19
- namespace :hiper_mega do
20
- task :super do
21
- puts "HIPER MEGA SUPER"
22
- end
23
- end
24
- end
25
- end
26
- end
27
-
28
- class ThorTask < Thor
29
- include Thor::RakeCompat
30
- RakeTask.new
31
- end
32
-
33
- describe Thor::RakeCompat do
34
- it "sets the rakefile application" do
35
- ["rake_compat_spec.rb", "Thorfile"].should include(Rake.application.rakefile)
36
- end
37
-
38
- it "adds rake tasks to thor classes too" do
39
- task = ThorTask.tasks["cool"]
40
- task.should be
41
- end
42
-
43
- it "uses rake tasks descriptions on thor" do
44
- ThorTask.tasks["cool"].description.should == "Say it's cool"
45
- end
46
-
47
- it "gets usage from rake tasks name" do
48
- ThorTask.tasks["cool"].usage.should == "cool"
49
- end
50
-
51
- it "uses non namespaced name as description if non is available" do
52
- ThorTask::HiperMega.tasks["super"].description.should == "super"
53
- end
54
-
55
- it "converts namespaces to classes" do
56
- ThorTask.const_get(:HiperMega).should == ThorTask::HiperMega
57
- end
58
-
59
- it "does not add tasks from higher namespaces in lowers namespaces" do
60
- ThorTask.tasks["super"].should_not be
61
- end
62
-
63
- it "invoking the thor task invokes the rake task" do
64
- capture(:stdout) do
65
- ThorTask.start ["cool"]
66
- end.should == "COOL\n"
67
-
68
- capture(:stdout) do
69
- ThorTask::HiperMega.start ["super"]
70
- end.should == "HIPER MEGA SUPER\n"
71
- end
72
- end