optitron 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- optitron (0.1.0)
4
+ optitron (0.1.1)
5
5
  callsite (= 0.0.4)
6
6
  ruby2ruby (= 1.2.4)
7
7
  ruby_parser (>= 2.0)
@@ -80,6 +80,29 @@ Will generate
80
80
 
81
81
  start <modes1 modes2 ...> # Starts the process
82
82
 
83
+ As well, you can provide type hints to the args:
84
+
85
+ desc "Does something awesome"
86
+ arg_types :numeric, :string, :boolean
87
+ def start(number, string, truth)
88
+ # ... does something
89
+ end
90
+
91
+ Will generate
92
+
93
+ start [number] [string] [truth] # Does something awesome
94
+
95
+ And those arguments have to conform to the types given. For instance, calling this with
96
+
97
+ start 123 something flase
98
+
99
+ Will produce the error <tt>Truth is invalid</tt>. Calling with
100
+
101
+ start 123 something true
102
+
103
+ however, will correctly invoke the method.
104
+
105
+
83
106
  === Options
84
107
 
85
108
  Options are specified with the +opt+ method in your class, as follows:
@@ -124,20 +124,25 @@ class Optitron
124
124
  @opts << [name, desc, opts]
125
125
  end
126
126
 
127
+ def arg_types(*types)
128
+ @arg_types = types
129
+ end
130
+
127
131
  def build
128
132
  unless @built
129
133
  optitron_dsl.root.help unless send(:class_variable_defined?, :@@suppress_help)
130
134
  @cmds.each do |(cmd_name, cmd_desc, opts)|
131
135
  args = method_args[cmd_name.to_sym]
132
136
  arity = instance_method(cmd_name).arity
137
+ arg_types = @arg_types
133
138
  optitron_dsl.root.cmd(cmd_name, cmd_desc) do
134
139
  opts.each { |o| opt *o }
135
140
  args.each do |(arg_name, arg_type, arg_default)|
136
141
  case arg_type
137
142
  when :required
138
- arg arg_name.to_s, :default => arg_default && eval(arg_default)
143
+ arg arg_name.to_s, :default => arg_default && eval(arg_default), :type => arg_types && arg_types.shift
139
144
  when :optional
140
- arg arg_name.to_s, :default => arg_default && eval(arg_default), :required => false
145
+ arg arg_name.to_s, :default => arg_default && eval(arg_default), :required => false, :type => arg_types && arg_types.shift
141
146
  when :greedy
142
147
  arg arg_name.to_s, :default => arg_default && eval(arg_default), :type => :greedy
143
148
  end
@@ -194,27 +194,37 @@ class Optitron
194
194
  self.required = opts && opts.key?(:required) ? opts[:required] : (@default.nil? and !greedy?)
195
195
  end
196
196
 
197
- def consume(response, tokens)
197
+ def consume_array(response, tokens)
198
198
  arg_tokens = tokens.select{ |tok| tok.respond_to?(:lit) }
199
- if type == :greedy
200
- response.args_with_tokens << [self, []]
201
- while !arg_tokens.size.zero?
199
+ response.args_with_tokens << [self, []]
200
+ while !arg_tokens.size.zero?
201
+ if val = yield(arg_tokens.first)
202
202
  arg_tok = arg_tokens.shift
203
203
  tokens.delete_at(tokens.index(arg_tok))
204
- response.args_with_tokens.last.last << arg_tok.lit
205
- end
206
- if required? and response.args_with_tokens.last.last.size.zero?
207
- response.add_error("required", name)
204
+ response.args_with_tokens.last.last << val
205
+ else
206
+ break
208
207
  end
208
+ end
209
+ if required? and response.args_with_tokens.last.last.size.zero?
210
+ response.add_error("required", name)
211
+ end
212
+ end
213
+
214
+ def consume(response, tokens)
215
+ case type
216
+ when :greedy, :array
217
+ consume_array(response, tokens) { |t| t.lit }
218
+ when :hash
219
+ consume_array(response, tokens) { |t| t.lit[':'] && t.lit.split(':', 2) }
220
+ response.args_with_tokens.last[-1] = Hash[response.args_with_tokens.last[-1]]
209
221
  else
210
- if arg_tokens.size.zero? and required?
222
+ arg_token = tokens.find{ |tok| tok.respond_to?(:lit) }
223
+ if arg_token || has_default
224
+ tokens.delete_at(tokens.index(arg_token)) if arg_token
225
+ response.args_with_tokens << [self, arg_token ? arg_token.lit : default]
226
+ elsif !arg_token and required?
211
227
  response.add_error("required", name)
212
- elsif !arg_tokens.size.zero?
213
- arg_tok = arg_tokens.shift
214
- tokens.delete_at(tokens.index(arg_tok))
215
- response.args_with_tokens << [self, arg_tok.lit]
216
- elsif has_default
217
- response.args_with_tokens << [self, default]
218
228
  end
219
229
  end
220
230
  end
@@ -1,3 +1,3 @@
1
1
  class Optitron
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -177,4 +177,22 @@ describe "Optitron::Parser arg spec" do
177
177
  response.valid?.should be_true
178
178
  end
179
179
  end
180
+
181
+ context "various arg types" do
182
+ before(:each) {
183
+ @parser = Optitron.new {
184
+ cmd "install" do
185
+ arg "file", :type => :hash
186
+ end
187
+ }
188
+ }
189
+
190
+ it "should parse" do
191
+ response = @parser.parse(%w(install test:one test2:two))
192
+ response.command.should == 'install'
193
+ response.args.should == [{'test' => 'one', 'test2' => 'two'}]
194
+ response.valid?.should be_true
195
+ end
196
+ end
197
+
180
198
  end
@@ -15,7 +15,9 @@ class CLIExample < Optitron::CLI
15
15
 
16
16
  desc "Use this too"
17
17
  opt 'another_opt'
18
+ arg_types :hash
18
19
  def use_too(one, two = 'three')
20
+ puts "one: #{one.inspect} #{two.inspect}"
19
21
  end
20
22
 
21
23
  desc "Use this three"
@@ -67,6 +69,10 @@ describe "Optitron::Parser defaults" do
67
69
  capture(:stdout) { CLIExample.dispatch(%w(use))}.should == "using this\n"
68
70
  end
69
71
 
72
+ it "should dispatch with the type hinting" do
73
+ capture(:stdout) { CLIExample.dispatch(%w(use_too one:two three:four))}.should == "one: {\"three\"=>\"four\", \"one\"=>\"two\"} \"three\"\n"
74
+ end
75
+
70
76
  it "should generate the correct help" do
71
77
  AnotherCLIExample.build
72
78
  AnotherCLIExample.optitron_parser.help.strip.should == "Commands\n\nuse_too [one] <two=\"three\"> # Use this too\n -a/--another_opt \n\nGlobal options\n\n-v/--verbose \n-?/--help # Print help message"
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: 25
4
+ hash: 31
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 1
10
- version: 0.1.1
9
+ - 2
10
+ version: 0.1.2
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-21 00:00:00 -07:00
18
+ date: 2010-08-22 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency