Metadata-Version: 2.1
Name: aioddd
Version: 1.4.0
Summary: Async Python DDD utilities library.
Author-email: ticdenis <denisnavarroalcaide@outlook.es>, yasti4 <adria_4_@hotmail.com>
Maintainer-email: ticdenis <denisnavarroalcaide@outlook.es>
License: MIT
Project-URL: documentation, https://aiopy.github.io/python-aioddd/
Project-URL: repository, https://github.com/aiopy/python-aioddd
Keywords: ddd,hexagonal,cqrs,aio,async
Classifier: Intended Audience :: Information Technology
Classifier: Intended Audience :: System Administrators
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Topic :: Software Development :: Libraries
Classifier: Topic :: Software Development
Classifier: Typing :: Typed
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Requires-Python: >=3.7
Description-Content-Type: text/markdown
License-File: LICENSE
Provides-Extra: dev
Requires-Dist: pre-commit>=2.19.0; extra == "dev"
Requires-Dist: tomli>=2.0.1; extra == "dev"
Requires-Dist: types-backports>=0.1.3; extra == "dev"
Requires-Dist: types-toml>=0.10.8; extra == "dev"
Provides-Extra: deploy
Requires-Dist: build>=0.8.0; extra == "deploy"
Requires-Dist: setuptools>=65.3.0; extra == "deploy"
Requires-Dist: twine>=4.0.1; extra == "deploy"
Requires-Dist: wheel>=0.37.1; extra == "deploy"
Provides-Extra: docs
Requires-Dist: mkdocs>=1.3.0; extra == "docs"
Requires-Dist: mkdocs-material>=8.2.15; extra == "docs"
Provides-Extra: fmt
Requires-Dist: black>=22.8.0; extra == "fmt"
Requires-Dist: isort>=5.10.1; extra == "fmt"
Provides-Extra: security-analysis
Requires-Dist: bandit>=1.7.4; extra == "security-analysis"
Requires-Dist: liccheck>=0.7.2; extra == "security-analysis"
Provides-Extra: static-analysis
Requires-Dist: mypy>=0.971; extra == "static-analysis"
Requires-Dist: pylint>=2.15.0; extra == "static-analysis"
Provides-Extra: test
Requires-Dist: nest-asyncio>=1.5.5; extra == "test"
Requires-Dist: psutil>=5.9.2; extra == "test"
Requires-Dist: pytest>=7.1.3; extra == "test"
Requires-Dist: pytest-asyncio>=0.19.0; extra == "test"
Requires-Dist: pytest-cov>=3.0.0; extra == "test"
Requires-Dist: pytest-xdist>=2.5.0; extra == "test"

# Async Python DDD utilities library

[![PyPI version](https://badge.fury.io/py/aioddd.svg)](https://badge.fury.io/py/aioddd)
[![PyPIDownloads](https://static.pepy.tech/badge/aioddd)](https://pepy.tech/project/aioddd)
[![CI](https://github.com/aiopy/python-aioddd/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/aiopy/python-aioddd/actions/workflows/ci.yml)

aioddd is an async Python DDD utilities library.

## Installation

Use the package manager [pip](https://pypi.org/project/aioddd/) to install aioddd.

```bash
pip install aioddd
```

## Documentation

- Visit [aioddd docs](https://aiopy.github.io/python-aioddd/).

## Usage

```python
from asyncio import get_event_loop
from dataclasses import dataclass
from typing import Type
from aioddd import NotFoundError, \
    Command, CommandHandler, SimpleCommandBus, \
    Query, QueryHandler, OptionalResponse, SimpleQueryBus, Event

_products = []

class ProductStored(Event):
    @dataclass
    class Attributes:
        ref: str

    attributes: Attributes

class StoreProductCommand(Command):
    def __init__(self, ref: str):
        self.ref = ref

class StoreProductCommandHandler(CommandHandler):
    def subscribed_to(self) -> Type[Command]:
        return StoreProductCommand

    async def handle(self, command: StoreProductCommand) -> None:
        _products.append(command.ref)

class ProductNotFoundError(NotFoundError):
    _code = 'product_not_found'
    _title = 'Product not found'

class FindProductQuery(Query):
    def __init__(self, ref: str):
        self.ref = ref

class FindProductQueryHandler(QueryHandler):
    def subscribed_to(self) -> Type[Query]:
        return FindProductQuery

    async def handle(self, query: FindProductQuery) -> OptionalResponse:
        if query.ref != '123':
            raise ProductNotFoundError.create(detail={'ref': query.ref})
        return {'ref': query.ref}

async def main() -> None:
    commands_bus = SimpleCommandBus([StoreProductCommandHandler()])
    await commands_bus.dispatch(StoreProductCommand('123'))
    query_bus = SimpleQueryBus([FindProductQueryHandler()])
    response = await query_bus.ask(FindProductQuery('123'))
    print(response)


if __name__ == '__main__':
    get_event_loop().run_until_complete(main())
```

## Requirements

- Python >= 3.7

## Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Please make sure to update tests as appropriate.

## License

[MIT](https://github.com/aiopy/python-aioddd/blob/master/LICENSE)
