livr 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (203) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +6 -0
  3. data/Gemfile +2 -0
  4. data/README.md +240 -0
  5. data/Rakefile +9 -0
  6. data/lib/LIVR.rb +221 -0
  7. data/lib/LIVR/Rules/Common.rb +21 -0
  8. data/lib/LIVR/Rules/Filters.rb +43 -0
  9. data/lib/LIVR/Rules/Helpers.rb +126 -0
  10. data/lib/LIVR/Rules/Numerics.rb +63 -0
  11. data/lib/LIVR/Rules/Special.rb +55 -0
  12. data/lib/LIVR/Rules/Strings.rb +71 -0
  13. data/lib/LIVR/Util.rb +6 -0
  14. data/livr.gemspec +29 -0
  15. data/test/01-test_suite.rb +77 -0
  16. data/test/02-test_auto_trim.rb +55 -0
  17. data/test/03-test_rules_registration.rb +63 -0
  18. data/test/04-test_custom_filters.rb +44 -0
  19. data/test/test_helper.rb +6 -0
  20. data/test/test_suite/aliases_negative/01-adult_age/aliases.json +12 -0
  21. data/test/test_suite/aliases_negative/01-adult_age/errors.json +6 -0
  22. data/test/test_suite/aliases_negative/01-adult_age/input.json +11 -0
  23. data/test/test_suite/aliases_negative/01-adult_age/rules.json +10 -0
  24. data/test/test_suite/aliases_negative/02-address/aliases.json +20 -0
  25. data/test/test_suite/aliases_negative/02-address/errors.json +8 -0
  26. data/test/test_suite/aliases_negative/02-address/input.json +13 -0
  27. data/test/test_suite/aliases_negative/02-address/rules.json +4 -0
  28. data/test/test_suite/aliases_negative/03-adult_age_in_user/aliases.json +31 -0
  29. data/test/test_suite/aliases_negative/03-adult_age_in_user/errors.json +8 -0
  30. data/test/test_suite/aliases_negative/03-adult_age_in_user/input.json +14 -0
  31. data/test/test_suite/aliases_negative/03-adult_age_in_user/rules.json +4 -0
  32. data/test/test_suite/aliases_positive/01-adult_age/aliases.json +12 -0
  33. data/test/test_suite/aliases_positive/01-adult_age/input.json +11 -0
  34. data/test/test_suite/aliases_positive/01-adult_age/output.json +10 -0
  35. data/test/test_suite/aliases_positive/01-adult_age/rules.json +10 -0
  36. data/test/test_suite/aliases_positive/02-address/aliases.json +20 -0
  37. data/test/test_suite/aliases_positive/02-address/input.json +13 -0
  38. data/test/test_suite/aliases_positive/02-address/output.json +12 -0
  39. data/test/test_suite/aliases_positive/02-address/rules.json +4 -0
  40. data/test/test_suite/aliases_positive/03-adult_age_in_user/aliases.json +31 -0
  41. data/test/test_suite/aliases_positive/03-adult_age_in_user/input.json +14 -0
  42. data/test/test_suite/aliases_positive/03-adult_age_in_user/output.json +12 -0
  43. data/test/test_suite/aliases_positive/03-adult_age_in_user/rules.json +4 -0
  44. data/test/test_suite/negative/01-required/errors.json +5 -0
  45. data/test/test_suite/negative/01-required/input.json +10 -0
  46. data/test/test_suite/negative/01-required/rules.json +10 -0
  47. data/test/test_suite/negative/02-not_empty/errors.json +3 -0
  48. data/test/test_suite/negative/02-not_empty/input.json +10 -0
  49. data/test/test_suite/negative/02-not_empty/rules.json +10 -0
  50. data/test/test_suite/negative/03-one_of/errors.json +10 -0
  51. data/test/test_suite/negative/03-one_of/input.json +11 -0
  52. data/test/test_suite/negative/03-one_of/rules.json +10 -0
  53. data/test/test_suite/negative/04-min_length/errors.json +10 -0
  54. data/test/test_suite/negative/04-min_length/input.json +12 -0
  55. data/test/test_suite/negative/04-min_length/rules.json +11 -0
  56. data/test/test_suite/negative/05-max_length/errors.json +10 -0
  57. data/test/test_suite/negative/05-max_length/input.json +12 -0
  58. data/test/test_suite/negative/05-max_length/rules.json +11 -0
  59. data/test/test_suite/negative/06-length_equal/errors.json +10 -0
  60. data/test/test_suite/negative/06-length_equal/input.json +12 -0
  61. data/test/test_suite/negative/06-length_equal/rules.json +11 -0
  62. data/test/test_suite/negative/07-length_between/errors.json +10 -0
  63. data/test/test_suite/negative/07-length_between/input.json +12 -0
  64. data/test/test_suite/negative/07-length_between/rules.json +11 -0
  65. data/test/test_suite/negative/08-like/errors.json +11 -0
  66. data/test/test_suite/negative/08-like/input.json +14 -0
  67. data/test/test_suite/negative/08-like/rules.json +12 -0
  68. data/test/test_suite/negative/09-integer/errors.json +10 -0
  69. data/test/test_suite/negative/09-integer/input.json +12 -0
  70. data/test/test_suite/negative/09-integer/rules.json +11 -0
  71. data/test/test_suite/negative/10-positive_integer/errors.json +10 -0
  72. data/test/test_suite/negative/10-positive_integer/input.json +12 -0
  73. data/test/test_suite/negative/10-positive_integer/rules.json +11 -0
  74. data/test/test_suite/negative/11-decimal/errors.json +10 -0
  75. data/test/test_suite/negative/11-decimal/input.json +12 -0
  76. data/test/test_suite/negative/11-decimal/rules.json +11 -0
  77. data/test/test_suite/negative/12-positive_decimal/errors.json +10 -0
  78. data/test/test_suite/negative/12-positive_decimal/input.json +12 -0
  79. data/test/test_suite/negative/12-positive_decimal/rules.json +11 -0
  80. data/test/test_suite/negative/13-max_number/errors.json +9 -0
  81. data/test/test_suite/negative/13-max_number/input.json +11 -0
  82. data/test/test_suite/negative/13-max_number/rules.json +10 -0
  83. data/test/test_suite/negative/14-min_number/errors.json +9 -0
  84. data/test/test_suite/negative/14-min_number/input.json +11 -0
  85. data/test/test_suite/negative/14-min_number/rules.json +10 -0
  86. data/test/test_suite/negative/15-number_beetween/errors.json +9 -0
  87. data/test/test_suite/negative/15-number_beetween/input.json +11 -0
  88. data/test/test_suite/negative/15-number_beetween/rules.json +10 -0
  89. data/test/test_suite/negative/16-email/errors.json +12 -0
  90. data/test/test_suite/negative/16-email/input.json +14 -0
  91. data/test/test_suite/negative/16-email/rules.json +13 -0
  92. data/test/test_suite/negative/17-equal_to_field/errors.json +10 -0
  93. data/test/test_suite/negative/17-equal_to_field/input.json +12 -0
  94. data/test/test_suite/negative/17-equal_to_field/rules.json +11 -0
  95. data/test/test_suite/negative/18-nested_object/errors.json +9 -0
  96. data/test/test_suite/negative/18-nested_object/input.json +9 -0
  97. data/test/test_suite/negative/18-nested_object/rules.json +9 -0
  98. data/test/test_suite/negative/19-list_of/errors.json +6 -0
  99. data/test/test_suite/negative/19-list_of/input.json +6 -0
  100. data/test/test_suite/negative/19-list_of/rules.json +14 -0
  101. data/test/test_suite/negative/20-list_of_objects/errors.json +14 -0
  102. data/test/test_suite/negative/20-list_of_objects/input.json +18 -0
  103. data/test/test_suite/negative/20-list_of_objects/rules.json +7 -0
  104. data/test/test_suite/negative/21-list_of_different_objects/errors.json +17 -0
  105. data/test/test_suite/negative/21-list_of_different_objects/input.json +26 -0
  106. data/test/test_suite/negative/21-list_of_different_objects/rules.json +17 -0
  107. data/test/test_suite/negative/22-not_empty_list/errors.json +7 -0
  108. data/test/test_suite/negative/22-not_empty_list/input.json +6 -0
  109. data/test/test_suite/negative/22-not_empty_list/rules.json +7 -0
  110. data/test/test_suite/negative/23-url/errors.json +10 -0
  111. data/test/test_suite/negative/23-url/input.json +12 -0
  112. data/test/test_suite/negative/23-url/rules.json +11 -0
  113. data/test/test_suite/negative/24-iso_date/errors.json +10 -0
  114. data/test/test_suite/negative/24-iso_date/input.json +12 -0
  115. data/test/test_suite/negative/24-iso_date/rules.json +11 -0
  116. data/test/test_suite/positive/01-required/input.json +7 -0
  117. data/test/test_suite/positive/01-required/output.json +6 -0
  118. data/test/test_suite/positive/01-required/rules.json +6 -0
  119. data/test/test_suite/positive/02-not_empty/input.json +6 -0
  120. data/test/test_suite/positive/02-not_empty/output.json +5 -0
  121. data/test/test_suite/positive/02-not_empty/rules.json +6 -0
  122. data/test/test_suite/positive/03-one_of/input.json +7 -0
  123. data/test/test_suite/positive/03-one_of/output.json +6 -0
  124. data/test/test_suite/positive/03-one_of/rules.json +6 -0
  125. data/test/test_suite/positive/04-min_length/input.json +7 -0
  126. data/test/test_suite/positive/04-min_length/output.json +6 -0
  127. data/test/test_suite/positive/04-min_length/rules.json +6 -0
  128. data/test/test_suite/positive/05-max_length/input.json +7 -0
  129. data/test/test_suite/positive/05-max_length/output.json +6 -0
  130. data/test/test_suite/positive/05-max_length/rules.json +6 -0
  131. data/test/test_suite/positive/06-length_equal/input.json +7 -0
  132. data/test/test_suite/positive/06-length_equal/output.json +6 -0
  133. data/test/test_suite/positive/06-length_equal/rules.json +6 -0
  134. data/test/test_suite/positive/07-length_between/input.json +7 -0
  135. data/test/test_suite/positive/07-length_between/output.json +6 -0
  136. data/test/test_suite/positive/07-length_between/rules.json +6 -0
  137. data/test/test_suite/positive/08-like/input.json +8 -0
  138. data/test/test_suite/positive/08-like/output.json +7 -0
  139. data/test/test_suite/positive/08-like/rules.json +7 -0
  140. data/test/test_suite/positive/09-integer/input.json +7 -0
  141. data/test/test_suite/positive/09-integer/output.json +6 -0
  142. data/test/test_suite/positive/09-integer/rules.json +6 -0
  143. data/test/test_suite/positive/10-positive_integer/input.json +7 -0
  144. data/test/test_suite/positive/10-positive_integer/output.json +6 -0
  145. data/test/test_suite/positive/10-positive_integer/rules.json +6 -0
  146. data/test/test_suite/positive/11-decimal/input.json +7 -0
  147. data/test/test_suite/positive/11-decimal/output.json +6 -0
  148. data/test/test_suite/positive/11-decimal/rules.json +6 -0
  149. data/test/test_suite/positive/12-positive_decimal/input.json +8 -0
  150. data/test/test_suite/positive/12-positive_decimal/output.json +7 -0
  151. data/test/test_suite/positive/12-positive_decimal/rules.json +7 -0
  152. data/test/test_suite/positive/13-max_number/input.json +7 -0
  153. data/test/test_suite/positive/13-max_number/output.json +6 -0
  154. data/test/test_suite/positive/13-max_number/rules.json +6 -0
  155. data/test/test_suite/positive/14-min_number/input.json +7 -0
  156. data/test/test_suite/positive/14-min_number/output.json +6 -0
  157. data/test/test_suite/positive/14-min_number/rules.json +6 -0
  158. data/test/test_suite/positive/15-number_between/input.json +7 -0
  159. data/test/test_suite/positive/15-number_between/output.json +6 -0
  160. data/test/test_suite/positive/15-number_between/rules.json +6 -0
  161. data/test/test_suite/positive/16-email/input.json +7 -0
  162. data/test/test_suite/positive/16-email/output.json +6 -0
  163. data/test/test_suite/positive/16-email/rules.json +6 -0
  164. data/test/test_suite/positive/17-equal_to_field/input.json +7 -0
  165. data/test/test_suite/positive/17-equal_to_field/output.json +6 -0
  166. data/test/test_suite/positive/17-equal_to_field/rules.json +6 -0
  167. data/test/test_suite/positive/18-nested_object/input.json +10 -0
  168. data/test/test_suite/positive/18-nested_object/output.json +8 -0
  169. data/test/test_suite/positive/18-nested_object/rules.json +8 -0
  170. data/test/test_suite/positive/19-list_of/input.json +6 -0
  171. data/test/test_suite/positive/19-list_of/output.json +6 -0
  172. data/test/test_suite/positive/19-list_of/rules.json +15 -0
  173. data/test/test_suite/positive/20-list_of_objects/input.json +16 -0
  174. data/test/test_suite/positive/20-list_of_objects/output.json +16 -0
  175. data/test/test_suite/positive/20-list_of_objects/rules.json +6 -0
  176. data/test/test_suite/positive/21-list_of_different_objects/input.json +21 -0
  177. data/test/test_suite/positive/21-list_of_different_objects/output.json +20 -0
  178. data/test/test_suite/positive/21-list_of_different_objects/rules.json +17 -0
  179. data/test/test_suite/positive/22-not_empty_list/input.json +6 -0
  180. data/test/test_suite/positive/22-not_empty_list/output.json +5 -0
  181. data/test/test_suite/positive/22-not_empty_list/rules.json +5 -0
  182. data/test/test_suite/positive/23-url/input.json +7 -0
  183. data/test/test_suite/positive/23-url/output.json +6 -0
  184. data/test/test_suite/positive/23-url/rules.json +6 -0
  185. data/test/test_suite/positive/24-iso_date/input.json +8 -0
  186. data/test/test_suite/positive/24-iso_date/output.json +7 -0
  187. data/test/test_suite/positive/24-iso_date/rules.json +7 -0
  188. data/test/test_suite/positive/30-trim/input.json +5 -0
  189. data/test/test_suite/positive/30-trim/output.json +5 -0
  190. data/test/test_suite/positive/30-trim/rules.json +5 -0
  191. data/test/test_suite/positive/31-to_lc/input.json +6 -0
  192. data/test/test_suite/positive/31-to_lc/output.json +6 -0
  193. data/test/test_suite/positive/31-to_lc/rules.json +6 -0
  194. data/test/test_suite/positive/32-to_uc/input.json +5 -0
  195. data/test/test_suite/positive/32-to_uc/output.json +5 -0
  196. data/test/test_suite/positive/32-to_uc/rules.json +5 -0
  197. data/test/test_suite/positive/33-remove/input.json +5 -0
  198. data/test/test_suite/positive/33-remove/output.json +5 -0
  199. data/test/test_suite/positive/33-remove/rules.json +7 -0
  200. data/test/test_suite/positive/34-leave_only/input.json +5 -0
  201. data/test/test_suite/positive/34-leave_only/output.json +5 -0
  202. data/test/test_suite/positive/34-leave_only/rules.json +7 -0
  203. metadata +476 -0
