argser 1.5 → 1.6
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.
- data/README.md +14 -11
- data/examples/greetings.rb +2 -2
- data/lib/argser/parser.rb +25 -25
- metadata +1 -1
data/README.md
CHANGED
@@ -28,8 +28,8 @@ Argser::Parser.new({
|
|
28
28
|
- <code>:usage</code>, a string describing how to use the application (default: "")
|
29
29
|
- <code>:details</code>, a string containing details about the application (default: "")
|
30
30
|
- <code>:info</code>, a string printer bellow errors indicating how to find more information about them (default: "For more information try '--help'")
|
31
|
-
- <code>:unknown</code>, a string with the
|
32
|
-
- <code>:fatal</code>, a string with the
|
31
|
+
- <code>:unknown</code>, a string with the error to show when a parameter is not known (default: "Unknown parameter '$p'")
|
32
|
+
- <code>:fatal</code>, a string with the error to show when an internal error is found while parsing parameters (default: "An internal error was found")
|
33
33
|
- <code>:help</code>, a boolean value indicating if the parser should automatically display the help if parameter :help is given (default: true)
|
34
34
|
|
35
35
|
## PARAMETERS OPTIONS
|
@@ -38,10 +38,10 @@ Argser::Parser.new({
|
|
38
38
|
- <code>:type</code>, symbol indicating the type of this parameter (default: :string)
|
39
39
|
- <code>:default</code>, the default value if not other value is provided (default: '')
|
40
40
|
- <code>:required</code>, a boolean value indicating if this parameter is required or not
|
41
|
-
- <code>:sanitize</code>, a function to sanitize the value given (return the identifier of
|
41
|
+
- <code>:sanitize</code>, a function to sanitize the value given (return the identifier of an error to show it or the sanitized value the parser should save)
|
42
42
|
- <code>:callback</code>, a function to call to do something with the parameter
|
43
43
|
- <code>:help</code>, a string with the message to print as the help for this parameter
|
44
|
-
- <code>:
|
44
|
+
- <code>:errors</code>, a hash with all available errors to show where the key is used as an identifier (:type and :required are created by default)
|
45
45
|
|
46
46
|
## REMAINING ARRAY OPTIONS
|
47
47
|
|
@@ -49,10 +49,10 @@ Argser::Parser.new({
|
|
49
49
|
- <code>:default</code>, the default value if not other value is provided (default: '')
|
50
50
|
- <code>:minimum</code>, minimum number of strings allowed
|
51
51
|
- <code>:maximum</code>, maximum number of strings allowed
|
52
|
-
- <code>:sanitize</code>, a function to sanitize the value given (return the identifier of
|
52
|
+
- <code>:sanitize</code>, a function to sanitize the value given (return the identifier of an error to show it or the sanitized value the parser should save)
|
53
53
|
- <code>:callback</code>, a function to call to do something with the parameter
|
54
54
|
- <code>:help</code>, a string with the message to print as the help for the remaining strings
|
55
|
-
- <code>:
|
55
|
+
- <code>:errors</code>, a hash with all available errors to show where the key is used as an identifier (:type and :required are created by default)
|
56
56
|
|
57
57
|
## AVAILABLE TYPES
|
58
58
|
|
@@ -91,8 +91,8 @@ parser = Argser::Parser.new({
|
|
91
91
|
default: 18,
|
92
92
|
type: :integer,
|
93
93
|
sanitize: lambda {|value, default| (value >= 18) ? value : :young},
|
94
|
-
|
95
|
-
|
94
|
+
help: "Specify your age",
|
95
|
+
errors: {
|
96
96
|
type: "I can't believe you're '$v' years old",
|
97
97
|
young: "You can't use this application unless you're older than 18!"
|
98
98
|
}
|
@@ -103,8 +103,8 @@ parser = Argser::Parser.new({
|
|
103
103
|
minimum: 1,
|
104
104
|
maximum: 1,
|
105
105
|
callback: lambda {|values, default| puts "Alright, I got your name!"},
|
106
|
-
|
107
|
-
|
106
|
+
help: "Specify your name and surname",
|
107
|
+
errors: {
|
108
108
|
type: "What!? Your name is '$v'!?"
|
109
109
|
}
|
110
110
|
}
|
@@ -117,7 +117,8 @@ if (parser.param? :age)
|
|
117
117
|
comment = case parser.param(:age)
|
118
118
|
when 18..20 then "you're a teenager!"
|
119
119
|
when 21..30 then "you're a young man!"
|
120
|
-
when 30..99 then "you're
|
120
|
+
when 30..99 then "you're an adult!"
|
121
|
+
when 100..1.0/0.0 then "you're awesome!"
|
121
122
|
end
|
122
123
|
else
|
123
124
|
comment = 'how old are you?'
|
@@ -139,6 +140,8 @@ greeting [OPTIONS] NAME
|
|
139
140
|
-a --age Specify your age
|
140
141
|
-h --help Display this help and exit
|
141
142
|
|
143
|
+
Specify your name and surname
|
144
|
+
|
142
145
|
Provided your age and your name, this application will greet you in a unique way.
|
143
146
|
```
|
144
147
|
|
data/examples/greetings.rb
CHANGED
@@ -17,7 +17,7 @@ parser = Argser::Parser.new({
|
|
17
17
|
type: :integer,
|
18
18
|
sanitize: lambda {|value, default| (value >= 18) ? value : :young},
|
19
19
|
help: "Specify your age",
|
20
|
-
|
20
|
+
errors: {
|
21
21
|
type: "I can't believe you're '$v' years old",
|
22
22
|
young: "You can't use this application unless you're older than 18!"
|
23
23
|
}
|
@@ -29,7 +29,7 @@ parser = Argser::Parser.new({
|
|
29
29
|
maximum: 1,
|
30
30
|
callback: lambda {|values, default| puts "Alright, I got your name!"},
|
31
31
|
help: "Specify your name and surname",
|
32
|
-
|
32
|
+
errors: {
|
33
33
|
type: "What!? Your name is '$v'!?"
|
34
34
|
}
|
35
35
|
}
|
data/lib/argser/parser.rb
CHANGED
@@ -60,13 +60,13 @@ module Argser
|
|
60
60
|
|
61
61
|
#Iterate over all parameters and process their values
|
62
62
|
@params.each do |token, param|
|
63
|
-
raise_error(param[:
|
63
|
+
raise_error(param[:errors][:required], "--#{param[:token].to_s}") unless param?(token) or !param[:required]
|
64
64
|
validate_param(param)
|
65
65
|
sanitize(param)
|
66
66
|
end
|
67
67
|
|
68
68
|
#Process the value of the remaining array
|
69
|
-
raise_error(@remaining[:
|
69
|
+
raise_error(@remaining[:errors][:required]) unless (@remaining[:minimum] <= remaining?) and (remaining? <= @remaining[:maximum])
|
70
70
|
validate_remaining()
|
71
71
|
sanitize(@remaining)
|
72
72
|
|
@@ -124,7 +124,7 @@ module Argser
|
|
124
124
|
exit
|
125
125
|
end
|
126
126
|
|
127
|
-
#Raise an error
|
127
|
+
#Raise an error
|
128
128
|
def raise_error(message, token='', value='')
|
129
129
|
raise ParserError.new(message || @options[:fatal], token, value)
|
130
130
|
end
|
@@ -136,8 +136,8 @@ module Argser
|
|
136
136
|
# :usage A string describing how to use the application (default: "")
|
137
137
|
# :details A string containing details about the application (default: "")
|
138
138
|
# :info A string printer bellow errors indicating how to find more information about them (default: "For more information try '--help'")
|
139
|
-
# :unknown A string with the
|
140
|
-
# :fatal A string with the
|
139
|
+
# :unknown A string with the error to show when a parameter is not known (default: "Unknown parameter '$p'")
|
140
|
+
# :fatal A string with the error to show when an internal error is found while parsing parameters (default: "An internal error was found")
|
141
141
|
# :help A boolean value indicating if the parser should automatically display the help if parameter :help is given (default: true)
|
142
142
|
|
143
143
|
#Save all options for the parser
|
@@ -158,10 +158,10 @@ module Argser
|
|
158
158
|
# :type A symbol indicating the type of this parameter (default: :string)
|
159
159
|
# :default The default value if not other value is provided (default: '')
|
160
160
|
# :required A boolean value indicating if this parameter is required or not
|
161
|
-
# :sanitize A function to sanitize the value given (return the identifier of
|
161
|
+
# :sanitize A function to sanitize the value given (return the identifier of an error to show it or the sanitized value the parser should save)
|
162
162
|
# :callback A function to call to do something with the parameter
|
163
163
|
# :help A string with the message to print as the help for this parameter
|
164
|
-
# :
|
164
|
+
# :errors A hash with all available errors to show where the key is used as an identifier (:help, :type and :required are created by default)
|
165
165
|
|
166
166
|
#Save all parameters the parser should recognize
|
167
167
|
def init_params(params={})
|
@@ -172,7 +172,7 @@ module Argser
|
|
172
172
|
type: :boolean,
|
173
173
|
default: false,
|
174
174
|
help: 'Display this help and exit',
|
175
|
-
|
175
|
+
errors: {}
|
176
176
|
}
|
177
177
|
end
|
178
178
|
|
@@ -186,18 +186,18 @@ module Argser
|
|
186
186
|
sanitize: lambda {|value, default| value},
|
187
187
|
callback: lambda {|value, default|},
|
188
188
|
help: "",
|
189
|
-
|
189
|
+
errors: {}
|
190
190
|
}.merge param
|
191
191
|
|
192
192
|
@params[token][:token] = token
|
193
193
|
@params[token][:value] = @params[token][:default]
|
194
194
|
@params[token][:given] = false
|
195
195
|
|
196
|
-
#Save
|
197
|
-
@params[token][:
|
196
|
+
#Save errors, make sure :type and :required is available
|
197
|
+
@params[token][:errors] = {
|
198
198
|
type: "ERROR: Invalid value '$v' for parameter '$p'",
|
199
199
|
required: "ERROR: Parameter '$p' is required"
|
200
|
-
}.merge @params[token][:
|
200
|
+
}.merge @params[token][:errors]
|
201
201
|
|
202
202
|
#Register all tokens for the parameter
|
203
203
|
@tokens[token] = token
|
@@ -214,10 +214,10 @@ module Argser
|
|
214
214
|
# :default The default value if not other value is provided (default: '')
|
215
215
|
# :minimum Minimum number of strings allowed (default: 0)
|
216
216
|
# :maximum Maximum number of strings allowed (default: Infinity)
|
217
|
-
# :sanitize A function to sanitize the value given (return the identifier of
|
217
|
+
# :sanitize A function to sanitize the value given (return the identifier of an error to show it or the sanitized value the parser should save)
|
218
218
|
# :callback A function to call to do something with the parameter
|
219
219
|
# :help A string with the message to print as the help for the remaining strings
|
220
|
-
# :
|
220
|
+
# :errors A hash with all available errors to show where the key is used as an identifier (:type and :required are created by default)
|
221
221
|
|
222
222
|
#Save options for remaining strings
|
223
223
|
def init_remaining(remaining={})
|
@@ -229,17 +229,17 @@ module Argser
|
|
229
229
|
sanitize: lambda {|value, default| value},
|
230
230
|
callback: lambda {|value, default|},
|
231
231
|
help: "",
|
232
|
-
|
232
|
+
errors: {}
|
233
233
|
}.merge remaining
|
234
234
|
|
235
235
|
@remaining[:value] = @remaining[:default]
|
236
236
|
@remaining[:given] = 0
|
237
237
|
|
238
|
-
#Save
|
239
|
-
@remaining[:
|
238
|
+
#Save errors, make sure, :type and :required is available
|
239
|
+
@remaining[:errors] = {
|
240
240
|
type: "ERROR: Invalid value '$v'",
|
241
241
|
required: "ERROR: Incorrect number of remaining arguments"
|
242
|
-
}.merge @remaining[:
|
242
|
+
}.merge @remaining[:errors]
|
243
243
|
end
|
244
244
|
|
245
245
|
#Validate the value of a parameter based on its type
|
@@ -247,11 +247,11 @@ module Argser
|
|
247
247
|
#If the type is a symbol, it must be a valid type
|
248
248
|
if (param[:type].is_a? Symbol)
|
249
249
|
type = TYPES[param[:type]]
|
250
|
-
raise_error(param[:
|
250
|
+
raise_error(param[:errors][:type], param[:token], param[:value]) if (param[:given]) and (param[:value].is_a? String) and !(match = type[0].match param[:value])
|
251
251
|
#Convert value to the correct type
|
252
252
|
param[:value] = type[1].call(param[:value], match, !param[:given])
|
253
253
|
else #Otherwise it must be a regexp and the value must match
|
254
|
-
raise_error(param[:
|
254
|
+
raise_error(param[:errors][:type], param[:token], param[:value]) unless param[:value] =~ param[:type]
|
255
255
|
end
|
256
256
|
end
|
257
257
|
|
@@ -261,21 +261,21 @@ module Argser
|
|
261
261
|
if (@remaining[:type].is_a? Symbol)
|
262
262
|
type = TYPES[@remaining[:type]]
|
263
263
|
@remaining[:value].each_with_index do |value, i|
|
264
|
-
raise_error(@remaining[:
|
264
|
+
raise_error(@remaining[:errors][:type], @remaining[:token], value) unless (@remaining[:given] == 0) or (match = type[0].match value)
|
265
265
|
#Convert value to the correct type
|
266
266
|
@remaining[:value][i] = type[1].call(value, match, @remaining[:given] == 0)
|
267
267
|
end
|
268
268
|
else #Otherwise it must be a regexp and the values must match
|
269
269
|
@remaining[:value].each do |value|
|
270
|
-
raise_error(@remaining[:
|
270
|
+
raise_error(@remaining[:errors][:type], @remaining[:token], value) unless value =~ @remaining[:type]
|
271
271
|
end
|
272
272
|
end
|
273
273
|
end
|
274
274
|
|
275
|
-
#Sanitize the value of the parameter, if a symbol is returned the associated
|
275
|
+
#Sanitize the value of the parameter, if a symbol is returned the associated error is shown
|
276
276
|
def sanitize(param)
|
277
277
|
value = param[:sanitize].call(param[:value], !param[:given])
|
278
|
-
raise_error(param[:
|
278
|
+
raise_error(param[:errors][value], param[:token], param[:value]) if value.is_a? Symbol
|
279
279
|
#Update the value
|
280
280
|
param[:value] = value
|
281
281
|
end
|
@@ -288,7 +288,7 @@ module Argser
|
|
288
288
|
@remaining[:callback].call(@remaining[:value], !@remaining[:given])
|
289
289
|
end
|
290
290
|
|
291
|
-
#Parser errors used to display
|
291
|
+
#Parser errors used to display errors ($p is replaced by the parameter used by the user, $v is replaced by the value given)
|
292
292
|
class ParserError < Exception
|
293
293
|
attr_reader :message
|
294
294
|
def initialize(message, token='', value='')
|