xoptparse 0.2.0 → 0.3.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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/xoptparse.rb +66 -23
- data/lib/xoptparse/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9d6bc35d1d29eed17b83bf93ec3258e1af9efa589d18db17937f7e9c2860acc3
|
4
|
+
data.tar.gz: 81e91f8110396a484fb34f891e272347905cda64b52d32a8d87ca184b90e61e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4093b4ca1c56032b567a187eebfcf1513acb8dfd67eb6138366505eb38c55e0b9eab11b2a488d58b67f4821367be206bc5c76cde97c8d5650519d4d72b472b78
|
7
|
+
data.tar.gz: 83133509376750bf9b0d30a39bc59cbfcbeca6820a5856ff4f0900ea0093e8c0e9c725b0f60ef7697c3ce94167e5f8eca67efe2b14227c490835b08a4a6b88ab
|
data/Gemfile.lock
CHANGED
data/lib/xoptparse.rb
CHANGED
@@ -67,12 +67,12 @@ class XOptionParser < ::OptionParser
|
|
67
67
|
return sw if sw0.short || sw0.long
|
68
68
|
|
69
69
|
sw0 = fix_arg_switch(sw0)
|
70
|
-
long = sw0.
|
70
|
+
long = sw0.arg_parameters.map(&:first)
|
71
71
|
[sw0, nil, long]
|
72
72
|
end
|
73
73
|
|
74
|
-
def parse_arguments(argv) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
75
|
-
arg_sws = select { |sw| sw.is_a?(Switch::SimpleArgument) }
|
74
|
+
def parse_arguments(argv, setter = nil, opts = {}) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
75
|
+
arg_sws = select { |sw| sw.is_a?(Switch::SimpleArgument) && !opts.include?(sw.switch_name) }
|
76
76
|
return argv if arg_sws.empty?
|
77
77
|
|
78
78
|
sws_ranges = arg_sws.map(&:ranges).flatten(1)
|
@@ -101,34 +101,43 @@ class XOptionParser < ::OptionParser
|
|
101
101
|
conv.call(argv.shift)
|
102
102
|
end
|
103
103
|
end
|
104
|
-
sw.block.call(*a)
|
104
|
+
val = sw.block.call(*a)
|
105
|
+
setter&.call(sw.switch_name, val)
|
105
106
|
end
|
106
107
|
|
107
108
|
argv
|
108
109
|
end
|
109
110
|
private :parse_arguments
|
110
111
|
|
111
|
-
def parse_in_order(
|
112
|
-
|
112
|
+
def parse_in_order(argv = default_argv, setter = nil, &nonopt)
|
113
|
+
nonopts = []
|
114
|
+
opts = {}
|
115
|
+
opts_setter = proc do |name, val|
|
116
|
+
opts[name] = true
|
117
|
+
setter&.call(name, val)
|
118
|
+
end
|
113
119
|
rest = if nonopt
|
114
|
-
super(
|
120
|
+
super(argv, opts_setter, &nonopts.method(:<<))
|
115
121
|
else
|
116
|
-
|
122
|
+
nonopts = super(argv, opts_setter)
|
117
123
|
end
|
118
|
-
parse_arguments(
|
124
|
+
parse_arguments(nonopts, setter, opts).map(&nonopt)
|
119
125
|
rest
|
120
126
|
end
|
121
127
|
private :parse_in_order
|
122
128
|
|
123
|
-
def order!(*args, **kwargs)
|
124
|
-
return super(*args, **kwargs) if @commands.empty?
|
129
|
+
def order!(*args, into: nil, **kwargs) # rubocop:disable Metrics/AbcSize
|
130
|
+
return super(*args, into: into, **kwargs) if @commands.empty?
|
125
131
|
|
126
|
-
argv = super(*args, **kwargs, &nil)
|
132
|
+
argv = super(*args, into: into, **kwargs, &nil)
|
127
133
|
return argv if argv.empty?
|
128
134
|
|
129
135
|
name = argv.shift
|
130
136
|
sw = @commands[name]
|
131
|
-
|
137
|
+
if sw
|
138
|
+
into = into[name.to_sym] = {} if into
|
139
|
+
return sw.block.call.send(block_given? ? :permute! : :order!, *args, into: into, **kwargs)
|
140
|
+
end
|
132
141
|
|
133
142
|
puts "#{program_name}:" \
|
134
143
|
"'#{name}' is not a #{program_name} command. See '#{program_name} --help'."
|
@@ -148,37 +157,71 @@ class XOptionParser < ::OptionParser
|
|
148
157
|
end
|
149
158
|
|
150
159
|
class Switch < ::OptionParser::Switch
|
151
|
-
class SummarizeArgument <
|
160
|
+
class SummarizeArgument < self
|
152
161
|
undef_method :add_banner
|
153
162
|
|
154
|
-
|
163
|
+
attr_reader :arg_parameters
|
164
|
+
|
165
|
+
def initialize(*)
|
166
|
+
super
|
167
|
+
@arg_parameters = arg.scan(/\[\s*(.*?)\s*\]|(\S+)/).map do |opt, req|
|
168
|
+
name = opt || req
|
169
|
+
[name.sub(/\s*\.\.\.$/, ''), opt ? :opt : :req, name.end_with?('...') ? :rest : nil]
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
def summarize(*)
|
155
174
|
original_arg = arg
|
156
|
-
@short =
|
175
|
+
@short = arg_parameters.map do |name, type, rest|
|
176
|
+
var = "#{name}#{rest ? '...' : ''}"
|
177
|
+
type == :req ? var : "[#{var}]"
|
178
|
+
end
|
157
179
|
@arg = nil
|
158
|
-
res = super
|
180
|
+
res = super
|
159
181
|
@arg = original_arg
|
160
182
|
@short = nil
|
161
183
|
res
|
162
184
|
end
|
163
185
|
|
164
|
-
def match_nonswitch?(*
|
165
|
-
super
|
186
|
+
def match_nonswitch?(*)
|
187
|
+
super if @pattern.is_a?(Regexp)
|
188
|
+
end
|
189
|
+
|
190
|
+
def switch_name
|
191
|
+
arg_parameters.first.first
|
166
192
|
end
|
167
193
|
end
|
168
194
|
|
169
195
|
class SimpleArgument < SummarizeArgument
|
170
196
|
attr_reader :ranges
|
171
197
|
|
172
|
-
def initialize(*
|
173
|
-
super
|
174
|
-
@ranges =
|
175
|
-
(
|
198
|
+
def initialize(*)
|
199
|
+
super
|
200
|
+
@ranges = arg_parameters.map do |_name, type, rest|
|
201
|
+
(type == :req ? 1 : 0)..(rest == :rest ? nil : 1)
|
176
202
|
end
|
177
203
|
end
|
178
204
|
|
179
205
|
def add_banner(to)
|
180
206
|
to << " #{arg}"
|
181
207
|
end
|
208
|
+
|
209
|
+
def parse(arg, argv)
|
210
|
+
case ranges.size
|
211
|
+
when 0
|
212
|
+
super(arg, argv)
|
213
|
+
when 1
|
214
|
+
unless arg
|
215
|
+
raise XOptionParser::MissingArgument if argv.empty?
|
216
|
+
|
217
|
+
arg = argv.shift
|
218
|
+
end
|
219
|
+
arg = [arg] if ranges.first.end.nil?
|
220
|
+
conv_arg(*parse_arg(arg, &method(:raise)))
|
221
|
+
else
|
222
|
+
raise XOptionParser::InvalidOption
|
223
|
+
end
|
224
|
+
end
|
182
225
|
end
|
183
226
|
end
|
184
227
|
end
|
data/lib/xoptparse/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xoptparse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ofk
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-07-
|
11
|
+
date: 2020-07-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|