ejt_command_line 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NGJjNDk5YTA2MzhiN2NhZTliNzlmZDBiMDNkZDkyOGVjOGZkNzcwYQ==
4
+ NzFiZTljMTMyMDIwOWU5MTUxN2UwOTc2OTNkNGQzN2ZlMTE3ZTc1OQ==
5
5
  data.tar.gz: !binary |-
6
- Mjc0NGRjZjYwZTdjYTA4N2E2YjcwY2Q3NmUwMTVhMjNhYTQ3OWEyNQ==
7
- !binary "U0hBNTEy":
6
+ ZjU1MmE5YjczNmViMmUwNDEyN2ViNmFmMDNhOWIyNjllY2EwMTMzYw==
7
+ SHA512:
8
8
  metadata.gz: !binary |-
9
- MzQ1Mzk1ZWUzYWM5MGQyYzIzMzk1MWZkMmYxZmI2MzM4N2RiOWVjM2E0YWI0
10
- NWQ5NDA4YzFiZjlhZTliNzkxZGFiYzdmMDlkNzhlNTNmOGVkMGY1YWZhZDdj
11
- OTlkY2YxYWU3ZDUwNTJmM2EwOTU3MzM0NThiYjQ3YjlmYmQ3YmY=
9
+ NTA1YTcwYjQ4YTE5YWQzNTRkMzcxMGVmZDk1NTA5NDUyMmQ1YTJhZWU1YTIz
10
+ YjQ3ZGMwNmNmODY2OWYzNGYyNTUyMDllZjg2ZDIyZjNhNDZlNDAwNGM1OWZk
11
+ OTRhYzRmZjBjNWViNDRmNDllYWU1ZDhmYzZjYTY1NTgwMjFmZjY=
12
12
  data.tar.gz: !binary |-
13
- NGI5Y2M5NGNmMDZlZTQ4NTUxODIxZGM0NjBiMzliODAxZGQxODhmOWYyZDM1
14
- NDJlYTQ4OTkxMjBmNWQzOWU4M2JhOTk3ZTk0YmRlNjczZWRiZGIzNjhiYWY3
15
- NzFlZDFmNTA0OGU3MjY5NzZmNDZkNzg2MDQ1YWFkYjNlOGZjOTk=
13
+ MzIyM2RkNmQwNTk3N2QxNWEwZGY2ZGQ1YTY2MGY3MDlhZGQxMGU0NjcxYTlj
14
+ ZjQyZjEzMjc0MzZiNmRiZDk3NjdlNzJiYmZiZGFhYTVhNTdiYzZlNTM1MTZm
15
+ Y2NkOTk4Y2ZjYzc4ZmEzODJhZDQxNzNhOTdmMjBmYjA0OTVjNjE=
@@ -1,3 +1,3 @@
1
1
  module EjtCommandLine
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -25,12 +25,14 @@ module CommandLine
25
25
 
26
26
  #----------------------------------------------------------------
27
27
 
28
+ ValueType = Struct.new(:parser, :multi)
29
+
28
30
  class Switch
29
- attr_reader :flags, :parser
31
+ attr_reader :flags, :value_type
30
32
 
31
- def initialize(flags, parser = nil)
33
+ def initialize(flags, value_type = nil)
32
34
  @flags = flags
33
- @parser = parser
35
+ @value_type = value_type
34
36
  end
35
37
 
36
38
  def has_flag?(flag)
@@ -123,7 +125,15 @@ module CommandLine
123
125
  raise ConfigureError, "duplicate value type '#{sym}'"
124
126
  end
125
127
 
126
- @value_types[sym] = parser
128
+ @value_types[sym] = ValueType.new(parser, false)
129
+ end
130
+
131
+ def multivalue_type(sym, &parser)
132
+ if @value_types.member?(sym)
133
+ raise ConfigureError, "duplicate value type '#{sym}'"
134
+ end
135
+
136
+ @value_types[sym] = ValueType.new(parser, true)
127
137
  end
128
138
 
129
139
  def simple_switch(sym, *flags)
@@ -131,7 +141,7 @@ module CommandLine
131
141
  end
132
142
 
133
143
  def value_switch(sym, value_sym, *flags)
134
- @switches[sym] = Switch.new(flags, get_value_parser(value_sym))
144
+ @switches[sym] = Switch.new(flags, get_value_type(value_sym))
135
145
  end
136
146
 
137
147
  def global(&block)
