tty-option 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/CHANGELOG.md +25 -0
- data/README.md +1200 -488
- data/lib/tty/option/conversions.rb +27 -17
- data/lib/tty/option/deep_dup.rb +43 -19
- data/lib/tty/option/errors.rb +33 -3
- data/lib/tty/option/formatter.rb +364 -69
- data/lib/tty/option/param_permitted.rb +7 -3
- data/lib/tty/option/param_validation.rb +124 -20
- data/lib/tty/option/parameter.rb +2 -1
- data/lib/tty/option/parser/options.rb +6 -1
- data/lib/tty/option/version.rb +1 -1
- metadata +3 -2
@@ -4,37 +4,34 @@ require_relative "result"
|
|
4
4
|
|
5
5
|
module TTY
|
6
6
|
module Option
|
7
|
+
# Responsible for parameter validation
|
8
|
+
#
|
9
|
+
# @api private
|
7
10
|
module ParamValidation
|
8
11
|
# Validate parameter value against validation rule
|
9
12
|
#
|
10
13
|
# @example
|
11
|
-
# param = Parameter::Option.create(:foo, validate:
|
12
|
-
# ParamValidation[param, "12"] # => "12"
|
14
|
+
# param = TTY::Option::Parameter::Option.create(:foo, validate: "\d+")
|
15
|
+
# TTY::Option::ParamValidation[param, "12"] # => "12"
|
16
|
+
#
|
17
|
+
# @param [TTY::Option::Parameter] param
|
18
|
+
# the parameter with a validation rule
|
19
|
+
# @param [Object] value
|
20
|
+
# the value to validate
|
21
|
+
#
|
22
|
+
# @return [TTY::Option::Result]
|
13
23
|
#
|
14
24
|
# @api public
|
15
|
-
def call(param,
|
16
|
-
return Result.success(
|
25
|
+
def call(param, value)
|
26
|
+
return Result.success(value) if !param.validate? || value.nil?
|
17
27
|
|
18
28
|
errors = []
|
19
|
-
|
20
|
-
|
21
|
-
valid = case param.validate
|
22
|
-
when Proc
|
23
|
-
param.validate.(value)
|
24
|
-
when Regexp
|
25
|
-
!param.validate.match(value.to_s).nil?
|
26
|
-
end
|
27
|
-
|
28
|
-
if valid
|
29
|
-
acc << value
|
30
|
-
else
|
31
|
-
errors << TTY::Option::InvalidArgument.new(param, value)
|
32
|
-
end
|
33
|
-
acc
|
29
|
+
result = validate_object(param, value) do |error|
|
30
|
+
errors << error
|
34
31
|
end
|
35
32
|
|
36
33
|
if errors.empty?
|
37
|
-
Result.success(result
|
34
|
+
Result.success(result)
|
38
35
|
else
|
39
36
|
Result.failure(errors)
|
40
37
|
end
|
@@ -43,6 +40,113 @@ module TTY
|
|
43
40
|
|
44
41
|
alias [] call
|
45
42
|
module_function :[]
|
43
|
+
|
44
|
+
# Validate an object
|
45
|
+
#
|
46
|
+
# @param [TTY::Option::Parameter] param
|
47
|
+
# the parameter with a validation rule
|
48
|
+
# @param [Object] value
|
49
|
+
# the value to validate
|
50
|
+
#
|
51
|
+
# @yield [TTY::Option::InvalidArgument]
|
52
|
+
#
|
53
|
+
# @return [Object, nil]
|
54
|
+
#
|
55
|
+
# @api private
|
56
|
+
def validate_object(param, value, &block)
|
57
|
+
case value
|
58
|
+
when Array
|
59
|
+
validate_array(param, value, &block)
|
60
|
+
when Hash
|
61
|
+
validate_hash(param, value, &block)
|
62
|
+
else
|
63
|
+
error = valid_or_error(param, value)
|
64
|
+
error ? block.(error) && return : value
|
65
|
+
end
|
66
|
+
end
|
67
|
+
module_function :validate_object
|
68
|
+
private_class_method :validate_object
|
69
|
+
|
70
|
+
# Validate array values
|
71
|
+
#
|
72
|
+
# @param [TTY::Option::Parameter] param
|
73
|
+
# the parameter with a validation rule
|
74
|
+
# @param [Object] values
|
75
|
+
# the values in an array to validate
|
76
|
+
#
|
77
|
+
# @yield [TTY::Option::InvalidArgument]
|
78
|
+
#
|
79
|
+
# @return [Array]
|
80
|
+
#
|
81
|
+
# @api private
|
82
|
+
def validate_array(param, values)
|
83
|
+
values.each_with_object([]) do |value, acc|
|
84
|
+
error = valid_or_error(param, value)
|
85
|
+
error ? yield(error) : acc << value
|
86
|
+
end
|
87
|
+
end
|
88
|
+
module_function :validate_array
|
89
|
+
private_class_method :validate_array
|
90
|
+
|
91
|
+
# Validate hash values
|
92
|
+
#
|
93
|
+
# @param [TTY::Option::Parameter] param
|
94
|
+
# the parameter with a validation rule
|
95
|
+
# @param [Object] values
|
96
|
+
# the values in a hash to validate
|
97
|
+
#
|
98
|
+
# @yield [TTY::Option::InvalidArgument]
|
99
|
+
#
|
100
|
+
# @return [Hash]
|
101
|
+
#
|
102
|
+
# @api private
|
103
|
+
def validate_hash(param, values)
|
104
|
+
values.each_with_object({}) do |value, acc|
|
105
|
+
error = valid_or_error(param, value)
|
106
|
+
error ? yield(error) : acc[value[0]] = value[1]
|
107
|
+
end
|
108
|
+
end
|
109
|
+
module_function :validate_hash
|
110
|
+
private_class_method :validate_hash
|
111
|
+
|
112
|
+
# Create an error for an invalid parameter value
|
113
|
+
#
|
114
|
+
# @param [TTY::Option::Parameter] param
|
115
|
+
# the parameter with a validation rule
|
116
|
+
# @param [Object] value
|
117
|
+
# the value to validate
|
118
|
+
#
|
119
|
+
# @return [TTY::Option::InvalidArgument, nil]
|
120
|
+
#
|
121
|
+
# @api private
|
122
|
+
def valid_or_error(param, value)
|
123
|
+
return if valid?(param, value)
|
124
|
+
|
125
|
+
TTY::Option::InvalidArgument.new(param, value)
|
126
|
+
end
|
127
|
+
module_function :valid_or_error
|
128
|
+
private_class_method :valid_or_error
|
129
|
+
|
130
|
+
# Check whether a parameter value is valid or not
|
131
|
+
#
|
132
|
+
# @param [TTY::Option::Parameter] param
|
133
|
+
# the parameter with a validation rule
|
134
|
+
# @param [Object] value
|
135
|
+
# the value to validate
|
136
|
+
#
|
137
|
+
# @return [Boolean]
|
138
|
+
#
|
139
|
+
# @api private
|
140
|
+
def valid?(param, value)
|
141
|
+
case param.validate
|
142
|
+
when Proc
|
143
|
+
param.validate.(value)
|
144
|
+
when Regexp
|
145
|
+
!param.validate.match(value.to_s).nil?
|
146
|
+
end
|
147
|
+
end
|
148
|
+
module_function :valid?
|
149
|
+
private_class_method :valid?
|
46
150
|
end # ParamValidation
|
47
151
|
end # Option
|
48
152
|
end # TTY
|
data/lib/tty/option/parameter.rb
CHANGED
@@ -175,7 +175,12 @@ module TTY
|
|
175
175
|
@remaining << long
|
176
176
|
end
|
177
177
|
elsif matching_options == 1
|
178
|
-
|
178
|
+
# option stuck together with the argument
|
179
|
+
if sep.nil? && rest.empty?
|
180
|
+
value = long[opt.long_name.size..-1]
|
181
|
+
else
|
182
|
+
value = rest
|
183
|
+
end
|
179
184
|
else
|
180
185
|
@error_aggregator.(AmbiguousOption.new("option '#{long}' is ambiguous"))
|
181
186
|
end
|
data/lib/tty/option/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tty-option
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Piotr Murach
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-05-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -100,6 +100,7 @@ metadata:
|
|
100
100
|
changelog_uri: https://github.com/piotrmurach/tty-option/blob/master/CHANGELOG.md
|
101
101
|
documentation_uri: https://www.rubydoc.info/gems/tty-option
|
102
102
|
homepage_uri: https://ttytoolkit.org
|
103
|
+
rubygems_mfa_required: 'true'
|
103
104
|
source_code_uri: https://github.com/piotrmurach/tty-option
|
104
105
|
post_install_message:
|
105
106
|
rdoc_options: []
|