slop 3.6.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,196 +0,0 @@
1
- class Slop
2
- class Commands
3
- include Enumerable
4
-
5
- attr_reader :config, :commands, :arguments
6
- attr_writer :banner
7
-
8
- # Create a new instance of Slop::Commands and optionally build
9
- # Slop instances via a block. Any configuration options used in
10
- # this method will be the default configuration options sent to
11
- # each Slop object created.
12
- #
13
- # config - An optional configuration Hash.
14
- # block - Optional block used to define commands.
15
- #
16
- # Examples:
17
- #
18
- # commands = Slop::Commands.new do
19
- # on :new do
20
- # on '-o', '--outdir=', 'The output directory'
21
- # on '-v', '--verbose', 'Enable verbose mode'
22
- # end
23
- #
24
- # on :generate do
25
- # on '--assets', 'Generate assets', :default => true
26
- # end
27
- #
28
- # global do
29
- # on '-D', '--debug', 'Enable debug mode', :default => false
30
- # end
31
- # end
32
- #
33
- # commands[:new].class #=> Slop
34
- # commands.parse
35
- #
36
- def initialize(config = {}, &block)
37
- @config = config
38
- @commands = {}
39
- @banner = nil
40
- @triggered_command = nil
41
-
42
- warn "[DEPRECATED] Slop::Commands is deprecated and will be removed in "\
43
- "Slop version 4. Check out http://leejarvis.github.io/slop/#commands for "\
44
- "a new implementation of commands."
45
-
46
- if block_given?
47
- block.arity == 1 ? yield(self) : instance_eval(&block)
48
- end
49
- end
50
-
51
- # Optionally set the banner for this command help output.
52
- #
53
- # banner - The String text to set the banner.
54
- #
55
- # Returns the String banner if one is set.
56
- def banner(banner = nil)
57
- @banner = banner if banner
58
- @banner
59
- end
60
-
61
- # Add a Slop instance for a specific command.
62
- #
63
- # command - A String or Symbol key used to identify this command.
64
- # config - A Hash of configuration options to pass to Slop.
65
- # block - An optional block used to pass options to Slop.
66
- #
67
- # Returns the newly created Slop instance mapped to command.
68
- def on(command, config = {}, &block)
69
- commands[command.to_s] = Slop.new(@config.merge(config), &block)
70
- end
71
-
72
- # Add a Slop instance used when no other commands exist.
73
- #
74
- # config - A Hash of configuration options to pass to Slop.
75
- # block - An optional block used to pass options to Slop.
76
- #
77
- # Returns the newly created Slop instance mapped to default.
78
- def default(config = {}, &block)
79
- on('default', config, &block)
80
- end
81
-
82
- # Add a global Slop instance.
83
- #
84
- # config - A Hash of configuration options to pass to Slop.
85
- # block - An optional block used to pass options to Slop.
86
- #
87
- # Returns the newly created Slop instance mapped to global.
88
- def global(config = {}, &block)
89
- on('global', config, &block)
90
- end
91
-
92
- # Fetch the instance of Slop tied to a command.
93
- #
94
- # key - The String or Symbol key used to locate this command.
95
- #
96
- # Returns the Slop instance if this key is found, nil otherwise.
97
- def [](key)
98
- commands[key.to_s]
99
- end
100
- alias get []
101
-
102
- # Check for a command presence.
103
- #
104
- # Examples:
105
- #
106
- # cmds.parse %w( foo )
107
- # cmds.present?(:foo) #=> true
108
- # cmds.present?(:bar) #=> false
109
- #
110
- # Returns true if the given key is present in the parsed arguments.
111
- def present?(key)
112
- key.to_s == @triggered_command
113
- end
114
-
115
- # Enumerable interface.
116
- def each(&block)
117
- @commands.each(&block)
118
- end
119
-
120
- # Parse a list of items.
121
- #
122
- # items - The Array of items to parse.
123
- #
124
- # Returns the original Array of items.
125
- def parse(items = ARGV)
126
- parse! items.dup
127
- items
128
- end
129
-
130
- # Parse a list of items, removing any options or option arguments found.
131
- #
132
- # items - The Array of items to parse.
133
- #
134
- # Returns the original Array of items with options removed.
135
- def parse!(items = ARGV)
136
- if opts = commands[items[0].to_s]
137
- @triggered_command = items.shift
138
- execute_arguments! items
139
- opts.parse! items
140
- execute_global_opts! items
141
- else
142
- if opts = commands['default']
143
- opts.parse! items
144
- else
145
- if config[:strict] && items[0]
146
- raise InvalidCommandError, "Unknown command `#{items[0]}`"
147
- end
148
- end
149
- execute_global_opts! items
150
- end
151
- items
152
- end
153
-
154
- # Returns a nested Hash with Slop options and values. See Slop#to_hash.
155
- def to_hash
156
- Hash[commands.map { |k, v| [k.to_sym, v.to_hash] }]
157
- end
158
-
159
- # Returns the help String.
160
- def to_s
161
- defaults = commands.delete('default')
162
- globals = commands.delete('global')
163
- helps = commands.reject { |_, v| v.options.none? }
164
- if globals && globals.options.any?
165
- helps.merge!('Global options' => globals.to_s)
166
- end
167
- if defaults && defaults.options.any?
168
- helps.merge!('Other options' => defaults.to_s)
169
- end
170
- banner = @banner ? "#{@banner}\n" : ""
171
- banner + helps.map { |key, opts| " #{key}\n#{opts}" }.join("\n\n")
172
- end
173
- alias help to_s
174
-
175
- # Returns the inspection String.
176
- def inspect
177
- "#<Slop::Commands #{config.inspect} #{commands.values.map(&:inspect)}>"
178
- end
179
-
180
- private
181
-
182
- # Returns nothing.
183
- def execute_arguments!(items)
184
- @arguments = items.take_while { |arg| !arg.start_with?('-') }
185
- items.shift @arguments.size
186
- end
187
-
188
- # Returns nothing.
189
- def execute_global_opts!(items)
190
- if global_opts = commands['global']
191
- global_opts.parse! items
192
- end
193
- end
194
-
195
- end
196
- end
@@ -1,26 +0,0 @@
1
- require 'helper'
2
-
3
- class CommandsTest < TestCase
4
-
5
- def setup
6
- @opts = Slop.new do |o|
7
- o.on :v, :version
8
- o.command :add do |add|
9
- add.on :v, 'verbose mode'
10
- end
11
- end
12
- end
13
-
14
- test "parse! removes the command AND its options" do
15
- items = %w'add -v'
16
- @opts.parse! items
17
- assert_equal [], items
18
- end
19
-
20
- test "parse does not remove the command or its options" do
21
- items = %w'add -v'
22
- @opts.parse items
23
- assert_equal ['add', '-v'], items
24
- end
25
-
26
- end
@@ -1,12 +0,0 @@
1
- $VERBOSE = true
2
-
3
- require 'slop'
4
-
5
- require 'minitest/autorun'
6
- require 'stringio'
7
-
8
- class TestCase < Minitest::Test
9
- def self.test(name, &block)
10
- define_method("test_#{name.gsub(/\W/, '_')}", &block) if block
11
- end
12
- end
@@ -1,518 +0,0 @@
1
- require 'helper'
2
-
3
- class SlopTest < TestCase
4
-
5
- def build_option(*args)
6
- opt = Slop.new.send(:build_option, args)
7
- config = opt.config.reject { |k, v| v == Slop::Option::DEFAULT_OPTIONS[k] }
8
- [opt.short, opt.long, opt.description, config]
9
- end
10
-
11
- def temp_argv(items)
12
- old_argv = ARGV.clone
13
- ARGV.replace items
14
- yield
15
- ensure
16
- ARGV.replace old_argv
17
- end
18
-
19
- def temp_stdout
20
- $stdout = StringIO.new
21
- yield $stdout.string
22
- ensure
23
- $stdout = STDOUT
24
- end
25
-
26
- test "includes Enumerable" do
27
- assert_includes Slop.included_modules, Enumerable
28
- end
29
-
30
- test "enumerates Slop::Option objects in #each" do
31
- Slop.new { on :f; on :b; }.each { |o| assert_kind_of Slop::Option, o }
32
- end
33
-
34
- test "build_option" do
35
- assert_equal ['f', nil, nil, {}], build_option(:f)
36
- assert_equal [nil, 'foo', nil, {}], build_option(:foo)
37
- assert_equal ['f', nil, 'Some description', {}], build_option(:f, 'Some description')
38
- assert_equal ['f', 'foo', nil, {}], build_option(:f, :foo)
39
- assert_equal [nil, '1.8', 'Use v. 1.8', {}], build_option('--1.8', 'Use v. 1.8')
40
-
41
- # with arguments
42
- assert_equal ['f', nil, nil, {:argument=>true}], build_option('f=')
43
- assert_equal [nil, 'foo', nil, {:argument=>true}], build_option('foo=')
44
- assert_equal [nil, 'foo', nil, {:optional_argument=>true}], build_option('foo=?')
45
- end
46
-
47
- test "parsing option=value" do
48
- slop = Slop.new { on :foo= }
49
- slop.parse %w' --foo=bar '
50
- assert_equal 'bar', slop[:foo]
51
-
52
- slop = Slop.new(:multiple_switches => false) { on :f=; on :b= }
53
- slop.parse %w' -fabc -bdef '
54
- assert_equal 'abc', slop[:f]
55
- assert_equal 'def', slop[:b]
56
- end
57
-
58
- test "fetch_option" do
59
- slop = Slop.new
60
- opt1 = slop.on :f, :foo
61
- opt2 = slop.on :bar
62
-
63
- assert_equal opt1, slop.fetch_option(:foo)
64
- assert_equal opt1, slop.fetch_option(:f)
65
- assert_equal opt2, slop.fetch_option(:bar)
66
- assert_equal opt2, slop.fetch_option('--bar')
67
- assert_nil slop.fetch_option(:baz)
68
- end
69
-
70
- test "default all options to take arguments" do
71
- slop = Slop.new(:arguments => true)
72
- opt1 = slop.on :foo
73
- opt2 = slop.on :bar, :argument => false
74
-
75
- assert opt1.expects_argument?
76
- refute opt2.expects_argument?
77
- end
78
-
79
- test "extract_option" do
80
- slop = Slop.new
81
- extract = proc { |flag| slop.send(:extract_option, flag) }
82
- slop.on :opt=
83
-
84
- assert_kind_of Array, extract['--foo']
85
- assert_equal 'bar', extract['--foo=bar'][1]
86
- assert_equal 'bar', extract['-f=bar'][1]
87
- assert_nil extract['--foo'][0]
88
- assert_kind_of Slop::Option, extract['--opt'][0]
89
- assert_equal false, extract['--no-opt'][1]
90
- end
91
-
92
- test "non-options yielded to parse()" do
93
- foo = nil
94
- slop = Slop.new
95
- slop.parse ['foo'] do |x| foo = x end
96
- assert_equal 'foo', foo
97
- end
98
-
99
- test "::parse returns a Slop object" do
100
- assert_kind_of Slop, Slop.parse([])
101
- end
102
-
103
- test "parse" do
104
- slop = Slop.new
105
- assert_equal ['foo'], slop.parse(%w'foo')
106
- assert_equal ['foo'], slop.parse!(%w'foo')
107
- end
108
-
109
- test "parse!" do
110
- slop = Slop.new { on :foo= }
111
- assert_equal [], slop.parse!(%w'--foo bar')
112
- slop = Slop.new { on :baz }
113
- assert_equal ['etc'], slop.parse!(%w'--baz etc')
114
- end
115
-
116
- test "new() accepts a hash of configuration options" do
117
- slop = Slop.new(:foo => :bar)
118
- assert_equal :bar, slop.config[:foo]
119
- end
120
-
121
- test "defaulting to ARGV" do
122
- temp_argv(%w/--name lee/) do
123
- opts = Slop.parse { on :name= }
124
- assert_equal 'lee', opts[:name]
125
- end
126
- end
127
-
128
- test "automatically adding the help option" do
129
- slop = Slop.new :help => true
130
- refute_empty slop.options
131
- assert_equal 'Display this help message.', slop.options.first.description
132
- end
133
-
134
- test "default help exits" do
135
- temp_stdout do
136
- slop = Slop.new :help => true
137
- assert_raises SystemExit do
138
- slop.parse %w/--help/
139
- end
140
- end
141
- end
142
-
143
- test ":arguments and :optional_arguments config options" do
144
- slop = Slop.new(:arguments => true) { on :foo }
145
- assert slop.fetch_option(:foo).expects_argument?
146
-
147
- slop = Slop.new(:optional_arguments => true) { on :foo }
148
- assert slop.fetch_option(:foo).accepts_optional_argument?
149
- end
150
-
151
- test "yielding non-options when a block is passed to parse()" do
152
- items = []
153
- opts = Slop.new { on :name= }
154
- opts.parse(%w/--name lee a b c/) { |v| items << v }
155
- assert_equal ['a', 'b', 'c'], items
156
- end
157
-
158
- test "on empty callback" do
159
- opts = Slop.new
160
- foo = nil
161
- opts.add_callback(:empty) { foo = "bar" }
162
- opts.parse []
163
- assert_equal "bar", foo
164
- end
165
-
166
- test "on no_options callback" do
167
- opts = Slop.new
168
- foo = nil
169
- opts.add_callback(:no_options) { foo = "bar" }
170
- opts.parse %w( --foo --bar etc hello )
171
- assert_equal "bar", foo
172
- end
173
-
174
- test "to_hash()" do
175
- opts = Slop.new { on :foo=; on :bar; on :baz; on :zip }
176
- opts.parse(%w'--foo hello --no-bar --baz')
177
- assert_equal({ :foo => 'hello', :bar => false, :baz => true, :zip => nil }, opts.to_hash)
178
- end
179
-
180
- test "missing() returning all missing option keys" do
181
- opts = Slop.new { on :foo; on :bar }
182
- opts.parse %w'--foo'
183
- assert_equal ['bar'], opts.missing
184
- end
185
-
186
- test "autocreating options" do
187
- opts = Slop.new :autocreate => true
188
- opts.parse %w[ --foo bar --baz ]
189
- assert opts.fetch_option(:foo).expects_argument?
190
- assert opts.fetch_option(:foo).autocreated?
191
- assert_equal 'bar', opts.fetch_option(:foo).value
192
- refute opts.fetch_option(:baz).expects_argument?
193
- assert_equal nil, opts.fetch_option(:bar)
194
-
195
- opts = Slop.new :autocreate => true do
196
- on :f, :foo=
197
- end
198
- opts.parse %w[ --foo bar --baz stuff ]
199
- assert_equal 'bar', opts[:foo]
200
- assert_equal 'stuff', opts[:baz]
201
- end
202
-
203
- test "option terminator" do
204
- opts = Slop.new { on :foo= }
205
- items = %w' foo -- --foo bar '
206
- opts.parse! items
207
- assert_equal %w' foo --foo bar ', items
208
- end
209
-
210
- test "raising an InvalidArgumentError when the argument doesn't match" do
211
- opts = Slop.new { on :foo=, :match => /^[a-z]+$/ }
212
- assert_raises(Slop::InvalidArgumentError) { opts.parse %w' --foo b4r '}
213
- end
214
-
215
- test "raising a MissingArgumentError when the option expects an argument" do
216
- opts = Slop.new { on :foo= }
217
- assert_raises(Slop::MissingArgumentError) { opts.parse %w' --foo '}
218
- end
219
-
220
- test "raising a MissingOptionError when a required option is missing" do
221
- opts = Slop.new { on :foo, :required => true }
222
- assert_raises(Slop::MissingOptionError) { opts.parse %w'' }
223
- end
224
-
225
- test "raising InvalidOptionError when strict mode is enabled and an unknown option appears" do
226
- opts = Slop.new :strict => true
227
- assert_raises(Slop::InvalidOptionError) { opts.parse %w'--foo' }
228
- assert_raises(Slop::InvalidOptionError) { opts.parse %w'-fabc' }
229
- end
230
-
231
- test "raising InvalidOptionError for multiple short options" do
232
- opts = Slop.new :strict => true
233
- opts.on :L
234
- assert_raises(Slop::InvalidOptionError) { opts.parse %w'-Ly' }
235
-
236
- # but not with no strict mode!
237
- opts = Slop.new
238
- opts.on :L
239
- assert opts.parse %w'-Ly'
240
- end
241
-
242
- test "multiple_switches is enabled by default" do
243
- opts = Slop.new { on :f; on :b }
244
- opts.parse %w[ -fb ]
245
- assert opts.present?(:f)
246
- assert opts.present?(:b)
247
- end
248
-
249
- test "multiple_switches disabled" do
250
- opts = Slop.new(:multiple_switches => false) { on :f= }
251
- opts.parse %w[ -fabc123 ]
252
- assert_equal 'abc123', opts[:f]
253
- end
254
-
255
- test "muiltiple_switches should not trash arguments" do
256
- opts = Slop.new{ on :f; on :b }
257
- args = opts.parse!(%w'-fb foo')
258
- assert_equal %w'foo', args
259
- end
260
-
261
- test "multiple options should still accept trailing arguments" do
262
- opts = Slop.new { on :a; on :b= }
263
- opts.parse %w'-ab foo'
264
- assert_equal 'foo', opts[:b]
265
- end
266
-
267
- test "setting/getting the banner" do
268
- opts = Slop.new :banner => 'foo'
269
- assert_equal 'foo', opts.banner
270
-
271
- opts = Slop.new
272
- opts.banner 'foo'
273
- assert_equal 'foo', opts.banner
274
-
275
- opts = Slop.new
276
- opts.banner = 'foo'
277
- assert_equal 'foo', opts.banner
278
- end
279
-
280
- test "get/[] fetching an options argument value" do
281
- opts = Slop.new { on :foo=; on :bar; on :baz }
282
- opts.parse %w' --foo hello --bar '
283
- assert_equal 'hello', opts[:foo]
284
- assert_equal true, opts[:bar]
285
- assert_nil opts[:baz]
286
- end
287
-
288
- test "checking for an options presence" do
289
- opts = Slop.new { on :foo; on :bar }
290
- opts.parse %w' --foo '
291
- assert opts.present?(:foo)
292
- refute opts.present?(:bar)
293
- end
294
-
295
- test "ignoring case" do
296
- opts = Slop.new { on :foo }
297
- opts.parse %w' --FOO bar '
298
- assert_nil opts[:foo]
299
-
300
- opts = Slop.new(:ignore_case => true) { on :foo= }
301
- opts.parse %w' --FOO bar '
302
- assert_equal 'bar', opts[:foo]
303
- end
304
-
305
- test "supporting dash" do
306
- opts = Slop.new { on :foo_bar= }
307
- opts.parse %w' --foo-bar baz '
308
- assert_equal 'baz', opts[:foo_bar]
309
- assert opts.foo_bar?
310
- end
311
-
312
- test "supporting underscore" do
313
- opts = Slop.new { on :foo_bar= }
314
- opts.parse %w' --foo_bar baz '
315
- assert_equal 'baz', opts[:foo_bar]
316
- assert opts.foo_bar?
317
- end
318
-
319
- # test "parsing an optspec and building options" do
320
- # optspec = <<-SPEC
321
- # ruby foo.rb [options]
322
- # --
323
- # v,verbose enable verbose mode
324
- # q,quiet enable quiet mode
325
- # n,name= set your name
326
- # p,pass=? set your password
327
- # SPEC
328
- # opts = Slop.optspec(optspec.gsub(/^\s+/, ''))
329
- # opts.parse %w[ --verbose --name Lee ]
330
-
331
- # assert_equal 'Lee', opts[:name]
332
- # assert opts.present?(:verbose)
333
- # assert_equal 'enable quiet mode', opts.fetch_option(:quiet).description
334
- # assert opts.fetch_option(:pass).accepts_optional_argument?
335
- # end
336
-
337
- test "ensure negative integers are not processed as options" do
338
- items = %w(-1)
339
- Slop.parse!(items)
340
- assert_equal %w(-1), items
341
- end
342
-
343
- test "separators" do
344
- opts = Slop.new(:banner => false) do
345
- on :foo
346
- separator "hello"
347
- separator "world"
348
- on :bar
349
- end
350
- assert_equal " --foo \nhello\nworld\n --bar ", opts.help
351
-
352
- opts = Slop.new do
353
- banner "foo"
354
- separator "bar"
355
- end
356
- assert_equal "foo\nbar\n", opts.help
357
- end
358
-
359
- test "printing help with :help => true" do
360
- temp_stdout do |string|
361
- opts = Slop.new(:help => true, :banner => false)
362
- assert_raises SystemExit do
363
- opts.parse %w( --help )
364
- end
365
- assert_equal " -h, --help Display this help message.\n", string
366
- end
367
-
368
- temp_stdout do |string|
369
- opts = Slop.new(:help => true)
370
- assert_raises SystemExit do
371
- opts.parse %w( --help )
372
- end
373
- assert_equal "Usage: rake_test_loader [options]\n -h, --help Display this help message.\n", string
374
- end
375
- end
376
-
377
- test "fallback to substituting - for _ when using <option>?" do
378
- opts = Slop.new do
379
- on 'foo-bar'
380
- end
381
- opts.parse %w( --foo-bar )
382
- assert opts.foo_bar?
383
- end
384
-
385
- test "option=value syntax does NOT consume following argument" do
386
- opts = Slop.new { on :foo=; on 'bar=?' }
387
- args = %w' --foo=bar baz --bar=zing hello '
388
- opts.parse!(args)
389
- assert_equal %w' baz hello ', args
390
- end
391
-
392
- test "context and return value of constructor block" do
393
- peep = nil
394
- ret = Slop.new { peep = self }
395
- assert_same ret, peep
396
- assert !equal?(peep)
397
-
398
- peep = nil
399
- ret = Slop.new { |a| peep = self }
400
- assert !peep.equal?(ret)
401
- assert_same peep, self
402
-
403
- peep = nil
404
- ret = Slop.new { |a, b| peep = self }
405
- assert_same ret, peep
406
- assert !equal?(peep)
407
-
408
- peep = nil
409
- ret = Slop.new { |a, *rest| peep = self }
410
- assert_same ret, peep
411
- assert !equal?(peep)
412
-
413
- peep = nil
414
- ret = Slop.parse([]) { peep = self }
415
- assert_same ret, peep
416
- assert !equal?(peep)
417
-
418
- peep = nil
419
- ret = Slop.parse([]) { |a| peep = self }
420
- assert !peep.equal?(ret)
421
- assert_same peep, self
422
-
423
- peep = nil
424
- ret = Slop.parse([]) { |a, b| peep = self }
425
- assert_same ret, peep
426
- assert !equal?(peep)
427
-
428
- peep = nil
429
- ret = Slop.parse([]) { |a, *rest| peep = self }
430
- assert_same ret, peep
431
- assert !equal?(peep)
432
- end
433
-
434
- test "to_s do not break self" do
435
- slop = Slop.new do
436
- banner "foo"
437
- end
438
-
439
- assert_equal "foo", slop.banner
440
- slop.to_s
441
- assert_equal "foo", slop.banner
442
- end
443
-
444
- test "options with prefixed --no should not default to inverted behaviour unless intended" do
445
- opts = Slop.new { on :bar }
446
- opts.parse %w'--no-bar'
447
- assert_equal false, opts[:bar]
448
-
449
- opts = Slop.new { on 'no-bar' }
450
- opts.parse %w'--no-bar'
451
- assert_equal true, opts['no-bar']
452
- end
453
-
454
- test "method missing() is a private method" do
455
- assert Slop.new.private_methods.map(&:to_sym).include?(:method_missing)
456
- end
457
-
458
- test "respond_to?() arity checker is similar of other objects" do
459
- slop = Slop.new
460
- obj = Object.new
461
-
462
- assert_same obj.respond_to?(:__id__), slop.respond_to?(:__id__)
463
- assert_same obj.respond_to?(:__id__, false), slop.respond_to?(:__id__, false)
464
- assert_same obj.respond_to?(:__id__, true), slop.respond_to?(:__id__, true)
465
-
466
- assert_raises ArgumentError do
467
- slop.respond_to? :__id__, false, :INVALID_ARGUMENT
468
- end
469
- end
470
-
471
- test "adding a runner" do
472
- orun = proc { |r| assert_instance_of Slop, r }
473
- arun = proc { |r| assert_equal ['foo', 'bar'], r }
474
-
475
- Slop.parse(%w'foo --foo bar -v bar') do
476
- on :v
477
- on :foo=
478
- run { |o, a| orun[o]; arun[a] }
479
- end
480
- end
481
-
482
- test "ensure a runner does not execute when a help option is present" do
483
- items = []
484
- Slop.parse(%w'--help foo bar') do
485
- run { |o, a| items.concat a }
486
- end
487
- assert_equal %w'--help foo bar', items
488
- items.clear
489
- temp_stdout do
490
- assert_raises SystemExit do
491
- Slop.parse(%w'--help foo bar', :help => true) do
492
- run { |o, a| items.concat a }
493
- end
494
- end
495
- assert_empty items
496
- end
497
- end
498
-
499
- test "duplicate options should not exist, new options should replace old ones" do
500
- i = nil
501
- Slop.parse(%w'-v') do
502
- on(:v) { i = 'first' }
503
- on(:v) { i = 'second' }
504
- end
505
- assert_equal 'second', i
506
- end
507
-
508
- test "taking out the trash" do
509
- args = []
510
- opts = Slop.new { on :f, :foo }
511
- opts.run { |_, a| args = a }
512
- opts.parse! %w(--foo bar)
513
- assert_equal %w(bar), args
514
- opts.parse! %w(foo)
515
- assert_equal %w(foo), args
516
- end
517
-
518
- end