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 +4 -4
- data/lib/l43/opt_parser/errors.rb +10 -3
- data/lib/l43/opt_parser/flag.rb +1 -14
- data/lib/l43/opt_parser/keyword.rb +6 -15
- data/lib/l43/opt_parser/meta.rb +1 -1
- data/lib/l43/opt_parser/version.rb +1 -1
- data/lib/l43/opt_parser.rb +28 -31
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e144f1cebe465e80a8e104c546ecb0024b9ec0b2dc74dec99e0acf1970b11254
|
|
4
|
+
data.tar.gz: 180b81f733118b0aa427acd802a16d0f32968eb8f64740fd75439a34ed991f62
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2347bc5fa8dbe0ae1b51beaa02e53328ca8381888ea17193746c27132c7d17497844c1c5b43fb225ffcbbc9e276c9812675eaf28b181a6296336e88513e8a56a
|
|
7
|
+
data.tar.gz: 5f3815d126de479d238852bba576610fc1319ec8ef5a9f0618039d3753c156f630385679c0ba33196f78b8de805ba6f8a3c17a7597e0b46389d0767d67ac0b84
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
data/lib/l43/opt_parser/flag.rb
CHANGED
|
@@ -5,20 +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
|
|
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
|
|
34
|
-
if
|
|
35
|
-
return
|
|
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
|
-
|
|
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
|
|
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
|
data/lib/l43/opt_parser/meta.rb
CHANGED
data/lib/l43/opt_parser.rb
CHANGED
|
@@ -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
|
-
|
|
34
|
-
|
|
26
|
+
KeywordRgx = /(.*):\z/
|
|
27
|
+
ShortFlagRgx = /\A\-(.*)/
|
|
35
28
|
|
|
36
|
-
|
|
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
|
-
|
|
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
|
|
59
|
+
raise DuplicateKeywordDefinition, "keyword :#{short} is already defined"
|
|
64
60
|
}
|
|
65
61
|
end
|
|
66
62
|
if default != Core::None
|
|
67
|
-
defaults.merge!(
|
|
68
|
-
|
|
69
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
173
|
-
|
|
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
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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.
|
|
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-
|
|
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.
|
|
103
|
+
rubygems_version: 4.0.6
|
|
104
104
|
specification_version: 4
|
|
105
105
|
summary: Extract Specs from Markdown
|
|
106
106
|
test_files: []
|