xoptparse 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|