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 +4 -4
- data/lib/l43/opt_parser/errors.rb +0 -1
- data/lib/l43/opt_parser/flag.rb +1 -9
- data/lib/l43/opt_parser/keyword.rb +11 -15
- data/lib/l43/opt_parser/memos.rb +1 -0
- data/lib/l43/opt_parser/meta.rb +1 -1
- data/lib/l43/opt_parser/version.rb +1 -1
- data/lib/l43/opt_parser.rb +29 -24
- metadata +6 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 56566e37e53f4f9a56960641c73054c2441aa13a74397f62b563eca89470b529
|
|
4
|
+
data.tar.gz: efa2e5d8a9cca077cc28073d52c123545ff173fb55cc2e59ecf5c843734ad445
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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)
|
data/lib/l43/opt_parser/flag.rb
CHANGED
|
@@ -5,15 +5,7 @@ module L43
|
|
|
5
5
|
class OptParser
|
|
6
6
|
class Flag
|
|
7
7
|
extend L43::OpenObject
|
|
8
|
-
attributes :name,
|
|
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
|
|
34
|
-
if
|
|
35
|
-
return
|
|
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
|
-
|
|
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
|
|
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
|
data/lib/l43/opt_parser/memos.rb
CHANGED
data/lib/l43/opt_parser/meta.rb
CHANGED
data/lib/l43/opt_parser.rb
CHANGED
|
@@ -23,10 +23,10 @@ module L43
|
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
FlagRgx = /\A:(.*)/
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
KeywordRgx = /(.*):\z/
|
|
27
|
+
ShortFlagRgx = /\A\-(.*)/
|
|
28
28
|
|
|
29
|
-
|
|
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
|
-
|
|
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!(
|
|
61
|
-
|
|
62
|
-
|
|
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:,
|
|
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.
|
|
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
|
-
|
|
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
|
|
166
|
-
|
|
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
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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.
|
|
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-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|