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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ed8ba0e138b8c1d6e68ca65d8e022ef51f3456647121207904074ffa8d53ac9f
4
- data.tar.gz: e3ffc6e2caa748fadeb8b9a6f3129491d2997c8edf89780689bc6eac02c07489
3
+ metadata.gz: 9d6bc35d1d29eed17b83bf93ec3258e1af9efa589d18db17937f7e9c2860acc3
4
+ data.tar.gz: 81e91f8110396a484fb34f891e272347905cda64b52d32a8d87ca184b90e61e6
5
5
  SHA512:
6
- metadata.gz: f160dfefb34a43a2b9f60ec775679e810613665edba3138857836467285eb5d8ce58c664687bd823322c619ea32a8c84ddab328b7e6a432c5f784dfffdff9727
7
- data.tar.gz: '0950deea41a448199bc90aa1fb65365940fee26c3e3dd994c27d62e8e5677aaaf160e2234a91e24539ae36ecbc498f17aded45674e50e694c1ce4599c45ed1d5'
6
+ metadata.gz: 4093b4ca1c56032b567a187eebfcf1513acb8dfd67eb6138366505eb38c55e0b9eab11b2a488d58b67f4821367be206bc5c76cde97c8d5650519d4d72b472b78
7
+ data.tar.gz: 83133509376750bf9b0d30a39bc59cbfcbeca6820a5856ff4f0900ea0093e8c0e9c725b0f60ef7697c3ce94167e5f8eca67efe2b14227c490835b08a4a6b88ab
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- xoptparse (0.2.0)
4
+ xoptparse (0.3.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -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.arg.scan(/(?:\[\s*(.*?)\s*\]|(\S+))/).flatten.compact
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(*args, &nonopt)
112
- argv = []
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(*args, &argv.method(:<<))
120
+ super(argv, opts_setter, &nonopts.method(:<<))
115
121
  else
116
- argv = super(*args)
122
+ nonopts = super(argv, opts_setter)
117
123
  end
118
- parse_arguments(argv).map(&nonopt)
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
- return sw.block.call.send(block_given? ? :permute! : :order!, *args, **kwargs) if sw
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 < NoArgument
160
+ class SummarizeArgument < self
152
161
  undef_method :add_banner
153
162
 
154
- def summarize(*args)
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 = arg.scan(/\[\s*.*?\s*\]|\S+/)
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(*args)
180
+ res = super
159
181
  @arg = original_arg
160
182
  @short = nil
161
183
  res
162
184
  end
163
185
 
164
- def match_nonswitch?(*args)
165
- super(*args) if @pattern.is_a?(Regexp)
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(*args)
173
- super(*args)
174
- @ranges = arg.scan(/\[\s*(.*?)\s*\]|(\S+)/).map do |opt, req|
175
- (opt ? 0 : 1)..((opt || req).end_with?('...') ? nil : 1)
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
@@ -3,5 +3,5 @@
3
3
  require 'optparse'
4
4
 
5
5
  class XOptionParser < ::OptionParser
6
- VERSION = '0.2.0'
6
+ VERSION = '0.3.0'
7
7
  end
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.2.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-12 00:00:00.000000000 Z
11
+ date: 2020-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler