Skip to content

Commit

Permalink
Ajustes
Browse files Browse the repository at this point in the history
  • Loading branch information
alvarofpp committed Oct 30, 2019
1 parent 66399bb commit ac46430
Show file tree
Hide file tree
Showing 6 changed files with 51 additions and 47 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@ A documentação pode ser acessada [clicando aqui](https://alvarofpp.github.io/v
Documentos que estão no pacote:

- [CPF](https://github.com/alvarofpp/validate-docbr/wiki/CPF): Cadastro de Pessoas Físicas;
- [CNH](#): Carteira Nacional de Habilitação;
- [CNPJ](https://github.com/alvarofpp/validate-docbr/wiki/CNPJ): Cadastro Nacional da Pessoa Jurídica;
- [CNS](https://github.com/alvarofpp/validate-docbr/wiki/CNS): Cartão Nacional de Saúde.
- [CNS](https://github.com/alvarofpp/validate-docbr/wiki/CNS): Cartão Nacional de Saúde;
- [Título eleitoral](#): Cadastro que permite cidadãos brasileiros votar.

Para entender melhor os documentos e suas respectivas classes, basta acessar a Wiki do projeto.

Expand Down
2 changes: 1 addition & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ Para instalar o pacote:

```bash
pip install validate-docbr
```
```
3 changes: 2 additions & 1 deletion docs/sobre.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ Pacote Python para validação de documentos brasileiros.
Documentos que estão no pacote:

- CPF: Cadastro de Pessoas Físicas;
- CNH: Carteira Nacional de Habilitação;
- CNPJ: Cadastro Nacional da Pessoa Jurídica;
- CNS: Cartão Nacional de Saúde,
- CNS: Cartão Nacional de Saúde;
- Título Eleitoral: Cadastro que permite cidadãos brasileiros votar.
8 changes: 4 additions & 4 deletions validate_docbr/CNH.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from .BaseDoc import BaseDoc
from random import sample
from typing import List
from typing import Union


class CNH(BaseDoc):
Expand Down Expand Up @@ -35,7 +35,7 @@ def mask(self, doc: str = '') -> str:
"""Coloca a máscara de CNH na variável doc."""
return f'{doc[:3]} {doc[3:6]} {doc[6:9]} {doc[9:]}'

def _generate_first_digit(self, doc: list) -> tuple:
def _generate_first_digit(self, doc: Union[str, list]) -> str:
"""Gerar o primeiro dígito verificador da CNH."""
sum = 0

Expand All @@ -47,7 +47,7 @@ def _generate_first_digit(self, doc: list) -> tuple:
first_value, self.dsc = 0, 2
return str(first_value)

def _generate_second_digit(self, doc: list) -> str:
def _generate_second_digit(self, doc: Union[str, list]) -> str:
"""Gerar o segundo dígito verificador da CNH."""
sum = 0

Expand All @@ -61,7 +61,7 @@ def _generate_second_digit(self, doc: list) -> str:
second_value = 0
return str(second_value)

def _is_repeated_digits(self, doc: List[str]) -> bool:
def _is_repeated_digits(self, doc: str) -> bool:
"""Verifica se é uma CNH contém com números repetidos.
Exemplo: 11111111111"""
return len(set(doc)) == 1
79 changes: 40 additions & 39 deletions validate_docbr/TituloEleitoral.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,54 @@
from .BaseDoc import BaseDoc

from random import sample
from typing import List


class TituloEleitoral(BaseDoc):
"""Classe referente ao Título eleitoral"""

def __init__(self):
self.digits = list(range(10))
self.first_check_digit_weights = list(range(2, 10))
self.second_check_digit_weights = list(range(7, 10))
self.first_check_digit_doc_slice = slice(0, 8)
self.second_check_digit_doc_slice = slice(8, 10)

def __compute_first_check_digit(self, doc_digits: List[int]) -> int:

def validate(self, doc: str = '') -> bool:
"""Método para validar o título eleitoral."""
doc_digits = list(map(int, self._only_digits(doc=doc)))

if len(doc_digits) != 12:
return False

first_check_digit = self._compute_first_check_digit(doc_digits=doc_digits)
second_check_digit = self._compute_second_check_digit(doc_digits=doc_digits, first_check_digit=first_check_digit)

return first_check_digit == doc_digits[-2] and second_check_digit == doc_digits[-1]

def generate(self, mask: bool = False) -> str:
"""Método para gerar um título eleitoral válido."""
document_digits = [sample(self.digits, 1)[0] for _ in range(8)]

state_identifier = self._generate_valid_state_identifier()
document_digits.extend(map(int, state_identifier))

first_check_digit = self._compute_first_check_digit(doc_digits=document_digits)
second_check_digit = self._compute_second_check_digit(doc_digits=document_digits,
first_check_digit=first_check_digit)
document_digits.extend([first_check_digit, second_check_digit])

document = ''.join(map(str, document_digits))

if mask:
return self.mask(doc=document)

return document

def mask(self, doc: str = '') -> str:
"""Mascara o documento enviado"""
return '{} {} {}'.format(doc[0:4], doc[4:8], doc[8:])

def _compute_first_check_digit(self, doc_digits: List[int]) -> int:
"""Método que calcula o primeiro dígito verificador."""
doc_digits_to_consider = doc_digits[self.first_check_digit_doc_slice]
terms = [
Expand All @@ -28,7 +63,7 @@ def __compute_first_check_digit(self, doc_digits: List[int]) -> int:

return total % 11

def __compute_second_check_digit(self, doc_digits: List[int], first_check_digit: int) -> int:
def _compute_second_check_digit(self, doc_digits: List[int], first_check_digit: int) -> int:
"""Método que calcula o segundo dígito verificador."""
doc_digits_to_consider = doc_digits[self.second_check_digit_doc_slice] + [first_check_digit]
terms = [
Expand All @@ -43,40 +78,6 @@ def __compute_second_check_digit(self, doc_digits: List[int], first_check_digit:

return total % 11

def validate(self, doc: str = '') -> bool:
"""Método para validar o título eleitoral."""
doc_digits = list(map(int, self._only_digits(doc=doc)))

if len(doc_digits) != 12:
return False

first_check_digit = self.__compute_first_check_digit(doc_digits=doc_digits)
second_check_digit = self.__compute_second_check_digit(doc_digits=doc_digits, first_check_digit=first_check_digit)

return first_check_digit == doc_digits[-2] and second_check_digit == doc_digits[-1]

def __generate_valid_state_identifier(self) -> str:
def _generate_valid_state_identifier(self) -> str:
state_identifier = str(sample(range(1, 19), 1)[0])
return state_identifier.zfill(2)

def generate(self, mask: bool = False) -> str:
"""Método para gerar um título eleitoral válido."""
document_digits = [sample(self.digits, 1)[0] for _ in range(8)]

state_identifier = self.__generate_valid_state_identifier()
document_digits.extend(map(int, state_identifier))

first_check_digit = self.__compute_first_check_digit(doc_digits=document_digits)
second_check_digit = self.__compute_second_check_digit(doc_digits=document_digits, first_check_digit=first_check_digit)

document_digits.extend([first_check_digit, second_check_digit])

document = ''.join(map(str, document_digits))

if mask:
return self.mask(doc=document)
return document

def mask(self, doc: str = '') -> str:
"""Mascara o documento enviado"""
return '{} {} {}'.format(doc[0:4], doc[4:8], doc[8:])
2 changes: 1 addition & 1 deletion validate_docbr/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
from .CNPJ import CNPJ
from .CNH import CNH
from .CNS import CNS
from .TituloEleitoral import TituloEleitoral
from .TituloEleitoral import TituloEleitoral

0 comments on commit ac46430

Please sign in to comment.