validates_cpf 0.0.1
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.
- data/.gitignore +5 -0
- data/.rspec +1 -0
- data/Gemfile +3 -0
- data/README.rdoc +19 -0
- data/Rakefile +4 -0
- data/lib/validates_cpf.rb +9 -0
- data/lib/validates_cpf/cpf.rb +50 -0
- data/lib/validates_cpf/version.rb +3 -0
- data/spec/fake_app/db/create_users.rb +11 -0
- data/spec/fake_app/user.rb +3 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/validates_cpf/cpf_spec.rb +97 -0
- data/spec/validates_cpf_spec.rb +39 -0
- data/validates_cpf.gemspec +25 -0
- metadata +91 -0
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour --format documentation
|
data/Gemfile
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
= ValidatesCPF
|
2
|
+
|
3
|
+
Rails gem to validate CPF
|
4
|
+
|
5
|
+
== Install
|
6
|
+
|
7
|
+
gem install validates_cpf
|
8
|
+
|
9
|
+
== Usage
|
10
|
+
|
11
|
+
Lets say you have a model with "cpf" string column that you want to be a valid CPF. Just add this to your model:
|
12
|
+
|
13
|
+
class User < ActiveRecord::Base
|
14
|
+
validates :cpf, :cpf => true
|
15
|
+
end
|
16
|
+
|
17
|
+
== Special Thanks
|
18
|
+
|
19
|
+
This project is based on brcpfcnpj gem and his intention it to mantain a cleaner code to validate CPF and macros for test it.
|
data/Rakefile
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
require "active_model"
|
2
|
+
require "validates_cpf/version"
|
3
|
+
require "validates_cpf/cpf"
|
4
|
+
|
5
|
+
class CpfValidator < ActiveModel::EachValidator
|
6
|
+
def validate_each(record, attribute, value)
|
7
|
+
record.errors[attribute] << I18n.t("errors.messages.invalid") unless CPF.new(value).valid?
|
8
|
+
end
|
9
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class CPF
|
2
|
+
def initialize(number)
|
3
|
+
number =~ /^(\d{3}\.?\d{3}\.?\d{3})-?(\d{2})$/
|
4
|
+
@number = number
|
5
|
+
@pure_number = $1
|
6
|
+
@result = $2
|
7
|
+
@cleaned_number = @pure_number.nil? ? nil : @number.gsub(/[\.-]/, "")
|
8
|
+
format_number! if @pure_number
|
9
|
+
end
|
10
|
+
|
11
|
+
def valid?
|
12
|
+
return true if @number.nil?
|
13
|
+
return false unless @pure_number
|
14
|
+
check_cpf
|
15
|
+
end
|
16
|
+
|
17
|
+
def number
|
18
|
+
@number
|
19
|
+
end
|
20
|
+
|
21
|
+
def check_cpf
|
22
|
+
return false if @cleaned_number.length != 11 or @cleaned_number.scan(/\d/).uniq.length == 1
|
23
|
+
@result == first_digit_verifier + second_digit_verifier
|
24
|
+
end
|
25
|
+
|
26
|
+
def first_digit_verifier
|
27
|
+
sum = multiply_and_sum([10, 9, 8, 7, 6, 5, 4, 3, 2], @pure_number)
|
28
|
+
digit_verifier(sum%11).to_s
|
29
|
+
end
|
30
|
+
|
31
|
+
def second_digit_verifier
|
32
|
+
sum = multiply_and_sum([11, 10, 9, 8, 7, 6, 5, 4, 3, 2], @pure_number + first_digit_verifier)
|
33
|
+
digit_verifier(sum%11).to_s
|
34
|
+
end
|
35
|
+
|
36
|
+
def multiply_and_sum(array, number)
|
37
|
+
multiplied = []
|
38
|
+
number.scan(/\d{1}/).each_with_index { |e, i| multiplied[i] = e.to_i * array[i] }
|
39
|
+
multiplied.inject { |s,e| s + e }
|
40
|
+
end
|
41
|
+
|
42
|
+
def digit_verifier(rest)
|
43
|
+
rest < 2 ? 0 : 11 - rest
|
44
|
+
end
|
45
|
+
|
46
|
+
def format_number!
|
47
|
+
@cleaned_number =~ /(\d{3})(\d{3})(\d{3})(\d{2})/
|
48
|
+
@number = "#{$1}.#{$2}.#{$3}-#{$4}"
|
49
|
+
end
|
50
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "rspec"
|
3
|
+
require "active_record"
|
4
|
+
|
5
|
+
require File.expand_path(File.dirname(__FILE__) + "/../lib/validates_cpf")
|
6
|
+
|
7
|
+
ActiveRecord::Base.establish_connection(:adapter => "sqlite3", :database => ":memory:")
|
8
|
+
require File.dirname(__FILE__) + "/fake_app/db/create_users"
|
9
|
+
|
10
|
+
CreateUsers.migrate(:up)
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../lib/validates_cpf/cpf")
|
4
|
+
|
5
|
+
describe CPF do
|
6
|
+
context "should be invalid with" do
|
7
|
+
it "blank number" do
|
8
|
+
CPF.new('').should_not be_valid
|
9
|
+
end
|
10
|
+
|
11
|
+
it "345.65.67.3 as number" do
|
12
|
+
CPF.new('345.65.67.3').should_not be_valid
|
13
|
+
end
|
14
|
+
|
15
|
+
it "567.765-87698 as number" do
|
16
|
+
CPF.new('567.765-87698').should_not be_valid
|
17
|
+
end
|
18
|
+
|
19
|
+
it "345456-654-01 as number" do
|
20
|
+
CPF.new('345456-654-01').should_not be_valid
|
21
|
+
end
|
22
|
+
|
23
|
+
it "123456 as number" do
|
24
|
+
CPF.new('123456').should_not be_valid
|
25
|
+
end
|
26
|
+
|
27
|
+
it "23342345699 as number" do
|
28
|
+
CPF.new('23342345699').should_not be_valid
|
29
|
+
end
|
30
|
+
|
31
|
+
it "34.543.567-98 as number" do
|
32
|
+
CPF.new('34.543.567-98').should_not be_valid
|
33
|
+
end
|
34
|
+
|
35
|
+
it "456.676456-87 as number" do
|
36
|
+
CPF.new('456.676456-87').should_not be_valid
|
37
|
+
end
|
38
|
+
|
39
|
+
it "333333333-33 as number" do
|
40
|
+
CPF.new('333333333-33').should_not be_valid
|
41
|
+
end
|
42
|
+
|
43
|
+
it "00000000000 as number" do
|
44
|
+
CPF.new('00000000000').should_not be_valid
|
45
|
+
end
|
46
|
+
|
47
|
+
it "000.000.000-00 as number" do
|
48
|
+
CPF.new('000.000.000-00').should_not be_valid
|
49
|
+
end
|
50
|
+
|
51
|
+
it "111.444.777-3500 as number" do
|
52
|
+
CPF.new('111.444.777-3500').should_not be_valid
|
53
|
+
end
|
54
|
+
|
55
|
+
it "11144477735AB as number" do
|
56
|
+
CPF.new('11144477735AB').should_not be_valid
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "should be valid with" do
|
61
|
+
it "nil as number" do
|
62
|
+
CPF.new(nil).should be_valid
|
63
|
+
end
|
64
|
+
|
65
|
+
it "111.444.777-35 as number" do
|
66
|
+
CPF.new('111.444.777-35').should be_valid
|
67
|
+
end
|
68
|
+
|
69
|
+
it "11144477735 as number" do
|
70
|
+
CPF.new('11144477735').should be_valid
|
71
|
+
end
|
72
|
+
|
73
|
+
it "111.444777-35 as number" do
|
74
|
+
CPF.new('111.444777-35').should be_valid
|
75
|
+
end
|
76
|
+
|
77
|
+
it "111444.777-35 as number" do
|
78
|
+
CPF.new('111444.777-35').should be_valid
|
79
|
+
end
|
80
|
+
|
81
|
+
it "111.444.77735 as number" do
|
82
|
+
CPF.new('111.444.77735').should be_valid
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context "with a valid value" do
|
87
|
+
it "should return it formatted" do
|
88
|
+
CPF.new('11144477735').number.should == '111.444.777-35'
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context "with an invalid value" do
|
93
|
+
it "should return as it was" do
|
94
|
+
CPF.new('123456').number.should == '123456'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + "/fake_app/user")
|
3
|
+
|
4
|
+
describe CpfValidator do
|
5
|
+
context "when cpf is invalid" do
|
6
|
+
before :each do
|
7
|
+
@user = User.new(:cpf => "12345")
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should set object as invalid" do
|
11
|
+
@user.valid?.should be_false
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should set an error on attribute" do
|
15
|
+
@user.valid?
|
16
|
+
@user.errors[:cpf].should == ['is invalid']
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "when cpf is valid" do
|
21
|
+
before :each do
|
22
|
+
@user = User.new(:cpf => "11144477735")
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should set object as valid" do
|
26
|
+
@user.valid?.should be_true
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should not set an error on attribute" do
|
30
|
+
@user.valid?
|
31
|
+
@user.errors[:cpf].should be_blank
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should accept a nil value" do
|
36
|
+
@user = User.new(:cpf => nil)
|
37
|
+
@user.valid?.should be_true
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "validates_cpf/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "validates_cpf"
|
7
|
+
s.version = ValidatesCpf::VERSION
|
8
|
+
s.authors = ["Paulo Henrique Lopes Ribeiro"]
|
9
|
+
s.email = %q{plribeiro3000@gmail.com}
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{CPF Validation GEM}
|
12
|
+
s.description = %q{Validates CPF, the simple way.}
|
13
|
+
|
14
|
+
s.add_dependency("activerecord", ">= 3.0.0")
|
15
|
+
|
16
|
+
s.rubyforge_project = "validates_cpf"
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split("\n")
|
19
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
20
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
21
|
+
s.require_paths = %w(lib)
|
22
|
+
|
23
|
+
s.add_development_dependency "rspec"
|
24
|
+
s.add_development_dependency "sqlite3"
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: validates_cpf
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Paulo Henrique Lopes Ribeiro
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-02-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activerecord
|
16
|
+
requirement: &8077760 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.0.0
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *8077760
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &8076240 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *8076240
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: sqlite3
|
38
|
+
requirement: &8075700 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *8075700
|
47
|
+
description: Validates CPF, the simple way.
|
48
|
+
email: plribeiro3000@gmail.com
|
49
|
+
executables: []
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files: []
|
52
|
+
files:
|
53
|
+
- .gitignore
|
54
|
+
- .rspec
|
55
|
+
- Gemfile
|
56
|
+
- README.rdoc
|
57
|
+
- Rakefile
|
58
|
+
- lib/validates_cpf.rb
|
59
|
+
- lib/validates_cpf/cpf.rb
|
60
|
+
- lib/validates_cpf/version.rb
|
61
|
+
- spec/fake_app/db/create_users.rb
|
62
|
+
- spec/fake_app/user.rb
|
63
|
+
- spec/spec_helper.rb
|
64
|
+
- spec/validates_cpf/cpf_spec.rb
|
65
|
+
- spec/validates_cpf_spec.rb
|
66
|
+
- validates_cpf.gemspec
|
67
|
+
homepage: ''
|
68
|
+
licenses: []
|
69
|
+
post_install_message:
|
70
|
+
rdoc_options: []
|
71
|
+
require_paths:
|
72
|
+
- lib
|
73
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - ! '>='
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
requirements: []
|
86
|
+
rubyforge_project: validates_cpf
|
87
|
+
rubygems_version: 1.8.10
|
88
|
+
signing_key:
|
89
|
+
specification_version: 3
|
90
|
+
summary: CPF Validation GEM
|
91
|
+
test_files: []
|