l43_opt_parser 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: 960127bd5fe3d57920703c562c1eb31335d8e1c3abef182ff4e673ee1479e70d
4
- data.tar.gz: ba5380ffe585fd5dd198cc11eddedfad056c2d17667e8f446fdaccd34a0fea4d
3
+ metadata.gz: e144f1cebe465e80a8e104c546ecb0024b9ec0b2dc74dec99e0acf1970b11254
4
+ data.tar.gz: 180b81f733118b0aa427acd802a16d0f32968eb8f64740fd75439a34ed991f62
5
5
  SHA512:
6
- metadata.gz: 4da0f00b58bb29dbb69f511e8404a5cb03664ba38ef03933ce7e4ff3e4e4963178d0b9716e0efc79e22534fc081c00ca6d5fe7de127356c2c35f7d7cdd2ce28d
7
- data.tar.gz: 20062237a066a5d7eb15da190a36aa5dd74e1a415dab6ffc96dd8a9287374afc11ab125727030f7628b74acd98ec53df6fac6dbbb6c35401b9ba4c565b5f20f0
6
+ metadata.gz: 2347bc5fa8dbe0ae1b51beaa02e53328ca8381888ea17193746c27132c7d17497844c1c5b43fb225ffcbbc9e276c9812675eaf28b181a6296336e88513e8a56a
7
+ data.tar.gz: 5f3815d126de479d238852bba576610fc1319ec8ef5a9f0618039d3753c156f630385679c0ba33196f78b8de805ba6f8a3c17a7597e0b46389d0767d67ac0b84
@@ -1,7 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class OptParser
4
- DuplicateFlagDefinition = Class.new(RuntimeError)
5
- DuplicateKeywordDefinition = Class.new(RuntimeError)
3
+ module L43
4
+ class OptParser
5
+ BadFormat = Class.new(RuntimeError)
6
+ DuplicateFlagDefinition = Class.new(RuntimeError)
7
+ DuplicateKeywordDefinition = Class.new(RuntimeError)
8
+ FailedCheck = Class.new(RuntimeError)
9
+ MissingValue = Class.new(RuntimeError)
10
+ UndefinedFlag = Class.new(RuntimeError)
11
+ UndefinedKwd = Class.new(RuntimeError)
12
+ end
6
13
  end
7
14
  # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -5,20 +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
17
-
18
- # def on_multiple(&blk)
19
- # @on_multiple = blk
20
- # self
21
- # end
8
+ attributes :name, as: nil, desc: nil, value: false, short: nil, stop: false
22
9
 
23
10
  def real_name = as || name
24
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.0'
5
+ VERSION = '0.3.0'
6
6
  end
7
7
  end
8
8
  # SPDX-License-Identifier: AGPL-3.0-or-later
@@ -21,19 +21,12 @@ module L43
21
21
  include Memos
22
22
  include Meta
23
23
 
24
- BadFormat = Class.new(RuntimeError)
25
- DuplicateFlagDefinition = Class.new(RuntimeError)
26
- DuplicateKwdDefinition = Class.new(RuntimeError)
27
- FailedCheck = Class.new(RuntimeError)
28
- MissingValue = Class.new(RuntimeError)
29
- UndefinedFlag = Class.new(RuntimeError)
30
- UndefinedKwd = Class.new(RuntimeError)
31
24
 
32
25
  FlagRgx = /\A:(.*)/
33
- KeywordRgx = /(.*):\z/
34
- ShortFlagRgx = /\A\-(.*)/
26
+ KeywordRgx = /(.*):\z/
27
+ ShortFlagRgx = /\A\-(.*)/
35
28
 
36
- attr_reader :arguments, :constrained, :description, :kwds_name
29
+ attr_reader :arguments, :constrained, :description, :kwds_name
37
30
 
38
31
  # Constraints
39
32
  # -----------
@@ -53,20 +46,24 @@ module L43
53
46
  end
54
47
 
55
48
 
56
- def keyword(name, short=nil, as: nil, default: Core::None, **ks, &init)
57
- 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)
58
54
  keywords.merge!(name => k) { |*|
59
55
  raise DuplicateKeywordDefinition, "keyword :#{name} is already defined"
60
56
  }
61
57
  if short
62
58
  aliases.merge!(short => k) {|*|
63
- raise DuplicateKwdDefinition, "keyword :#{short} is already defined"
59
+ raise DuplicateKeywordDefinition, "keyword :#{short} is already defined"
64
60
  }
65
61
  end
66
62
  if default != Core::None
67
- defaults.merge!((as||name) => default)
68
- elsif k.multiple
69
- defaults.merge!((as||name) => [])
63
+ defaults.merge!(k.real_name => default)
64
+ end
65
+ if multiple
66
+ keywords_values[k.real_name] = []
70
67
  end
71
68
  @constrained = true
72
69
  description.add_kwd(k)
@@ -109,7 +106,7 @@ module L43
109
106
  kwds = mo.new(**defaults.merge(keywords_values))
110
107
  post_checks!(kwds)
111
108
  kwds = run_hooks(kwds)
112
- result = OpenStruct.new(kwds_name => kwds, args:, errors:).freeze
109
+ result = OpenStruct.new(kwds_name => kwds, args:, errors: errors.uniq).freeze
113
110
  Result.ok(result)
114
111
  else
115
112
  Result.ok(OpenStruct.new(args:, errors:, kwds: OpenStruct.new(**keywords_values)).freeze)
@@ -160,17 +157,21 @@ module L43
160
157
  in :error
161
158
  nil
162
159
  in keyword
163
- case keyword.assign_value(value)
160
+ case keyword.check_value(value, keywords_values)
161
+ in :ok, new_value
162
+ assign_value(keyword, new_value)
164
163
  in :error, error
165
- nil
166
- in :ok, keyword
167
- keywords_values.merge!(keyword.real_name => keyword.value)
164
+ add_errors(error)
168
165
  end
169
166
  end
170
167
  end
171
168
 
172
- def cast_value(_kwd, value)
173
- 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
174
175
  end
175
176
 
176
177
  def get_flag(flag_sym)
@@ -235,14 +236,10 @@ module L43
235
236
  in :error
236
237
  nil
237
238
  in flag
238
- case flag.count_ok
239
- in :ok
240
- flag = flag
241
- .update_attribute(:arg_count, &:succ)
242
- .update(value: true)
243
- keywords_values.merge!(flag.real_name => true)
244
- in :error, error
245
- 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)
246
243
  end
247
244
  end
248
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.0
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: []