Metadata-Version: 2.3
Name: ddd-python
Version: 0.7.2
Summary: Domain-Driven Design for Python
Author: v.morugin
Author-email: vamorugin@gmail.com
Requires-Python: >=3.9,<4.0
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Requires-Dist: pydantic (>=1.10.4,<3.0.0)
Requires-Dist: redis[redis] (>=5.0.0)
Requires-Dist: tenacity[tenacity] (>=9.0.0)
Description-Content-Type: text/markdown

[![Coverage Status](https://coveralls.io/repos/github/vmorugin/pyddd/badge.svg?branch=master)](https://coveralls.io/github/vmorugin/pyddd?branch=master) [![PyPI - License](https://img.shields.io/pypi/l/pyddd)](https://pypi.org/project/pyddd) [![PyPI](https://img.shields.io/pypi/v/pyddd)](https://pypi.org/project/pyddd) [![PyPI](https://img.shields.io/pypi/pyversions/pyddd)](https://pypi.org/project/pyddd) [![Mypy](http://www.mypy-lang.org/static/mypy_badge.svg)]()

# pyddd

`pyddd` - это DDD (Domain-Driven Design) фреймворк для Python, предоставляющий встроенный менеджер зависимостей и шину
сообщений. Он упрощает построение сложных доменных моделей и событийное программирование.

## Возможности

- **Разделение доменов** через `Module`
- **Использование команд и событий** (`DomainCommand`, `DomainEvent`)
- **Корневые сущности (`RootEntity`)** и управление идентификаторами (`EntityId`)
- **Встроенный менеджер зависимостей**
- **Событийно-ориентированная архитектура**

## Быстрый старт

### Определение доменной модели

```python
class PetCreated(DomainEvent, domain='pet'):
    pet_id: str
    name: str


class Pet(RootEntity):
    def __init__(self, name: str):
        self.name = name

    @classmethod
    def create(cls, name: str):
        pet = cls(name)
        pet.register_event(PetCreated(name=name, pet_id=pet.__reference__))
        return pet
```

### Репозитории и модуль

```python
class IPetRepository(abc.ABC):
    @abc.abstractmethod
    def save(self, entity: RootEntity):
        ...

    @abc.abstractmethod
    def get(self, name: str) -> Pet:
        ...


class CreatePet(DomainCommand, domain='pet'):
    name: str


pet_module = Module('pet')


@pet_module.register
def create_pet(cmd: CreatePet, repository: IPetRepository):
    pet = Pet.create(cmd.name)
    repository.save(pet)
    return pet.__reference__
```

### Запуск приложения

```python
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}')
```

### Запуск интеграционных тестов:

```shell
# Поднимаем внешние сервисы
docker-compose up -d

# Запуск тестов
pytest tests
```

## Лицензия

Этот проект распространяется под лицензией MIT. Подробности см. в файле LICENSE.

## Контрибьюция

Мы приветствуем ваш вклад! Создавайте issue, присылайте pull request'ы и помогайте развивать `pyddd`.

## Контакты

Если у вас есть вопросы или предложения, свяжитесь с нами через GitHub Issues.


