ruby-livr 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +45 -0
- data/Readme.md +119 -0
- data/lib/livr.rb +60 -0
- data/lib/livr/aliased_rule.rb +26 -0
- data/lib/livr/rule.rb +21 -0
- data/lib/livr/rules/common.rb +35 -0
- data/lib/livr/rules/meta.rb +200 -0
- data/lib/livr/rules/modifiers.rb +68 -0
- data/lib/livr/rules/numeric.rb +136 -0
- data/lib/livr/rules/special.rb +65 -0
- data/lib/livr/rules/string.rb +150 -0
- data/lib/livr/validator.rb +134 -0
- data/ruby-livr.gemspec +19 -0
- data/spec/01-test_suite_spec.rb +34 -0
- data/spec/02-aliases_spec.rb +21 -0
- data/spec/03-auto_trim_spec.rb +56 -0
- data/spec/04-custom_filters_spec.rb +54 -0
- data/spec/05-rules_replacement_spec.rb +67 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/test_suite/aliases_negative/01-adult_age/aliases.json +12 -0
- data/spec/test_suite/aliases_negative/01-adult_age/errors.json +6 -0
- data/spec/test_suite/aliases_negative/01-adult_age/input.json +11 -0
- data/spec/test_suite/aliases_negative/01-adult_age/rules.json +10 -0
- data/spec/test_suite/aliases_negative/02-address/aliases.json +20 -0
- data/spec/test_suite/aliases_negative/02-address/errors.json +8 -0
- data/spec/test_suite/aliases_negative/02-address/input.json +13 -0
- data/spec/test_suite/aliases_negative/02-address/rules.json +4 -0
- data/spec/test_suite/aliases_negative/03-adult_age_in_user/aliases.json +31 -0
- data/spec/test_suite/aliases_negative/03-adult_age_in_user/errors.json +8 -0
- data/spec/test_suite/aliases_negative/03-adult_age_in_user/input.json +14 -0
- data/spec/test_suite/aliases_negative/03-adult_age_in_user/rules.json +4 -0
- data/spec/test_suite/aliases_positive/01-adult_age/aliases.json +12 -0
- data/spec/test_suite/aliases_positive/01-adult_age/input.json +11 -0
- data/spec/test_suite/aliases_positive/01-adult_age/output.json +10 -0
- data/spec/test_suite/aliases_positive/01-adult_age/rules.json +10 -0
- data/spec/test_suite/aliases_positive/02-address/aliases.json +20 -0
- data/spec/test_suite/aliases_positive/02-address/input.json +13 -0
- data/spec/test_suite/aliases_positive/02-address/output.json +12 -0
- data/spec/test_suite/aliases_positive/02-address/rules.json +4 -0
- data/spec/test_suite/aliases_positive/03-adult_age_in_user/aliases.json +31 -0
- data/spec/test_suite/aliases_positive/03-adult_age_in_user/input.json +14 -0
- data/spec/test_suite/aliases_positive/03-adult_age_in_user/output.json +12 -0
- data/spec/test_suite/aliases_positive/03-adult_age_in_user/rules.json +4 -0
- data/spec/test_suite/negative/01-required/errors.json +5 -0
- data/spec/test_suite/negative/01-required/input.json +10 -0
- data/spec/test_suite/negative/01-required/rules.json +10 -0
- data/spec/test_suite/negative/02-not_empty/errors.json +3 -0
- data/spec/test_suite/negative/02-not_empty/input.json +10 -0
- data/spec/test_suite/negative/02-not_empty/rules.json +10 -0
- data/spec/test_suite/negative/03-one_of/errors.json +11 -0
- data/spec/test_suite/negative/03-one_of/input.json +12 -0
- data/spec/test_suite/negative/03-one_of/rules.json +11 -0
- data/spec/test_suite/negative/04-min_length/errors.json +10 -0
- data/spec/test_suite/negative/04-min_length/input.json +12 -0
- data/spec/test_suite/negative/04-min_length/rules.json +11 -0
- data/spec/test_suite/negative/05-max_length/errors.json +10 -0
- data/spec/test_suite/negative/05-max_length/input.json +12 -0
- data/spec/test_suite/negative/05-max_length/rules.json +11 -0
- data/spec/test_suite/negative/06-length_equal/errors.json +10 -0
- data/spec/test_suite/negative/06-length_equal/input.json +12 -0
- data/spec/test_suite/negative/06-length_equal/rules.json +11 -0
- data/spec/test_suite/negative/07-length_between/errors.json +10 -0
- data/spec/test_suite/negative/07-length_between/input.json +12 -0
- data/spec/test_suite/negative/07-length_between/rules.json +11 -0
- data/spec/test_suite/negative/08-like/errors.json +11 -0
- data/spec/test_suite/negative/08-like/input.json +14 -0
- data/spec/test_suite/negative/08-like/rules.json +12 -0
- data/spec/test_suite/negative/09-integer/errors.json +11 -0
- data/spec/test_suite/negative/09-integer/input.json +13 -0
- data/spec/test_suite/negative/09-integer/rules.json +12 -0
- data/spec/test_suite/negative/10-positive_integer/errors.json +11 -0
- data/spec/test_suite/negative/10-positive_integer/input.json +13 -0
- data/spec/test_suite/negative/10-positive_integer/rules.json +12 -0
- data/spec/test_suite/negative/11-decimal/errors.json +11 -0
- data/spec/test_suite/negative/11-decimal/input.json +13 -0
- data/spec/test_suite/negative/11-decimal/rules.json +12 -0
- data/spec/test_suite/negative/12-positive_decimal/errors.json +11 -0
- data/spec/test_suite/negative/12-positive_decimal/input.json +13 -0
- data/spec/test_suite/negative/12-positive_decimal/rules.json +12 -0
- data/spec/test_suite/negative/13-max_number/errors.json +10 -0
- data/spec/test_suite/negative/13-max_number/input.json +12 -0
- data/spec/test_suite/negative/13-max_number/rules.json +11 -0
- data/spec/test_suite/negative/14-min_number/errors.json +11 -0
- data/spec/test_suite/negative/14-min_number/input.json +13 -0
- data/spec/test_suite/negative/14-min_number/rules.json +12 -0
- data/spec/test_suite/negative/15-number_beetween/errors.json +12 -0
- data/spec/test_suite/negative/15-number_beetween/input.json +14 -0
- data/spec/test_suite/negative/15-number_beetween/rules.json +13 -0
- data/spec/test_suite/negative/16-email/errors.json +12 -0
- data/spec/test_suite/negative/16-email/input.json +14 -0
- data/spec/test_suite/negative/16-email/rules.json +13 -0
- data/spec/test_suite/negative/17-equal_to_field/errors.json +10 -0
- data/spec/test_suite/negative/17-equal_to_field/input.json +12 -0
- data/spec/test_suite/negative/17-equal_to_field/rules.json +11 -0
- data/spec/test_suite/negative/18-nested_object/errors.json +9 -0
- data/spec/test_suite/negative/18-nested_object/input.json +9 -0
- data/spec/test_suite/negative/18-nested_object/rules.json +9 -0
- data/spec/test_suite/negative/19-list_of/errors.json +6 -0
- data/spec/test_suite/negative/19-list_of/input.json +6 -0
- data/spec/test_suite/negative/19-list_of/rules.json +14 -0
- data/spec/test_suite/negative/20-list_of_objects/errors.json +14 -0
- data/spec/test_suite/negative/20-list_of_objects/input.json +18 -0
- data/spec/test_suite/negative/20-list_of_objects/rules.json +7 -0
- data/spec/test_suite/negative/21-list_of_different_objects/errors.json +17 -0
- data/spec/test_suite/negative/21-list_of_different_objects/input.json +26 -0
- data/spec/test_suite/negative/21-list_of_different_objects/rules.json +17 -0
- data/spec/test_suite/negative/22-not_empty_list/errors.json +7 -0
- data/spec/test_suite/negative/22-not_empty_list/input.json +6 -0
- data/spec/test_suite/negative/22-not_empty_list/rules.json +7 -0
- data/spec/test_suite/negative/23-url/errors.json +10 -0
- data/spec/test_suite/negative/23-url/input.json +12 -0
- data/spec/test_suite/negative/23-url/rules.json +11 -0
- data/spec/test_suite/negative/24-iso_date/errors.json +11 -0
- data/spec/test_suite/negative/24-iso_date/input.json +13 -0
- data/spec/test_suite/negative/24-iso_date/rules.json +12 -0
- data/spec/test_suite/negative/25-eq/errors.json +13 -0
- data/spec/test_suite/negative/25-eq/input.json +14 -0
- data/spec/test_suite/negative/25-eq/rules.json +13 -0
- data/spec/test_suite/negative/26-string/errors.json +6 -0
- data/spec/test_suite/negative/26-string/input.json +6 -0
- data/spec/test_suite/negative/26-string/rules.json +6 -0
- data/spec/test_suite/negative/27-any_object/errors.json +6 -0
- data/spec/test_suite/negative/27-any_object/input.json +6 -0
- data/spec/test_suite/negative/27-any_object/rules.json +6 -0
- data/spec/test_suite/negative/28-variable_object/errors.json +15 -0
- data/spec/test_suite/negative/28-variable_object/input.json +24 -0
- data/spec/test_suite/negative/28-variable_object/rules.json +77 -0
- data/spec/test_suite/negative/29-or/errors.json +14 -0
- data/spec/test_suite/negative/29-or/input.json +20 -0
- data/spec/test_suite/negative/29-or/rules.json +19 -0
- data/spec/test_suite/positive/01-required/input.json +7 -0
- data/spec/test_suite/positive/01-required/output.json +6 -0
- data/spec/test_suite/positive/01-required/rules.json +6 -0
- data/spec/test_suite/positive/02-not_empty/input.json +6 -0
- data/spec/test_suite/positive/02-not_empty/output.json +5 -0
- data/spec/test_suite/positive/02-not_empty/rules.json +6 -0
- data/spec/test_suite/positive/03-one_of/input.json +11 -0
- data/spec/test_suite/positive/03-one_of/output.json +10 -0
- data/spec/test_suite/positive/03-one_of/rules.json +10 -0
- data/spec/test_suite/positive/04-min_length/input.json +8 -0
- data/spec/test_suite/positive/04-min_length/output.json +7 -0
- data/spec/test_suite/positive/04-min_length/rules.json +8 -0
- data/spec/test_suite/positive/05-max_length/input.json +9 -0
- data/spec/test_suite/positive/05-max_length/output.json +8 -0
- data/spec/test_suite/positive/05-max_length/rules.json +9 -0
- data/spec/test_suite/positive/06-length_equal/input.json +8 -0
- data/spec/test_suite/positive/06-length_equal/output.json +7 -0
- data/spec/test_suite/positive/06-length_equal/rules.json +8 -0
- data/spec/test_suite/positive/07-length_between/input.json +9 -0
- data/spec/test_suite/positive/07-length_between/output.json +8 -0
- data/spec/test_suite/positive/07-length_between/rules.json +9 -0
- data/spec/test_suite/positive/08-like/input.json +8 -0
- data/spec/test_suite/positive/08-like/output.json +7 -0
- data/spec/test_suite/positive/08-like/rules.json +8 -0
- data/spec/test_suite/positive/09-integer/input.json +7 -0
- data/spec/test_suite/positive/09-integer/output.json +6 -0
- data/spec/test_suite/positive/09-integer/rules.json +7 -0
- data/spec/test_suite/positive/10-positive_integer/input.json +7 -0
- data/spec/test_suite/positive/10-positive_integer/output.json +6 -0
- data/spec/test_suite/positive/10-positive_integer/rules.json +6 -0
- data/spec/test_suite/positive/11-decimal/input.json +8 -0
- data/spec/test_suite/positive/11-decimal/output.json +7 -0
- data/spec/test_suite/positive/11-decimal/rules.json +7 -0
- data/spec/test_suite/positive/12-positive_decimal/input.json +8 -0
- data/spec/test_suite/positive/12-positive_decimal/output.json +7 -0
- data/spec/test_suite/positive/12-positive_decimal/rules.json +7 -0
- data/spec/test_suite/positive/13-max_number/input.json +7 -0
- data/spec/test_suite/positive/13-max_number/output.json +6 -0
- data/spec/test_suite/positive/13-max_number/rules.json +6 -0
- data/spec/test_suite/positive/14-min_number/input.json +7 -0
- data/spec/test_suite/positive/14-min_number/output.json +6 -0
- data/spec/test_suite/positive/14-min_number/rules.json +6 -0
- data/spec/test_suite/positive/15-number_between/input.json +8 -0
- data/spec/test_suite/positive/15-number_between/output.json +7 -0
- data/spec/test_suite/positive/15-number_between/rules.json +7 -0
- data/spec/test_suite/positive/16-email/input.json +7 -0
- data/spec/test_suite/positive/16-email/output.json +6 -0
- data/spec/test_suite/positive/16-email/rules.json +6 -0
- data/spec/test_suite/positive/17-equal_to_field/input.json +7 -0
- data/spec/test_suite/positive/17-equal_to_field/output.json +6 -0
- data/spec/test_suite/positive/17-equal_to_field/rules.json +6 -0
- data/spec/test_suite/positive/18-nested_object/input.json +15 -0
- data/spec/test_suite/positive/18-nested_object/output.json +12 -0
- data/spec/test_suite/positive/18-nested_object/rules.json +13 -0
- data/spec/test_suite/positive/19-list_of/input.json +7 -0
- data/spec/test_suite/positive/19-list_of/output.json +7 -0
- data/spec/test_suite/positive/19-list_of/rules.json +15 -0
- data/spec/test_suite/positive/20-list_of_objects/input.json +17 -0
- data/spec/test_suite/positive/20-list_of_objects/output.json +17 -0
- data/spec/test_suite/positive/20-list_of_objects/rules.json +10 -0
- data/spec/test_suite/positive/21-list_of_different_objects/input.json +22 -0
- data/spec/test_suite/positive/21-list_of_different_objects/output.json +21 -0
- data/spec/test_suite/positive/21-list_of_different_objects/rules.json +27 -0
- data/spec/test_suite/positive/22-not_empty_list/input.json +6 -0
- data/spec/test_suite/positive/22-not_empty_list/output.json +5 -0
- data/spec/test_suite/positive/22-not_empty_list/rules.json +5 -0
- data/spec/test_suite/positive/23-url/input.json +7 -0
- data/spec/test_suite/positive/23-url/output.json +6 -0
- data/spec/test_suite/positive/23-url/rules.json +6 -0
- data/spec/test_suite/positive/24-iso_date/input.json +9 -0
- data/spec/test_suite/positive/24-iso_date/output.json +8 -0
- data/spec/test_suite/positive/24-iso_date/rules.json +8 -0
- data/spec/test_suite/positive/25-eq/input.json +10 -0
- data/spec/test_suite/positive/25-eq/output.json +9 -0
- data/spec/test_suite/positive/25-eq/rules.json +9 -0
- data/spec/test_suite/positive/26-string/input.json +8 -0
- data/spec/test_suite/positive/26-string/output.json +7 -0
- data/spec/test_suite/positive/26-string/rules.json +7 -0
- data/spec/test_suite/positive/27-any_object/input.json +6 -0
- data/spec/test_suite/positive/27-any_object/output.json +6 -0
- data/spec/test_suite/positive/27-any_object/rules.json +7 -0
- data/spec/test_suite/positive/28-variable_object/input.json +19 -0
- data/spec/test_suite/positive/28-variable_object/output.json +18 -0
- data/spec/test_suite/positive/28-variable_object/rules.json +47 -0
- data/spec/test_suite/positive/29-or/input.json +25 -0
- data/spec/test_suite/positive/29-or/output.json +24 -0
- data/spec/test_suite/positive/29-or/rules.json +24 -0
- data/spec/test_suite/positive/30-trim/input.json +7 -0
- data/spec/test_suite/positive/30-trim/output.json +7 -0
- data/spec/test_suite/positive/30-trim/rules.json +7 -0
- data/spec/test_suite/positive/31-to_lc/input.json +8 -0
- data/spec/test_suite/positive/31-to_lc/output.json +8 -0
- data/spec/test_suite/positive/31-to_lc/rules.json +8 -0
- data/spec/test_suite/positive/32-to_uc/input.json +7 -0
- data/spec/test_suite/positive/32-to_uc/output.json +7 -0
- data/spec/test_suite/positive/32-to_uc/rules.json +7 -0
- data/spec/test_suite/positive/33-remove/input.json +5 -0
- data/spec/test_suite/positive/33-remove/output.json +5 -0
- data/spec/test_suite/positive/33-remove/rules.json +7 -0
- data/spec/test_suite/positive/34-leave_only/input.json +5 -0
- data/spec/test_suite/positive/34-leave_only/output.json +5 -0
- data/spec/test_suite/positive/34-leave_only/rules.json +7 -0
- data/spec/test_suite/positive/35-default/input.json +10 -0
- data/spec/test_suite/positive/35-default/output.json +12 -0
- data/spec/test_suite/positive/35-default/rules.json +12 -0
- metadata +532 -0
data/ruby-livr.gemspec
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Gem::Specification.new do |gem|
|
2
|
+
gem.name = "ruby-livr"
|
3
|
+
gem.version = "2.0.0"
|
4
|
+
gem.date = "2017-12-22"
|
5
|
+
gem.summary = "Implementation of LIVR v2.0"
|
6
|
+
gem.description = "Language Independent Validation Rules. Implements 2.0 specification"
|
7
|
+
gem.authors = ["Vitaliy Yanchuk"]
|
8
|
+
gem.email = 'fuksito@gmail.com'
|
9
|
+
gem.homepage = "https://github.com/fuksito/ruby-livr"
|
10
|
+
gem.license = "MIT"
|
11
|
+
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
|
17
|
+
gem.add_dependency "activesupport", '~> 5'
|
18
|
+
gem.add_development_dependency "rspec", "3.7"
|
19
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
def read_file(dir, filename)
|
4
|
+
data = File.read dir.join("#{filename}.json")
|
5
|
+
JSON.parse(data)
|
6
|
+
end
|
7
|
+
|
8
|
+
RSpec.describe "test_suite " do
|
9
|
+
|
10
|
+
%w[ positive negative ].each do |spec_dir|
|
11
|
+
context spec_dir do
|
12
|
+
dirs = Pathname.new("#{SPEC_ROOT}/test_suite/#{spec_dir}").children.select(&:directory?)
|
13
|
+
dirs.each do |dir|
|
14
|
+
it dir.basename do
|
15
|
+
rules = read_file(dir, "rules")
|
16
|
+
input = read_file(dir, "input")
|
17
|
+
|
18
|
+
validator = LIVR::Validator.new(rules)
|
19
|
+
result = validator.validate(input)
|
20
|
+
errors = validator.get_errors
|
21
|
+
|
22
|
+
if spec_dir == 'positive'
|
23
|
+
expected_result = read_file(dir, "output")
|
24
|
+
expect(result).to eq(expected_result)
|
25
|
+
else
|
26
|
+
expected_errors = read_file(dir, "errors")
|
27
|
+
expect(errors).to eq(expected_errors)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
RSpec.describe "aliases" do
|
4
|
+
|
5
|
+
it "Validates with aliased rules" do
|
6
|
+
validator = LIVR::Validator.new({
|
7
|
+
"password" => ["required", "strong_password"]
|
8
|
+
})
|
9
|
+
validator.register_aliased_rule({
|
10
|
+
"name" => 'strong_password',
|
11
|
+
"rules" => { "min_length" => 6 },
|
12
|
+
"error" => 'WEAK_PASSWORD'
|
13
|
+
})
|
14
|
+
|
15
|
+
|
16
|
+
output = validator.validate({ "password" => "abc" })
|
17
|
+
expect(output).to eq(false)
|
18
|
+
expect(validator.get_errors).to eq({"password" => "WEAK_PASSWORD"})
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
RSpec.describe "auto_trim" do
|
4
|
+
|
5
|
+
let(:validator) do
|
6
|
+
LIVR::Validator.new({
|
7
|
+
code: "required",
|
8
|
+
password: [ "required", { "min_length" => 3 }],
|
9
|
+
address: { "nested_object" => {
|
10
|
+
street: { "min_length" => 5 },
|
11
|
+
}
|
12
|
+
}
|
13
|
+
}, true)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "NEGATIVE: Validate data with automatic trim" do
|
17
|
+
output = validator.validate({
|
18
|
+
code: ' ',
|
19
|
+
password: ' 12 ',
|
20
|
+
address: {
|
21
|
+
street: ' hell '
|
22
|
+
}
|
23
|
+
})
|
24
|
+
# expect(output).to eq(false), 'should return false due to validation errors fot trimmed values'
|
25
|
+
expect(output).to eq(false)
|
26
|
+
|
27
|
+
expect(validator.get_errors).to eq({
|
28
|
+
code: 'REQUIRED',
|
29
|
+
password: 'TOO_SHORT',
|
30
|
+
address: {
|
31
|
+
street: 'TOO_SHORT',
|
32
|
+
}
|
33
|
+
})
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
it "POSITIVE: Validate data with automatic trim" do
|
38
|
+
clean_data = validator.validate({
|
39
|
+
code: ' A ',
|
40
|
+
password: ' 123 ',
|
41
|
+
address: {
|
42
|
+
street: ' hello '
|
43
|
+
}
|
44
|
+
})
|
45
|
+
|
46
|
+
expect(clean_data).to be_truthy, 'should return clean data'
|
47
|
+
expect(clean_data).to eq({
|
48
|
+
code: 'A',
|
49
|
+
password: '123',
|
50
|
+
address: {
|
51
|
+
street: 'hello',
|
52
|
+
}
|
53
|
+
}), 'Should contain error codes'
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
RSpec.describe "custom_filters" do
|
4
|
+
class MyTrim < LIVR::Rule
|
5
|
+
def call(value, user_data, field_results)
|
6
|
+
return if is_no_value(value) || value.is_a?(Hash)
|
7
|
+
field_results << value.to_s.strip
|
8
|
+
return
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class MyLc < LIVR::Rule
|
13
|
+
def call(value, user_data, field_results)
|
14
|
+
return if is_no_value(value) || value.is_a?(Hash)
|
15
|
+
field_results << value.to_s.downcase
|
16
|
+
return
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
class MyUcfirst < LIVR::Rule
|
21
|
+
def call(value, user_data, field_results)
|
22
|
+
return if is_no_value(value) || value.is_a?(Hash)
|
23
|
+
field_results << value[0].capitalize + value[1..-1]
|
24
|
+
return
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
LIVR::Validator.register_default_rules(
|
29
|
+
my_trim: MyTrim,
|
30
|
+
my_lc: MyLc,
|
31
|
+
my_ucfirst: MyUcfirst
|
32
|
+
)
|
33
|
+
|
34
|
+
it 'Validate data with registered rules' do
|
35
|
+
validator = LIVR::Validator.new(
|
36
|
+
"word1" => ['my_trim', 'my_lc', 'my_ucfirst'],
|
37
|
+
"word2" => ['my_trim', 'my_lc'],
|
38
|
+
"word3" => ['my_ucfirst'],
|
39
|
+
)
|
40
|
+
|
41
|
+
output = validator.validate(
|
42
|
+
"word1" => ' wordOne ',
|
43
|
+
"word2" => ' wordTwo ',
|
44
|
+
"word3" => 'wordThree ',
|
45
|
+
)
|
46
|
+
|
47
|
+
expect(output).to eq( "word1" => 'Wordone',
|
48
|
+
"word2" => 'wordtwo',
|
49
|
+
"word3" => 'WordThree ',
|
50
|
+
)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'spec_helper.rb'
|
2
|
+
|
3
|
+
RSpec.describe "rules_replacement" do
|
4
|
+
|
5
|
+
class PatchedRule < LIVR::Rule
|
6
|
+
|
7
|
+
def initialize(rule_name, rule_builder)
|
8
|
+
@rule_name = rule_name
|
9
|
+
@rule_builder = rule_builder
|
10
|
+
end
|
11
|
+
|
12
|
+
def new(*args)
|
13
|
+
@rule_args = args
|
14
|
+
@rule_validator = @rule_builder.new(*args)
|
15
|
+
self
|
16
|
+
end
|
17
|
+
|
18
|
+
def call(*args)
|
19
|
+
error_code = @rule_validator.call(*args)
|
20
|
+
if error_code
|
21
|
+
return {
|
22
|
+
"code" => error_code,
|
23
|
+
"rule" => { @rule_name => @rule_args }
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'Validate data with registered rules' do
|
30
|
+
# Patch rules
|
31
|
+
default_rules = LIVR::DEFAULT_RULES
|
32
|
+
|
33
|
+
original_rules = {}
|
34
|
+
new_rules = {}
|
35
|
+
default_rules.each do |rule_name, rule_builder|
|
36
|
+
original_rules[rule_name] = rule_builder
|
37
|
+
new_rules[rule_name] = PatchedRule.new(rule_name, rule_builder)
|
38
|
+
end
|
39
|
+
|
40
|
+
LIVR::Validator.register_default_rules(new_rules)
|
41
|
+
|
42
|
+
# Test
|
43
|
+
validator = LIVR::Validator.new({
|
44
|
+
"name" => ['required'],
|
45
|
+
"phone" => { "max_length" => 10 }
|
46
|
+
})
|
47
|
+
|
48
|
+
output = validator.validate({
|
49
|
+
"phone" => '123456789123456'
|
50
|
+
})
|
51
|
+
|
52
|
+
expect(output).to eq(false)
|
53
|
+
expect(validator.get_errors).to eq({
|
54
|
+
"name" => {
|
55
|
+
"code" => 'REQUIRED',
|
56
|
+
"rule" => { "required" => [] },
|
57
|
+
},
|
58
|
+
"phone" => {
|
59
|
+
"code" => 'TOO_LONG',
|
60
|
+
"rule" => { "max_length" => [10] },
|
61
|
+
}
|
62
|
+
})
|
63
|
+
|
64
|
+
# Restore
|
65
|
+
LIVR::Validator.register_default_rules(original_rules)
|
66
|
+
end
|
67
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
{
|
2
|
+
"age1": "adult_age",
|
3
|
+
"age2": ["adult_age"],
|
4
|
+
"age3": [ { "adult_age": [] } ],
|
5
|
+
"age4": { "adult_age": [] },
|
6
|
+
"age1_custom_error": "adult_age_with_custom_error",
|
7
|
+
"age2_custom_error": ["adult_age_with_custom_error"],
|
8
|
+
"age3_custom_error": [ { "adult_age_with_custom_error": [] } ],
|
9
|
+
"age4_custom_error": { "adult_age_with_custom_error": [] }
|
10
|
+
}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"name": "address",
|
4
|
+
"rules": { "nested_object":{
|
5
|
+
"street": "required",
|
6
|
+
"zip": ["required", "positive_integer"],
|
7
|
+
"city": {"one_of": ["Kiev", "Kharkiv"] }
|
8
|
+
}}
|
9
|
+
},
|
10
|
+
|
11
|
+
{
|
12
|
+
"name": "address_with_custom_error",
|
13
|
+
"rules": { "nested_object":{
|
14
|
+
"street": "required",
|
15
|
+
"zip": ["required", "positive_integer"],
|
16
|
+
"city": {"one_of": ["Kiev", "Kharkiv"] }
|
17
|
+
}},
|
18
|
+
"error": "WRONG_ADDRESS"
|
19
|
+
}
|
20
|
+
]
|
@@ -0,0 +1,31 @@
|
|
1
|
+
[
|
2
|
+
{
|
3
|
+
"name": "adult_age",
|
4
|
+
"rules": ["positive_integer", {"min_number": 18}]
|
5
|
+
},
|
6
|
+
|
7
|
+
{
|
8
|
+
"name": "adult_age_with_custom_error",
|
9
|
+
"rules": ["positive_integer", {"min_number": 18}],
|
10
|
+
"error": "WRONG_AGE"
|
11
|
+
},
|
12
|
+
|
13
|
+
{
|
14
|
+
"name": "user",
|
15
|
+
"rules": { "nested_object":{
|
16
|
+
"name": "required",
|
17
|
+
"age1": "adult_age",
|
18
|
+
"age2": "adult_age_with_custom_error"
|
19
|
+
}}
|
20
|
+
},
|
21
|
+
|
22
|
+
{
|
23
|
+
"name": "user_with_custom_error",
|
24
|
+
"rules": { "nested_object":{
|
25
|
+
"name": "required",
|
26
|
+
"age1": "adult_age",
|
27
|
+
"age2": "adult_age_with_custom_error"
|
28
|
+
}},
|
29
|
+
"error": "WRONG_USER"
|
30
|
+
}
|
31
|
+
]
|