getopt-declare 1.22 → 1.23
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY.txt +18 -0
- data/Rakefile +36 -2
- data/lib/Getopt/Declare.rb +82 -40
- data/samples/cmdline_mid.rb +1 -1
- metadata +2 -2
data/HISTORY.txt
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
1.23 - * Added all samples as Ruby tests, which lead to the discovery
|
2
|
+
of several bugs.
|
3
|
+
* Fixed silly bug with foundid that would make some parsing not
|
4
|
+
work (required parameters).
|
5
|
+
* Fixed a silly bug when parsing from a string file, which would
|
6
|
+
modify the string in place
|
7
|
+
* Fixed a bug in that would make it not parse Rh+ and Rh- in
|
8
|
+
cmdline_pvttype demo and other potential regexes.
|
9
|
+
* Removed 3 warnings from parsing multiple times.
|
10
|
+
* Fixed a bug with cluster: singles not working.
|
11
|
+
* Fixed a stack trace bug with optional single text arguments.
|
12
|
+
* Improved handling of optional integer/float arguments, leaving
|
13
|
+
them as nil instead of 0 as before.
|
14
|
+
* Added 'used' function to allow returning the flags that are used.
|
15
|
+
* Made CSV demo work again, albeit I am not too happy with the regex.
|
16
|
+
* Made Getopt::Declare part of firebrigade.
|
17
|
+
http://firebrigade.seattlerb.org/
|
18
|
+
|
1
19
|
1.22 - * Fixed some nasty bugs introduced in 1.21, which would cause stack
|
2
20
|
traces.
|
3
21
|
* Fixed the use of /bin/env in some demos instead of /usr/bin/env.
|
data/Rakefile
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'rake/gempackagetask'
|
4
4
|
require 'rake/rdoctask'
|
5
|
+
require 'rake/testtask'
|
5
6
|
|
6
7
|
rdoc_files = ["Declare.rdoc", 'HISTORY.txt'] + Dir.glob('lib/*/*.rb')
|
7
8
|
|
@@ -10,7 +11,7 @@ rdoc_files = ["Declare.rdoc", 'HISTORY.txt'] + Dir.glob('lib/*/*.rb')
|
|
10
11
|
#
|
11
12
|
spec = Gem::Specification.new do |spec|
|
12
13
|
spec.name = "getopt-declare"
|
13
|
-
spec.version = '1.
|
14
|
+
spec.version = '1.23'
|
14
15
|
spec.author = "Gonzalo Garramuno"
|
15
16
|
spec.email = 'ggarra@advancedsl.com.ar, GGarramuno@aol.com'
|
16
17
|
spec.homepage = 'http://www.rubyforge.org/projects/getoptdeclare/'
|
@@ -62,7 +63,40 @@ task 'upload-docs' => ['rdoc'] do
|
|
62
63
|
end
|
63
64
|
|
64
65
|
|
66
|
+
desc 'Zip directory as an archive.'
|
67
|
+
task 'zip' => ['rdoc'] do
|
68
|
+
dir = File.basename(Dir.pwd)
|
69
|
+
zipfile = spec.name + "-" + spec.version.to_s + ".zip"
|
70
|
+
Dir.chdir('..')
|
71
|
+
File.unlink(zipfile) if File.exists?(zipfile)
|
72
|
+
sh "zip -9rv #{zipfile} #{dir} -x '*~' -x '#*#' -x '*docs/*' -x '*pkg/*' -x '.*'"
|
73
|
+
Dir.chdir(dir)
|
74
|
+
end
|
75
|
+
|
76
|
+
desc 'Run unit tests'
|
77
|
+
Rake::TestTask.new do |t|
|
78
|
+
t.libs << 'test'
|
79
|
+
t.test_files = FileList['test/*.rb']
|
80
|
+
t.verbose = true
|
81
|
+
t.warning = true
|
82
|
+
# t.loader = :testrb
|
83
|
+
# p t.methods - Object.methods
|
84
|
+
end
|
85
|
+
|
86
|
+
desc 'upload gem'
|
87
|
+
task 'upload-gem' => ['test', 'gem'] do
|
88
|
+
end
|
89
|
+
|
90
|
+
desc 'upload zip'
|
91
|
+
task 'upload-zip' => ['zip'] do
|
92
|
+
end
|
93
|
+
|
94
|
+
desc 'Upload gem, docs and zip file'
|
95
|
+
task 'upload' => [ 'upload-gem', 'upload-zip', 'upload-docs' ]
|
96
|
+
|
97
|
+
|
98
|
+
|
65
99
|
#
|
66
100
|
# Main task
|
67
101
|
#
|
68
|
-
task :default => ['
|
102
|
+
task :default => ['upload']
|
data/lib/Getopt/Declare.rb
CHANGED
@@ -131,7 +131,7 @@ module Getopt
|
|
131
131
|
'(?:%T[eE](?:[+-])?%D+)?|%T\.%D+(?:%T[eE](?:[+-])?%D+)?))',
|
132
132
|
},
|
133
133
|
':s' => { 'pattern' => '(?:%T(?:\S|\0))+(?=\s|\0|\z)' },
|
134
|
-
':qs' => { 'pattern' => %q{"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|(?:%T(?:\S|\0))+
|
134
|
+
':qs' => { 'pattern' => %q{"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|(?:%T(?:\S|\0))+} },
|
135
135
|
':id' => { 'pattern' => '%T[a-zA-Z_](?:%T\w)*(?=\s|\0|\z)' },
|
136
136
|
':d' => { 'pattern' => '(?:%T(?:\S|\0))+',
|
137
137
|
'action' => %q%
|
@@ -279,12 +279,12 @@ module Getopt
|
|
279
279
|
end
|
280
280
|
|
281
281
|
c = conversion
|
282
|
-
c = "\n _VAL_ = _VAL_#{c}" if c
|
282
|
+
c = "\n _VAL_ = _VAL_#{c} if _VAL_" if c
|
283
283
|
|
284
284
|
code = <<-EOS
|
285
285
|
_VAR_ = %q|<#{@name}>|
|
286
286
|
_VAL_ = @@m[#{pos1}]
|
287
|
-
_VAL_.tr!("\\0"," ")#{c}
|
287
|
+
_VAL_.tr!("\\0"," ") if _VAL_#{c}
|
288
288
|
EOS
|
289
289
|
|
290
290
|
actions = Getopt::Declare::ScalarArg::stdactions(@type)
|
@@ -489,6 +489,13 @@ EOS
|
|
489
489
|
@@posflagpat = nil
|
490
490
|
@@negflagpat = nil
|
491
491
|
|
492
|
+
def Arg.clear
|
493
|
+
@@flags = []
|
494
|
+
@@nextid = 0
|
495
|
+
@@posflagpat = nil
|
496
|
+
@@negflagpath = nil
|
497
|
+
end
|
498
|
+
|
492
499
|
# Return string with regex that avoids all flags in declaration
|
493
500
|
def Arg.negflagpat(*t)
|
494
501
|
if !@@negflagpat && @@flags
|
@@ -601,7 +608,6 @@ EOS
|
|
601
608
|
|
602
609
|
# Return String with code to parse this argument (ie. flag)
|
603
610
|
def code(*t)
|
604
|
-
|
605
611
|
owner = t[0]
|
606
612
|
mod = t[1]
|
607
613
|
|
@@ -616,7 +622,7 @@ EOS
|
|
616
622
|
code += !@repeatable? " while !_FOUND_['" + self.foundid + "']" :
|
617
623
|
" while 1"
|
618
624
|
if (flag && (clump==1 && flag !~ /\A[^a-z0-9]+[a-z0-9]\Z/i ||
|
619
|
-
(clump<3 && @args )))
|
625
|
+
(clump<3 && @args.size > 0 )))
|
620
626
|
code << " && !_lastprefix"
|
621
627
|
end
|
622
628
|
|
@@ -657,16 +663,13 @@ EOS
|
|
657
663
|
i -= 1
|
658
664
|
end # while i
|
659
665
|
|
660
|
-
|
661
666
|
if @args
|
662
|
-
code << "\n"+'
|
667
|
+
code << "\n"+' _args && _pos = gindex( _args, /\G'
|
663
668
|
|
664
669
|
@args.each_with_index { |arg, i|
|
665
670
|
code << arg.ows(arg.matcher(trailer[i]))
|
666
671
|
}
|
667
672
|
|
668
|
-
code << '\b'
|
669
|
-
|
670
673
|
code << '/x' + nocasei + ", _pos ) or throw(:paramout)\n"
|
671
674
|
end # if @args
|
672
675
|
|
@@ -741,12 +744,16 @@ EOS
|
|
741
744
|
|
742
745
|
# Return name of argument, which can be flag's name or variable's name
|
743
746
|
def name
|
744
|
-
return
|
747
|
+
return @flag unless @flag.empty?
|
748
|
+
for i in @args
|
749
|
+
return "<#{i.name}>" if i.respond_to?(:name)
|
750
|
+
end
|
751
|
+
raise "Unknown flag name for parameter #{self.desc}"
|
745
752
|
end
|
746
753
|
|
747
754
|
# Return foundid of argument, which can be flag's name or variable's name
|
748
755
|
def foundid
|
749
|
-
return @foundid ||
|
756
|
+
return @foundid || "<#{self.name}>"
|
750
757
|
end
|
751
758
|
|
752
759
|
end # Arg
|
@@ -989,6 +996,9 @@ EOS
|
|
989
996
|
|
990
997
|
# Constructor
|
991
998
|
def initialize(*opts)
|
999
|
+
@cache = nil
|
1000
|
+
|
1001
|
+
Getopt::Declare::Arg::clear
|
992
1002
|
|
993
1003
|
# HANDLE SHORT-CIRCUITS
|
994
1004
|
return if opts.size==2 && (!opts[1] || opts[1] == '-SKIP')
|
@@ -1017,6 +1027,7 @@ EOS
|
|
1017
1027
|
_strict = false
|
1018
1028
|
_all_repeatable = false
|
1019
1029
|
_lastdesc = nil
|
1030
|
+
arg = nil
|
1020
1031
|
Getopt::Declare::nocase = false
|
1021
1032
|
Getopt::Declare::ScalarArg::_reset_stdtype
|
1022
1033
|
|
@@ -1134,7 +1145,13 @@ EOS
|
|
1134
1145
|
end
|
1135
1146
|
|
1136
1147
|
# Sort flags based on criteria described in docs
|
1137
|
-
|
1148
|
+
# Sadly, this cannot be reduced to sort_by
|
1149
|
+
_args = _args.sort() { |a,b|
|
1150
|
+
( b.flag.length() <=> a.flag.length() ) or
|
1151
|
+
( b.flag == a.flag and ( b.args.length() <=> a.args.length() ) ) or
|
1152
|
+
( a.id <=> b.id )
|
1153
|
+
}
|
1154
|
+
# _args = _args.sort_by { |a| [a.flag.size, a.flag, a.args.size, a.id] }
|
1138
1155
|
|
1139
1156
|
|
1140
1157
|
# Handle clump
|
@@ -1165,8 +1182,8 @@ EOS
|
|
1165
1182
|
end
|
1166
1183
|
|
1167
1184
|
# DO THE PARSE (IF APPROPRIATE)
|
1168
|
-
if
|
1169
|
-
|
1185
|
+
if opts.size == 2
|
1186
|
+
return nil unless parse(source)
|
1170
1187
|
else
|
1171
1188
|
return nil unless parse()
|
1172
1189
|
end
|
@@ -1178,7 +1195,7 @@ EOS
|
|
1178
1195
|
# optionally eval it, too.
|
1179
1196
|
def parse(*opts)
|
1180
1197
|
source = opts[0]
|
1181
|
-
_args =
|
1198
|
+
_args = nil
|
1182
1199
|
_get_nextline = proc { nil }
|
1183
1200
|
|
1184
1201
|
if source
|
@@ -1200,6 +1217,8 @@ EOS
|
|
1200
1217
|
_args = source.readlines.join(' ')
|
1201
1218
|
_args.tr!('\t\n',' ')
|
1202
1219
|
end
|
1220
|
+
when :build, :skip
|
1221
|
+
return 0
|
1203
1222
|
when Array
|
1204
1223
|
if source.length() == 1 && !source[0] ||
|
1205
1224
|
source[0] == "-BUILD" ||
|
@@ -1226,10 +1245,12 @@ EOS
|
|
1226
1245
|
# Bunch of files to load passed to parse()
|
1227
1246
|
_args, source = _load_sources( _get_nextline, source )
|
1228
1247
|
end
|
1229
|
-
|
1248
|
+
when String # else/case LITERAL STRING TO PARSE
|
1230
1249
|
_args = source.dup
|
1231
|
-
source[7]
|
1250
|
+
source = source[0,7] + '...' if source && source.length() > 7
|
1232
1251
|
source = "\"#{source[0..9]}\""
|
1252
|
+
else
|
1253
|
+
raise "Unknown source type for Getopt::Declare::parse"
|
1233
1254
|
end # case
|
1234
1255
|
return 0 unless _args
|
1235
1256
|
source = " (in #{source})"
|
@@ -1239,7 +1260,6 @@ EOS
|
|
1239
1260
|
end
|
1240
1261
|
|
1241
1262
|
@source = source
|
1242
|
-
|
1243
1263
|
begin
|
1244
1264
|
err = eval( code(@caller) )
|
1245
1265
|
if $@
|
@@ -1267,12 +1287,19 @@ EOS
|
|
1267
1287
|
prog = "#{$0}"
|
1268
1288
|
filedate = File.stat( prog ).mtime.localtime()
|
1269
1289
|
prog.sub!(%r#.*/#,'')
|
1290
|
+
r = ''
|
1270
1291
|
if defined?($VERSION)
|
1271
|
-
|
1292
|
+
r << "\n#{prog}: version #{$VERSION} (#{filedate})\n\n"
|
1272
1293
|
else
|
1273
|
-
|
1294
|
+
r << "\n#{prog}: version dated #{filedate}\n\n"
|
1274
1295
|
end
|
1275
|
-
|
1296
|
+
|
1297
|
+
if t.empty?
|
1298
|
+
return r
|
1299
|
+
else
|
1300
|
+
puts r
|
1301
|
+
exit t[0]
|
1302
|
+
end
|
1276
1303
|
end
|
1277
1304
|
|
1278
1305
|
# Print out usage information
|
@@ -1346,7 +1373,8 @@ EOS
|
|
1346
1373
|
end
|
1347
1374
|
|
1348
1375
|
spec =~ /\A\s*(\S+)/ and lastflag = "#$1"
|
1349
|
-
|
1376
|
+
|
1377
|
+
desc.sub!(/\s+\Z/, "\n")
|
1350
1378
|
usage += spec + ' ' * uoff + desc
|
1351
1379
|
next
|
1352
1380
|
end
|
@@ -1364,6 +1392,7 @@ EOS
|
|
1364
1392
|
end
|
1365
1393
|
decfirst = 1 unless !decfirst.nil? or desc =~ /\A\s*\Z/
|
1366
1394
|
usage += desc
|
1395
|
+
usage.rstrip!
|
1367
1396
|
end
|
1368
1397
|
|
1369
1398
|
end #while
|
@@ -1377,31 +1406,37 @@ EOS
|
|
1377
1406
|
usage.gsub!(/\255/,"[/") # REINSTATE ESCAPED '['s
|
1378
1407
|
|
1379
1408
|
required.gsub!(/<([a-zA-Z]\w*):[^>]+>/,'<\1>')
|
1409
|
+
required.rstrip!
|
1380
1410
|
|
1381
1411
|
helpcmd = Getopt::Declare::Arg::besthelp
|
1382
1412
|
versioncmd = Getopt::Declare::Arg::bestversion
|
1383
1413
|
|
1384
|
-
pager = $stdout
|
1385
1414
|
|
1386
|
-
|
1387
|
-
# eval('require "IO/Pager";')
|
1388
|
-
# pager = IO::Pager.new()
|
1389
|
-
#rescue
|
1390
|
-
#end
|
1391
|
-
|
1415
|
+
header = ''
|
1392
1416
|
unless @source.nil?
|
1393
|
-
version()
|
1417
|
+
header << version()
|
1394
1418
|
prog = "#{$0}"
|
1395
1419
|
prog.sub!(%r#.*/#,'')
|
1396
|
-
|
1397
|
-
|
1398
|
-
|
1399
|
-
|
1420
|
+
header << "Usage: #{prog} [options]#{required}\n"
|
1421
|
+
header << " #{prog} #{helpcmd}\n" if helpcmd
|
1422
|
+
header << " #{prog} #{versioncmd}\n" if versioncmd
|
1423
|
+
header << "\n" unless decfirst && decfirst == 1 && usage =~ /\A[ \t]*\n/
|
1400
1424
|
end
|
1401
1425
|
|
1402
|
-
|
1403
|
-
pager.print usage
|
1426
|
+
header << "Options:\n" unless decfirst && decfirst == 1
|
1404
1427
|
|
1428
|
+
if opt.empty?
|
1429
|
+
return header + usage + "\n"
|
1430
|
+
end
|
1431
|
+
|
1432
|
+
pager = $stdout
|
1433
|
+
#begin
|
1434
|
+
# eval('require "IO/Pager";')
|
1435
|
+
# pager = IO::Pager.new()
|
1436
|
+
#rescue
|
1437
|
+
#end
|
1438
|
+
|
1439
|
+
pager.puts "#{header}#{usage}"
|
1405
1440
|
exit(opt[0]) if opt[0]
|
1406
1441
|
end
|
1407
1442
|
|
@@ -1410,8 +1445,8 @@ EOS
|
|
1410
1445
|
|
1411
1446
|
# Return list of used parameters (after parsing)
|
1412
1447
|
def used
|
1413
|
-
used = @cache.
|
1414
|
-
return
|
1448
|
+
used = @cache.keys
|
1449
|
+
return used.join(' ')
|
1415
1450
|
end
|
1416
1451
|
|
1417
1452
|
@@m = []
|
@@ -1428,6 +1463,13 @@ EOS
|
|
1428
1463
|
|
1429
1464
|
begin
|
1430
1465
|
|
1466
|
+
begin
|
1467
|
+
undef :defer
|
1468
|
+
undef :reject
|
1469
|
+
undef :finish
|
1470
|
+
rescue
|
1471
|
+
end
|
1472
|
+
|
1431
1473
|
def defer(&i)
|
1432
1474
|
@_deferred.push( i )
|
1433
1475
|
end
|
@@ -1610,7 +1652,7 @@ end
|
|
1610
1652
|
unless _errors > 0
|
1611
1653
|
for i in @_deferred
|
1612
1654
|
begin
|
1613
|
-
i.call
|
1655
|
+
i.call
|
1614
1656
|
rescue => e
|
1615
1657
|
STDERR.puts "Action in Getopt::Declare specification produced:\n#{e}"
|
1616
1658
|
_errors += 1
|
@@ -1626,7 +1668,7 @@ end
|
|
1626
1668
|
|
1627
1669
|
|
1628
1670
|
# Inspect cache (not the declare object)
|
1629
|
-
def inspect
|
1671
|
+
def inspect
|
1630
1672
|
return nil if !@cache
|
1631
1673
|
t = ''
|
1632
1674
|
|
data/samples/cmdline_mid.rb
CHANGED
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.23"
|
7
|
+
date: 2007-03-21 00:00:00 -03:00
|
8
8
|
summary: Getopt-Declare is a command-line argument parser.
|
9
9
|
require_paths:
|
10
10
|
- lib
|