act_as_cnpj_cpf 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,6 @@
1
+ .DS_Store
2
+ *.gem
3
+ .rvmrc
4
+ .bundle/
5
+ .rspec
6
+ cnpj_cpf_spec.sqlite3
@@ -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
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
3
+
4
+ group :development, :test do
5
+ gem "codeclimate-test-reporter", require: nil
6
+ end
@@ -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
@@ -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,3 @@
1
+ module ActAsCnpjCpf
2
+ VERSION = '1.0.1'
3
+ 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
@@ -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: