l43_opt_parser 0.2.1 → 0.3.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: 7480fcd5f83ef14a37ccbe58bf3beea44d2ce219a87c686be600051b10879870
4
- data.tar.gz: faab1f7444bcd6d8a1e479206a6d1a18a40d9b9da901e32cb084663b7ef0ea7a
3
+ metadata.gz: 56566e37e53f4f9a56960641c73054c2441aa13a74397f62b563eca89470b529
4
+ data.tar.gz: efa2e5d8a9cca077cc28073d52c123545ff173fb55cc2e59ecf5c843734ad445
5
5
  SHA512:
6
- metadata.gz: a2f99db96ded13ab47be70b22dc1a89c8fd0e553cfb4d44ec58b79e5c8d596347ea8199e0c639d336a8691156cd9e0e4444e860662d4354f50c8916c596622e8
7
- data.tar.gz: abfd0ec70ee9b4ebfff30abe8bea87e6c0d2a4f650b63997e12271e18f5d06d174d27d1d50fd7f92f34f55ba555c49db904c652a2994e59c2ef56645f46d9f48
6
+ metadata.gz: 86e1ccc819b3764a84365b93655e08dc7361c88acef54f5f5dcd0ab19a4b7ae50da1253d30e116cf68515503d74649cdb77284ecd6ad8abd602c3bec7ec1916e
7
+ data.tar.gz: ef7bd636ae7810d746f4f108f3140ad707132a4b80a3583e697174d2153a35a0ec3b8067601bf8c06cf5e568ee317b622d21b9813b17cf06485dd5e36e64d3a1
@@ -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
@@ -28,26 +28,27 @@ module L43
28
28
  multiple: false,
29
29
  set: nil,
30
30
  short: nil,
31
- value: nil
31
+ value: nil do |values|
32
+ if Array === values.set
33
+ {set: Set.new(values.set)}
34
+ end
35
+ end
32
36
 
33
- def assign_value(value)
34
- if arg_count > 0 && !multiple
35
- return Resut.error("must not assign multiple values to keyword #{name}")
37
+ def check_value(value, keywords)
38
+ if keywords.has_key?(real_name) && !multiple
39
+ return Result.error("must not assign multiple values to keyword :#{name}")
36
40
  end
37
41
 
38
- assign_from_set(value).if_error { return it }
42
+ check_set(value).if_error { return it }
39
43
 
40
44
  value = init.(value) if init
41
- Result.ok(
42
- update_attribute(:arg_count, &:succ)
43
- .update_attribute(:value, simple_or_multiple(value))
44
- )
45
+ Result.ok(value)
45
46
  end
46
47
 
47
48
  def real_name = as || name
48
49
 
49
50
  private
50
- def assign_from_set(value)
51
+ def check_set(value)
51
52
  return Result.ok(value) unless set
52
53
  set
53
54
  .fetch_any(value.to_sym, value.to_s) do
@@ -55,11 +56,6 @@ module L43
55
56
  end
56
57
  end
57
58
 
58
- def simple_or_multiple(value)
59
- return value unless multiple
60
-
61
- [*Array(self.value), value]
62
- end
63
59
  end
64
60
  end
65
61
  end
@@ -10,6 +10,7 @@ module L43
10
10
  def defaults = @__defaults__ ||= {}
11
11
  def errors = @__errors__ ||= []
12
12
  def flags = @__flags__ ||= {}
13
+ def given_kwds = @__given_kwds__ ||= Set.new
13
14
  def hooks = @__hooks__ ||= []
14
15
  def keywords = @__keywords__ ||= {}
15
16
 
@@ -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.1'
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)
@@ -96,13 +100,13 @@ module L43
96
100
  @arguments = arguments
97
101
  parse_arguments
98
102
 
99
- return Result.error(errors) unless errors.empty?
103
+ return Result.error(errors.uniq) unless errors.empty?
100
104
  if constrained
101
105
  mo = make_open_object
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:, given_kwds:).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,22 @@ 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
+ given_kwds << keyword.real_name
171
+ if keyword.multiple
172
+ keywords_values[keyword.real_name] << value
173
+ else
174
+ keywords_values[keyword.real_name] = value
175
+ end
167
176
  end
168
177
 
169
178
  def get_flag(flag_sym)
@@ -228,14 +237,10 @@ module L43
228
237
  in :error
229
238
  nil
230
239
  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)
240
+ if keywords_values.fetch(flag.real_name, false)
241
+ add_errors("flag :#{flag.real_name} already set")
242
+ else
243
+ keywords_values.update(flag.real_name => true)
239
244
  end
240
245
  end
241
246
  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.1
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
@@ -29,14 +29,14 @@ dependencies:
29
29
  requirements:
30
30
  - - "~>"
31
31
  - !ruby/object:Gem::Version
32
- version: 0.2.1
32
+ version: 0.3.0
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 0.2.1
39
+ version: 0.3.0
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: l43_core
42
42
  requirement: !ruby/object:Gem::Requirement
@@ -57,14 +57,14 @@ dependencies:
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: 0.2.9
60
+ version: 0.3.0
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: 0.2.9
67
+ version: 0.3.0
68
68
  description: |
69
69
  A highly customizable option parser, allowing for different
70
70
  option syntax and returning custom classes' instances depending on