choosy 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/README.markdown +229 -221
  2. data/Rakefile +21 -3
  3. data/examples/bar.rb +44 -0
  4. data/examples/foo.rb +198 -0
  5. data/examples/superfoo.rb +125 -0
  6. data/lib/VERSION +1 -1
  7. data/lib/choosy/argument.rb +51 -0
  8. data/lib/choosy/base_command.rb +22 -7
  9. data/lib/choosy/command.rb +12 -4
  10. data/lib/choosy/dsl/argument_builder.rb +88 -0
  11. data/lib/choosy/dsl/base_command_builder.rb +71 -56
  12. data/lib/choosy/dsl/command_builder.rb +14 -2
  13. data/lib/choosy/dsl/option_builder.rb +43 -83
  14. data/lib/choosy/dsl/super_command_builder.rb +37 -9
  15. data/lib/choosy/option.rb +13 -11
  16. data/lib/choosy/parse_result.rb +8 -27
  17. data/lib/choosy/parser.rb +20 -16
  18. data/lib/choosy/printing/color.rb +39 -21
  19. data/lib/choosy/printing/erb_printer.rb +12 -3
  20. data/lib/choosy/printing/formatting_element.rb +17 -0
  21. data/lib/choosy/printing/help_printer.rb +204 -117
  22. data/lib/choosy/printing/terminal.rb +53 -0
  23. data/lib/choosy/super_command.rb +6 -6
  24. data/lib/choosy/super_parser.rb +26 -15
  25. data/lib/choosy/verifier.rb +61 -6
  26. data/spec/choosy/base_command_spec.rb +27 -2
  27. data/spec/choosy/command_spec.rb +31 -9
  28. data/spec/choosy/dsl/argument_builder_spec.rb +180 -0
  29. data/spec/choosy/dsl/base_command_builder_spec.rb +87 -44
  30. data/spec/choosy/dsl/commmand_builder_spec.rb +15 -4
  31. data/spec/choosy/dsl/option_builder_spec.rb +101 -191
  32. data/spec/choosy/dsl/super_command_builder_spec.rb +34 -9
  33. data/spec/choosy/parser_spec.rb +30 -8
  34. data/spec/choosy/printing/color_spec.rb +19 -5
  35. data/spec/choosy/printing/help_printer_spec.rb +152 -73
  36. data/spec/choosy/printing/terminal_spec.rb +27 -0
  37. data/spec/choosy/super_command_spec.rb +17 -17
  38. data/spec/choosy/super_parser_spec.rb +20 -10
  39. data/spec/choosy/verifier_spec.rb +137 -47
  40. data/spec/integration/command-A_spec.rb +6 -6
  41. data/spec/integration/command-B_spec.rb +45 -0
  42. data/spec/integration/supercommand-A_spec.rb +33 -27
  43. data/spec/integration/supercommand-B_spec.rb +32 -0
  44. data/spec/spec_helpers.rb +8 -5
  45. metadata +95 -54
@@ -21,9 +21,31 @@ module Choosy::DSL
21
21
  @command.printer.should be_a(Choosy::Printing::HelpPrinter)
22
22
  end
23
23
 
24
+ it "should turn on color by default" do
25
+ @builder.printer :standard
26
+ @command.printer.color.should_not be_disabled
27
+ end
28
+
24
29
  it "should know how to turn off color" do
25
30
  @builder.printer :standard, :color => false
26
- @command.printer.color.disabled?.should be(true)
31
+ @command.printer.color.should be_disabled
32
+ end
33
+
34
+ it "should know how to set the maximum width" do
35
+ @builder.printer :standard, :max_width => 70
36
+ @command.printer.columns.should eql(70)
37
+ end
38
+
39
+ it "should know how to set the header attributes" do
40
+ @builder.printer :standard, :header_styles => [:bold, :green]
41
+ @command.printer.header_styles.should eql([:bold, :green])
42
+ end
43
+
44
+ it "should be able to set multiple properties of the printer" do
45
+ @builder.printer :standard, :max_width => 25, :header_styles => [:bold, :red], :color => false
46
+ @command.printer.color.should be_disabled
47
+ @command.printer.header_styles.should eql([:bold, :red])
48
+ @command.printer.columns.should eql(25)
27
49
  end
