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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c990adf931ecaaf320100ceaafd82e2af9b12ebdd20f5643fa287a5de33fb693
4
- data.tar.gz: b92e798fe76d863dc51f9c7cc67411e0c7d17d1655ea500b1713b8401c57dee3
3
+ metadata.gz: d4f4b99d85e717967ed1fa272d7b2084db9c09ee1d4872fa7927d5a7bf0c6104
4
+ data.tar.gz: cb88e6660fa66b062089db1bb857ef9bea459581b700fc63e60957b964c852dc
5
5
  SHA512:
6
- metadata.gz: 18c21e34d23152d8c4d74bcf816ca23ab9c3595e99aed36f7f1f333ba48a6e7a65d648ef2e69107921ea2e91a0490d5de6bcf943d9605f080c4491f5917da4d5
7
- data.tar.gz: 98e247c8f9d0a29e5fda3e9d03fcd96d23049265ab576bc14b7ad355c8acfd025af610b6b181b4a46c419d06b96dbe25d90a9ee31416570df3e507e6641d44f1
6
+ metadata.gz: 0717d580106c2a3a084f1c59718e5399103008c932249c4752c4b9d2f9c9c3114d6f1ef62f72d639b3758a7cfd517907b28b4782d21f7ba55c26b3e7804356f8
7
+ data.tar.gz: 97d4a6da7c401a6343ee931039039800b33aa6a1f5bdb08bae961c329e928e4f4ade8906cfa4a31cba353c0a6a4cd129e08a37ae0ecfd1ff484f84da116af34e
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class OptParse2
4
- VERSION = "0.2.3"
4
+ VERSION = "0.4.1"
5
5
  end
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
- result = super(argv, into: already_done, **keywords, &nonopt)
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
- result
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.2.3
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
@@ -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