slop 4.7.0 → 4.9.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 125a7e982b88caf3675166359579515c0af86540002d463042c336c45de8f310
4
- data.tar.gz: a0518f68ab2a02cb7cdcdc18fbf0fb9134eac55dc903b1486fa569e66b15a18a
3
+ metadata.gz: c7b0c61e7c1636499757933c40267cb03c8762eeddc928ed49859de31eae21ab
4
+ data.tar.gz: a3dcbf06cb7af2ab4edac0664de185553781a59137fdf8602986ef92cb86d3a9
5
5
  SHA512:
6
- metadata.gz: 463bd12f9ab37a1f27ebca2bdb98954d69f3160bb64d6b8d813a319f66bde91f07c9002ebfd5267277fbbe87bfb20dc50faa0b74e7478ffe3e1acad049dd765e
7
- data.tar.gz: 0c5fa72e533dbdf3ff4bfc1f1f5c7c0944aa4e8f1afc41b41ffe7b8c29807be11b111d5f2c218a3f68034dc65243ea527cad4f0a27af56a5fefddce6e20550ba
6
+ metadata.gz: a4a7a0c057d34ef83972cf56ccda260af5b349adc0c91922898cee4d2b7841d6e5bc8a31b1a83477a2b0404853de053250a34de2e27a4a8d07657bd157faa703
7
+ data.tar.gz: 96d2291b6b6504aceb7485f79ae3f035fdfa3b8a0aa8a7c84fb41e620b30f6ff5e8903b6c1c57e00cd855ea1fe1c54fac0629fde8a56cde5c816927637d4fa20
data/.travis.yml CHANGED
@@ -13,12 +13,17 @@ rvm:
13
13
  - 2.1
14
14
  - 2.2
15
15
  - 2.3.4
16
- - 2.4.1
17
- - 2.5.3
18
- - 2.6.0
19
- - jruby-9.2.5.0
16
+ - 2.4.10
17
+ - 2.5.9
18
+ - 2.6.7
19
+ - 2.7.3
20
+ - 3.0.1
21
+ - jruby-9.2.17.0
20
22
  - jruby-head
21
23
  - ruby-head
24
+ - truffleruby-head
25
+ jdk:
26
+ - openjdk8
22
27
  notifications:
23
28
  email:
24
29
  on_success: change
