l43_opt_parser 0.2.1 → 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: 7480fcd5f83ef14a37ccbe58bf3beea44d2ce219a87c686be600051b10879870
4
- data.tar.gz: faab1f7444bcd6d8a1e479206a6d1a18a40d9b9da901e32cb084663b7ef0ea7a
3
+ metadata.gz: e144f1cebe465e80a8e104c546ecb0024b9ec0b2dc74dec99e0acf1970b11254
4
+ data.tar.gz: 180b81f733118b0aa427acd802a16d0f32968eb8f64740fd75439a34ed991f62
5
5
  SHA512:
6
- metadata.gz: a2f99db96ded13ab47be70b22dc1a89c8fd0e553cfb4d44ec58b79e5c8d596347ea8199e0c639d336a8691156cd9e0e4444e860662d4354f50c8916c596622e8
7
- data.tar.gz: abfd0ec70ee9b4ebfff30abe8bea87e6c0d2a4f650b63997e12271e18f5d06d174d27d1d50fd7f92f34f55ba555c49db904c652a2994e59c2ef56645f46d9f48
6
+ metadata.gz: 2347bc5fa8dbe0ae1b51beaa02e53328ca8381888ea17193746c27132c7d17497844c1c5b43fb225ffcbbc9e276c9812675eaf28b181a6296336e88513e8a56a
7
+ data.tar.gz: 5f3815d126de479d238852bba576610fc1319ec8ef5a9f0618039d3753c156f630385679c0ba33196f78b8de805ba6f8a3c17a7597e0b46389d0767d67ac0b84
@@ -4,7 +4,6 @@ module L43
4
4
  class OptParser
5
5
  BadFormat = Class.new(RuntimeError)
6
6
  DuplicateFlagDefinition = Class.new(RuntimeError)
7
- DuplicateFlagDefinition = Class.new(RuntimeError)
8
7
  DuplicateKeywordDefinition = Class.new(RuntimeError)
9
8
  FailedCheck = Class.new(RuntimeError)
10
9
  MissingValue = Class.new(RuntimeError)
@@ -5,15 +5,7 @@ module L43
5
5
  class OptParser
6
6
  class Flag
7
7
  extend L43::OpenObject
8
- attributes :name, arg_count: 0, as: nil, desc: nil, value: false, short: nil, stop: false
9
-
10
- def count_ok
11
- if arg_count.zero?
12
- :ok
13
- else
14
- [:error, "flag #{name} cannot be set multiple times"]
15
- end
16
- end
8
+ attributes :name, as: nil, desc: nil, value: false, short: nil, stop: false
17
9
 
18
10
  def real_name = as || name
19
11
  end
@@ -30,36 +30,27 @@ module L43
30
30
  short: nil,
31
31
  value: nil
32
32
 
33
- def assign_value(value)
34
- if arg_count > 0 && !multiple
35
- return Resut.error("must not assign multiple values to keyword #{name}")
33
+ def check_value(value, keywords)
34
+ if keywords.has_key?(real_name) && !multiple
35
+ return Result.error("must not assign multiple values to keyword :#{name}")
36
36
  end
37
37
 
38
- assign_from_set(value).if_error { return it }
38
+ check_set(value).if_error { return it }
39
39
 
40
40
  value = init.(value) if init
41
- Result.ok(
42
- update_attribute(:arg_count, &:succ)
43
- .update_attribute(:value, simple_or_multiple(value))
44
- )
41
+ Result.ok(value)
45
42
  end
46
43
 
47
44
  def real_name = as || name
48
45
 
49
46
  private
50
- def assign_from_set(value)
47
+ def check_set(value)
51
48
  return Result.ok(value) unless set
52
49
  set
53
50
  .fetch_any(value.to_sym, value.to_s) do
54
51
  "bad value for keyword #{name}: #{value} (not in set: #{set.keys.inspect})"
55
52
  end
56
53
  end
57
-
58
- def simple_or_multiple(value)
59
- return value unless multiple
60
-
61
- [*Array(self.value), value]
62
- end
63
54
  end
64
55
  end
65
56
  end
@@ -11,7 +11,7 @@ module L43
11
11
 
12
12
  private
13
13
  def undefaulted_kwd_names
14
- keywords.values.filter_map { it.default == Core::None && it.name }
14
+ keywords.values.filter_map { it.default == Core::None && it.real_name }
15
15
  end
16
16
 
17
17
  def defaulted_kwds_and_flags
@@ -2,7 +2,7 @@
2
2
 
3
3
  module L43
4
4
  class OptParser
