hash_validator 1.1.1 → 2.0.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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -1
  3. data/.ruby-version +1 -1
  4. data/README.md +315 -56
  5. data/hash_validator.gemspec +1 -1
  6. data/lib/hash_validator/configuration.rb +16 -0
  7. data/lib/hash_validator/validators/alpha_validator.rb +15 -0
  8. data/lib/hash_validator/validators/alphanumeric_validator.rb +15 -0
  9. data/lib/hash_validator/validators/array_validator.rb +1 -1
  10. data/lib/hash_validator/validators/base.rb +28 -3
  11. data/lib/hash_validator/validators/boolean_validator.rb +3 -5
  12. data/lib/hash_validator/validators/class_validator.rb +1 -1
  13. data/lib/hash_validator/validators/digits_validator.rb +15 -0
  14. data/lib/hash_validator/validators/dynamic_func_validator.rb +26 -0
  15. data/lib/hash_validator/validators/dynamic_pattern_validator.rb +23 -0
  16. data/lib/hash_validator/validators/email_validator.rb +4 -6
  17. data/lib/hash_validator/validators/enumerable_validator.rb +4 -6
  18. data/lib/hash_validator/validators/hash_validator.rb +8 -3
  19. data/lib/hash_validator/validators/hex_color_validator.rb +15 -0
  20. data/lib/hash_validator/validators/ip_validator.rb +22 -0
  21. data/lib/hash_validator/validators/ipv4_validator.rb +18 -0
  22. data/lib/hash_validator/validators/ipv6_validator.rb +22 -0
  23. data/lib/hash_validator/validators/json_validator.rb +21 -0
  24. data/lib/hash_validator/validators/lambda_validator.rb +5 -8
  25. data/lib/hash_validator/validators/many_validator.rb +3 -3
  26. data/lib/hash_validator/validators/multiple_validator.rb +1 -1
  27. data/lib/hash_validator/validators/optional_validator.rb +1 -1
  28. data/lib/hash_validator/validators/presence_validator.rb +4 -6
  29. data/lib/hash_validator/validators/regex_validator.rb +4 -6
  30. data/lib/hash_validator/validators/simple_type_validators.rb +1 -1
  31. data/lib/hash_validator/validators/simple_validator.rb +2 -4
  32. data/lib/hash_validator/validators/url_validator.rb +21 -0
  33. data/lib/hash_validator/validators.rb +46 -4
  34. data/lib/hash_validator/version.rb +1 -1
  35. data/lib/hash_validator.rb +1 -0
  36. data/spec/configuration_spec.rb +189 -0
  37. data/spec/hash_validator_spec.rb +4 -4
  38. data/spec/validators/alpha_validator_spec.rb +93 -0
  39. data/spec/validators/alphanumeric_validator_spec.rb +99 -0
  40. data/spec/validators/base_spec.rb +2 -2
  41. data/spec/validators/digits_validator_spec.rb +99 -0
  42. data/spec/validators/dynamic_func_validator_spec.rb +252 -0
  43. data/spec/validators/dynamic_pattern_validator_spec.rb +150 -0
  44. data/spec/validators/hash_validator_spec.rb +102 -0
  45. data/spec/validators/hex_color_validator_spec.rb +111 -0
  46. data/spec/validators/ip_validator_spec.rb +105 -0
  47. data/spec/validators/ipv4_validator_spec.rb +99 -0
  48. data/spec/validators/ipv6_validator_spec.rb +99 -0
  49. data/spec/validators/json_validator_spec.rb +88 -0
  50. data/spec/validators/url_validator_spec.rb +75 -0
  51. data/spec/validators/user_defined_spec.rb +2 -2
  52. metadata +42 -4
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+
3
+ describe HashValidator::Validator::JsonValidator do
4
+ let(:validator) { HashValidator::Validator::JsonValidator.new }
5
+
6
+ context 'valid JSON' do
7
+ it 'validates simple JSON objects' do
8
+ errors = {}
9
+ validator.validate('key', '{"name": "test"}', {}, errors)
10
+ expect(errors).to be_empty
11
+ end
12
+
13
+ it 'validates JSON arrays' do
14
+ errors = {}
15
+ validator.validate('key', '[1, 2, 3]', {}, errors)
16
+ expect(errors).to be_empty
17
+ end
18
+
19
+ it 'validates JSON strings' do
20
+ errors = {}
21
+ validator.validate('key', '"hello world"', {}, errors)
22
+ expect(errors).to be_empty
23
+ end
24
+
25
+ it 'validates JSON numbers' do
26
+ errors = {}
27
+ validator.validate('key', '42', {}, errors)
28
+ expect(errors).to be_empty
29
+ end
30
+
31
+ it 'validates JSON booleans' do
32
+ errors = {}
33
+ validator.validate('key', 'true', {}, errors)
34
+ expect(errors).to be_empty
35
+ end
36
+
37
+ it 'validates JSON null' do
38
+ errors = {}
39
+ validator.validate('key', 'null', {}, errors)
40
+ expect(errors).to be_empty
41
+ end
42
+
43
+ it 'validates complex nested JSON' do
44
+ errors = {}
45
+ json_string = '{"users": [{"name": "John", "age": 30}, {"name": "Jane", "age": 25}]}'
46
+ validator.validate('key', json_string, {}, errors)
47
+ expect(errors).to be_empty
48
+ end
49
+ end
50
+
51
+ context 'invalid JSON' do
52
+ it 'rejects non-string values' do
53
+ errors = {}
54
+ validator.validate('key', 123, {}, errors)
55
+ expect(errors['key']).to eq('is not valid JSON')
56
+ end
57
+
58
+ it 'rejects nil values' do
59
+ errors = {}
60
+ validator.validate('key', nil, {}, errors)
61
+ expect(errors['key']).to eq('is not valid JSON')
62
+ end
63
+
64
+ it 'rejects malformed JSON' do
65
+ errors = {}
66
+ validator.validate('key', '{"name": "test"', {}, errors)
67
+ expect(errors['key']).to eq('is not valid JSON')
68
+ end
69
+
70
+ it 'rejects invalid JSON syntax' do
71
+ errors = {}
72
+ validator.validate('key', '{name: "test"}', {}, errors)
73
+ expect(errors['key']).to eq('is not valid JSON')
74
+ end
75
+
76
+ it 'rejects empty strings' do
77
+ errors = {}
78
+ validator.validate('key', '', {}, errors)
79
+ expect(errors['key']).to eq('is not valid JSON')
80
+ end
81
+
82
+ it 'rejects plain text' do
83
+ errors = {}
84
+ validator.validate('key', 'hello world', {}, errors)
85
+ expect(errors['key']).to eq('is not valid JSON')
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ describe HashValidator::Validator::UrlValidator do
4
+ let(:validator) { HashValidator::Validator::UrlValidator.new }
5
+
6
+ context 'valid URLs' do
7
+ it 'validates http URLs' do
8
+ errors = {}
9
+ validator.validate('key', 'http://example.com', {}, errors)
10
+ expect(errors).to be_empty
11
+ end
12
+
13
+ it 'validates https URLs' do
14
+ errors = {}
15
+ validator.validate('key', 'https://example.com', {}, errors)
16
+ expect(errors).to be_empty
17
+ end
18
+
19
+ it 'validates ftp URLs' do
20
+ errors = {}
21
+ validator.validate('key', 'ftp://ftp.example.com', {}, errors)
22
+ expect(errors).to be_empty
23
+ end
24
+
25
+ it 'validates URLs with paths' do
26
+ errors = {}
27
+ validator.validate('key', 'https://example.com/path/to/resource', {}, errors)
28
+ expect(errors).to be_empty
29
+ end
30
+
31
+ it 'validates URLs with query parameters' do
32
+ errors = {}
33
+ validator.validate('key', 'https://example.com/search?q=test&page=1', {}, errors)
34
+ expect(errors).to be_empty
35
+ end
36
+ end
37
+
38
+ context 'invalid URLs' do
39
+ it 'rejects non-string values' do
40
+ errors = {}
41
+ validator.validate('key', 123, {}, errors)
42
+ expect(errors['key']).to eq('is not a valid URL')
43
+ end
44
+
45
+ it 'rejects nil values' do
46
+ errors = {}
47
+ validator.validate('key', nil, {}, errors)
48
+ expect(errors['key']).to eq('is not a valid URL')
49
+ end
50
+
51
+ it 'rejects malformed URLs' do
52
+ errors = {}
53
+ validator.validate('key', 'not a url', {}, errors)
54
+ expect(errors['key']).to eq('is not a valid URL')
55
+ end
56
+
57
+ it 'rejects URLs without schemes' do
58
+ errors = {}
59
+ validator.validate('key', 'example.com', {}, errors)
60
+ expect(errors['key']).to eq('is not a valid URL')
61
+ end
62
+
63
+ it 'rejects unsupported schemes' do
64
+ errors = {}
65
+ validator.validate('key', 'mailto:test@example.com', {}, errors)
66
+ expect(errors['key']).to eq('is not a valid URL')
67
+ end
68
+
69
+ it 'rejects empty strings' do
70
+ errors = {}
71
+ validator.validate('key', '', {}, errors)
72
+ expect(errors['key']).to eq('is not a valid URL')
73
+ end
74
+ end
75
+ end
@@ -11,7 +11,7 @@ describe 'User-defined validator' do
11
11
 