data/CHANGELOG.md CHANGED
@@ -1,12 +1,56 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ v4.9.1 (2021-05-28)
5
+ -------------------
6
+
7
+ Bug fixes:
8
+ * Fixed a bug where `flag=arg` syntax would raise an error when an
9
+ empty value was passed. [#266](https://github.com/leejarvis/slop/issues/266)
10
+
11
+ v4.9.0 (2021-05-11)
12
+ -------------------
13
+
14
+ Features:
15
+ * Add SymbolOption [#263](https://github.com/leejarvis/slop/pull/263)
16
+
17
+ Bug fixes:
18
+ * Use `+=` over `<<` to handle frozen string literals. [255](https://github.com/leejarvis/slop/pull/255)
19
+
20
+ v4.8.2 (2020-07-10)
21
+ -------------------
22
+
23
+ Bug fixes:
24
+ * Fix bug where separator position was messed up if using `help: false`
25
+ [#253](https://github.com/leejarvis/slop/issues/253)
26
+
27
+ v4.8.1 (2020-03-31)
28
+ -------------------
29
+
30
+ Bug fixes:
31
+ * Fix keyword argument warning. [#251](https://github.com/leejarvis/slop/pull/251)
32
+
33
+
34
+ v4.8.0 (2020-01-17)
35
+ -------------------
36
+
37
+ Features:
38
+ * Add support for prefixing integer values with `+` character
39
+ [#243](https://github.com/leejarvis/slop/pull/243) (Juha Ylitalo)
40
+ * Add support for parsing floats with scientific notation
41
+ [#250](https://github.com/leejarvis/slop/pull/250) (Hansuk Hong)
42
+
43
+ Maintenance:
44
+ * Add 2.7.0 to CI and fix warnings
45
+ [#248](https://github.com/leejarvis/slop/pull/248) (Juha Ylitalo, Andrew Kane)
46
+
4
47
  v4.7.0 (2019-06-29)
5
48
  -------------------
6
49
 
7
50
  Features:
8
51
  * 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))
9
52
  * 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))
53
+
10
54
  Bug fixes
11
55
  * Ensure non-string option types have their flags consumed properly [#241] (Sutou Kouhei)
12
56
 
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
  [![Build Status](https://travis-ci.org/leejarvis/slop.svg?branch=master)](http://travis-ci.org/leejarvis/slop)
10
7
 
11
8
  Installation
@@ -21,6 +18,7 @@ opts = Slop.parse do |o|
21
18
  o.string '-h', '--host', 'a hostname'
22
19
  o.integer '--port', 'custom port', default: 80
23
20
  o.string '-l', '--login', required: true
21
+ o.symbol '-m', '--method', default: :get
24
22
  o.bool '-v', '--verbose', 'enable verbose mode'
25
23
  o.bool '-q', '--quiet', 'suppress output (quiet mode)'
26
24
  o.bool '-c', '--check-ssl-certificate', 'check SSL certificate for host'
@@ -30,15 +28,16 @@ opts = Slop.parse do |o|
30
28
  end
31
29
  end
32
30
 
33
- ARGV #=> -v --login alice --host 192.168.0.1 --check-ssl-certificate
31
+ ARGV #=> -v --login alice --host 192.168.0.1 -m post --check-ssl-certificate
34
32
 
35
33
  opts[:host] #=> 192.168.0.1
36
34
  opts[:login] #=> alice
35
+ opts[:method] #=> :post
37
36
  opts.verbose? #=> true
38
37
  opts.quiet? #=> false
39
38
  opts.check_ssl_certificate? #=> true
40
39
 
41
- opts.to_hash #=> { host: "192.168.0.1", login: "alice", port: 80, verbose: true, quiet: false, check_ssl_certificate: true }
40
+ opts.to_hash #=> { host: "192.168.0.1", port: 80, login: "alice", method: :post, verbose: true, quiet: false, check_ssl_certificate: true }
42
41
  ```
43
42
 
44
43
  Note that the block we've added to the `--version` flag will be executed
@@ -59,6 +58,7 @@ o.integer #=> Slop::IntegerOption, expects an argument, aliased to IntOption
59
58
  o.float #=> Slop::FloatOption, expects an argument
60
59
  o.array #=> Slop::ArrayOption, expects an argument
61
60
  o.regexp #=> Slop::RegexpOption, expects an argument
61
+ o.symbol #=> Slop::SymbolOption, expects an argument
62
62
  o.null #=> Slop::NullOption, no argument and ignored from `to_hash`
63
63
  o.on #=> alias for o.null
64
64
  ```
@@ -135,9 +135,11 @@ opts = Slop.parse do |o|
135
135
  o.array '--files', 'a list of files', delimiter: ','
136
136
  end
137
137
 
138
- # both of these will return o[:files] as ["foo.txt", "bar.rb"]:
138
+ # Both of these will return o[:files] as ["foo.txt", "bar.rb"]:
139
139
  # --files foo.txt,bar.rb
140
140
  # --files foo.txt --files bar.rb
141
+ # This will return o[:files] as []:
142
+ # --files ""
141
143
  ```
142
144
 
143
145
  If you want to disable the built-in string-splitting, set the delimiter to
@@ -275,87 +277,4 @@ end
275
277
  Commands
276
278
  --------
277
279
 
278
- As of version 4, Slop does not have built in support for git-style subcommands.
279
- You can use version 3 of Slop (see `v3` branch).
280
-
281
- Upgrading from version 3
282
- ------------------------
283
-
284
- Slop v4 is not backwards compatible. The code has been completely rewritten.
285
- If you're already using version 3 you *have* to update your code to use version 4.
286
- Here's an overview of the large changes:
287
-
288
- #### No more `instance_eval`
289
-
290
- Before:
291
-
292
- ```ruby
293
- Slop.parse do
294
- on 'v', 'version' do
295
- puts VERSION
296
- end
297
- end
298
- ```
299
-
300
- After:
301
-
302
- ```ruby
303
- Slop.parse do |o|
304
- o.on '-v', '--version' do
305
- puts VERSION
306
- end
307
- end
308
- ```
309
-
310
- #### No more `as` for option types
311
-
312
- Instead, the type is declared in the method call. Before:
313
-
314
- ```ruby
315
- on 'port=', as: Integer
316
- ```
317
-
318
- After:
319
-
320
- ```ruby
321
- o.int '--port' # or integer
322
- ```
323
-
324
- See the custom types section of the document.
325
-
326
- #### No more trailing `=`
327
-
328
- Instead, the "does this option expect an argument?" question is answered by
329
- the option type (i.e `on` and `bool` options do not expect arguments, all
330
- others do). They handle type conversion, too.
331
-
332
- #### Hyphens are required
333
-
334
- This was a hard decision to make, but you must provide prefixed hyphens when
335
- declaring your flags. This improves the implementation nicer and makes things
336
- much less ambiguous, which leads to less error prone code. It also means you
337
- can easily support single hyphen prefix for a long flag, i.e `-hostname` which
338
- you could not do before. It also means you can provide infinite flag aliases:
339
- `o.string '-f', '-x', '--foo', '--bar', 'this is insane'`
340
-
341
- #### Strict is now on by default
342
-
343
- v3 had a `strict` option. v4 has no such option. To suppress errors you can
344
- instead provide the `suppress_errors: true` option to Slop.
345
-
346
- #### No more parse!
347
-
348
- Where v3 has both `Slop.parse` and `Slop.parse!`, v4 only has `parse`. The
349
- former was used to decide whether Slop should or should not mutate the
350
- original args (usually ARGV). This is almost never what you want, and it
351
- can lead to confusion. Instead, `Slop::Result` provides an `arguments`
352
- methods:
353
-
354
- ```ruby
355
- opts = Slop.parse do |o|
356
- o.string '--hostname', '...'
357
- end
358
-
359
- # ARGV is "hello --hostname foo bar"
360
- p opts.arguments #=> ["hello", "bar"]
361
- ```
280
+ 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.7.0'
9
+ VERSION = '4.9.1'
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/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, @config)
32
+ @parser = Parser.new(self, **@config)
33
33
 
34
34
  yield self if block_given?
35
35
  end
@@ -52,7 +52,7 @@ 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
@@ -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,17 +102,17 @@ module Slop
102
102
  str = config[:banner] ? "#{banner}\n" : ""
103
103
  len = longest_flag_length
104
104
 
105
- options.select(&:help?).each_with_index.sort_by{ |o,i| [o.tail, i] }.each do |opt, i|
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
- str << "#{sep}\n"
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]
115
- str << "#{sep}\n"
115
+ str += "#{sep}\n"
116
116
  end
117
117
 
118
118
  str
data/lib/slop/parser.rb CHANGED
@@ -52,8 +52,7 @@ module Slop
52
52
 
53
53
  # support `foo=bar`
54
54
  orig_flag = flag.dup
55
- orig_arg = arg
56
- if match = flag.match(/([^=]+)=([^=]+)/)
55
+ if match = flag.match(/([^=]+)=([^=]*)/)
57
56
  flag, arg = match.captures
58
57
  end
59
58
 
data/lib/slop/types.rb CHANGED
@@ -6,6 +6,13 @@ module Slop
6
6
  end
7
7
  end
8
8
 
9
+ # Cast the option argument to a symbol.
10
+ class SymbolOption < Option
11
+ def call(value)
12
+ value.to_sym
13
+ end
14
+ end
15
+
9
16
  # Cast the option argument to true or false.
10
17
  # Override default_value to default to false instead of nil.
11
18
  # This option type does not expect an argument. However, the API
@@ -44,16 +51,17 @@ module Slop
44
51
  # Cast the option argument to an Integer.
45
52
  class IntegerOption < Option
46
53
  def call(value)
47
- value =~ /\A-?\d+\z/ && value.to_i
54
+ value =~ /\A[+-]?\d+\z/ && value.to_i
48
55
  end
49
56
  end
50
57
  IntOption = IntegerOption
51
58
 
52
59
  # Cast the option argument to a Float.
53
60
  class FloatOption < Option
61
+ FLOAT_STRING_REGEXP = /\A[+-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+-]?\d+)?\z/.freeze
62
+
54
63
  def call(value)
55
- # TODO: scientific notation, etc.
56
- value =~ /\A-?\d*\.*\d+\z/ && value.to_f
64
+ value =~ FLOAT_STRING_REGEXP && value.to_f
57
65
  end
58
66
  end
59
67
 
data/test/option_test.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  require 'test_helper'
2
2
 
3
3
  describe Slop::Option do
4
- def option(*args)
5
- Slop::Option.new(*args)
4
+ def option(*args, **kwargs, &block)
5
+ Slop::Option.new(*args, **kwargs, &block)
6
6
  end
7
7
 
8
8
  describe "#flag" do
data/test/options_test.rb CHANGED
@@ -70,6 +70,17 @@ describe Slop::Options do
70
70
 
71
71
  assert_equal [""], @options.separators
72
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
73
84
  end
74
85
 
75
86
  describe "#method_missing" do
@@ -121,11 +132,11 @@ describe Slop::Options do
121
132
 
122
133
  describe "custom banner" do
123
134
  it "is prefixed with defined banner" do
124
- @options_config = Slop::Options.new({banner: "custom banner"})
135
+ @options_config = Slop::Options.new(**{banner: "custom banner"})
125
136
  assert_match(/^custom banner/, @options_config.to_s)
126
137
  end
127
138
  it "banner is disabled" do
128
- @options_config = Slop::Options.new({banner: false})
139
+ @options_config = Slop::Options.new(**{banner: false})
129
140
  assert_match("", @options_config.to_s)
130
141
  end
131
142
  end
data/test/parser_test.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'test_helper'
2
+ require 'shellwords'
2
3
 
3
4
  describe Slop::Parser do
4
5
  before do
@@ -28,6 +29,15 @@ describe Slop::Parser do
28
29
  assert_equal %w(=), @result.args
29
30
  end
30
31
 
32
+ it "parses flag=''" do
33
+ @options.string "--str"
34
+ @options.array "--arr", default: ["array"]
35
+ @result.parser.parse %(--str="" --arr="").shellsplit
36
+
37
+ assert_equal "", @result[:str]
38
+ assert_equal [], @result[:arr]
39
+ end
40
+
31
41
  it "parses arg with leading -" do
32
42
  @options.string "-t", "--text"
33
43
  @result.parser.parse %w(--name=bob --text --sometext)
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
@@ -1,5 +1,33 @@
1
1
  require 'test_helper'
2
2
 
3
+ describe Slop::StringOption do
4
+ before do
5
+ @options = Slop::Options.new
6
+ @age = @options.string "--name"
7
+ @minus = @options.string "--zipcode"
8
+ @result = @options.parse %w(--name Foo --zipcode 12345)
9
+ end
10
+
11
+ it "returns the value as a string" do
12
+ assert_equal "Foo", @result[:name]
13
+ assert_equal "12345", @result[:zipcode]
14
+ end
15
+ end
16
+
17
+ describe Slop::SymbolOption do
18
+ before do
19
+ @options = Slop::Options.new
20
+ @age = @options.symbol "--name"
21
+ @minus = @options.symbol "--zipcode"
22
+ @result = @options.parse %w(--name Foo --zipcode 12345)
23
+ end
24
+
25
+ it "returns the value as a symbol" do
26
+ assert_equal :Foo, @result[:name]
27
+ assert_equal :'12345', @result[:zipcode]
28
+ end
29
+ end
30
+
3
31
  describe Slop::BoolOption do
4
32
  before do
5
33
  @options = Slop::Options.new
@@ -32,11 +60,15 @@ describe Slop::IntegerOption do
32
60
  before do
33
61
  @options = Slop::Options.new
34
62
  @age = @options.integer "--age"
35
- @result = @options.parse %w(--age 20)
63
+ @minus = @options.integer "--minus"
64
+ @plus = @options.integer "--plus"
65
+ @result = @options.parse %w(--age 20 --minus -10 --plus +30)
36
66
  end
37
67
 
38
68
  it "returns the value as an integer" do
39
69
  assert_equal 20, @result[:age]
70
+ assert_equal (-10), @result[:minus]
71
+ assert_equal 30, @result[:plus]
40
72
  end
41
73
 
42
74
  it "returns nil for non-numbers by default" do
@@ -50,11 +82,37 @@ describe Slop::FloatOption do
50
82
  @options = Slop::Options.new
51
83
  @apr = @options.float "--apr"
52
84
  @apr_value = 2.9
53
- @result = @options.parse %W(--apr #{@apr_value})
85
+ @minus = @options.float "--minus"
86
+ @plus = @options.float "--plus"
87
+ @scientific_notation = @options.float "--scientific-notation"
88
+ @scientific_notation_value = 4e21
89
+ @result = @options.parse %W(--apr #{@apr_value} --minus -6.1 --plus +9.4 --scientific-notation #{@scientific_notation_value})
54
90
  end
55
91
 
56
92
  it "returns the value as a float" do
57
93
  assert_equal @apr_value, @result[:apr]
94
+ assert_equal (-6.1), @result[:minus]
95
+ assert_equal 9.4, @result[:plus]
96
+ end
97
+
98
+ it "parses scientific notations" do
99
+ assert_equal @scientific_notation_value, @result[:scientific_notation]
100
+
101
+ @scientific_notation_value = 4E21
102
+ @result = @options.parse %W(--scientific-notation #{@scientific_notation_value})
103
+ assert_equal @scientific_notation_value, @result[:scientific_notation]
104
+
105
+ @scientific_notation_value = 4.0e21
106
+ @result = @options.parse %W(--scientific-notation #{@scientific_notation_value})
107
+ assert_equal @scientific_notation_value, @result[:scientific_notation]
108
+
109
+ @scientific_notation_value = -4e21
110
+ @result = @options.parse %W(--scientific-notation #{@scientific_notation_value})
111
+ assert_equal @scientific_notation_value, @result[:scientific_notation]
112
+
113
+ @scientific_notation_value = 4e-21
114
+ @result = @options.parse %W(--scientific-notation #{@scientific_notation_value})
115
+ assert_equal @scientific_notation_value, @result[:scientific_notation]
58
116
  end
59
117
 
60
118
  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.7.0
4
+ version: 4.9.1
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: 2019-06-29 00:00:00.000000000 Z
11
+ date: 2021-05-28 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
- rubyforge_project:
90
- rubygems_version: 2.7.6
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: