From ac464307da9445b09dcb17a7dd54c70a650ba309 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Ferreira=20Pires=20de=20Paiva?= Date: Wed, 30 Oct 2019 10:04:12 -0300 Subject: [PATCH] Ajustes --- README.md | 4 +- docs/index.md | 2 +- docs/sobre.md | 3 +- validate_docbr/CNH.py | 8 ++-- validate_docbr/TituloEleitoral.py | 79 ++++++++++++++++--------------- validate_docbr/__init__.py | 2 +- 6 files changed, 51 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index b6d3d6e..dd4a0de 100644 --- a/README.md +++ b/README.md @@ -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. diff --git a/docs/index.md b/docs/index.md index e1c2007..d3a850a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -11,4 +11,4 @@ Para instalar o pacote: ```bash pip install validate-docbr -``` \ No newline at end of file +``` diff --git a/docs/sobre.md b/docs/sobre.md index 67089b0..51f3d3d 100644 --- a/docs/sobre.md +++ b/docs/sobre.md @@ -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. diff --git a/validate_docbr/CNH.py b/validate_docbr/CNH.py index 43a9212..8d34fb1 100644 --- a/validate_docbr/CNH.py +++ b/validate_docbr/CNH.py @@ -1,6 +1,6 @@ from .BaseDoc import BaseDoc from random import sample -from typing import List +from typing import Union class CNH(BaseDoc): @@ -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 @@ -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 @@ -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 diff --git a/validate_docbr/TituloEleitoral.py b/validate_docbr/TituloEleitoral.py index a36cf77..4d9ac82 100644 --- a/validate_docbr/TituloEleitoral.py +++ b/validate_docbr/TituloEleitoral.py @@ -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 = [ @@ -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 = [ @@ -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:]) \ No newline at end of file diff --git a/validate_docbr/__init__.py b/validate_docbr/__init__.py index 7ac32e6..f19b7ba 100644 --- a/validate_docbr/__init__.py +++ b/validate_docbr/__init__.py @@ -3,4 +3,4 @@ from .CNPJ import CNPJ from .CNH import CNH from .CNS import CNS -from .TituloEleitoral import TituloEleitoral \ No newline at end of file +from .TituloEleitoral import TituloEleitoral