brazilian-documents-validations 0.1.0 → 0.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 101c8de41a43cb7c4fb6fa53cef7eeb9e9fa30da
4
- data.tar.gz: e5307e4a9573dde8e6d15047c8822e17ba8b9eb6
3
+ metadata.gz: 67e25d17a350084aaabfa4be325b6ff5ab6100bf
4
+ data.tar.gz: bad9cc5b9f666864fcd0614cad1420aa1457b97e
5
5
  SHA512:
6
- metadata.gz: 98e6b869e1059079bb2c19c5ea2a13b621efa5f60a17261748eb0a57275322c2cdfbbd4a4858ac28808d8019d506f069084fb9673e01e217091b161c2b1881d6
7
- data.tar.gz: 3cab40a2ffe748d362317bb12c703ffdbc7d904e49a9c0e712b42561aab9be3b0ae2218a4f1a7b3ca295a80838bef4238d19cae02eb2cefcebcd7e8f4dcd3ff4
6
+ metadata.gz: 91ff96e10aff7b26b9e13cb9fafaad883ce1e85dd99907fdf3475f33e998c573a9081b19d6553dc78a5a86b157044da35bf8dcc2bf4160bf94e979b4b52ed0ac
7
+ data.tar.gz: ceac58a4ae460b25f4217e571d61fd70c5db900834ba190d91c02577e91b6b9b2f8899a4e74795a6b04c49c87279271b7ffbb61a11038d347024d4bf9fc797d6
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  [![Build Status](https://travis-ci.org/joaomilho/brazilian-documents-validations.png?branch=master)](https://travis-ci.org/joaomilho/brazilian-documents-validations.)
2
2
 
3
- [![Code climate](https://codeclimate.com/github/joaomilho/brazilian-documents-validations..png)](https://codeclimate.com/github/joaomilho/brazilian-documents-validations.)
3
+ [![Code Climate](https://codeclimate.com/github/joaomilho/brazilian-documents-validations.png)](https://codeclimate.com/github/joaomilho/brazilian-documents-validations)
4
4
 
5
5
  ## Brazilian Documents Validations
6
6
 
@@ -1,5 +1,7 @@
1
1
  require 'active_model'
2
2
 
3
+ require 'brazilian-documents-validations/document_validator'
4
+
3
5
  require 'brazilian-documents-validations/cpf'
4
6
  require 'brazilian-documents-validations/cnpj'
5
7
  require 'brazilian-documents-validations/cpf_validator'
@@ -1,46 +1,29 @@
1
1
  module CNPJ
2
2
 
3
- def self.valid?(cnpj)
4
- cnpj = cnpj.to_s
5
-
6
- # could be 13 or 14 digits or with mask 99.999.999/9999-99
7
- return false if cnpj !~ /^\d{13,14}|\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}$/
8
-
9
-
10
- cnpj = cnpj.scan(/\d/).collect(&:to_i)
11
-
12
- # filter 111... to 999...
13
- return false if cnpj.uniq.size == 1
14
-
15
- cnpj.unshift(0) if cnpj.length == 13
3
+ def self.valid? cnpj
4
+ Validator.new(cnpj).valid?
5
+ end
16
6
 
7
+ def self.invalid?(cnpj)
8
+ not valid?(cnpj)
9
+ end
17
10
 
18
- # calculate first digit
19
- factor = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
11
+ class Validator < DocumentValidator
20
12
 
21
- sum = (0..11).inject(0) do |sum, i|
22
- sum + cnpj[i] * factor[i]
13
+ def initialize cnpj
14
+ @document = cnpj.to_s
15
+ @size = 14
23
16
  end
24
17
 
25
- result = sum % 11
26
- result = result < 2 ? 0 : 11 - result
27
-
28
- return false if result != cnpj[12]
29
-
30
- # calculate second digit
31
- factor.unshift 6
18
+ private
32
19
 
33
- sum = (0..12).inject(0) do |sum, i|
34
- sum + cnpj[i] * factor[i]
20
+ def valid_format?
21
+ @document =~ /^\d{13,14}|\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}$/
35
22
  end
36
23
 
37
- result = sum % 11
38
- result = result < 2 ? 0 : 11 - result
24
+ def factor
25
+ [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
26
+ end
39
27
 
40
- result == cnpj[13]
41
- end
42
-
43
- def self.invalid?(cnpj)
44
- !valid?(cnpj)
45
28
  end
46
- end
29
+ end
@@ -1,62 +1,29 @@
1
1
  module CPF
2
2
 
3
- BLACK_LIST = (0..9).map{|i| i.to_s * 11 } << '12345678909'
4
-
5
- def self.mock size=1
6
- size == 1 ? generate : size.times.map{ generate }
3
+ def self.valid?(cpf)
4
+ Validator.new(cpf).valid?
7
5
  end
8
6
 
9
- def self.generate
10
- ns = Array.new(9){ rand(9) }
11
- rec = 10
12
- d1 = ns.inject(0){|s,i| s = s + i*rec; rec -= 1; s }
13
-
14
- d1 = 11 - ( d1 % 11 )
15
- d1 = 0 if d1 >= 10
16
- rec = 11
17
- d2 = d1*2 + ns.inject(0){|s,i| s = s + i*rec; rec -= 1; s }
18
- d2 = 11 - ( d2 % 11 )
19
- d2 = 0 if d2 >= 10
20
- ns << d1 << d2
21
- ns.join
7
+ def self.invalid?(cpf)
8
+ not valid?(cpf)
22
9
  end
23
10
 
24
- def self.valid?(cpf)
25
- cpf = cpf.to_s
26
-
27
- # could be 10 or 11 digits or with mask 999.999.999-99
28
- return false if cpf !~ /^\d{10,11}|\d{3}\.\d{3}\.\d{3}-\d{2}$/
29
-
30
- cpf = cpf.scan(/\d/).collect(&:to_i)
31
- cpf.unshift(0) if cpf.length == 10
32
-
33
- # filter black list
34
- return false if BLACK_LIST.include? cpf.join
11
+ class Validator < DocumentValidator
35
12
 
36
- # calculate first digit
37
- sum = (0..8).inject(0) do |sum, i|
38
- sum + cpf[i] * (10 - i)
13
+ def initialize cpf
14
+ @document = cpf.to_s
15
+ @size = 11
39
16
  end
40
17
 
41
- result = sum % 11
42
- result = result < 2 ? 0 : 11 - result
18
+ private
43
19
 
44
- return false if result != cpf[9]
45
-
46
- # calculate second digit
47
- sum = (0..8).inject(0) do |sum, i|
48
- sum + cpf[i] * (11 - i)
20
+ def valid_format?
21
+ @document =~ /^\d{10,11}|\d{3}\.\d{3}\.\d{3}-\d{2}$/
49
22
  end
50
23
 
51
- sum += cpf[9] * 2
52
-
53
- result = sum % 11
54
- result = result < 2 ? 0 : 11 - result
55
-
56
- result == cpf[10]
57
- end
24
+ def factor
25
+ (2..11).to_a.reverse
26
+ end
58
27
 
59
- def self.invalid?(cpf)
60
- !valid?(cpf)
61
28
  end
62
29
  end
@@ -0,0 +1,68 @@
1
+ class DocumentValidator
2
+
3
+ def valid?
4
+ valid_format? and
5
+ whitelisted? and
6
+ valid_first_digit? and
7
+ valid_second_digit?
8
+ end
9
+
10
+ private
11
+
12
+ def whitelisted?
13
+ to_a.uniq.size > 1
14
+ end
15
+
16
+ def to_a
17
+ @to_a ||= split(@document)
18
+ end
19
+
20
+ def calculate_mod value
21
+ mod = value % 11
22
+ mod < 2 ? 0 : 11 - mod
23
+ end
24
+
25
+ def valid_first_digit?
26
+ first_digit_calculated == first_digit
27
+ end
28
+
29
+ def valid_second_digit?
30
+ second_digit_calculated == second_digit
31
+ end
32
+
33
+ def first_digit
34
+ to_a[-2]
35
+ end
36
+
37
+ def second_digit
38
+ to_a.last
39
+ end
40
+
41
+ def split value
42
+ splitted = value.scan(/\d/).collect(&:to_i)
43
+ splitted.length == @size - 1 ? splitted.unshift(0) : splitted
44
+ end
45
+
46
+ def sum chars, factor
47
+ (0..chars).inject(0) do |sum, i|
48
+ sum + to_a[i] * factor[i]
49
+ end
50
+ end
51
+
52
+ def first_sum
53
+ sum @size-3, factor[1..-1]
54
+ end
55
+
56
+ def second_sum
57
+ sum @size-2, factor
58
+ end
59
+
60
+ def first_digit_calculated
61
+ calculate_mod(first_sum)
62
+ end
63
+
64
+ def second_digit_calculated
65
+ calculate_mod(second_sum)
66
+ end
67
+
68
+ end
@@ -1,3 +1,3 @@
1
1
  module BrazilianDocumentsValidations
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brazilian-documents-validations
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maiz Lulkin
@@ -52,6 +52,7 @@ files:
52
52
  - lib/brazilian-documents-validations/cnpj_validator.rb
53
53
  - lib/brazilian-documents-validations/cpf.rb
54
54
  - lib/brazilian-documents-validations/cpf_validator.rb
55
+ - lib/brazilian-documents-validations/document_validator.rb
55
56
  - lib/brazilian-documents-validations/version.rb
56
57
  homepage: https://github.com/joaomilho/brazilian-documents-validations
57
58
  licenses: []