12
12
  def validate(key, value, validations, errors)
13
13
  unless value.is_a?(Integer) && value.odd?
14
- errors[key] = presence_error_message
14
+ errors[key] = error_message
15
15
  end
16
16
  end
17
17
  end
@@ -72,7 +72,7 @@ describe 'User-defined validator' do
72
72
  end
73
73
 
74
74
  describe 'Integrating with the entire validation system' do
75
- before { HashValidator.append_validator(validator) rescue nil } # rescue to prevent: validators need to have unique names
75
+ before { HashValidator.add_validator(validator) rescue nil } # rescue to prevent: validators need to have unique names
76
76
 
77
77
  it 'can be looked up using #validator_for' do
78
78
  expect(HashValidator.validator_for('odd')).to be_a_kind_of(HashValidator::Validator::OddValidator)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hash_validator
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Brooks
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-01-14 00:00:00.000000000 Z
11
+ date: 2025-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -70,18 +70,29 @@ files:
70
70
  - hash_validator.gemspec
71
71
  - lib/hash_validator.rb
72
72
  - lib/hash_validator/base.rb
73
+ - lib/hash_validator/configuration.rb
73
74
  - lib/hash_validator/validations.rb
74
75
  - lib/hash_validator/validations/many.rb
75
76
  - lib/hash_validator/validations/multiple.rb
