cli 0.0.4 → 0.1.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.
data/lib/cli/options.rb CHANGED
@@ -1,19 +1,12 @@
1
1
  require 'cli/switches'
2
2
 
3
3
  class CLI::Options < CLI::Switches
4
- def initialize
5
- super
6
- @defaults = []
7
- @mandatory = []
4
+ def defaults
5
+ select{|o| o.has_default?}
8
6
  end
9
7
 
10
- def <<(option_dsl)
11
- super option_dsl
12
- @defaults << option_dsl if option_dsl.has_default?
13
- @mandatory << option_dsl unless option_dsl.optional?
8
+ def mandatory
9
+ select{|o| o.mandatory?}
14
10
  end
15
-
16
- attr_reader :defaults
17
- attr_reader :mandatory
18
11
  end
19
12
 
@@ -0,0 +1,133 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe CLI do
4
+ describe 'argument handling' do
5
+ it "should handle single argument" do
6
+ ps = CLI.new do
7
+ argument :log
8
+ end.parse(['/tmp'])
9
+ ps.log.should be_a String
10
+ ps.log.should == '/tmp'
11
+ end
12
+
13
+ it "non empty, non optional with class casting" do
14
+ ps = CLI.new do
15
+ argument :log, :cast => Pathname
16
+ end.parse(['/tmp'])
17
+ ps.log.should be_a Pathname
18
+ ps.log.to_s.should == '/tmp'
19
+ end
20
+
21
+ it "non empty, non optional with builtin class casting" do
22
+ ps = CLI.new do
23
+ argument :number, :cast => Integer
24
+ end.parse(['123'])
25
+ ps.number.should be_a Integer
26
+ ps.number.should == 123
27
+
28
+ ps = CLI.new do
29
+ argument :number, :cast => Float
30
+ end.parse(['123'])
31
+ ps.number.should be_a Float
32
+ ps.number.should == 123.0
33
+ end
34
+
35
+ it "should handle multiple arguments" do
36
+ ps = CLI.new do
37
+ argument :log, :cast => Pathname
38
+ argument :test
39
+ end.parse(['/tmp', 'hello'])
40
+ ps.log.should be_a Pathname
41
+ ps.log.to_s.should == '/tmp'
42
+ ps.test.should be_a String
43
+ ps.test.should == 'hello'
44
+ end
45
+
46
+ it "should raise error if not symbol and optional hash is passed" do
47
+ lambda {
48
+ ps = CLI.new do
49
+ argument 'number'
50
+ end
51
+ }.should raise_error CLI::ParserError::NameArgumetNotSymbolError, "argument name has to be of type Symbol, got String"
52
+
53
+ lambda {
54
+ ps = CLI.new do
55
+ argument :number, :test
56
+ end
57
+ }.should raise_error CLI::ParserError::OptionsArgumentNotHashError, "argument options has to be of type Hash, got Symbol"
58
+ end
59
+
60
+ it "should raise error if artument name is specified twice" do
61
+ lambda {
62
+ ps = CLI.new do
63
+ argument :number
64
+ argument :number
65
+ end
66
+ }.should raise_error CLI::ParserError::ArgumentNameSpecifiedTwice, 'argument number specified twice'
67
+ end
68
+
69
+ it "should be required by default and raise error if not given" do
70
+ lambda {
71
+ ps = CLI.new do
72
+ argument :log
73
+ end.parse([])
74
+ }.should raise_error CLI::ParsingError::MandatoryArgumentNotSpecifiedError, 'mandatory argument log not given'
75
+ end
76
+
77
+ it "should raise error if casting fail" do
78
+ require 'ip'
79
+ lambda {
80
+ ps = CLI.new do
81
+ argument :log, :cast => IP
82
+ end.parse(['abc'])
83
+ }.should raise_error CLI::ParsingError::CastError, 'failed to cast: log to type: IP: invalid address'
84
+ end
85
+
86
+ describe "with defaults" do
87
+ it "when not enought arguments given it should fill required arguments only with defaults" do
88
+ ps = CLI.new do
89
+ argument :log, :cast => Pathname, :default => '/tmp'
90
+ argument :test
91
+ end.parse(['hello'])
92
+ ps.log.should be_a Pathname
93
+ ps.log.to_s.should == '/tmp'
94
+ ps.test.should be_a String
95
+ ps.test.should == 'hello'
96
+
97
+ ps = CLI.new do
98
+ argument :log, :cast => Pathname
99
+ argument :test, :default => 'hello'
100
+ end.parse(['/tmp'])
101
+ ps.log.should be_a Pathname
102
+ ps.log.to_s.should == '/tmp'
103
+ ps.test.should be_a String
104
+ ps.test.should == 'hello'
105
+
106
+ ps = CLI.new do
107
+ argument :log, :cast => Pathname
108
+ argument :magick, :default => 'word'
109
+ argument :test
110
+ argument :code, :cast => Integer, :default => '123'
111
+ end.parse(['/tmp', 'hello'])
112
+ ps.log.to_s.should == '/tmp'
113
+ ps.magick.should == 'word'
114
+ ps.test.should == 'hello'
115
+ ps.code.should == 123
116
+ end
117
+
118
+ it "should fill defaults form the beginning if more than required arguments are given" do
119
+ ps = CLI.new do
120
+ argument :log, :cast => Pathname
121
+ argument :magick, :default => 'word'
122
+ argument :test
123
+ argument :code, :cast => Integer, :default => '123'
124
+ end.parse(['/tmp', 'hello', 'world'])
125
+ ps.log.to_s.should == '/tmp'
126
+ ps.magick.should == 'hello'
127
+ ps.test.should == 'world'
128
+ ps.code.should == 123
129
+ end
130
+ end
131
+ end
132
+ end
133
+
data/spec/cli_spec.rb CHANGED
@@ -1,335 +1,6 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
- require 'cli'
3
-
4
- def stdin_write(data)
5
- r, w = IO.pipe
6
- old_stdin = STDIN.reopen r
7
- Thread.new do
8
- w.write data
9
- w.close
10
- end
11
- begin
12
- yield
13
- ensure
14
- STDIN.reopen old_stdin
15
- end
16
- end
17
2
 