28
50
 
29
51
  class TestPrinter
@@ -47,6 +69,7 @@ module Choosy::DSL
47
69
  it "should be able to handle a given template" do
48
70
  @builder.printer :erb, :template => __FILE__
49
71
  @command.printer.should be_a(Choosy::Printing::ERBPrinter)
72
+ @command.printer.template.should eql(__FILE__)
50
73
  end
51
74
 
52
75
  it "should fail when the tempate file doesn't exist" do
@@ -70,41 +93,49 @@ module Choosy::DSL
70
93
  end
71
94
  end#summary
72
95
 
73
- describe :desc do
74
- it "should set the summary for this command" do
75
- @builder.desc "This is a description"
76
- @command.description.should match(/This is/)
96
+ describe :header do
97
+ it "should set a header for this command" do
98
+ @builder.header 'HEADER'
99
+ @command.listing[0].value.should eql('HEADER')
100
+ end
101
+
102
+ it "should set the attributes of the header effectively" do
103
+ @builder.header 'HEADER', :bold, :blue
104
+ @command.listing[0].styles.should eql([:bold, :blue])
77
105
  end
78
- end#desc
106
+ end#header
79
107
 
80
- describe :separator do
81
- it "should add a separator to the list of options for printing" do
82
- @builder.separator 'Required arguments'
83
- @command.listing[0].should eql('Required arguments')
108
+ describe :para do
109
+ it "should add a paragraph to the list of options for printing" do
110
+ @builder.para 'Required arguments'
111
+ @command.listing[0].value.should eql('Required arguments')
112
+ end
113
+
114
+ it "should leave the paragraph without attributes" do
115
+ @builder.para 'No attributes'
116
+ @command.listing[0].styles.should eql([])
84
117
  end
85
118
 
86
119
  it "should add an empty string to the listing when called with no arguments" do
87
- @builder.separator
88
- @command.listing[0].should eql('')
120
+ @builder.para
121
+ @command.listing[0].value.should be(nil)
122
+ end
123
+
124
+ it "should add attributes to the paragraph" do
125
+ @builder.para 'Here', :bold, :red
126
+ @command.listing[0].styles.should eql([:bold, :red])
89
127
  end
90
- end#separator
128
+ end#para
91
129
 
92
130
  describe :option do
93
131
  describe "when using just a name" do
94
132
  it "should set the name of the option" do
95
- o = @builder.option :opto do |o|
96
- o.short '-o'
133
+ o = @builder.option :opto do
134
+ short '-o'
97
135
  end
98
136
  o.name.should eql(:opto)
99
137
  end
100
138
 
101
- it "should handle a CommandBuilder block" do
102
- @builder.option :opto do |o|
103
- o.short '-s'
104
- o.should be_a(OptionBuilder)
105
- end
106
- end
107
-
108
139
  it "should fail when no block is given" do
