optparse2 0.1.0 → 0.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b65c3cbdeee5a8be4421cfb6690664c5a717493b21d27c7e2772796bbfc07c31
4
- data.tar.gz: 2635447e0c1d6aeb4b64d1d5cd85aa3f722f5d73d67a8d111983e6f1f230d2e6
3
+ metadata.gz: 8ebc811121dac1e1a1ec4b27bf450c6c833be7a8f3150b33763cf86c1d484085
4
+ data.tar.gz: af30923283a06f3afe06bd5ca00511cdcb84c5a4d447f6fc0969e3af706ff54b
5
5
  SHA512:
6
- metadata.gz: 93e0b546543a5cd14e0c013c8f36031f1661ed8c5bed77eebf8b833533245fb1dbd4ced50ec9b56167a89fe4f0ab16096172a01b3e8723bc6b7766a0ddf5a6c8
7
- data.tar.gz: 9c2d74d86790e248f1a2fb660155b9514f36efd4edc8dd17eff4491dd2d184e246c51fbc0e8ce6ecab112c5bc13aa252dca74c823aebd1bc0638655f2b6b3832
6
+ metadata.gz: 9f528769762d80c6d9fa4b30d586731cd7942d10f48e74c740d310c0762986ea8eb0185827d95ed56b10b4c9647b69ba1f3e61f4e4fb40e1439c7685f0e0f6ea
7
+ data.tar.gz: 2382be786decac4021966efb54aa030786f3e0be3fe18a6d7058dfdb8f7f3434573c341a6cc5e25a6e9b8e34bdb6a1d8f0cf686705b773511a60e8fdb41fb9d7
data/README.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # OptParse2
2
2
 
3
+ example:
4
+
5
+ ```ruby
6
+ OptParse2.new do |op|
7
+ op.on('-d', '--debug', hidden: true) do |dbg|
8
+ puts "debug = #{dbg}"
9
+ end
10
+
11
+ op.on('-b', '--branch=STRING')
12
+ op.on('-m', '--master', key: :branch) { :master }
13
+
14
+ puts op.help
15
+ op.parse! %w[-d --branch=foo --master], into: h={}
16
+ p h
17
+ end
18
+ ```
19
+
20
+
21
+
3
22
  TODO: Delete this and the text below, and describe your gem
4
23
 
