Skip to main content

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)

Último Lançamento no PyPI python Downloads License: MIT Discord

Avaliação de Segurança Avaliação de Confiabilidade Avaliação de Manutenibilidade Bugs Vulnerabilidades Code Smells

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:

  • NumericValidationContract para valores numéricos (faixas, limites, sinal)
  • DateTimeValidationContract para datas/horas (intervalos, mínimos/máximos)
  • UrlValidationContract para URLs
  • BrazilianDocumentValidationContract para 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

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

flunt-3.1.0.tar.gz (327.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

flunt-3.1.0-py3-none-any.whl (24.6 kB view details)

Uploaded Python 3

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

Hashes for flunt-3.1.0.tar.gz
Algorithm Hash digest
SHA256 c4c109e022193b6a9273a6f2b1b8ef0802b901b02d3f07879dd2d261cc5918be
MD5 29f911e8f09825f5962d775257afafc0
BLAKE2b-256 2fee3224f1147bbc442752b9cf09bbc9330462445bfd1d91d44633ccde2726ff

See more details on using hashes here.

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

Hashes for flunt-3.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 29be4a2309b5d56ec3415cf247751c486e2d5cda61bbe0bd6f80ee827250b60e
MD5 d3202206f270f03a862126e48fbc12a9
BLAKE2b-256 5e797f39b5f3d40e70661dc4ea60865c102510638b0fc04e7b14c8bd49f2967a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page