alfac 0.1.0__tar.gz

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.
alfac-0.1.0/LICENSE ADDED
File without changes
alfac-0.1.0/PKG-INFO ADDED
@@ -0,0 +1,16 @@
1
+ Metadata-Version: 2.1
2
+ Name: alfac
3
+ Version: 0.1.0
4
+ Summary: Validador de CNPJ Alfanumérico conforme novas normas do Governo (2024).
5
+ License: MIT
6
+ Keywords: cnpj,alfanumerico,validador,governo,brasil
7
+ Author: kleitomberg
8
+ Author-email: kss@cin.ufpe.br
9
+ Requires-Python: >=3.12,<4.0
10
+ Classifier: License :: OSI Approved :: MIT License
11
+ Classifier: Operating System :: OS Independent
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
14
+ Description-Content-Type: text/markdown
15
+
16
+
alfac-0.1.0/README.md ADDED
File without changes
File without changes
@@ -0,0 +1,61 @@
1
+ import re
2
+ from math import ceil
3
+
4
+ class DigitoVerificador:
5
+ """Classe responsável pelo cálculo matemático do Módulo 11 alfanumérico."""
6
+ def __init__(self, conteudo: str):
7
+ self.conteudo = conteudo.upper()
8
+ self.pesos = []
9
+
10
+ def _calcula_ascii(self, char: str) -> int:
11
+ # Regra oficial: Valor ASCII - 48
12
+ return ord(char) - 48
13
+
14
+ def _gerar_pesos(self):
15
+ tamanho = len(self.conteudo)
16
+ # Repetições de 2 a 9
17
+ num_repeticoes = ceil(tamanho / 8)
18
+ for _ in range(num_repeticoes):
19
+ self.pesos.extend(range(2, 10))
20
+ self.pesos = self.pesos[:tamanho]
21
+ self.pesos.reverse()
22
+
23
+ def calcula(self) -> int:
24
+ self._gerar_pesos()
25
+ # Soma ponderada dos valores convertidos pelos pesos
26
+ soma = sum(a * b for a, b in zip(map(self._calcula_ascii, self.conteudo), self.pesos))
27
+ resto = soma % 11
28
+ return 0 if resto < 2 else 11 - resto
29
+
30
+ class CNPJ:
31
+ """Classe de negócio para tratar a estrutura do CNPJ."""
32
+ def __init__(self, cnpj_input: str):
33
+ # Remove caracteres de pontuação comuns
34
+ self.limpo = "".join(filter(str.isalnum, str(cnpj_input))).upper()
35
+
36
+ def e_valido(self) -> bool:
37
+ # 1. Validação de tamanho e formato (Regex oficial do Serpro)
38
+ if not re.match(r'^([A-Z]|\d){12}\d{2}$', self.limpo):
39
+ return False
40
+
41
+ # 2. Bloqueio de letras proibidas pela norma (I, O, Q)
42
+ if any(c in self.limpo for c in "IOQ"):
43
+ return False
44
+
45
+ # 3. Bloqueio de valores zerados (comum em testes de fumaça)
46
+ if self.limpo == "0" * 14:
47
+ return False
48
+
49
+ base = self.limpo[:12]
50
+ dv_informado = self.limpo[12:]
51
+
52
+ # Cálculo do DV1
53
+ dv1 = DigitoVerificador(base).calcula()
54
+ # Cálculo do DV2 (base + dv1)
55
+ dv2 = DigitoVerificador(base + str(dv1)).calcula()
56
+
57
+ return f"{dv1}{dv2}" == dv_informado
58
+
59
+ def validar_cnpj(cnpj: str) -> bool:
60
+ """Interface simplificada para uso externo."""
61
+ return CNPJ(cnpj).e_valido()
@@ -0,0 +1,27 @@
1
+ [tool.poetry]
2
+ name = "alfac"
3
+ version = "0.1.0"
4
+ description = "Validador de CNPJ Alfanumérico conforme novas normas do Governo (2024)."
5
+ authors = ["kleitomberg <kss@cin.ufpe.br>"]
6
+ readme = "README.md"
7
+
8
+ keywords = ["cnpj", "alfanumerico", "validador", "governo", "brasil"]
9
+ license = "MIT"
10
+
11
+ # Mova os classifiers para cá
12
+ classifiers = [
13
+ "Programming Language :: Python :: 3",
14
+ "License :: OSI Approved :: MIT License",
15
+ "Operating System :: OS Independent",
16
+ "Topic :: Software Development :: Libraries :: Python Modules"
17
+ ]
18
+
19
+ [tool.poetry.dependencies]
20
+ python = "^3.12"
21
+
22
+ [tool.poetry.group.dev.dependencies]
23
+ pytest = "^8.0.0"
24
+
25
+ [build-system]
26
+ requires = ["poetry-core"]
27
+ build-backend = "poetry.core.masonry.api"