act_as_cnpj_cpf 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +6 -0
- data/.travis.yml +14 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +67 -0
- data/README.md +6 -0
- data/act_as_cnpj_cpf.gemspec +29 -0
- data/lib/act_as_cnpj_cpf.rb +10 -0
- data/lib/act_as_cnpj_cpf/base.rb +53 -0
- data/lib/act_as_cnpj_cpf/cnpj.rb +15 -0
- data/lib/act_as_cnpj_cpf/cnpj_cpf_active_record.rb +54 -0
- data/lib/act_as_cnpj_cpf/cnpj_ou_cpf.rb +20 -0
- data/lib/act_as_cnpj_cpf/cpf.rb +15 -0
- data/lib/act_as_cnpj_cpf/version.rb +3 -0
- data/spec/lib/cnpj_ou_cpf_spec.rb +16 -0
- data/spec/lib/cnpj_spec.rb +14 -0
- data/spec/lib/cpf_spec.rb +14 -0
- data/spec/lib/usar_como_cnpj_ou_cpf_spec.rb +29 -0
- data/spec/lib/usar_como_cnpj_spec.rb +27 -0
- data/spec/lib/usar_como_cpf_spec.rb +27 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/support/active_record.rb +16 -0
- data/spec/support/cnpj_cpf_active_record_shared.rb +191 -0
- data/spec/support/cnpj_cpf_base_shared.rb +66 -0
- metadata +139 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 73824fe9acab5c7cc094a1b4dba942eeadf69f94
|
4
|
+
data.tar.gz: 65d424c466ff2cec600bc6efd57a329cfab1bed8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 05919b168466a32e5994136c3bad1920f3fafcc4af7eef72c8cde5d5ebd58641c26336fbfb0bb1fa59ec76fc7f55f1a7a01898db56ed24c5776fcc4e1de0ccba
|
7
|
+
data.tar.gz: 6b8072c4e3538b575bfd5e0386e2f7c450f649fe5c67cd2d152d159bd409d55dfc685aa3cff5d8abbd9beb7c4d2a3afc2d5b9d6d003b7aed44ae03299beb32e5
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
language: ruby
|
2
|
+
bundler_args: --without production
|
3
|
+
addons:
|
4
|
+
code_climate:
|
5
|
+
repo_token: 62c9b3dcf62121f24010397d203442ce2151a158d94b9cc2602b1a2b7cdd9410
|
6
|
+
rvm:
|
7
|
+
- 1.9.3
|
8
|
+
- 2.0.0
|
9
|
+
- 2.1.2
|
10
|
+
- 2.1.4
|
11
|
+
branches:
|
12
|
+
only:
|
13
|
+
- master
|
14
|
+
script: bundle exec rspec spec
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
act_as_cnpj_cpf (1.0.1)
|
5
|
+
activerecord (>= 3.2)
|
6
|
+
activesupport (>= 3.2)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
activemodel (4.1.8)
|
12
|
+
activesupport (= 4.1.8)
|
13
|
+
builder (~> 3.1)
|
14
|
+
activerecord (4.1.8)
|
15
|
+
activemodel (= 4.1.8)
|
16
|
+
activesupport (= 4.1.8)
|
17
|
+
arel (~> 5.0.0)
|
18
|
+
activesupport (4.1.8)
|
19
|
+
i18n (~> 0.6, >= 0.6.9)
|
20
|
+
json (~> 1.7, >= 1.7.7)
|
21
|
+
minitest (~> 5.1)
|
22
|
+
thread_safe (~> 0.1)
|
23
|
+
tzinfo (~> 1.1)
|
24
|
+
arel (5.0.1.20140414130214)
|
25
|
+
builder (3.2.2)
|
26
|
+
clipboard (1.0.5)
|
27
|
+
codeclimate-test-reporter (0.4.1)
|
28
|
+
simplecov (>= 0.7.1, < 1.0.0)
|
29
|
+
cpf_faker (1.3.0)
|
30
|
+
clipboard
|
31
|
+
diff-lcs (1.2.5)
|
32
|
+
docile (1.1.5)
|
33
|
+
i18n (0.6.11)
|
34
|
+
json (1.8.1)
|
35
|
+
minitest (5.4.3)
|
36
|
+
multi_json (1.10.1)
|
37
|
+
rspec (3.1.0)
|
38
|
+
rspec-core (~> 3.1.0)
|
39
|
+
rspec-expectations (~> 3.1.0)
|
40
|
+
rspec-mocks (~> 3.1.0)
|
41
|
+
rspec-core (3.1.7)
|
42
|
+
rspec-support (~> 3.1.0)
|
43
|
+
rspec-expectations (3.1.2)
|
44
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
45
|
+
rspec-support (~> 3.1.0)
|
46
|
+
rspec-mocks (3.1.3)
|
47
|
+
rspec-support (~> 3.1.0)
|
48
|
+
rspec-support (3.1.2)
|
49
|
+
simplecov (0.9.1)
|
50
|
+
docile (~> 1.1.0)
|
51
|
+
multi_json (~> 1.0)
|
52
|
+
simplecov-html (~> 0.8.0)
|
53
|
+
simplecov-html (0.8.0)
|
54
|
+
sqlite3 (1.3.10)
|
55
|
+
thread_safe (0.3.4)
|
56
|
+
tzinfo (1.2.2)
|
57
|
+
thread_safe (~> 0.1)
|
58
|
+
|
59
|
+
PLATFORMS
|
60
|
+
ruby
|
61
|
+
|
62
|
+
DEPENDENCIES
|
63
|
+
act_as_cnpj_cpf!
|
64
|
+
codeclimate-test-reporter
|
65
|
+
cpf_faker
|
66
|
+
rspec (~> 3.1)
|
67
|
+
sqlite3
|
data/README.md
ADDED
@@ -0,0 +1,6 @@
|
|
1
|
+
[![Build Status](https://travis-ci.org/josuelima/act_as_cnpj_cpf.svg?branch=master)](https://travis-ci.org/josuelima/act_as_cnpj_cpf)
|
2
|
+
[![Code Climate](https://codeclimate.com/github/josuelima/act_as_cnpj_cpf/badges/gpa.svg)](https://codeclimate.com/github/josuelima/act_as_cnpj_cpf)
|
3
|
+
[![Test Coverage](https://codeclimate.com/github/josuelima/act_as_cnpj_cpf/badges/coverage.svg)](https://codeclimate.com/github/josuelima/act_as_cnpj_cpf)
|
4
|
+
|
5
|
+
Under construction.
|
6
|
+
More info soon..
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path('../lib', __FILE__)
|
3
|
+
require 'act_as_cnpj_cpf/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |gem|
|
6
|
+
gem.name = 'act_as_cnpj_cpf'
|
7
|
+
gem.version = ActAsCnpjCpf::VERSION
|
8
|
+
gem.platform = Gem::Platform::RUBY
|
9
|
+
gem.authors = ['Josué Lima']
|
10
|
+
gem.email = ['josuedsi@gmail.com']
|
11
|
+
gem.summary = %q{Permite formatar e validar um atributo ActiveRecord como CPF, CNPJ ou ambos}
|
12
|
+
gem.description = gem.summary
|
13
|
+
gem.license = 'MIT'
|
14
|
+
gem.homepage = 'https://github.com/josuelima/act_as_cnpj_cpf'
|
15
|
+
|
16
|
+
gem.files = `git ls-files`.split("\n")
|
17
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
gem.executables = `git ls-files -- bin/*`.split('\n').map { |f| File.basename(f) }
|
19
|
+
|
20
|
+
gem.require_paths = ["lib"]
|
21
|
+
|
22
|
+
gem.required_ruby_version = '>= 1.9.3'
|
23
|
+
|
24
|
+
gem.add_dependency 'activesupport', '>= 3.2'
|
25
|
+
gem.add_dependency 'activerecord', '>= 3.2'
|
26
|
+
gem.add_development_dependency 'rspec', '~> 3.1'
|
27
|
+
gem.add_development_dependency 'cpf_faker'
|
28
|
+
gem.add_development_dependency 'sqlite3'
|
29
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'active_support/inflector'
|
3
|
+
require 'act_as_cnpj_cpf/version'
|
4
|
+
require 'act_as_cnpj_cpf/base'
|
5
|
+
require 'act_as_cnpj_cpf/cnpj'
|
6
|
+
require 'act_as_cnpj_cpf/cpf'
|
7
|
+
require 'act_as_cnpj_cpf/cnpj_ou_cpf'
|
8
|
+
require 'act_as_cnpj_cpf/cnpj_cpf_active_record'
|
9
|
+
|
10
|
+
ActiveRecord::Base.send :include, ActAsCnpjCpf::CnpjCpfActiveRecord
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module ActAsCnpjCpf
|
2
|
+
module Base
|
3
|
+
attr_reader :numero
|
4
|
+
|
5
|
+
def initialize(numero)
|
6
|
+
@numero = numero.to_s.gsub(/[^0-9]/, '')
|
7
|
+
@match = @numero =~ self.class::REGEX
|
8
|
+
@puro = $1
|
9
|
+
@digito = $2
|
10
|
+
@numero = valido? ? $1+$2 : numero
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_s
|
14
|
+
@numero
|
15
|
+
end
|
16
|
+
|
17
|
+
def valido?
|
18
|
+
return false unless @match
|
19
|
+
verifica_numero
|
20
|
+
end
|
21
|
+
|
22
|
+
def == other
|
23
|
+
other.respond_to?(:numero) ? self.numero == other.numero : self.numero == other
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def verifica_numero
|
29
|
+
return false if @numero.length != self.class::LENGTH ||
|
30
|
+
@numero.scan(/\d/).uniq.length == 1
|
31
|
+
|
32
|
+
primeiro_dv + segundo_dv(primeiro_dv) == @digito
|
33
|
+
end
|
34
|
+
|
35
|
+
def multiplica_e_soma(algs, numeros)
|
36
|
+
results = []
|
37
|
+
numeros.scan(/\d{1}/).each_with_index { |e, i| results[i] = e.to_i * algs[i] }
|
38
|
+
results.inject { |s,e| s + e }
|
39
|
+
end
|
40
|
+
|
41
|
+
def dv(resto)
|
42
|
+
resto < 2 ? 0 : 11 - resto
|
43
|
+
end
|
44
|
+
|
45
|
+
def primeiro_dv
|
46
|
+
@primeiro ||= dv(multiplica_e_soma(self.class::ALGS_1, @puro) % 11).to_s
|
47
|
+
end
|
48
|
+
|
49
|
+
def segundo_dv(primeiro_verificador)
|
50
|
+
dv(multiplica_e_soma(self.class::ALGS_2, @puro + primeiro_verificador) % 11).to_s
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module ActAsCnpjCpf
|
2
|
+
class Cnpj
|
3
|
+
include Base
|
4
|
+
|
5
|
+
LENGTH = 14
|
6
|
+
REGEX = /^(\d{2}\.?\d{3}\.?\d{3}\/?\d{4})-?(\d{2})$/
|
7
|
+
ALGS_1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
|
8
|
+
ALGS_2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
|
9
|
+
|
10
|
+
def formatado
|
11
|
+
@numero =~ /(\d{2})\.?(\d{3})\.?(\d{3})\/?(\d{4})-?(\d{2})/
|
12
|
+
valido? ? "#{$1}.#{$2}.#{$3}/#{$4}-#{$5}" : ''
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module ActAsCnpjCpf
|
3
|
+
module CnpjCpfActiveRecord
|
4
|
+
def self.included(base)
|
5
|
+
base.extend ClassMethods
|
6
|
+
end
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
%w(cnpj cpf cnpj_ou_cpf).each do |method|
|
10
|
+
define_method("usar_como_#{method}") do |field, options = {}|
|
11
|
+
init(field, options, "ActAsCnpjCpf::#{method.split('_').map(&:capitalize).join}")
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def init(field, options, klass)
|
16
|
+
add_composed_class(field, klass)
|
17
|
+
module_eval(create_validation(field.to_s, options, klass))
|
18
|
+
end
|
19
|
+
|
20
|
+
# Adiciona reader e writer
|
21
|
+
# http://api.rubyonrails.org/classes/ActiveRecord/Aggregations/ClassMethods.html
|
22
|
+
def add_composed_class(name, klass)
|
23
|
+
options = {class_name: klass, mapping: [name.to_s, 'numero'], allow_nil: true}
|
24
|
+
cons = Proc.new { |numero| klass.constantize.new(numero) }
|
25
|
+
composed_of name, options.merge({constructor: cons, converter: cons})
|
26
|
+
end
|
27
|
+
|
28
|
+
# cria validacao para o model
|
29
|
+
def create_validation(field, options, klass)
|
30
|
+
<<-CODE
|
31
|
+
validate :#{field}_vazio?, :#{field}_valido?
|
32
|
+
|
33
|
+
def #{field}_vazio?
|
34
|
+
self.errors.add('#{field}', :blank) if #{field}.nil? &&
|
35
|
+
!#{field}_permite_invalido?
|
36
|
+
end
|
37
|
+
|
38
|
+
def #{field}_valido?
|
39
|
+
unless #{field}.nil?
|
40
|
+
self.errors.add('#{field}', :invalid) unless #{field}.valido? ||
|
41
|
+
#{field}_permite_invalido?
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def #{field}_permite_invalido?
|
46
|
+
#{options[:permite_invalido] || false}
|
47
|
+
end
|
48
|
+
|
49
|
+
private :#{field}_permite_invalido?
|
50
|
+
CODE
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module ActAsCnpjCpf
|
2
|
+
class CnpjOuCpf
|
3
|
+
extend Forwardable
|
4
|
+
# forward dos metodos e vars para o objeto criado de acordo
|
5
|
+
# com o numero passado
|
6
|
+
def_delegators :@instance, :numero, :to_s, :valido?, :formatado, :==
|
7
|
+
|
8
|
+
# Infere se utiliza cnpj ou cpf pelo tamanho
|
9
|
+
# da string passada
|
10
|
+
#
|
11
|
+
# 11 = cpf | > 11 = cnpj
|
12
|
+
#
|
13
|
+
# Caso seja um numero invalido, o proprio objeto
|
14
|
+
# se encarrega da validacao.
|
15
|
+
def initialize(numero)
|
16
|
+
klass = numero.to_s.gsub(/[^0-9]/, '').length == 11 ? Cpf : Cnpj
|
17
|
+
@instance = klass.new(numero)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module ActAsCnpjCpf
|
2
|
+
class Cpf
|
3
|
+
include Base
|
4
|
+
|
5
|
+
LENGTH = 11
|
6
|
+
REGEX = /^(\d{3}\.?\d{3}\.?\d{3})-?(\d{2})$/
|
7
|
+
ALGS_1 = [10, 9, 8, 7, 6, 5, 4, 3, 2]
|
8
|
+
ALGS_2 = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2]
|
9
|
+
|
10
|
+
def formatado
|
11
|
+
@numero =~ /(\d{3})\.?(\d{3})\.?(\d{3})-?(\d{2})/
|
12
|
+
valido? ? "#{$1}.#{$2}.#{$3}-#{$4}" : ''
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module ActAsCnpjCpf
|
4
|
+
describe CnpjOuCpf do
|
5
|
+
let(:codigos) { [ Faker::CNPJ.numeric, Faker::CNPJ.pretty,
|
6
|
+
Faker::CPF.numeric, Faker::CPF.pretty ] }
|
7
|
+
let(:invalidos) { ['', ' ', 1, 'aaaaa c', '11111111111', '11' '11.111.111/0000-11'] }
|
8
|
+
let(:model) { ActAsCnpjCpf::CnpjOuCpf }
|
9
|
+
let(:geradores) { [ Faker::CNPJ, Faker::CPF ] }
|
10
|
+
let(:formato_cnpj) { /(\d{2})\.?(\d{3})\.?(\d{3})\/?(\d{4})-?(\d{2})/ }
|
11
|
+
let(:formato_cpf) { /(\d{3})\.?(\d{3})\.?(\d{3})-?(\d{2})/ }
|
12
|
+
|
13
|
+
it_behaves_like 'objeto valido'
|
14
|
+
it_behaves_like 'objeto invalido'
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module ActAsCnpjCpf
|
4
|
+
describe Cnpj do
|
5
|
+
let(:codigos) { [ Faker::CNPJ.numeric, Faker::CNPJ.pretty ] }
|
6
|
+
let(:invalidos) { ['', ' ', 1, 'aaaaa c', '11111111111111', '11' '11.111.111/0000-11'] }
|
7
|
+
let(:model) { ActAsCnpjCpf::Cnpj }
|
8
|
+
let(:geradores) { [ Faker::CNPJ ] }
|
9
|
+
let(:formato_cnpj) { /(\d{2})\.?(\d{3})\.?(\d{3})\/?(\d{4})-?(\d{2})/ }
|
10
|
+
|
11
|
+
it_behaves_like 'objeto valido'
|
12
|
+
it_behaves_like 'objeto invalido'
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module ActAsCnpjCpf
|
4
|
+
describe Cpf do
|
5
|
+
let(:codigos) { [ Faker::CPF.numeric, Faker::CPF.pretty ] }
|
6
|
+
let(:invalidos) { ['', ' ', 1, 'aaaaa c', '11111111111', '11' '111.111.111-11'] }
|
7
|
+
let(:model) { ActAsCnpjCpf::Cpf }
|
8
|
+
let(:geradores) { [ Faker::CPF ] }
|
9
|
+
let(:formato_cpf) { /(\d{3})\.?(\d{3})\.?(\d{3})-?(\d{2})/ }
|
10
|
+
|
11
|
+
it_behaves_like 'objeto valido'
|
12
|
+
it_behaves_like 'objeto invalido'
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Cliente < ActiveRecord::Base
|
4
|
+
self.table_name = 'cnpj_cpf_test'
|
5
|
+
usar_como_cnpj_ou_cpf :codigo
|
6
|
+
end
|
7
|
+
|
8
|
+
class ClienteInvalido < ActiveRecord::Base
|
9
|
+
self.table_name = 'cnpj_cpf_test'
|
10
|
+
usar_como_cnpj_ou_cpf :codigo, permite_invalido: true
|
11
|
+
end
|
12
|
+
|
13
|
+
describe 'usar codigo como cnpj ou cpf' do
|
14
|
+
let(:model) { Cliente }
|
15
|
+
let(:model_inv) { ClienteInvalido }
|
16
|
+
let(:instance) { Cliente.new }
|
17
|
+
let(:instance_inv) { ClienteInvalido.new }
|
18
|
+
let(:tipo) { ActAsCnpjCpf::CnpjOuCnpj }
|
19
|
+
let(:formato_cnpj) { /(\d{2})\.?(\d{3})\.?(\d{3})\/?(\d{4})-?(\d{2})/ }
|
20
|
+
let(:formato_cpf) { /(\d{3})\.?(\d{3})\.?(\d{3})-?(\d{2})/ }
|
21
|
+
let(:geradores) { [ Faker::CPF, Faker::CNPJ ] }
|
22
|
+
let(:codigos) { [ Faker::CNPJ.numeric, Faker::CNPJ.pretty,
|
23
|
+
Faker::CPF.numeric, Faker::CPF.pretty ] }
|
24
|
+
let(:invalidos) { [ '', 'asda', '11111111112123', 11 ] }
|
25
|
+
|
26
|
+
it_behaves_like 'entidade valida'
|
27
|
+
it_behaves_like 'entidade invalida com permissao'
|
28
|
+
it_behaves_like 'entidade validavel'
|
29
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Empresa < ActiveRecord::Base
|
4
|
+
self.table_name = 'cnpj_cpf_test'
|
5
|
+
usar_como_cnpj :codigo
|
6
|
+
end
|
7
|
+
|
8
|
+
class EmpresaInvalida < ActiveRecord::Base
|
9
|
+
self.table_name = 'cnpj_cpf_test'
|
10
|
+
usar_como_cnpj :codigo, permite_invalido: true
|
11
|
+
end
|
12
|
+
|
13
|
+
describe 'usar codigo como cnpj' do
|
14
|
+
let(:model) { Empresa }
|
15
|
+
let(:model_inv) { EmpresaInvalida }
|
16
|
+
let(:instance) { Empresa.new }
|
17
|
+
let(:instance_inv) { EmpresaInvalida.new }
|
18
|
+
let(:tipo) { ActAsCnpjCpf::Cnpj }
|
19
|
+
let(:formato_cnpj) { /(\d{2})\.?(\d{3})\.?(\d{3})\/?(\d{4})-?(\d{2})/ }
|
20
|
+
let(:geradores) { [ Faker::CNPJ ] }
|
21
|
+
let(:codigos) { [ Faker::CNPJ.numeric, Faker::CNPJ.pretty ] }
|
22
|
+
let(:invalidos) { [ '', 'asda', '11111111112123', 11 ] }
|
23
|
+
|
24
|
+
it_behaves_like 'entidade valida'
|
25
|
+
it_behaves_like 'entidade invalida com permissao'
|
26
|
+
it_behaves_like 'entidade validavel'
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class Pessoa < ActiveRecord::Base
|
4
|
+
self.table_name = 'cnpj_cpf_test'
|
5
|
+
usar_como_cpf :codigo
|
6
|
+
end
|
7
|
+
|
8
|
+
class PessoaInvalida < ActiveRecord::Base
|
9
|
+
self.table_name = 'cnpj_cpf_test'
|
10
|
+
usar_como_cpf :codigo, permite_invalido: true
|
11
|
+
end
|
12
|
+
|
13
|
+
describe 'usar codigo como cpf' do
|
14
|
+
let(:model) { Pessoa }
|
15
|
+
let(:model_inv) { PessoaInvalida }
|
16
|
+
let(:instance) { Pessoa.new }
|
17
|
+
let(:instance_inv) { PessoaInvalida.new }
|
18
|
+
let(:tipo) { ActAsCnpjCpf::Cpf }
|
19
|
+
let(:formato_cpf) { /(\d{3})\.?(\d{3})\.?(\d{3})-?(\d{2})/ }
|
20
|
+
let(:geradores) { [ Faker::CPF ] }
|
21
|
+
let(:codigos) { [ Faker::CPF.numeric, Faker::CPF.pretty ] }
|
22
|
+
let(:invalidos) { [ '', 'asda', '11111111112', 11 ] }
|
23
|
+
|
24
|
+
it_behaves_like 'entidade valida'
|
25
|
+
it_behaves_like 'entidade invalida com permissao'
|
26
|
+
it_behaves_like 'entidade validavel'
|
27
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
if ENV['CODECLIMATE_REPO_TOKEN']
|
2
|
+
require "codeclimate-test-reporter"
|
3
|
+
CodeClimate::TestReporter.start
|
4
|
+
end
|
5
|
+
|
6
|
+
require 'act_as_cnpj_cpf'
|
7
|
+
require 'cpf_faker'
|
8
|
+
require 'support/active_record'
|
9
|
+
|
10
|
+
# shared samples
|
11
|
+
require 'support/cnpj_cpf_active_record_shared'
|
12
|
+
require 'support/cnpj_cpf_base_shared'
|
13
|
+
|
14
|
+
# silence warnings about i18n validation deprecations
|
15
|
+
I18n.config.enforce_available_locales = true
|
16
|
+
|
17
|
+
RSpec.configure do |config|
|
18
|
+
config.color = true
|
19
|
+
config.tty = true
|
20
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
ActiveRecord::Base.establish_connection adapter: 'sqlite3',
|
2
|
+
database: 'cnpj_cpf_spec.sqlite3'
|
3
|
+
|
4
|
+
ActiveRecord::Migration.drop_table :cnpj_cpf_test if ActiveRecord::Base.connection.table_exists? :cnpj_cpf_test
|
5
|
+
ActiveRecord::Migration.create_table :cnpj_cpf_test do |t|
|
6
|
+
t.string 'codigo'
|
7
|
+
end
|
8
|
+
|
9
|
+
RSpec.configure do |config|
|
10
|
+
config.around do |example|
|
11
|
+
ActiveRecord::Base.transaction do
|
12
|
+
example.run
|
13
|
+
raise ActiveRecord::Rollback
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,191 @@
|
|
1
|
+
shared_examples 'entidade valida' do
|
2
|
+
context 'com codigo valido' do
|
3
|
+
it 'deveria atribuir o codigo ao criar objeto' do
|
4
|
+
codigos.each do |codigo|
|
5
|
+
reg = model.new(codigo: codigo)
|
6
|
+
expect(reg.codigo.numero).to eq codigo.gsub(/[^0-9]/, '')
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'deveria atribuir codigo apos criar objeto' do
|
11
|
+
codigos.each do |codigo|
|
12
|
+
instance.codigo = codigo
|
13
|
+
expect(instance.codigo.numero).to eq codigo.gsub(/[^0-9]/, '')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it '.numero' do
|
18
|
+
codigos.each do |codigo|
|
19
|
+
instance.codigo = 'teste'
|
20
|
+
instance.codigo = codigo
|
21
|
+
expect(instance.codigo.numero).to eq codigo.gsub(/[^0-9]/, '')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it '#valido?' do
|
26
|
+
codigos.each do |codigo|
|
27
|
+
instance.codigo = codigo
|
28
|
+
expect(instance.codigo.valido?).to be true
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it '#to_s' do
|
33
|
+
codigos.each do |codigo|
|
34
|
+
instance.codigo = codigo
|
35
|
+
expect(instance.codigo.to_s).to eq codigo.gsub(/[^0-9]/, '')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it '#formatado' do
|
40
|
+
codigos.each do |codigo|
|
41
|
+
codigo.gsub!(/[^0-9]/, '')
|
42
|
+
instance.codigo = codigo
|
43
|
+
|
44
|
+
formatado = if instance.codigo.numero.length == 11
|
45
|
+
instance.codigo.numero =~ formato_cpf
|
46
|
+
"#{$1}.#{$2}.#{$3}-#{$4}"
|
47
|
+
else
|
48
|
+
instance.codigo.numero =~ formato_cnpj
|
49
|
+
"#{$1}.#{$2}.#{$3}/#{$4}-#{$5}"
|
50
|
+
end
|
51
|
+
|
52
|
+
expect(instance.codigo.formatado).to eq formatado
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
it '#valid?' do
|
57
|
+
instance.codigo = codigos.first
|
58
|
+
expect(instance.valid?).to be true
|
59
|
+
end
|
60
|
+
|
61
|
+
it '#save' do
|
62
|
+
instance.codigo = codigos.first
|
63
|
+
expect { instance.save }.to change(model, :count).by 1
|
64
|
+
end
|
65
|
+
|
66
|
+
it '#find' do
|
67
|
+
geradores.each do |gerador|
|
68
|
+
record = model.create!(codigo: (codigo = gerador.numeric))
|
69
|
+
loaded = model.find(record.id)
|
70
|
+
expect(record.codigo.numero).to eq loaded.codigo.numero
|
71
|
+
expect(loaded.codigo.numero).to eq codigo
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
it '#update' do
|
76
|
+
geradores.each do |gerador|
|
77
|
+
record = model.create!(codigo: gerador.numeric)
|
78
|
+
record.update(codigo: (codigo = gerador.numeric))
|
79
|
+
record.reload
|
80
|
+
expect(record.codigo.numero).to eq codigo
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
it '#== to_s' do
|
85
|
+
geradores.each do |gerador|
|
86
|
+
instance.codigo = (codigo = gerador.numeric)
|
87
|
+
expect(instance.codigo).to eq codigo
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
it '#== instance' do
|
92
|
+
geradores.each do |gerador|
|
93
|
+
codigo = gerador.numeric
|
94
|
+
instance.codigo = codigo
|
95
|
+
objeto = instance.codigo.class.new(codigo)
|
96
|
+
expect(instance.codigo).to eq objeto
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context 'com codigo invalido' do
|
102
|
+
it 'deveria atribuir codigo em branco ao criar objeto' do
|
103
|
+
invalidos.each do |codigo|
|
104
|
+
obj = model.new(codigo: codigo)
|
105
|
+
expect(obj.codigo.numero).to eq codigo
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
it '.numero' do
|
110
|
+
invalidos.each do |codigo|
|
111
|
+
instance.codigo = codigo
|
112
|
+
expect(instance.codigo.numero).to eq codigo
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
it '#valido' do
|
117
|
+
invalidos.each do |codigo|
|
118
|
+
instance.codigo = codigo
|
119
|
+
expect(instance.codigo.valido?).to be false
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
it '#to_s' do
|
124
|
+
invalidos.each do |codigo|
|
125
|
+
instance.codigo = codigo
|
126
|
+
expect(instance.codigo.to_s).to eq codigo
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
it '#formatado' do
|
131
|
+
invalidos.each do |codigo|
|
132
|
+
instance.codigo = codigo
|
133
|
+
expect(instance.codigo.formatado).to eq ''
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
it '#valid?' do
|
138
|
+
invalidos.each do |codigo|
|
139
|
+
instance.codigo = codigo
|
140
|
+
expect(instance.valid?).to be false
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
it '#save invalid' do
|
145
|
+
invalidos.each do |codigo|
|
146
|
+
instance.codigo = codigo
|
147
|
+
expect { instance.save }.to change(model, :count).by 0
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
it '#save empty' do
|
152
|
+
objeto = model.new
|
153
|
+
expect(objeto.save).to be false
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
shared_examples 'entidade invalida com permissao' do
|
159
|
+
it '#save' do
|
160
|
+
expect { instance_inv.save }.to change(model_inv, :count).by 1
|
161
|
+
end
|
162
|
+
|
163
|
+
it '#save nil' do
|
164
|
+
instance_inv.codigo = nil
|
165
|
+
expect { instance_inv.save }.to change(model_inv, :count).by 1
|
166
|
+
end
|
167
|
+
|
168
|
+
it '#save #reload' do
|
169
|
+
instance_inv.save
|
170
|
+
instance_inv.reload
|
171
|
+
expect(instance_inv.codigo).to eq nil
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
shared_examples 'entidade validavel' do
|
176
|
+
it '#errors' do
|
177
|
+
expect(instance.valid?).to be false
|
178
|
+
expect(instance.errors[:codigo]).to_not be_empty
|
179
|
+
end
|
180
|
+
|
181
|
+
it '#errors blank' do
|
182
|
+
expect(instance.valid?).to be false
|
183
|
+
expect(instance.errors[:codigo]).to eq [I18n.translate('errors.messages.blank')]
|
184
|
+
end
|
185
|
+
|
186
|
+
it '#errors invalid' do
|
187
|
+
instance.codigo = '12345678911'
|
188
|
+
expect(instance.valid?).to be false
|
189
|
+
expect(instance.errors[:codigo]).to eq [I18n.translate('errors.messages.invalid')]
|
190
|
+
end
|
191
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
shared_examples 'objeto valido' do
|
2
|
+
it 'instancia com numero sem formatacao' do
|
3
|
+
codigos.each do |codigo|
|
4
|
+
expect(model.new(codigo).numero).to eq codigo.gsub(/[^0-9]/, '')
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
it '#formatado' do
|
9
|
+
codigos.each do |codigo|
|
10
|
+
formatado = if codigo.gsub(/[^0-9]/, '').length == 11
|
11
|
+
codigo =~ formato_cpf
|
12
|
+
"#{$1}.#{$2}.#{$3}-#{$4}"
|
13
|
+
else
|
14
|
+
codigo =~ formato_cnpj
|
15
|
+
"#{$1}.#{$2}.#{$3}/#{$4}-#{$5}"
|
16
|
+
end
|
17
|
+
expect(model.new(codigo).formatado).to eq formatado
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it '#valido?' do
|
22
|
+
codigos.each do |codigo|
|
23
|
+
expect(model.new(codigo).valido?).to be true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it '#to_s' do
|
28
|
+
codigos.each do |codigo|
|
29
|
+
expect(model.new(codigo).to_s).to eq codigo.gsub(/[^0-9]/, '')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it '#==' do
|
34
|
+
geradores.each do |gerador|
|
35
|
+
codigo = gerador.numeric
|
36
|
+
expect(model.new(codigo)).to eq model.new(codigo)
|
37
|
+
expect(model.new(codigo)).to eq codigo
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
shared_examples 'objeto invalido' do
|
43
|
+
it 'instancia com numero vazio' do
|
44
|
+
invalidos.each do |codigo|
|
45
|
+
expect(model.new(codigo).numero).to eq codigo
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it '#formatado' do
|
50
|
+
invalidos.each do |codigo|
|
51
|
+
expect(model.new(codigo).formatado).to eq ''
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
it '#valido?' do
|
56
|
+
invalidos.each do |codigo|
|
57
|
+
expect(model.new(codigo).valido?).to eq false
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
it '#to_s' do
|
62
|
+
invalidos.each do |codigo|
|
63
|
+
expect(model.new(codigo).to_s).to eq codigo
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
metadata
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: act_as_cnpj_cpf
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Josué Lima
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-11-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activerecord
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3.1'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3.1'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: cpf_faker
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: sqlite3
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: Permite formatar e validar um atributo ActiveRecord como CPF, CNPJ ou
|
84
|
+
ambos
|
85
|
+
email:
|
86
|
+
- josuedsi@gmail.com
|
87
|
+
executables: []
|
88
|
+
extensions: []
|
89
|
+
extra_rdoc_files: []
|
90
|
+
files:
|
91
|
+
- ".gitignore"
|
92
|
+
- ".travis.yml"
|
93
|
+
- Gemfile
|
94
|
+
- Gemfile.lock
|
95
|
+
- README.md
|
96
|
+
- act_as_cnpj_cpf.gemspec
|
97
|
+
- lib/act_as_cnpj_cpf.rb
|
98
|
+
- lib/act_as_cnpj_cpf/base.rb
|
99
|
+
- lib/act_as_cnpj_cpf/cnpj.rb
|
100
|
+
- lib/act_as_cnpj_cpf/cnpj_cpf_active_record.rb
|
101
|
+
- lib/act_as_cnpj_cpf/cnpj_ou_cpf.rb
|
102
|
+
- lib/act_as_cnpj_cpf/cpf.rb
|
103
|
+
- lib/act_as_cnpj_cpf/version.rb
|
104
|
+
- spec/lib/cnpj_ou_cpf_spec.rb
|
105
|
+
- spec/lib/cnpj_spec.rb
|
106
|
+
- spec/lib/cpf_spec.rb
|
107
|
+
- spec/lib/usar_como_cnpj_ou_cpf_spec.rb
|
108
|
+
- spec/lib/usar_como_cnpj_spec.rb
|
109
|
+
- spec/lib/usar_como_cpf_spec.rb
|
110
|
+
- spec/spec_helper.rb
|
111
|
+
- spec/support/active_record.rb
|
112
|
+
- spec/support/cnpj_cpf_active_record_shared.rb
|
113
|
+
- spec/support/cnpj_cpf_base_shared.rb
|
114
|
+
homepage: https://github.com/josuelima/act_as_cnpj_cpf
|
115
|
+
licenses:
|
116
|
+
- MIT
|
117
|
+
metadata: {}
|
118
|
+
post_install_message:
|
119
|
+
rdoc_options: []
|
120
|
+
require_paths:
|
121
|
+
- lib
|
122
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: 1.9.3
|
127
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
requirements: []
|
133
|
+
rubyforge_project:
|
134
|
+
rubygems_version: 2.2.2
|
135
|
+
signing_key:
|
136
|
+
specification_version: 4
|
137
|
+
summary: Permite formatar e validar um atributo ActiveRecord como CPF, CNPJ ou ambos
|
138
|
+
test_files: []
|
139
|
+
has_rdoc:
|