choosy 0.1.0 → 0.2.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.
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