validates_identity 0.3.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/Gemfile.lock +1 -1
- data/README.md +57 -11
- data/lib/shoulda/matchers/active_model/require_a_valid_identity_matcher.rb +95 -0
- data/lib/validates_identity/identity.rb +1 -1
- data/lib/validates_identity/shoulda_matchers.rb +47 -0
- data/lib/validates_identity/version.rb +2 -2
- data/lib/validates_identity.rb +41 -9
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0fdb1765f269869de8c648faa317223189f37cb567b50f6a9caf2564f4611b9c
|
4
|
+
data.tar.gz: 28402419c0136ab8b501b47e96bb292201212bb9f91a2c2b7534ff4d84e83bd4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 376739a02e1cd0673babf91821c4cf3c44f4afdb79cb087ec91d1b31ad44fd48aa1eaa075f51399b1f356aa0dbd09784be5e38d9ef915560f5d109524e2a13a2
|
7
|
+
data.tar.gz: f99028dfc1be6a94a2f597cf4fe451c21810b9931c6a311a85482998fa5b4fd87ea3ed1045af705c9132e41bdc16d1a6bdaabaff1e950ae8ac47c760ba201904
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# ValidatesIdentity
|
2
2
|
|
3
3
|
This projects aims to validate several countries person identification documents.
|
4
|
+
It works on top of 2 attributes, so that the identity can be determined by a second value and thus validate the first one accordingly
|
4
5
|
|
5
6
|
## Installation
|
6
7
|
|
@@ -18,6 +19,14 @@ Or install it yourself as:
|
|
18
19
|
|
19
20
|
$ gem install validates_identity
|
20
21
|
|
22
|
+
## Official Plugins
|
23
|
+
|
24
|
+
Just require the plugins you want/need in your Gemfile and you will be good to go
|
25
|
+
|
26
|
+
- [Brazilian CPF](https://github.com/plribeiro3000/validates_identity-br_cpf)
|
27
|
+
- [Brazilian CNPJ](https://github.com/plribeiro3000/validates_identity-br_cnpj)
|
28
|
+
- [Guatemala DPI](https://github.com/plribeiro3000/validates_identity-gt_dpi)
|
29
|
+
|
21
30
|
## Usage
|
22
31
|
|
23
32
|
Just use as any other validator:
|
@@ -29,39 +38,76 @@ class User < ActiveRecord::Base
|
|
29
38
|
end
|
30
39
|
```
|
31
40
|
|
32
|
-
|
33
|
-
|
34
|
-
### Format
|
41
|
+
### Format Option
|
35
42
|
|
36
43
|
The `format` option can be used to format the final identity value.
|
37
44
|
|
38
45
|
```ruby
|
39
46
|
class User < ActiveRecord::Base
|
40
|
-
#
|
47
|
+
# all values will be formatted after successful validation
|
41
48
|
validates :identity, identity: { identity_type: :identity_type, format: true }
|
42
49
|
end
|
43
50
|
```
|
44
51
|
|
45
|
-
###
|
52
|
+
### Only Option
|
53
|
+
|
54
|
+
The `only` option can be used to narrow down the validators
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
class User < ActiveRecord::Base
|
58
|
+
# will accept only person identity types
|
59
|
+
validates :identity, identity: { identity_type: :identity_type, only: :person }
|
60
|
+
# will accept only legal identity types
|
61
|
+
validates :identity, identity: { identity_type: :identity_type, only: :legal }
|
62
|
+
end
|
63
|
+
```
|
64
|
+
|
65
|
+
### Aliases
|
66
|
+
|
67
|
+
In case of a legacy system where keys were already defined and differ from the official ones, aliases can be registered to easy the transition
|
68
|
+
|
69
|
+
```ruby
|
70
|
+
ValidatesIdentity.register_person_identity_type_alias('LegacyIdentity', 'CustomIdentity')
|
71
|
+
ValidatesIdentity.register_legal_identity_type_alias('LegacyIdentity', 'CustomIdentity')
|
72
|
+
```
|
73
|
+
|
74
|
+
### Adding your own Validators
|
46
75
|
|
47
76
|
New Identity Validators can be registered through the public apis of `ValidatesIdentity`
|
48
77
|
|
49
78
|
```ruby
|
50
|
-
ValidatesIdentity.
|
79
|
+
ValidatesIdentity.register_person_identity_type('CustomIdentity', CustomIdentityValidator)
|
80
|
+
ValidatesIdentity.register_legal_identity_type('CustomIdentity', CustomIdentityValidator)
|
51
81
|
```
|
52
82
|
|
53
|
-
|
83
|
+
A Validator must implement:
|
54
84
|
|
55
85
|
- a constructor with 1 param: `value`
|
56
86
|
- a `valid?` method that returns a boolean
|
57
|
-
- a `formatted` method that returns the value
|
87
|
+
- a `formatted` method that returns the formatted value
|
58
88
|
|
59
|
-
###
|
89
|
+
### Adding scenarios to the matcher
|
90
|
+
|
91
|
+
When adding a new validator, cases of success and error can be added through and API so that the `Matcher` will test against them
|
92
|
+
|
93
|
+
```ruby
|
94
|
+
ValidatesIdentity::ShouldaMatchers.register_allowed_values('CustomIdentity', ['123456789', '123.456.789'])
|
95
|
+
ValidatesIdentity::ShouldaMatchers.register_disallowed_values('CustomIdentity', ['12345679', '12.456.789'])
|
96
|
+
```
|
97
|
+
|
98
|
+
## Testing
|
99
|
+
|
100
|
+
Require matcher in your `spec_helper` or `rails_helper` file:
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
require 'shoulda/matchers/active_model/require_a_valid_identity_matcher'
|
104
|
+
```
|
60
105
|
|
61
|
-
|
106
|
+
Use in your tests:
|
62
107
|
|
63
108
|
```ruby
|
64
|
-
|
109
|
+
it { is_expected.to require_a_valid_identity } # It will test the attributes :identity and :identity_type by default
|
110
|
+
it { is_expected.to require_a_valid_identity(:id, :my_type) }
|
65
111
|
```
|
66
112
|
|
67
113
|
## Development
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'shoulda-matchers'
|
4
|
+
|
5
|
+
module Shoulda
|
6
|
+
module Matchers
|
7
|
+
module ActiveModel
|
8
|
+
def require_a_valid_identity(identity = :identity, identity_type = :identity_type)
|
9
|
+
RequireAValidIdentityMatcher.new(identity, identity_type)
|
10
|
+
end
|
11
|
+
|
12
|
+
class RequireAValidIdentityMatcher < ValidationMatcher
|
13
|
+
def initialize(identity, identity_type)
|
14
|
+
super(identity)
|
15
|
+
@identity_type = identity_type
|
16
|
+
@type = :both
|
17
|
+
end
|
18
|
+
|
19
|
+
def description
|
20
|
+
case @type
|
21
|
+
when :person then 'require a valid person identity'
|
22
|
+
when :legal then 'require a valid legal identity'
|
23
|
+
else 'require a valid identity'
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def failure_message
|
28
|
+
case @type
|
29
|
+
when :person then 'does not require a valid person identity'
|
30
|
+
when :legal then 'does not require a valid legal identity'
|
31
|
+
else 'expected to require a valid identity'
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def matches?(subject)
|
36
|
+
super(subject)
|
37
|
+
|
38
|
+
result = []
|
39
|
+
|
40
|
+
allowed_values.each do |identity_type, values|
|
41
|
+
subject.send("#{@identity_type}=", identity_type)
|
42
|
+
|
43
|
+
values.each do |value|
|
44
|
+
result << allows_value_of(value)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
disallowed_values.each do |identity_type, values|
|
49
|
+
subject.send("#{@identity_type}=", identity_type)
|
50
|
+
|
51
|
+
values.each do |value|
|
52
|
+
result << disallows_value_of(value)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
result.inject(:&)
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def allowed_values
|
62
|
+
case @type
|
63
|
+
when :person then person_allowed_values
|
64
|
+
when :legal then legal_allowed_values
|
65
|
+
else ValidatesIdentity::ShouldaMatchers.allowed_values
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def disallowed_values
|
70
|
+
case @type
|
71
|
+
when :person then person_disallowed_values + legal_allowed_values
|
72
|
+
when :legal then legal_disallowed_values + person_allowed_values
|
73
|
+
else ValidatesIdentity::ShouldaMatchers.disallowed_values
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def person_allowed_values
|
78
|
+
ValidatesIdentity::ShouldaMatchers.person_allowed_values
|
79
|
+
end
|
80
|
+
|
81
|
+
def person_disallowed_values
|
82
|
+
ValidatesIdentity::ShouldaMatchers.person_disallowed_values
|
83
|
+
end
|
84
|
+
|
85
|
+
def legal_allowed_values
|
86
|
+
ValidatesIdentity::ShouldaMatchers.legal_allowed_values
|
87
|
+
end
|
88
|
+
|
89
|
+
def legal_disallowed_values
|
90
|
+
ValidatesIdentity::ShouldaMatchers.legal_disallowed_values
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -15,7 +15,7 @@ class ValidatesIdentity
|
|
15
15
|
return true if value.blank?
|
16
16
|
return false if options[:identity_type].blank?
|
17
17
|
|
18
|
-
validator_class = ValidatesIdentity.get_validator(identity_type)
|
18
|
+
validator_class = ValidatesIdentity.get_validator(identity_type, type: options[:only])
|
19
19
|
|
20
20
|
return false if validator_class.nil?
|
21
21
|
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class ValidatesIdentity
|
4
|
+
class ShouldaMatchers
|
5
|
+
class << self
|
6
|
+
def person_allowed_values
|
7
|
+
@person_allowed_values ||= {}
|
8
|
+
end
|
9
|
+
|
10
|
+
def legal_allowed_values
|
11
|
+
@legal_allowed_values ||= {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def person_disallowed_values
|
15
|
+
@person_disallowed_values ||= {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def legal_disallowed_values
|
19
|
+
@legal_disallowed_values ||= {}
|
20
|
+
end
|
21
|
+
|
22
|
+
def allowed_values
|
23
|
+
person_allowed_values.merge(legal_allowed_values)
|
24
|
+
end
|
25
|
+
|
26
|
+
def disallowed_values
|
27
|
+
person_disallowed_values.merge(legal_disallowed_values)
|
28
|
+
end
|
29
|
+
|
30
|
+
def register_person_allowed_values(identity_type_acronym, values = [])
|
31
|
+
person_allowed_values[identity_type_acronym] = values
|
32
|
+
end
|
33
|
+
|
34
|
+
def register_legal_allowed_values(identity_type_acronym, values = [])
|
35
|
+
legal_allowed_values[identity_type_acronym] = values
|
36
|
+
end
|
37
|
+
|
38
|
+
def register_person_disallowed_values(identity_type_acronym, values = [])
|
39
|
+
person_disallowed_values[identity_type_acronym] = values
|
40
|
+
end
|
41
|
+
|
42
|
+
def register_legal_disallowed_values(identity_type_acronym, values = [])
|
43
|
+
legal_disallowed_values[identity_type_acronym] = values
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/validates_identity.rb
CHANGED
@@ -5,30 +5,62 @@ require 'identity_validator'
|
|
5
5
|
|
6
6
|
class ValidatesIdentity
|
7
7
|
autoload :Identity, 'validates_identity/identity'
|
8
|
+
autoload :ShouldaMatchers, 'validates_identity/shoulda_matchers'
|
8
9
|
|
9
10
|
class << self
|
10
11
|
private
|
11
12
|
|
13
|
+
def person_identity_types
|
14
|
+
@person_identity_types ||= {}
|
15
|
+
end
|
16
|
+
|
17
|
+
def legal_identity_types
|
18
|
+
@legal_identity_types ||= {}
|
19
|
+
end
|
20
|
+
|
12
21
|
def identity_types
|
13
|
-
|
22
|
+
person_identity_types.merge(legal_identity_types)
|
23
|
+
end
|
24
|
+
|
25
|
+
def person_identity_type_aliases
|
26
|
+
@person_identity_type_aliases ||= {}
|
27
|
+
end
|
28
|
+
|
29
|
+
def legal_identity_type_aliases
|
30
|
+
@legal_identity_type_aliases ||= {}
|
14
31
|
end
|
15
32
|
|
16
33
|
def identity_type_aliases
|
17
|
-
|
34
|
+
person_identity_type_aliases.merge(legal_identity_type_aliases)
|
18
35
|
end
|
19
36
|
end
|
20
37
|
|
21
|
-
def self.
|
22
|
-
|
23
|
-
|
38
|
+
def self.register_person_identity_type(identity_type_acronym, identity_type_validator)
|
39
|
+
person_identity_types[identity_type_acronym] = identity_type_validator
|
40
|
+
register_person_identity_type_alias(identity_type_acronym, identity_type_acronym)
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.register_legal_identity_type(identity_type_acronym, identity_type_validator)
|
44
|
+
legal_identity_types[identity_type_acronym] = identity_type_validator
|
45
|
+
register_legal_identity_type_alias(identity_type_acronym, identity_type_acronym)
|
24
46
|
end
|
25
47
|
|
26
|
-
def self.
|
27
|
-
|
48
|
+
def self.register_person_identity_type_alias(identity_type, identity_type_alias)
|
49
|
+
person_identity_type_aliases[identity_type_alias] = identity_type
|
28
50
|
end
|
29
51
|
|
30
|
-
def self.
|
31
|
-
|
52
|
+
def self.register_legal_identity_type_alias(identity_type, identity_type_alias)
|
53
|
+
legal_identity_type_aliases[identity_type_alias] = identity_type
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.get_validator(identity_type, type: :both)
|
57
|
+
identity_alias =
|
58
|
+
case type
|
59
|
+
when :person then person_identity_type_aliases[identity_type]
|
60
|
+
when :legal then legal_identity_type_aliases[identity_type]
|
61
|
+
else identity_type_aliases[identity_type]
|
62
|
+
end
|
63
|
+
|
32
64
|
identity_types[identity_alias]
|
33
65
|
end
|
34
66
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: validates_identity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Paulo Ribeiro
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-02-
|
11
|
+
date: 2024-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -43,8 +43,10 @@ files:
|
|
43
43
|
- README.md
|
44
44
|
- Rakefile
|
45
45
|
- lib/identity_validator.rb
|
46
|
+
- lib/shoulda/matchers/active_model/require_a_valid_identity_matcher.rb
|
46
47
|
- lib/validates_identity.rb
|
47
48
|
- lib/validates_identity/identity.rb
|
49
|
+
- lib/validates_identity/shoulda_matchers.rb
|
48
50
|
- lib/validates_identity/version.rb
|
49
51
|
- validates_identity.gemspec
|
50
52
|
homepage: https://github.com/plribeiro3000/validates_identity
|