109
140
  attempting {
110
141
  @builder.option "blah"
@@ -113,8 +144,8 @@ module Choosy::DSL
113
144
 
114
145
  it "should fail when the symbol is nil" do
115
146
  attempting {
116
- @builder.option nil do |o|
117
- o.short = '-o'
147
+ @builder.option nil do
148
+ short = '-o'
118
149
  end
119
150
  }.should raise_error(Choosy::ConfigurationError, /The option name was nil/)
120
151
  end
@@ -123,10 +154,10 @@ module Choosy::DSL
123
154
  describe "when using a hash" do
124
155
  describe "for dependencies" do
125
156
  it "should set the dependencies of that option" do
126
- o = @builder.option :o => [:s] do |o|
127
- o.short '-o'
157
+ o = @builder.option :o => [:s] do
158
+ short '-o'
128
159
  end
129
- o.dependent_options.should have(1).items
160
+ o.dependent_options.should have(1).item
130
161
  o.dependent_options[0].should eql(:s)
131
162
  end
132
163
  end
@@ -143,8 +174,8 @@ module Choosy::DSL
143
174
  end
144
175
 
145
176
  it "should still accept the block" do
146
- o = @builder.option :o => {:short => '-o'} do |s|
147
- s.desc "short"
177
+ o = @builder.option :o => {:short => '-o'} do
178
+ desc "short"
148
179
  end
149
180
  o.description.should eql('short')
150
181
  end
@@ -172,8 +203,8 @@ module Choosy::DSL
172
203
 
173
204
  describe "after the option block has been processed" do
174
205
  it "should call the 'finalize!' method on the builder" do
175
- o = @builder.option :o do |o|
176
- o.short '-o'
206
+ o = @builder.option :o do
207
+ short '-o'
177
208
  end
178
209
  o.cast_to.should eql(:boolean)
179
210
  end
@@ -219,8 +250,8 @@ module Choosy::DSL
219
250
  end
220
251
 
221
252
  it "should be able to capture block level data" do
222
- o = @builder.boolean :debug, "Show debug output" do |d|
223
- d.short '-D'
253
+ o = @builder.boolean :debug, "Show debug output" do
254
+ short '-D'
224
255
  end
225
256
  o.short_flag.should eql("-D")
226
257
  end
@@ -229,17 +260,29 @@ module Choosy::DSL
229
260
  o = @builder.boolean_ :debug, "Show debug output"
230
261
  o.short_flag.should be(nil)
231
262
  end
263
+
264
+ it "should set the default value if not set" do
265
+ o = @builder.boolean :debug, "Show debug"
266
+ o.default_value.should be(false)
267
+ end
232
268
  end#boolean
233
269
 
270
+ describe :enum do
271
+ it "should set the allowable values" do
272
+ o = @builder.enum :this, [:a, :b, :c], "this"
273
+ o.allowable_values.should eql([:a, :b, :c])
274
+ end
275
+ end
276
+
234
277
  describe :single do
235
278
  it "should be able to set the short flag" do
236
279
  o = @builder.single :count, "Show the count"
237
280
  o.short_flag.should eql('-c')
238
281
  end
239
282
 
240
- it "should be able to set the parameter name" do
283
+ it "should be able to set the metaname name" do
241
284
  o = @builder.single :count, "Show the count"
242
- o.flag_parameter.should eql('COUNT')
285
+ o.metaname.should eql('COUNT')
243
286
  end
244
287
  end#single
245
288
 
@@ -249,14 +292,14 @@ module Choosy::DSL
249
292
  o.short_flag.should eql('-f')
250
293
  end
251
294
 
252
- it "should be able to set the parameter name" do
295
+ it "should be able to set the metaname name" do
253
296
  o = @builder.multiple :file_names, "The file names"
254
- o.flag_parameter.should eql('FILE_NAMES+')
297
+ o.metaname.should eql('FILE_NAMES+')
255
298
  end
256
299
 
257
300
  it "should be able to yield a block" do
258
- o = @builder.multiple :file_names, "The file names" do |f|
259
- f.long '--files'
301
+ o = @builder.multiple :file_names, "The file names" do
302
+ long '--files'
260
303
  end
261
304
  o.long_flag.should eql('--files')
262
305
  end
@@ -268,9 +311,9 @@ module Choosy::DSL
268
311
  o = @builder.send(method, method, "Desc of #{method}")
269
312
  o.cast_to.should eql(Choosy::Converter.for(method))
270
313
  if o.cast_to == :boolean
271
- o.flag_parameter.should be(nil)
314
+ o.metaname.should be(nil)
272
315
  else
273
- o.flag_parameter.should eql(method.to_s.upcase)
316
+ o.metaname.should eql(method.to_s.upcase)
274
317
  end
275
318
  end
276
319
 
@@ -286,7 +329,7 @@ module Choosy::DSL
286
329
  plural = "#{method}s".to_sym
287
330
  o = @builder.send(plural, plural, "Desc of #{plural}")
288
331
  o.cast_to.should eql(Choosy::Converter.for(method))
289
- o.flag_parameter.should eql("#{plural.to_s.upcase}+")
332
+ o.metaname.should eql("#{plural.to_s.upcase}+")
290
333
  end
291
334
 
292
335
  it "#{method}s_" do
@@ -306,8 +349,8 @@ module Choosy::DSL
306
349
  end
307
350
 
308
351
  it "should allow you to use a block to alter the help message" do
309
- v = @builder.version 'blah' do |v|
310
- v.desc "Version"
352
+ v = @builder.version 'blah' do
353
+ desc "Version"
311
354
  end
312
355
  v.description.should eql("Version")
313
356
  end
@@ -66,14 +66,25 @@ module Choosy::DSL
66
66
  it "should fail if there is no block given" do
67
67
  attempting {
68
68
  @builder.arguments
69
- }.should raise_error(Choosy::ConfigurationError, /arguments/)
69
+ }.should_not raise_error
70
+ end
71
+
72
+ it "should pass in the block correctly" do
73
+ @builder.arguments do
74
+ metaname 'ARGS'
75
+ end
76
+ @command.arguments.metaname.should eql('ARGS')
70
77
  end