76
77
  - lib/hash_validator/validations/optional.rb
77
78
  - lib/hash_validator/validators.rb
79
+ - lib/hash_validator/validators/alpha_validator.rb
80
+ - lib/hash_validator/validators/alphanumeric_validator.rb
78
81
  - lib/hash_validator/validators/array_validator.rb
79
82
  - lib/hash_validator/validators/base.rb
80
83
  - lib/hash_validator/validators/boolean_validator.rb
81
84
  - lib/hash_validator/validators/class_validator.rb
85
+ - lib/hash_validator/validators/digits_validator.rb
86
+ - lib/hash_validator/validators/dynamic_func_validator.rb
87
+ - lib/hash_validator/validators/dynamic_pattern_validator.rb
82
88
  - lib/hash_validator/validators/email_validator.rb
83
89
  - lib/hash_validator/validators/enumerable_validator.rb
84
90
  - lib/hash_validator/validators/hash_validator.rb
91
+ - lib/hash_validator/validators/hex_color_validator.rb
92
+ - lib/hash_validator/validators/ip_validator.rb
93
+ - lib/hash_validator/validators/ipv4_validator.rb
94
+ - lib/hash_validator/validators/ipv6_validator.rb
95
+ - lib/hash_validator/validators/json_validator.rb
85
96
  - lib/hash_validator/validators/lambda_validator.rb
86
97
  - lib/hash_validator/validators/many_validator.rb
87
98
  - lib/hash_validator/validators/multiple_validator.rb
@@ -90,16 +101,29 @@ files:
90
101
  - lib/hash_validator/validators/regex_validator.rb
91
102
  - lib/hash_validator/validators/simple_type_validators.rb
92
103
  - lib/hash_validator/validators/simple_validator.rb
104
+ - lib/hash_validator/validators/url_validator.rb
93
105
  - lib/hash_validator/version.rb
