optitron 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/README.rdoc +7 -0
- data/lib/optitron/class_dsl.rb +6 -3
- data/lib/optitron/option.rb +13 -3
- data/lib/optitron/version.rb +1 -1
- data/spec/cli_spec.rb +13 -2
- data/spec/validation_spec.rb +64 -0
- metadata +4 -4
data/Gemfile.lock
CHANGED
data/README.rdoc
CHANGED
@@ -102,6 +102,13 @@ Will produce the error <tt>Truth is invalid</tt>. Calling with
|
|
102
102
|
|
103
103
|
however, will correctly invoke the method.
|
104
104
|
|
105
|
+
These same arg type hints can be provided by ending your arguments in _type. The accepted types are: float, string, int, numeric, array, hash. For example
|
106
|
+
|
107
|
+
desc "Does something awesome"
|
108
|
+
def start(number_int, something_string, opt_boolean)
|
109
|
+
# ... does something
|
110
|
+
end
|
111
|
+
|
105
112
|
|
106
113
|
=== Options
|
107
114
|
|
data/lib/optitron/class_dsl.rb
CHANGED
@@ -138,13 +138,16 @@ class Optitron
|
|
138
138
|
optitron_dsl.root.cmd(cmd_name, cmd_desc) do
|
139
139
|
opts.each { |o| opt *o }
|
140
140
|
args.each do |(arg_name, arg_type, arg_default)|
|
141
|
+
possible_arg_type = arg_name.to_s[/_(string|hash|array|numeric|int|float)$/, 1]
|
142
|
+
possible_arg_type &&= possible_arg_type.to_sym
|
143
|
+
arg_opts = { :default => arg_default && eval(arg_default), :type => arg_types && arg_types.shift || possible_arg_type }
|
141
144
|
case arg_type
|
142
145
|
when :required
|
143
|
-
arg arg_name.to_s,
|
146
|
+
arg arg_name.to_s, arg_opts
|
144
147
|
when :optional
|
145
|
-
arg arg_name.to_s,
|
148
|
+
arg arg_name.to_s, arg_opts.merge(:required => false)
|
146
149
|
when :greedy
|
147
|
-
arg arg_name.to_s,
|
150
|
+
arg arg_name.to_s, arg_opts.merge(:type => :greedy)
|
148
151
|
end
|
149
152
|
end
|
150
153
|
end
|
data/lib/optitron/option.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
class Optitron
|
2
2
|
class Option
|
3
|
-
attr_reader :inclusion_test
|
4
|
-
attr_accessor :required, :name, :default, :parameterize, :
|
3
|
+
attr_reader :inclusion_test, :type
|
4
|
+
attr_accessor :required, :name, :default, :parameterize, :desc, :has_default
|
5
5
|
alias_method :required?, :required
|
6
6
|
alias_method :has_default?, :has_default
|
7
7
|
alias_method :parameterize?, :parameterize
|
@@ -21,6 +21,14 @@ class Optitron
|
|
21
21
|
@inclusion_test = tester
|
22
22
|
end
|
23
23
|
|
24
|
+
def type=(type)
|
25
|
+
@type = case type
|
26
|
+
when :int then :numeric
|
27
|
+
when :float, :numeric, :string, :array, :hash, :boolean, :greedy, nil then type
|
28
|
+
else raise("Unknown type #{type.inspect}")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
24
32
|
def interpolate_type(default)
|
25
33
|
@type = case default
|
26
34
|
when nil
|
@@ -78,6 +86,8 @@ class Optitron
|
|
78
86
|
Integer(val)
|
79
87
|
when :array
|
80
88
|
Array(val)
|
89
|
+
when :float
|
90
|
+
Float(val)
|
81
91
|
when :hash
|
82
92
|
val.is_a?(Hash) ? val : raise
|
83
93
|
when :greedy, nil, :string
|
@@ -129,7 +139,7 @@ class Optitron
|
|
129
139
|
tokens.delete_at(opt_tok_index).lit
|
130
140
|
end
|
131
141
|
response.params_array << [self, value.nil? ? !default : value]
|
132
|
-
when :numeric, :string
|
142
|
+
when :numeric, :string, :float
|
133
143
|
value = if opt_tok.name == name
|
134
144
|
if opt_tok.respond_to?(:value)
|
135
145
|
opt_tok.value
|
data/lib/optitron/version.rb
CHANGED
data/spec/cli_spec.rb
CHANGED
@@ -17,7 +17,7 @@ class CLIExample < Optitron::CLI
|
|
17
17
|
opt 'another_opt'
|
18
18
|
arg_types :hash
|
19
19
|
def use_too(one, two = 'three')
|
20
|
-
puts "one: #{one.inspect} #{two.inspect}"
|
20
|
+
puts "one: #{one.to_a.sort.inspect} #{two.inspect}"
|
21
21
|
end
|
22
22
|
|
23
23
|
desc "Use this three"
|
@@ -58,6 +58,13 @@ class NoHelpExample < Optitron::CLI
|
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
61
|
+
class CLIExampleWithArgHinting < Optitron::CLI
|
62
|
+
desc "Use this too"
|
63
|
+
def use_too(one_string, two_int)
|
64
|
+
puts "using this too #{one_string.inspect} #{two_int.inspect}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
61
68
|
|
62
69
|
describe "Optitron::Parser defaults" do
|
63
70
|
it "should generate the correct help" do
|
@@ -70,7 +77,7 @@ describe "Optitron::Parser defaults" do
|
|
70
77
|
end
|
71
78
|
|
72
79
|
it "should dispatch with the type hinting" do
|
73
|
-
capture(:stdout) { CLIExample.dispatch(%w(use_too one:two three:four))}.should ==
|
80
|
+
capture(:stdout) { CLIExample.dispatch(%w(use_too one:two three:four))}.should == 'one: [["one", "two"], ["three", "four"]] "three"' + "\n"
|
74
81
|
end
|
75
82
|
|
76
83
|
it "should generate the correct help" do
|
@@ -85,4 +92,8 @@ describe "Optitron::Parser defaults" do
|
|
85
92
|
it "should be able to suppress help" do
|
86
93
|
capture(:stdout) { NoHelpExample.dispatch(%w(--help)) }.should == "Unknown command\nHelp is unrecognized\n"
|
87
94
|
end
|
95
|
+
|
96
|
+
it "should get type hinting from arg names" do
|
97
|
+
capture(:stdout) { CLIExampleWithArgHinting.dispatch(%w(use_too asd 123)) }.should == "using this too \"asd\" 123\n"
|
98
|
+
end
|
88
99
|
end
|
data/spec/validation_spec.rb
CHANGED
@@ -51,6 +51,70 @@ describe "Optitron::Parser types" do
|
|
51
51
|
end
|
52
52
|
end
|
53
53
|
|
54
|
+
context "float" do
|
55
|
+
context "on args" do
|
56
|
+
before(:each) {
|
57
|
+
@parser = Optitron.new {
|
58
|
+
cmd "kill" do
|
59
|
+
arg 'volumne', :type => :float
|
60
|
+
end
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
it "should parse 'kill 123'" do
|
65
|
+
response = @parser.parse(%w(kill 123))
|
66
|
+
response.command.should == 'kill'
|
67
|
+
response.args.first.should == 123
|
68
|
+
response.valid?.should be_true
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should parse 'kill 123.345'" do
|
72
|
+
response = @parser.parse(%w(kill 123.345))
|
73
|
+
response.command.should == 'kill'
|
74
|
+
response.args.first.should == 123.345
|
75
|
+
response.valid?.should be_true
|
76
|
+
end
|
77
|
+
|
78
|
+
it "shouldn't parse 'kill asd'" do
|
79
|
+
response = @parser.parse(%w(kill asd))
|
80
|
+
response.command.should == 'kill'
|
81
|
+
response.args.first.should == 'asd'
|
82
|
+
response.valid?.should be_false
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context "on opts" do
|
87
|
+
before(:each) do
|
88
|
+
@parser = Optitron.new do
|
89
|
+
cmd "kill" do
|
90
|
+
opt 'pid', :type => :float
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
it "should parse 'kill --pid=123'" do
|
96
|
+
response = @parser.parse(%w(kill --pid=123))
|
97
|
+
response.command.should == 'kill'
|
98
|
+
response.params['pid'].should == 123
|
99
|
+
response.valid?.should be_true
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should parse 'kill --pid=123.345'" do
|
103
|
+
response = @parser.parse(%w(kill --pid=123.345))
|
104
|
+
response.command.should == 'kill'
|
105
|
+
response.params['pid'].should == 123.345
|
106
|
+
response.valid?.should be_true
|
107
|
+
end
|
108
|
+
|
109
|
+
it "shouldn't parse 'kill --pid=asd'" do
|
110
|
+
response = @parser.parse(%w(kill --pid=asd))
|
111
|
+
response.command.should == 'kill'
|
112
|
+
response.params['pid'].should == 'asd'
|
113
|
+
response.valid?.should be_false
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
54
118
|
context "array" do
|
55
119
|
context "on opt" do
|
56
120
|
before(:each) {
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: optitron
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 29
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 3
|
10
|
+
version: 0.1.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Joshua Hull
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-08-
|
18
|
+
date: 2010-08-23 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|