trad-getopt 1.2.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/test.rb +97 -36
- data/trad-getopt.rb +187 -49
- data/trad-getopt.txt +19 -20
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 249a0240a2d24ecd2acdfbbeea4ea735b7741a111c3a3d73f73924ab7c69dbaa
|
4
|
+
data.tar.gz: 01f880cd85ba5f25295aa1a7edbe831217fd5f60e19e9c1ffa408e20cd2fe1ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae31e46184189f798d898d7b78f4b2036f286ad373a537f4abb235909aea49c0475412c8b224947a911f633b251f32c1c6699a0dfd1f05ebb6f57d679a340078
|
7
|
+
data.tar.gz: 255ba6bab37aa24df764a7631f2519568dfbf68572d4e7d2aca67d1f8f9b5a84806871295fc95e4bdae5f0c7a4bf73a6fa65760f6c5275a8620ec5648cbb7298
|
data/test.rb
CHANGED
@@ -41,8 +41,8 @@ class Test_getopt < Test::Unit::TestCase
|
|
41
41
|
got = getopt(av, "a")
|
42
42
|
msg = $stderr.string
|
43
43
|
$stderr = STDERR
|
44
|
-
assert_equal [:unknown_option, "x"], got
|
45
|
-
assert_equal "#{myname}:
|
44
|
+
assert_equal [:unknown_option, "-x"], got
|
45
|
+
assert_equal "#{myname}: Unknown option: -x\n", msg
|
46
46
|
assert_equal [], av
|
47
47
|
end
|
48
48
|
|
@@ -66,8 +66,8 @@ class Test_getopt < Test::Unit::TestCase
|
|
66
66
|
got = getopt(av, "a:")
|
67
67
|
msg = $stderr.string
|
68
68
|
$stderr = STDERR
|
69
|
-
assert_equal [:argument_required, "a"], got
|
70
|
-
assert_equal "#{myname}:
|
69
|
+
assert_equal [:argument_required, "-a"], got
|
70
|
+
assert_equal "#{myname}: Option requires an argument: -a\n", msg
|
71
71
|
assert_equal [], av
|
72
72
|
end
|
73
73
|
|
@@ -94,7 +94,7 @@ class Test_getopt < Test::Unit::TestCase
|
|
94
94
|
$stderr = StringIO.new
|
95
95
|
got = getopt(av, "a::", optional_short:false)
|
96
96
|
$stderr = STDERR
|
97
|
-
assert_equal [ :argument_required, "a"], got
|
97
|
+
assert_equal [ :argument_required, "-a"], got
|
98
98
|
end
|
99
99
|
|
100
100
|
# concatenation
|
@@ -148,8 +148,8 @@ class Test_getopt < Test::Unit::TestCase
|
|
148
148
|
got = getopt(av, opts)
|
149
149
|
msg = $stderr.string
|
150
150
|
$stderr = STDERR
|
151
|
-
assert_equal [:unknown_option, "
|
152
|
-
assert_equal "#{myname}:
|
151
|
+
assert_equal [:unknown_option, "--"], got
|
152
|
+
assert_equal "#{myname}: Unknown option: --\n", msg
|
153
153
|
assert_equal [], av
|
154
154
|
end
|
155
155
|
|
@@ -164,8 +164,8 @@ class Test_getopt < Test::Unit::TestCase
|
|
164
164
|
got = getopt(av, "a:")
|
165
165
|
msg = $stderr.string
|
166
166
|
$stderr = STDERR
|
167
|
-
assert_equal [:unknown_option, "
|
168
|
-
assert_equal "#{myname}:
|
167
|
+
assert_equal [:unknown_option, "-:"], got
|
168
|
+
assert_equal "#{myname}: Unknown option: -:\n", msg
|
169
169
|
assert_equal [], av
|
170
170
|
end
|
171
171
|
|
@@ -177,7 +177,7 @@ class Test_getopt < Test::Unit::TestCase
|
|
177
177
|
getopt(av, "a", error_message:true, program_name:"foo")
|
178
178
|
msg = $stderr.string
|
179
179
|
$stderr = STDERR
|
180
|
-
assert_equal "foo:
|
180
|
+
assert_equal "foo: Unknown option: -x\n", msg
|
181
181
|
end
|
182
182
|
|
183
183
|
test "error_message" do
|
@@ -195,8 +195,8 @@ class Test_getopt < Test::Unit::TestCase
|
|
195
195
|
getopt(av, "a", use_exception:true)
|
196
196
|
rescue => ex
|
197
197
|
assert_equal Getopt::UnknownOptionError, ex.class
|
198
|
-
assert_equal "x", ex.option
|
199
|
-
assert_equal "
|
198
|
+
assert_equal "-x", ex.option
|
199
|
+
assert_equal "Unknown option", ex.message
|
200
200
|
end
|
201
201
|
end
|
202
202
|
|
@@ -206,8 +206,8 @@ class Test_getopt < Test::Unit::TestCase
|
|
206
206
|
getopt(av, "a:", use_exception:true)
|
207
207
|
rescue => ex
|
208
208
|
assert_equal Getopt::ArgumentRequiredError, ex.class
|
209
|
-
assert_equal "a", ex.option
|
210
|
-
assert_equal "
|
209
|
+
assert_equal "-a", ex.option
|
210
|
+
assert_equal "Option requires an argument", ex.message
|
211
211
|
end
|
212
212
|
end
|
213
213
|
|
@@ -233,7 +233,8 @@ class Test_getopt < Test::Unit::TestCase
|
|
233
233
|
av = [ "-a", "" ]
|
234
234
|
opts = "a:"
|
235
235
|
$stderr = StringIO.new
|
236
|
-
assert_equal [:argument_required, "a"],
|
236
|
+
assert_equal [:argument_required, "-a"],
|
237
|
+
getopt(av, opts, allow_empty_optarg:false)
|
237
238
|
$stderr = STDERR
|
238
239
|
end
|
239
240
|
|
@@ -241,7 +242,8 @@ class Test_getopt < Test::Unit::TestCase
|
|
241
242
|
av = [ "--foo=" ]
|
242
243
|
longopts = { "foo" => :required_argument }
|
243
244
|
$stderr = StringIO.new
|
244
|
-
assert_equal [:argument_required, "foo"],
|
245
|
+
assert_equal [:argument_required, "--foo"],
|
246
|
+
getopt(av, "", longopts, allow_empty_optarg:false)
|
245
247
|
$stderr = STDERR
|
246
248
|
end
|
247
249
|
|
@@ -249,7 +251,8 @@ class Test_getopt < Test::Unit::TestCase
|
|
249
251
|
av = [ "--foo", "" ]
|
250
252
|
longopts = { "foo" => :required_argument }
|
251
253
|
$stderr = StringIO.new
|
252
|
-
assert_equal [:argument_required, "foo"],
|
254
|
+
assert_equal [:argument_required, "--foo"],
|
255
|
+
getopt(av, "", longopts, allow_empty_optarg:false)
|
253
256
|
$stderr = STDERR
|
254
257
|
end
|
255
258
|
|
@@ -257,7 +260,8 @@ class Test_getopt < Test::Unit::TestCase
|
|
257
260
|
av = [ "--foo=" ]
|
258
261
|
longopts = { "foo" => :optional_argument }
|
259
262
|
$stderr = StringIO.new
|
260
|
-
assert_equal [:argument_required, "foo"],
|
263
|
+
assert_equal [:argument_required, "--foo"],
|
264
|
+
getopt(av, "", longopts, allow_empty_optarg:false)
|
261
265
|
$stderr = STDERR
|
262
266
|
end
|
263
267
|
|
@@ -268,7 +272,7 @@ class Test_getopt < Test::Unit::TestCase
|
|
268
272
|
opts = "a"
|
269
273
|
assert_equal [ "a" ], getopt(av, opts)
|
270
274
|
$stderr = StringIO.new
|
271
|
-
assert_equal [ :unknown_option, "
|
275
|
+
assert_equal [ :unknown_option, "--" ], getopt(av, opts)
|
272
276
|
$stderr = STDERR
|
273
277
|
end
|
274
278
|
|
@@ -292,7 +296,7 @@ class Test_getopt < Test::Unit::TestCase
|
|
292
296
|
assert_equal [ "a" ], getopt(av, opts, lopts)
|
293
297
|
assert_equal [ "-" ], getopt(av, opts, lopts)
|
294
298
|
$stderr = StringIO.new
|
295
|
-
assert_equal [ :unknown_option, "f" ], getopt(av, opts, lopts)
|
299
|
+
assert_equal [ :unknown_option, "-f" ], getopt(av, opts, lopts)
|
296
300
|
$stderr = STDERR
|
297
301
|
end
|
298
302
|
|
@@ -353,8 +357,8 @@ class Test_getopt < Test::Unit::TestCase
|
|
353
357
|
got = getopt(av, "", lopts)
|
354
358
|
msg = $stderr.string
|
355
359
|
$stderr = STDERR
|
356
|
-
assert_equal [ :unknown_option, "bar" ], got
|
357
|
-
assert_equal "#{myname}:
|
360
|
+
assert_equal [ :unknown_option, "--bar" ], got
|
361
|
+
assert_equal "#{myname}: Unknown option: --bar\n", msg
|
358
362
|
end
|
359
363
|
|
360
364
|
test "no_argument" do
|
@@ -374,8 +378,8 @@ class Test_getopt < Test::Unit::TestCase
|
|
374
378
|
got = getopt(av, "", lopts)
|
375
379
|
msg = $stderr.string
|
376
380
|
$stderr = STDERR
|
377
|
-
assert_equal [ :argument_given, "foo" ], got
|
378
|
-
assert_equal "#{myname}:
|
381
|
+
assert_equal [ :argument_given, "--foo" ], got
|
382
|
+
assert_equal "#{myname}: Option doesn't take an argument: --foo\n", msg
|
379
383
|
end
|
380
384
|
|
381
385
|
test "no_argument, exception" do
|
@@ -387,8 +391,8 @@ class Test_getopt < Test::Unit::TestCase
|
|
387
391
|
getopt(av, "", lopts, use_exception:true)
|
388
392
|
rescue => ex
|
389
393
|
assert_equal Getopt::ArgumentGivenError, ex.class
|
390
|
-
assert_equal "foo", ex.option
|
391
|
-
assert_equal "
|
394
|
+
assert_equal "--foo", ex.option
|
395
|
+
assert_equal "Option doesn't take an argument", ex.message
|
392
396
|
end
|
393
397
|
end
|
394
398
|
|
@@ -425,8 +429,8 @@ class Test_getopt < Test::Unit::TestCase
|
|
425
429
|
got = getopt(av, "", lopts)
|
426
430
|
msg = $stderr.string
|
427
431
|
$stderr = STDERR
|
428
|
-
assert_equal [ :argument_required, "foo" ], got
|
429
|
-
assert_equal "#{myname}:
|
432
|
+
assert_equal [ :argument_required, "--foo" ], got
|
433
|
+
assert_equal "#{myname}: Option requires an argument: --foo\n", msg
|
430
434
|
end
|
431
435
|
|
432
436
|
test "required_argument, exception" do
|
@@ -438,8 +442,8 @@ class Test_getopt < Test::Unit::TestCase
|
|
438
442
|
getopt(av, "", lopts, use_exception:true)
|
439
443
|
rescue => ex
|
440
444
|
assert_equal Getopt::ArgumentRequiredError, ex.class
|
441
|
-
assert_equal "foo", ex.option
|
442
|
-
assert_equal "
|
445
|
+
assert_equal "--foo", ex.option
|
446
|
+
assert_equal "Option requires an argument", ex.message
|
443
447
|
end
|
444
448
|
end
|
445
449
|
|
@@ -513,8 +517,8 @@ class Test_getopt < Test::Unit::TestCase
|
|
513
517
|
got = getopt(av, "", lopts)
|
514
518
|
msg = $stderr.string
|
515
519
|
$stderr = STDERR
|
516
|
-
assert_equal [ :ambiguous_option, "foo", ["foo1", "foo2"
|
517
|
-
assert_equal "#{myname}:
|
520
|
+
assert_equal [ :ambiguous_option, ["--foo", [ "--foo1", "--foo2" ]]], got
|
521
|
+
assert_equal "#{myname}: Ambiguos option (--foo1,--foo2): --foo\n", msg
|
518
522
|
end
|
519
523
|
|
520
524
|
test "abbrev, ambiguous, exception" do
|
@@ -527,8 +531,8 @@ class Test_getopt < Test::Unit::TestCase
|
|
527
531
|
getopt(av, "", lopts, use_exception:true)
|
528
532
|
rescue => ex
|
529
533
|
assert_equal Getopt::AmbiguousOptionError, ex.class
|
530
|
-
assert_equal "foo", ex.option
|
531
|
-
assert_equal "
|
534
|
+
assert_equal "--foo", ex.option
|
535
|
+
assert_equal "Ambiguos option (--foo1,--foo2)", ex.message
|
532
536
|
end
|
533
537
|
end
|
534
538
|
|
@@ -541,7 +545,64 @@ class Test_getopt < Test::Unit::TestCase
|
|
541
545
|
got = getopt(av, "", lopts, abbreviation:false)
|
542
546
|
msg = $stderr.string
|
543
547
|
$stderr = STDERR
|
544
|
-
assert_equal [ :unknown_option, "fo" ], got
|
545
|
-
assert_equal "#{myname}:
|
548
|
+
assert_equal [ :unknown_option, "--fo" ], got
|
549
|
+
assert_equal "#{myname}: Unknown option: --fo\n", msg
|
546
550
|
end
|
551
|
+
|
552
|
+
# Getopt.parse
|
553
|
+
|
554
|
+
test "Getopt.parse" do
|
555
|
+
av = [ "-a", "foo", "-bx", "-x",
|
556
|
+
"-c", "-cx",
|
557
|
+
"--noarg", "--reqarg=x",
|
558
|
+
"--oparg", "--oparg=x" ]
|
559
|
+
lopts = {
|
560
|
+
"noarg" => :no_argument,
|
561
|
+
"reqarg" => :required_argument,
|
562
|
+
"oparg" => :optional_argument,
|
563
|
+
}
|
564
|
+
|
565
|
+
got = Getopt.parse(av, "ab:c::", lopts)
|
566
|
+
|
567
|
+
assert_equal [ [ :short, :no_argument, "-a" ],
|
568
|
+
"foo",
|
569
|
+
[ :short, :required_argument, "-b", "x" ],
|
570
|
+
[ :error, :unknown_option, "-x" ],
|
571
|
+
[ :short, :optional_argument, "-c", nil ],
|
572
|
+
[ :short, :optional_argument, "-c", "x" ],
|
573
|
+
[ :long, :no_argument, "--noarg" ],
|
574
|
+
[ :long, :required_argument, "--reqarg", "x" ],
|
575
|
+
[ :long, :optional_argument, "--oparg", nil ],
|
576
|
+
[ :long, :optional_argument, "--oparg", "x" ]],
|
577
|
+
got
|
578
|
+
end
|
579
|
+
|
580
|
+
# Getopt.list
|
581
|
+
|
582
|
+
test "Getopt.list" do
|
583
|
+
av = [ "-a", "foo", "-bx", "-x",
|
584
|
+
"-c", "-cx",
|
585
|
+
"--noarg", "--reqarg=x",
|
586
|
+
"--oparg", "--oparg=x" ]
|
587
|
+
lopts = {
|
588
|
+
"noarg" => :no_argument,
|
589
|
+
"reqarg" => :required_argument,
|
590
|
+
"oparg" => :optional_argument,
|
591
|
+
}
|
592
|
+
|
593
|
+
got = Getopt.list(av, "ab:c::", lopts)
|
594
|
+
|
595
|
+
assert_equal [ "-a",
|
596
|
+
"foo",
|
597
|
+
%|-b "x"|,
|
598
|
+
[ :error, :unknown_option, "-x" ],
|
599
|
+
"-c",
|
600
|
+
%|-c"x"|,
|
601
|
+
"--noarg",
|
602
|
+
%|--reqarg="x"|,
|
603
|
+
"--oparg",
|
604
|
+
%|--oparg="x"| ],
|
605
|
+
got
|
606
|
+
end
|
607
|
+
|
547
608
|
end
|
data/trad-getopt.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
|
-
# rather traditional getopt for Ruby
|
2
|
-
|
3
1
|
module Getopt
|
4
2
|
|
5
|
-
VERSION = "
|
3
|
+
VERSION = "2.0.0"
|
6
4
|
|
7
5
|
class GetoptError < StandardError
|
8
6
|
def initialize option, message
|
@@ -11,48 +9,171 @@ module Getopt
|
|
11
9
|
end
|
12
10
|
attr_reader :option
|
13
11
|
end
|
12
|
+
|
14
13
|
class UnknownOptionError < GetoptError
|
15
|
-
def initialize option, message = "
|
14
|
+
def initialize option, message = "Unknown option"
|
16
15
|
super option, message
|
17
16
|
end
|
18
17
|
end
|
18
|
+
|
19
19
|
class ArgumentRequiredError < GetoptError
|
20
|
-
def initialize option, message = "
|
20
|
+
def initialize option, message = "Option requires an argument"
|
21
21
|
super option, message
|
22
22
|
end
|
23
23
|
end
|
24
|
+
|
24
25
|
class ArgumentGivenError < GetoptError
|
25
|
-
def initialize option, message = "
|
26
|
+
def initialize option, message = "Option doesn't take an argument"
|
26
27
|
super option, message
|
27
28
|
end
|
28
29
|
end
|
30
|
+
|
29
31
|
class AmbiguousOptionError < GetoptError
|
30
32
|
def initialize option, message, candidates
|
31
|
-
message ||= "
|
33
|
+
message ||= "Ambiguos option"
|
32
34
|
@candidates = candidates
|
33
|
-
|
34
|
-
super option, "#{message} (#{cands})"
|
35
|
+
super option, %|#{message} (#{candidates.join ","})|
|
35
36
|
end
|
36
37
|
attr_reader :candidates
|
37
38
|
end
|
39
|
+
|
40
|
+
def self.parse argv, opts, longopts,
|
41
|
+
abbreviation: true,
|
42
|
+
allow_empty_optarg: true,
|
43
|
+
optional_short: true,
|
44
|
+
permute: false,
|
45
|
+
program_name: nil,
|
46
|
+
stop_by_double_hyphen: true,
|
47
|
+
use_exception: false
|
48
|
+
# error_message:
|
49
|
+
# parse:
|
50
|
+
|
51
|
+
xargv = []
|
52
|
+
loop {
|
53
|
+
ret = getopt argv, opts, longopts,
|
54
|
+
error_message: false,
|
55
|
+
parse: true,
|
56
|
+
#
|
57
|
+
abbreviation: abbreviation,
|
58
|
+
allow_empty_optarg: allow_empty_optarg,
|
59
|
+
optional_short: optional_short,
|
60
|
+
permute: permute,
|
61
|
+
program_name: program_name,
|
62
|
+
stop_by_double_hyphen: stop_by_double_hyphen,
|
63
|
+
use_exception: use_exception
|
64
|
+
|
65
|
+
if ret == :stop
|
66
|
+
xargv.push :stop
|
67
|
+
xargv.concat argv
|
68
|
+
break
|
69
|
+
elsif ret.nil?
|
70
|
+
xargv.push argv.shift
|
71
|
+
else
|
72
|
+
xargv.push ret
|
73
|
+
end
|
74
|
+
|
75
|
+
break if argv.empty?
|
76
|
+
}
|
77
|
+
xargv
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.list argv, opts, longopts,
|
81
|
+
abbreviation: true,
|
82
|
+
allow_empty_optarg: true,
|
83
|
+
optional_short: true,
|
84
|
+
permute: false,
|
85
|
+
program_name: nil,
|
86
|
+
stop_by_double_hyphen: true,
|
87
|
+
use_exception: false
|
88
|
+
# error_message:
|
89
|
+
# parse:
|
90
|
+
|
91
|
+
xargv = []
|
92
|
+
loop {
|
93
|
+
ret = getopt argv, opts, longopts,
|
94
|
+
error_message: false,
|
95
|
+
parse: true,
|
96
|
+
#
|
97
|
+
abbreviation: abbreviation,
|
98
|
+
allow_empty_optarg: allow_empty_optarg,
|
99
|
+
optional_short: optional_short,
|
100
|
+
permute: permute,
|
101
|
+
program_name: program_name,
|
102
|
+
stop_by_double_hyphen: stop_by_double_hyphen,
|
103
|
+
use_exception: use_exception
|
104
|
+
|
105
|
+
if ret == :stop
|
106
|
+
xargv.push "--"
|
107
|
+
xargv.concat argv
|
108
|
+
break
|
109
|
+
end
|
110
|
+
|
111
|
+
if ret.nil?
|
112
|
+
xargv.push argv.shift
|
113
|
+
else
|
114
|
+
case ret.first
|
115
|
+
when :error
|
116
|
+
xargv.push ret
|
117
|
+
when :short
|
118
|
+
case ret[1]
|
119
|
+
when :no_argument
|
120
|
+
xargv.push ret[2]
|
121
|
+
when :required_argument
|
122
|
+
xargv.push %|#{ret[2]} "#{ret[3]}"|
|
123
|
+
when :optional_argument
|
124
|
+
if ret[3]
|
125
|
+
xargv.push %|#{ret[2]}"#{ret[3]}"|
|
126
|
+
else
|
127
|
+
xargv.push ret[2]
|
128
|
+
end
|
129
|
+
end
|
130
|
+
when :long
|
131
|
+
case ret[1]
|
132
|
+
when :no_argument
|
133
|
+
xargv.push ret[2]
|
134
|
+
when :required_argument
|
135
|
+
xargv.push %|#{ret[2]}="#{ret[3]}"|
|
136
|
+
when :optional_argument
|
137
|
+
if ret[3]
|
138
|
+
xargv.push %|#{ret[2]}="#{ret[3]}"|
|
139
|
+
else
|
140
|
+
xargv.push ret[2]
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
break if argv.empty?
|
147
|
+
}
|
148
|
+
xargv
|
149
|
+
end
|
150
|
+
|
38
151
|
end
|
39
152
|
|
40
|
-
def getopt
|
41
|
-
abbreviation: true,
|
42
|
-
|
43
|
-
|
44
|
-
|
153
|
+
def getopt argv, opts, longopts = nil,
|
154
|
+
abbreviation: true,
|
155
|
+
allow_empty_optarg: true,
|
156
|
+
error_message: true,
|
157
|
+
optional_short: true,
|
158
|
+
parse: false,
|
159
|
+
permute: false,
|
160
|
+
program_name: nil,
|
161
|
+
stop_by_double_hyphen: true,
|
162
|
+
use_exception: false
|
163
|
+
|
45
164
|
if permute
|
46
165
|
args = []
|
47
166
|
until op = getopt(argv, opts, longopts,
|
48
|
-
permute: false,
|
49
167
|
abbreviation: abbreviation,
|
50
168
|
allow_empty_optarg: allow_empty_optarg,
|
51
169
|
error_message: error_message,
|
52
170
|
optional_short: optional_short,
|
171
|
+
parse: parse,
|
172
|
+
permute: false,
|
53
173
|
program_name: program_name,
|
54
174
|
stop_by_double_hyphen: stop_by_double_hyphen,
|
55
175
|
use_exception: use_exception)
|
176
|
+
|
56
177
|
if argv.empty?
|
57
178
|
argv.unshift(*args)
|
58
179
|
return nil
|
@@ -67,68 +188,79 @@ def getopt(argv, opts, longopts = nil,
|
|
67
188
|
program_name ||= File.basename $0
|
68
189
|
|
69
190
|
arg = argv.shift
|
70
|
-
return nil
|
191
|
+
return nil unless arg
|
192
|
+
|
71
193
|
if arg == :getopt_short
|
72
194
|
arg = argv.shift
|
73
|
-
return nil
|
195
|
+
return nil unless arg
|
74
196
|
else
|
75
197
|
if arg == "-"
|
76
198
|
argv.unshift "-"
|
77
199
|
return nil
|
78
200
|
end
|
79
201
|
if stop_by_double_hyphen && arg == "--"
|
80
|
-
return nil
|
202
|
+
return parse ? :stop : nil
|
81
203
|
end
|
204
|
+
|
82
205
|
# long option
|
83
206
|
if longopts && arg.index("--") == 0
|
207
|
+
|
84
208
|
optopt, optarg = arg[2..-1].split "=", 2
|
85
209
|
|
86
210
|
if abbreviation
|
87
|
-
abbr = longopts.collect {
|
211
|
+
abbr = longopts.collect {|o| o if o[0] =~ /^#{optopt}/ }.compact
|
88
212
|
if abbr.empty?
|
89
|
-
raise Getopt::UnknownOptionError.new optopt
|
213
|
+
raise Getopt::UnknownOptionError.new "--#{optopt}"
|
90
214
|
end
|
91
215
|
if abbr.size == 1
|
92
216
|
optopt = abbr.first.first
|
93
|
-
elsif exact = abbr.find {
|
217
|
+
elsif exact = abbr.find {|a| a[0] == optopt }
|
94
218
|
optopt = exact.first
|
95
219
|
else
|
96
|
-
cands = abbr.collect {
|
97
|
-
raise Getopt::AmbiguousOptionError.new optopt, nil, cands
|
220
|
+
cands = abbr.collect {|o| "--#{o.first}" }
|
221
|
+
raise Getopt::AmbiguousOptionError.new "--#{optopt}", nil, cands
|
98
222
|
end
|
99
223
|
else
|
100
224
|
unless longopts[optopt]
|
101
|
-
raise Getopt::UnknownOptionError.new optopt
|
225
|
+
raise Getopt::UnknownOptionError.new "--#{optopt}"
|
102
226
|
end
|
103
227
|
end
|
104
228
|
|
105
229
|
case longopts[optopt]
|
106
230
|
when :no_argument
|
107
231
|
if optarg
|
108
|
-
raise Getopt::ArgumentGivenError.new optopt
|
232
|
+
raise Getopt::ArgumentGivenError.new "--#{optopt}"
|
109
233
|
end
|
110
|
-
|
234
|
+
ret = [ optopt ]
|
235
|
+
info = [ :long, :no_argument ]
|
111
236
|
when :required_argument
|
112
237
|
unless optarg
|
113
238
|
optarg = argv.shift
|
114
239
|
unless optarg
|
115
|
-
raise Getopt::ArgumentRequiredError.new optopt
|
240
|
+
raise Getopt::ArgumentRequiredError.new "--#{optopt}"
|
116
241
|
end
|
117
242
|
end
|
118
243
|
if ! allow_empty_optarg && optarg.empty?
|
119
|
-
raise Getopt::ArgumentRequiredError.new optopt
|
244
|
+
raise Getopt::ArgumentRequiredError.new "--#{optopt}"
|
120
245
|
end
|
121
|
-
|
246
|
+
ret = [ optopt, optarg ]
|
247
|
+
info = [ :long, :required_argument ]
|
122
248
|
when :optional_argument
|
123
249
|
if ! allow_empty_optarg && optarg && optarg.empty?
|
124
|
-
raise Getopt::ArgumentRequiredError.new optopt
|
250
|
+
raise Getopt::ArgumentRequiredError.new "--#{optopt}"
|
125
251
|
end
|
126
|
-
|
252
|
+
ret = [ optopt, optarg ]
|
253
|
+
info = [ :long, :optional_argument ]
|
127
254
|
else
|
128
255
|
raise ArgumentError,
|
129
|
-
"
|
256
|
+
"Wrong long option type - #{longopts[optopt].inspect}"
|
130
257
|
end
|
131
|
-
|
258
|
+
|
259
|
+
if parse
|
260
|
+
ret[0] = "--#{ret[0]}"
|
261
|
+
ret = info + ret
|
262
|
+
end
|
263
|
+
return ret
|
132
264
|
end
|
133
265
|
end
|
134
266
|
|
@@ -147,21 +279,23 @@ def getopt(argv, opts, longopts = nil,
|
|
147
279
|
argv.unshift "-#{arg}" unless arg.empty?
|
148
280
|
# keep short option context on error
|
149
281
|
argv.unshift :getopt_short if arg[0] == "-"
|
150
|
-
raise Getopt::UnknownOptionError.new optopt
|
282
|
+
raise Getopt::UnknownOptionError.new "-#{optopt}"
|
151
283
|
end
|
152
284
|
|
153
285
|
if opts[pos.succ] == ":"
|
154
286
|
if optional_short && opts[pos.succ.succ] == ":"
|
155
287
|
# short option with optional argument
|
156
288
|
optarg = arg.empty? ? nil : arg
|
157
|
-
|
289
|
+
ret = [ optopt, optarg ]
|
290
|
+
info = [ :short, :optional_argument ]
|
158
291
|
else
|
159
292
|
# short option with required argument
|
160
293
|
optarg = arg.empty? ? argv.shift : arg
|
161
294
|
if optarg.nil? || (optarg.empty? && ! allow_empty_optarg)
|
162
|
-
raise Getopt::ArgumentRequiredError.new optopt
|
295
|
+
raise Getopt::ArgumentRequiredError.new "-#{optopt}"
|
163
296
|
end
|
164
|
-
|
297
|
+
ret = [ optopt, optarg ]
|
298
|
+
info = [ :short, :required_argument ]
|
165
299
|
end
|
166
300
|
else
|
167
301
|
# short option without argument
|
@@ -169,30 +303,34 @@ def getopt(argv, opts, longopts = nil,
|
|
169
303
|
argv.unshift "-#{arg}"
|
170
304
|
argv.unshift :getopt_short if arg[0] == "-"
|
171
305
|
end
|
172
|
-
|
306
|
+
ret = [ optopt ]
|
307
|
+
info = [ :short, :no_argument ]
|
308
|
+
end
|
309
|
+
|
310
|
+
if parse
|
311
|
+
ret[0] = "-#{ret[0]}"
|
312
|
+
ret = info + ret
|
173
313
|
end
|
314
|
+
ret
|
174
315
|
|
175
316
|
rescue Getopt::GetoptError => ex
|
176
317
|
raise if use_exception
|
177
318
|
|
178
|
-
if error_message
|
179
|
-
if ex.option.length == 1
|
180
|
-
warn "#{program_name}: #{ex.message} -#{ex.option}"
|
181
|
-
else
|
182
|
-
warn "#{program_name}: #{ex.message} --#{ex.option}"
|
183
|
-
end
|
184
|
-
end
|
319
|
+
warn "#{program_name}: #{ex.message}: #{ex.option}" if error_message
|
185
320
|
|
186
321
|
case ex
|
187
322
|
when Getopt::UnknownOptionError
|
188
|
-
|
323
|
+
ret = [ :unknown_option, ex.option ]
|
189
324
|
when Getopt::ArgumentRequiredError
|
190
|
-
|
325
|
+
ret = [ :argument_required, ex.option ]
|
191
326
|
when Getopt::ArgumentGivenError
|
192
|
-
|
327
|
+
ret = [ :argument_given, ex.option ]
|
193
328
|
when Getopt::AmbiguousOptionError
|
194
|
-
|
329
|
+
ret = [ :ambiguous_option, [ ex.option, ex.candidates ]]
|
195
330
|
end
|
331
|
+
|
332
|
+
ret.unshift :error if parse
|
333
|
+
return ret
|
196
334
|
end
|
197
335
|
|
198
336
|
Kernel.define_singleton_method "getopt", method(:getopt)
|
data/trad-getopt.txt
CHANGED
@@ -95,8 +95,9 @@ longopts にはキーをオプション名、値をシンボルとするハッ
|
|
95
95
|
|
96
96
|
- :ambiguousu_option (Getopt::AmbiguousOptionError)
|
97
97
|
ロングオプションの省略形が一意でない。このときエラーメッセージに候補
|
98
|
-
|
99
|
-
|
98
|
+
を示す。:ambiguousu_option のみ返り値の第 2 要素はオプション文字と
|
99
|
+
候補リストのリストになる。例外を有効としている場合、候補リストは
|
100
|
+
Getopt::AmbiguousOptionError#candidates() で取得できる。
|
100
101
|
|
101
102
|
= キーワード引数
|
102
103
|
|
@@ -115,6 +116,10 @@ longopts にはキーをオプション名、値をシンボルとするハッ
|
|
115
116
|
偽にするとオプショナル引数つきショートオプションを無効にする。opts
|
116
117
|
中の "::" を ":" と解釈してただの引数つきオプションとする。
|
117
118
|
|
119
|
+
- parse => false
|
120
|
+
真にすると、オプション文字でなくオプションに関する情報をまとめたリスト
|
121
|
+
を返すようになる。Getopt.parse()、Getopt.list() が使う。
|
122
|
+
|
118
123
|
- permute => false
|
119
124
|
真にすると、オプションに出会うまで非オプションを飛ばす GNU の getopt
|
120
125
|
を模した動作になる。argv 中にオプションが無ければ nil を返す。読んだ
|
@@ -160,31 +165,25 @@ longopts にはキーをオプション名、値をシンボルとするハッ
|
|
160
165
|
----------------------------------------------------------------------------
|
161
166
|
require "trad-getopt"
|
162
167
|
|
163
|
-
opts = "ab:"
|
164
|
-
|
165
168
|
longopts = {
|
166
169
|
"foo" => :no_argument,
|
167
|
-
"
|
168
|
-
"baz" => :
|
170
|
+
"bar" => :required_argument,
|
171
|
+
"baz" => :optional_argument,
|
169
172
|
}
|
170
173
|
|
171
|
-
while op = getopt(ARGV,
|
172
|
-
case op
|
174
|
+
while (op, oparg = getopt(ARGV, "ab:c::", longopts))
|
175
|
+
case op
|
173
176
|
when "a", "foo"
|
174
|
-
puts "option #{op
|
175
|
-
when "b", "
|
176
|
-
puts "option #{op
|
177
|
-
when "
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
puts "option #{op[0]} with no-arg"
|
182
|
-
end
|
183
|
-
when :unknown_option, :argument_required, :argument_given, :ambiguous_option
|
177
|
+
puts "option #{op}"
|
178
|
+
when "b", "bar"
|
179
|
+
puts "option #{op} with #{oparg.inspect}"
|
180
|
+
when "c", "baz"
|
181
|
+
puts "option #{op} with #{oparg.inspect}"
|
182
|
+
when Symbol
|
183
|
+
# errors
|
184
184
|
exit 1
|
185
185
|
end
|
186
186
|
end
|
187
|
+
|
187
188
|
puts "argv #{ARGV}"
|
188
189
|
----------------------------------------------------------------------------
|
189
|
-
|
190
|
-
#eof
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trad-getopt
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- NOZAWA Hiromasa
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-04-
|
11
|
+
date: 2019-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|