rubysl-getoptlong 1.0.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.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.travis.yml +8 -0
- data/Gemfile +4 -0
- data/LICENSE +25 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/lib/getoptlong.rb +1 -0
- data/lib/rubysl/getoptlong.rb +2 -0
- data/lib/rubysl/getoptlong/getoptlong.rb +621 -0
- data/lib/rubysl/getoptlong/version.rb +5 -0
- data/rubysl-getoptlong.gemspec +23 -0
- data/spec/each_option_spec.rb +6 -0
- data/spec/each_spec.rb +6 -0
- data/spec/error_message_spec.rb +31 -0
- data/spec/get_option_spec.rb +6 -0
- data/spec/get_spec.rb +6 -0
- data/spec/initialize_spec.rb +27 -0
- data/spec/ordering_spec.rb +42 -0
- data/spec/set_options_spec.rb +91 -0
- data/spec/shared/each.rb +23 -0
- data/spec/shared/get.rb +75 -0
- data/spec/terminate_spec.rb +34 -0
- data/spec/terminated_spec.rb +20 -0
- metadata +135 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3536cc041a64d512b90faa69b462239d59a7d76c
|
4
|
+
data.tar.gz: 83ff9342026f92d5c9a5fc2ea5af625a1f6fc2b6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a479f266722fef5c6415da317ac4bd1c2dec4eea7c5d5862bf58c370652b1326ff7d613b611ca18f88b8d3321e73548a1a2854018cf322c28bc6257891b8a099
|
7
|
+
data.tar.gz: c6a81a360957af20d366886f6691bcf784164e0aec3f8264c48f7848279b3d74156aa2e8461e982ac5da0f80b02ccce380dc34c1ff0d5210e315fc176c97c2b9
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
Copyright (c) 2013, Brian Shirai
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
1. Redistributions of source code must retain the above copyright notice, this
|
8
|
+
list of conditions and the following disclaimer.
|
9
|
+
2. Redistributions in binary form must reproduce the above copyright notice,
|
10
|
+
this list of conditions and the following disclaimer in the documentation
|
11
|
+
and/or other materials provided with the distribution.
|
12
|
+
3. Neither the name of the library nor the names of its contributors may be
|
13
|
+
used to endorse or promote products derived from this software without
|
14
|
+
specific prior written permission.
|
15
|
+
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
19
|
+
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY DIRECT,
|
20
|
+
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
21
|
+
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
22
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
23
|
+
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
24
|
+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
25
|
+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Rubysl::Getoptlong
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'rubysl-getoptlong'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install rubysl-getoptlong
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
TODO: Write usage instructions here
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/getoptlong.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "rubysl/getoptlong"
|
@@ -0,0 +1,621 @@
|
|
1
|
+
#
|
2
|
+
# GetoptLong for Ruby
|
3
|
+
#
|
4
|
+
# Copyright (C) 1998, 1999, 2000 Motoyuki Kasahara.
|
5
|
+
#
|
6
|
+
# You may redistribute and/or modify this library under the same license
|
7
|
+
# terms as Ruby.
|
8
|
+
#
|
9
|
+
# See GetoptLong for documentation.
|
10
|
+
#
|
11
|
+
# Additional documents and the latest version of `getoptlong.rb' can be
|
12
|
+
# found at http://www.sra.co.jp/people/m-kasahr/ruby/getoptlong/
|
13
|
+
|
14
|
+
# The GetoptLong class allows you to parse command line options similarly to
|
15
|
+
# the GNU getopt_long() C library call. Note, however, that GetoptLong is a
|
16
|
+
# pure Ruby implementation.
|
17
|
+
#
|
18
|
+
# GetoptLong allows for POSIX-style options like <tt>--file</tt> as well
|
19
|
+
# as single letter options like <tt>-f</tt>
|
20
|
+
#
|
21
|
+
# The empty option <tt>--</tt> (two minus symbols) is used to end option
|
22
|
+
# processing. This can be particularly important if options have optional
|
23
|
+
# arguments.
|
24
|
+
#
|
25
|
+
# Here is a simple example of usage:
|
26
|
+
#
|
27
|
+
# # == Synopsis
|
28
|
+
# #
|
29
|
+
# # hello: greets user, demonstrates command line parsing
|
30
|
+
# #
|
31
|
+
# # == Usage
|
32
|
+
# #
|
33
|
+
# # hello [OPTION] ... DIR
|
34
|
+
# #
|
35
|
+
# # -h, --help:
|
36
|
+
# # show help
|
37
|
+
# #
|
38
|
+
# # --repeat x, -n x:
|
39
|
+
# # repeat x times
|
40
|
+
# #
|
41
|
+
# # --name [name]:
|
42
|
+
# # greet user by name, if name not supplied default is John
|
43
|
+
# #
|
44
|
+
# # DIR: The directory in which to issue the greeting.
|
45
|
+
#
|
46
|
+
# require 'getoptlong'
|
47
|
+
# require 'rdoc/usage'
|
48
|
+
#
|
49
|
+
# opts = GetoptLong.new(
|
50
|
+
# [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
|
51
|
+
# [ '--repeat', '-n', GetoptLong::REQUIRED_ARGUMENT ],
|
52
|
+
# [ '--name', GetoptLong::OPTIONAL_ARGUMENT ]
|
53
|
+
# )
|
54
|
+
#
|
55
|
+
# dir = nil
|
56
|
+
# name = nil
|
57
|
+
# repetitions = 1
|
58
|
+
# opts.each do |opt, arg|
|
59
|
+
# case opt
|
60
|
+
# when '--help'
|
61
|
+
# RDoc::usage
|
62
|
+
# when '--repeat'
|
63
|
+
# repetitions = arg.to_i
|
64
|
+
# when '--name'
|
65
|
+
# if arg == ''
|
66
|
+
# name = 'John'
|
67
|
+
# else
|
68
|
+
# name = arg
|
69
|
+
# end
|
70
|
+
# end
|
71
|
+
# end
|
72
|
+
#
|
73
|
+
# if ARGV.length != 1
|
74
|
+
# puts "Missing dir argument (try --help)"
|
75
|
+
# exit 0
|
76
|
+
# end
|
77
|
+
#
|
78
|
+
# dir = ARGV.shift
|
79
|
+
#
|
80
|
+
# Dir.chdir(dir)
|
81
|
+
# for i in (1..repetitions)
|
82
|
+
# print "Hello"
|
83
|
+
# if name
|
84
|
+
# print ", #{name}"
|
85
|
+
# end
|
86
|
+
# puts
|
87
|
+
# end
|
88
|
+
#
|
89
|
+
# Example command line:
|
90
|
+
#
|
91
|
+
# hello -n 6 --name -- /tmp
|
92
|
+
#
|
93
|
+
class GetoptLong
|
94
|
+
#
|
95
|
+
# Orderings.
|
96
|
+
#
|
97
|
+
ORDERINGS = [REQUIRE_ORDER = 0, PERMUTE = 1, RETURN_IN_ORDER = 2]
|
98
|
+
|
99
|
+
#
|
100
|
+
# Argument flags.
|
101
|
+
#
|
102
|
+
ARGUMENT_FLAGS = [NO_ARGUMENT = 0, REQUIRED_ARGUMENT = 1,
|
103
|
+
OPTIONAL_ARGUMENT = 2]
|
104
|
+
|
105
|
+
#
|
106
|
+
# Status codes.
|
107
|
+
#
|
108
|
+
STATUS_YET, STATUS_STARTED, STATUS_TERMINATED = 0, 1, 2
|
109
|
+
|
110
|
+
#
|
111
|
+
# Error types.
|
112
|
+
#
|
113
|
+
class Error < StandardError; end
|
114
|
+
class AmbigousOption < Error; end
|
115
|
+
class NeedlessArgument < Error; end
|
116
|
+
class MissingArgument < Error; end
|
117
|
+
class InvalidOption < Error; end
|
118
|
+
|
119
|
+
#
|
120
|
+
# Set up option processing.
|
121
|
+
#
|
122
|
+
# The options to support are passed to new() as an array of arrays.
|
123
|
+
# Each sub-array contains any number of String option names which carry
|
124
|
+
# the same meaning, and one of the following flags:
|
125
|
+
#
|
126
|
+
# GetoptLong::NO_ARGUMENT :: Option does not take an argument.
|
127
|
+
#
|
128
|
+
# GetoptLong::REQUIRED_ARGUMENT :: Option always takes an argument.
|
129
|
+
#
|
130
|
+
# GetoptLong::OPTIONAL_ARGUMENT :: Option may or may not take an argument.
|
131
|
+
#
|
132
|
+
# The first option name is considered to be the preferred (canonical) name.
|
133
|
+
# Other than that, the elements of each sub-array can be in any order.
|
134
|
+
#
|
135
|
+
def initialize(*arguments)
|
136
|
+
#
|
137
|
+
# Current ordering.
|
138
|
+
#
|
139
|
+
if ENV.include?('POSIXLY_CORRECT')
|
140
|
+
@ordering = REQUIRE_ORDER
|
141
|
+
else
|
142
|
+
@ordering = PERMUTE
|
143
|
+
end
|
144
|
+
|
145
|
+
#
|
146
|
+
# Hash table of option names.
|
147
|
+
# Keys of the table are option names, and their values are canonical
|
148
|
+
# names of the options.
|
149
|
+
#
|
150
|
+
@canonical_names = Hash.new
|
151
|
+
|
152
|
+
#
|
153
|
+
# Hash table of argument flags.
|
154
|
+
# Keys of the table are option names, and their values are argument
|
155
|
+
# flags of the options.
|
156
|
+
#
|
157
|
+
@argument_flags = Hash.new
|
158
|
+
|
159
|
+
#
|
160
|
+
# Whether error messages are output to $deferr.
|
161
|
+
#
|
162
|
+
@quiet = FALSE
|
163
|
+
|
164
|
+
#
|
165
|
+
# Status code.
|
166
|
+
#
|
167
|
+
@status = STATUS_YET
|
168
|
+
|
169
|
+
#
|
170
|
+
# Error code.
|
171
|
+
#
|
172
|
+
@error = nil
|
173
|
+
|
174
|
+
#
|
175
|
+
# Error message.
|
176
|
+
#
|
177
|
+
@error_message = nil
|
178
|
+
|
179
|
+
#
|
180
|
+
# Rest of catenated short options.
|
181
|
+
#
|
182
|
+
@rest_singles = ''
|
183
|
+
|
184
|
+
#
|
185
|
+
# List of non-option-arguments.
|
186
|
+
# Append them to ARGV when option processing is terminated.
|
187
|
+
#
|
188
|
+
@non_option_arguments = Array.new
|
189
|
+
|
190
|
+
if 0 < arguments.length
|
191
|
+
set_options(*arguments)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
#
|
196
|
+
# Set the handling of the ordering of options and arguments.
|
197
|
+
# A RuntimeError is raised if option processing has already started.
|
198
|
+
#
|
199
|
+
# The supplied value must be a member of GetoptLong::ORDERINGS. It alters
|
200
|
+
# the processing of options as follows:
|
201
|
+
#
|
202
|
+
# <b>REQUIRE_ORDER</b> :
|
203
|
+
#
|
204
|
+
# Options are required to occur before non-options.
|
205
|
+
#
|
206
|
+
# Processing of options ends as soon as a word is encountered that has not
|
207
|
+
# been preceded by an appropriate option flag.
|
208
|
+
#
|
209
|
+
# For example, if -a and -b are options which do not take arguments,
|
210
|
+
# parsing command line arguments of '-a one -b two' would result in
|
211
|
+
# 'one', '-b', 'two' being left in ARGV, and only ('-a', '') being
|
212
|
+
# processed as an option/arg pair.
|
213
|
+
#
|
214
|
+
# This is the default ordering, if the environment variable
|
215
|
+
# POSIXLY_CORRECT is set. (This is for compatibility with GNU getopt_long.)
|
216
|
+
#
|
217
|
+
# <b>PERMUTE</b> :
|
218
|
+
#
|
219
|
+
# Options can occur anywhere in the command line parsed. This is the
|
220
|
+
# default behavior.
|
221
|
+
#
|
222
|
+
# Every sequence of words which can be interpreted as an option (with or
|
223
|
+
# without argument) is treated as an option; non-option words are skipped.
|
224
|
+
#
|
225
|
+
# For example, if -a does not require an argument and -b optionally takes
|
226
|
+
# an argument, parsing '-a one -b two three' would result in ('-a','') and
|
227
|
+
# ('-b', 'two') being processed as option/arg pairs, and 'one','three'
|
228
|
+
# being left in ARGV.
|
229
|
+
#
|
230
|
+
# If the ordering is set to PERMUTE but the environment variable
|
231
|
+
# POSIXLY_CORRECT is set, REQUIRE_ORDER is used instead. This is for
|
232
|
+
# compatibility with GNU getopt_long.
|
233
|
+
#
|
234
|
+
# <b>RETURN_IN_ORDER</b> :
|
235
|
+
#
|
236
|
+
# All words on the command line are processed as options. Words not
|
237
|
+
# preceded by a short or long option flag are passed as arguments
|
238
|
+
# with an option of '' (empty string).
|
239
|
+
#
|
240
|
+
# For example, if -a requires an argument but -b does not, a command line
|
241
|
+
# of '-a one -b two three' would result in option/arg pairs of ('-a', 'one')
|
242
|
+
# ('-b', ''), ('', 'two'), ('', 'three') being processed.
|
243
|
+
#
|
244
|
+
def ordering=(ordering)
|
245
|
+
#
|
246
|
+
# The method is failed if option processing has already started.
|
247
|
+
#
|
248
|
+
if @status != STATUS_YET
|
249
|
+
set_error(ArgumentError, "argument error")
|
250
|
+
raise RuntimeError,
|
251
|
+
"invoke ordering=, but option processing has already started"
|
252
|
+
end
|
253
|
+
|
254
|
+
#
|
255
|
+
# Check ordering.
|
256
|
+
#
|
257
|
+
if !ORDERINGS.include?(ordering)
|
258
|
+
raise ArgumentError, "invalid ordering `#{ordering}'"
|
259
|
+
end
|
260
|
+
if ordering == PERMUTE && ENV.include?('POSIXLY_CORRECT')
|
261
|
+
@ordering = REQUIRE_ORDER
|
262
|
+
else
|
263
|
+
@ordering = ordering
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
#
|
268
|
+
# Return ordering.
|
269
|
+
#
|
270
|
+
attr_reader :ordering
|
271
|
+
|
272
|
+
#
|
273
|
+
# Set options. Takes the same argument as GetoptLong.new.
|
274
|
+
#
|
275
|
+
# Raises a RuntimeError if option processing has already started.
|
276
|
+
#
|
277
|
+
def set_options(*arguments)
|
278
|
+
#
|
279
|
+
# The method is failed if option processing has already started.
|
280
|
+
#
|
281
|
+
if @status != STATUS_YET
|
282
|
+
raise RuntimeError,
|
283
|
+
"invoke set_options, but option processing has already started"
|
284
|
+
end
|
285
|
+
|
286
|
+
#
|
287
|
+
# Clear tables of option names and argument flags.
|
288
|
+
#
|
289
|
+
@canonical_names.clear
|
290
|
+
@argument_flags.clear
|
291
|
+
|
292
|
+
arguments.each do |arg|
|
293
|
+
#
|
294
|
+
# Each argument must be an Array.
|
295
|
+
#
|
296
|
+
if !arg.is_a?(Array)
|
297
|
+
raise ArgumentError, "the option list contains non-Array argument"
|
298
|
+
end
|
299
|
+
|
300
|
+
#
|
301
|
+
# Find an argument flag and it set to `argument_flag'.
|
302
|
+
#
|
303
|
+
argument_flag = nil
|
304
|
+
arg.each do |i|
|
305
|
+
if ARGUMENT_FLAGS.include?(i)
|
306
|
+
if argument_flag != nil
|
307
|
+
raise ArgumentError, "too many argument-flags"
|
308
|
+
end
|
309
|
+
argument_flag = i
|
310
|
+
end
|
311
|
+
end
|
312
|
+
raise ArgumentError, "no argument-flag" if argument_flag == nil
|
313
|
+
|
314
|
+
canonical_name = nil
|
315
|
+
arg.each do |i|
|
316
|
+
#
|
317
|
+
# Check an option name.
|
318
|
+
#
|
319
|
+
next if i == argument_flag
|
320
|
+
begin
|
321
|
+
if !i.is_a?(String) || i !~ /^-([^-]|-.+)$/
|
322
|
+
raise ArgumentError, "an invalid option `#{i}'"
|
323
|
+
end
|
324
|
+
if (@canonical_names.include?(i))
|
325
|
+
raise ArgumentError, "option redefined `#{i}'"
|
326
|
+
end
|
327
|
+
rescue
|
328
|
+
@canonical_names.clear
|
329
|
+
@argument_flags.clear
|
330
|
+
raise
|
331
|
+
end
|
332
|
+
|
333
|
+
#
|
334
|
+
# Register the option (`i') to the `@canonical_names' and
|
335
|
+
# `@canonical_names' Hashes.
|
336
|
+
#
|
337
|
+
if canonical_name == nil
|
338
|
+
canonical_name = i
|
339
|
+
end
|
340
|
+
@canonical_names[i] = canonical_name
|
341
|
+
@argument_flags[i] = argument_flag
|
342
|
+
end
|
343
|
+
raise ArgumentError, "no option name" if canonical_name == nil
|
344
|
+
end
|
345
|
+
return self
|
346
|
+
end
|
347
|
+
|
348
|
+
#
|
349
|
+
# Set/Unset `quiet' mode.
|
350
|
+
#
|
351
|
+
attr_writer :quiet
|
352
|
+
|
353
|
+
#
|
354
|
+
# Return the flag of `quiet' mode.
|
355
|
+
#
|
356
|
+
attr_reader :quiet
|
357
|
+
|
358
|
+
#
|
359
|
+
# `quiet?' is an alias of `quiet'.
|
360
|
+
#
|
361
|
+
alias quiet? quiet
|
362
|
+
|
363
|
+
#
|
364
|
+
# Explicitly terminate option processing.
|
365
|
+
#
|
366
|
+
def terminate
|
367
|
+
return nil if @status == STATUS_TERMINATED
|
368
|
+
raise RuntimeError, "an error has occured" if @error != nil
|
369
|
+
|
370
|
+
@status = STATUS_TERMINATED
|
371
|
+
@non_option_arguments.reverse_each do |argument|
|
372
|
+
ARGV.unshift(argument)
|
373
|
+
end
|
374
|
+
|
375
|
+
@canonical_names = nil
|
376
|
+
@argument_flags = nil
|
377
|
+
@rest_singles = nil
|
378
|
+
@non_option_arguments = nil
|
379
|
+
|
380
|
+
return self
|
381
|
+
end
|
382
|
+
|
383
|
+
#
|
384
|
+
# Returns true if option processing has terminated, false otherwise.
|
385
|
+
#
|
386
|
+
def terminated?
|
387
|
+
return @status == STATUS_TERMINATED
|
388
|
+
end
|
389
|
+
|
390
|
+
#
|
391
|
+
# Set an error (protected).
|
392
|
+
#
|
393
|
+
def set_error(type, message)
|
394
|
+
$deferr.print("#{$0}: #{message}\n") if !@quiet
|
395
|
+
|
396
|
+
@error = type
|
397
|
+
@error_message = message
|
398
|
+
@canonical_names = nil
|
399
|
+
@argument_flags = nil
|
400
|
+
@rest_singles = nil
|
401
|
+
@non_option_arguments = nil
|
402
|
+
|
403
|
+
raise type, message
|
404
|
+
end
|
405
|
+
protected :set_error
|
406
|
+
|
407
|
+
#
|
408
|
+
# Examine whether an option processing is failed.
|
409
|
+
#
|
410
|
+
attr_reader :error
|
411
|
+
|
412
|
+
#
|
413
|
+
# `error?' is an alias of `error'.
|
414
|
+
#
|
415
|
+
alias error? error
|
416
|
+
|
417
|
+
# Return the appropriate error message in POSIX-defined format.
|
418
|
+
# If no error has occurred, returns nil.
|
419
|
+
#
|
420
|
+
def error_message
|
421
|
+
return @error_message
|
422
|
+
end
|
423
|
+
|
424
|
+
#
|
425
|
+
# Get next option name and its argument, as an Array of two elements.
|
426
|
+
#
|
427
|
+
# The option name is always converted to the first (preferred)
|
428
|
+
# name given in the original options to GetoptLong.new.
|
429
|
+
#
|
430
|
+
# Example: ['--option', 'value']
|
431
|
+
#
|
432
|
+
# Returns nil if the processing is complete (as determined by
|
433
|
+
# STATUS_TERMINATED).
|
434
|
+
#
|
435
|
+
def get
|
436
|
+
option_name, option_argument = nil, ''
|
437
|
+
|
438
|
+
#
|
439
|
+
# Check status.
|
440
|
+
#
|
441
|
+
return nil if @error != nil
|
442
|
+
case @status
|
443
|
+
when STATUS_YET
|
444
|
+
@status = STATUS_STARTED
|
445
|
+
when STATUS_TERMINATED
|
446
|
+
return nil
|
447
|
+
end
|
448
|
+
|
449
|
+
#
|
450
|
+
# Get next option argument.
|
451
|
+
#
|
452
|
+
if 0 < @rest_singles.length
|
453
|
+
argument = '-' + @rest_singles
|
454
|
+
elsif (ARGV.length == 0)
|
455
|
+
terminate
|
456
|
+
return nil
|
457
|
+
elsif @ordering == PERMUTE
|
458
|
+
while 0 < ARGV.length && ARGV[0] !~ /^-./
|
459
|
+
@non_option_arguments.push(ARGV.shift)
|
460
|
+
end
|
461
|
+
if ARGV.length == 0
|
462
|
+
terminate
|
463
|
+
return nil
|
464
|
+
end
|
465
|
+
argument = ARGV.shift
|
466
|
+
elsif @ordering == REQUIRE_ORDER
|
467
|
+
if (ARGV[0] !~ /^-./)
|
468
|
+
terminate
|
469
|
+
return nil
|
470
|
+
end
|
471
|
+
argument = ARGV.shift
|
472
|
+
else
|
473
|
+
argument = ARGV.shift
|
474
|
+
end
|
475
|
+
|
476
|
+
#
|
477
|
+
# Check the special argument `--'.
|
478
|
+
# `--' indicates the end of the option list.
|
479
|
+
#
|
480
|
+
if argument == '--' && @rest_singles.length == 0
|
481
|
+
terminate
|
482
|
+
return nil
|
483
|
+
end
|
484
|
+
|
485
|
+
#
|
486
|
+
# Check for long and short options.
|
487
|
+
#
|
488
|
+
if argument =~ /^(--[^=]+)/ && @rest_singles.length == 0
|
489
|
+
#
|
490
|
+
# This is a long style option, which start with `--'.
|
491
|
+
#
|
492
|
+
pattern = $1
|
493
|
+
if @canonical_names.include?(pattern)
|
494
|
+
option_name = pattern
|
495
|
+
else
|
496
|
+
#
|
497
|
+
# The option `option_name' is not registered in `@canonical_names'.
|
498
|
+
# It may be an abbreviated.
|
499
|
+
#
|
500
|
+
match_count = 0
|
501
|
+
@canonical_names.each_key do |key|
|
502
|
+
if key.index(pattern) == 0
|
503
|
+
option_name = key
|
504
|
+
match_count += 1
|
505
|
+
end
|
506
|
+
end
|
507
|
+
if 2 <= match_count
|
508
|
+
set_error(AmbigousOption, "option `#{argument}' is ambiguous")
|
509
|
+
elsif match_count == 0
|
510
|
+
set_error(InvalidOption, "unrecognized option `#{argument}'")
|
511
|
+
end
|
512
|
+
end
|
513
|
+
|
514
|
+
#
|
515
|
+
# Check an argument to the option.
|
516
|
+
#
|
517
|
+
if @argument_flags[option_name] == REQUIRED_ARGUMENT
|
518
|
+
if argument =~ /=(.*)$/
|
519
|
+
option_argument = $1
|
520
|
+
elsif 0 < ARGV.length
|
521
|
+
option_argument = ARGV.shift
|
522
|
+
else
|
523
|
+
set_error(MissingArgument,
|
524
|
+
"option `#{argument}' requires an argument")
|
525
|
+
end
|
526
|
+
elsif @argument_flags[option_name] == OPTIONAL_ARGUMENT
|
527
|
+
if argument =~ /=(.*)$/
|
528
|
+
option_argument = $1
|
529
|
+
elsif 0 < ARGV.length && ARGV[0] !~ /^-./
|
530
|
+
option_argument = ARGV.shift
|
531
|
+
else
|
532
|
+
option_argument = ''
|
533
|
+
end
|
534
|
+
elsif argument =~ /=(.*)$/
|
535
|
+
set_error(NeedlessArgument,
|
536
|
+
"option `#{option_name}' doesn't allow an argument")
|
537
|
+
end
|
538
|
+
|
539
|
+
elsif argument =~ /^(-(.))(.*)/
|
540
|
+
#
|
541
|
+
# This is a short style option, which start with `-' (not `--').
|
542
|
+
# Short options may be catenated (e.g. `-l -g' is equivalent to
|
543
|
+
# `-lg').
|
544
|
+
#
|
545
|
+
option_name, ch, @rest_singles = $1, $2, $3
|
546
|
+
|
547
|
+
if @canonical_names.include?(option_name)
|
548
|
+
#
|
549
|
+
# The option `option_name' is found in `@canonical_names'.
|
550
|
+
# Check its argument.
|
551
|
+
#
|
552
|
+
if @argument_flags[option_name] == REQUIRED_ARGUMENT
|
553
|
+
if 0 < @rest_singles.length
|
554
|
+
option_argument = @rest_singles
|
555
|
+
@rest_singles = ''
|
556
|
+
elsif 0 < ARGV.length
|
557
|
+
option_argument = ARGV.shift
|
558
|
+
else
|
559
|
+
# 1003.2 specifies the format of this message.
|
560
|
+
set_error(MissingArgument, "option requires an argument -- #{ch}")
|
561
|
+
end
|
562
|
+
elsif @argument_flags[option_name] == OPTIONAL_ARGUMENT
|
563
|
+
if 0 < @rest_singles.length
|
564
|
+
option_argument = @rest_singles
|
565
|
+
@rest_singles = ''
|
566
|
+
elsif 0 < ARGV.length && ARGV[0] !~ /^-./
|
567
|
+
option_argument = ARGV.shift
|
568
|
+
else
|
569
|
+
option_argument = ''
|
570
|
+
end
|
571
|
+
end
|
572
|
+
else
|
573
|
+
#
|
574
|
+
# This is an invalid option.
|
575
|
+
# 1003.2 specifies the format of this message.
|
576
|
+
#
|
577
|
+
if ENV.include?('POSIXLY_CORRECT')
|
578
|
+
set_error(InvalidOption, "illegal option -- #{ch}")
|
579
|
+
else
|
580
|
+
set_error(InvalidOption, "invalid option -- #{ch}")
|
581
|
+
end
|
582
|
+
end
|
583
|
+
else
|
584
|
+
#
|
585
|
+
# This is a non-option argument.
|
586
|
+
# Only RETURN_IN_ORDER falled into here.
|
587
|
+
#
|
588
|
+
return '', argument
|
589
|
+
end
|
590
|
+
|
591
|
+
return @canonical_names[option_name], option_argument
|
592
|
+
end
|
593
|
+
|
594
|
+
#
|
595
|
+
# `get_option' is an alias of `get'.
|
596
|
+
#
|
597
|
+
alias get_option get
|
598
|
+
|
599
|
+
# Iterator version of `get'.
|
600
|
+
#
|
601
|
+
# The block is called repeatedly with two arguments:
|
602
|
+
# The first is the option name.
|
603
|
+
# The second is the argument which followed it (if any).
|
604
|
+
# Example: ('--opt', 'value')
|
605
|
+
#
|
606
|
+
# The option name is always converted to the first (preferred)
|
607
|
+
# name given in the original options to GetoptLong.new.
|
608
|
+
#
|
609
|
+
def each
|
610
|
+
loop do
|
611
|
+
option_name, option_argument = get_option
|
612
|
+
break if option_name == nil
|
613
|
+
yield option_name, option_argument
|
614
|
+
end
|
615
|
+
end
|
616
|
+
|
617
|
+
#
|
618
|
+
# `each_option' is an alias of `each'.
|
619
|
+
#
|
620
|
+
alias each_option each
|
621
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require './lib/rubysl/getoptlong/version'
|
3
|
+
|
4
|
+
Gem::Specification.new do |spec|
|
5
|
+
spec.name = "rubysl-getoptlong"
|
6
|
+
spec.version = RubySL::GetoptLong::VERSION
|
7
|
+
spec.authors = ["Brian Shirai"]
|
8
|
+
spec.email = ["brixen@gmail.com"]
|
9
|
+
spec.description = %q{Ruby standard library getoptlong.}
|
10
|
+
spec.summary = %q{Ruby standard library getoptlong.}
|
11
|
+
spec.homepage = "https://github.com/rubysl/rubysl-getoptlong"
|
12
|
+
spec.license = "BSD"
|
13
|
+
|
14
|
+
spec.files = `git ls-files`.split($/)
|
15
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
16
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
17
|
+
spec.require_paths = ["lib"]
|
18
|
+
|
19
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
20
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
21
|
+
spec.add_development_dependency "mspec", "~> 1.5"
|
22
|
+
spec.add_development_dependency "rubysl-prettyprint", "~> 1.0"
|
23
|
+
end
|
data/spec/each_spec.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'getoptlong'
|
2
|
+
|
3
|
+
describe "GetoptLong#error_message" do
|
4
|
+
before :each do
|
5
|
+
@stderr = $stderr
|
6
|
+
@argv = ARGV
|
7
|
+
end
|
8
|
+
|
9
|
+
after :each do
|
10
|
+
$stderr = @stderr
|
11
|
+
ARGV = @argv
|
12
|
+
end
|
13
|
+
|
14
|
+
it "returns nil if no error occurred" do
|
15
|
+
opts = GetoptLong.new
|
16
|
+
opts.error_message.should == nil
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns the error message of the last error that occurred" do
|
20
|
+
begin
|
21
|
+
ARGV = []
|
22
|
+
|
23
|
+
opts = GetoptLong.new
|
24
|
+
opts.quiet = true
|
25
|
+
opts.get
|
26
|
+
opts.ordering = GetoptLong::PERMUTE
|
27
|
+
rescue ArgumentError
|
28
|
+
opts.error_message.should == "argument error"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/spec/get_spec.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'getoptlong'
|
2
|
+
|
3
|
+
describe "GetoptLong#initialize" do
|
4
|
+
it "sets ordering to REQUIRE_ORDER if ENV['POSIXLY_CORRECT'] is set" do
|
5
|
+
begin
|
6
|
+
old_env_value = ENV["POSIXLY_CORRECT"]
|
7
|
+
ENV["POSIXLY_CORRECT"] = ""
|
8
|
+
|
9
|
+
opt = GetoptLong.new
|
10
|
+
opt.ordering.should == GetoptLong::REQUIRE_ORDER
|
11
|
+
ensure
|
12
|
+
ENV["POSIXLY_CORRECT"] = old_env_value
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it "sets ordering to PERMUTE if ENV['POSIXLY_CORRECT'] is not set" do
|
17
|
+
begin
|
18
|
+
old_env_value = ENV["POSIXLY_CORRECT"]
|
19
|
+
ENV["POSIXLY_CORRECT"] = nil
|
20
|
+
|
21
|
+
opt = GetoptLong.new
|
22
|
+
opt.ordering.should == GetoptLong::PERMUTE
|
23
|
+
ensure
|
24
|
+
ENV["POSIXLY_CORRECT"] = old_env_value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'getoptlong'
|
2
|
+
|
3
|
+
describe "GetoptLong#ordering=" do
|
4
|
+
it "raises an ArgumentError if called after processing has started" do
|
5
|
+
begin
|
6
|
+
old_argv = ARGV
|
7
|
+
ARGV = [ "--size", "10k", "--verbose" ]
|
8
|
+
|
9
|
+
opts = GetoptLong.new([ '--size', GetoptLong::REQUIRED_ARGUMENT ],
|
10
|
+
[ '--verbose', GetoptLong::NO_ARGUMENT ])
|
11
|
+
opts.quiet = true
|
12
|
+
opts.get
|
13
|
+
|
14
|
+
lambda {
|
15
|
+
opts.ordering = GetoptLong::PERMUTE
|
16
|
+
}.should raise_error(ArgumentError)
|
17
|
+
ensure
|
18
|
+
ARGV = old_argv
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it "raises an ArgumentError if given an invalid value" do
|
23
|
+
opts = GetoptLong.new
|
24
|
+
|
25
|
+
lambda {
|
26
|
+
opts.ordering = 12345
|
27
|
+
}.should raise_error(ArgumentError)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "does not allow changing ordering to PERMUTE if ENV['POSIXLY_CORRECT'] is set" do
|
31
|
+
begin
|
32
|
+
old_env_value = ENV['POSIXLY_CORRECT']
|
33
|
+
ENV['POSIXLY_CORRECT'] = ""
|
34
|
+
|
35
|
+
opts = GetoptLong.new
|
36
|
+
opts.ordering = GetoptLong::PERMUTE
|
37
|
+
opts.ordering.should == GetoptLong::REQUIRE_ORDER
|
38
|
+
ensure
|
39
|
+
ENV['POSIXLY_CORRECT'] = old_env_value
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'getoptlong'
|
2
|
+
|
3
|
+
describe "GetoptLong#set_options" do
|
4
|
+
before :each do
|
5
|
+
@argv = ARGV
|
6
|
+
ARGV = []
|
7
|
+
@opts = GetoptLong.new
|
8
|
+
end
|
9
|
+
|
10
|
+
after :each do
|
11
|
+
ARGV = @argv
|
12
|
+
end
|
13
|
+
|
14
|
+
it "allows setting command line options" do
|
15
|
+
ARGV = ["--size", "10k", "-v", "arg1", "arg2"]
|
16
|
+
|
17
|
+
@opts.set_options(
|
18
|
+
["--size", GetoptLong::REQUIRED_ARGUMENT],
|
19
|
+
["--verbose", "-v", GetoptLong::NO_ARGUMENT]
|
20
|
+
)
|
21
|
+
|
22
|
+
@opts.get.should == ["--size", "10k"]
|
23
|
+
@opts.get.should == ["--verbose", ""]
|
24
|
+
@opts.get.should == nil
|
25
|
+
end
|
26
|
+
|
27
|
+
it "discards previously defined command line options" do
|
28
|
+
ARGV = ["--size", "10k", "-v", "arg1", "arg2"]
|
29
|
+
|
30
|
+
@opts.set_options(
|
31
|
+
["--size", GetoptLong::REQUIRED_ARGUMENT],
|
32
|
+
["--verbose", "-v", GetoptLong::NO_ARGUMENT]
|
33
|
+
)
|
34
|
+
|
35
|
+
@opts.set_options(
|
36
|
+
["-s", "--size", GetoptLong::REQUIRED_ARGUMENT],
|
37
|
+
["-v", GetoptLong::NO_ARGUMENT]
|
38
|
+
)
|
39
|
+
|
40
|
+
@opts.get.should == ["-s", "10k"]
|
41
|
+
@opts.get.should == ["-v", ""]
|
42
|
+
@opts.get.should == nil
|
43
|
+
end
|
44
|
+
|
45
|
+
it "raises an ArgumentError if too many argument flags where given" do
|
46
|
+
lambda {
|
47
|
+
@opts.set_options(["--size", GetoptLong::NO_ARGUMENT, GetoptLong::REQUIRED_ARGUMENT])
|
48
|
+
}.should raise_error(ArgumentError)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "raises a RuntimeError if processing has already started" do
|
52
|
+
@opts.get
|
53
|
+
lambda {
|
54
|
+
@opts.set_options()
|
55
|
+
}.should raise_error(RuntimeError)
|
56
|
+
end
|
57
|
+
|
58
|
+
it "raises an ArgumentError if no argument flag was given" do
|
59
|
+
lambda {
|
60
|
+
@opts.set_options(["--size"])
|
61
|
+
}.should raise_error(ArgumentError)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "raises an ArgumentError if one of the given arguments is not an Array" do
|
65
|
+
lambda {
|
66
|
+
@opts.set_options(
|
67
|
+
["--size", GetoptLong::REQUIRED_ARGUMENT],
|
68
|
+
"test")
|
69
|
+
}.should raise_error(ArgumentError)
|
70
|
+
end
|
71
|
+
|
72
|
+
it "raises an ArgumentError if the same option is given twice" do
|
73
|
+
lambda {
|
74
|
+
@opts.set_options(
|
75
|
+
["--size", GetoptLong::NO_ARGUMENT],
|
76
|
+
["--size", GetoptLong::OPTIONAL_ARGUMENT])
|
77
|
+
}.should raise_error(ArgumentError)
|
78
|
+
|
79
|
+
lambda {
|
80
|
+
@opts.set_options(
|
81
|
+
["--size", GetoptLong::NO_ARGUMENT],
|
82
|
+
["-s", "--size", GetoptLong::OPTIONAL_ARGUMENT])
|
83
|
+
}.should raise_error(ArgumentError)
|
84
|
+
end
|
85
|
+
|
86
|
+
it "raises an ArgumentError if the given option is invalid" do
|
87
|
+
lambda {
|
88
|
+
@opts.set_options(["-size", GetoptLong::NO_ARGUMENT])
|
89
|
+
}.should raise_error(ArgumentError)
|
90
|
+
end
|
91
|
+
end
|
data/spec/shared/each.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
describe :getoptlong_each, :shared => true do
|
2
|
+
before(:each) do
|
3
|
+
@opts = GetoptLong.new(
|
4
|
+
[ '--size', '-s', GetoptLong::REQUIRED_ARGUMENT ],
|
5
|
+
[ '--verbose', '-v', GetoptLong::NO_ARGUMENT ],
|
6
|
+
[ '--query', '-q', GetoptLong::NO_ARGUMENT ],
|
7
|
+
[ '--check', '--valid', '-c', GetoptLong::NO_ARGUMENT ]
|
8
|
+
)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "passes each argument/value pair to the block" do
|
12
|
+
begin
|
13
|
+
old_argv = ARGV
|
14
|
+
ARGV = [ "--size", "10k", "-v", "-q", "a.txt", "b.txt" ]
|
15
|
+
|
16
|
+
pairs = []
|
17
|
+
@opts.send(@method) { |arg, val| pairs << [ arg, val ] }
|
18
|
+
pairs.should == [ [ "--size", "10k" ], [ "--verbose", "" ], [ "--query", ""] ]
|
19
|
+
ensure
|
20
|
+
ARGV = old_argv
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/spec/shared/get.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
describe :getoptlong_get, :shared => true do
|
2
|
+
before(:each) do
|
3
|
+
@opts = GetoptLong.new(
|
4
|
+
[ '--size', '-s', GetoptLong::REQUIRED_ARGUMENT ],
|
5
|
+
[ '--verbose', '-v', GetoptLong::NO_ARGUMENT ],
|
6
|
+
[ '--query', '-q', GetoptLong::NO_ARGUMENT ],
|
7
|
+
[ '--check', '--valid', '-c', GetoptLong::NO_ARGUMENT ]
|
8
|
+
)
|
9
|
+
@opts.quiet = true # silence using $deferr
|
10
|
+
end
|
11
|
+
|
12
|
+
it "returns the next option name and its argument as an Array" do
|
13
|
+
begin
|
14
|
+
old_argv = ARGV
|
15
|
+
ARGV = [ "--size", "10k", "-v", "-q", "a.txt", "b.txt" ]
|
16
|
+
|
17
|
+
@opts.send(@method).should == [ "--size", "10k" ]
|
18
|
+
@opts.send(@method).should == [ "--verbose", "" ]
|
19
|
+
@opts.send(@method).should == [ "--query", ""]
|
20
|
+
@opts.send(@method).should == nil
|
21
|
+
ensure
|
22
|
+
ARGV = old_argv
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "shifts ARGV on each call" do
|
27
|
+
begin
|
28
|
+
old_argv = ARGV
|
29
|
+
ARGV = [ "--size", "10k", "-v", "-q", "a.txt", "b.txt" ]
|
30
|
+
|
31
|
+
@opts.send(@method)
|
32
|
+
ARGV.should == [ "-v", "-q", "a.txt", "b.txt" ]
|
33
|
+
|
34
|
+
@opts.send(@method)
|
35
|
+
ARGV.should == [ "-q", "a.txt", "b.txt" ]
|
36
|
+
|
37
|
+
@opts.send(@method)
|
38
|
+
ARGV.should == [ "a.txt", "b.txt" ]
|
39
|
+
|
40
|
+
@opts.send(@method)
|
41
|
+
ARGV.should == [ "a.txt", "b.txt" ]
|
42
|
+
ensure
|
43
|
+
ARGV = old_argv
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it "terminates processing when encountering '--'" do
|
48
|
+
begin
|
49
|
+
old_argv = ARGV
|
50
|
+
ARGV = [ "--size", "10k", "--", "-v", "-q", "a.txt", "b.txt" ]
|
51
|
+
|
52
|
+
@opts.send(@method)
|
53
|
+
ARGV.should == ["--", "-v", "-q", "a.txt", "b.txt"]
|
54
|
+
|
55
|
+
@opts.send(@method)
|
56
|
+
ARGV.should == ["-v", "-q", "a.txt", "b.txt"]
|
57
|
+
|
58
|
+
@opts.send(@method)
|
59
|
+
ARGV.should == ["-v", "-q", "a.txt", "b.txt"]
|
60
|
+
ensure
|
61
|
+
ARGV = old_argv
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
it "raises a if an argument was required, but none given" do
|
66
|
+
begin
|
67
|
+
old_argv = ARGV
|
68
|
+
ARGV = [ "--size" ]
|
69
|
+
|
70
|
+
lambda { @opts.send(@method) }.should raise_error(GetoptLong::MissingArgument)
|
71
|
+
ensure
|
72
|
+
ARGV = old_argv
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'getoptlong'
|
2
|
+
|
3
|
+
describe "GetoptLong#terminate" do
|
4
|
+
before(:each) do
|
5
|
+
@opts = GetoptLong.new(
|
6
|
+
[ '--size', '-s', GetoptLong::REQUIRED_ARGUMENT ],
|
7
|
+
[ '--verbose', '-v', GetoptLong::NO_ARGUMENT ],
|
8
|
+
[ '--query', '-q', GetoptLong::NO_ARGUMENT ],
|
9
|
+
[ '--check', '--valid', '-c', GetoptLong::NO_ARGUMENT ]
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "terminates option proccessing" do
|
14
|
+
begin
|
15
|
+
old_argv = ARGV
|
16
|
+
ARGV = [ "--size", "10k", "-v", "-q", "a.txt", "b.txt" ]
|
17
|
+
|
18
|
+
@opts.get.should == [ "--size", "10k" ]
|
19
|
+
@opts.terminate
|
20
|
+
@opts.get.should == nil
|
21
|
+
ensure
|
22
|
+
ARGV = old_argv
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "returns self when option processsing is terminated" do
|
27
|
+
@opts.terminate.should == @opts
|
28
|
+
end
|
29
|
+
|
30
|
+
it "returns nil when option processing was already terminated" do
|
31
|
+
@opts.terminate
|
32
|
+
@opts.terminate.should == nil
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'getoptlong'
|
2
|
+
|
3
|
+
describe "GetoptLong#terminated?" do
|
4
|
+
it "returns true if option processing has terminated" do
|
5
|
+
begin
|
6
|
+
old_argv_value = ARGV
|
7
|
+
ARGV = [ "--size", "10k" ]
|
8
|
+
opts = GetoptLong.new(["--size", GetoptLong::REQUIRED_ARGUMENT])
|
9
|
+
opts.terminated?.should == false
|
10
|
+
|
11
|
+
opts.get.should == ["--size", "10k"]
|
12
|
+
opts.terminated?.should == false
|
13
|
+
|
14
|
+
opts.get.should == nil
|
15
|
+
opts.terminated?.should == true
|
16
|
+
ensure
|
17
|
+
ARGV = old_argv_value
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rubysl-getoptlong
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Brian Shirai
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-12-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: mspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.5'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.5'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rubysl-prettyprint
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.0'
|
69
|
+
description: Ruby standard library getoptlong.
|
70
|
+
email:
|
71
|
+
- brixen@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- .gitignore
|
77
|
+
- .travis.yml
|
78
|
+
- Gemfile
|
79
|
+
- LICENSE
|
80
|
+
- README.md
|
81
|
+
- Rakefile
|
82
|
+
- lib/getoptlong.rb
|
83
|
+
- lib/rubysl/getoptlong.rb
|
84
|
+
- lib/rubysl/getoptlong/getoptlong.rb
|
85
|
+
- lib/rubysl/getoptlong/version.rb
|
86
|
+
- rubysl-getoptlong.gemspec
|
87
|
+
- spec/each_option_spec.rb
|
88
|
+
- spec/each_spec.rb
|
89
|
+
- spec/error_message_spec.rb
|
90
|
+
- spec/get_option_spec.rb
|
91
|
+
- spec/get_spec.rb
|
92
|
+
- spec/initialize_spec.rb
|
93
|
+
- spec/ordering_spec.rb
|
94
|
+
- spec/set_options_spec.rb
|
95
|
+
- spec/shared/each.rb
|
96
|
+
- spec/shared/get.rb
|
97
|
+
- spec/terminate_spec.rb
|
98
|
+
- spec/terminated_spec.rb
|
99
|
+
homepage: https://github.com/rubysl/rubysl-getoptlong
|
100
|
+
licenses:
|
101
|
+
- BSD
|
102
|
+
metadata: {}
|
103
|
+
post_install_message:
|
104
|
+
rdoc_options: []
|
105
|
+
require_paths:
|
106
|
+
- lib
|
107
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - '>='
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
requirements: []
|
118
|
+
rubyforge_project:
|
119
|
+
rubygems_version: 2.0.7
|
120
|
+
signing_key:
|
121
|
+
specification_version: 4
|
122
|
+
summary: Ruby standard library getoptlong.
|
123
|
+
test_files:
|
124
|
+
- spec/each_option_spec.rb
|
125
|
+
- spec/each_spec.rb
|
126
|
+
- spec/error_message_spec.rb
|
127
|
+
- spec/get_option_spec.rb
|
128
|
+
- spec/get_spec.rb
|
129
|
+
- spec/initialize_spec.rb
|
130
|
+
- spec/ordering_spec.rb
|
131
|
+
- spec/set_options_spec.rb
|
132
|
+
- spec/shared/each.rb
|
133
|
+
- spec/shared/get.rb
|
134
|
+
- spec/terminate_spec.rb
|
135
|
+
- spec/terminated_spec.rb
|