boson 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE.txt +1 -1
- data/README.rdoc +2 -2
- data/Rakefile +2 -2
- data/VERSION.yml +1 -1
- data/lib/boson.rb +1 -1
- data/lib/boson/command.rb +12 -2
- data/lib/boson/commands/core.rb +16 -11
- data/lib/boson/commands/web_core.rb +107 -27
- data/lib/boson/inspector.rb +3 -9
- data/lib/boson/inspectors/method_inspector.rb +2 -2
- data/lib/boson/libraries/file_library.rb +6 -6
- data/lib/boson/manager.rb +1 -1
- data/lib/boson/option_command.rb +4 -1
- data/lib/boson/option_parser.rb +49 -21
- data/lib/boson/options.rb +18 -9
- data/lib/boson/pipe.rb +79 -89
- data/lib/boson/pipes.rb +67 -0
- data/lib/boson/repo.rb +13 -1
- data/lib/boson/runners/bin_runner.rb +6 -5
- data/lib/boson/scientist.rb +15 -12
- data/lib/boson/util.rb +19 -16
- data/lib/boson/view.rb +4 -1
- data/test/argument_inspector_test.rb +1 -1
- data/test/method_inspector_test.rb +2 -2
- data/test/option_parser_test.rb +2 -190
- data/test/options_test.rb +189 -0
- data/test/{pipe_test.rb → pipes_test.rb} +10 -14
- data/test/scientist_test.rb +4 -0
- data/test/test_helper.rb +11 -0
- data/test/util_test.rb +58 -0
- metadata +10 -5
data/lib/boson/util.rb
CHANGED
@@ -15,7 +15,7 @@ module Boson
|
|
15
15
|
# From Rails ActiveSupport, does the reverse of underscore:
|
16
16
|
# 'boson/method_inspector' -> 'Boson::MethodInspector'
|
17
17
|
def camelize(string)
|
18
|
-
|
18
|
+
Hirb::Util.camelize(string)
|
19
19
|
end
|
20
20
|
|
21
21
|
# Converts a module/class string to the actual constant.
|
@@ -27,16 +27,7 @@ module Boson
|
|
27
27
|
# Returns a constant like const_get() no matter what namespace it's nested in.
|
28
28
|
# Returns nil if the constant is not found.
|
29
29
|
def any_const_get(name)
|
30
|
-
|
31
|
-
begin
|
32
|
-
klass = Object
|
33
|
-
name.split('::').each {|e|
|
34
|
-
klass = klass.const_get(e)
|
35
|
-
}
|
36
|
-
klass
|
37
|
-
rescue
|
38
|
-
nil
|
39
|
-
end
|
30
|
+
Hirb::Util.any_const_get(name)
|
40
31
|
end
|
41
32
|
|
42
33
|
# Detects new object/kernel methods, gems and modules created within a block.
|
@@ -62,6 +53,7 @@ module Boson
|
|
62
53
|
def safe_require(lib)
|
63
54
|
begin
|
64
55
|
require lib
|
56
|
+
true
|
65
57
|
rescue LoadError
|
66
58
|
false
|
67
59
|
end
|
@@ -102,11 +94,7 @@ module Boson
|
|
102
94
|
|
103
95
|
# From Rubygems, determine a user's home.
|
104
96
|
def find_home
|
105
|
-
|
106
|
-
return "#{ENV['HOMEDRIVE']}#{ENV['HOMEPATH']}" if ENV['HOMEDRIVE'] && ENV['HOMEPATH']
|
107
|
-
File.expand_path("~")
|
108
|
-
rescue
|
109
|
-
File::ALT_SEPARATOR ? "C:/" : "/"
|
97
|
+
Hirb::Util.find_home
|
110
98
|
end
|
111
99
|
|
112
100
|
# Returns name of top level class that conflicts if it exists. For example, for base module Boson::Commands,
|
@@ -114,5 +102,20 @@ module Boson
|
|
114
102
|
def top_level_class_conflict(base_module, conflicting_module)
|
115
103
|
(conflicting_module =~ /^#{base_module}.*::([^:]+)/) && Object.const_defined?($1) && $1
|
116
104
|
end
|
105
|
+
|
106
|
+
# Regular expression search of a list with underscore anchoring of words.
|
107
|
+
# For example 'some_dang_long_word' can be specified as 's_d_l_w'.
|
108
|
+
def underscore_search(input, list, first_match=false)
|
109
|
+
meth = first_match ? :find : :select
|
110
|
+
return (first_match ? input : [input]) if list.include?(input)
|
111
|
+
input = input.to_s
|
112
|
+
if input.include?("_")
|
113
|
+
underscore_regex = input.split('_').map {|e| Regexp.escape(e) }.join("([^_]+)?_")
|
114
|
+
list.send(meth) {|e| e.to_s =~ /^#{underscore_regex}/ }
|
115
|
+
else
|
116
|
+
escaped_input = Regexp.escape(input)
|
117
|
+
list.send(meth) {|e| e.to_s =~ /^#{escaped_input}/ }
|
118
|
+
end
|
119
|
+
end
|
117
120
|
end
|
118
121
|
end
|
data/lib/boson/view.rb
CHANGED
@@ -51,7 +51,10 @@ module Boson
|
|
51
51
|
|
52
52
|
# Enables hirb and reads a config file from the main repo's config/hirb.yml.
|
53
53
|
def enable
|
54
|
-
|
54
|
+
unless @enabled
|
55
|
+
Hirb::View.enable(:config_file=>File.join(Boson.repo.config_dir, 'hirb.yml'))
|
56
|
+
Hirb::Helpers::Table.filter_any = true
|
57
|
+
end
|
55
58
|
@enabled = true
|
56
59
|
end
|
57
60
|
|
@@ -56,13 +56,13 @@ module Boson
|
|
56
56
|
|
57
57
|
test "options calls scrape_with_eval" do
|
58
58
|
ArgumentInspector.expects(:scrape_with_eval).returns([['arg1']])
|
59
|
-
parse("desc 'desc'; options :some=>:opts; def doy(arg1); end")[:
|
59
|
+
parse("desc 'desc'; options :some=>:opts; def doy(arg1); end")[:args]['doy'].should == [['arg1']]
|
60
60
|
end
|
61
61
|
|
62
62
|
test "options in file calls scrape_with_eval" do
|
63
63
|
MethodInspector.expects(:inspector_in_file?).returns(true)
|
64
64
|
ArgumentInspector.expects(:scrape_with_eval).returns([['arg1']])
|
65
|
-
parse("desc 'desc'; def doz(arg1); end")[:
|
65
|
+
parse("desc 'desc'; def doz(arg1); end")[:args]['doz'].should == [['arg1']]
|
66
66
|
end
|
67
67
|
end
|
68
68
|
end
|
data/test/option_parser_test.rb
CHANGED
@@ -2,15 +2,8 @@ require File.join(File.dirname(__FILE__), 'test_helper')
|
|
2
2
|
|
3
3
|
module Boson
|
4
4
|
class OptionParserTest < Test::Unit::TestCase
|
5
|
-
|
6
|
-
|
7
|
-
end
|
8
|
-
|
9
|
-
def parse(*args)
|
10
|
-
@non_opts = []
|
11
|
-
@opt.parse(args.flatten)
|
12
|
-
end
|
13
|
-
|
5
|
+
include OptionTestHelper
|
6
|
+
|
14
7
|
context "IndifferentAccessHash" do
|
15
8
|
before(:each) {
|
16
9
|
@hash = IndifferentAccessHash.new 'foo' => 'bar', 'baz' => 'bee'
|
@@ -277,187 +270,6 @@ module Boson
|
|
277
270
|
end
|
278
271
|
end
|
279
272
|
|
280
|
-
context ":string type" do
|
281
|
-
before :each do
|
282
|
-
create "--foo" => :string, "--bar" => :string, :blah=>{:type=>:string, :default=>:huh}
|
283
|
-
end
|
284
|
-
|
285
|
-
it "doesn't set nonexistant options" do
|
286
|
-
parse("--bling")[:bar].should == nil
|
287
|
-
end
|
288
|
-
|
289
|
-
it "sets values correctly" do
|
290
|
-
parse("--foo", "12")[:foo].should == "12"
|
291
|
-
parse("--bar", "12")[:bar].should == "12"
|
292
|
-
end
|
293
|
-
|
294
|
-
it "raises error if passed another valid option" do
|
295
|
-
assert_error(OptionParser::Error, "cannot pass.*'foo'") { parse("--foo", "--bar") }
|
296
|
-
end
|
297
|
-
|
298
|
-
it "raises error if not passed a value" do
|
299
|
-
assert_error(OptionParser::Error, "no value.*'foo'") { parse("--foo") }
|
300
|
-
end
|
301
|
-
|
302
|
-
it "overwrites earlier values with later values" do
|
303
|
-
parse("--foo", "12", "--foo", "13")[:foo].should == "13"
|
304
|
-
end
|
305
|
-
|
306
|
-
it "can have symbolic default value" do
|
307
|
-
parse('--blah','ok')[:blah].should == 'ok'
|
308
|
-
end
|
309
|
-
end
|
310
|
-
|
311
|
-
context ":string type with :values attribute" do
|
312
|
-
before(:all ) { create :foo=>{:type=>:string, :values=>%w{angola abu abib}} }
|
313
|
-
it "auto aliases if a match exists" do
|
314
|
-
parse("-f", "an")[:foo].should == 'angola'
|
315
|
-
end
|
316
|
-
|
317
|
-
it "auto aliases first sorted match" do
|
318
|
-
parse("-f", "a")[:foo].should == 'abib'
|
319
|
-
end
|
320
|
-
|
321
|
-
it "raises error if option doesn't auto alias or match given values" do
|
322
|
-
assert_error(OptionParser::Error, "invalid.*'z'") { parse("-f", "z") }
|
323
|
-
end
|
324
|
-
|
325
|
-
it "doesn't raise error for a nonmatch if enum is false" do
|
326
|
-
create :foo=>{:type=>:string, :values=>%w{angola abu abib}, :enum=>false}
|
327
|
-
parse("-f", "z")[:foo].should == 'z'
|
328
|
-
end
|
329
|
-
end
|
330
|
-
|
331
|
-
context ":string type with default value" do
|
332
|
-
before(:each) do
|
333
|
-
create "--branch" => "master"
|
334
|
-
end
|
335
|
-
|
336
|
-
it "should get the specified value" do
|
337
|
-
parse("--branch", "bugfix").should == { :branch => "bugfix" }
|
338
|
-
end
|
339
|
-
|
340
|
-
it "should get the default value when not specified" do
|
341
|
-
parse.should == { :branch => "master" }
|
342
|
-
end
|
343
|
-
end
|
344
|
-
|
345
|
-
context ":numeric type" do
|
346
|
-
before(:each) do
|
347
|
-
create "n" => :numeric, "m" => 5
|
348
|
-
end
|
349
|
-
|
350
|
-
it "supports numeric defaults" do
|
351
|
-
parse["m"].should == 5
|
352
|
-
end
|
353
|
-
|
354
|
-
it "converts values to numeric types" do
|
355
|
-
parse("-n", "3", "-m", ".5").should == {:n => 3, :m => 0.5}
|
356
|
-
end
|
357
|
-
|
358
|
-
it "raises error when value isn't numeric" do
|
359
|
-
assert_error(OptionParser::Error, "expected numeric value for.*'n'") { parse("-n", "foo") }
|
360
|
-
end
|
361
|
-
|
362
|
-
it "raises error when opt is present without value" do
|
363
|
-
assert_error(OptionParser::Error, "no value.*'n'") { parse("-n") }
|
364
|
-
end
|
365
|
-
end
|
366
|
-
|
367
|
-
context ":array type" do
|
368
|
-
before(:all) {
|
369
|
-
create :a=>:array, :b=>[1,2,3], :c=>{:type=>:array, :values=>%w{foo fa bar zebra}, :enum=>false},
|
370
|
-
:d=>{:type=>:array, :split=>" ", :values=>[:ab, :bc, :cd], :enum=>false},
|
371
|
-
:e=>{:type=>:array, :values=>%w{some so silly}, :regexp=>true}
|
372
|
-
}
|
373
|
-
|
374
|
-
it "supports array defaults" do
|
375
|
-
parse[:b].should == [1,2,3]
|
376
|
-
end
|
377
|
-
|
378
|
-
it "converts comma delimited values to an array" do
|
379
|
-
parse("-a","1,2,5")[:a].should == %w{1 2 5}
|
380
|
-
end
|
381
|
-
|
382
|
-
it "raises error when option has no value" do
|
383
|
-
assert_error(OptionParser::Error, "no value.*'a'") { parse("-a") }
|
384
|
-
end
|
385
|
-
|
386
|
-
it "auto aliases :values attribute" do
|
387
|
-
parse("-c","f,b")[:c].should == %w{fa bar}
|
388
|
-
end
|
389
|
-
|
390
|
-
it "auto aliases symbolic :values" do
|
391
|
-
parse("-d","a c")[:d].should == [:ab,:cd]
|
392
|
-
end
|
393
|
-
|
394
|
-
it "supports a configurable splitter" do
|
395
|
-
parse("-d", "yogi berra")[:d].should == %w{yogi berra}
|
396
|
-
end
|
397
|
-
|
398
|
-
it "aliases * to all values" do
|
399
|
-
parse("-c", '*')[:c].sort.should == %w{bar fa foo zebra}
|
400
|
-
parse("-c", '*,ok')[:c].sort.should == %w{bar fa foo ok zebra}
|
401
|
-
end
|
402
|
-
|
403
|
-
it "aliases correctly with :regexp on" do
|
404
|
-
parse("-e", 'so')[:e].sort.should == %w{so some}
|
405
|
-
end
|
406
|
-
end
|
407
|
-
|
408
|
-
context ":hash type" do
|
409
|
-
before(:all) {
|
410
|
-
create :a=>:hash, :b=>{:default=>{:a=>'b'}}, :c=>{:type=>:hash, :keys=>%w{one two three}},
|
411
|
-
:e=>{:type=>:hash, :keys=>[:one, :two, :three], :default_keys=>:three},
|
412
|
-
:d=>{:type=>:hash, :split=>" "}
|
413
|
-
}
|
414
|
-
|
415
|
-
it "converts comma delimited pairs to hash" do
|
416
|
-
parse("-a", "f:3,g:4")[:a].should == {'f'=>'3', 'g'=>'4'}
|
417
|
-
end
|
418
|
-
|
419
|
-
it "supports hash defaults" do
|
420
|
-
parse[:b].should == {:a=>'b'}
|
421
|
-
end
|
422
|
-
|
423
|
-
it "raises error when option has no value" do
|
424
|
-
assert_error(OptionParser::Error, "no value.*'a'") { parse("-a") }
|
425
|
-
end
|
426
|
-
|
427
|
-
it "raises error if invalid key-value pair given for unknown keys" do
|
428
|
-
assert_error(OptionParser::Error, "invalid.*pair.*'a'") { parse("-a", 'b') }
|
429
|
-
end
|
430
|
-
|
431
|
-
it "auto aliases :keys attribute" do
|
432
|
-
parse("-c","t:3,o:1")[:c].should == {'three'=>'3', 'one'=>'1'}
|
433
|
-
end
|
434
|
-
|
435
|
-
it "adds in explicit default keys with value only argument" do
|
436
|
-
parse('-e', 'whoop')[:e].should == {:three=>'whoop'}
|
437
|
-
end
|
438
|
-
|
439
|
-
it "adds in default keys from known :keys with value only argument" do
|
440
|
-
parse("-c","okay")[:c].should == {'one'=>'okay'}
|
441
|
-
end
|
442
|
-
|
443
|
-
it "auto aliases symbolic :keys" do
|
444
|
-
parse("-e","t:3,o:1")[:e].should == {:three=>'3', :one=>'1'}
|
445
|
-
end
|
446
|
-
|
447
|
-
it "supports a configurable splitter" do
|
448
|
-
parse("-d","a:ab b:bc")[:d].should == {'a'=>'ab', 'b'=>'bc'}
|
449
|
-
end
|
450
|
-
|
451
|
-
it "supports grouping keys" do
|
452
|
-
parse("-c", "t,tw:foo,o:bar")[:c].should == {'three'=>'foo','two'=>'foo', 'one'=>'bar'}
|
453
|
-
end
|
454
|
-
|
455
|
-
it "aliases * to all keys" do
|
456
|
-
parse("-c", "*:foo")[:c].should == {'three'=>'foo', 'two'=>'foo', 'one'=>'foo'}
|
457
|
-
parse('-a', '*:foo')[:a].should == {'*'=>'foo'}
|
458
|
-
end
|
459
|
-
end
|
460
|
-
|
461
273
|
context "option with attributes" do
|
462
274
|
it "can get type from :type" do
|
463
275
|
create :foo=>{:type=>:numeric}
|
@@ -0,0 +1,189 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
2
|
+
|
3
|
+
module Boson
|
4
|
+
class OptionsTest < Test::Unit::TestCase
|
5
|
+
include OptionTestHelper
|
6
|
+
|
7
|
+
context ":string type" do
|
8
|
+
before :each do
|
9
|
+
create "--foo" => :string, "--bar" => :string, :blah=>{:type=>:string, :default=>:huh}
|
10
|
+
end
|
11
|
+
|
12
|
+
it "doesn't set nonexistant options" do
|
13
|
+
parse("--bling")[:bar].should == nil
|
14
|
+
end
|
15
|
+
|
16
|
+
it "sets values correctly" do
|
17
|
+
parse("--foo", "12")[:foo].should == "12"
|
18
|
+
parse("--bar", "12")[:bar].should == "12"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "raises error if passed another valid option" do
|
22
|
+
assert_error(OptionParser::Error, "cannot pass.*'foo'") { parse("--foo", "--bar") }
|
23
|
+
end
|
24
|
+
|
25
|
+
it "raises error if not passed a value" do
|
26
|
+
assert_error(OptionParser::Error, "no value.*'foo'") { parse("--foo") }
|
27
|
+
end
|
28
|
+
|
29
|
+
it "overwrites earlier values with later values" do
|
30
|
+
parse("--foo", "12", "--foo", "13")[:foo].should == "13"
|
31
|
+
end
|
32
|
+
|
33
|
+
it "can have symbolic default value" do
|
34
|
+
parse('--blah','ok')[:blah].should == 'ok'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context ":string type with :values attribute" do
|
39
|
+
before(:all ) { create :foo=>{:type=>:string, :values=>%w{angola abu abib}} }
|
40
|
+
it "auto aliases if a match exists" do
|
41
|
+
parse("-f", "an")[:foo].should == 'angola'
|
42
|
+
end
|
43
|
+
|
44
|
+
it "auto aliases first sorted match" do
|
45
|
+
parse("-f", "a")[:foo].should == 'abib'
|
46
|
+
end
|
47
|
+
|
48
|
+
it "raises error if option doesn't auto alias or match given values" do
|
49
|
+
assert_error(OptionParser::Error, "invalid.*'z'") { parse("-f", "z") }
|
50
|
+
end
|
51
|
+
|
52
|
+
it "doesn't raise error for a nonmatch if enum is false" do
|
53
|
+
create :foo=>{:type=>:string, :values=>%w{angola abu abib}, :enum=>false}
|
54
|
+
parse("-f", "z")[:foo].should == 'z'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context ":string type with default value" do
|
59
|
+
before(:each) do
|
60
|
+
create "--branch" => "master"
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should get the specified value" do
|
64
|
+
parse("--branch", "bugfix").should == { :branch => "bugfix" }
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should get the default value when not specified" do
|
68
|
+
parse.should == { :branch => "master" }
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context ":numeric type" do
|
73
|
+
before(:each) do
|
74
|
+
create "n" => :numeric, "m" => 5
|
75
|
+
end
|
76
|
+
|
77
|
+
it "supports numeric defaults" do
|
78
|
+
parse["m"].should == 5
|
79
|
+
end
|
80
|
+
|
81
|
+
it "converts values to numeric types" do
|
82
|
+
parse("-n", "3", "-m", ".5").should == {:n => 3, :m => 0.5}
|
83
|
+
end
|
84
|
+
|
85
|
+
it "raises error when value isn't numeric" do
|
86
|
+
assert_error(OptionParser::Error, "expected numeric value for.*'n'") { parse("-n", "foo") }
|
87
|
+
end
|
88
|
+
|
89
|
+
it "raises error when opt is present without value" do
|
90
|
+
assert_error(OptionParser::Error, "no value.*'n'") { parse("-n") }
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context ":array type" do
|
95
|
+
before(:all) {
|
96
|
+
create :a=>:array, :b=>[1,2,3], :c=>{:type=>:array, :values=>%w{foo fa bar zebra}, :enum=>false},
|
97
|
+
:d=>{:type=>:array, :split=>" ", :values=>[:ab, :bc, :cd], :enum=>false},
|
98
|
+
:e=>{:type=>:array, :values=>%w{some so silly}, :regexp=>true}
|
99
|
+
}
|
100
|
+
|
101
|
+
it "supports array defaults" do
|
102
|
+
parse[:b].should == [1,2,3]
|
103
|
+
end
|
104
|
+
|
105
|
+
it "converts comma delimited values to an array" do
|
106
|
+
parse("-a","1,2,5")[:a].should == %w{1 2 5}
|
107
|
+
end
|
108
|
+
|
109
|
+
it "raises error when option has no value" do
|
110
|
+
assert_error(OptionParser::Error, "no value.*'a'") { parse("-a") }
|
111
|
+
end
|
112
|
+
|
113
|
+
it "auto aliases :values attribute" do
|
114
|
+
parse("-c","f,b")[:c].should == %w{fa bar}
|
115
|
+
end
|
116
|
+
|
117
|
+
it "auto aliases symbolic :values" do
|
118
|
+
parse("-d","a c")[:d].should == [:ab,:cd]
|
119
|
+
end
|
120
|
+
|
121
|
+
it "supports a configurable splitter" do
|
122
|
+
parse("-d", "yogi berra")[:d].should == %w{yogi berra}
|
123
|
+
end
|
124
|
+
|
125
|
+
it "aliases * to all values" do
|
126
|
+
parse("-c", '*')[:c].sort.should == %w{bar fa foo zebra}
|
127
|
+
parse("-c", '*,ok')[:c].sort.should == %w{bar fa foo ok zebra}
|
128
|
+
end
|
129
|
+
|
130
|
+
it "aliases correctly with :regexp on" do
|
131
|
+
parse("-e", 'so')[:e].sort.should == %w{so some}
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
context ":hash type" do
|
136
|
+
before(:all) {
|
137
|
+
create :a=>:hash, :b=>{:default=>{:a=>'b'}}, :c=>{:type=>:hash, :keys=>%w{one two three}},
|
138
|
+
:e=>{:type=>:hash, :keys=>[:one, :two, :three], :default_keys=>:three},
|
139
|
+
:d=>{:type=>:hash, :split=>" "}
|
140
|
+
}
|
141
|
+
|
142
|
+
it "converts comma delimited pairs to hash" do
|
143
|
+
parse("-a", "f:3,g:4")[:a].should == {'f'=>'3', 'g'=>'4'}
|
144
|
+
end
|
145
|
+
|
146
|
+
it "supports hash defaults" do
|
147
|
+
parse[:b].should == {:a=>'b'}
|
148
|
+
end
|
149
|
+
|
150
|
+
it "raises error when option has no value" do
|
151
|
+
assert_error(OptionParser::Error, "no value.*'a'") { parse("-a") }
|
152
|
+
end
|
153
|
+
|
154
|
+
it "raises error if invalid key-value pair given for unknown keys" do
|
155
|
+
assert_error(OptionParser::Error, "invalid.*pair.*'a'") { parse("-a", 'b') }
|
156
|
+
end
|
157
|
+
|
158
|
+
it "auto aliases :keys attribute" do
|
159
|
+
parse("-c","t:3,o:1")[:c].should == {'three'=>'3', 'one'=>'1'}
|
160
|
+
end
|
161
|
+
|
162
|
+
it "adds in explicit default keys with value only argument" do
|
163
|
+
parse('-e', 'whoop')[:e].should == {:three=>'whoop'}
|
164
|
+
end
|
165
|
+
|
166
|
+
it "adds in default keys from known :keys with value only argument" do
|
167
|
+
parse("-c","okay")[:c].should == {'one'=>'okay'}
|
168
|
+
end
|
169
|
+
|
170
|
+
it "auto aliases symbolic :keys" do
|
171
|
+
parse("-e","t:3,o:1")[:e].should == {:three=>'3', :one=>'1'}
|
172
|
+
end
|
173
|
+
|
174
|
+
it "supports a configurable splitter" do
|
175
|
+
parse("-d","a:ab b:bc")[:d].should == {'a'=>'ab', 'b'=>'bc'}
|
176
|
+
end
|
177
|
+
|
178
|
+
it "supports grouping keys" do
|
179
|
+
parse("-c", "t,tw:foo,o:bar")[:c].should == {'three'=>'foo','two'=>'foo', 'one'=>'bar'}
|
180
|
+
end
|
181
|
+
|
182
|
+
it "aliases * to all keys" do
|
183
|
+
parse("-c", "*:foo")[:c].should == {'three'=>'foo', 'two'=>'foo', 'one'=>'foo'}
|
184
|
+
parse('-a', '*:foo')[:a].should == {'*'=>'foo'}
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
end
|
189
|
+
end
|