trollop 1.16.2 → 2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/FAQ.txt +57 -43
- data/History.txt +9 -0
- data/README.txt +14 -16
- data/lib/trollop.rb +42 -41
- data/test/test_trollop.rb +78 -35
- metadata +31 -37
data/FAQ.txt
CHANGED
@@ -2,45 +2,37 @@ Trollop FAQ
|
|
2
2
|
-----------
|
3
3
|
|
4
4
|
Q: Why is it called "Trollop"?
|
5
|
-
A: No reason.
|
5
|
+
A: No good reason. Something something option parsing.
|
6
6
|
|
7
7
|
Q: Why should I use Trollop?
|
8
|
-
A: Because it will take you
|
9
|
-
than
|
10
|
-
|
11
|
-
Look at this:
|
8
|
+
A: Because it will take you fewer lines of code to parse commandline arguments
|
9
|
+
than anything else out there.
|
12
10
|
|
11
|
+
Like this:
|
13
12
|
opts = Trollop::options do
|
14
13
|
opt :monkey, "Use monkey mode"
|
15
14
|
opt :goat, "Use goat mode", :default => true
|
16
15
|
opt :num_limbs, "Set number of limbs", :default => 4
|
17
16
|
end
|
18
17
|
|
19
|
-
That's it.
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
That's it. 'opts' will be a hash and you can do whatever you want with it.
|
19
|
+
You don't have to mix processing code with the declarations. You don't have
|
20
|
+
to make a class for every option (what is this, Java?). You don't have to
|
21
|
+
write more than 1 line of code per option.
|
23
22
|
|
24
23
|
Plus, you get a beautiful help screen that detects your terminal width and
|
25
|
-
wraps appropriately.
|
24
|
+
wraps appropriately.
|
26
25
|
|
27
26
|
Q: What is the philosophy behind Trollop?
|
28
|
-
A:
|
29
|
-
|
30
|
-
|
31
|
-
A: Ok, it's this: Trollop *just* does the parsing and gives you a hash table
|
32
|
-
of the result. So whatever fancy logic or constraints you need, you can
|
33
|
-
implement by operating on that hash table. Options that disable other
|
34
|
-
options, fancy constraints involving multiple sets of values across multiple
|
35
|
-
sets of options, etc. are all left for you to do manually.
|
27
|
+
A: Trollop does the parsing and gives you a hash table of options. You then
|
28
|
+
write whatever fancy constraint logic you need as regular Ruby code operating
|
29
|
+
on that hash table.
|
36
30
|
|
37
|
-
(Trollop does support limited
|
38
|
-
|
31
|
+
(Trollop does support limited constraints (see #conflicts and #depends), but
|
32
|
+
any non-trivial program will probably need to get fancier.)
|
39
33
|
|
40
|
-
|
41
|
-
|
42
|
-
Trollop::die to abort the program and give a fancy options-related error
|
43
|
-
message.
|
34
|
+
Then if you need to abort and tell the user to fix their command line at any
|
35
|
+
point, you can call #die and Trollop will do that for you in a pretty way.
|
44
36
|
|
45
37
|
Q: What happens to the other stuff on the commandline?
|
46
38
|
A: Anything Trollop doesn't recognize as an option or as an option parameter is
|
@@ -49,36 +41,58 @@ A: Anything Trollop doesn't recognize as an option or as an option parameter is
|
|
49
41
|
Q: Does Trollop support multiple-value arguments?
|
50
42
|
A: Yes. If you set the :type of an option to something plural, like ":ints",
|
51
43
|
":strings", ":doubles", ":floats", ":ios", it will accept multiple arguments
|
52
|
-
on the commandline and the value will be an array of
|
44
|
+
on the commandline, and the value will be an array of the parameters.
|
53
45
|
|
54
46
|
Q: Does Trollop support arguments that can be given multiple times?
|
55
47
|
A: Yes. If you set :multi to true, then the argument can appear multiple times
|
56
48
|
on the commandline, and the value will be an array of the parameters.
|
57
49
|
|
58
50
|
Q: Does Trollop support subcommands?
|
59
|
-
A: Yes
|
60
|
-
|
61
|
-
|
62
|
-
the commandline, it stops processing and returns.
|
51
|
+
A: Yes: you can direct Trollop to stop processing when it encounters certain
|
52
|
+
tokens. Then you can re-call Trollop with the subcommand-specific
|
53
|
+
configuration to process the rest of the commandline.
|
63
54
|
|
64
|
-
|
65
|
-
options, since Trollop has contained the rest. So you can consume the
|
66
|
-
subcommand and call Trollop.options again with the particular options set
|
67
|
-
for that subcommand.
|
55
|
+
See the third example on the webpage.
|
68
56
|
|
69
|
-
|
57
|
+
(And if you don't know the subcommands ahead of time, you can call
|
70
58
|
#stop_on_unknown, which will cause Trollop to stop when it encounters any
|
71
59
|
unknown token. This might be more trouble than its worth if you're also
|
72
|
-
passing filenames on the commandline.
|
73
|
-
|
74
|
-
It's probably easier to see the example on the webpage than to read all
|
75
|
-
that.
|
60
|
+
passing filenames on the commandline.)
|
76
61
|
|
77
62
|
Q: Why does Trollop disallow numeric short argument names, like '-1' and '-9'?
|
78
63
|
A: Because it's ambiguous whether these are arguments or negative integer or
|
79
|
-
floating-point parameters to arguments. E.g.,
|
80
|
-
|
64
|
+
floating-point parameters to arguments. E.g., is "-f -3" a negative floating
|
65
|
+
point parameter to -f, or two separate arguments?
|
66
|
+
|
67
|
+
Q: What was the big change in version 2.0?
|
68
|
+
A: The big change was boolean parameter (aka flag) handling. In pre-2.0,
|
69
|
+
not specifying a flag on the commandline would result in the option being set
|
70
|
+
to its default value; specifying it on the commandline would result in the
|
71
|
+
option being set to the opposite of its default value. This was weird for
|
72
|
+
options with a default of true:
|
73
|
+
opt :magic, "Use magic", default: true
|
74
|
+
Using --magic with the above configuration would result in a :magic => false
|
75
|
+
value in the options hash.
|
76
|
+
|
77
|
+
In 2.0, we introduce the GNU-style notion of a --no-x parameter. Now,
|
78
|
+
specifying --x will always set the option :x to true, regardless of its
|
79
|
+
default value, and specifying --no-x will always set the option :x to false,
|
80
|
+
regardless of its default value. The default value only comes into play when
|
81
|
+
neither form is given on the commandline.
|
82
|
+
|
83
|
+
E.g.:
|
84
|
+
opt :magic, "Use magic", :default => true
|
85
|
+
|
86
|
+
Using --magic will result in :magic => true, and --no-magic will result in
|
87
|
+
:magic => false, and neither will result in :magic => true.
|
88
|
+
|
89
|
+
There is one exception: if the option itself starts with a "no_", then you'll
|
90
|
+
get the opposite behavior:
|
91
|
+
|
92
|
+
opt :no_magic, "Don't use magic", :default => true
|
93
|
+
|
94
|
+
Using --magic will result in :no_magic => false, and --no-magic will result in
|
95
|
+
:no_magic => true, and neither will result in :no_magic => true.
|
96
|
+
|
97
|
+
|
81
98
|
|
82
|
-
I could be very clever and detect when there are no arguments that require
|
83
|
-
floating-point parameters, and allow such short option names in those cases,
|
84
|
-
but opted for simplicity and consistency.
|
data/History.txt
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
== 2.0 / 2012-08-11
|
2
|
+
* Change flag logic: --no-X will always be false, and --X will always be true,
|
3
|
+
regardless of default.
|
4
|
+
* For flags that default to true, display --no-X instead of --X in the help
|
5
|
+
menu. Accept both versions on the commandline.
|
6
|
+
* Fix a spurious warning
|
7
|
+
* Update Rakefile to 1.9
|
8
|
+
* Minor documentation fixes
|
9
|
+
|
1
10
|
== 1.16.2 / 2010-04-06
|
2
11
|
* Bugfix in Trollop::options. Thanks to Brian C. Thomas for pointing it out.
|
3
12
|
|
data/README.txt
CHANGED
@@ -4,27 +4,26 @@ by William Morgan (http://masanjin.net/)
|
|
4
4
|
|
5
5
|
Main page: http://trollop.rubyforge.org
|
6
6
|
|
7
|
-
Release announcements and comments: http://
|
7
|
+
Release announcements and comments: http://masanjin.net/blog/label/trollop/.
|
8
8
|
|
9
9
|
Documentation quickstart: See Trollop.options and then Trollop::Parser#opt.
|
10
10
|
Also see the examples at http://trollop.rubyforge.org/.
|
11
11
|
|
12
12
|
== DESCRIPTION
|
13
13
|
|
14
|
-
Trollop is a commandline option parser for Ruby that just gets out of your
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
Trollop is a commandline option parser for Ruby that just gets out of your way.
|
15
|
+
One line of code per option is all you need to write. For that, you get a nice
|
16
|
+
automatically-generated help page, robust option parsing, and sensible defaults
|
17
|
+
for everything you don't specify.
|
18
18
|
|
19
|
-
== FEATURES
|
19
|
+
== FEATURES
|
20
20
|
|
21
21
|
- Dirt-simple usage.
|
22
|
+
- Single file. Throw it in lib/ if you don't want to make it a Rubygem dependency.
|
22
23
|
- Sensible defaults. No tweaking necessary, much tweaking possible.
|
23
|
-
- Support for long options, short options,
|
24
|
-
|
25
|
-
- Support for subcommands.
|
24
|
+
- Support for long options, short options, subcommands, and automatic type validation and
|
25
|
+
conversion.
|
26
26
|
- Automatic help message generation, wrapped to current screen width.
|
27
|
-
- Lots of unit tests.
|
28
27
|
|
29
28
|
== REQUIREMENTS
|
30
29
|
|
@@ -38,15 +37,14 @@ subcompletion, and sensible defaults for everything you don't specify.
|
|
38
37
|
|
39
38
|
require 'trollop'
|
40
39
|
opts = Trollop::options do
|
41
|
-
opt :monkey, "Use monkey mode"
|
42
|
-
opt :
|
43
|
-
opt :num_limbs, "Number of limbs", :default => 4
|
44
|
-
opt :num_thumbs, "Number of thumbs", :type => :int # integer --num-thumbs <i>, default nil
|
40
|
+
opt :monkey, "Use monkey mode" # flag --monkey, default false
|
41
|
+
opt :name, "Monkey name", :type => :string # string --name <s>, default nil
|
42
|
+
opt :num_limbs, "Number of limbs", :default => 4 # integer --num-limbs <i>, default to 4
|
45
43
|
end
|
46
44
|
|
47
|
-
p opts # a hash: { :monkey
|
45
|
+
p opts # a hash: { :monkey=>false, :name=>nil, :num_limbs=>4, :help=>false }
|
48
46
|
|
49
47
|
== LICENSE
|
50
48
|
|
51
|
-
Copyright (c) 2008--
|
49
|
+
Copyright (c) 2008--2012 William Morgan. Trollop is distributed under the same
|
52
50
|
terms as Ruby.
|
data/lib/trollop.rb
CHANGED
@@ -7,12 +7,12 @@ require 'date'
|
|
7
7
|
|
8
8
|
module Trollop
|
9
9
|
|
10
|
-
VERSION = "
|
10
|
+
VERSION = "2.0"
|
11
11
|
|
12
12
|
## Thrown by Parser in the event of a commandline error. Not needed if
|
13
13
|
## you're using the Trollop::options entry.
|
14
14
|
class CommandlineError < StandardError; end
|
15
|
-
|
15
|
+
|
16
16
|
## Thrown by Parser if the user passes in '-h' or '--help'. Handled
|
17
17
|
## automatically by Trollop#options.
|
18
18
|
class HelpNeeded < StandardError; end
|
@@ -154,12 +154,11 @@ class Parser
|
|
154
154
|
## a multi-valued argument. for that you have to specify a :type
|
155
155
|
## as well. (this is how we disambiguate an ambiguous situation;
|
156
156
|
## see the docs for Parser#opt for details.)
|
157
|
-
disambiguated_default =
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
end
|
157
|
+
disambiguated_default = if opts[:multi] && opts[:default].is_a?(Array) && !opts[:type]
|
158
|
+
opts[:default].first
|
159
|
+
else
|
160
|
+
opts[:default]
|
161
|
+
end
|
163
162
|
|
164
163
|
type_from_default =
|
165
164
|
case disambiguated_default
|
@@ -193,15 +192,11 @@ class Parser
|
|
193
192
|
|
194
193
|
## fill in :long
|
195
194
|
opts[:long] = opts[:long] ? opts[:long].to_s : name.to_s.gsub("_", "-")
|
196
|
-
opts[:long] =
|
197
|
-
|
198
|
-
when
|
199
|
-
|
200
|
-
|
201
|
-
opts[:long]
|
202
|
-
else
|
203
|
-
raise ArgumentError, "invalid long option name #{opts[:long].inspect}"
|
204
|
-
end
|
195
|
+
opts[:long] = case opts[:long]
|
196
|
+
when /^--([^-].*)$/; $1
|
197
|
+
when /^[^-]/; opts[:long]
|
198
|
+
else; raise ArgumentError, "invalid long option name #{opts[:long].inspect}"
|
199
|
+
end
|
205
200
|
raise ArgumentError, "long option name #{opts[:long].inspect} is already taken; please specify a (different) :long" if @long[opts[:long]]
|
206
201
|
|
207
202
|
## fill in :short
|
@@ -295,19 +290,26 @@ class Parser
|
|
295
290
|
vals[sym] = [] if opts[:multi] && !opts[:default] # multi arguments default to [], not nil
|
296
291
|
end
|
297
292
|
|
298
|
-
resolve_default_short_options
|
293
|
+
resolve_default_short_options!
|
299
294
|
|
300
295
|
## resolve symbols
|
301
296
|
given_args = {}
|
302
297
|
@leftovers = each_arg cmdline do |arg, params|
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
when /^--([^-]\S*)$/
|
307
|
-
@long[$1]
|
298
|
+
## handle --no- forms
|
299
|
+
arg, negative_given = if arg =~ /^--no-([^-]\S*)$/
|
300
|
+
["--#{$1}", true]
|
308
301
|
else
|
309
|
-
|
302
|
+
[arg, false]
|
310
303
|
end
|
304
|
+
|
305
|
+
sym = case arg
|
306
|
+
when /^-([^-])$/; @short[$1]
|
307
|
+
when /^--([^-]\S*)$/; @long[$1] || @long["no-#{$1}"]
|
308
|
+
else; raise CommandlineError, "invalid argument syntax: '#{arg}'"
|
309
|
+
end
|
310
|
+
|
311
|
+
sym = nil if arg =~ /--no-/ # explicitly invalidate --no-no- arguments
|
312
|
+
|
311
313
|
raise CommandlineError, "unknown argument '#{arg}'" unless sym
|
312
314
|
|
313
315
|
if given_args.include?(sym) && !@specs[sym][:multi]
|
@@ -315,8 +317,8 @@ class Parser
|
|
315
317
|
end
|
316
318
|
|
317
319
|
given_args[sym] ||= {}
|
318
|
-
|
319
320
|
given_args[sym][:arg] = arg
|
321
|
+
given_args[sym][:negative_given] = negative_given
|
320
322
|
given_args[sym][:params] ||= []
|
321
323
|
|
322
324
|
# The block returns the number of parameters taken.
|
@@ -358,8 +360,7 @@ class Parser
|
|
358
360
|
|
359
361
|
## parse parameters
|
360
362
|
given_args.each do |sym, given_data|
|
361
|
-
arg = given_data
|
362
|
-
params = given_data[:params]
|
363
|
+
arg, params, negative_given = given_data.values_at :arg, :params, :negative_given
|
363
364
|
|
364
365
|
opts = @specs[sym]
|
365
366
|
raise CommandlineError, "option '#{arg}' needs a parameter" if params.empty? && opts[:type] != :flag
|
@@ -368,7 +369,7 @@ class Parser
|
|
368
369
|
|
369
370
|
case opts[:type]
|
370
371
|
when :flag
|
371
|
-
vals[sym] = !
|
372
|
+
vals[sym] = (sym.to_s =~ /^no_/ ? negative_given : !negative_given)
|
372
373
|
when :int, :ints
|
373
374
|
vals[sym] = params.map { |pg| pg.map { |p| parse_integer_parameter p, arg } }
|
374
375
|
when :float, :floats
|
@@ -415,19 +416,19 @@ class Parser
|
|
415
416
|
# chronic is not available
|
416
417
|
end
|
417
418
|
time ? Date.new(time.year, time.month, time.day) : Date.parse(param)
|
418
|
-
rescue ArgumentError
|
419
|
+
rescue ArgumentError
|
419
420
|
raise CommandlineError, "option '#{arg}' needs a date"
|
420
421
|
end
|
421
422
|
end
|
422
423
|
|
423
424
|
## Print the help message to +stream+.
|
424
425
|
def educate stream=$stdout
|
425
|
-
width #
|
426
|
+
width # hack: calculate it now; otherwise we have to be careful not to
|
426
427
|
# call this unless the cursor's at the beginning of a line.
|
427
|
-
|
428
428
|
left = {}
|
429
|
-
@specs.each do |name, spec|
|
429
|
+
@specs.each do |name, spec|
|
430
430
|
left[name] = "--#{spec[:long]}" +
|
431
|
+
(spec[:type] == :flag && spec[:default] ? ", --no-#{spec[:long]}" : "") +
|
431
432
|
(spec[:short] && spec[:short] != :none ? ", -#{spec[:short]}" : "") +
|
432
433
|
case spec[:type]
|
433
434
|
when :flag; ""
|
@@ -627,7 +628,7 @@ private
|
|
627
628
|
params
|
628
629
|
end
|
629
630
|
|
630
|
-
def resolve_default_short_options
|
631
|
+
def resolve_default_short_options!
|
631
632
|
@order.each do |type, name|
|
632
633
|
next unless type == :opt
|
633
634
|
opts = @specs[name]
|
@@ -662,7 +663,7 @@ private
|
|
662
663
|
end
|
663
664
|
|
664
665
|
## instance_eval but with ability to handle block arguments
|
665
|
-
## thanks to
|
666
|
+
## thanks to _why: http://redhanded.hobix.com/inspect/aBlockCostume.html
|
666
667
|
def cloaker &b
|
667
668
|
(class << self; self; end).class_eval do
|
668
669
|
define_method :cloaker_, &b
|
@@ -692,17 +693,16 @@ end
|
|
692
693
|
##
|
693
694
|
## require 'trollop'
|
694
695
|
## opts = Trollop::options do
|
695
|
-
## opt :monkey, "Use monkey mode"
|
696
|
-
## opt :
|
697
|
-
## opt :num_limbs, "Number of limbs", :default => 4
|
698
|
-
## opt :num_thumbs, "Number of thumbs", :type => :int # an integer --num-thumbs <i>, defaulting to nil
|
696
|
+
## opt :monkey, "Use monkey mode" # a flag --monkey, defaulting to false
|
697
|
+
## opt :name, "Monkey name", :type => :string # a string --name <s>, defaulting to nil
|
698
|
+
## opt :num_limbs, "Number of limbs", :default => 4 # an integer --num-limbs <i>, defaulting to 4
|
699
699
|
## end
|
700
700
|
##
|
701
701
|
## ## if called with no arguments
|
702
|
-
## p opts # => {
|
702
|
+
## p opts # => {:monkey=>false, :name=>nil, :num_limbs=>4, :help=>false}
|
703
703
|
##
|
704
704
|
## ## if called with --monkey
|
705
|
-
## p opts # => {:
|
705
|
+
## p opts # => {:monkey=>true, :name=>nil, :num_limbs=>4, :help=>false, :monkey_given=>true}
|
706
706
|
##
|
707
707
|
## See more examples at http://trollop.rubyforge.org.
|
708
708
|
def options args=ARGV, *a, &b
|
@@ -728,8 +728,9 @@ end
|
|
728
728
|
## end
|
729
729
|
##
|
730
730
|
## opts = Trollop::with_standard_exception_handling p do
|
731
|
-
## p.parse ARGV
|
731
|
+
## o = p.parse ARGV
|
732
732
|
## raise Trollop::HelpNeeded if ARGV.empty? # show help screen
|
733
|
+
## o
|
733
734
|
## end
|
734
735
|
##
|
735
736
|
## Requires passing in the parser object.
|
data/test/test_trollop.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
## Copyright:: Copyright 2007 William Morgan
|
4
4
|
## License:: GNU GPL version 2
|
5
5
|
|
6
|
+
require 'rubygems'
|
6
7
|
require 'test/unit'
|
7
8
|
require 'stringio'
|
8
9
|
require 'trollop'
|
@@ -41,7 +42,7 @@ class Trollop < ::Test::Unit::TestCase
|
|
41
42
|
assert_raise(CommandlineError) { @p.parse(%w(--arg2)) }
|
42
43
|
assert_raise(CommandlineError) { @p.parse(%w(--arg2 --arg3)) }
|
43
44
|
end
|
44
|
-
|
45
|
+
|
45
46
|
## flags that take an argument error unless given one
|
46
47
|
def test_argflags_demand_args
|
47
48
|
@p.opt "goodarg", "desc", :type => String
|
@@ -247,24 +248,66 @@ class Trollop < ::Test::Unit::TestCase
|
|
247
248
|
def test_conflicting_longs_detected
|
248
249
|
assert_nothing_raised { @p.opt "goodarg", "desc", :long => "--goodarg" }
|
249
250
|
assert_raise(ArgumentError) { @p.opt "badarg", "desc", :long => "--goodarg" }
|
250
|
-
end
|
251
|
+
end
|
251
252
|
|
252
253
|
## two args can't have the same :short
|
253
254
|
def test_conflicting_shorts_detected
|
254
255
|
assert_nothing_raised { @p.opt "goodarg", "desc", :short => "-g" }
|
255
256
|
assert_raise(ArgumentError) { @p.opt "badarg", "desc", :short => "-g" }
|
256
|
-
end
|
257
|
+
end
|
257
258
|
|
258
|
-
|
259
|
-
|
260
|
-
@p.opt
|
259
|
+
## note: this behavior has changed in trollop 2.0!
|
260
|
+
def test_flag_parameters
|
261
|
+
@p.opt :defaultnone, "desc"
|
262
|
+
@p.opt :defaultfalse, "desc", :default => false
|
263
|
+
@p.opt :defaulttrue, "desc", :default => true
|
264
|
+
|
265
|
+
## default state
|
266
|
+
opts = @p.parse []
|
267
|
+
assert_equal false, opts[:defaultnone]
|
268
|
+
assert_equal false, opts[:defaultfalse]
|
269
|
+
assert_equal true, opts[:defaulttrue]
|
270
|
+
|
271
|
+
## specifying turns them on, regardless of default
|
272
|
+
opts = @p.parse %w(--defaultfalse --defaulttrue --defaultnone)
|
273
|
+
assert_equal true, opts[:defaultnone]
|
274
|
+
assert_equal true, opts[:defaultfalse]
|
275
|
+
assert_equal true, opts[:defaulttrue]
|
276
|
+
|
277
|
+
## using --no- form turns them off, regardless of default
|
278
|
+
opts = @p.parse %w(--no-defaultfalse --no-defaulttrue --no-defaultnone)
|
279
|
+
assert_equal false, opts[:defaultnone]
|
280
|
+
assert_equal false, opts[:defaultfalse]
|
281
|
+
assert_equal false, opts[:defaulttrue]
|
282
|
+
end
|
283
|
+
|
284
|
+
## note: this behavior has changed in trollop 2.0!
|
285
|
+
def test_flag_parameters_for_inverted_flags
|
286
|
+
@p.opt :no_default_none, "desc"
|
287
|
+
@p.opt :no_default_false, "desc", :default => false
|
288
|
+
@p.opt :no_default_true, "desc", :default => true
|
289
|
+
|
290
|
+
## default state
|
261
291
|
opts = @p.parse []
|
262
|
-
assert_equal false, opts[
|
263
|
-
assert_equal
|
292
|
+
assert_equal false, opts[:no_default_none]
|
293
|
+
assert_equal false, opts[:no_default_false]
|
294
|
+
assert_equal true, opts[:no_default_true]
|
264
295
|
|
265
|
-
|
266
|
-
|
267
|
-
|
296
|
+
## specifying turns them all on, regardless of default
|
297
|
+
opts = @p.parse %w(--no-default-false --no-default-true --no-default-none)
|
298
|
+
p opts
|
299
|
+
assert_equal true, opts[:no_default_none]
|
300
|
+
assert_equal true, opts[:no_default_false]
|
301
|
+
assert_equal true, opts[:no_default_true]
|
302
|
+
|
303
|
+
## using dropped-no form turns them all off, regardless of default
|
304
|
+
opts = @p.parse %w(--default-false --default-true --default-none)
|
305
|
+
assert_equal false, opts[:no_default_none]
|
306
|
+
assert_equal false, opts[:no_default_false]
|
307
|
+
assert_equal false, opts[:no_default_true]
|
308
|
+
|
309
|
+
## disallow double negatives for reasons of sanity preservation
|
310
|
+
assert_raise(CommandlineError) { @p.parse %w(--no-no-default-true) }
|
268
311
|
end
|
269
312
|
|
270
313
|
def test_special_flags_work
|
@@ -679,27 +722,27 @@ EOM
|
|
679
722
|
assert_nothing_raised { @p.conflicts :one, :two }
|
680
723
|
assert_nothing_raised { @p.parse %w(--one) }
|
681
724
|
assert_nothing_raised { @p.parse %w(--two) }
|
682
|
-
assert_raises(CommandlineError) {
|
725
|
+
assert_raises(CommandlineError) { @p.parse %w(--one --two) }
|
683
726
|
|
684
727
|
@p.opt :hello
|
685
728
|
@p.opt :yellow
|
686
729
|
@p.opt :mellow
|
687
730
|
@p.opt :jello
|
688
731
|
@p.conflicts :hello, :yellow, :mellow, :jello
|
689
|
-
assert_raises(CommandlineError) {
|
690
|
-
assert_raises(CommandlineError) {
|
691
|
-
assert_raises(CommandlineError) {
|
732
|
+
assert_raises(CommandlineError) { @p.parse %w(--hello --yellow --mellow --jello) }
|
733
|
+
assert_raises(CommandlineError) { @p.parse %w(--hello --mellow --jello) }
|
734
|
+
assert_raises(CommandlineError) { @p.parse %w(--hello --jello) }
|
692
735
|
|
693
|
-
assert_nothing_raised {
|
694
|
-
assert_nothing_raised {
|
695
|
-
assert_nothing_raised {
|
696
|
-
assert_nothing_raised {
|
736
|
+
assert_nothing_raised { @p.parse %w(--hello) }
|
737
|
+
assert_nothing_raised { @p.parse %w(--jello) }
|
738
|
+
assert_nothing_raised { @p.parse %w(--yellow) }
|
739
|
+
assert_nothing_raised { @p.parse %w(--mellow) }
|
697
740
|
|
698
|
-
assert_nothing_raised {
|
699
|
-
assert_nothing_raised {
|
741
|
+
assert_nothing_raised { @p.parse %w(--mellow --one) }
|
742
|
+
assert_nothing_raised { @p.parse %w(--mellow --two) }
|
700
743
|
|
701
|
-
assert_raises(CommandlineError) {
|
702
|
-
assert_raises(CommandlineError) {
|
744
|
+
assert_raises(CommandlineError) { @p.parse %w(--mellow --two --jello) }
|
745
|
+
assert_raises(CommandlineError) { @p.parse %w(--one --mellow --two --jello) }
|
703
746
|
end
|
704
747
|
|
705
748
|
def test_conflict_error_messages
|
@@ -721,7 +764,7 @@ EOM
|
|
721
764
|
assert_raises(ArgumentError) { @p.depends :one, :two }
|
722
765
|
@p.opt :two
|
723
766
|
assert_nothing_raised { @p.depends :one, :two }
|
724
|
-
assert_nothing_raised {
|
767
|
+
assert_nothing_raised { @p.parse %w(--one --two) }
|
725
768
|
assert_raises(CommandlineError) { @p.parse %w(--one) }
|
726
769
|
assert_raises(CommandlineError) { @p.parse %w(--two) }
|
727
770
|
|
@@ -730,17 +773,17 @@ EOM
|
|
730
773
|
@p.opt :mellow
|
731
774
|
@p.opt :jello
|
732
775
|
@p.depends :hello, :yellow, :mellow, :jello
|
733
|
-
assert_nothing_raised {
|
734
|
-
assert_raises(CommandlineError) {
|
735
|
-
assert_raises(CommandlineError) {
|
776
|
+
assert_nothing_raised { @p.parse %w(--hello --yellow --mellow --jello) }
|
777
|
+
assert_raises(CommandlineError) { @p.parse %w(--hello --mellow --jello) }
|
778
|
+
assert_raises(CommandlineError) { @p.parse %w(--hello --jello) }
|
736
779
|
|
737
|
-
assert_raises(CommandlineError) {
|
738
|
-
assert_raises(CommandlineError) {
|
780
|
+
assert_raises(CommandlineError) { @p.parse %w(--hello) }
|
781
|
+
assert_raises(CommandlineError) { @p.parse %w(--mellow) }
|
739
782
|
|
740
|
-
assert_nothing_raised {
|
741
|
-
assert_nothing_raised {
|
783
|
+
assert_nothing_raised { @p.parse %w(--hello --yellow --mellow --jello --one --two) }
|
784
|
+
assert_nothing_raised { @p.parse %w(--hello --yellow --mellow --jello --one --two a b c) }
|
742
785
|
|
743
|
-
assert_raises(CommandlineError) {
|
786
|
+
assert_raises(CommandlineError) { @p.parse %w(--mellow --two --jello --one) }
|
744
787
|
end
|
745
788
|
|
746
789
|
def test_depend_error_messages
|
@@ -1049,7 +1092,7 @@ EOM
|
|
1049
1092
|
ARGV.clear
|
1050
1093
|
ARGV.unshift "-h"
|
1051
1094
|
assert_raises(SystemExit) do
|
1052
|
-
|
1095
|
+
::Trollop::options do
|
1053
1096
|
opt :potato
|
1054
1097
|
end
|
1055
1098
|
raise "broken"
|
@@ -1060,7 +1103,7 @@ EOM
|
|
1060
1103
|
ARGV.clear
|
1061
1104
|
ARGV.unshift "-v"
|
1062
1105
|
assert_raises(SystemExit) do
|
1063
|
-
|
1106
|
+
::Trollop::options do
|
1064
1107
|
version "1.2"
|
1065
1108
|
opt :potato
|
1066
1109
|
end
|
@@ -1083,7 +1126,7 @@ EOM
|
|
1083
1126
|
def test_simple_interface_handles_die
|
1084
1127
|
ARGV.clear
|
1085
1128
|
ARGV.unshift "--potato"
|
1086
|
-
|
1129
|
+
::Trollop::options do
|
1087
1130
|
opt :potato
|
1088
1131
|
end
|
1089
1132
|
assert_raises(SystemExit) { ::Trollop::die :potato, "is invalid" }
|
metadata
CHANGED
@@ -1,65 +1,59 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: trollop
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '2.0'
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
|
-
authors:
|
7
|
+
authors:
|
7
8
|
- William Morgan
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
|
12
|
-
date: 2010-04-06 11:53:33 -04:00
|
13
|
-
default_executable:
|
12
|
+
date: 2012-08-14 00:00:00.000000000 Z
|
14
13
|
dependencies: []
|
14
|
+
description: ! 'Trollop is a commandline option parser for Ruby that just
|
15
15
|
|
16
|
-
description: |-
|
17
|
-
Trollop is a commandline option parser for Ruby that just
|
18
16
|
gets out of your way. One line of code per option is all you need to write.
|
17
|
+
|
19
18
|
For that, you get a nice automatically-generated help page, robust option
|
20
|
-
|
21
|
-
|
19
|
+
|
20
|
+
parsing, command subcompletion, and sensible defaults for everything you don''t
|
21
|
+
|
22
|
+
specify.'
|
22
23
|
email: wmorgan-trollop@masanjin.net
|
23
24
|
executables: []
|
24
|
-
|
25
25
|
extensions: []
|
26
|
-
|
27
26
|
extra_rdoc_files: []
|
28
|
-
|
29
|
-
files:
|
27
|
+
files:
|
30
28
|
- lib/trollop.rb
|
31
29
|
- test/test_trollop.rb
|
32
|
-
- README.txt
|
33
|
-
- release-script.txt
|
34
30
|
- FAQ.txt
|
35
31
|
- History.txt
|
36
|
-
|
32
|
+
- release-script.txt
|
33
|
+
- README.txt
|
37
34
|
homepage: http://trollop.rubyforge.org
|
38
35
|
licenses: []
|
39
|
-
|
40
36
|
post_install_message:
|
41
37
|
rdoc_options: []
|
42
|
-
|
43
|
-
require_paths:
|
38
|
+
require_paths:
|
44
39
|
- lib
|
45
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
40
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
none: false
|
48
|
+
requirements:
|
49
|
+
- - ! '>='
|
50
|
+
- !ruby/object:Gem::Version
|
51
|
+
version: '0'
|
57
52
|
requirements: []
|
58
|
-
|
59
53
|
rubyforge_project: trollop
|
60
|
-
rubygems_version: 1.
|
54
|
+
rubygems_version: 1.8.23
|
61
55
|
signing_key:
|
62
56
|
specification_version: 3
|
63
|
-
summary: Trollop is a commandline option parser for Ruby that just gets out of your
|
57
|
+
summary: Trollop is a commandline option parser for Ruby that just gets out of your
|
58
|
+
way.
|
64
59
|
test_files: []
|
65
|
-
|