71
78
 
72
79
  it "should pass in the arguments to validate" do
73
- @builder.arguments do |args|
74
- args.should have(3).items
80
+ @builder.arguments do
81
+ validate do |args, options|
82
+ raise RuntimeError, "called"
83
+ end
75
84
  end
76
- @command.argument_validation.call([1, 2, 3])
85
+ attempting {
86
+ @command.arguments.validation_step.call([2, 2, 3], nil)
87
+ }.should raise_error(RuntimeError, "called")
77
88
  end
78
89
  end#arguments
79
90
  end
@@ -21,18 +21,18 @@ module Choosy::DSL
21
21
  end
22
22
 
23
23
  describe "and the arity" do
24
- it "should not be set without a parameter" do
24
+ it "should not be set without a metaname" do
25
25
  @builder.short '-s'
26
26
  @option.short_flag.should eql('-s')
27
27
  @option.arity.should be(nil)
28
28
  end
29
29
 
30
- it "should be set on STD+ parameter" do
30
+ it "should be set on STD+ metaname" do
31
31
  @builder.short '-s', 'STD+'
32
32
  @option.arity.should eql(1..1000)
33
33
  end
34
34
 
35
- it "should set single arity on STD parameter" do
35
+ it "should set single arity on STD metaname" do
36
36
  @builder.short '-s', 'STD'
37
37
  @option.arity.should eql(1..1)
38
38
  end
@@ -44,15 +44,15 @@ module Choosy::DSL
44
44
  end
45
45
  end
46
46
 
47
- describe "and the flag parameter" do
48
- it "on STD parameters" do
47
+ describe "and the flag metaname" do
48
+ it "on STD metanames" do
49
49
  @builder.short '-s', 'STD'
50
- @option.flag_parameter.should eql('STD')
50
+ @option.metaname.should eql('STD')
51
51
  end
52
52
 
53
- it "on STD+ parameters" do
53
+ it "on STD+ metanames" do
54
54
  @builder.short '-s', 'STD+'
55
- @option.flag_parameter.should eql('STD+')
55
+ @option.metaname.should eql('STD+')
56
56
  end
57
57
  end
58
58
  end#short
@@ -80,15 +80,15 @@ module Choosy::DSL
80
80
  end
81
81
  end#arity
82
82
 
83
- describe "and the flag parameter" do
84
- it "on STD parameters" do
83
+ describe "and the flag metaname" do
84
+ it "on STD metanames" do
85
85
  @builder.long '-s', 'STD'