18
3
  describe CLI do
19
- describe 'STDIN handling' do
20
- before :all do
21
- @yaml = <<EOF
22
- ---
23
- :parser:
24
- :successes: 41
25
- :failures: 0
26
- EOF
27
- end
28
-
29
- it "should be nil if not specified" do
30
- ps = CLI.new.parse
31
- ps.stdin.should be_nil
32
- end
33
-
34
- it "should return IO if stdin is defined" do
35
- ps = CLI.new do
36
- stdin
37
- end.parse
38
- ps.stdin.should be_a IO
39
- end
40
-
41
- it "should return YAML document if stdin is casted to YAML" do
42
- ps = nil
43
- ss = CLI.new do
44
- stdin :log_data, :cast => YAML, :description => 'log statistic data in YAML format'
45
- end
46
-
47
- stdin_write(@yaml) do
48
- ps = ss.parse
49
- end
50
-
51
- ps.stdin.should == {:parser=>{:successes=>41, :failures=>0}}
52
- end
53
- end
54
-
55
- describe 'argument handling' do
56
- it "should handle single argument" do
57
- ps = CLI.new do
58
- argument :log
59
- end.parse(['/tmp'])
60
- ps.log.should be_a String
61
- ps.log.should == '/tmp'
62
- end
63
-
64
- it "non empty, non optional with class casting" do
65
- ps = CLI.new do
66
- argument :log, :cast => Pathname
67
- end.parse(['/tmp'])
68
- ps.log.should be_a Pathname
69
- ps.log.to_s.should == '/tmp'
70
- end
71
-
72
- it "non empty, non optional with builtin class casting" do
73
- ps = CLI.new do
74
- argument :number, :cast => Integer
75
- end.parse(['123'])
76
- ps.number.should be_a Integer
77
- ps.number.should == 123
78
-
79
- ps = CLI.new do
80
- argument :number, :cast => Float
81
- end.parse(['123'])
82
- ps.number.should be_a Float
83
- ps.number.should == 123.0
84
- end
85
-
86
- it "should handle multiple arguments" do
87
- ps = CLI.new do
88
- argument :log, :cast => Pathname
89
- argument :test
90
- end.parse(['/tmp', 'hello'])
91
- ps.log.should be_a Pathname
92
- ps.log.to_s.should == '/tmp'
93
- ps.test.should be_a String
94
- ps.test.should == 'hello'
95
- end
96
-
97
- it "should raise error if not symbol and optional hash is passed" do
98
- lambda {
99
- ps = CLI.new do
100
- argument 'number'
101
- end
102
- }.should raise_error CLI::ParserError::NameArgumetNotSymbolError, "argument name has to be of type Symbol, got String"
103
-
104
- lambda {
105
- ps = CLI.new do
106
- argument :number, :test
107
- end
108
- }.should raise_error CLI::ParserError::OptionsArgumentNotHashError, "argument options has to be of type Hash, got Symbol"
109
- end
110
-
111
- it "should raise error if artument name is specified twice" do
112
- lambda {
113
- ps = CLI.new do
114
- argument :number
115
- argument :number
116
- end
117
- }.should raise_error CLI::ParserError::ArgumentNameSpecifiedTwice, 'argument number specified twice'
118
- end
119
-
120
- it "should raise error if not given" do
121
- lambda {
122
- ps = CLI.new do
123
- argument :log
124
- end.parse([])
125
- }.should raise_error CLI::ParsingError::MandatoryArgumentNotSpecifiedError, 'mandatory argument log not given'
126
- end
127
-
128
- it "should raise error if casting fail" do
129
- require 'ip'
130
- lambda {
131
- ps = CLI.new do
132
- argument :log, :cast => IP
133
- end.parse(['abc'])
134
- }.should raise_error CLI::ParsingError::CastError, 'failed to cast: log to type: IP: invalid address'
135
- end
136
-
137
- describe "with defaults" do
138
- it "should use default first argument" do
139
- ps = CLI.new do
140
- argument :log, :cast => Pathname, :default => '/tmp'
141
- argument :test
142
- end.parse(['hello'])
143
- ps.log.should be_a Pathname
144
- ps.log.to_s.should == '/tmp'
145
- ps.test.should be_a String
146
- ps.test.should == 'hello'
147
- end
148
-
149
- it "should use default second argument" do
150
- ps = CLI.new do
151
- argument :log, :cast => Pathname
152
- argument :test, :default => 'hello'
153
- end.parse(['/tmp'])
154
- ps.log.should be_a Pathname
155
- ps.log.to_s.should == '/tmp'
156
- ps.test.should be_a String
157
- ps.test.should == 'hello'
158
- end
159
-
160
- it "should use default second argument" do
161
- ps = CLI.new do
162
- argument :log, :cast => Pathname
163
- argument :magick, :default => 'word'
164
- argument :test
165
- argument :code, :cast => Integer, :default => '123'
166
- end.parse(['/tmp', 'hello'])
167
- ps.log.to_s.should == '/tmp'
168
- ps.magick.should == 'word'
169
- ps.test.should == 'hello'
170
- ps.code.should == 123
171
- end
172
- end
173
- end
174
-
175
- describe 'switch handling' do
176
- it "should handle long switch names" do
177
- ps = CLI.new do
178
- switch :location
179
- switch :unset
180
- end.parse(['--location'])
181
- ps.location.should be_true
182
- ps.unset.should be_nil
183
- end
184
-
185
- it "should handle short switch names" do
186
- ps = CLI.new do
187
- switch :location, :short => :l
188
- switch :unset, :short => :u
189
- end.parse(['-l'])
190
- ps.location.should be_true
191
- ps.unset.should be_nil
192
- end
193
-
194
- it "should raise error if not symbol and optional hash is passed" do
195
- lambda {
196
- ps = CLI.new do
197
- switch 'number'
198
- end.parse([])
199
- }.should raise_error CLI::ParserError::NameArgumetNotSymbolError, "switch name has to be of type Symbol, got String"
200
-
201
- lambda {
202
- ps = CLI.new do
203
- switch :number, :test
204
- end
205
- }.should raise_error CLI::ParserError::OptionsArgumentNotHashError, "switch options has to be of type Hash, got Symbol"
206
- end
207
-
208
- it "shoud raise error is short name is invalid" do
209
- lambda {
210
- ps = CLI.new do
211
- switch :location, :short => "l"
212
- end
213
- }.should raise_error CLI::ParserError::ShortNameNotSymbolError, 'short name has to be of type Symbol, got String'
214
-
215
- lambda {
216
- ps = CLI.new do
217
- switch :location, :short => :abc
218
- end
219
- }.should raise_error CLI::ParserError::ShortNameIsInvalidError, 'short name has to be one letter symbol, got abc'
220
- end
221
-
222
- it "should raise error on unrecognized switch" do
223
- ps = CLI.new do
224
- option :location
225
- end
226
-
227
- lambda {
228
- ps.parse(['--xxx'])
229
- }.should raise_error CLI::ParsingError::UnknownSwitchError, 'unknown switch --xxx'
230
- end
231
- end
232
-
233
- describe 'option handling' do
234
- it "should handle long option names" do
235
- ps = CLI.new do
236
- option :location
237
- end.parse(['--location', 'singapore'])
238
- ps.location.should be_a String
239
- ps.location.should == 'singapore'
240
- end
241
-
242
- it "should handle short option names" do
243
- ps = CLI.new do
244
- option :location, :short => :l
245
- end.parse(['-l', 'singapore'])
246
- ps.location.should be_a String
247
- ps.location.should == 'singapore'
248
- end
249
-
250
- it "should handle default values" do
251
- ps = CLI.new do
252
- option :location, :default => 'singapore'
253
- option :size, :cast => Integer, :default => 23
254
- end.parse([])
255
- ps.location.should be_a String
256
- ps.location.should == 'singapore'
257
- ps.size.should be_a Integer
258
- ps.size.should == 23
259
- end
260
-
261
- it "should support casting" do
262
- ps = CLI.new do
263
- option :size, :cast => Integer
264
- end.parse(['--size', '24'])
265
- ps.size.should be_a Integer
266
- ps.size.should == 24
267
- end
268
-
269
- it "not given and not defined options should be nil" do
270
- ps = CLI.new do
271
- option :size, :cast => Integer
272
- end.parse([])
273
- ps.size.should be_nil
274
- ps.gold.should be_nil
275
- end
276
-
277
- it "should handle multiple long and short intermixed options" do
278
- ps = CLI.new do
279
- option :location, :short => :l
280
- option :group, :default => 'red'
281
- option :power_up, :short => :p
282
- option :speed, :short => :s, :cast => Integer
283
- option :not_given
284
- option :size
285
- end.parse(['-l', 'singapore', '--power-up', 'yes', '-s', '24', '--size', 'XXXL'])
286
- ps.group.should == 'red'
287
- ps.power_up.should == 'yes'
288
- ps.speed.should == 24
289
- ps.not_given.should be_nil
290
- ps.size.should == 'XXXL'
291
- ps.gold.should be_nil
292
- end
293
-
294
- it "should raise error if not symbol and optional hash is passed" do
295
- lambda {
296
- ps = CLI.new do
297
- option 'number'
298
- end
299
- }.should raise_error CLI::ParserError::NameArgumetNotSymbolError, "option name has to be of type Symbol, got String"
300
-
301
- lambda {
302
- ps = CLI.new do
303
- option :number, :test
304
- end
305
- }.should raise_error CLI::ParserError::OptionsArgumentNotHashError, "option options has to be of type Hash, got Symbol"
306
- end
307
-
308
- it "should raise error on missing option argument" do
309
- ps = CLI.new do
310
- option :location
311
- end
312
-
313
- lambda {
314
- ps.parse(['--location'])
315
- }.should raise_error CLI::ParsingError::MissingOptionValueError, 'missing value for option --location'
316
- end
317
-
318
- it "should raise error on missing mandatory option" do
319
- ps = CLI.new do
320
- option :location
321
- option :weight, :required => true
322
- option :size, :required => true
323
- option :group, :default => 'red'
324
- option :speed, :short => :s, :cast => Integer
325
- end
326
-
327
- lambda {
328
- ps.parse(['--location', 'singapore'])
329
- }.should raise_error CLI::ParsingError::MandatoryOptionsNotSpecifiedError, "mandatory options not specified: --size, --weight"
330
- end
331
- end
332
-
333
4
  it "should handle options, switches and then arguments" do
