validates_as_cnpj 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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