86
- @option.flag_parameter.should eql('STD')
86
+ @option.metaname.should eql('STD')
87
87
  end
88
88
 
89
- it "on STD+ parameters" do
89
+ it "on STD+ metanames" do
90
90
  @builder.long '-s', 'STD+'
91
- @option.flag_parameter.should eql('STD+')
91
+ @option.metaname.should eql('STD+')
92
92
  end
93
93
  end
94
94
  end#long
@@ -106,7 +106,7 @@ module Choosy::DSL
106
106
 
107
107
  it "should leave the param nil when just the short flag is given" do
108
108
  @builder.flags '-s'
109
- @option.flag_parameter.should be(nil)
109
+ @option.metaname.should be(nil)
110
110
  end
111
111
 
112
112
  it "should be able to set the short when the long flag is given" do
@@ -119,14 +119,14 @@ module Choosy::DSL
119
119
  @option.long_flag.should eql('--short')
120
120
  end
121
121
 
122
- it "should leave the parameter empty when not given" do
122
+ it "should leave the metaname empty when not given" do
123
123
  @builder.flags '-s', '--short'
124
- @option.flag_parameter.should be(nil)
124
+ @option.metaname.should be(nil)
125
125
  end
126
126
 
127
- it "should set the parameter if given" do
127
+ it "should set the metaname if given" do
128
128
  @builder.flags '-s', '--short', 'SHORT'
129
- @option.flag_parameter.should eql('SHORT')
129
+ @option.metaname.should eql('SHORT')
130
130
  end
131
131
  end#flags
132
132
 
@@ -144,209 +144,69 @@ module Choosy::DSL
144
144
  end
145
145
  end#default
146
146
 
147
- describe :required do
148
- it "should set the option" do
149
- @builder.required
150
- @option.required?.should be(true)
151
- end
152
-
153
- it "should set the option on non-nil/non-true" do
154
- @builder.required 1
155
- @option.required?.should be(false)
156
- end
157
-
158
- it "should set the option on false" do
159
- @builder.required false
160
- @option.required?.should be(false)
161
- end
162
- end#required
163
-
164
- describe :param do
165
- it "should be able to set the name of the parameter" do
166
- @builder.param 'PARAM'
167
- @option.flag_parameter.should eql('PARAM')
168
- end
169
-
170
- it "should set the arity on STD+ to 1+" do
171
- @builder.param 'STD+'
172
- @option.arity.should eql(1..1000)
173
- end
174
-
175
- it "should set the arity on STD to 1" do
176
- @builder.param 'STD'
177
- @option.arity.should eql(1..1)
178
- end
179
- end#param
180
-
181
- describe :count do
182
- describe "when welformed" do
183
- it "should set :at_least the right arity" do
184
- @builder.count :at_least => 32
185
- @option.arity.should eql(32..1000)
186
- end
187
-
188
- it "should set :at_most the right arity" do
189
- @builder.count :at_most => 31
190
- @option.arity.should eql(1..31)
191
- end
192
-
193
- it "should set :once to the right arity" do
194
- @builder.count :once
195
- @option.arity.should eql(1..1)
196
- end
197
-
198
- it "should set :zero to the right arity" do
199
- @builder.count :zero
200
- @option.arity.should eql(0..0)
201
- end
202
-
203
- it "should set :none to the right arity" do
204
- @builder.count :none
205
- @option.arity.should eql(0..0)
206
- end
207
-
208
- it "should set a number exactly" do
209
- @builder.count 3
210
- @option.arity.should eql(3..3)
211
- end
212
- end
213
-
214
- describe "when malformed" do
215
- it "should fail when the :exactly isn't a number" do
216
- attempting {
217
- @builder.count :exactly => 'p'
218
- }.should raise_error(Choosy::ConfigurationError, /number/)
219
- end
220
-
221
- it "should fail when the :at_most isn't a number" do
222
- attempting {
223
- @builder.count :at_most => 'p'
224
- }.should raise_error(Choosy::ConfigurationError, /number/)
225
- end
226
-
227
- it "should fail when the :at_least isn't a number" do
228
- attempting {
229
- @builder.count :at_least => 'p'
230
- }.should raise_error(Choosy::ConfigurationError, /number/)
231
- end
232
-
233
- it "should fail when the :count isn't a number" do
234
- attempting {
235
- @builder.count 'p'
236
- }.should raise_error(Choosy::ConfigurationError, /number/)
237
- end
238
-
239
- it "should fail when the :at_least is greater than :at_most" do
240
- attempting {
241
- @builder.count :at_least => 3, :at_most => 2
242
- }.should raise_error(Choosy::ConfigurationError, /lower bound/)
243
- end
244
- end
245
- end#count
246
-
247
- describe :cast do
248
- it "should allow symbol casts" do
249
- @builder.cast :int
250
- @option.cast_to.should eql(:integer)
251
- end
252
-
253
- class CustomConverter
254
- def convert(value)
255
- end
256
- end
257
-
258
- it "should allow for custom conversions" do
259
- conv = CustomConverter.new
260
- @builder.cast conv
261
- @option.cast_to.should be(conv)
262
- end
263
-
264
- it "should fail if it doesn't know about a Type" do
265
- attempting {
266
- @builder.cast Choosy::Error
267
- }.should raise_error(Choosy::ConfigurationError, /Unknown conversion/)
268
- end
269
-
270
- it "should fail if it doesn't know about a symbol" do
271
- attempting {
272
- @builder.cast :unknown_type
273
- }.should raise_error(Choosy::ConfigurationError, /Unknown conversion/)
274
- end
275
- end#cast
276
-
277
- describe :fail do
147
+ describe :die do
278
148
  it "should format the error message with both flags" do
