extra_validations 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -0
- data/README.md +48 -6
- data/extra_validations.gemspec +1 -1
- data/lib/extra_validations.rb +1 -0
- data/lib/extra_validations/collection_length_validator.rb +27 -3
- data/lib/extra_validations/collection_validator.rb +31 -0
- data/lib/extra_validations/existence_validator.rb +26 -0
- data/lib/extra_validations/locale/en.yml +1 -0
- data/lib/extra_validations/nested_validator.rb +29 -0
- data/lib/extra_validations/uniqueness_validator.rb +42 -0
- data/lib/extra_validations/version.rb +1 -1
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b6c67fad9b6d632a739ee5597a3587f26c604b0e
|
4
|
+
data.tar.gz: 7c92df5f7924b4da49e673871c93a14f50299602
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3930615ba2c63ca0dc24d2aa078e63eca5b06e2480bd08a7e045a1b9bd3f74e1c32a151d33c7a9e1879d895f5e2eb15d6417ea0ccb07b1ea320e3baf365fd890
|
7
|
+
data.tar.gz: 62bae244afdbb9a59395cb05f0d33f14a49b8a42c0629df4e99e2f50a90c6ca30241725d1db6f40a6826e13548e0281b5f42da2b771c56f4f0264f5798c3d00b
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
# ExtraValidations
|
2
2
|
|
3
|
-
|
3
|
+
[![Build Status][travis_badge]][travis_link]
|
4
|
+
[![Code Climate][cclimate_badge]][cclimate_link]
|
4
5
|
|
5
|
-
|
6
|
+
This gem provides some extra validations for ActiveModel objects.
|
6
7
|
|
7
8
|
## Installation
|
8
9
|
|
@@ -22,18 +23,59 @@ Or install it yourself as:
|
|
22
23
|
|
23
24
|
## Usage
|
24
25
|
|
25
|
-
|
26
|
+
The following validators are available:
|
27
|
+
|
28
|
+
Collection length:
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
validates :attr, collection_length: { in: 1..5 }
|
32
|
+
```
|
33
|
+
|
34
|
+
Collection members validator (ensures that each member of the collection is
|
35
|
+
valid):
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
validates :attr, collection: true
|
39
|
+
```
|
40
|
+
|
41
|
+
Existence validator:
|
42
|
+
|
43
|
+
```ruby
|
44
|
+
validates :model_id, existence: ->(value) { Model.exists?(value) }
|
45
|
+
```
|
46
|
+
|
47
|
+
Nested validator (ensures that the object is valid):
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
validates :model, nested: true
|
51
|
+
```
|
52
|
+
|
53
|
+
Uniqueness validator:
|
54
|
+
|
55
|
+
```ruby
|
56
|
+
validates :email, uniqueness: ->(email) { Model.exists?(email: email) }
|
57
|
+
```
|
26
58
|
|
27
59
|
## Development
|
28
60
|
|
29
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
61
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run
|
62
|
+
`bin/console` for an interactive prompt that will allow you to experiment.
|
30
63
|
|
31
|
-
To install this gem onto your local machine, run `bundle exec rake install`.
|
64
|
+
To install this gem onto your local machine, run `bundle exec rake install`.
|
65
|
+
To release a new version, update the version number in `version.rb`, and then
|
66
|
+
run `bundle exec rake release` to create a git tag for the version, push git
|
67
|
+
commits and tags, and push the `.gem` file to
|
68
|
+
[rubygems.org](https://rubygems.org).
|
32
69
|
|
33
70
|
## Contributing
|
34
71
|
|
35
|
-
1. Fork it ( https://github.com/
|
72
|
+
1. Fork it ( https://github.com/estoulendo/extra_validations/fork )
|
36
73
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
37
74
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
38
75
|
4. Push to the branch (`git push origin my-new-feature`)
|
39
76
|
5. Create a new Pull Request
|
77
|
+
|
78
|
+
[travis_badge]: https://travis-ci.org/estoulendo/extra_validations.svg?branch=master
|
79
|
+
[travis_link]: https://travis-ci.org/estoulendo/extra_validations
|
80
|
+
[cclimate_badge]: https://codeclimate.com/github/estoulendo/extra_validations/badges/gpa.svg
|
81
|
+
[cclimate_link]: https://codeclimate.com/github/estoulendo/extra_validations
|
data/extra_validations.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
|
21
21
|
spec.add_dependency 'activemodel', '~> 4.2'
|
22
|
-
spec.add_development_dependency 'bundler'
|
22
|
+
spec.add_development_dependency 'bundler'
|
23
23
|
spec.add_development_dependency 'rake', '~> 10.0'
|
24
24
|
spec.add_development_dependency 'rspec', '~> 3.2', '>= 3.2.0'
|
25
25
|
end
|
data/lib/extra_validations.rb
CHANGED
@@ -5,6 +5,7 @@ require 'extra_validations/collection_length_validator'
|
|
5
5
|
require 'extra_validations/collection_validator'
|
6
6
|
require 'extra_validations/nested_validator'
|
7
7
|
require 'extra_validations/existence_validator'
|
8
|
+
require 'extra_validations/uniqueness_validator'
|
8
9
|
|
9
10
|
I18n.load_path.unshift(*Dir[File.expand_path(
|
10
11
|
File.join(%w(extra_validations locale *.yml)), File.dirname(__FILE__))])
|
@@ -1,11 +1,35 @@
|
|
1
1
|
module ExtraValidations
|
2
|
+
# Validates the length of a collection.
|
3
|
+
#
|
4
|
+
# Suppose that you have the following class:
|
5
|
+
#
|
6
|
+
# class Book
|
7
|
+
# include ActiveModel::Model
|
8
|
+
# include ExtraValidations
|
9
|
+
#
|
10
|
+
# attr_accessor :authors
|
11
|
+
#
|
12
|
+
# validates :authors, collection_length: 1..5
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# This validator will make sure that the _authors_ array will have at least
|
16
|
+
# 1 item and at most 5 items:
|
17
|
+
#
|
18
|
+
# book = Book.new
|
19
|
+
# book.authors = []
|
20
|
+
# book.valid? # => false
|
21
|
+
#
|
22
|
+
# book.authors = [Author.new]
|
23
|
+
# book.valid? # => true
|
24
|
+
#
|
2
25
|
class CollectionLengthValidator < ActiveModel::EachValidator
|
3
26
|
def check_validity!
|
4
|
-
unless options[:in].is_a?(Range)
|
5
|
-
fail ArgumentError, ':in must be a Range'
|
6
|
-
end
|
27
|
+
fail ArgumentError, ':in must be a Range' unless options[:in].is_a?(Range)
|
7
28
|
end
|
8
29
|
|
30
|
+
# @param record An object that has ActiveModel::Validations included
|
31
|
+
# @param attribute [Symbol]
|
32
|
+
# @param collection [Array]
|
9
33
|
def validate_each(record, attribute, collection)
|
10
34
|
min = options[:in].begin
|
11
35
|
max = options[:in].end
|
@@ -1,5 +1,36 @@
|
|
1
1
|
module ExtraValidations
|
2
|
+
# Makes sure that each member of the collection is a valid object.
|
3
|
+
#
|
4
|
+
# Suppose that you have the following class:
|
5
|
+
#
|
6
|
+
# class Book
|
7
|
+
# include ActiveModel::Model
|
8
|
+
# include ExtraValidations
|
9
|
+
#
|
10
|
+
# attr_accessor :authors
|
11
|
+
#
|
12
|
+
# validates :authors, collection: true
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# This validator will call +#valid?+ for each member of the collection:
|
16
|
+
#
|
17
|
+
# book = Book.new
|
18
|
+
# book.authors = [invalid_author1, valid_author1]
|
19
|
+
# book.valid? # => false
|
20
|
+
#
|
21
|
+
# book.authors = [valid_author1, valid_author2]
|
22
|
+
# book.valid? # => true
|
23
|
+
#
|
24
|
+
# Each validation error found on members will be appended on to the errors
|
25
|
+
# object:
|
26
|
+
#
|
27
|
+
# book.errors.messages # => {:"authors/1/name"=>["can't be blank"]}
|
28
|
+
#
|
2
29
|
class CollectionValidator < ActiveModel::EachValidator
|
30
|
+
# @param record An object that has ActiveModel::Validations included
|
31
|
+
# @param attribute [Symbol]
|
32
|
+
# @param collection [Array] An array of objects that have
|
33
|
+
# ActiveModel::Validations included
|
3
34
|
def validate_each(record, attribute, collection)
|
4
35
|
return if collection.blank?
|
5
36
|
|
@@ -1,4 +1,27 @@
|
|
1
1
|
module ExtraValidations
|
2
|
+
# Makes sure that an object/record exists.
|
3
|
+
#
|
4
|
+
# Suppose that you have the following class:
|
5
|
+
#
|
6
|
+
# class Book
|
7
|
+
# include ActiveModel::Model
|
8
|
+
# include ExtraValidations
|
9
|
+
#
|
10
|
+
# attr_accessor :author_id
|
11
|
+
#
|
12
|
+
# validates :author_id, existence: -> (id) { Author.exists?(id) }
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# This validator will execute the given block and, if it returns false, the
|
16
|
+
# object will not be valid:
|
17
|
+
#
|
18
|
+
# book = Book.new
|
19
|
+
# book.author_id = 100
|
20
|
+
# book.valid? # => false
|
21
|
+
#
|
22
|
+
# book.author_id = Author.first.id
|
23
|
+
# book.valid? # => true
|
24
|
+
#
|
2
25
|
class ExistenceValidator < ActiveModel::EachValidator
|
3
26
|
def check_validity!
|
4
27
|
unless options[:with].is_a?(Proc)
|
@@ -6,6 +29,9 @@ module ExtraValidations
|
|
6
29
|
end
|
7
30
|
end
|
8
31
|
|
32
|
+
# @param record An object that has ActiveModel::Validations included
|
33
|
+
# @param attribute [Symbol]
|
34
|
+
# @param id [Integer]
|
9
35
|
def validate_each(record, attribute, id)
|
10
36
|
return if id.blank?
|
11
37
|
|
@@ -1,5 +1,34 @@
|
|
1
1
|
module ExtraValidations
|
2
|
+
# Makes sure that the nested object is valid.
|
3
|
+
#
|
4
|
+
# Suppose that you have the following class:
|
5
|
+
#
|
6
|
+
# class Book
|
7
|
+
# include ActiveModel::Model
|
8
|
+
# include ExtraValidations
|
9
|
+
#
|
10
|
+
# attr_accessor :author
|
11
|
+
#
|
12
|
+
# validates :author, nested: true
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# This validator will call +#valid?+ on the nested object:
|
16
|
+
#
|
17
|
+
# book = Book.new
|
18
|
+
# book.author = invalid_author
|
19
|
+
# book.valid? # => false
|
20
|
+
#
|
21
|
+
# book.author = valid_author
|
22
|
+
# book.valid? # => true
|
23
|
+
#
|
24
|
+
# Each validation error found will be appended on to the errors object:
|
25
|
+
#
|
26
|
+
# book.errors.messages # => {:"author/name"=>["can't be blank"]}
|
27
|
+
#
|
2
28
|
class NestedValidator < ActiveModel::EachValidator
|
29
|
+
# @param record An object that has ActiveModel::Validations included
|
30
|
+
# @param attribute [Symbol]
|
31
|
+
# @param nested An object that has ActiveModel::Validations included
|
3
32
|
def validate_each(record, attribute, nested)
|
4
33
|
return if !nested || nested.valid?
|
5
34
|
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module ExtraValidations
|
2
|
+
# Makes sure that an object/record is unique.
|
3
|
+
#
|
4
|
+
# Suppose that you have the following class:
|
5
|
+
#
|
6
|
+
# class User
|
7
|
+
# include ActiveModel::Model
|
8
|
+
# include ExtraValidations
|
9
|
+
#
|
10
|
+
# attr_accessor :email
|
11
|
+
#
|
12
|
+
# validates :email, uniqueness: ->(email) { User.exists?(email: email) }
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# This validator will execute the given block and, if it returns true, the
|
16
|
+
# object will not be valid:
|
17
|
+
#
|
18
|
+
# user = User.new
|
19
|
+
# user.email = 'foo@example.com'
|
20
|
+
# user.valid? # => false
|
21
|
+
#
|
22
|
+
# user.email = 'bar@example.com'
|
23
|
+
# user.valid? # => true
|
24
|
+
#
|
25
|
+
class UniquenessValidator < ActiveModel::EachValidator
|
26
|
+
def check_validity!
|
27
|
+
unless options[:with].is_a?(Proc)
|
28
|
+
fail ArgumentError, ':with must be a Proc'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# @param record An object that has ActiveModel::Validations included
|
33
|
+
# @param attribute [Symbol]
|
34
|
+
# @param value
|
35
|
+
def validate_each(record, attribute, value)
|
36
|
+
return if value.blank?
|
37
|
+
|
38
|
+
exists = options[:with].call(value)
|
39
|
+
record.errors.add(attribute, :taken) if exists
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: extra_validations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lenon Marcel
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-06-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,6 +95,7 @@ files:
|
|
95
95
|
- lib/extra_validations/existence_validator.rb
|
96
96
|
- lib/extra_validations/locale/en.yml
|
97
97
|
- lib/extra_validations/nested_validator.rb
|
98
|
+
- lib/extra_validations/uniqueness_validator.rb
|
98
99
|
- lib/extra_validations/version.rb
|
99
100
|
homepage: https://github.com/estoulendo/extra_validations
|
100
101
|
licenses: []
|