5
24
  Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/optparse2`. To experiment with that code, run `bin/console` for an interactive prompt.
@@ -0,0 +1,19 @@
1
+ class OptParse2
2
+ # Provide support for passing keyword arguments into `make_switch`
3
+ def define(*opts, **, &block) top.append(*(sw = make_switch(opts, block, **))); sw[0] end
4
+ alias def_option define
5
+ def on(...) define(...); self end
6
+
7
+ def define_head(*opts, **, &block) top.prepend(*(sw = make_switch(opts, block, **))); sw[0] end
8
+ alias def_head_option define_head
9
+ def on_head(...) define_head(...); self end
10
+
11
+ def define_head(*opts, **, &block) base.append(*(sw = make_switch(opts, block, **))); sw[0] end
12
+ alias def_tail_option define_tail
13
+ def on_tail(...) define_tail(...); self end
14
+
15
+ def initialize(*)
16
+ @defaults = {}
17
+ super
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OptParse2::Globals
4
+ def self.[]=(key, value)
5
+ key = key.to_s.gsub('-', '_')
6
+
7
+ unless key.match? /\A[[:alpha:]_][[:alnum:]_]*\z/
8
+ raise "invalid global name: #{key}"
9
+ end
10
+
11
+ eval "$#{key} = value"
12
+ end
13
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module OptParse2
4
- VERSION = "0.1.0"
3
+ class OptParse2
4
+ VERSION = "0.1.3"
5
5
  end
data/lib/optparse2.rb CHANGED
@@ -1,27 +1,79 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'optparse'
4
+ class OptParse2 < OptParse; end # Make sure it's a subclass
5
+ OptionParser2 = OptParse2 # Alias
6
+
3
7
  require_relative "optparse2/version"
8
+ require_relative "optparse2/fixes"
9
+ # require_relative "optparse2/helpers"
10
+
11
+ class OptParse2
12
+ def initialize(...)
13
+ @defaults = Set[]
14
+ super
15
+ end
4
16
 
5
- class OptParse2 < OptParse
6
- # Provide support for passing keyword arguments into `make_switch`
7
- def define(*opts, **, &block) top.append(*(sw = make_switch(opts, block, **))); sw[0] end
8
- alias def_option define
9
- def on(...) define(...); self end
17
+ ## Helpers is a mixin that contains methods to modify how the original `Switch` works
18
+ module Helpers
19
+ def set_hidden
20
+ def self.summarize(*) end
21
+ end
10
22
 
11
- def define_head(*opts, **, &block) top.prepend(*(sw = make_switch(opts, block, **))); sw[0] end
12
- alias def_head_option define_head
13
- def on_head(...) define_head(...); self end
23
+ def switch_name=(val)
24
+ if @block.nil? && @arg.nil?
25
+ # if @arg.nil?
26
+ # @block = switch_name.to_sym
27
+ # end
28
+ @block ||= switch_name.to_sym
29
+ # name =
30
+ # binding.irb
31
+ # proc { |*x| p x; name}
32
+ # )
33
+ end
34
+ # binding.irb
35
+ @switch_name = val
36
+ end
37
+ # attr_writer :switch_name
38
+ def switch_name; defined?(@switch_name) ? @switch_name : super end
14
39
 
15
- def define_head(*opts, **, &block) base.append(*(sw = make_switch(opts, block, **))); sw[0] end
16
- alias def_tail_option define_tail
17
- def on_tail(...) define_tail(...); self end
40
+ # requires `switch_name`, `desc` to work
41
+ def set_default(value, description)
42
+ if defined? value.call
43
+ @default = value
44
+ else
45
+ @default = proc { value }
46
+ end
47
+
48
+ @default_description = description
49
+ end
50
+
51
+ def default = @default.call(switch_name)
52
+ def default_description = @default_description || default.inspect
53
+ def desc
54
+ return super unless defined? @default
55
+ x = super
56
+ x << '' if x.empty?
57
+ x[-1] += " [default: #{default_description}]"
58
+ x
59
+ end
60
+ end
18
61
 
19
62
  # Update `make_switch` to support OptParse2's keyword arguments
20
- def make_switch(opts, block, hidden: false, key: nil)
63
+ def make_switch(opts, block, hidden: false, key: nil, default: nodefault=true, default_description: nil)
21
64
  sw, *rest = super(opts, block)
22
65
 
23
- key and sw.define_singleton_method(:switch_name) { key }
24
- hidden and def sw.summarize(*) end
66
+ sw.extend Helpers
67
+
68
+ sw.switch_name = key if key
69
+ sw.set_hidden if hidden
70
+
71
+ if nodefault && default_description != nil
72
+ raise ArgumentError, "default: not supplied, but default_description: given"
73
+ elsif not nodefault
74
+ sw.set_default(default, default_description)
75
+ @defaults << sw
76
+ end
25
77
 
26
78
  [sw, *rest]
27
79
  end
@@ -31,14 +83,26 @@ class OptParse2 < OptParse
31
83
  on_tail("\n" + msg)
32
84
  end
33
85
 
34
- # def env(var, *opts, hidden: false, &)
35
- # fail if hidden
36
- # sw, = make_switch(['-_X', *opts])
86
+ def order!(argv = default_argv, into: nil, **keywords, &nonopt)
87
+ if into.nil? && !@defaults.empty?
88
+ raise "cannot call `order!` without an `into:` if there are default values"
89
+ end
90
+
91
+ already_done = {}
92
+ already_done.define_singleton_method(:[]=) do |key, value|
93
+ key = key.to_s
94
+ super(key, value)
95
+ into[key] = value
96
+ end
37
97
 
38
- # p sw
39
- # exit
40
- # on_tail(var)
41
- # end
98
+ result = super(argv, into: already_done, **keywords, &nonopt)
42
99
 
43
- # def positional
100
+ @defaults.each do |sw|
101
+ key = sw.switch_name
102
+ next if already_done.key? key
103
+ into[key] = sw.default()
104
+ end
105
+
106
+ result
107
+ end
44
108
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: optparse2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - SamW
@@ -19,6 +19,8 @@ files:
19
19
  - README.md
20
20
  - Rakefile
21
21
  - lib/optparse2.rb
22
+ - lib/optparse2/fixes.rb
23
+ - lib/optparse2/globals.rb
22
24
  - lib/optparse2/version.rb
23
25
  - sig/optparse2.rbs
24
26
  licenses:
@@ -38,7 +40,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
38
40
  - !ruby/object:Gem::Version
39
41
  version: '0'
40
42
  requirements: []
41
- rubygems_version: 3.7.0.dev
43
+ rubygems_version: 4.0.3
42
44
  specification_version: 4
43
45
  summary: Drop-in replacement for OptParse to provide updated functionality
44
46
  test_files: []