@@ -174,15 +184,24 @@ module CommandLine
174
184
  end
175
185
 
176
186
  private
177
- def parse_value(arg, s, args)
178
- if s.parser
187
+ def parse_value(arg, s, args, old_value)
188
+ if s.value_type
179
189
  if args.size == 0
180
190
  raise ParseError, "no value specified for switch '#{arg}'"
181
191
  end
182
192
 
183
193
  value = args.shift
184
194
  begin
185
- s.parser.call(value)
195
+ v = s.value_type.parser.call(value)
196
+ if s.value_type.multi
197
+ if old_value.nil?
198
+ [v]
199
+ else
200
+ old_value << v
201
+ end
202
+ else
203
+ v
204
+ end
186
205
  rescue => e
187
206
  raise ParseError, "couldn't parse value '#{arg}=#{value}'\n#{e}"
188
207
  end
@@ -203,7 +222,7 @@ module CommandLine
203
222
 
204
223
  if arg =~ /^-/
205
224
  sym, s = find_switch(valid_switches, arg)
206
- opts[sym] = parse_value(arg, s, args)
225
+ opts[sym] = parse_value(arg, s, args, opts[sym])
207
226
 
208
227
  else
209
228
  cmd = arg.intern
@@ -242,12 +261,9 @@ module CommandLine
242
261
  end
243
262
  end
244
263
 
245
- def get_value_parser(sym)
246
- if @value_types.member?(sym)
247
- @value_types[sym]
248
- else
249
- raise ConfigureError, "unknown value type '#{sym}'"
250
- end
264
+ def get_value_type(sym)
265
+ raise ConfigureError, "unknown value type '#{sym}'" unless @value_types.member?(sym)
266
+ @value_types[sym]
251
267
  end
252
268
 
253
269
  def bracket_(release)
@@ -15,7 +15,7 @@ describe "Parser" do
15
15
 
16
16
  describe "creation" do
17
17
  it "should take a config block" do
18
- block_watcher = mock()
18
+ block_watcher = double()
19
19
  block_watcher.should_receive(:executed)
20
20
 
21
21
  clh = Parser.new do
@@ -54,6 +54,32 @@ describe "Parser" do
54
54
  end
55
55
  end
56
56
 
57
+ describe "multi value types" do
58
+ it "should allow you to register new multi value types" do
59
+ @clh.configure do
60
+ multivalue_type :string do |str|
61
+ str
62
+ end
63
+
64
+ multivalue_type :int do |str|
65
+ str.to_i
66
+ end
67
+ end
68
+ end
69
+
70
+ it "should fail it you try and define a duplicate value type" do
71
+ @clh.value_type :string do |str|
72
+ str
73
+ end
74
+
75
+ expect do
76
+ @clh.value_type :string do |str|
77
+ str
78
+ end
79
+ end.to raise_error(ConfigureError, /string/)
80
+ end
81
+ end
82
+
57
83
  describe "switches are defined separately from commands" do
58
84
  it "should let you define binary switch" do
59
85
  help_switch
@@ -123,18 +149,18 @@ describe "Parser" do
123
149
  describe "parsing" do
124
150
  describe "global command" do
125
151
  it "should handle no switches" do
126
- handler = mock()
152
+ handler = double()
127
153
  handler.should_receive(:global_command).with({}, [])
128
154
  @clh.parse(handler)
129
155
  end
130
156
 
131
157
  it "should raise a ParseError if an unrecognised switch is used" do
132
- handler = mock()
158
+ handler = double()
133
159
  expect {@clh.parse(handler, '--go-back-in-time')}.to raise_error(ParseError, /--go-back-in-time/)
134
160
  end
135
161
 
136
162
  it "should handle binary switches" do
137
- handler = mock()
163
+ handler = double()
138
164
  handler.should_receive(:global_command).with({:help => true}, [])
139
165
 
140
166
  @clh.configure do
@@ -148,7 +174,7 @@ describe "Parser" do
148
174
  end
149
175
 
150
176
  it "should handle multiple binary switches" do
151
- handler = mock()
177
+ handler = double()
152
178
  handler.should_receive(:global_command).with({:help => true, :ro => true}, [])
153
179
 
154
180
  @clh.configure do
@@ -164,7 +190,7 @@ describe "Parser" do
164
190
  end
165
191
 
166
192
  it "should handle valued switches" do
167
- handler = mock()
193
+ handler = double()
168
194
 