279
149
  @builder.short '-k'
280
150
  @builder.long '--keep', 'KEEP'
281
151
  attempting {
282
- @builder.fail "Didn't keep anything"
152
+ @builder.die "Didn't keep anything"
283
153
  }.should raise_error(Choosy::ValidationError, /-k\/--keep KEEP: Didn't keep anything/)
284
154
  end
285
155
 
286
156
  it "should set the format of the error with the short flag" do
287
157
  @builder.short '-k'
288
158
  attempting {
289
- @builder.fail "Didn't keep anything"
159
+ @builder.die "Didn't keep anything"
290
160
  }.should raise_error(Choosy::ValidationError, /-k: Didn't keep anything/)
291
161
  end
292
162
 
293
163
  it "should set the format of the long flag alone" do
294
164
  @builder.long '--keep'
295
165
  attempting {
296
- @builder.fail "Didn't keep anything"
166
+ @builder.die "Didn't keep anything"
297
167
  }.should raise_error(Choosy::ValidationError, /--keep: Didn't keep anything/)
298
168
  end
299
- end#fail
169
+ end#die
300
170
 
301
- describe :validate do
302
- it "should save the context of the validation in a Proc to call later" do
303
- @builder.validate do
304
- puts "Hi!"
305
- end
306
- @option.validation_step.should be_a(Proc)
307
- end
308
-
309
- it "should have access to the larger context when called" do
310
- value = nil
311
- @builder.validate do
312
- value = 'here'
313
- end
314
- @option.validation_step.call
315
- value.should eql('here')
171
+ describe :depends_on do
172
+ it "should be able to process multiple arguments" do
173
+ @builder.depends_on :a, :b
174
+ @option.dependent_options.should eql([:a, :b])
316
175
  end
317
- end#validate
318
176
 
319
- describe :finalize! do
320
- it "should set the arity if not already set" do
321
- @builder.short '-s'
322
- @builder.finalize!
323
- @option.arity.should eql(0..0)
177
+ it "should be able to process Array arguments" do
178
+ @builder.depends_on [:a, :b]
179
+ @option.dependent_options.should eql([:a, :b])
324
180
  end
181
+ end#depends_on
325
182
 
326
- it "should set the cast to :string on regular arguments" do
327
- @builder.short '-s', 'SHORT'
328
- @builder.finalize!
329
- @option.cast_to.should eql(:string)
183
+ describe :only do
184
+ it "should set the allowable_values for an option" do
185
+ @builder.only :this, :that, :other
186
+ @option.allowable_values.should eql([:this, :that, :other])
330
187
  end
188
+ end#only
331
189
 
332
- it "should set the cast to :boolean on single flags" do
333
- @builder.short '-s'
334
- @builder.finalize!
335
- @option.cast_to.should eql(:boolean)
190
+ describe :negate do
191
+ it "should set the default negation to 'no'" do
192
+ @builder.negate
193
+ @option.negated?.should be_true
194
+ @option.negation.should eql('no')
336
195
  end
337
- end#finalize!
338
196
 
339
- describe :dependencies do
340
- it "should be able to process multiple arguments" do
341
- @builder.dependencies :a, :b
342
- @option.dependent_options.should eql([:a, :b])
197
+ it "should set the the negation to a specific value" do
198
+ @builder.negate 'non'
199
+ @option.negated?.should be_true
200
+ @option.negation.should eql('non')
343
201
  end
344
202
 
345
- it "should be able to process Array arguments" do
346
- @builder.dependencies [:a, :b]
347
- @option.dependent_options.should eql([:a, :b])
203
+ it "should set the flag string for the negated value" do
204
+ @builder.flags '-s', '--short'
205
+ @builder.negate
206
+ @builder.finalize!
207
+ @option.negated.should eql("--no-short")
348
208
  end
349
- end#dependencies
209
+ end#negate
350
210
 
351
211
  describe :from_hash do
352
212
  it "should fail on unrecognized methods" do
@@ -382,5 +242,55 @@ module Choosy::DSL
382
242
  }.should raise_error(Choosy::ConfigurationError, /Only hash arguments allowed/)
383
243
  end
384
244
  end#from_hash
245
+
246
+ describe :finalize! do
247
+ it "should set the arity if not already set" do
248
+ @builder.short '-s'
249
+ @builder.finalize!
250
+ @option.arity.should eql(0..0)
251
+ end
252
+
253
+ it "should set the cast to :string on regular arguments" do
254
+ @builder.short '-s', 'SHORT'
255
+ @builder.finalize!
256
+ @option.cast_to.should eql(:string)
257
+ end
258
+
259
+ it "should set the cast to :boolean on single flags" do
260
+ @builder.short '-s'
261
+ @builder.finalize!
262
+ @option.cast_to.should eql(:boolean)
263
+ end
264
+
265
+ it "should fail when both boolean and restricted" do
266
+ @builder.short '-s'
267
+ @builder.only :a, :b
268
+ attempting{
269
+ @builder.finalize!
270
+ }.should raise_error(Choosy::ConfigurationError, /boolean and restricted/)
271
+ end
272
+
273
+ it "should fail when the argument is negated and not boolean" do
274
+ @builder.short '-s', 'SHORT'
275
+ @builder.negate
276
+ attempting {
277
+ @builder.finalize!
278
+ }.should raise_error(Choosy::ConfigurationError, /negate a non-boolean option/)
279
+ end
280
+
281
+ it "should fail when there is no long boolean option name to negate" do
282
+ @builder.short '-s'
283
+ @builder.negate
284
+ attempting {
285
+ @builder.finalize!
286
+ }.should raise_error(Choosy::ConfigurationError, /long flag is required for negation/)
287
+ end
288
+
289
+ it "should set the default value for booleans if not already set" do
290
+ @builder.short '-s'
291
+ @builder.finalize!
292
+ @option.default_value.should be(false)
293
+ end
294
+ end#finalize!
385
295
  end
386
296
  end