334
5
  ps = CLI.new do
335
6
  option :location, :short => :l
@@ -357,240 +28,29 @@ EOF
357
28
  ps.debug.should be_true
358
29
  end
359
30
 
360
- describe "name conflict reporting" do
361
- it "raise error when long names configlict" do
362
- lambda {
363
- ps = CLI.new do
364
- switch :location
365
- switch :location
366
- end
367
- }.should raise_error CLI::ParserError::LongNameSpecifiedTwiceError, 'switch location specified twice'
368
-
369
- lambda {
370
- ps = CLI.new do
371
- option :location
372
- option :location
373
- end
374
- }.should raise_error CLI::ParserError::LongNameSpecifiedTwiceError, 'option location specified twice'
375
-
376
- lambda {
377
- ps = CLI.new do
378
- switch :location
379
- option :location
380
- end
381
- }.should raise_error CLI::ParserError::LongNameSpecifiedTwiceError, 'switch and option location specified twice'
382
-
383
- lambda {
384
- ps = CLI.new do
385
- option :location
386
- switch :location
387
- end
388
- }.should raise_error CLI::ParserError::LongNameSpecifiedTwiceError, 'option and switch location specified twice'
389
- end
390
- end
391
-
392
- describe "short name conflict reporting" do
393
- it "raise error when short names configlict" do
394
- lambda {
395
- ps = CLI.new do
396
- switch :location, :short => :l
397
- switch :location2, :short => :l
398
- end
399
- }.should raise_error CLI::ParserError::ShortNameSpecifiedTwiceError, 'short switch l specified twice'
400
-
401
- lambda {
402
- ps = CLI.new do
403
- option :location, :short => :l
404
- option :location2, :short => :l
405
- end
406
- }.should raise_error CLI::ParserError::ShortNameSpecifiedTwiceError, 'short option l specified twice'
407
-
408
- lambda {
409
- ps = CLI.new do
410
- switch :location, :short => :l
411
- option :location2, :short => :l
412
- end
413
- }.should raise_error CLI::ParserError::ShortNameSpecifiedTwiceError, 'short switch and option l specified twice'
414
-
415
- lambda {
416
- ps = CLI.new do
417
- option :location2, :short => :l
418
- switch :location, :short => :l
419
- end
420
- }.should raise_error CLI::ParserError::ShortNameSpecifiedTwiceError, 'short option and switch l specified twice'
421
- end
422
- end
423
-
424
- describe "usage and description" do
425
- it "parse should set help variable if -h or --help specified in the argument list and not parse the input" do
426
- ss = CLI.new do
31
+ describe "parse!" do
32
+ it "should return value structure with all the values on successful parsing" do
33
+ ps = CLI.new do
427
34
  option :location, :short => :l
