slop 4.6.1 → 4.8.2
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 +5 -5
- data/.travis.yml +15 -3
- data/CHANGELOG.md +67 -23
- data/README.md +1 -89
- data/lib/slop.rb +2 -2
- data/lib/slop/error.rb +3 -2
- data/lib/slop/options.rb +7 -7
- data/lib/slop/parser.rb +10 -4
- data/lib/slop/result.rb +21 -7
- data/lib/slop/types.rb +4 -3
- data/test/option_test.rb +2 -2
- data/test/options_test.rb +19 -2
- data/test/parser_test.rb +11 -0
- data/test/result_test.rb +25 -0
- data/test/slop_test.rb +10 -0
- data/test/types_test.rb +32 -2
- metadata +6 -7
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: b79c8ecabc4f59e446e17b38a61381a4711e1da44918d5bfa3c459e3330fa7c5
|
|
4
|
+
data.tar.gz: 6a5c4c2b6a0624a0f533ea86bc7855774a23d134d581f178d2d6fa476b01da59
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 15ac86c2fe54c3c5dffb8d186e50341febfa6ed858eedae5347a416fc9261159262d68873645c7bb11d1cc2155473f6deb3a8740da2c4fcc1a78f0f477cccfc8
|
|
7
|
+
data.tar.gz: d1a078ebc9c8ddd2b970e9cc39dcf72fc20b3e67a50abed4bf51a7d22bafe8ae7170c03930bf8d3073f487d167f6f27fe1475b5e5735b4bf2090efa446a0eff5
|
data/.travis.yml
CHANGED
|
@@ -1,15 +1,27 @@
|
|
|
1
1
|
cache: bundler
|
|
2
2
|
before_install:
|
|
3
|
-
-
|
|
3
|
+
- |
|
|
4
|
+
export RVM_CURRENT=`rvm current|cut -c6-8`
|
|
5
|
+
if [ "${RVM_CURRENT}" = "2.0" ] || \
|
|
6
|
+
[ "${RVM_CURRENT}" = "2.1" ] || \
|
|
7
|
+
[ "${RVM_CURRENT}" = "2.2" ]; then
|
|
8
|
+
gem install bundler -v '< 2'
|
|
9
|
+
fi
|
|
10
|
+
|
|
4
11
|
rvm:
|
|
5
12
|
- 2.0.0
|
|
6
13
|
- 2.1
|
|
7
14
|
- 2.2
|
|
8
15
|
- 2.3.4
|
|
9
|
-
- 2.4.
|
|
10
|
-
-
|
|
16
|
+
- 2.4.9
|
|
17
|
+
- 2.5.7
|
|
18
|
+
- 2.6.5
|
|
19
|
+
- 2.7.0
|
|
20
|
+
- jruby-9.2.9.0
|
|
11
21
|
- jruby-head
|
|
12
22
|
- ruby-head
|
|
23
|
+
jdk:
|
|
24
|
+
- openjdk8
|
|
13
25
|
notifications:
|
|
14
26
|
email:
|
|
15
27
|
on_success: change
|
data/CHANGELOG.md
CHANGED
|
@@ -1,26 +1,70 @@
|
|
|
1
1
|
Changelog
|
|
2
2
|
=========
|
|
3
3
|
|
|
4
|
+
v4.8.2 (2020-07-10)
|
|
5
|
+
-------------------
|
|
6
|
+
|
|
7
|
+
Bug fixes:
|
|
8
|
+
* Fix bug where separator position was messed up if using `help: false`
|
|
9
|
+
[#253](https://github.com/leejarvis/slop/issues/253)
|
|
10
|
+
|
|
11
|
+
v4.8.1 (2020-03-31)
|
|
12
|
+
-------------------
|
|
13
|
+
|
|
14
|
+
Bug fixes:
|
|
15
|
+
* Fix keyword argument warning. [#251](https://github.com/leejarvis/slop/pull/251)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
v4.8.0 (2020-01-17)
|
|
19
|
+
-------------------
|
|
20
|
+
|
|
21
|
+
Features:
|
|
22
|
+
* Add support for prefixing integer values with `+` character
|
|
23
|
+
[#243](https://github.com/leejarvis/slop/pull/243) (Juha Ylitalo)
|
|
24
|
+
* Add support for parsing floats with scientific notation
|
|
25
|
+
[#250](https://github.com/leejarvis/slop/pull/250) (Hansuk Hong)
|
|
26
|
+
|
|
27
|
+
Maintenance:
|
|
28
|
+
* Add 2.7.0 to CI and fix warnings
|
|
29
|
+
[#248](https://github.com/leejarvis/slop/pull/248) (Juha Ylitalo, Andrew Kane)
|
|
30
|
+
|
|
31
|
+
v4.7.0 (2019-06-29)
|
|
32
|
+
-------------------
|
|
33
|
+
|
|
34
|
+
Features:
|
|
35
|
+
* Add `Slop::Result#fetch`. It returns the value of given option, or raises an error if given option is not present. [#232](https://github.com/leejarvis/slop/pull/232) ([Giovanni Benussi](https://github.com/giovannibenussi))
|
|
36
|
+
* Adding a separator without passing any arguments now creates a separator with the empty string. [#238](https://github.com/leejarvis/slop/pull/238) ([Teemu Matilainen](https://github.com/tmatilai))
|
|
37
|
+
|
|
38
|
+
Bug fixes
|
|
39
|
+
* Ensure non-string option types have their flags consumed properly [#241] (Sutou Kouhei)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
v4.6.2 (2018-03-12)
|
|
43
|
+
-------------------
|
|
44
|
+
|
|
45
|
+
Bug fixes/Enhancements
|
|
46
|
+
* Fix equals character (=) being parsed incorrectly in some cases. [#226](https://github.com/leejarvis/slop/issues/226)
|
|
47
|
+
|
|
4
48
|
v4.6.1 (2017-11-20)
|
|
5
49
|
-------------------
|
|
6
50
|
|
|
7
51
|
Bug fixes/Enhancements
|
|
8
|
-
* Fix separator so it doesn't mutate user data. #223 (Marc-André Lafortune)
|
|
52
|
+
* Fix separator so it doesn't mutate user data. [#223](https://github.com/leejarvis/slop/issues/223) (Marc-André Lafortune)
|
|
9
53
|
* Add additional tests for `Options#separator` and fix issue where
|
|
10
|
-
the last separator was ignored. #222
|
|
54
|
+
the last separator was ignored. [#222](https://github.com/leejarvis/slop/issues/222)
|
|
11
55
|
|
|
12
56
|
v4.6.0 (2017-10-06)
|
|
13
57
|
-------------------
|
|
14
58
|
|
|
15
59
|
Features
|
|
16
|
-
* Add support for required options. #218 (William Woodruff)
|
|
60
|
+
* Add support for required options. [#218](https://github.com/leejarvis/slop/issues/218) (William Woodruff)
|
|
17
61
|
|
|
18
62
|
v4.5.0 (2017-05-22)
|
|
19
63
|
-------------------
|
|
20
64
|
|
|
21
65
|
Features:
|
|
22
66
|
* Added config option to avoid translating flags-with-dashes into
|
|
23
|
-
underscores. #206 (@lbriais)
|
|
67
|
+
underscores. [#206](https://github.com/leejarvis/slop/issues/206) (@lbriais)
|
|
24
68
|
|
|
25
69
|
v4.4.3 (2017-05-02)
|
|
26
70
|
-------------------
|
|
@@ -32,73 +76,73 @@ v4.4.2 (2017-04-29)
|
|
|
32
76
|
-------------------
|
|
33
77
|
|
|
34
78
|
Bug fixes:
|
|
35
|
-
* Fix support for parsing -x5 or -nfoo. #199
|
|
36
|
-
* Fix removing arguments after `--`. #194
|
|
79
|
+
* Fix support for parsing -x5 or -nfoo. [#199](https://github.com/leejarvis/slop/issues/199)
|
|
80
|
+
* Fix removing arguments after `--`. [#194](https://github.com/leejarvis/slop/issues/194)
|
|
37
81
|
|
|
38
82
|
v4.4.1 (2016-08-21)
|
|
39
83
|
-------------------
|
|
40
84
|
|
|
41
85
|
Bug fixes:
|
|
42
|
-
* Handle bad constant names in `Slop.option_defined?`. #198
|
|
86
|
+
* Handle bad constant names in `Slop.option_defined?`. [#198](https://github.com/leejarvis/slop/issues/198)
|
|
43
87
|
(Ellen Marie Dash)
|
|
44
88
|
|
|
45
89
|
v4.4.0 (2016-08-15)
|
|
46
90
|
-------------------
|
|
47
91
|
|
|
48
92
|
Features
|
|
49
|
-
* Support parsing arguments prefixed with dashes. #192 (Andrew Clemons)
|
|
93
|
+
* Support parsing arguments prefixed with dashes. [#192](https://github.com/leejarvis/slop/issues/192) (Andrew Clemons)
|
|
50
94
|
|
|
51
95
|
Bug fixes:
|
|
52
|
-
* Retain sort order inside tail sort. #193 (Caio Chassot)
|
|
96
|
+
* Retain sort order inside tail sort. [#193](https://github.com/leejarvis/slop/issues/193) (Caio Chassot)
|
|
53
97
|
|
|
54
98
|
v4.3.0 (2016-03-19)
|
|
55
99
|
-------------------
|
|
56
100
|
|
|
57
101
|
Features
|
|
58
|
-
* Allow disabling array delimiter. #189 (Mike Pastore)
|
|
59
|
-
* Allow passing custom banner as config. #191 (Philip Rees)
|
|
102
|
+
* Allow disabling array delimiter. [#189](https://github.com/leejarvis/slop/issues/189) (Mike Pastore)
|
|
103
|
+
* Allow passing custom banner as config. [#191](https://github.com/leejarvis/slop/issues/191) (Philip Rees)
|
|
60
104
|
|
|
61
105
|
v4.2.1 (2015-11-25)
|
|
62
106
|
-------------------
|
|
63
107
|
|
|
64
108
|
Features:
|
|
65
|
-
* Better handling of option names with multiple words. #169 (Tim Rogers)
|
|
109
|
+
* Better handling of option names with multiple words. [#169](https://github.com/leejarvis/slop/issues/169) (Tim Rogers)
|
|
66
110
|
|
|
67
111
|
Minor enhancements:
|
|
68
|
-
* add ARGF notes to Arguments (README). #173 (Rick Hull)
|
|
112
|
+
* add ARGF notes to Arguments (README). [#173](https://github.com/leejarvis/slop/issues/173) (Rick Hull)
|
|
69
113
|
|
|
70
114
|
Bug fixes:
|
|
71
|
-
* Fix arguments removed with option arguments. #182 (Naoki Mizuno)
|
|
115
|
+
* Fix arguments removed with option arguments. [#182](https://github.com/leejarvis/slop/issues/182) (Naoki Mizuno)
|
|
72
116
|
* Fix bug where true is passed to BoolOption block regardless
|
|
73
|
-
of --no- prefix. #184 (Ben Brady)
|
|
74
|
-
* only raise MissingArgument if not `default_value`. #163 (Ben Brady)
|
|
117
|
+
of --no- prefix. [#184](https://github.com/leejarvis/slop/issues/184) (Ben Brady)
|
|
118
|
+
* only raise MissingArgument if not `default_value`. [#163](https://github.com/leejarvis/slop/issues/163) (Ben Brady)
|
|
75
119
|
|
|
76
120
|
v4.2.0 (2015-04-18)
|
|
77
121
|
-------------------
|
|
78
122
|
|
|
79
123
|
Features:
|
|
80
|
-
* Support for Regexp option type #167 (Laurent Arnoud)
|
|
124
|
+
* Support for Regexp option type [#167](https://github.com/leejarvis/slop/issues/167) (Laurent Arnoud)
|
|
81
125
|
* Support prefixed `--no-` for explicitly setting boolean options
|
|
82
|
-
to `false` #168
|
|
83
|
-
* Better handling of flags with multiple words #169 (Tim Rogers)
|
|
126
|
+
to `false` [#168](https://github.com/leejarvis/slop/issues/168)
|
|
127
|
+
* Better handling of flags with multiple words [#169](https://github.com/leejarvis/slop/issues/169) (Tim Rogers)
|
|
84
128
|
|
|
85
129
|
v4.1.0 (2015-04-18)
|
|
86
130
|
-------------------
|
|
87
131
|
|
|
88
132
|
Features:
|
|
89
|
-
* Support for FloatOption #156 (Rick Hull)
|
|
133
|
+
* Support for FloatOption [#156](https://github.com/leejarvis/slop/issues/156) (Rick Hull)
|
|
90
134
|
* Support for `limit` config to ArrayOption.
|
|
91
135
|
* Support for `tail` config to add options to the bottom of
|
|
92
136
|
the help text.
|
|
93
|
-
* Add explicit setter (#[]=) to Result class. #162
|
|
137
|
+
* Add explicit setter (#[]=) to Result class. [#162](https://github.com/leejarvis/slop/issues/162)
|
|
94
138
|
* Implement flag gettings for UnknownOption and MissingArgument
|
|
95
|
-
error classes. #165 (sigurdsvela)
|
|
139
|
+
error classes. [#165](https://github.com/leejarvis/slop/issues/165) (sigurdsvela)
|
|
96
140
|
|
|
97
141
|
Minor enhancements:
|
|
98
142
|
* Reset parser every time `parse` is called.
|
|
99
143
|
|
|
100
144
|
Bug fixes:
|
|
101
|
-
* Remove "--" from unprocessed arguments #157 (David Rodríguez).
|
|
145
|
+
* Remove "--" from unprocessed arguments [#157](https://github.com/leejarvis/slop/issues/157) (David Rodríguez).
|
|
102
146
|
|
|
103
147
|
v4.0.0 (2014-12-27)
|
|
104
148
|
-------------------
|
data/README.md
CHANGED
|
@@ -3,9 +3,6 @@ Slop
|
|
|
3
3
|
|
|
4
4
|
Slop is a simple option parser with an easy to remember syntax and friendly API.
|
|
5
5
|
|
|
6
|
-
Version 4 of Slop is aimed at Ruby 2.0 or later. Please use
|
|
7
|
-
[Version 3](https://github.com/leejarvis/slop/tree/v3) for Ruby 1.9 support.
|
|
8
|
-
|
|
9
6
|
[](http://travis-ci.org/leejarvis/slop)
|
|
10
7
|
|
|
11
8
|
Installation
|
|
@@ -275,89 +272,4 @@ end
|
|
|
275
272
|
Commands
|
|
276
273
|
--------
|
|
277
274
|
|
|
278
|
-
|
|
279
|
-
You can use version 3 of Slop (see `v3` branch). I also expect there to be some
|
|
280
|
-
external libraries released soon that wrap around Slop to provide support for
|
|
281
|
-
this feature. I'll update this document when that happens.
|
|
282
|
-
|
|
283
|
-
Upgrading from version 3
|
|
284
|
-
------------------------
|
|
285
|
-
|
|
286
|
-
Slop v4 is completely non-backwards compatible. The code has been rewritten
|
|
287
|
-
from the ground up. If you're already using version 3 you *have* to update
|
|
288
|
-
your code to use version 4. Here's an overview of the more fundamental changes:
|
|
289
|
-
|
|
290
|
-
#### No more `instance_eval`
|
|
291
|
-
|
|
292
|
-
Before:
|
|
293
|
-
|
|
294
|
-
```ruby
|
|
295
|
-
Slop.parse do
|
|
296
|
-
on 'v', 'version' do
|
|
297
|
-
puts VERSION
|
|
298
|
-
end
|
|
299
|
-
end
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
After:
|
|
303
|
-
|
|
304
|
-
```ruby
|
|
305
|
-
Slop.parse do |o|
|
|
306
|
-
o.on '-v', '--version' do
|
|
307
|
-
puts VERSION
|
|
308
|
-
end
|
|
309
|
-
end
|
|
310
|
-
```
|
|
311
|
-
|
|
312
|
-
#### No more `as` for option types
|
|
313
|
-
|
|
314
|
-
Instead, the type is declared in the method call. Before:
|
|
315
|
-
|
|
316
|
-
```ruby
|
|
317
|
-
on 'port=', as: Integer
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
After:
|
|
321
|
-
|
|
322
|
-
```ruby
|
|
323
|
-
o.int '--port' # or integer
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
See the custom types section of the document.
|
|
327
|
-
|
|
328
|
-
#### No more trailing `=`
|
|
329
|
-
|
|
330
|
-
Instead, the "does this option expect an argument" question is answered by
|
|
331
|
-
the option type (i.e `on` and `bool` options do not expect arguments, all
|
|
332
|
-
others do. They handle type conversion, too.
|
|
333
|
-
|
|
334
|
-
#### Hyphens are required
|
|
335
|
-
|
|
336
|
-
This was a hard decision to make, but you must provide prefixed hyphens when
|
|
337
|
-
declaring your flags. This makes the underlying code much nicer and much less
|
|
338
|
-
ambiguous, which leads to less error prone code. It also means you can easily
|
|
339
|
-
support single hyphen prefix for a long flag, i.e `-hostname` which you
|
|
340
|
-
could not do before. It also provides a hidden feature, which is infinity flag
|
|
341
|
-
aliases: `o.string '-f', '-x', '--foo', '--bar', 'this is insane'`
|
|
342
|
-
|
|
343
|
-
#### Strict is now on by default
|
|
344
|
-
|
|
345
|
-
v3 had a `strict` option. v4 has no such option, and to suppress errors you can
|
|
346
|
-
instead provide the `suppress_errors: true` option to Slop.
|
|
347
|
-
|
|
348
|
-
#### No more parse!
|
|
349
|
-
|
|
350
|
-
Where v3 has both `Slop.parse` and `Slop.parse!`, v4 only has `parse`. The
|
|
351
|
-
former was used to decide whether Slop should or should not mutate the
|
|
352
|
-
original args (usually ARGV). This is almost never what you want, and it
|
|
353
|
-
can lead to confusion. Instead, `Slop::Result` provides an `arguments`
|
|
354
|
-
methods:
|
|
355
|
-
|
|
356
|
-
```ruby
|
|
357
|
-
opts = Slop.parse do |o|
|
|
358
|
-
o.string '--hostname', '...'
|
|
359
|
-
end
|
|
360
|
-
|
|
361
|
-
# ARGV is "hello --hostname foo bar"
|
|
362
|
-
p opts.arguments #=> ["hello", "bar"]
|
|
363
|
-
```
|
|
275
|
+
Slop not longer has built in support for git-style subcommands.
|
data/lib/slop.rb
CHANGED
|
@@ -6,7 +6,7 @@ require 'slop/types'
|
|
|
6
6
|
require 'slop/error'
|
|
7
7
|
|
|
8
8
|
module Slop
|
|
9
|
-
VERSION = '4.
|
|
9
|
+
VERSION = '4.8.2'
|
|
10
10
|
|
|
11
11
|
# Parse an array of options (defaults to ARGV). Accepts an
|
|
12
12
|
# optional hash of configuration options and block.
|
|
@@ -20,7 +20,7 @@ module Slop
|
|
|
20
20
|
#
|
|
21
21
|
# Returns a Slop::Result.
|
|
22
22
|
def self.parse(items = ARGV, **config, &block)
|
|
23
|
-
Options.new(config, &block).parse(items)
|
|
23
|
+
Options.new(**config, &block).parse(items)
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
# Example:
|
data/lib/slop/error.rb
CHANGED
|
@@ -22,8 +22,9 @@ module Slop
|
|
|
22
22
|
end
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
-
# Raised when an unknown option is parsed
|
|
26
|
-
#
|
|
25
|
+
# Raised when an unknown option is parsed or when trying to fetch an
|
|
26
|
+
# unexisting option via `Slop::Result#fetch`.
|
|
27
|
+
# Suppress with the `suppress_errors` config option.
|
|
27
28
|
class UnknownOption < Error
|
|
28
29
|
attr_reader :flag
|
|
29
30
|
|
data/lib/slop/options.rb
CHANGED
|
@@ -24,12 +24,12 @@ module Slop
|
|
|
24
24
|
# The String banner prefixed to the help string.
|
|
25
25
|
attr_accessor :banner
|
|
26
26
|
|
|
27
|
-
def initialize(**config)
|
|
27
|
+
def initialize(**config, &block)
|
|
28
28
|
@options = []
|
|
29
29
|
@separators = []
|
|
30
30
|
@banner = config[:banner].is_a?(String) ? config[:banner] : config.fetch(:banner, "usage: #{$0} [options]")
|
|
31
31
|
@config = DEFAULT_CONFIG.merge(config)
|
|
32
|
-
@parser = Parser.new(self,
|
|
32
|
+
@parser = Parser.new(self, **@config)
|
|
33
33
|
|
|
34
34
|
yield self if block_given?
|
|
35
35
|
end
|
|
@@ -52,14 +52,14 @@ module Slop
|
|
|
52
52
|
desc = flags.pop unless flags.last.start_with?('-')
|
|
53
53
|
config = self.config.merge(config)
|
|
54
54
|
klass = Slop.string_to_option_class(config[:type].to_s)
|
|
55
|
-
option = klass.new(flags, desc, config, &block)
|
|
55
|
+
option = klass.new(flags, desc, **config, &block)
|
|
56
56
|
|
|
57
57
|
add_option option
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
# Add a separator between options. Used when displaying
|
|
61
61
|
# the help text.
|
|
62
|
-
def separator(string)
|
|
62
|
+
def separator(string = "")
|
|
63
63
|
if separators[options.size]
|
|
64
64
|
separators[-1] += "\n#{string}"
|
|
65
65
|
else
|
|
@@ -82,7 +82,7 @@ module Slop
|
|
|
82
82
|
def method_missing(name, *args, **config, &block)
|
|
83
83
|
if respond_to_missing?(name)
|
|
84
84
|
config[:type] = name
|
|
85
|
-
on(*args, config, &block)
|
|
85
|
+
on(*args, **config, &block)
|
|
86
86
|
else
|
|
87
87
|
super
|
|
88
88
|
end
|
|
@@ -102,13 +102,13 @@ module Slop
|
|
|
102
102
|
str = config[:banner] ? "#{banner}\n" : ""
|
|
103
103
|
len = longest_flag_length
|
|
104
104
|
|
|
105
|
-
options.select
|
|
105
|
+
options.select.each_with_index.sort_by{ |o,i| [o.tail, i] }.each do |opt, i|
|
|
106
106
|
# use the index to fetch an associated separator
|
|
107
107
|
if sep = separators[i]
|
|
108
108
|
str << "#{sep}\n"
|
|
109
109
|
end
|
|
110
110
|
|
|
111
|
-
str << "#{prefix}#{opt.to_s(offset: len)}\n"
|
|
111
|
+
str << "#{prefix}#{opt.to_s(offset: len)}\n" if opt.help?
|
|
112
112
|
end
|
|
113
113
|
|
|
114
114
|
if sep = separators[options.size]
|
data/lib/slop/parser.rb
CHANGED
|
@@ -52,9 +52,8 @@ module Slop
|
|
|
52
52
|
|
|
53
53
|
# support `foo=bar`
|
|
54
54
|
orig_flag = flag.dup
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
flag, arg = flag.split("=")
|
|
55
|
+
if match = flag.match(/([^=]+)=([^=]+)/)
|
|
56
|
+
flag, arg = match.captures
|
|
58
57
|
end
|
|
59
58
|
|
|
60
59
|
if opt = try_process(flag, arg)
|
|
@@ -64,7 +63,7 @@ module Slop
|
|
|
64
63
|
if opt.expects_argument?
|
|
65
64
|
|
|
66
65
|
# if we consumed the argument, remove the next pair
|
|
67
|
-
if
|
|
66
|
+
if consume_next_argument?(orig_flag)
|
|
68
67
|
pairs.delete_at(idx + 1)
|
|
69
68
|
end
|
|
70
69
|
|
|
@@ -106,6 +105,13 @@ module Slop
|
|
|
106
105
|
|
|
107
106
|
private
|
|
108
107
|
|
|
108
|
+
def consume_next_argument?(flag)
|
|
109
|
+
return false if flag.include?("=")
|
|
110
|
+
return true if flag.start_with?("--")
|
|
111
|
+
return true if /\A-[a-zA-Z]\z/ === flag
|
|
112
|
+
false
|
|
113
|
+
end
|
|
114
|
+
|
|
109
115
|
# We've found an option, process and return it
|
|
110
116
|
def process(option, arg)
|
|
111
117
|
option.ensure_call(arg)
|
data/lib/slop/result.rb
CHANGED
|
@@ -14,12 +14,23 @@ module Slop
|
|
|
14
14
|
@options = parser.options
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
# Returns an
|
|
17
|
+
# Returns an option's value, nil if the option does not exist.
|
|
18
18
|
def [](flag)
|
|
19
19
|
(o = option(flag)) && o.value
|
|
20
20
|
end
|
|
21
21
|
alias get []
|
|
22
22
|
|
|
23
|
+
# Returns an option's value, raises UnknownOption if the option does not exist.
|
|
24
|
+
def fetch(flag)
|
|
25
|
+
o = option(flag)
|
|
26
|
+
if o.nil?
|
|
27
|
+
cleaned_key = clean_key(flag)
|
|
28
|
+
raise UnknownOption.new("option not found: '#{cleaned_key}'", "#{cleaned_key}")
|
|
29
|
+
else
|
|
30
|
+
o.value
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
23
34
|
# Set the value for an option. Raises an ArgumentError if the option
|
|
24
35
|
# does not exist.
|
|
25
36
|
def []=(flag, value)
|
|
@@ -33,13 +44,8 @@ module Slop
|
|
|
33
44
|
|
|
34
45
|
# Returns an Option if it exists. Ignores any prefixed hyphens.
|
|
35
46
|
def option(flag)
|
|
36
|
-
cleaned = -> (f) do
|
|
37
|
-
key = f.to_s.sub(/\A--?/, '')
|
|
38
|
-
key = key.tr '-', '_' if parser.config[:underscore_flags]
|
|
39
|
-
key.to_sym
|
|
40
|
-
end
|
|
41
47
|
options.find do |o|
|
|
42
|
-
o.flags.any? { |f|
|
|
48
|
+
o.flags.any? { |f| clean_key(f) == clean_key(flag) }
|
|
43
49
|
end
|
|
44
50
|
end
|
|
45
51
|
|
|
@@ -90,5 +96,13 @@ module Slop
|
|
|
90
96
|
def to_s(**opts)
|
|
91
97
|
options.to_s(**opts)
|
|
92
98
|
end
|
|
99
|
+
|
|
100
|
+
private
|
|
101
|
+
|
|
102
|
+
def clean_key(key)
|
|
103
|
+
key = key.to_s.sub(/\A--?/, '')
|
|
104
|
+
key = key.tr '-', '_' if parser.config[:underscore_flags]
|
|
105
|
+
key.to_sym
|
|
106
|
+
end
|
|
93
107
|
end
|
|
94
108
|
end
|
data/lib/slop/types.rb
CHANGED
|
@@ -44,16 +44,17 @@ module Slop
|
|
|
44
44
|
# Cast the option argument to an Integer.
|
|
45
45
|
class IntegerOption < Option
|
|
46
46
|
def call(value)
|
|
47
|
-
value =~ /\A
|
|
47
|
+
value =~ /\A[+-]?\d+\z/ && value.to_i
|
|
48
48
|
end
|
|
49
49
|
end
|
|
50
50
|
IntOption = IntegerOption
|
|
51
51
|
|
|
52
52
|
# Cast the option argument to a Float.
|
|
53
53
|
class FloatOption < Option
|
|
54
|
+
FLOAT_STRING_REGEXP = /\A[+-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+-]?\d+)?\z/.freeze
|
|
55
|
+
|
|
54
56
|
def call(value)
|
|
55
|
-
|
|
56
|
-
value =~ /\A-?\d*\.*\d+\z/ && value.to_f
|
|
57
|
+
value =~ FLOAT_STRING_REGEXP && value.to_f
|
|
57
58
|
end
|
|
58
59
|
end
|
|
59
60
|
|
data/test/option_test.rb
CHANGED
data/test/options_test.rb
CHANGED
|
@@ -64,6 +64,23 @@ describe Slop::Options do
|
|
|
64
64
|
@options.separator("foo".freeze)
|
|
65
65
|
@options.separator("bar".freeze)
|
|
66
66
|
end
|
|
67
|
+
|
|
68
|
+
it "defaults to empty string" do
|
|
69
|
+
@options.separator
|
|
70
|
+
|
|
71
|
+
assert_equal [""], @options.separators
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "correctly handles options with `help: false`" do
|
|
75
|
+
@options.boolean "--opt1"
|
|
76
|
+
@options.boolean "--opt2", help: false
|
|
77
|
+
@options.separator "other options"
|
|
78
|
+
@options.boolean "--opt3", help: false
|
|
79
|
+
@options.boolean "--opt4"
|
|
80
|
+
|
|
81
|
+
_usage, help = @options.to_s.squeeze(" ").split("\n", 2)
|
|
82
|
+
assert_equal "--opt1 \nother options\n --opt4", help.strip
|
|
83
|
+
end
|
|
67
84
|
end
|
|
68
85
|
|
|
69
86
|
describe "#method_missing" do
|
|
@@ -115,11 +132,11 @@ describe Slop::Options do
|
|
|
115
132
|
|
|
116
133
|
describe "custom banner" do
|
|
117
134
|
it "is prefixed with defined banner" do
|
|
118
|
-
@options_config = Slop::Options.new({banner: "custom banner"})
|
|
135
|
+
@options_config = Slop::Options.new(**{banner: "custom banner"})
|
|
119
136
|
assert_match(/^custom banner/, @options_config.to_s)
|
|
120
137
|
end
|
|
121
138
|
it "banner is disabled" do
|
|
122
|
-
@options_config = Slop::Options.new({banner: false})
|
|
139
|
+
@options_config = Slop::Options.new(**{banner: false})
|
|
123
140
|
assert_match("", @options_config.to_s)
|
|
124
141
|
end
|
|
125
142
|
end
|
data/test/parser_test.rb
CHANGED
|
@@ -21,6 +21,11 @@ describe Slop::Parser do
|
|
|
21
21
|
@result.parser.parse %w(--name=bob -p=123)
|
|
22
22
|
assert_equal "bob", @result[:name]
|
|
23
23
|
assert_equal 123, @result[:port]
|
|
24
|
+
|
|
25
|
+
@options.string "--foo"
|
|
26
|
+
@result.parser.parse %w(--foo = =)
|
|
27
|
+
assert_equal "=", @result[:foo]
|
|
28
|
+
assert_equal %w(=), @result.args
|
|
24
29
|
end
|
|
25
30
|
|
|
26
31
|
it "parses arg with leading -" do
|
|
@@ -30,6 +35,12 @@ describe Slop::Parser do
|
|
|
30
35
|
assert_equal "--sometext", @result[:text]
|
|
31
36
|
end
|
|
32
37
|
|
|
38
|
+
it "parses regexp arg with leading -" do
|
|
39
|
+
@options.regexp "--pattern"
|
|
40
|
+
@result.parser.parse %w(--pattern -x)
|
|
41
|
+
assert_equal(/-x/, @result[:pattern])
|
|
42
|
+
end
|
|
43
|
+
|
|
33
44
|
it "parses negative integer" do
|
|
34
45
|
@options.integer "-p", "--port"
|
|
35
46
|
@result.parser.parse %w(--name=bob --port -123)
|
data/test/result_test.rb
CHANGED
|
@@ -62,6 +62,31 @@ describe Slop::Result do
|
|
|
62
62
|
end
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
+
describe "#fetch" do
|
|
66
|
+
it "returns an options value" do
|
|
67
|
+
assert_equal "lee", @result.fetch("--name")
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "raises Slop::UnknownOption when an option does not exists" do
|
|
71
|
+
e = assert_raises(Slop::UnknownOption) { @result.fetch("--unexisting") }
|
|
72
|
+
assert_equal "option not found: 'unexisting'", e.message
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "returns the default value of an option when a value is not provided" do
|
|
76
|
+
@options.string("--foo", default: "bar")
|
|
77
|
+
@result.parser.parse %w(--foo)
|
|
78
|
+
|
|
79
|
+
assert_equal 'bar', @result.fetch('foo')
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "returns nil when an option is not provided and it does not have a default value" do
|
|
83
|
+
@options.string("--hello")
|
|
84
|
+
@result.parser.parse %w()
|
|
85
|
+
|
|
86
|
+
assert_nil @result.fetch('hello')
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
65
90
|
describe "#[]=" do
|
|
66
91
|
it "sets an options value" do
|
|
67
92
|
assert_equal "lee", @result["name"]
|
data/test/slop_test.rb
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
require "test_helper"
|
|
2
2
|
|
|
3
3
|
describe Slop do
|
|
4
|
+
describe ".parse" do
|
|
5
|
+
it "parses a list of arguments" do
|
|
6
|
+
result = Slop.parse(%w[--name Lee]) do |o|
|
|
7
|
+
o.string "--name"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
assert_equal "Lee", result[:name]
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
4
14
|
describe ".option_defined?" do
|
|
5
15
|
it "handles bad constant names" do
|
|
6
16
|
assert_equal false, Slop.option_defined?("Foo?Bar")
|
data/test/types_test.rb
CHANGED
|
@@ -32,11 +32,15 @@ describe Slop::IntegerOption do
|
|
|
32
32
|
before do
|
|
33
33
|
@options = Slop::Options.new
|
|
34
34
|
@age = @options.integer "--age"
|
|
35
|
-
@
|
|
35
|
+
@minus = @options.integer "--minus"
|
|
36
|
+
@plus = @options.integer "--plus"
|
|
37
|
+
@result = @options.parse %w(--age 20 --minus -10 --plus +30)
|
|
36
38
|
end
|
|
37
39
|
|
|
38
40
|
it "returns the value as an integer" do
|
|
39
41
|
assert_equal 20, @result[:age]
|
|
42
|
+
assert_equal (-10), @result[:minus]
|
|
43
|
+
assert_equal 30, @result[:plus]
|
|
40
44
|
end
|
|
41
45
|
|
|
42
46
|
it "returns nil for non-numbers by default" do
|
|
@@ -50,11 +54,37 @@ describe Slop::FloatOption do
|
|
|
50
54
|
@options = Slop::Options.new
|
|
51
55
|
@apr = @options.float "--apr"
|
|
52
56
|
@apr_value = 2.9
|
|
53
|
-
@
|
|
57
|
+
@minus = @options.float "--minus"
|
|
58
|
+
@plus = @options.float "--plus"
|
|
59
|
+
@scientific_notation = @options.float "--scientific-notation"
|
|
60
|
+
@scientific_notation_value = 4e21
|
|
61
|
+
@result = @options.parse %W(--apr #{@apr_value} --minus -6.1 --plus +9.4 --scientific-notation #{@scientific_notation_value})
|
|
54
62
|
end
|
|
55
63
|
|
|
56
64
|
it "returns the value as a float" do
|
|
57
65
|
assert_equal @apr_value, @result[:apr]
|
|
66
|
+
assert_equal (-6.1), @result[:minus]
|
|
67
|
+
assert_equal 9.4, @result[:plus]
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "parses scientific notations" do
|
|
71
|
+
assert_equal @scientific_notation_value, @result[:scientific_notation]
|
|
72
|
+
|
|
73
|
+
@scientific_notation_value = 4E21
|
|
74
|
+
@result = @options.parse %W(--scientific-notation #{@scientific_notation_value})
|
|
75
|
+
assert_equal @scientific_notation_value, @result[:scientific_notation]
|
|
76
|
+
|
|
77
|
+
@scientific_notation_value = 4.0e21
|
|
78
|
+
@result = @options.parse %W(--scientific-notation #{@scientific_notation_value})
|
|
79
|
+
assert_equal @scientific_notation_value, @result[:scientific_notation]
|
|
80
|
+
|
|
81
|
+
@scientific_notation_value = -4e21
|
|
82
|
+
@result = @options.parse %W(--scientific-notation #{@scientific_notation_value})
|
|
83
|
+
assert_equal @scientific_notation_value, @result[:scientific_notation]
|
|
84
|
+
|
|
85
|
+
@scientific_notation_value = 4e-21
|
|
86
|
+
@result = @options.parse %W(--scientific-notation #{@scientific_notation_value})
|
|
87
|
+
assert_equal @scientific_notation_value, @result[:scientific_notation]
|
|
58
88
|
end
|
|
59
89
|
|
|
60
90
|
it "returns nil for non-numbers by default" do
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: slop
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 4.
|
|
4
|
+
version: 4.8.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Lee Jarvis
|
|
8
|
-
autorequire:
|
|
8
|
+
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2020-07-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rake
|
|
@@ -71,7 +71,7 @@ homepage: http://github.com/leejarvis/slop
|
|
|
71
71
|
licenses:
|
|
72
72
|
- MIT
|
|
73
73
|
metadata: {}
|
|
74
|
-
post_install_message:
|
|
74
|
+
post_install_message:
|
|
75
75
|
rdoc_options: []
|
|
76
76
|
require_paths:
|
|
77
77
|
- lib
|
|
@@ -86,9 +86,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
86
86
|
- !ruby/object:Gem::Version
|
|
87
87
|
version: '0'
|
|
88
88
|
requirements: []
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
signing_key:
|
|
89
|
+
rubygems_version: 3.0.3
|
|
90
|
+
signing_key:
|
|
92
91
|
specification_version: 4
|
|
93
92
|
summary: Simple Lightweight Option Parsing
|
|
94
93
|
test_files:
|