act_as_cnpj_cpf 1.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.
@@ -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: