validates_as_cnpj 0.1.0 → 0.2.0

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/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -1,2 +1,2 @@
1
1
  require 'validates_as_cnpj/cnpj'
2
- require 'validates_as_cnpj/validates_as_cnpj'
2
+ require 'validates_as_cnpj/cnpj_validator'
@@ -1,46 +1,52 @@
1
1
  module CNPJ
2
- # Invalids
3
- INVALIDS = %w(
4
- 00000000000000 11111111111111 22222222222222 33333333333333
5
- 44444444444444 55555555555555 66666666666666 77777777777777
6
- 88888888888888 99999999999999)
7
-
8
- def self.valid? cnpj
9
- # Basic validation
2
+ BLACK_LIST = %w(00000000000000 11111111111111 22222222222222 33333333333333
3
+ 44444444444444 55555555555555 66666666666666 77777777777777
4
+ 88888888888888 99999999999999)
5
+
6
+ def self.valid?(cnpj)
10
7
  cnpj = cnpj.to_s
11
8
 
12
- if cnpj !~ /^\d{14}|\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}$/
9
+ # could be 13 or 14 digits or with mask 99.999.999/9999-99
10
+ if cnpj !~ /^\d{13,14}|\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}$/
13
11
  return false
14
12
  end
15
13
 
16
14
  cnpj = cnpj.scan(/\d/).collect(&:to_i)
15
+ cnpj.unshift(0) if cnpj.length == 13
17
16
 
18
- if INVALIDS.member? cnpj.to_s
17
+ # filter black list
18
+ if BLACK_LIST.include? cnpj.join
19
19
  return false
20
20
  end
21
21
 
22
- # Parse first digit
22
+ # calculate first digit
23
23
  factor = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
24
24
 
25
25
  sum = (0..11).inject(0) do |sum, i|
26
- sum + (cnpj[i] * factor[i])
26
+ sum + cnpj[i] * factor[i]
27
27
  end
28
28
 
29
29
  result = sum % 11
30
30
  result = result < 2 ? 0 : 11 - result
31
31
 
32
- return false unless cnpj[12] == result
32
+ if result != cnpj[12]
33
+ return false
34
+ end
33
35
 
34
- # Parse second digit
36
+ # calculate second digit
35
37
  factor.unshift 6
36
38
 
37
39
  sum = (0..12).inject(0) do |sum, i|
38
- sum + (cnpj[i] * factor[i])
40
+ sum + cnpj[i] * factor[i]
39
41
  end
40
42
 
41
43
  result = sum % 11
42
44
  result = result < 2 ? 0 : 11 - result
43
45
 
44
- return result == cnpj[13]
46
+ result == cnpj[13]
47
+ end
48
+
49
+ def self.invalid?(cnpj)
50
+ !valid?(cnpj)
45
51
  end
46
52
  end
@@ -0,0 +1,5 @@
1
+ class CnpjValidator < ActiveModel::EachValidator
2
+ def validate_each(record, attribute, value)
3
+ record.errors.add(attribute, options[:message]) if CNPJ.invalid?(value)
4
+ end
5
+ end
data/test/test_helper.rb CHANGED
@@ -1,3 +1,18 @@
1
1
  require 'rubygems'
2
+ require 'test/unit'
2
3
  require 'active_support'
3
- require 'active_support/test_case'
4
+ require 'active_record'
5
+ require 'validates_as_cnpj/cnpj_validator'
6
+ require 'validates_as_cnpj/cnpj'
7
+
8
+ # create a temporary database
9
+ ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => ':memory:'
10
+
11
+ silence_stream(STDOUT) do
12
+ ActiveRecord::Schema.define do
13
+ create_table :companies do |t|
14
+ t.string :name
15
+ t.string :document
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,35 @@
1
+ require 'test_helper'
2
+
3
+ class ValidatesAsCnpjTest < ActiveSupport::TestCase
4
+ class Company < ActiveRecord::Base
5
+ validates :document, :cnpj => true
6
+ end
7
+
8
+ test "blank values" do
9
+ assert_equal false, Company.new(:document => '').valid?
10
+ assert_equal false, Company.new(:document => false).valid?
11
+ assert_equal false, Company.new(:document => nil).valid?
12
+ end
13
+
14
+ test "black list" do
15
+ CNPJ::BLACK_LIST.each do |cnpj|
16
+ assert_equal false, Company.new(:document => cnpj).valid?
17
+ end
18
+ end
19
+
20
+ test "only digits" do
21
+ assert Company.new(:document => '41821571000174').valid?
22
+ end
23
+
24
+ test "with mask" do
25
+ assert Company.new(:document => '41.821.571/0001-74').valid?
26
+ end
27
+
28
+ test "integer value" do
29
+ assert Company.new(:document => 41821571000174).valid?
30
+ end
31
+
32
+ test "integer value missing 0" do
33
+ assert Company.new(:document => 3133161000141).valid?
34
+ end
35
+ end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 1
7
+ - 2
8
8
  - 0
9
- version: 0.1.0
9
+ version: 0.2.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Gabriel Sobrinho
@@ -26,19 +26,17 @@ extensions: []
26
26
 
27
27
  extra_rdoc_files:
28
28
  - README.textile
29
- - TODO
30
29
  files:
31
30
  - MIT-LICENSE
32
31
  - README.textile
33
32
  - Rakefile
34
- - TODO
35
33
  - VERSION
36
34
  - init.rb
37
35
  - lib/validates_as_cnpj.rb
38
36
  - lib/validates_as_cnpj/cnpj.rb
39
- - lib/validates_as_cnpj/validates_as_cnpj.rb
37
+ - lib/validates_as_cnpj/cnpj_validator.rb
40
38
  - test/test_helper.rb
41
- - test/validate_as_cpf_test.rb
39
+ - test/validate_as_cnpj_test.rb
42
40
  has_rdoc: true
43
41
  homepage: http://github.com/sobrinho/validates_as_cnpj
44
42
  licenses: []
@@ -71,4 +69,4 @@ specification_version: 3
71
69
  summary: CNPJ validation for ActiveModel
72
70
  test_files:
73
71
  - test/test_helper.rb
74
- - test/validate_as_cpf_test.rb
72
+ - test/validate_as_cnpj_test.rb
data/TODO DELETED
@@ -1 +0,0 @@
1
- Create tests
@@ -1,16 +0,0 @@
1
- module ActiveRecord
2
- module Validations
3
- module ClassMethods
4
- def validates_as_cnpj *attr_names
5
- configuration = { :message => :invalid }
6
- configuration.update(attr_names.extract_options!)
7
-
8
- validates_each(attr_names, configuration) do |record, attr_name, value|
9
- unless CNPJ::valid? value
10
- record.errors.add attr_name, configuration[:message]
11
- end
12
- end
13
- end
14
- end
15
- end
16
- end
@@ -1,8 +0,0 @@
1
- require 'test_helper'
2
-
3
- class ValidatesAsCnpjTest < ActiveSupport::TestCase
4
- # Replace this with your real tests.
5
- test "the truth" do
6
- assert true
7
- end
8
- end