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 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