106
+ - spec/configuration_spec.rb
94
107
  - spec/hash_validator_spec.rb
95
108
  - spec/hash_validator_spec_helper.rb
96
109
  - spec/spec_helper.rb
110
+ - spec/validators/alpha_validator_spec.rb
111
+ - spec/validators/alphanumeric_validator_spec.rb
97
112
  - spec/validators/array_spec.rb
98
113
  - spec/validators/base_spec.rb
99
114
  - spec/validators/boolean_spec.rb
100
115
  - spec/validators/class_spec.rb
116
+ - spec/validators/digits_validator_spec.rb
117
+ - spec/validators/dynamic_func_validator_spec.rb
118
+ - spec/validators/dynamic_pattern_validator_spec.rb
101
119
  - spec/validators/email_spec.rb
120
+ - spec/validators/hash_validator_spec.rb
121
+ - spec/validators/hex_color_validator_spec.rb
102
122
  - spec/validators/in_enumerable_spec.rb
123
+ - spec/validators/ip_validator_spec.rb
124
+ - spec/validators/ipv4_validator_spec.rb
125
+ - spec/validators/ipv6_validator_spec.rb
126
+ - spec/validators/json_validator_spec.rb
103
127
  - spec/validators/lambda_spec.rb
104
128
  - spec/validators/many_spec.rb
105
129
  - spec/validators/multiple_spec.rb
@@ -108,6 +132,7 @@ files:
108
132
  - spec/validators/regexp_spec.rb
109
133
  - spec/validators/simple_spec.rb
110
134
  - spec/validators/simple_types_spec.rb
135
+ - spec/validators/url_validator_spec.rb
111
136
  - spec/validators/user_defined_spec.rb
112
137
  homepage: https://github.com/JamesBrooks/hash_validator
113
138
  licenses:
@@ -121,27 +146,39 @@ required_ruby_version: !ruby/object:Gem::Requirement
121
146
  requirements:
122
147
  - - ">="
123
148
  - !ruby/object:Gem::Version
124
- version: 2.0.0
149
+ version: 3.0.0
125
150
  required_rubygems_version: !ruby/object:Gem::Requirement
126
151
  requirements:
127
152
  - - ">="
128
153
  - !ruby/object:Gem::Version
129
154
  version: '0'
130
155
  requirements: []
131
- rubygems_version: 3.5.23
156
+ rubygems_version: 3.2.33
132
157
  signing_key:
133
158
  specification_version: 4
134
159
  summary: Ruby library to validate hashes (Hash) against user-defined requirements
135
160
  test_files:
161
+ - spec/configuration_spec.rb
136
162
  - spec/hash_validator_spec.rb
137
163
  - spec/hash_validator_spec_helper.rb
138
164
  - spec/spec_helper.rb
165
+ - spec/validators/alpha_validator_spec.rb
166
+ - spec/validators/alphanumeric_validator_spec.rb
139
167
  - spec/validators/array_spec.rb
140
168
  - spec/validators/base_spec.rb
141
169
  - spec/validators/boolean_spec.rb
142
170
  - spec/validators/class_spec.rb
171
+ - spec/validators/digits_validator_spec.rb
172
+ - spec/validators/dynamic_func_validator_spec.rb
173
+ - spec/validators/dynamic_pattern_validator_spec.rb
143
174
  - spec/validators/email_spec.rb
175
+ - spec/validators/hash_validator_spec.rb
176
+ - spec/validators/hex_color_validator_spec.rb
144
177
  - spec/validators/in_enumerable_spec.rb
178
+ - spec/validators/ip_validator_spec.rb
179
+ - spec/validators/ipv4_validator_spec.rb
180
+ - spec/validators/ipv6_validator_spec.rb
181
+ - spec/validators/json_validator_spec.rb
145
182
  - spec/validators/lambda_spec.rb
146
183
  - spec/validators/many_spec.rb
147
184
  - spec/validators/multiple_spec.rb
@@ -150,4 +187,5 @@ test_files:
150
187
  - spec/validators/regexp_spec.rb
151
188
  - spec/validators/simple_spec.rb
152
189
  - spec/validators/simple_types_spec.rb
190
+ - spec/validators/url_validator_spec.rb
153
191
  - spec/validators/user_defined_spec.rb