5
- VERSION = '0.2.1'
5
+ VERSION = '0.3.0'
6
6
  end
7
7
  end
8
8
  # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -23,10 +23,10 @@ module L43
23
23
 
24
24
 
25
25
  FlagRgx = /\A:(.*)/
26
- KeywordRgx = /(.*):\z/
27
- ShortFlagRgx = /\A\-(.*)/
26
+ KeywordRgx = /(.*):\z/
27
+ ShortFlagRgx = /\A\-(.*)/
28
28
 
29
- attr_reader :arguments, :constrained, :description, :kwds_name
29
+ attr_reader :arguments, :constrained, :description, :kwds_name
30
30
 
31
31
  # Constraints
32
32
  # -----------
@@ -46,8 +46,11 @@ module L43
46
46
  end
47
47
 
48
48
 
49
- def keyword(name, short=nil, as: nil, default: Core::None, **ks, &init)
50
- k = Keyword.new(name:, short:, init:, default:, as:, **ks)
49
+ def keyword(name, short=nil, as: nil, default: Core::None, multiple: false, **ks, &init)
50
+ raise ArgumentError, "must not define a default for multiple keyword :#{name}" if
51
+ multiple && default != Core::None
52
+
53
+ k = Keyword.new(name:, short:, init:, default:, as:, multiple:, **ks)
51
54
  keywords.merge!(name => k) { |*|
52
55
  raise DuplicateKeywordDefinition, "keyword :#{name} is already defined"
53
56
  }
@@ -57,9 +60,10 @@ module L43
57
60
  }
58
61
  end
59
62
  if default != Core::None
60
- defaults.merge!((as||name) => default)
61
- elsif k.multiple
62
- defaults.merge!((as||name) => [])
63
+ defaults.merge!(k.real_name => default)
64
+ end
65
+ if multiple
66
+ keywords_values[k.real_name] = []
63
67
  end
64
68
  @constrained = true
65
69
  description.add_kwd(k)
@@ -102,7 +106,7 @@ module L43
102
106
  kwds = mo.new(**defaults.merge(keywords_values))
103
107
  post_checks!(kwds)
104
108
  kwds = run_hooks(kwds)
105
- result = OpenStruct.new(kwds_name => kwds, args:, errors:).freeze
109
+ result = OpenStruct.new(kwds_name => kwds, args:, errors: errors.uniq).freeze
106
110
  Result.ok(result)
107
111
  else
108
112
  Result.ok(OpenStruct.new(args:, errors:, kwds: OpenStruct.new(**keywords_values)).freeze)
@@ -153,17 +157,21 @@ module L43
153
157
  in :error
154
158
  nil
155
159
  in keyword
156
- case keyword.assign_value(value)
160
+ case keyword.check_value(value, keywords_values)
161
+ in :ok, new_value
162
+ assign_value(keyword, new_value)
157
163
  in :error, error
158
- nil
159
- in :ok, keyword
160
- keywords_values.merge!(keyword.real_name => keyword.value)
164
+ add_errors(error)
161
165
  end
162
166
  end
163
167
  end
164
168
 
165
- def cast_value(_kwd, value)
166
- return value unless constrained?
169
+ def assign_value(keyword, value)
170
+ if keyword.multiple
171
+ keywords_values[keyword.real_name] << value
172
+ else
173
+ keywords_values[keyword.real_name] = value
174
+ end
167
175
  end
168
176
 
169
177
  def get_flag(flag_sym)
@@ -228,14 +236,10 @@ module L43
228
236
  in :error
229
237
  nil
230
238
  in flag
231
- case flag.count_ok
232
- in :ok
233
- flag = flag
234
- .update_attribute(:arg_count, &:succ)
235
- .update(value: true)
236
- keywords_values.merge!(flag.real_name => true)
237
- in :error, error
238
- add_errors(error)
239
+ if keywords_values.fetch(flag.real_name, false)
240
+ add_errors("flag :#{flag.real_name} already set")
241
+ else
242
+ keywords_values.update(flag.real_name => true)
239
243
  end
240
244
  end
241
245
  1
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: l43_opt_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Dober
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2026-04-26 00:00:00.000000000 Z
10
+ date: 2026-04-27 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: ostruct
@@ -100,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
100
  - !ruby/object:Gem::Version
101
101
  version: '0'
102
102
  requirements: []
103
- rubygems_version: 4.0.10
103
+ rubygems_version: 4.0.6
104
104
  specification_version: 4
105
105
  summary: Extract Specs from Markdown
106
106
  test_files: []