hashy_validator 0.1.1 → 0.1.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +36 -0
- data/README.md +60 -0
- data/hashy_validator.gemspec +29 -0
- data/lib/hashy_validator/hashy_array_validator.rb +76 -0
- data/lib/hashy_validator/hashy_value_validator.rb +42 -0
- data/lib/hashy_validator/version.rb +10 -0
- data/lib/hashy_validator.rb +4 -0
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb2d96afac20d3a5de238c5909ba7001ebfabdbbb790ea9b0ead248853018005
|
4
|
+
data.tar.gz: 299cb764bb7dfcd2bc69ef07cd791d8b76726b69eb0f7a12a0f28c7b1d71d55f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6d27b7aa8aae40311a1526fd5fd70c38f962e646d5a73618295f24b874e29cca0d76661111dfbeb7fccf86ccbc5e199201ac0ef4dea5293d0e8838ea2615f401
|
7
|
+
data.tar.gz: 6a2c04d418e28ad116b0d70b2b6d31c58bd0ffff4aa9aaf9e1f3648f8cacbcc4556a90894bb835a7da4b6430d20b42a1e84a9b4a51e64345e2cf4f0b971f76af
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
All notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
|
+
|
8
|
+
### [0.1.3](https://www.github.com/flecto-io/hashy-validator/compare/v0.1.2...v0.1.3) (2024-01-13)
|
9
|
+
|
10
|
+
|
11
|
+
### Bug Fixes
|
12
|
+
|
13
|
+
* changelog ([6b8c151](https://www.github.com/flecto-io/hashy-validator/commit/6b8c15105bd085dafa6358f27f780ad4826a42e7))
|
14
|
+
* organization ([abd87b7](https://www.github.com/flecto-io/hashy-validator/commit/abd87b7a04d092b87f0d400ac087261bfc4bd07e))
|
15
|
+
|
16
|
+
### [0.1.1](https://www.github.com/flecto-io/hashy-validator/compare/v0.1.0...v0.1.1) (2024-01-11)
|
17
|
+
|
18
|
+
### Bug Fixes
|
19
|
+
|
20
|
+
* not initialized Class::HashValidator ([798ba63](https://www.github.com/flecto-io/hashy-validator/commit/798ba637885a4c9863351506b10d689a5f1c8a60))
|
21
|
+
|
22
|
+
## 0.1.0 (2024-01-11)
|
23
|
+
|
24
|
+
|
25
|
+
### Bug Fixes
|
26
|
+
|
27
|
+
* Code Climate coverage reporter is not compatible ([8df1ec3](https://www.github.com/flecto-io/hashy-validator/commit/8df1ec308a940a8f84e01456e1f9d0851c15035b))
|
28
|
+
* unique validation ([3c9a6dc](https://www.github.com/flecto-io/hashy-validator/commit/3c9a6dcc02d43cfb81103a52b3632d0d51c0329e))
|
29
|
+
- Validation lib
|
30
|
+
- Version module
|
31
|
+
|
32
|
+
## [Unreleased]
|
33
|
+
|
34
|
+
## Fixed
|
35
|
+
|
36
|
+
- Class::HashValidator not initialized
|
data/README.md
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
<div style="display: flex">
|
2
|
+
<a href="https://codeclimate.com/github/flecto-io/hashy-validator/maintainability"><img src="https://api.codeclimate.com/v1/badges/8818718c3f8ac08a1f05/maintainability" /></a>
|
3
|
+
<a href="https://codeclimate.com/github/flecto-io/hashy-validator/test_coverage"><img src="https://api.codeclimate.com/v1/badges/8818718c3f8ac08a1f05/test_coverage" /></a>
|
4
|
+
</div>
|
5
|
+
|
6
|
+
# HashyValidator
|
7
|
+
|
8
|
+
HashyValidator is a custom Ruby on Rails validator designed to validate an array of hashes based on [HashValidator](https://github.com/jamesbrooks/hash_validator) criteria but also the following new criteria:
|
9
|
+
- `unique`: A value within each hash that has to be unique across the whole array
|
10
|
+
|
11
|
+
|
12
|
+
## Installation
|
13
|
+
|
14
|
+
Add this line to your application's Gemfile:
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
gem 'hashy_validator'
|
18
|
+
```
|
19
|
+
|
20
|
+
<b>THIS GEM IS NOT READY FOR PRODUCTION YET!</b>
|
21
|
+
|
22
|
+
And then execute:
|
23
|
+
|
24
|
+
```bash
|
25
|
+
$ bundle install
|
26
|
+
```
|
27
|
+
|
28
|
+
Or install it yourself as:
|
29
|
+
|
30
|
+
```bash
|
31
|
+
$ gem install hashy_validator
|
32
|
+
```
|
33
|
+
|
34
|
+
## Usage
|
35
|
+
|
36
|
+
To leverage HashyValidator in your Rails model, follow these steps:
|
37
|
+
|
38
|
+
1. Add the gem to your Gemfile and run `bundle install` as mentioned above.
|
39
|
+
|
40
|
+
2. In your model, use the `validate` method to apply the `hashy_array` validation.
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
class YourModel < ApplicationRecord
|
44
|
+
validates :pricing, hashy_array: {
|
45
|
+
minutes: HashValidator.multiple('required', 'integer', 'unique'),
|
46
|
+
price_cents: HashValidator.multiple('required', 'integer')
|
47
|
+
}
|
48
|
+
end
|
49
|
+
```
|
50
|
+
|
51
|
+
Customize each entry validators according to [HashValidator](https://github.com/jamesbrooks/hash_validator) criteria
|
52
|
+
|
53
|
+
## Contributing
|
54
|
+
|
55
|
+
Bug reports and pull requests are welcome. This project is intended to be a safe, welcoming space for collaboration. To ease up contribution we provide a VSCode _devcontainer_ to run the project in a container.
|
56
|
+
Before submitting a PR do not forget to run all tests by doing `rake test` or against a single file `ruby -I. test/validation_sqlite_test.rb`.
|
57
|
+
|
58
|
+
## License
|
59
|
+
|
60
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative "lib/hashy_validator/version"
|
2
|
+
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = 'hashy_validator'
|
5
|
+
spec.version = HashyValidator::Version::STRING
|
6
|
+
spec.date = '2013-12-31'
|
7
|
+
spec.summary = 'Custom Active Model validator for validating arrays of hashes'
|
8
|
+
spec.description = 'The hashy_validator gem provides the HashyArrayValidator, a custom Active Model validator designed to validate arrays of hashes within ActiveRecord model attributes. Utilizing the HashValidator gem, on top of hash_validator gem. The gem includes a comprehensive test suite using the minitest framework.'
|
9
|
+
spec.authors = ['Flecto Team']
|
10
|
+
spec.email = 'dev@flecto.io'
|
11
|
+
|
12
|
+
|
13
|
+
spec.required_ruby_version = '>= 2.0.0'
|
14
|
+
spec.require_paths = ["lib"]
|
15
|
+
spec.files = Dir["{lib}/**/*"] + ["README.md", "CHANGELOG.md", "hashy_validator.gemspec"]
|
16
|
+
|
17
|
+
spec.add_dependency "activerecord", ">= 6.0.0", "<= 7.2.0"
|
18
|
+
spec.add_dependency "hash_validator", "~> 1.1"
|
19
|
+
|
20
|
+
spec.add_development_dependency 'sqlite3', '~> 1.4'
|
21
|
+
spec.add_development_dependency 'rake', '~> 13.1.0'
|
22
|
+
spec.add_development_dependency 'simplecov', '0.17.1'
|
23
|
+
|
24
|
+
if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("3")
|
25
|
+
spec.add_development_dependency 'minitest', '>= 5.15.0', '< 5.16'
|
26
|
+
else
|
27
|
+
spec.add_development_dependency 'minitest', '>= 5.15.0'
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
class HashyArrayValidator < ActiveModel::EachValidator
|
2
|
+
def validate_each(record, attribute, value)
|
3
|
+
instance_value = HashyValueValidator.new(value)
|
4
|
+
unless instance_value.is_valid
|
5
|
+
record.errors.add(attribute, instance_value.reason)
|
6
|
+
return false
|
7
|
+
end
|
8
|
+
|
9
|
+
value = instance_value.value
|
10
|
+
|
11
|
+
# look for boolean and unique validator entries
|
12
|
+
unique_attrs = {}
|
13
|
+
boolean_attrs = []
|
14
|
+
validations =
|
15
|
+
# force validator keys to be strings
|
16
|
+
options.stringify_keys.map do |val_attr,val|
|
17
|
+
if (val.is_a?(HashValidator::Validations::Multiple) && val.validations.include?('boolean')) || (val.is_a?(String) && val == 'boolean')
|
18
|
+
boolean_attrs << val_attr
|
19
|
+
[val_attr, val]
|
20
|
+
elsif val.is_a?(HashValidator::Validations::Multiple) && val.validations.include?('unique')
|
21
|
+
# if unique key present, then remove that entry (since its not from HashValidator standard) and keep its history
|
22
|
+
unique_attrs[val_attr] ||= []
|
23
|
+
# we have to make a new object to remove the unique entry,
|
24
|
+
# because deleting it directly from the original object (val) would result into deleting the verification forever
|
25
|
+
new_val = HashValidator::Validations::Multiple.new(val.validations.reject{|v| v == 'unique'})
|
26
|
+
# return the value
|
27
|
+
val.validations.blank? ? nil : [val_attr, new_val]
|
28
|
+
elsif val.is_a?(String) && val == 'unique'
|
29
|
+
# same as above but substring
|
30
|
+
unique_attrs[val_attr] ||= []
|
31
|
+
nil
|
32
|
+
else
|
33
|
+
[val_attr, val]
|
34
|
+
end
|
35
|
+
end.compact.to_h
|
36
|
+
|
37
|
+
# force all array entries to have string keys
|
38
|
+
# discard keys that do not have validators
|
39
|
+
value = value.map{ |e| e.stringify_keys.slice(*validations.keys) }
|
40
|
+
|
41
|
+
# we validate each object in the array
|
42
|
+
value.each do |t|
|
43
|
+
# if boolean found as any of the validations we force value to boolean - if present
|
44
|
+
boolean_attrs.each do |boolean_attr|
|
45
|
+
t[boolean_attr] = get_boolean_value(t[boolean_attr]) if t.key?(boolean_attr)
|
46
|
+
end
|
47
|
+
|
48
|
+
# keep track of unique values and add error if needed
|
49
|
+
unique_attrs.keys.each do |unique_attr|
|
50
|
+
if unique_attrs[unique_attr].include?(t[unique_attr])
|
51
|
+
record.errors.add(attribute, "'#{unique_attr}' not unique")
|
52
|
+
else
|
53
|
+
unique_attrs[unique_attr] << t[unique_attr]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# use default hash validator
|
58
|
+
validator = HashValidator.validate(t, validations)
|
59
|
+
unless validator.valid?
|
60
|
+
validator.errors.each { |k,v| record.errors.add(attribute, "'#{k.to_s}' #{v}") }
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# update the value even if errors found
|
65
|
+
# we use send write param so we also support attr_accessor attributes
|
66
|
+
record.send("#{attribute}=", value)
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def get_boolean_value(value)
|
72
|
+
return true if value == true || value == 'true'
|
73
|
+
return false if value == false || value == 'false'
|
74
|
+
nil
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
class HashyValueValidator
|
2
|
+
def initialize(value)
|
3
|
+
@value = value.blank? ? [] : value
|
4
|
+
@valid = true
|
5
|
+
@reason = nil
|
6
|
+
|
7
|
+
check_parse_value
|
8
|
+
check_is_array
|
9
|
+
|
10
|
+
@value
|
11
|
+
end
|
12
|
+
|
13
|
+
def is_valid
|
14
|
+
@valid
|
15
|
+
end
|
16
|
+
|
17
|
+
def value
|
18
|
+
@value
|
19
|
+
end
|
20
|
+
|
21
|
+
def reason
|
22
|
+
@reason
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def check_parse_value
|
28
|
+
begin
|
29
|
+
@value = JSON.parse(@value) if @value.is_a?(String)
|
30
|
+
rescue JSON::ParserError
|
31
|
+
@valid = false
|
32
|
+
@reason = :invalid
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def check_is_array
|
37
|
+
unless @value.is_a?(Array)
|
38
|
+
@valid = false
|
39
|
+
@reason = :not_an_array
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hashy_validator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Flecto Team
|
@@ -108,7 +108,14 @@ email: dev@flecto.io
|
|
108
108
|
executables: []
|
109
109
|
extensions: []
|
110
110
|
extra_rdoc_files: []
|
111
|
-
files:
|
111
|
+
files:
|
112
|
+
- CHANGELOG.md
|
113
|
+
- README.md
|
114
|
+
- hashy_validator.gemspec
|
115
|
+
- lib/hashy_validator.rb
|
116
|
+
- lib/hashy_validator/hashy_array_validator.rb
|
117
|
+
- lib/hashy_validator/hashy_value_validator.rb
|
118
|
+
- lib/hashy_validator/version.rb
|
112
119
|
homepage:
|
113
120
|
licenses: []
|
114
121
|
metadata: {}
|