Python implementation of Domain Notification Pattern inspired by Flunt (.NET)
Project description
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file flunt-3.1.0.tar.gz.
File metadata
- Download URL: flunt-3.1.0.tar.gz
- Upload date:
- Size: 327.0 kB
- Tags: Source
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c4c109e022193b6a9273a6f2b1b8ef0802b901b02d3f07879dd2d261cc5918be
|
|
| MD5 |
29f911e8f09825f5962d775257afafc0
|
|
| BLAKE2b-256 |
2fee3224f1147bbc442752b9cf09bbc9330462445bfd1d91d44633ccde2726ff
|
File details
Details for the file flunt-3.1.0-py3-none-any.whl.
File metadata
- Download URL: flunt-3.1.0-py3-none-any.whl
- Upload date:
- Size: 24.6 kB
- Tags: Python 3
- Uploaded using 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}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
29be4a2309b5d56ec3415cf247751c486e2d5cda61bbe0bd6f80ee827250b60e
|
|
| MD5 |
d3202206f270f03a862126e48fbc12a9
|
|
| BLAKE2b-256 |
5e797f39b5f3d40e70661dc4ea60865c102510638b0fc04e7b14c8bd49f2967a
|