getopt-declare 1.27 → 1.28
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 +11 -0
- data/Manifest.txt +1 -0
- data/lib/Getopt/Declare.rb +61 -68
- data/test/test_cmdline_require.rb +55 -0
- metadata +4 -2
data/HISTORY.txt
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
== 1.28
|
2
|
+
* Fixed a minor issue where help lines were not being compacted
|
3
|
+
properly.
|
4
|
+
* Fixed a minor inconsistency in pvtype regex in usage description.
|
5
|
+
* Fixed GNU style parameter matching to not get confused with
|
6
|
+
multiple spaces before parameters.
|
7
|
+
* Sped up matching of default rules a tad due to use of symbols
|
8
|
+
instead of strings.
|
9
|
+
* Fixed required matches not working for some cases due to change
|
10
|
+
in 1.27.
|
11
|
+
|
1
12
|
== 1.27
|
2
13
|
* Fixed a bug with the sorting of arguments, which could sometimes
|
3
14
|
lead to strange parsing.
|
data/Manifest.txt
CHANGED
data/lib/Getopt/Declare.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
# Ruby port of Perl's Getopt::Declare, version 1.21,
|
5
5
|
# released May 21, 1999.
|
6
6
|
#
|
7
|
-
# $Release Version: 1.
|
7
|
+
# $Release Version: 1.28 $
|
8
8
|
# $Date: 2007/01/15 10:53:09 $
|
9
9
|
# by Gonzalo Garramu�o
|
10
10
|
#
|
@@ -70,14 +70,14 @@ module Getopt
|
|
70
70
|
# Main Class
|
71
71
|
class Declare
|
72
72
|
|
73
|
-
VERSION = '1.
|
73
|
+
VERSION = '1.28'
|
74
74
|
|
75
75
|
# For debugging, use [debug] and it will output the ruby code as .CODE.rb
|
76
76
|
@@debug = false
|
77
77
|
|
78
78
|
# Main separator used to distinguish arguments in Getopt/Declare spec.
|
79
79
|
# By default, one or more tabs or 3 spaces or more.
|
80
|
-
@@separator = '(?:\t+| {3})'
|
80
|
+
@@separator = '(?:\t+| {3}[^<])'
|
81
81
|
|
82
82
|
# Class used to handle the beginning of options
|
83
83
|
class StartOpt
|
@@ -126,54 +126,60 @@ module Getopt
|
|
126
126
|
# (re)set standard types
|
127
127
|
def ScalarArg._reset_stdtype
|
128
128
|
@@stdtype = {
|
129
|
-
':i' => {
|
130
|
-
':n' => {
|
129
|
+
':i' => { :pattern => '(?:(?:%T[+-]?)%D+)' },
|
130
|
+
':n' => { :pattern => '(?:(?:%T[+-]?)(?:%D+(?:%T\.%D*)?' +
|
131
131
|
'(?:%T[eE](?:[+-])?%D+)?|%T\.%D+(?:%T[eE](?:[+-])?%D+)?))',
|
132
132
|
},
|
133
|
-
':s' => {
|
134
|
-
':qs' => {
|
135
|
-
':id' => {
|
136
|
-
':d' => {
|
137
|
-
|
133
|
+
':s' => { :pattern => '(?:%T(?:\S|\0))+(?=\s|\0|\z)' },
|
134
|
+
':qs' => { :pattern => %q{"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|(?:%T(?:\S|\0))+} },
|
135
|
+
':id' => { :pattern => '%T[a-zA-Z_](?:%T\w)*(?=\s|\0|\z)' },
|
136
|
+
':d' => {
|
137
|
+
:pattern => '(?:%T(?:\S|\0))+',
|
138
|
+
:action => %q%
|
138
139
|
reject( (_VAL_.nil? || !test(?d, _VAL_) ),
|
139
140
|
"in parameter '#{_PARAM_}' (\"#{_VAL_}\" is not a directory)")%
|
140
141
|
},
|
141
|
-
':if' => {
|
142
|
-
|
142
|
+
':if' => {
|
143
|
+
:pattern => '%F(?:%T(?:\S|\0))+(?=\s|\0|\z)',
|
144
|
+
:action => %q%
|
143
145
|
reject( (_VAL_.nil? || _VAL_ != "-" && !test(?r, _VAL_) ),
|
144
146
|
"in parameter '#{_PARAM_}' (file \"#{_VAL_}\" is not readable)")%
|
145
147
|
},
|
146
|
-
':of' => {
|
147
|
-
|
148
|
+
':of' => {
|
149
|
+
:pattern => '%F(?:%T(?:\S|\0))+(?=\s|\0|\z)',
|
150
|
+
:action => %q%
|
148
151
|
reject( (_VAL_.nil? || _VAL_ != "-" &&
|
149
152
|
test(?r, _VAL_) && !test(?w, _VAL_)),
|
150
153
|
"in parameter '#{_PARAM_}' (file \"#{_VAL_}\" is not writable)")%
|
151
154
|
},
|
152
|
-
'' => {
|
155
|
+
'' => { :pattern => ':s', :ind => 1 },
|
153
156
|
|
154
|
-
':+i' => {
|
155
|
-
|
157
|
+
':+i' => {
|
158
|
+
:pattern => ':i',
|
159
|
+
:action => %q%reject( _VAL_ <= 0,
|
156
160
|
"in parameter '#{_PARAM_}' (#{_VAL_} must be an integer greater than zero)")%,
|
157
|
-
|
161
|
+
:ind => 1
|
158
162
|
},
|
159
163
|
|
160
|
-
':+n' => {
|
161
|
-
|
164
|
+
':+n' => {
|
165
|
+
:pattern => ':n',
|
166
|
+
:action => %q%reject( _VAL_ <= 0.0,
|
162
167
|
"in parameter '#{_PARAM_}' (#{_VAL_} must be a number greater than zero)")%,
|
163
|
-
|
168
|
+
:ind => 1
|
164
169
|
},
|
165
170
|
|
166
|
-
':0+i'
|
167
|
-
|
171
|
+
':0+i' => {
|
172
|
+
:pattern => ':i',
|
173
|
+
:action => %q%reject( _VAL_ < 0,
|
168
174
|
"in parameter '#{_PARAM_}' (#{_VAL_} must be an positive integer)")%,
|
169
|
-
|
175
|
+
:ind => 1
|
170
176
|
},
|
171
177
|
|
172
|
-
':0+n'
|
173
|
-
|
174
|
-
|
178
|
+
':0+n' => {
|
179
|
+
:pattern => ':n',
|
180
|
+
:action => %q%reject( _VAL_ < 0,
|
175
181
|
"in parameter '#{_PARAM_}' (#{_VAL_} must be an positive number)")%,
|
176
|
-
|
182
|
+
:ind => 1
|
177
183
|
},
|
178
184
|
}
|
179
185
|
|
@@ -184,12 +190,12 @@ module Getopt
|
|
184
190
|
# pattern or nil
|
185
191
|
def ScalarArg.stdtype(name)
|
186
192
|
seen = {}
|
187
|
-
while (!seen[name] && @@stdtype[name] && @@stdtype[name][
|
188
|
-
seen[name] = 1; name = @@stdtype[name][
|
193
|
+
while (!seen[name] && @@stdtype[name] && @@stdtype[name][:ind])
|
194
|
+
seen[name] = 1; name = @@stdtype[name][:pattern]
|
189
195
|
end
|
190
196
|
|
191
197
|
return nil if seen[name] || !@@stdtype[name]
|
192
|
-
@@stdtype[name][
|
198
|
+
@@stdtype[name][:pattern]
|
193
199
|
end
|
194
200
|
|
195
201
|
def stdtype(name)
|
@@ -201,16 +207,16 @@ module Getopt
|
|
201
207
|
def ScalarArg.stdactions(name)
|
202
208
|
seen = {}
|
203
209
|
actions = []
|
204
|
-
while (!seen[name] && @@stdtype[name] && @@stdtype[name][
|
210
|
+
while (!seen[name] && @@stdtype[name] && @@stdtype[name][:ind])
|
205
211
|
seen[name] = 1
|
206
|
-
if @@stdtype[name][
|
207
|
-
actions.push( @@stdtype[name][
|
212
|
+
if @@stdtype[name][:action]
|
213
|
+
actions.push( @@stdtype[name][:action] )
|
208
214
|
end
|
209
|
-
name = @@stdtype[name][
|
215
|
+
name = @@stdtype[name][:pattern]
|
210
216
|
end
|
211
217
|
|
212
|
-
if @@stdtype[name] && @@stdtype[name][
|
213
|
-
actions.push( @@stdtype[name][
|
218
|
+
if @@stdtype[name] && @@stdtype[name][:action]
|
219
|
+
actions.push( @@stdtype[name][:action] )
|
214
220
|
end
|
215
221
|
|
216
222
|
return actions
|
@@ -226,10 +232,10 @@ module Getopt
|
|
226
232
|
end
|
227
233
|
|
228
234
|
@@stdtype[typeid] = {}
|
229
|
-
@@stdtype[typeid][
|
230
|
-
@@stdtype[typeid][
|
231
|
-
@@stdtype[typeid][
|
232
|
-
@@stdtype[typeid][
|
235
|
+
@@stdtype[typeid][:pattern] = "(?:#{pattern})" if pattern && !ref
|
236
|
+
@@stdtype[typeid][:pattern] = ":#{pattern}" if pattern && ref
|
237
|
+
@@stdtype[typeid][:action] = action if action
|
238
|
+
@@stdtype[typeid][:ind] = ref
|
233
239
|
|
234
240
|
end
|
235
241
|
|
@@ -304,7 +310,7 @@ EOS
|
|
304
310
|
|
305
311
|
# Based on parameter type, default conversion to apply
|
306
312
|
def conversion
|
307
|
-
pat = @@stdtype[@type] ? @@stdtype[@type][
|
313
|
+
pat = @@stdtype[@type] ? @@stdtype[@type][:pattern] : ''
|
308
314
|
[ @type, pat ].each { |t|
|
309
315
|
case t
|
310
316
|
when /^\:0?(\+)?i$/
|
@@ -518,13 +524,13 @@ EOS
|
|
518
524
|
|
519
525
|
attr_accessor :flag, :args, :actions, :ditto, :nocase
|
520
526
|
attr_accessor :required, :id, :repeatable, :desc
|
521
|
-
|
527
|
+
attr_accessor :requires
|
522
528
|
|
523
529
|
|
524
530
|
#
|
525
|
-
def
|
526
|
-
expr =
|
527
|
-
|
531
|
+
def found_requires
|
532
|
+
expr = @requires.gsub(/((?:&&|\|\|)?\s*(?:[!(]\s*)*)([^ \t\n|&\)]+)/x,
|
533
|
+
'\1_FOUND_[\'\2\']')
|
528
534
|
|
529
535
|
if !valid_syntax?( expr )
|
530
536
|
raise "Error: bad condition in [requires: #{original}]\n"
|
@@ -532,10 +538,6 @@ EOS
|
|
532
538
|
expr
|
533
539
|
end
|
534
540
|
|
535
|
-
def requires
|
536
|
-
return nil unless @requires
|
537
|
-
_enfound(@requires)
|
538
|
-
end
|
539
541
|
|
540
542
|
# Constructor
|
541
543
|
def initialize(spec, desc, dittoflag)
|
@@ -635,9 +637,6 @@ EOS
|
|
635
637
|
nocasei = ((Getopt::Declare::nocase || @nocase) ? 'i' : '')
|
636
638
|
|
637
639
|
code << " catch(:paramout) do\n while "
|
638
|
-
if @requires
|
639
|
-
code << requires << ' and '
|
640
|
-
end
|
641
640
|
code += !@repeatable? "!_FOUND_['" + self.foundid + "']" : "true"
|
642
641
|
|
643
642
|
if (flag && (clump==1 && flag !~ /\A[^a-z0-9]+[a-z0-9]\Z/i ||
|
@@ -645,12 +644,12 @@ EOS
|
|
645
644
|
code << ' and !_lastprefix'
|
646
645
|
end
|
647
646
|
|
648
|
-
code <<
|
647
|
+
code <<'
|
649
648
|
begin
|
650
649
|
catch(:param) do
|
651
650
|
_pos = _nextpos if _args
|
652
651
|
_PUNCT_ = {}
|
653
|
-
|
652
|
+
'
|
654
653
|
|
655
654
|
if flag != ''
|
656
655
|
# This boundary is to handle -- option, so that if user uses
|
@@ -883,7 +882,7 @@ EOS
|
|
883
882
|
_exclude(mutex, arg.name, ("#$1".split(' ')))
|
884
883
|
end
|
885
884
|
|
886
|
-
if desc =~ /.*\[\s*requires:\s*(.*?)\]/i
|
885
|
+
if desc =~ /.*\[\s*requires:\s*(.*?)\s*\]/i
|
887
886
|
arg.requires = "#$1"
|
888
887
|
end
|
889
888
|
|
@@ -1102,7 +1101,7 @@ EOS
|
|
1102
1101
|
|
1103
1102
|
# Check for GNU spec line like: -d, --debug
|
1104
1103
|
arg = nil
|
1105
|
-
if spec =~ /(-[\w_\d]+),\s+(
|
1104
|
+
if spec =~ /(-[\w_\d]+),\s+(--?[\w_\d]+)(\s+.*)?/
|
1106
1105
|
specs = ["#$1#$3", "#$2#$3"]
|
1107
1106
|
specs.each { |spec|
|
1108
1107
|
arg = Arg.new(spec,desc,ditto)
|
@@ -1318,7 +1317,7 @@ EOS
|
|
1318
1317
|
lastdesc = nil
|
1319
1318
|
usage = ''
|
1320
1319
|
|
1321
|
-
while t.
|
1320
|
+
while !t.empty?
|
1322
1321
|
|
1323
1322
|
# COMMENT:
|
1324
1323
|
t.sub!(/\A[ \t]*#.*\n/,".") and next
|
@@ -1326,7 +1325,7 @@ EOS
|
|
1326
1325
|
# TYPE DIRECTIVE:
|
1327
1326
|
se = DelimScanner::new( t )
|
1328
1327
|
|
1329
|
-
if t =~ /\A\s*\[pvtype:/
|
1328
|
+
if t =~ /\A\s*\[\s*pvtype:/
|
1330
1329
|
if action = se.extractBracketed("[")
|
1331
1330
|
t.sub!(Regexp::quote( action ).to_re,'')
|
1332
1331
|
t.sub!(/\A[ \t]*\n/,"")
|
@@ -1389,7 +1388,7 @@ EOS
|
|
1389
1388
|
|
1390
1389
|
|
1391
1390
|
# OTHERWISE, DECORATION
|
1392
|
-
if t.sub!(/((?:(?!\[pvtype:).)*)(\n|(?=\[pvtype:))/,"")
|
1391
|
+
if t.sub!(/((?:(?!\[\s*pvtype:).)*)(\n|(?=\[\s*pvtype:))/,"")
|
1393
1392
|
desc = "#$1"+("#$2"||'')
|
1394
1393
|
#desc.gsub!(/^(\s*\[.*?\])+\s*\n/m,'')
|
1395
1394
|
#desc.gsub!(/\[.*?\]/,'') # eliminates anything in brackets
|
@@ -1431,7 +1430,7 @@ EOS
|
|
1431
1430
|
|
1432
1431
|
header << "Options:\n" unless decfirst && decfirst == 1
|
1433
1432
|
|
1434
|
-
usage.sub!(/[\s\n]
|
1433
|
+
usage.sub!(/[\s\n]+\Z/m, '')
|
1435
1434
|
|
1436
1435
|
if opt.empty?
|
1437
1436
|
return header + usage + "\n"
|
@@ -1613,7 +1612,7 @@ end
|
|
1613
1612
|
next unless arg.requires
|
1614
1613
|
|
1615
1614
|
code << %q%
|
1616
|
-
if _FOUND_['% + arg.name + %q%'] && !(% + arg.
|
1615
|
+
if _FOUND_['% + arg.name + %q%'] && !(% + arg.found_requires +
|
1617
1616
|
%q%)
|
1618
1617
|
$stderr.puts "Error#{@source}: parameter '% + arg.name + %q%' can only be specified with '% + arg.requires + %q%'"
|
1619
1618
|
_errors += 1
|
@@ -1735,9 +1734,3 @@ end
|
|
1735
1734
|
end # class Declare
|
1736
1735
|
|
1737
1736
|
end # module Getopt
|
1738
|
-
|
1739
|
-
|
1740
|
-
|
1741
|
-
|
1742
|
-
__END__
|
1743
|
-
|
@@ -0,0 +1,55 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# Put script description here.
|
4
|
+
#
|
5
|
+
# Author::
|
6
|
+
# Copyright::
|
7
|
+
# License:: Ruby
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'Getopt/Declare'
|
11
|
+
|
12
|
+
|
13
|
+
require 'test/unit'
|
14
|
+
require "Getopt/Declare"
|
15
|
+
|
16
|
+
# to avoid getopt from exiting...
|
17
|
+
def exit(args)
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
class TC_Require < Test::Unit::TestCase
|
22
|
+
|
23
|
+
def setup
|
24
|
+
@args = Getopt::Declare.new(<<EOF, :build)
|
25
|
+
-i <iterations:+i> iteration count
|
26
|
+
-q add new task [ requires: -i ]
|
27
|
+
EOF
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_q_without_i
|
31
|
+
begin
|
32
|
+
@args.parse('-q')
|
33
|
+
assert_equal( nil, "Parsing of -q did not fail" )
|
34
|
+
rescue
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_i_without_q
|
39
|
+
begin
|
40
|
+
@args.parse('-i 5')
|
41
|
+
rescue
|
42
|
+
end
|
43
|
+
assert_equal( 5, @args['-i'] )
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_i_with_q
|
47
|
+
begin
|
48
|
+
@args.parse('-i 5 -q')
|
49
|
+
rescue
|
50
|
+
end
|
51
|
+
assert_equal( 5, @args['-i'] )
|
52
|
+
assert_equal( '-q', @args['-q'] )
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.1
|
|
3
3
|
specification_version: 1
|
4
4
|
name: getopt-declare
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: "1.
|
7
|
-
date: 2007-
|
6
|
+
version: "1.28"
|
7
|
+
date: 2007-07-09 00:00:00 -03:00
|
8
8
|
summary: Getopt-Declare is a command-line argument parser.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -69,6 +69,7 @@ files:
|
|
69
69
|
- test/test_demo_csv.rb
|
70
70
|
- test/test_cluster_singles.rb
|
71
71
|
- test/test_cmdline_array.rb
|
72
|
+
- test/test_cmdline_require.rb
|
72
73
|
test_files:
|
73
74
|
- test/test_cmdline_cmdline.rb
|
74
75
|
- test/test_cmdline_basic.rb
|
@@ -79,6 +80,7 @@ test_files:
|
|
79
80
|
- test/test_cmdline_pvtype.rb
|
80
81
|
- test/test_cmdline_regex.rb
|
81
82
|
- test/test_demo_csv.rb
|
83
|
+
- test/test_cmdline_require.rb
|
82
84
|
- test/test_cluster_singles.rb
|
83
85
|
- test/test_cmdline_array.rb
|
84
86
|
rdoc_options:
|