kharon 0.4.0 → 0.5.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.
- data/README.md +14 -0
- data/kharon-0.4.0.gem +0 -0
- data/kharon.gemspec +1 -1
- data/lib/kharon.rb +17 -0
- data/lib/kharon/configuration.rb +28 -0
- data/lib/kharon/errors/validation.rb +25 -0
- data/lib/kharon/handlers/exceptions.rb +17 -0
- data/lib/kharon/handlers/messages.rb +21 -0
- data/lib/kharon/helpers/validate.rb +1 -1
- data/lib/kharon/validator.rb +34 -23
- data/lib/kharon/version.rb +1 -1
- data/spec/lib/kharon/errors/validation_spec.rb +13 -0
- data/spec/lib/kharon/handlers/exceptions_spec.rb +13 -0
- data/spec/lib/kharon/validator_spec.rb +31 -31
- data/spec/lib/kharon_spec.rb +13 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/utils/fake_config.yml +0 -0
- metadata +11 -2
data/README.md
CHANGED
@@ -26,6 +26,20 @@ gem install kharon
|
|
26
26
|
|
27
27
|
And... That's it ! Now it's installed and you can learn how to properly use it !
|
28
28
|
|
29
|
+
### With bundler
|
30
|
+
|
31
|
+
Add it to your Gemfile :
|
32
|
+
|
33
|
+
```
|
34
|
+
gem "kharon", "~> 0.4.0"
|
35
|
+
```
|
36
|
+
|
37
|
+
then run the following command :
|
38
|
+
|
39
|
+
```
|
40
|
+
bundle install
|
41
|
+
```
|
42
|
+
|
29
43
|
### From sources
|
30
44
|
|
31
45
|
Clone this repository whenether you want, go inside, then type the following command :
|
data/kharon-0.4.0.gem
ADDED
Binary file
|
data/kharon.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |specification|
|
|
10
10
|
specification.summary = "Ruby Hash validator"
|
11
11
|
specification.description = "Kharon is a ruby hash validator that helps you fix the structure of a hash (type of the keys, dependencies, ...)."
|
12
12
|
specification.authors = ["Vincent Courtois"]
|
13
|
-
specification.email = "vincent
|
13
|
+
specification.email = "courtois.vincent@outlook.com"
|
14
14
|
specification.files = `git ls-files`.split($/)
|
15
15
|
specification.homepage = "https://rubygems.org/gems/kharon"
|
16
16
|
specification.license = "Apache License 2"
|
data/lib/kharon.rb
CHANGED
@@ -1,7 +1,24 @@
|
|
1
1
|
require "kharon/version"
|
2
2
|
require "kharon/validator"
|
3
3
|
require "kharon/helpers/validate"
|
4
|
+
require "kharon/configuration"
|
5
|
+
|
6
|
+
require "kharon/errors/validation"
|
7
|
+
|
8
|
+
require "kharon/handlers/exceptions"
|
9
|
+
require "kharon/handlers/messages"
|
4
10
|
|
5
11
|
module Kharon
|
6
12
|
|
13
|
+
# Configuration method used to tell the module if it uses exceptions or stores error messages.
|
14
|
+
# @param [Boolean] use TRUE if you want to use exceptions, FALSE else.
|
15
|
+
def self.use_exceptions(use = true)
|
16
|
+
Kharon::Configuration.instance.use_exceptions(use)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns the current error handler, defined by if you use exceptions or not.
|
20
|
+
# @return [Object] an instance of Kharon::Handlers::Exceptions if you use exceptions, an instance of Kharon::Handlers::Messages else.
|
21
|
+
def self.errors_handler
|
22
|
+
Kharon::Configuration.instance.uses_exceptions? ? Kharon::Handlers::Exceptions.instance : Kharon::Handlers::Messages.new
|
23
|
+
end
|
7
24
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "singleton"
|
2
|
+
require "yaml"
|
3
|
+
|
4
|
+
module Kharon
|
5
|
+
|
6
|
+
# Simple wrapper for the configuration.
|
7
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
8
|
+
class Configuration
|
9
|
+
include Singleton
|
10
|
+
|
11
|
+
attr_accessor :configuration
|
12
|
+
|
13
|
+
# Constructor of the configuration, initializes default values for each usable key.
|
14
|
+
def initialize
|
15
|
+
@configuration = {
|
16
|
+
exceptions: true
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def use_exceptions(use = true)
|
21
|
+
@configuration[:exceptions] = use
|
22
|
+
end
|
23
|
+
|
24
|
+
def uses_exceptions?
|
25
|
+
@configuration[:exceptions]
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Kharon
|
2
|
+
module Errors
|
3
|
+
|
4
|
+
# Standard exception raised in case the exceptions are used, and there is an error in the validation.
|
5
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
6
|
+
class Validation < Exception
|
7
|
+
|
8
|
+
# @!attribute [rw] error_hash
|
9
|
+
# @return [Hash] the description of the encountered error as a Hash.
|
10
|
+
attr_accessor :error_hash
|
11
|
+
|
12
|
+
# Constructor of the class.
|
13
|
+
# @param [Hash] error_hash the description of the encountered error as a Hash.
|
14
|
+
def initialize(error_hash)
|
15
|
+
@error_hash = error_hash
|
16
|
+
end
|
17
|
+
|
18
|
+
# Generates a JSON version of the encountered error description hash.
|
19
|
+
# @return [String] the JSON representation of an error.
|
20
|
+
def message
|
21
|
+
JSON.generate(error_hash)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Kharon
|
2
|
+
module Handlers
|
3
|
+
|
4
|
+
# Errors handler that raises exception as soon as a problem is encountered during validation.
|
5
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
6
|
+
class Exceptions
|
7
|
+
include Singleton
|
8
|
+
|
9
|
+
# Method used to report an error by raising the correct type of exception.
|
10
|
+
# @param [Hash] error_hash a Hash describing the error.
|
11
|
+
# @raises [Kharon::Errors::Validation] the exception raised when an error is encountered.
|
12
|
+
def report_error(error_hash)
|
13
|
+
raise Kharon::Errors::Validation.new(error_hash)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Kharon
|
2
|
+
module Handlers
|
3
|
+
|
4
|
+
# Errors handler that stores each problem encountered during validation.
|
5
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
6
|
+
class Messages
|
7
|
+
|
8
|
+
# @!attribute [rw] errors the errors stored if encountered during validation process.
|
9
|
+
# @return [Array] an array of hashes, each Hash being the description of an error.
|
10
|
+
attr_accessor :errors
|
11
|
+
|
12
|
+
# Method used to report an error by storing it in an array.
|
13
|
+
# @param [Hash] error_hash a Hash describing the error.
|
14
|
+
# @return [Kharon::Handlers::Messages] the errors handler after insertion, so several calls can be chained.
|
15
|
+
def report_error(error_hash)
|
16
|
+
errors.push(error_hash)
|
17
|
+
self
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -6,7 +6,7 @@ module Kharon
|
|
6
6
|
# @param [Proc] block the instructions to apply on the validator.
|
7
7
|
# @return [Hash] the validated and filtered datas.
|
8
8
|
def validate(datas, &block)
|
9
|
-
validator = Kharon::
|
9
|
+
validator = Kharon::Validator.new(datas)
|
10
10
|
validator.instance_eval(&block)
|
11
11
|
return validator.filtered
|
12
12
|
end
|
data/lib/kharon/validator.rb
CHANGED
@@ -1,17 +1,21 @@
|
|
1
1
|
module Kharon
|
2
2
|
|
3
3
|
# The validator is the main class of Kharon, it validates a hash given a structure.
|
4
|
-
# @author Vincent Courtois <vincent
|
4
|
+
# @author Vincent Courtois <courtois.vincent@outlook.com>
|
5
5
|
class Validator
|
6
6
|
|
7
7
|
# @!attribute [r] datas
|
8
|
-
# @return The datas to filter, they shouldn't be modified to guarantee their integrity.
|
8
|
+
# @return [Hash] The datas to filter, they shouldn't be modified to guarantee their integrity.
|
9
9
|
attr_reader :datas
|
10
10
|
|
11
11
|
# @!attribute [rw] filtered
|
12
|
-
# @return The filtered datas are the datas after they have been filtered (renamed keys for example) by the validator.
|
12
|
+
# @return [Hash] The filtered datas are the datas after they have been filtered (renamed keys for example) by the validator.
|
13
13
|
attr_accessor :filtered
|
14
14
|
|
15
|
+
# @!attribute [rw] handler
|
16
|
+
# @return [Object] the error handler given to this instance of the validator.
|
17
|
+
attr_accessor :handler
|
18
|
+
|
15
19
|
# Constructor of the classe, receiving the datas to validate and filter.
|
16
20
|
# @param [Hash] datas the datas to validate in the validator.
|
17
21
|
# @example create a new instance of validator.
|
@@ -19,6 +23,7 @@ module Kharon
|
|
19
23
|
def initialize(datas)
|
20
24
|
@datas = datas
|
21
25
|
@filtered = Hash.new
|
26
|
+
@handler = Kharon.errors_handler
|
22
27
|
end
|
23
28
|
|
24
29
|
# Checks if the given key is an integer or not.
|
@@ -215,19 +220,19 @@ module Kharon
|
|
215
220
|
|
216
221
|
def store_box(key, options)
|
217
222
|
if(options.has_key?(:at_least))
|
218
|
-
box_contains?(datas[key], options[:at_least])
|
223
|
+
box_contains?(key, datas[key], options[:at_least])
|
219
224
|
end
|
220
225
|
if(options.has_key?(:at_most))
|
221
|
-
box_contains?(options[:at_most], datas[key])
|
226
|
+
box_contains?(key, options[:at_most], datas[key])
|
222
227
|
end
|
223
|
-
store(key, ->(item){parse_box(datas[key])}, options)
|
228
|
+
store(key, ->(item){parse_box(key, datas[key])}, options)
|
224
229
|
end
|
225
230
|
|
226
231
|
# Checks if a required key is present in provided datas.
|
227
232
|
# @param [Object] key the key of which check the presence.
|
228
233
|
# @raise [ArgumentError] if the key is not present.
|
229
234
|
def required(key)
|
230
|
-
raise_error("
|
235
|
+
raise_error(type: "required", key: key) unless @datas.has_key?(key)
|
231
236
|
end
|
232
237
|
|
233
238
|
# Syntaxic sugar used to chack several dependencies at once.
|
@@ -244,7 +249,7 @@ module Kharon
|
|
244
249
|
# @param [Object] dependency the key needed by another key for it to properly work.
|
245
250
|
# @raise [ArgumentError] if the required dependency is not present.
|
246
251
|
def dependency(key, dependency)
|
247
|
-
raise_error("
|
252
|
+
raise_error(type: "dependency", key: "key", needed: dependency) unless @datas.has_key?(dependency)
|
248
253
|
end
|
249
254
|
|
250
255
|
# Checks if the value associated with the given key is greater than the given minimum value.
|
@@ -252,7 +257,7 @@ module Kharon
|
|
252
257
|
# @param [Numeric] min_value the required minimum value.
|
253
258
|
# @raise [ArgumentError] if the initial value is strictly lesser than the minimum value.
|
254
259
|
def check_min_value(key, min_value)
|
255
|
-
raise_error("
|
260
|
+
raise_error(type: "min", supposed: min_value, key: key, value: datas[key]) unless datas[key].to_i >= min_value.to_i
|
256
261
|
end
|
257
262
|
|
258
263
|
# Checks if the value associated with the given key is lesser than the given maximum value.
|
@@ -260,7 +265,7 @@ module Kharon
|
|
260
265
|
# @param [Numeric] max_value the required maximum value.
|
261
266
|
# @raise [ArgumentError] if the initial value is strictly greater than the minimum value.
|
262
267
|
def check_max_value(key, max_value)
|
263
|
-
raise_error("
|
268
|
+
raise_error(type: "max", supposed: max_value, key: key, value: datas[key]) unless datas[key].to_i <= max_value.to_i
|
264
269
|
end
|
265
270
|
|
266
271
|
# Checks if the value associated with the given key is included in the given array of values.
|
@@ -268,7 +273,7 @@ module Kharon
|
|
268
273
|
# @param [Array] values the values in which the initial value should be contained.
|
269
274
|
# @raise [ArgumentError] if the initial value is not included in the given possible values.
|
270
275
|
def in_array?(key, values)
|
271
|
-
raise_error("
|
276
|
+
raise_error(type: "array.in", key: key, supposed: values, value: datas[key]) unless (values.empty? or values.include?(datas[key]))
|
272
277
|
end
|
273
278
|
|
274
279
|
# Checks if the value associated with the given key is equal to the given value.
|
@@ -276,7 +281,7 @@ module Kharon
|
|
276
281
|
# @param [Object] value the values with which the initial value should be compared.
|
277
282
|
# @raise [ArgumentError] if the initial value is not equal to the given value.
|
278
283
|
def equals_to?(key, value)
|
279
|
-
raise_error("
|
284
|
+
raise_error(type: "equals", key: key, supposed: value, found: datas[key]) unless datas[key] == value
|
280
285
|
end
|
281
286
|
|
282
287
|
# Checks if the value associated with the given key has the given required keys.
|
@@ -284,7 +289,7 @@ module Kharon
|
|
284
289
|
# @param [Array] required_keys the keys that the initial Hash typed value should contain.
|
285
290
|
# @raise [ArgumentError] if the initial value has not each and every one of the given keys.
|
286
291
|
def has_keys?(key, required_keys)
|
287
|
-
raise_error("
|
292
|
+
raise_error(type: "contains.keys", required: required_keys, key: key) if (datas[key].keys & required_keys) != required_keys
|
288
293
|
end
|
289
294
|
|
290
295
|
# Checks if the value associated with the given key has the given required values.
|
@@ -292,12 +297,12 @@ module Kharon
|
|
292
297
|
# @param [Array] required_keys the values that the initial Enumerable typed value should contain.
|
293
298
|
# @raise [ArgumentError] if the initial value has not each and every one of the given values.
|
294
299
|
def contains?(key, values, required_values)
|
295
|
-
raise_error("
|
300
|
+
raise_error(type: "contains.values", required: required_values, key: key) if (values & required_values) != required_values
|
296
301
|
end
|
297
302
|
|
298
303
|
def match_regex?(key, value, regex)
|
299
304
|
regex = Regexp.new(regex) if regex.kind_of?(String)
|
300
|
-
raise_error("
|
305
|
+
raise_error(type: "regex", regex: regex, value: value, key: key) unless regex.match(value)
|
301
306
|
end
|
302
307
|
|
303
308
|
# Check if the value associated with the given key matches the given regular expression.
|
@@ -344,13 +349,13 @@ module Kharon
|
|
344
349
|
# Parses a box given as a string of four numbers separated by commas.
|
345
350
|
# @param [String] box the string representing the box.
|
346
351
|
# @return [Array] an array of size 2, containing two arrays of size 2 (the first being the coordinates of the top-left corner, the second the ones of the bottom-right corner)
|
347
|
-
def parse_box(box)
|
352
|
+
def parse_box(key, box)
|
348
353
|
if box.kind_of?(String)
|
349
354
|
begin
|
350
355
|
raw_box = box.split(",").map(&:to_f)
|
351
356
|
box = [[raw_box[0], raw_box[1]], [raw_box[2], raw_box[3]]]
|
352
357
|
rescue
|
353
|
-
raise_error("
|
358
|
+
raise_error(type: "box.format", key: "key", value: box)
|
354
359
|
end
|
355
360
|
end
|
356
361
|
return box
|
@@ -360,11 +365,11 @@ module Kharon
|
|
360
365
|
# @param [Object] container any object that can be treated as a box, container of the other box
|
361
366
|
# @param [Object] contained any object that can be treated as a box, contained in the other box
|
362
367
|
# @return [Boolean] TRUE if the box is contained in the other one, FALSE if not.
|
363
|
-
def box_contains?(container, contained)
|
364
|
-
container = parse_box(container)
|
365
|
-
contained = parse_box(contained)
|
368
|
+
def box_contains?(key, container, contained)
|
369
|
+
container = parse_box(key, container)
|
370
|
+
contained = parse_box(key, contained)
|
366
371
|
result = ((container[0][0] <= contained[0][0]) and (container[0][1] <= container[0][1]) and (container[1][0] >= container[1][0]) and (container[1][1] >= container[1][1]))
|
367
|
-
raise_error("
|
372
|
+
raise_error(type: "box.containment", contained: contained, container: container, key: key) unless result
|
368
373
|
end
|
369
374
|
|
370
375
|
# Raises a type error with a generic message.
|
@@ -372,7 +377,7 @@ module Kharon
|
|
372
377
|
# @param [Class] type the expected type, not respected by the initial value.
|
373
378
|
# @raise [ArgumentError] the chosen type error.
|
374
379
|
def raise_type_error(key, type)
|
375
|
-
raise_error("
|
380
|
+
raise_error(type: "type", key: key, supposed: type, found: key.class)
|
376
381
|
end
|
377
382
|
|
378
383
|
protected
|
@@ -381,7 +386,13 @@ module Kharon
|
|
381
386
|
# @param [String] message the the message to display with the exception.
|
382
387
|
# @raises ArgumentError an error to stop the execution when this method is invoked.
|
383
388
|
def raise_error(message)
|
384
|
-
|
389
|
+
handler.report_error(message)
|
390
|
+
end
|
391
|
+
|
392
|
+
# Accessor for the errors, use only if the handler is a Kharon::Handlers::Messages.
|
393
|
+
# @return [Array] the errors encountered during validation or an empty array if the handler was a Kharon::Handlers::Exceptions.
|
394
|
+
def errors
|
395
|
+
handler.respond_to?(:errors) ? handler.errors : []
|
385
396
|
end
|
386
397
|
|
387
398
|
end
|
data/lib/kharon/version.rb
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "Errors::Validation" do
|
4
|
+
let!(:error_hash) { {type: "type", key: "custom key"} }
|
5
|
+
|
6
|
+
it "correctly stores the error hash" do
|
7
|
+
expect(Kharon::Errors::Validation.new(error_hash).error_hash).to eq(error_hash)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "correctly return the JSON equivalent of the error hash as message" do
|
11
|
+
expect(Kharon::Errors::Validation.new(error_hash).message).to eq(JSON.generate(error_hash))
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "Handlers::Exceptions" do
|
4
|
+
it "always returns the same instance" do
|
5
|
+
expect(Kharon::Handlers::Exceptions.instance).to be(Kharon::Handlers::Exceptions.instance)
|
6
|
+
end
|
7
|
+
|
8
|
+
context "#report_error" do
|
9
|
+
it "raises an error of the right type" do
|
10
|
+
expect{Kharon::Handlers::Exceptions.instance.report_error({})}.to raise_error(Kharon::Errors::Validation)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -10,7 +10,7 @@ shared_examples "options" do |process|
|
|
10
10
|
|
11
11
|
it "correctly doesn't rename a key when the value is invalid" do
|
12
12
|
validator = Kharon::Validator.new(invalid_datas)
|
13
|
-
expect(->{validator.send(process, invalid_datas.keys.first, rename: :another_name)}).to raise_error(
|
13
|
+
expect(->{validator.send(process, invalid_datas.keys.first, rename: :another_name)}).to raise_error(Kharon::Errors::Validation)
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -23,7 +23,7 @@ shared_examples "options" do |process|
|
|
23
23
|
|
24
24
|
it "fails when a dependency is not respected" do
|
25
25
|
validator = Kharon::Validator.new(valid_datas)
|
26
|
-
expect(->{validator.send(process, valid_datas.keys.first, dependency: :another_key_not_existing)}).to raise_error(
|
26
|
+
expect(->{validator.send(process, valid_datas.keys.first, dependency: :another_key_not_existing)}).to raise_error(Kharon::Errors::Validation)
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -36,7 +36,7 @@ shared_examples "options" do |process|
|
|
36
36
|
|
37
37
|
it "fails when one of the dependencies is not respected" do
|
38
38
|
validator = Kharon::Validator.new(valid_datas.merge({dep1: "anything"}))
|
39
|
-
expect(->{validator.send(process, valid_datas.keys.first, dependencies: [:dep1, :dep2])}).to raise_error(
|
39
|
+
expect(->{validator.send(process, valid_datas.keys.first, dependencies: [:dep1, :dep2])}).to raise_error(Kharon::Errors::Validation)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
@@ -55,7 +55,7 @@ shared_examples "options" do |process|
|
|
55
55
|
|
56
56
|
it "fails when a required key is not given" do
|
57
57
|
validator = Kharon::Validator.new(valid_datas)
|
58
|
-
expect(->{validator.send(process, :not_in_hash, required: true)}).to raise_error(
|
58
|
+
expect(->{validator.send(process, :not_in_hash, required: true)}).to raise_error(Kharon::Errors::Validation)
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
@@ -74,7 +74,7 @@ shared_examples "options" do |process|
|
|
74
74
|
|
75
75
|
it "fails if the value is not in the possible values" do
|
76
76
|
validator = Kharon::Validator.new(valid_datas)
|
77
|
-
expect(->{validator.send(process, valid_datas.keys.first, :in => ["anything but the value", "another impossible thing"])}).to raise_error(
|
77
|
+
expect(->{validator.send(process, valid_datas.keys.first, :in => ["anything but the value", "another impossible thing"])}).to raise_error(Kharon::Errors::Validation)
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
@@ -87,7 +87,7 @@ shared_examples "options" do |process|
|
|
87
87
|
|
88
88
|
it "fails if the value is not equal to the given value" do
|
89
89
|
validator = Kharon::Validator.new(valid_datas)
|
90
|
-
expect(->{validator.send(process, valid_datas.keys.first, :equals => "anything but the given value")}).to raise_error(
|
90
|
+
expect(->{validator.send(process, valid_datas.keys.first, :equals => "anything but the given value")}).to raise_error(Kharon::Errors::Validation)
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
@@ -129,7 +129,7 @@ shared_examples "type checker" do |type, process|
|
|
129
129
|
|
130
130
|
it "fails when given something else than an instance of #{type}" do
|
131
131
|
validator = Kharon::Validator.new(invalid_datas)
|
132
|
-
expect(->{validator.send(process, invalid_datas.keys.first)}).to raise_error(
|
132
|
+
expect(->{validator.send(process, invalid_datas.keys.first)}).to raise_error(Kharon::Errors::Validation)
|
133
133
|
end
|
134
134
|
end
|
135
135
|
|
@@ -149,7 +149,7 @@ shared_examples "min/max checker" do |process, key, transformation|
|
|
149
149
|
end
|
150
150
|
|
151
151
|
it "fails when a min option is given, but not respected" do
|
152
|
-
expect(->{validator.send(process, key, {min: value+1})}).to raise_error(
|
152
|
+
expect(->{validator.send(process, key, {min: value+1})}).to raise_error(Kharon::Errors::Validation)
|
153
153
|
end
|
154
154
|
end
|
155
155
|
|
@@ -165,7 +165,7 @@ shared_examples "min/max checker" do |process, key, transformation|
|
|
165
165
|
end
|
166
166
|
|
167
167
|
it "fails when a max option is given, but not respected" do
|
168
|
-
expect(->{validator.send(process, key, {max: value-1})}).to raise_error(
|
168
|
+
expect(->{validator.send(process, key, {max: value-1})}).to raise_error(Kharon::Errors::Validation)
|
169
169
|
end
|
170
170
|
end
|
171
171
|
|
@@ -177,11 +177,11 @@ shared_examples "min/max checker" do |process, key, transformation|
|
|
177
177
|
end
|
178
178
|
|
179
179
|
it "fails when a max between option is given, but the value is strictly lesser" do
|
180
|
-
expect(->{validator.send(process, key, {between: [value+1, value+2]})}).to raise_error(
|
180
|
+
expect(->{validator.send(process, key, {between: [value+1, value+2]})}).to raise_error(Kharon::Errors::Validation)
|
181
181
|
end
|
182
182
|
|
183
183
|
it "fails when a max between option is given, but the value is strictly greater" do
|
184
|
-
expect(->{validator.send(process, key, {between: [value-2, value-1]})}).to raise_error(
|
184
|
+
expect(->{validator.send(process, key, {between: [value-2, value-1]})}).to raise_error(Kharon::Errors::Validation)
|
185
185
|
end
|
186
186
|
|
187
187
|
it "fails when a max between option is given, but the value is equal to the inferior limit" do
|
@@ -206,12 +206,12 @@ shared_examples "contains option" do |process, key|
|
|
206
206
|
|
207
207
|
it "fails if only some values are contained" do
|
208
208
|
validator = Kharon::Validator.new(valid_datas)
|
209
|
-
expect(->{validator.send(process, key, contains: ["val1", "val3"])}).to raise_error(
|
209
|
+
expect(->{validator.send(process, key, contains: ["val1", "val3"])}).to raise_error(Kharon::Errors::Validation)
|
210
210
|
end
|
211
211
|
|
212
212
|
it "fails if none of the values are contained" do
|
213
213
|
validator = Kharon::Validator.new(valid_datas)
|
214
|
-
expect(->{validator.send(process, key, contains: ["val3", "val4"])}).to raise_error(
|
214
|
+
expect(->{validator.send(process, key, contains: ["val3", "val4"])}).to raise_error(Kharon::Errors::Validation)
|
215
215
|
end
|
216
216
|
end
|
217
217
|
end
|
@@ -230,12 +230,12 @@ describe "Validator" do
|
|
230
230
|
|
231
231
|
it "fails when given a float" do
|
232
232
|
validator = Kharon::Validator.new({is_not_an_integer: 1000.5})
|
233
|
-
expect(->{validator.integer(:is_not_an_integer)}).to raise_error(
|
233
|
+
expect(->{validator.integer(:is_not_an_integer)}).to raise_error(Kharon::Errors::Validation)
|
234
234
|
end
|
235
235
|
|
236
236
|
it "fails when not given a numeric" do
|
237
237
|
validator = Kharon::Validator.new(invalid_datas)
|
238
|
-
expect(->{validator.integer(:is_not_an_integer)}).to raise_error(
|
238
|
+
expect(->{validator.integer(:is_not_an_integer)}).to raise_error(Kharon::Errors::Validation)
|
239
239
|
end
|
240
240
|
|
241
241
|
context "options" do
|
@@ -269,7 +269,7 @@ describe "Validator" do
|
|
269
269
|
|
270
270
|
it "fails when not given a numeric" do
|
271
271
|
validator = Kharon::Validator.new(invalid_datas)
|
272
|
-
expect(->{validator.integer(:is_not_a_numeric)}).to raise_error(
|
272
|
+
expect(->{validator.integer(:is_not_a_numeric)}).to raise_error(Kharon::Errors::Validation)
|
273
273
|
end
|
274
274
|
|
275
275
|
context "options" do
|
@@ -339,7 +339,7 @@ describe "Validator" do
|
|
339
339
|
|
340
340
|
it "fails when the regular expression is not respected" do
|
341
341
|
validator = Kharon::Validator.new(valid_datas)
|
342
|
-
expect(->{validator.text(:is_a_string, regex: "anything else")}).to raise_error(
|
342
|
+
expect(->{validator.text(:is_a_string, regex: "anything else")}).to raise_error(Kharon::Errors::Validation)
|
343
343
|
end
|
344
344
|
end
|
345
345
|
end
|
@@ -365,7 +365,7 @@ describe "Validator" do
|
|
365
365
|
|
366
366
|
it "fails when given something else than a valid datetime" do
|
367
367
|
validator = Kharon::Validator.new(invalid_datas)
|
368
|
-
expect(->{validator.datetime(:is_not_a_datetime)}).to raise_error(
|
368
|
+
expect(->{validator.datetime(:is_not_a_datetime)}).to raise_error(Kharon::Errors::Validation)
|
369
369
|
end
|
370
370
|
|
371
371
|
context "options" do
|
@@ -393,7 +393,7 @@ describe "Validator" do
|
|
393
393
|
|
394
394
|
it "fails when given something else than a valid date" do
|
395
395
|
validator = Kharon::Validator.new(invalid_datas)
|
396
|
-
expect(->{validator.date(:is_not_a_date)}).to raise_error(
|
396
|
+
expect(->{validator.date(:is_not_a_date)}).to raise_error(Kharon::Errors::Validation)
|
397
397
|
end
|
398
398
|
|
399
399
|
context "options" do
|
@@ -434,12 +434,12 @@ describe "Validator" do
|
|
434
434
|
|
435
435
|
it "fails if not all keys are given in the hash" do
|
436
436
|
validator = Kharon::Validator.new(valid_datas)
|
437
|
-
expect(->{validator.hash(:is_a_hash, has_keys: [:key1, :key3])}).to raise_error(
|
437
|
+
expect(->{validator.hash(:is_a_hash, has_keys: [:key1, :key3])}).to raise_error(Kharon::Errors::Validation)
|
438
438
|
end
|
439
439
|
|
440
440
|
it "fails if no keys are contained in the hash" do
|
441
441
|
validator = Kharon::Validator.new(valid_datas)
|
442
|
-
expect(->{validator.hash(:is_a_hash, has_keys: [:key3, :key4])}).to raise_error(
|
442
|
+
expect(->{validator.hash(:is_a_hash, has_keys: [:key3, :key4])}).to raise_error(Kharon::Errors::Validation)
|
443
443
|
end
|
444
444
|
end
|
445
445
|
end
|
@@ -458,7 +458,7 @@ describe "Validator" do
|
|
458
458
|
|
459
459
|
it "fails when not given a boolean" do
|
460
460
|
validator = Kharon::Validator.new(invalid_datas)
|
461
|
-
expect(->{validator.boolean(:is_not_a_boolean)}).to raise_error(
|
461
|
+
expect(->{validator.boolean(:is_not_a_boolean)}).to raise_error(Kharon::Errors::Validation)
|
462
462
|
end
|
463
463
|
|
464
464
|
context "options" do
|
@@ -480,7 +480,7 @@ describe "Validator" do
|
|
480
480
|
|
481
481
|
it "fails when not given a SSID" do
|
482
482
|
validator = Kharon::Validator.new(invalid_datas)
|
483
|
-
expect(->{validator.ssid(:is_not_a_ssid)}).to raise_error(
|
483
|
+
expect(->{validator.ssid(:is_not_a_ssid)}).to raise_error(Kharon::Errors::Validation)
|
484
484
|
end
|
485
485
|
|
486
486
|
context "options" do
|
@@ -504,27 +504,27 @@ describe "Validator" do
|
|
504
504
|
|
505
505
|
it "fails when not given a box" do
|
506
506
|
validator = Kharon::Validator.new(invalid_datas)
|
507
|
-
expect(->{validator.box(:is_not_a_box)}).to raise_error(
|
507
|
+
expect(->{validator.box(:is_not_a_box)}).to raise_error(Kharon::Errors::Validation)
|
508
508
|
end
|
509
509
|
|
510
510
|
it "fails with an invalid top longitude" do
|
511
511
|
validator = Kharon::Validator.new(is_an_invalid_box: "test,12,12.0,-12.0")
|
512
|
-
expect(->{validator.box(:is_an_invalid_box)}).to raise_error(
|
512
|
+
expect(->{validator.box(:is_an_invalid_box)}).to raise_error(Kharon::Errors::Validation)
|
513
513
|
end
|
514
514
|
|
515
515
|
it "fails with an invalid top latitude" do
|
516
516
|
validator = Kharon::Validator.new(is_an_invalid_box: "0,test,12.0,-12.0")
|
517
|
-
expect(->{validator.box(:is_an_invalid_box)}).to raise_error(
|
517
|
+
expect(->{validator.box(:is_an_invalid_box)}).to raise_error(Kharon::Errors::Validation)
|
518
518
|
end
|
519
519
|
|
520
520
|
it "fails with an invalid down longitude" do
|
521
521
|
validator = Kharon::Validator.new(is_an_invalid_box: "0,12,test,-12.0")
|
522
|
-
expect(->{validator.box(:is_an_invalid_box)}).to raise_error(
|
522
|
+
expect(->{validator.box(:is_an_invalid_box)}).to raise_error(Kharon::Errors::Validation)
|
523
523
|
end
|
524
524
|
|
525
525
|
it "fails with an invalid down latitude" do
|
526
526
|
validator = Kharon::Validator.new(is_an_invalid_box: "0,12,12.0,test")
|
527
|
-
expect(->{validator.box(:is_an_invalid_box)}).to raise_error(
|
527
|
+
expect(->{validator.box(:is_an_invalid_box)}).to raise_error(Kharon::Errors::Validation)
|
528
528
|
end
|
529
529
|
|
530
530
|
context "options" do
|
@@ -541,7 +541,7 @@ describe "Validator" do
|
|
541
541
|
end
|
542
542
|
|
543
543
|
it "fails if the box is smaller than the one given with the at_least option" do
|
544
|
-
expect(->{@validator.box(:is_a_box, at_least: [[-20, -20], [1000, 1000]])}).to raise_error(
|
544
|
+
expect(->{@validator.box(:is_a_box, at_least: [[-20, -20], [1000, 1000]])}).to raise_error(Kharon::Errors::Validation)
|
545
545
|
end
|
546
546
|
end
|
547
547
|
|
@@ -556,7 +556,7 @@ describe "Validator" do
|
|
556
556
|
end
|
557
557
|
|
558
558
|
it "fails if the box is bigger than the one given with the at_most option" do
|
559
|
-
expect(->{@validator.box(:is_a_box, at_most: [[10, 10], [20, 20]])}).to raise_error(
|
559
|
+
expect(->{@validator.box(:is_a_box, at_most: [[10, 10], [20, 20]])}).to raise_error(Kharon::Errors::Validation)
|
560
560
|
end
|
561
561
|
end
|
562
562
|
end
|
@@ -575,7 +575,7 @@ describe "Validator" do
|
|
575
575
|
|
576
576
|
it "fails when not given a email" do
|
577
577
|
validator = Kharon::Validator.new(invalid_datas)
|
578
|
-
expect(->{validator.email(:is_not_an_email)}).to raise_error(
|
578
|
+
expect(->{validator.email(:is_not_an_email)}).to raise_error(Kharon::Errors::Validation)
|
579
579
|
end
|
580
580
|
|
581
581
|
context "options" do
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe "Kharon" do
|
4
|
+
it "Can not use exceptions" do
|
5
|
+
Kharon.use_exceptions(false)
|
6
|
+
expect(Kharon.errors_handler).to be_a(Kharon::Handlers::Messages)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "Can use exceptions" do
|
10
|
+
Kharon.use_exceptions(true)
|
11
|
+
expect(Kharon.errors_handler).to be_a(Kharon::Handlers::Exceptions)
|
12
|
+
end
|
13
|
+
end
|
data/spec/spec_helper.rb
CHANGED
File without changes
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kharon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: 2.2.2
|
30
30
|
description: Kharon is a ruby hash validator that helps you fix the structure of a
|
31
31
|
hash (type of the keys, dependencies, ...).
|
32
|
-
email: vincent
|
32
|
+
email: courtois.vincent@outlook.com
|
33
33
|
executables: []
|
34
34
|
extensions: []
|
35
35
|
extra_rdoc_files: []
|
@@ -46,13 +46,22 @@ files:
|
|
46
46
|
- kharon-0.2.0.gem
|
47
47
|
- kharon-0.3.0.gem
|
48
48
|
- kharon-0.3.1.gem
|
49
|
+
- kharon-0.4.0.gem
|
49
50
|
- kharon.gemspec
|
50
51
|
- lib/kharon.rb
|
52
|
+
- lib/kharon/configuration.rb
|
53
|
+
- lib/kharon/errors/validation.rb
|
54
|
+
- lib/kharon/handlers/exceptions.rb
|
55
|
+
- lib/kharon/handlers/messages.rb
|
51
56
|
- lib/kharon/helpers/validate.rb
|
52
57
|
- lib/kharon/validator.rb
|
53
58
|
- lib/kharon/version.rb
|
59
|
+
- spec/lib/kharon/errors/validation_spec.rb
|
60
|
+
- spec/lib/kharon/handlers/exceptions_spec.rb
|
54
61
|
- spec/lib/kharon/validator_spec.rb
|
62
|
+
- spec/lib/kharon_spec.rb
|
55
63
|
- spec/spec_helper.rb
|
64
|
+
- spec/utils/fake_config.yml
|
56
65
|
homepage: https://rubygems.org/gems/kharon
|
57
66
|
licenses:
|
58
67
|
- Apache License 2
|