Metadata-Version: 2.4
Name: explicit-python-django
Version: 1.4.0
Summary: Набор компонентов для интеграции explicit с django
Author-email: BARS Group <bars@bars-open.ru>
Project-URL: Homepage, https://stash.bars-open.ru/projects/EDUBASE/repos/explicit-django/browse
Project-URL: Repository, https://stash.bars-open.ru/scm/edubase/explicit-django.git
Classifier: Intended Audience :: Developers
Classifier: Environment :: Web Environment
Classifier: Natural Language :: Russian
Classifier: Natural Language :: English
Classifier: Operating System :: OS Independent
Classifier: License :: OSI Approved :: MIT License
Classifier: Development Status :: 5 - Production/Stable
Classifier: Programming Language :: Python
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
Classifier: Framework :: Django :: 2.2
Classifier: Framework :: Django :: 3.0
Classifier: Framework :: Django :: 3.1
Classifier: Framework :: Django :: 3.2
Classifier: Framework :: Django :: 4.0
Classifier: Framework :: Django :: 4.1
Classifier: Framework :: Django :: 4.2
Classifier: Framework :: Django :: 5.0
Classifier: Framework :: Django :: 5.1
Classifier: Framework :: Django :: 5.2
Classifier: Framework :: Django :: 6.0
Classifier: Framework :: Django :: 6.1
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: django
Requires-Dist: explicit-python<3,>=2
Provides-Extra: test
Requires-Dist: gunicorn; extra == "test"
Requires-Dist: factory-boy; extra == "test"
Requires-Dist: coverage; extra == "test"
Requires-Dist: tox; extra == "test"
Requires-Dist: tox-docker; extra == "test"
Requires-Dist: ipdb; extra == "test"
Requires-Dist: python-dateutil; extra == "test"
Dynamic: license-file

# Explicit-Django
## Набор компонентов для интеграции Explicit с Django.

### Базовая единица работы на транзакциях Django ORM.

```python
# persons/core/unit_of_work.py

from explicit.django.unit_of_work import BaseUnitOfWork

from persons.core.persons.adapters.db import Repository as PersonsRepository
from persons.core.persons.adapters.db import repository as persons_repository

# (имя атрибута, инстанс репо)
KNOWN_REPOS = (
    ('persons', persons_repository),
)


class UnitOfWork(BaseUnitOfWork):

    persons: PersonsRepository

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._registry.register(*KNOWN_REPOS)
```

### Декоратор для преобразования ошибок валидации предметной области в ошибки валидации Django
```python
from explicit.django.domain.validation.exceptions import handle_domain_validation_error

class ViewSet(...):

   @handle_domain_validation_error
   def create(self, request, *args, **kwargs):
       command = Command(...)
       bus.handle(command)

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

Тесты запускаются через `tox`. В системе должен быть установлен [uv](https://docs.astral.sh/uv/).

Для корректного запуска тестов необходимы следующие значения переменных окружения в системе. Вместо `<login>` и `<password>` необходимо подставить данные от УЗ БАРС:

```bash
UV_INDEX="internal=http://<login>:<password>@nexus.py.bars.group/repository/pypi-all/simple"
UV_DEFAULT_INDEX="https://pypi.org/simple"
UV_INDEX_STRATEGY=unsafe-best-match
# Для docker 29+
TOX_DOCKER_GATEWAY=localhost
```

Чтобы не менять значения системных переменных, можно создать `.env` файл c переменными окружения и запускать команды через [python-dotenv](https://github.com/theskumar/python-dotenv/).

Установка `tox` с необходимыми зависимостями:
```bash
uv tool install tox --with tox-uv --with m3-tox-docker
```

Или с использованием `python-dotenv`:
```bash
dotenv run uv tool install tox --with tox-uv --with m3-tox-docker
```

Запуск тестов:
```bash
tox
```

Через `python-dotenv`:
```bash
dotenv run tox
```