@@ -0,0 +1,55 @@
1
+ require 'test_helper'
2
+
3
+ class AutoTrimTest < Minitest::Test
4
+ def setup
5
+ @validator = LIVR.new({
6
+ 'code' => 'required',
7
+ 'password' => ['required', { 'min_length' => 3 }],
8
+ 'address' => { 'nested_object' => {
9
+ 'street' => { 'min_length' => 5 },
10
+ }}
11
+ }, 'is_auto_trim')
12
+ end
13
+
14
+ def test_auto_trim_negative
15
+ output = @validator.validate({
16
+ 'code' => ' ',
17
+ 'password' => ' 12 ',
18
+ 'address' => {
19
+ 'street' => ' happ '
20
+ }
21
+ })
22
+
23
+ assert(!output, 'should return false due to validation errors fot trimmed values')
24
+ assert_equal(@validator.get_errors,
25
+ {
26
+ 'code' =>'REQUIRED',
27
+ 'password' => 'TOO_SHORT',
28
+ 'address' => {
29
+ 'street' => 'TOO_SHORT',
30
+ }
31
+ }, 'Should contain error codes'
32
+ )
33
+ end
34
+
35
+ def test_auto_trim_positive
36
+ output = @validator.validate({
37
+ 'code' => ' A ',
38
+ 'password' => ' 123 ',
39
+ 'address' => {
40
+ 'street' => ' hello '
41
+ }
42
+ })
43
+
44
+ assert(!@validator.get_errors, 'Validator should contain no errors')
45
+ assert_equal(output,
46
+ {
47
+ 'code' =>'A',
48
+ 'password' => '123',
49
+ 'address' => {
50
+ 'street' => 'hello',
51
+ }
52
+ }, 'Should contain trimmed data'
53
+ )
54
+ end
55
+ end
@@ -0,0 +1,63 @@
1
+ require 'test_helper'
2
+
3
+ class RulesRegistrationTest < Minitest::Test
4
+ def setup
5
+ LIVR.register_default_rules({
6
+ 'strong_password' => lambda do |args|
7
+ lambda do |value, unuse, unuse_|
8
+ return if value.nil? or value.eql?('')
9
+ return 'WEAK_PASSWORD' if value.to_s.length < 6
10
+ end
11
+ end
12
+ })
13
+
14
+ @validator = LIVR.new({
15
+ 'code' => 'alphanumeric',
16
+ 'password' => 'strong_password',
17
+ 'address' => { 'nested_object' => {
18
+ 'street' => 'alphanumeric',
19
+ 'password' => 'strong_password'
20
+ }}
21
+ })
22
+
23
+ @validator.register_rules({
24
+ 'alphanumeric' => lambda do |args|
25
+ lambda do |value, unuse, unuse_|
26
+ return if value.nil? or value.eql?('')
27
+ return 'NOT_ALPHANUMERIC' unless $value =~ /^[a-z0-9]+$/
28
+ end
29
+ end
30
+ })
31
+ end
32
+
33
+ def test_rules_registration
34
+ default_rules = LIVR.get_default_rules
35
+ assert(default_rules['strong_password'].respond_to?(:call), 'Default rules should contain "strong_password" rule')
36
+ assert(!default_rules['alphanumeric'].respond_to?(:call), 'Default rules should not contain "alphanumeric" rule')
37
+
38
+ rules = @validator.get_rules
39
+ assert(rules['strong_password'].respond_to?(:call), 'Validator rules should contain "strong_password" rule')
40
+ assert(rules['alphanumeric'].respond_to?(:call), 'Validator rules should contain "alphanumeric" rule')
41
+
42
+ output = @validator.validate({
43
+ 'code' => '!qwe',
44
+ 'password' => 123,
45
+ 'address' => {
46
+ 'street' => 'Some Street!',
47
+ 'password' => 'qwer'
48
+ }
49
+ })
50
+
51
+ assert(!output, 'should return false due to validation errors')
52
+ assert_equal(@validator.get_errors,
53
+ {
54
+ 'code' =>'NOT_ALPHANUMERIC',
55
+ 'password' => 'WEAK_PASSWORD',
56
+ 'address' => {
57
+ 'street' => 'NOT_ALPHANUMERIC',
58
+ 'password' => 'WEAK_PASSWORD'
59
+ }
60
+ }, 'Should contain error codes'
61
+ )
62
+ end
63
+ end
@@ -0,0 +1,44 @@
1
+ require 'test_helper'
2
+
3
+ class CustomFiltersTest < Minitest::Test
4
+ def setup
5
+ LIVR.register_default_rules({
6
+ 'my_ucfirst' => lambda do |args|
7
+ lambda do |value, unuse, output|
8
+ return if value.nil? or value.eql?('')
9
+ output.push(value.capitalize!)
10
+ return nil
11
+ end
12
+ end,
13
+ 'my_lc' => lambda do |args|
14
+ lambda do |value, unuse, output|
15
+ return if value.nil? or value.eql?('')
16
+ output.push(value.downcase)
17
+ return nil
18
+ end
19
+ end
20
+ })
21
+ end
22
+
23
+ def test_custom_filters
24
+ validator = LIVR.new({
25
+ 'word1' => ['my_lc', 'my_ucfirst'],
26
+ 'word2' => ['my_lc'],
27
+ 'word3' => ['my_ucfirst'],
28
+ })
29
+
30
+ output = validator.validate({
31
+ 'word1' => 'wordOne',
32
+ 'word2' => 'wordTwo',
33
+ 'word3' => 'wordThree',
34
+ })
35
+
36
+ assert_equal(output,
37
+ {
38
+ 'word1' => 'Wordone',
39
+ 'word2' => 'wordtwo',
40
+ 'word3' => 'Wordthree',
41
+ }, 'Should apply changes to values'
42
+ )
43
+ end
44
+ end
@@ -0,0 +1,6 @@
1
+ require "minitest/reporters"
2
+ require 'minitest/autorun'
3
+ require 'json'
4
+ require 'LIVR'
5
+
6
+ Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
@@ -0,0 +1,12 @@
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
+ ]
@@ -0,0 +1,6 @@
1
+ {
2
+ "age3": "TOO_LOW",
3
+ "age4": "NOT_POSITIVE_INTEGER",
4
+ "age3_custom_error": "WRONG_AGE",
5
+ "age4_custom_error": "WRONG_AGE"
6
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "age1": 32,
3
+ "age2": 33,
4
+ "age3": 15,
5
+ "age4": -20,
6
+ "age1_custom_error": 37,
7
+ "age2_custom_error": 38,
8
+ "age3_custom_error": 16,
9
+ "age4_custom_error": -10,
10
+ "extra_field": 12
11
+ }
@@ -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,8 @@
1
+ {
2
+ "address": {
3
+ "street": "REQUIRED",
4
+ "zip": "NOT_POSITIVE_INTEGER",
5
+ "city": "NOT_ALLOWED_VALUE"
6
+ },
7
+ "address_custom_error": "WRONG_ADDRESS"
8
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "address": {
3
+ "street": "",
4
+ "zip": -1232131,
5
+ "city": "Moscow"
6
+ },
7
+ "address_custom_error": {
8
+ "street": "My street",
9
+ "zip": "12312",
10
+ "city": "Moscow"
11
+ },
12
+ "extra_field": 12
13
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "address": "address",
3
+ "address_custom_error": "address_with_custom_error"
4
+ }
@@ -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
+ ]
@@ -0,0 +1,8 @@
1
+ {
2
+ "user": {
3
+ "name": "REQUIRED",
4
+ "age1": "TOO_LOW",
5
+ "age2": "WRONG_AGE"
6
+ },
7
+ "user_custom_error": "WRONG_USER"
8
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "user": {
3
+ "name": "",
4
+ "age1": 15,
5
+ "age2": 15,
6
+ "extra_field": "som value"
7
+ },
8
+ "user_custom_error": {
9
+ "name": "koorchik",
10
+ "age1": 15,
11
+ "age2": 22
12
+ },
13
+ "extra_field": 12
14
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "user": "user",
3
+ "user_custom_error": ["user_with_custom_error"]
4
+ }
@@ -0,0 +1,12 @@
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
+ ]
@@ -0,0 +1,11 @@
1
+ {
2
+ "age1": 32,
3
+ "age2": 33,
4
+ "age3": 35,
5
+ "age4": 36,
6
+ "age1_custom_error": 37,
7
+ "age2_custom_error": 38,
8
+ "age3_custom_error": 100,
9
+ "age4_custom_error": 110,
10
+ "extra_field": 12
11
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "age1": 32,
3
+ "age2": 33,
4
+ "age3": 35,
5
+ "age4": 36,
6
+ "age1_custom_error": 37,
7
+ "age2_custom_error": 38,
8
+ "age3_custom_error": 100,
9
+ "age4_custom_error": 110
10
+ }
@@ -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,13 @@
1
+ {
2
+ "address": {
3
+ "street": "My street",
4
+ "zip": 1232131,
5
+ "city": "Kiev"
6
+ },
7
+ "address_custom_error": {
8
+ "street": "My street",
9
+ "zip": "12312",
10
+ "city": "Kharkiv"
11
+ },
12
+ "extra_field": 12
13
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "address": {
3
+ "street": "My street",
4
+ "zip": 1232131,
5
+ "city": "Kiev"
6
+ },
7
+ "address_custom_error": {
8
+ "street": "My street",
9
+ "zip": "12312",
10
+ "city": "Kharkiv"
11
+ }
12
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "address": "address",
3
+ "address_custom_error": "address_with_custom_error"
4
+ }
@@ -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
+ ]