428
- option :group, :default => 'red'
429
- option :power_up, :short => :p
430
- option :speed, :short => :s, :cast => Integer
431
- option :size
432
35
  switch :debug
36
+ argument :code
37
+ end.parse!(['-l', 'singapore', '--debug', 'hello'])
433
38
 
434
- argument :log, :cast => Pathname
435
- argument :magick, :default => 'word'
436
- argument :test
437
- argument :code, :cast => Integer, :default => '123'
438
- end
439
-
440
- ps = ss.parse(['-l', 'singapore', '--power-up', 'yes', '-s', '24', '--size', 'XXXL', '/tmp', 'hello'])
441
- ps.help.should be_nil
442
- ps.location.should == 'singapore'
443
-
444
- ps = ss.parse(['-h', '-l', 'singapore', '--power-up'])
445
- ps.help.should be_a String
446
- ps.location.should be_nil
447
-
448
- ps = ss.parse(['-l', 'singapore', '--power-up', '-h', 'yes', '-s', '24', '--size', 'XXXL', '/tmp', 'hello'])
449
- ps.help.should be_a String
450
- ps.location.should be_nil
451
-
452
- ps = ss.parse(['-l', 'singapore', '--power-up', '--help'])
453
- ps.help.should be_a String
454
- ps.location.should be_nil
455
-
456
- ps = ss.parse(['--help', '-l', 'singapore', '--power-up', 'yes', '-s', '24', '--size', 'XXXL', '/tmp', 'hello'])
457
- ps.help.should be_a String
458
- ps.location.should be_nil
459
-
460
- ps = ss.parse(['-l', 'singapore', '--power-up', 'yes', '-s', '24', '--size', 'XXXL', '/tmp', 'hello'])
461
- ps.help.should be_nil
462
39
  ps.location.should == 'singapore'
