PORTUGUÊS | ENGLISH
🐍 PyFlunt: Domain Notification Pattern
Implementação Python inspirada no Flunt (.NET)
Flunt te auxilia a implementar Domain Notification Pattern em sua aplicação para centralizar erros e mudanças em determinadas ações e entidades.
Flunt surgiu de duas necessidades: implementar o Domain Notification Pattern para substituir exceções no nível de domínio da aplicação e reduzir a quantidade de IFs (complexidade) usando uma abordagem baseada em contratos.
Assim, basicamente o que o Flunt faz é adicionar uma lista de Notificações à sua classe e vários métodos para interagir com ela.
✨ Destaques
- Compatível com Python 3.11+ e sem dependências de runtime.
- Validações fluentes encadeáveis baseadas no Domain Notification Pattern.
- Contratos especializados para números, datas/horas, URLs e documentos brasileiros (CPF/CNPJ).
- Notificações centralizadas via
Notifiable, evitando ifs espalhados e exceções de domínio. - Documentação completa em
docs/e no site (link abaixo).
Novos contratos de validação
Além do contrato base, a biblioteca agora inclui contratos especializados para cenários comuns:
NumericValidationContractpara valores numéricos (faixas, limites, sinal)DateTimeValidationContractpara datas/horas (intervalos, mínimos/máximos)UrlValidationContractpara URLsBrazilianDocumentValidationContractpara documentos brasileiros (CPF/CNPJ)
Consulte a documentação em docs/validations/ para exemplos detalhados.
➡️ Como usar
🔑 Requisitos
- Python 3.11 ou superior
- Sem dependências de runtime (ferramentas de dev opcionais:
uv,ruff,mypy,pytest)
🔧 Instalação
pip install flunt
🔔 Notifiable
O Notifiable é a classe base que fornece funcionalidades para armazenar e gerenciar notificações:
from flunt.notifications.notifiable import Notifiable
class Nome(Notifiable):
def __init__(self, nome):
super().__init__()
if len(nome) < 3:
self.add_notification(
field='nome',
message='Nome deve ter pelo menos 3 caracteres',
)
self._nome = nome
📜 Contract
O Contract fornece métodos para validações encadeadas:
"""Módulo de exemplo com Objetos de Valor."""
from flunt.notifications.notifiable import Notifiable
from flunt.validations.contract import Contract
class Pessoa(Notifiable):
"""Classe Objeto de Valor Pessoa."""
def __init__(self, primeiro_nome, ultimo_nome, email):
"""Construtor da classe."""
super().__init__()
self.primeiro_nome = primeiro_nome
self.ultimo_nome = ultimo_nome
self.email = email
# Criando um contrato de validação
contract = (
Contract()
.requires(self.primeiro_nome, "primeiro nome", "Nome é obrigatório")
.requires(self.ultimo_nome, "ultimo nome", "Sobrenome é obrigatório")
.requires(self.email, "email", "E-mail é obrigatório")
.is_lower_than(
self.primeiro_nome,
3,
"primeiro_nome",
"Nome deve ter no mínimo 3 caracteres",
)
.is_lower_than(
self.ultimo_nome,
3,
"ultimo_nome",
"Sobrenome deve ter no mínimo 3 caracteres",
)
.is_email(self.email, "email", "E-mail inválido")
)
# Adicionando as notificações do contrato à entidade
self.add_notifications(contract.get_notifications())
# Exemplo de uso
pessoa = Pessoa("Alfredo", "Biscoito", "alfredo@biscoito.com")
if not pessoa.is_valid:
for notification in pessoa.get_notifications():
print(notification)
else:
print("Validado com sucesso!")
Contribuindo
Consulte nosso DevGuide no link a seguir: CONTRIBUTING
📚 Documentação
- Site (MkDocs): https://fazedordecodigo.github.io/PyFlunt/
- Arquivos locais:
docs/
Registro de Alterações
Consulte nosso registro de alterações no link a seguir: CHANGELOG
📄 Licença
Este projeto contém a licença MIT. Consulte o arquivo LICENSE.
Mods
Metadata
Release files for Flunt 3.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| flunt-3.1.0.tar.gz | 327.0 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| flunt-3.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 351.6 kB
Release files / flunt-3.1.0.tar.gz
| Download URL | flunt-3.1.0.tar.gz |
|---|---|
| Size | 327.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c4c109e022193b6a9273a6f2b1b8ef0802b901b02d3f07879dd2d261cc5918be
|
|
BLAKE2b-256 checksum How to use checksums |
2fee3224f1147bbc442752b9cf09bbc9330462445bfd1d91d44633ccde2726ff
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.15 {"installer":{"name":"uv","version":"0.9.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / flunt-3.1.0-py3-none-any.whl
| Download URL | flunt-3.1.0-py3-none-any.whl |
|---|---|
| Size | 24.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
29be4a2309b5d56ec3415cf247751c486e2d5cda61bbe0bd6f80ee827250b60e
|
|
BLAKE2b-256 checksum How to use checksums |
5e797f39b5f3d40e70661dc4ea60865c102510638b0fc04e7b14c8bd49f2967a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.15 {"installer":{"name":"uv","version":"0.9.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for Flunt 3.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.