README.md
# Hash Validator
[![Gem](https://img.shields.io/gem/v/hash_validator.svg)](https://rubygems.org/gems/hash_validator)
[![Travis](https://travis-ci.org/jamesbrooks/hash_validator.svg)](https://travis-ci.org/jamesbrooks/hash_validator)
[![Coveralls](https://img.shields.io/coveralls/jamesbrooks/hash_validator.svg)](https://coveralls.io/r/jamesbrooks/hash_validator)
[![Maintainability](https://api.codeclimate.com/v1/badges/dc6edc1b240860c5f5d9/maintainability)](https://codeclimate.com/github/JamesBrooks/hash_validator/maintainability)
Ruby library to validate hashes (Hash) against user-defined requirements
## Installation
Add this line to your application's Gemfile:
gem 'hash_validator'
And then execute:
$ bundle
Or install it yourself as:
$ gem install hash_validator
## Example
```ruby
# Validations hash
validations = {
user: {
first_name: String,
last_name: 'string',
age: 'numeric',
likes: 'array'
}
}
# Hash to validate
hash = {
foo: 1,
bar: 'baz',
user: {
first_name: 'James',
last_name: 12345
}
}
validator = HashValidator.validate(hash, validations)
validator.valid?
# => false
validator.errors
# {
:user => {
:last_name => "string required",
:age => "numeric required",
:likes => "array required"
}
}
```
## Usage
Define a validation hash which will be used to validate. This has can be nested as deeply as required using the following values to validate specific value types:
* `array`
* `boolean`
* `complex`
* `enumerable`
* `float`
* `integer`
* `numeric`
* `range`
* `rational`
* `regexp`
* `string`
* `symbol`
* `time`
* `required`: just requires any value to be present for the designated key.
* hashes are validates by nesting validations, or if just the presence of a hash is required `{}` can be used.
On top of the pre-defined simple types, classes can be used directly (e.g. String) to validate the presence of a value of a desired class.
Additional validations exist to validate beyond simple typing, such as:
* An Enumerable instance: validates that the value is contained within the supplied enumerable.
* A lambda/Proc instance: validates that the lambda/proc returns true when the value is supplied (lambdas must accept only one argument).
* A regexp instance: validates that the regex returns a match when the value is supplied (Regexp#match(value) is not nil).
* `email`: email address validation (string + email address).
Example use-cases include Ruby APIs (I'm currently using it in a Rails API that I'm building for better error responses to developers).
## Custom validations
Allows custom defined validations (must inherit from `HashValidator::Validator::Base`). Example:
```ruby
# Define our custom validator
class HashValidator::Validator::OddValidator < HashValidator::Validator::Base
def initialize
super('odd') # The name of the validator
end
def validate(key, value, validations, errors)
unless value.is_a?(Integer) && value.odd?
errors[key] = presence_error_message
end
end
end
# Add the validator
HashValidator.append_validator(HashValidator::Validator::OddValidator.new)
# Now the validator can be used! e.g.
validator = HashValidator.validate({ age: 27 }, { age: 'odd' })
validator.valid? # => true
validator.errors # => {}
```
## Multiple validators
Multiple validators can be applied to a single key, e.g.
```ruby
HashValidator.validate(
{ foo: 73 },
{ foo: HashValidator.multiple('numeric', 1..100) }
)
```
This is particularly useful when defining custom validators.
## Contributing
1. Fork it
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request