optparse2 0.2.3 → 0.4.1
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 +4 -4
- data/lib/optparse2/version.rb +1 -1
- data/lib/optparse2.rb +132 -3
- metadata +1 -2
- data/lib/optparse2/globals.rb +0 -13
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d4f4b99d85e717967ed1fa272d7b2084db9c09ee1d4872fa7927d5a7bf0c6104
|
|
4
|
+
data.tar.gz: cb88e6660fa66b062089db1bb857ef9bea459581b700fc63e60957b964c852dc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0717d580106c2a3a084f1c59718e5399103008c932249c4752c4b9d2f9c9c3114d6f1ef62f72d639b3758a7cfd517907b28b4782d21f7ba55c26b3e7804356f8
|
|
7
|
+
data.tar.gz: 97d4a6da7c401a6343ee931039039800b33aa6a1f5bdb08bae961c329e928e4f4ade8906cfa4a31cba353c0a6a4cd129e08a37ae0ecfd1ff484f84da116af34e
|
data/lib/optparse2/version.rb
CHANGED
data/lib/optparse2.rb
CHANGED
|
@@ -9,8 +9,17 @@ require_relative "optparse2/fixes"
|
|
|
9
9
|
# require_relative "optparse2/helpers"
|
|
10
10
|
|
|
11
11
|
class OptParse2
|
|
12
|
+
class << self
|
|
13
|
+
attr_accessor :pos_set_banner
|
|
14
|
+
end
|
|
15
|
+
self.pos_set_banner = true
|
|
16
|
+
|
|
12
17
|
def initialize(...)
|
|
13
18
|
@defaults = Set[]
|
|
19
|
+
@positional = []
|
|
20
|
+
@required = Set[]
|
|
21
|
+
@rest = nil
|
|
22
|
+
self.pos_set_banner = OptParse2.pos_set_banner
|
|
14
23
|
super
|
|
15
24
|
end
|
|
16
25
|
|
|
@@ -58,7 +67,8 @@ class OptParse2
|
|
|
58
67
|
end
|
|
59
68
|
|
|
60
69
|
# Update `make_switch` to support OptParse2's keyword arguments
|
|
61
|
-
def make_switch(opts, block, hidden: false, key: nil, default: nodefault=true, default_description: nil
|
|
70
|
+
def make_switch(opts, block, hidden: false, key: nil, default: nodefault=true, default_description: nil,
|
|
71
|
+
required: false)
|
|
62
72
|
sw, *rest = super(opts, block)
|
|
63
73
|
|
|
64
74
|
sw.extend Helpers
|
|
@@ -74,6 +84,13 @@ class OptParse2
|
|
|
74
84
|
not_style.set_hidden if hidden
|
|
75
85
|
end
|
|
76
86
|
|
|
87
|
+
if required
|
|
88
|
+
unless nodefault
|
|
89
|
+
raise ArgumentError, "cannot supply both a default with required: true"
|
|
90
|
+
end
|
|
91
|
+
@required << sw.switch_name
|
|
92
|
+
end
|
|
93
|
+
|
|
77
94
|
if nodefault && default_description != nil
|
|
78
95
|
raise ArgumentError, "default: not supplied, but default_description: given"
|
|
79
96
|
elsif not nodefault
|
|
@@ -100,7 +117,27 @@ class OptParse2
|
|
|
100
117
|
into[key] = value
|
|
101
118
|
end
|
|
102
119
|
|
|
103
|
-
|
|
120
|
+
non_options = []
|
|
121
|
+
|
|
122
|
+
result = super(argv, into: already_done, **keywords, &non_options.method(:<<))
|
|
123
|
+
|
|
124
|
+
argv2 = non_options.each_with_index.flat_map { ["--*-positional-#{_2}", _1] }
|
|
125
|
+
|
|
126
|
+
old_raise, self.raise_unknown = self.raise_unknown, false
|
|
127
|
+
begin
|
|
128
|
+
super(argv2, into: already_done, **keywords)
|
|
129
|
+
rescue
|
|
130
|
+
self.raise_unknown = old_raise
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
argv2 = argv2.each_slice(2).map { _2 }
|
|
134
|
+
|
|
135
|
+
if @rest
|
|
136
|
+
argv2 = @rest[:block].call(argv2)
|
|
137
|
+
into[@rest[:key]] = argv2 if @rest[:key]
|
|
138
|
+
else
|
|
139
|
+
argv2.each(&nonopt)
|
|
140
|
+
end
|
|
104
141
|
|
|
105
142
|
@defaults.each do |sw|
|
|
106
143
|
key = sw.switch_name.to_sym
|
|
@@ -108,6 +145,98 @@ class OptParse2
|
|
|
108
145
|
into[key] = sw.default()
|
|
109
146
|
end
|
|
110
147
|
|
|
111
|
-
|
|
148
|
+
@required.each do |key|
|
|
149
|
+
raise ParseError, "required option '#{key}' not provided" unless already_done.key? key.to_sym
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
argv2
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
module Positional
|
|
156
|
+
attr_accessor :name
|
|
157
|
+
|
|
158
|
+
# Essentially directly copied from `OptParse::Switch`.summarize, except with custom `left`
|
|
159
|
+
def summarize(sdone = {}, ldone = {}, width = 1, max = width - 1, indent = "")
|
|
160
|
+
left = ["#{name}"]
|
|
161
|
+
sdone[name] = true
|
|
162
|
+
ldone[name] = true
|
|
163
|
+
right = desc.dup
|
|
164
|
+
|
|
165
|
+
mlen = left.collect {|ss| ss.length}.max.to_i
|
|
166
|
+
while mlen > width and l = left.shift
|
|
167
|
+
mlen = left.collect {|ss| ss.length}.max.to_i if l.length == mlen
|
|
168
|
+
if l.length < width and (r = right[0]) and !r.empty?
|
|
169
|
+
l = l.to_s.ljust(width) + ' ' + r
|
|
170
|
+
right.shift
|
|
171
|
+
end
|
|
172
|
+
yield(indent + l)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
while begin l = left.shift; r = right.shift; l or r end
|
|
176
|
+
l = l.to_s.ljust(width) + ' ' + r if r and !r.empty?
|
|
177
|
+
yield(indent + l)
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
self
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
# def match_nonswitch?(arg)
|
|
184
|
+
# p ["switch is: #{arg}"]
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
# begin
|
|
188
|
+
# opt, cb, val = parse(arg, []) {|*exc| raise(*exc)}
|
|
189
|
+
# val = $op.send :callback!, cb, 1, val if cb
|
|
190
|
+
# $op.send :callback!, $setter, 2, switch_name, val if $setter
|
|
191
|
+
# rescue OptParse::ParseError
|
|
192
|
+
# raise $!.set_option(arg, rest)
|
|
193
|
+
# end
|
|
194
|
+
# p "ok!"
|
|
195
|
+
# throw :prune
|
|
196
|
+
|
|
197
|
+
# # p arg
|
|
198
|
+
# end
|
|
199
|
+
|
|
200
|
+
# def parse(*argv, **keywords)
|
|
201
|
+
# p argv, keywords
|
|
202
|
+
# # p [argv, keywords]
|
|
203
|
+
# # exit 1
|
|
204
|
+
# end
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
attr_accessor :pos_set_banner
|
|
208
|
+
def pos(name, *a, key: name, **b, &block)
|
|
209
|
+
banner.concat " #{name}" if pos_set_banner
|
|
210
|
+
|
|
211
|
+
sw, *rest = make_switch ["--*-positional-#{@positional.length} #{name}", *a], block, key:, **b
|
|
212
|
+
sw.extend Positional
|
|
213
|
+
sw.name = name
|
|
214
|
+
sw.switch_name = key
|
|
215
|
+
top.append(sw, *rest)
|
|
216
|
+
@positional.append sw
|
|
112
217
|
end
|
|
218
|
+
|
|
219
|
+
def rest(name, description, &block)
|
|
220
|
+
@rest = { key: name.to_sym, block: }
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
__END__
|
|
225
|
+
return unless $0 == __FILE__
|
|
226
|
+
require_relative 'optparse2/pathname'
|
|
227
|
+
|
|
228
|
+
# $* << '-tFOO' << '--no-cache' << '-x'
|
|
229
|
+
# $*.replace %w[123 lol what -t10 is up here]
|
|
230
|
+
$*.replace %w[]
|
|
231
|
+
|
|
232
|
+
OPTS={}
|
|
233
|
+
OptParse2.new do |op|
|
|
234
|
+
$op = op
|
|
235
|
+
op.on '-t', '--timeout=FOO', Array,required: true
|
|
236
|
+
op.pos 'file', Integer, 'sets the file name', 'is also pretty cool', 1..1000, required: true do it * 2 end
|
|
237
|
+
op.pos '[start[-end]]', 'things to do', key: 'line', default: 123
|
|
238
|
+
|
|
239
|
+
op.rest 'message', 'Message to submit' do it.join ' ' end
|
|
240
|
+
op.parse! into: OPTS
|
|
241
|
+
p ["finish: ", OPTS, $*]
|
|
113
242
|
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.
|
|
4
|
+
version: 0.4.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- SamW
|
|
@@ -20,7 +20,6 @@ files:
|
|
|
20
20
|
- Rakefile
|
|
21
21
|
- lib/optparse2.rb
|
|
22
22
|
- lib/optparse2/fixes.rb
|
|
23
|
-
- lib/optparse2/globals.rb
|
|
24
23
|
- lib/optparse2/pathname.rb
|
|
25
24
|
- lib/optparse2/version.rb
|
|
26
25
|
- sig/optparse2.rbs
|
data/lib/optparse2/globals.rb
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
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
|