Domain-Driven Design for Python
Project description
pyddd
pyddd - это DDD (Domain-Driven Design) фреймворк для Python, предоставляющий встроенный менеджер зависимостей и шину
сообщений. Он упрощает построение сложных доменных моделей и событийное программирование.
Возможности
- Разделение доменов через
Module - Использование команд и событий (
DomainCommand,DomainEvent) - Корневые сущности (
RootEntity) - Встроенный менеджер зависимостей
- Событийно-ориентированная архитектура
- Транспорт для работы с событиями
- Базовый
Unit Of Workи репозиторий
Локальная установка зависимостей
Нужно установить poetry и все зависимости. Запуск тестов через pytest
pip install uv
uv install --all-extras
pytest .
Быстрый старт
import abc
from pyddd.domain import RootEntity, DomainEvent, DomainCommand, DomainName
from pyddd.application import Module, Application, set_application
# Определение домена
__domain__ = DomainName('pet')
class PetCreated(DomainEvent, domain=__domain__):
pet_id: str
name: str
class Pet(RootEntity):
name: str
@classmethod
def create(cls, name: str):
pet = cls(name=name)
pet.register_event(PetCreated(name=name, pet_id=pet.__reference__))
return pet
# Репозитории и модуль
class IPetRepository(abc.ABC):
@abc.abstractmethod
def save(self, entity: RootEntity):
...
@abc.abstractmethod
def get(self, name: str) -> Pet:
...
class CreatePet(DomainCommand, domain=__domain__):
name: str
pet_module = Module(__domain__)
@pet_module.register
def create_pet(cmd: CreatePet, repository: IPetRepository):
pet = Pet.create(cmd.name)
repository.save(pet)
return pet.__reference__
# Запуск приложения
class InMemoryPetRepo(IPetRepository):
def __init__(self):
self.memory = {}
def get(self, name: str) -> Pet:
return self.memory.get(name)
def save(self, entity: Pet):
self.memory[entity.name] = entity
# Настройка приложения
app = Application()
app.run()
app.include(pet_module)
app.set_defaults('pet', repository=InMemoryPetRepo())
set_application(app)
# Работа с юзкейсами через команды и шину приложения
fluff_id = app.handle(CreatePet(name='Fluff'))
print(f'Создан питомец с ID: {fluff_id}')
Запуск интеграционных тестов:
# Поднимаем внешние сервисы
docker-compose up -d
# Запуск тестов
pytest tests
Лицензия
Этот проект распространяется под лицензией MIT. Подробности см. в файле LICENSE.
Контрибьюция
Мы приветствуем ваш вклад! Создавайте issue, присылайте pull request'ы и помогайте развивать pyddd.
Контакты
Если у вас есть вопросы или предложения, свяжитесь с нами через GitHub Issues.
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 pyddd-0.11.8.tar.gz.
File metadata
- Download URL: pyddd-0.11.8.tar.gz
- Upload date:
- Size: 24.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a8365bfe4ba2dcf2fb2d79c4d03dd2eb219641825f01a0579fa7faa7496993f4
|
|
| MD5 |
f2c2cfb9290d6d8d4a9a9a0c726c87de
|
|
| BLAKE2b-256 |
b5227a3d04e0229d82aa011e28a1807116dc0d21d8f88fecb0405f4ef6f696ba
|
File details
Details for the file pyddd-0.11.8-py3-none-any.whl.
File metadata
- Download URL: pyddd-0.11.8-py3-none-any.whl
- Upload date:
- Size: 46.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.8
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2e697ed3ffe33e1c011ec5bb67d576294bb6e7beae0fb8e3a4b5b93682dac844
|
|
| MD5 |
9658f65a83b4ff6881c830fbb8d8cb46
|
|
| BLAKE2b-256 |
c304eb0288d608166f73ef78bfda40e23dad7478377247e6dfef198ea8cc6fa6
|