40
+ ps.debug.should be_true
41
+ ps.code.should == 'hello'
463
42
  end
464
43
 
465
- it "should allow describing switches" do
466
- ss = CLI.new do
467
- switch :debug, :short => :d, :description => "enable debugging"
468
- switch :logging
469
- end
470
-
471
- ss.usage.should include("enable debugging")
472
- end
473
-
474
- it "should allow describing options" do
475
- ss = CLI.new do
476
- option :location, :short => :l, :description => "place where server is located"
477
- option :group, :default => 'red'
478
- end
479
-
480
- ss.usage.should include("place where server is located")
481
- end
482
-
483
- it "should allow describing arguments" do
484
- ss = CLI.new do
485
- option :group, :default => 'red'
486
- argument :log, :cast => Pathname, :description => "log file to process"
487
- end
488
-
489
- ss.usage.should include("log file to process")
490
- end
491
-
492
- it "should suggest that switches can be used in usage line" do
493
- ss = CLI.new do
494
- switch :location, :short => :l
495
- end
496
-
497
- ss.usage.first.should == "Usage: rspec [switches]\n"
498
- end
499
-
500
- it "should suggest that options can be used in usage line" do
501
- ss = CLI.new do
502
- option :location, :short => :l
503
- end
504
-
505
- ss.usage.first.should == "Usage: rspec [options]\n"
506
- end
507
-
508
- it "should suggest that switches or options can be used in usage line" do
509
- ss = CLI.new do
510
- switch :location, :short => :l
511
- option :size, :short => :s
512
- end
513
-
514
- ss.usage.first.should == "Usage: rspec [switches|options]\n"
515
- end
516
-
517
- it "should allow describing whole script" do
518
- ss = CLI.new do
519
- description 'Log file processor'
520
- option :group, :default => 'red'
521
- argument :log, :cast => Pathname
522
- end
523
-
524
- ss.usage.should include("Log file processor")
525
- end
526
-
527
- it "should provide stdin usage information" do
528
- CLI.new do
529
- stdin
530
- end.usage.should include(" < data")
531
-
532
- CLI.new do
533
- stdin :log_file
534
- end.usage.should include(" < log-file")
535
-
536
- u = CLI.new do
537
- stdin :log_file, :description => 'log file to process'
538
- end.usage
539
- u.should include(" < log-file")
540
- u.should include("log file to process")
541
-
542
- u = CLI.new do
543
- stdin :log_data, :cast => YAML, :description => 'log data to process'
544
- end.usage
545
- u.should include(" < log-data")
546
- u.should include("log data to process")
547
- end
548
-
549
- it "should provide formated usage with optional message" do
550
- u = CLI.new do
551
- description 'Log file processor'
552
- stdin :log_data, :cast => YAML, :description => "YAML formatted log data"
553
- switch :debug, :short => :d, :description => "enable debugging"
554
- switch :logging, :short => :l
555
- switch :run
556
- option :location, :short => :r, :description => "place where server is located"
557
- option :group, :default => 'red'
558
- option :power_up, :short => :p
559
- option :speed, :short => :s, :cast => Integer
560
- option :the_number_of_the_beast, :short => :b, :cast => Integer, :default => 666, :description => "The number of the beast"
561
- option :size
562
-
563
- argument :log, :cast => Pathname, :description => "log file to process"
564
- argument :magick, :default => 'word'
565
- argument :string
566
- argument :number, :cast => Integer
567
- argument :code, :cast => Integer, :default => '123', :description => "secret code"
568
- argument :illegal_prime, :cast => Integer, :description => "prime number that represents information that it is forbidden to possess or distribute"
569
- end.usage
570
-
571
- #puts u
572
-
573
- u.should == <<EOS
574
- Usage: rspec [switches|options] log magick string number code illegal-prime < log-data
575
- Log file processor
576
- Input:
577
- log-data - YAML formatted log data
578
- Switches:
579
- --debug (-d) - enable debugging
580
- --logging (-l)
581
- --run
582
- Options:
583
- --location (-r) - place where server is located
584
- --group [red]
585
- --power-up (-p)
586
- --speed (-s)
587
- --the-number-of-the-beast (-b) [666] - The number of the beast
588
- --size
589
- Arguments:
590
- log - log file to process
591
- code - secret code
592
- illegal-prime - prime number that represents information that it is forbidden to possess or distribute
593
- EOS
44
+ it "should exit displaying usage and error message on standard error on usage error" do
45
+ out = stderr_read do
46
+ lambda {
47
+ ps = CLI.new do
48
+ option :weight, :required => true
49
+ end.parse!([])
50
+ }.should raise_error SystemExit
51
+ end
52
+ out.should include('Error: mandatory options not specified: --weight')
53
+ out.should include('Usage:')
594
54
  end
595
55
  end
596
56
  end