169
195
  @clh.configure do
170
196
  value_type :int do |str|
@@ -187,8 +213,27 @@ describe "Parser" do
187
213
  @clh.parse(handler, 'one', '-c', '17', 'two')
188
214
  end
189
215
 
216
+ it "should handle multivalued switches" do
217
+ handler = double()
218
+
219
+ @clh.configure do
220
+ multivalue_type :ints do |str|
221
+ str.to_i
222
+ end
223
+
224
+ value_switch :counts, :ints, '--count'
225
+ global do
226
+ switches :counts
227
+ end
228
+ end
229
+
230
+ handler.should_receive(:global_command).
231
+ with({:counts => [1, 3, 5]}, ['one', 'two'])
232
+ @clh.parse(handler, 'one', '--count', '1', 'two', '--count', '3', '--count', '5')
233
+ end
234
+
190
235
  it "should raise an ArgumentError if no value is given for a valued switch" do
191
- handler = mock()
236
+ handler = double()
192
237
 
193
238
  @clh.configure do
194
239
  value_type :int do |str|
@@ -208,7 +253,7 @@ describe "Parser" do
208
253
  end
209
254
 
210
255
  it "should filter non-switches out" do
211
- handler = mock()
256
+ handler = double()
212
257
  handler.should_receive(:global_command).
213
258
  with({:help => true, :ro => true}, ['my_file', 'my_other_file'])
214
259
 
@@ -232,7 +277,7 @@ describe "Parser" do
232
277
  end
233
278
  end
234
279
 
235
- handler = mock()
280
+ handler = double()
236
281
  handler.should_receive(:create).with({}, ['fred'])
237
282
  @clh.parse(handler, 'create', 'fred')
238
283
  end
@@ -265,13 +310,13 @@ describe "Parser" do
265
310
  end
266
311
 
267
312
  it "should allow you to define a sub command" do
268
- handler = mock()
313
+ handler = double()
269
314
  handler.should_receive(:resize).with({:grow_to => 12345}, ['fred'])
270
315
  @clh.parse(handler, 'resize', '--grow-to', '12345', 'fred')
271
316
  end
272
317
 
273
318
  it "should prevent you calling two sub commands on the same line" do
274
- handler = mock()
319
+ handler = double()
275
320
  handler.should_receive(:resize).
276
321
  with({:grow_to => 1234, :shrink_to => 2345}, ['shrink', 'fred'])
277
322
  @clh.parse(handler, 'resize', '--grow-to', '1234', 'shrink', '--shrink-to', '2345', 'fred')
@@ -297,14 +342,14 @@ describe "Parser" do
297
342
  end
298
343
 
299
344
  it "should parse one exclusive switch" do
300
- handler = mock()
345
+ handler = double()
301
346
  handler.should_receive(:resize).
302
347
  with({:grow_to => 1234}, ['fred'])
303
348
  @clh.parse(handler, 'resize', '--grow-to', '1234', 'fred')
304
349
  end
305
350
 
306
351
  it "should raise a ParseError if more than one switch from an exclusive set is defined" do
307
- handler = mock()
352
+ handler = double()
308
353
  expect do
309
354
  @clh.parse(handler, 'resize', '--grow-to', '1234', '--shrink-by', '2345', 'fred')
310
355
  end.to raise_error(ParseError, /mutually exclusive/)
@@ -340,14 +385,14 @@ describe "Parser" do
340
385
  end
341
386
 
342
387
  it "should parse ok if mandatory switch is given" do
343
- handler = mock()
388
+ handler = double()
344
389
  handler.should_receive(:resize).
345
390
  with({:grow_to => 3}, ['fred'])
346
391
  @clh.parse(handler, 'resize', '--grow-to', '3', 'fred')
347
392
  end
348
393
 
349
394
  it "should raise a ParseError if a mandatory switch is omitted" do
350
- handler = mock()
395
+ handler = double()
351
396
  expect do
352
397
  @clh.parse(handler, 'resize', 'fred')
353
398
  end.to raise_error(ParseError, /grow_to/)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ejt_command_line
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Thornber
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-30 00:00:00.000000000 Z
11
+ date: 2014-03-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -91,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
91
91
  version: '0'
92
92
  requirements: []
93
93
  rubyforge_project:
94
- rubygems_version: 2.0.3
94
+ rubygems_version: 2.2.2
95
95
  signing_key:
96
96
  specification_version: 4
97
97
  summary: Command line parser