trollop 1.15 → 1.16
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/History.txt +5 -0
- data/README.txt +1 -1
- data/lib/trollop.rb +55 -22
- data/release-script.txt +15 -0
- data/test/test_trollop.rb +11 -9
- metadata +28 -43
- data/Manifest.txt +0 -7
- data/Rakefile +0 -36
data/History.txt
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
== 1.16 / 2010-04-01
|
2
|
+
* Add Trollop::with_standard_exception_handling method for easing the use of Parser directly.
|
3
|
+
* Handle scientific notation in float arguments, thanks to Will Fitzgerald.
|
4
|
+
* Drop hoe dependency.
|
5
|
+
|
1
6
|
== 1.15 / 2009-09-30
|
2
7
|
* Don't raise an exception when out of short arguments (thanks to Rafael
|
3
8
|
Sevilla for pointing out how dumb this behavior was).
|
data/README.txt
CHANGED
@@ -4,7 +4,7 @@ by William Morgan (http://masanjin.net/)
|
|
4
4
|
|
5
5
|
Main page: http://trollop.rubyforge.org
|
6
6
|
|
7
|
-
Release announcements and comments: http://all-thing.net/
|
7
|
+
Release announcements and comments: http://all-thing.net/label/trollop
|
8
8
|
|
9
9
|
Documentation quickstart: See Trollop::options (for some reason rdoc isn't
|
10
10
|
linking that; it's in the top right of the screen if you're browsing online)
|
data/lib/trollop.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
## lib/trollop.rb -- trollop command-line processing library
|
2
2
|
## Author:: William Morgan (mailto: wmorgan-trollop@masanjin.net)
|
3
3
|
## Copyright:: Copyright 2007 William Morgan
|
4
|
-
## License::
|
4
|
+
## License:: the same terms as ruby itself
|
5
5
|
|
6
6
|
require 'date'
|
7
7
|
|
8
8
|
module Trollop
|
9
9
|
|
10
|
-
VERSION = "1.
|
10
|
+
VERSION = "1.16"
|
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.
|
@@ -22,7 +22,7 @@ class HelpNeeded < StandardError; end
|
|
22
22
|
class VersionNeeded < StandardError; end
|
23
23
|
|
24
24
|
## Regex for floating point numbers
|
25
|
-
FLOAT_RE = /^-?((\d+(\.\d+)?)|(\.\d+))
|
25
|
+
FLOAT_RE = /^-?((\d+(\.\d+)?)|(\.\d+))([eE][-+]?[\d]+)?$/
|
26
26
|
|
27
27
|
## Regex for parameters
|
28
28
|
PARAM_RE = /^-(-|\.$|[^\d\.])/
|
@@ -32,9 +32,10 @@ PARAM_RE = /^-(-|\.$|[^\d\.])/
|
|
32
32
|
## #opt, #banner and #version, #depends, and #conflicts methods will
|
33
33
|
## typically be called.
|
34
34
|
##
|
35
|
-
## If
|
36
|
-
## argument-parsing
|
37
|
-
##
|
35
|
+
## If you want to instantiate this class yourself (for more complicated
|
36
|
+
## argument-parsing logic), call #parse to actually produce the output hash,
|
37
|
+
## and consider calling it from within
|
38
|
+
## Trollop::with_standard_exception_handling.
|
38
39
|
class Parser
|
39
40
|
|
40
41
|
## The set of values that indicate a flag option when passed as the
|
@@ -277,7 +278,10 @@ class Parser
|
|
277
278
|
@stop_on_unknown = true
|
278
279
|
end
|
279
280
|
|
280
|
-
## Parses the commandline. Typically called by Trollop::options
|
281
|
+
## Parses the commandline. Typically called by Trollop::options,
|
282
|
+
## but you can call it directly if you need more control.
|
283
|
+
##
|
284
|
+
## throws CommandlineError, HelpNeeded, and VersionNeeded exceptions.
|
281
285
|
def parse cmdline=ARGV
|
282
286
|
vals = {}
|
283
287
|
required = {}
|
@@ -349,7 +353,7 @@ class Parser
|
|
349
353
|
end
|
350
354
|
|
351
355
|
required.each do |sym, val|
|
352
|
-
raise CommandlineError, "option
|
356
|
+
raise CommandlineError, "option --#{@specs[sym][:long]} must be specified" unless given_args.include? sym
|
353
357
|
end
|
354
358
|
|
355
359
|
## parse parameters
|
@@ -389,6 +393,11 @@ class Parser
|
|
389
393
|
# else: multiple options, with multiple parameters
|
390
394
|
end
|
391
395
|
|
396
|
+
## modify input in place with only those
|
397
|
+
## arguments we didn't process
|
398
|
+
cmdline.clear
|
399
|
+
@leftovers.each { |l| cmdline << l }
|
400
|
+
|
392
401
|
## allow openstruct-style accessors
|
393
402
|
class << vals
|
394
403
|
def method_missing(m, *args)
|
@@ -653,11 +662,10 @@ private
|
|
653
662
|
end
|
654
663
|
end
|
655
664
|
|
656
|
-
## The
|
657
|
-
## passes the block to it, then parses +args+ with it, handling any
|
658
|
-
##
|
659
|
-
##
|
660
|
-
## values.
|
665
|
+
## The easy, syntactic-sugary entry method into Trollop. Creates a Parser,
|
666
|
+
## passes the block to it, then parses +args+ with it, handling any errors or
|
667
|
+
## requests for help or version information appropriately (and then exiting).
|
668
|
+
## Modifies +args+ in place. Returns a hash of option values.
|
661
669
|
##
|
662
670
|
## The block passed in should contain zero or more calls to +opt+
|
663
671
|
## (Parser#opt), zero or more calls to +text+ (Parser#text), and
|
@@ -686,22 +694,47 @@ end
|
|
686
694
|
## p opts # => {:monkey_given=>true, :monkey=>true, :goat=>true, :num_limbs=>4, :help=>false, :num_thumbs=>nil}
|
687
695
|
##
|
688
696
|
## See more examples at http://trollop.rubyforge.org.
|
689
|
-
def options args
|
690
|
-
|
697
|
+
def options args=ARGV, *a, &b
|
698
|
+
p = Parser.new(*a, &b)
|
699
|
+
with_standard_exception_handling(p) { p.parse args }
|
700
|
+
end
|
701
|
+
|
702
|
+
## If Trollop::options doesn't do quite what you want, you can create a Parser
|
703
|
+
## object and call Parser#parse on it. That method will throw CommandlineError,
|
704
|
+
## HelpNeeded and VersionNeeded exceptions when necessary; if you want to
|
705
|
+
## have these handled for you in the standard manner (e.g. show the help
|
706
|
+
## and then exit upon an HelpNeeded exception), call your code from within
|
707
|
+
## a block passed to this method.
|
708
|
+
##
|
709
|
+
## Note that this method will call System#exit after handling an exception!
|
710
|
+
##
|
711
|
+
## Usage example:
|
712
|
+
##
|
713
|
+
## require 'trollop'
|
714
|
+
## p = Trollop::Parser.new do
|
715
|
+
## opt :monkey, "Use monkey mode" # a flag --monkey, defaulting to false
|
716
|
+
## opt :goat, "Use goat mode", :default => true # a flag --goat, defaulting to true
|
717
|
+
## end
|
718
|
+
##
|
719
|
+
## opts = Trollop::with_standard_exception_handling p do
|
720
|
+
## p.parse ARGV
|
721
|
+
## raise Trollop::HelpNeeded if ARGV.empty? # show help screen
|
722
|
+
## end
|
723
|
+
##
|
724
|
+
## Requires passing in the parser object.
|
725
|
+
|
726
|
+
def with_standard_exception_handling parser
|
691
727
|
begin
|
692
|
-
|
693
|
-
args.clear
|
694
|
-
@p.leftovers.each { |l| args << l }
|
695
|
-
vals
|
728
|
+
yield
|
696
729
|
rescue CommandlineError => e
|
697
730
|
$stderr.puts "Error: #{e.message}."
|
698
731
|
$stderr.puts "Try --help for help."
|
699
732
|
exit(-1)
|
700
733
|
rescue HelpNeeded
|
701
|
-
|
734
|
+
parser.educate
|
702
735
|
exit
|
703
736
|
rescue VersionNeeded
|
704
|
-
puts
|
737
|
+
puts parser.version
|
705
738
|
exit
|
706
739
|
end
|
707
740
|
end
|
@@ -734,6 +767,6 @@ def die arg, msg=nil
|
|
734
767
|
exit(-1)
|
735
768
|
end
|
736
769
|
|
737
|
-
module_function :options, :die
|
770
|
+
module_function :options, :die, :with_standard_exception_handling
|
738
771
|
|
739
772
|
end # module
|
data/release-script.txt
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
Just a few simple steps to make a new release.
|
2
|
+
|
3
|
+
vi History.txt # and describe changes
|
4
|
+
git-rank-contributors -o -h >> www/index.html
|
5
|
+
vi www/index.html # and integrate contributors
|
6
|
+
## git add, git commit, etc
|
7
|
+
vi lib/trollop.rb # and bump version number
|
8
|
+
git commit -a -m "bump to..."
|
9
|
+
git tag release-<releasename>
|
10
|
+
rake gem
|
11
|
+
rake tarball
|
12
|
+
gem push pkg/<gem name>
|
13
|
+
git push
|
14
|
+
git push --tags
|
15
|
+
rake upload_webpage
|
data/test/test_trollop.rb
CHANGED
@@ -82,7 +82,7 @@ class Trollop < ::Test::Unit::TestCase
|
|
82
82
|
|
83
83
|
# single arg: int
|
84
84
|
assert_nothing_raised { @p.opt "argsi", "desc", :default => 0 }
|
85
|
-
assert_nothing_raised { opts = @p.parse(
|
85
|
+
assert_nothing_raised { opts = @p.parse(%w(--)) }
|
86
86
|
assert_equal 0, opts["argsi"]
|
87
87
|
assert_nothing_raised { opts = @p.parse(%w(--argsi 4)) }
|
88
88
|
assert_equal 4, opts["argsi"]
|
@@ -91,18 +91,20 @@ class Trollop < ::Test::Unit::TestCase
|
|
91
91
|
|
92
92
|
# single arg: float
|
93
93
|
assert_nothing_raised { @p.opt "argsf", "desc", :default => 3.14 }
|
94
|
-
assert_nothing_raised { opts = @p.parse(
|
94
|
+
assert_nothing_raised { opts = @p.parse(%w(--)) }
|
95
95
|
assert_equal 3.14, opts["argsf"]
|
96
96
|
assert_nothing_raised { opts = @p.parse(%w(--argsf 2.41)) }
|
97
97
|
assert_equal 2.41, opts["argsf"]
|
98
98
|
assert_nothing_raised { opts = @p.parse(%w(--argsf 2)) }
|
99
99
|
assert_equal 2, opts["argsf"]
|
100
|
+
assert_nothing_raised { opts = @p.parse(%w(--argsf 1.0e-2)) }
|
101
|
+
assert_equal 1.0e-2, opts["argsf"]
|
100
102
|
assert_raise(CommandlineError) { @p.parse(%w(--argsf hello)) }
|
101
103
|
|
102
104
|
# single arg: date
|
103
105
|
date = Date.today
|
104
106
|
assert_nothing_raised { @p.opt "argsd", "desc", :default => date }
|
105
|
-
assert_nothing_raised { opts = @p.parse(
|
107
|
+
assert_nothing_raised { opts = @p.parse(%w(--)) }
|
106
108
|
assert_equal Date.today, opts["argsd"]
|
107
109
|
assert_nothing_raised { opts = @p.parse(['--argsd', 'Jan 4, 2007']) }
|
108
110
|
assert_equal Date.civil(2007, 1, 4), opts["argsd"]
|
@@ -110,7 +112,7 @@ class Trollop < ::Test::Unit::TestCase
|
|
110
112
|
|
111
113
|
# single arg: string
|
112
114
|
assert_nothing_raised { @p.opt "argss", "desc", :default => "foobar" }
|
113
|
-
assert_nothing_raised { opts = @p.parse(
|
115
|
+
assert_nothing_raised { opts = @p.parse(%w(--)) }
|
114
116
|
assert_equal "foobar", opts["argss"]
|
115
117
|
assert_nothing_raised { opts = @p.parse(%w(--argss 2.41)) }
|
116
118
|
assert_equal "2.41", opts["argss"]
|
@@ -119,7 +121,7 @@ class Trollop < ::Test::Unit::TestCase
|
|
119
121
|
|
120
122
|
# multi args: ints
|
121
123
|
assert_nothing_raised { @p.opt "argmi", "desc", :default => [3, 5] }
|
122
|
-
assert_nothing_raised { opts = @p.parse(
|
124
|
+
assert_nothing_raised { opts = @p.parse(%w(--)) }
|
123
125
|
assert_equal [3, 5], opts["argmi"]
|
124
126
|
assert_nothing_raised { opts = @p.parse(%w(--argmi 4)) }
|
125
127
|
assert_equal [4], opts["argmi"]
|
@@ -128,7 +130,7 @@ class Trollop < ::Test::Unit::TestCase
|
|
128
130
|
|
129
131
|
# multi args: floats
|
130
132
|
assert_nothing_raised { @p.opt "argmf", "desc", :default => [3.34, 5.21] }
|
131
|
-
assert_nothing_raised { opts = @p.parse(
|
133
|
+
assert_nothing_raised { opts = @p.parse(%w(--)) }
|
132
134
|
assert_equal [3.34, 5.21], opts["argmf"]
|
133
135
|
assert_nothing_raised { opts = @p.parse(%w(--argmf 2)) }
|
134
136
|
assert_equal [2], opts["argmf"]
|
@@ -139,7 +141,7 @@ class Trollop < ::Test::Unit::TestCase
|
|
139
141
|
# multi args: dates
|
140
142
|
dates = [Date.today, Date.civil(2007, 1, 4)]
|
141
143
|
assert_nothing_raised { @p.opt "argmd", "desc", :default => dates }
|
142
|
-
assert_nothing_raised { opts = @p.parse(
|
144
|
+
assert_nothing_raised { opts = @p.parse(%w(--)) }
|
143
145
|
assert_equal dates, opts["argmd"]
|
144
146
|
assert_nothing_raised { opts = @p.parse(['--argmd', 'Jan 4, 2007']) }
|
145
147
|
assert_equal [Date.civil(2007, 1, 4)], opts["argmd"]
|
@@ -147,7 +149,7 @@ class Trollop < ::Test::Unit::TestCase
|
|
147
149
|
|
148
150
|
# multi args: strings
|
149
151
|
assert_nothing_raised { @p.opt "argmst", "desc", :default => %w(hello world) }
|
150
|
-
assert_nothing_raised { opts = @p.parse(
|
152
|
+
assert_nothing_raised { opts = @p.parse(%w(--)) }
|
151
153
|
assert_equal %w(hello world), opts["argmst"]
|
152
154
|
assert_nothing_raised { opts = @p.parse(%w(--argmst 3.4)) }
|
153
155
|
assert_equal ["3.4"], opts["argmst"]
|
@@ -1039,7 +1041,7 @@ EOM
|
|
1039
1041
|
|
1040
1042
|
def test_multi_args_default_to_empty_array
|
1041
1043
|
@p.opt :arg1, "arg", :multi => true
|
1042
|
-
opts = @p.parse
|
1044
|
+
opts = @p.parse []
|
1043
1045
|
assert_equal [], opts[:arg1]
|
1044
1046
|
end
|
1045
1047
|
end
|
metadata
CHANGED
@@ -1,7 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trollop
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 16
|
8
|
+
version: "1.16"
|
5
9
|
platform: ruby
|
6
10
|
authors:
|
7
11
|
- William Morgan
|
@@ -9,78 +13,59 @@ autorequire:
|
|
9
13
|
bindir: bin
|
10
14
|
cert_chain: []
|
11
15
|
|
12
|
-
date:
|
16
|
+
date: 2010-04-01 16:46:01 -04:00
|
13
17
|
default_executable:
|
14
18
|
dependencies: []
|
15
19
|
|
16
|
-
description:
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
== DESCRIPTION
|
23
|
-
|
24
|
-
== REQUIREMENTS
|
25
|
-
|
26
|
-
* A burning desire to write less code.
|
27
|
-
|
28
|
-
== INSTALL
|
29
|
-
|
30
|
-
* gem install trollop
|
31
|
-
|
32
|
-
== LICENSE
|
33
|
-
|
34
|
-
Copyright (c) 2008--2009 William Morgan. Trollop is distributed under the same
|
35
|
-
terms as Ruby.
|
36
|
-
|
37
|
-
|
20
|
+
description: |-
|
21
|
+
Trollop is a commandline option parser for Ruby that just
|
22
|
+
gets out of your way. One line of code per option is all you need to write.
|
23
|
+
For that, you get a nice automatically-generated help page, robust option
|
24
|
+
parsing, command subcompletion, and sensible defaults for everything you don't
|
25
|
+
specify.
|
38
26
|
email: wmorgan-trollop@masanjin.net
|
39
27
|
executables: []
|
40
28
|
|
41
29
|
extensions: []
|
42
30
|
|
43
|
-
extra_rdoc_files:
|
44
|
-
|
45
|
-
- History.txt
|
46
|
-
- Manifest.txt
|
47
|
-
- README.txt
|
31
|
+
extra_rdoc_files: []
|
32
|
+
|
48
33
|
files:
|
49
|
-
- FAQ.txt
|
50
|
-
- History.txt
|
51
|
-
- Manifest.txt
|
52
|
-
- README.txt
|
53
|
-
- Rakefile
|
54
34
|
- lib/trollop.rb
|
55
35
|
- test/test_trollop.rb
|
36
|
+
- README.txt
|
37
|
+
- release-script.txt
|
38
|
+
- FAQ.txt
|
39
|
+
- History.txt
|
56
40
|
has_rdoc: true
|
57
41
|
homepage: http://trollop.rubyforge.org
|
58
42
|
licenses: []
|
59
43
|
|
60
44
|
post_install_message:
|
61
|
-
rdoc_options:
|
62
|
-
|
63
|
-
- README.txt
|
45
|
+
rdoc_options: []
|
46
|
+
|
64
47
|
require_paths:
|
65
48
|
- lib
|
66
49
|
required_ruby_version: !ruby/object:Gem::Requirement
|
67
50
|
requirements:
|
68
51
|
- - ">="
|
69
52
|
- !ruby/object:Gem::Version
|
53
|
+
segments:
|
54
|
+
- 0
|
70
55
|
version: "0"
|
71
|
-
version:
|
72
56
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
73
57
|
requirements:
|
74
58
|
- - ">="
|
75
59
|
- !ruby/object:Gem::Version
|
60
|
+
segments:
|
61
|
+
- 0
|
76
62
|
version: "0"
|
77
|
-
version:
|
78
63
|
requirements: []
|
79
64
|
|
80
65
|
rubyforge_project: trollop
|
81
|
-
rubygems_version: 1.3.
|
66
|
+
rubygems_version: 1.3.6
|
82
67
|
signing_key:
|
83
68
|
specification_version: 3
|
84
|
-
summary: Trollop is a commandline option parser for Ruby that just gets out of your way.
|
85
|
-
test_files:
|
86
|
-
|
69
|
+
summary: Trollop is a commandline option parser for Ruby that just gets out of your way.
|
70
|
+
test_files: []
|
71
|
+
|
data/Manifest.txt
DELETED
data/Rakefile
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
# -*- ruby -*-
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'hoe'
|
5
|
-
|
6
|
-
$:.unshift "lib"
|
7
|
-
require 'trollop'
|
8
|
-
|
9
|
-
class Hoe
|
10
|
-
def extra_dev_deps; @extra_dev_deps.reject { |x| x[0] == "hoe" } end
|
11
|
-
end
|
12
|
-
|
13
|
-
Hoe.new('trollop', Trollop::VERSION) do |p|
|
14
|
-
p.rubyforge_name = 'trollop'
|
15
|
-
p.author = "William Morgan"
|
16
|
-
p.summary = "Trollop is a commandline option parser for Ruby that just gets out of your way. One line of code per option is all you need to write. For that, you get a nice automatically-generated help page, robust option parsing, command subcompletion, and sensible defaults for everything you don't specify."
|
17
|
-
p.description = p.paragraphs_of('README.txt', 4..5, 9..18).join("\n\n").gsub(/== SYNOPSIS/, "Synopsis")
|
18
|
-
p.url = "http://trollop.rubyforge.org"
|
19
|
-
p.changes = p.paragraphs_of('History.txt', 0..0).join("\n\n")
|
20
|
-
p.email = "wmorgan-trollop@masanjin.net"
|
21
|
-
end
|
22
|
-
|
23
|
-
WWW_FILES = FileList["www/*"] + %w(README.txt FAQ.txt)
|
24
|
-
task :upload_webpage => WWW_FILES do |t|
|
25
|
-
sh "rsync -Paz -essh #{t.prerequisites * ' '} wmorgan@rubyforge.org:/var/www/gforge-projects/trollop/"
|
26
|
-
end
|
27
|
-
|
28
|
-
task :rdoc do |t|
|
29
|
-
sh "rdoc lib README.txt History.txt -m README.txt"
|
30
|
-
end
|
31
|
-
|
32
|
-
task :upload_docs => :rdoc do |t|
|
33
|
-
sh "rsync -az -essh doc/* wmorgan@rubyforge.org:/var/www/gforge-projects/trollop/trollop/"
|
34
|
-
end
|
35
|
-
|
36
|
-
# vim: syntax=ruby
|