Primitives for writing scenarios
Project description
Classic Scenarios
Предоставляет примитивы для написания простых сценариев с бизнес-логикой.
Установка
pip install classic-scenarios
Использование
from classic.components import component, no_init
from classic.scenarios import scenario, Return
import pydantic
class SomeEntity(pydantic.BaseModel):
"""Это как будто очень полезный класс,
представляющий собой какое-то понятие из предметной области
"""
id: int
class SomeParams(pydantic.BaseModel):
"""Модель для проверки ввода"""
some_obj_id: int
some_prop: str
class Database:
"""Интерфейс для объекта, работающего с БД"""
def get(self, id):
raise NotImplemented
def save(self, obj):
raise NotImplemented
# Использование component не обязательно,
# но с ним выглядит более идиоматично
@component
class SomeUseCase:
db: Database
params: SomeParams = no_init(None)
some_obj: SomeEntity = no_init(None)
@scenario
def run(self):
"""
Это сценарий транзакции,
в котором последовательно,
шаг за шагом прописаны шаги.
"""
self._do_something()
self._do_anything()
self._and_something_yet()
def _do_something(self):
"""Здесь можно сделать что-то полезное, например, взять объект из БД"""
self.some_obj = self.db.get(self.params.some_obj_id)
def _do_anything(self):
if self.some_obj is None:
# Это приведет к остановке сценария,
# но сценарий не упадет, а вернет 'No obj'
raise Return('No obj')
self.some_prop = 'Some value'
def _and_something_yet(self):
self.db.save(self.some_obj)
use_case = SomeUseCase(Database())
use_case.run(params=SomeParams(123))
При вызове run декоратор scenario сделает 2 вещи:
- скопирует полученный в self инстанс SomeUseCase, чтобы продолжить исполнение уже с копией. Это нужно для потокобезопасности.
- разложит все полученные kwargs в self. В примере выше объект SomeParams, переданный в ключе params, будет доступен в сценарии в атрибуте self.params.
Копирование объекта имеет один побочный эффект. Из-за того, что при вызове run снимается поверхностная копия объекта, копия получит ссылки на те же объекты. Если в свойствах класса-сценария будут инстансы изменяемых типов, то при повторном вызове сценария мы увидим состояние из предыдущего!
Это похоже на эффект, получаемый при использовании инстансов сложных типов в качестве аргументов функции по умолчанию:
def func(arg=[]):
arg.append('1')
Здесь так же между вызовами будет сохраняться состояние arg. В целом, если такое свойство исползьуется только для чтения, в этом нет проблем. Кроме того, сложно представить себе такое свойство, которое имело бы свойство по умолчанию, то есть инициализировалось бы конструктором, и при этом было бы изменяемо, потому такое поведение не кажется проблемой.
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
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 classic_scenarios-0.1.1.tar.gz.
File metadata
- Download URL: classic_scenarios-0.1.1.tar.gz
- Upload date:
- Size: 5.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7e073b44f0f4c2970f29b809a2f8793ee4309415b71e2b20c40a15febef9c24d
|
|
| MD5 |
1532556608cc37512920c452ffd77699
|
|
| BLAKE2b-256 |
dfda3c056598d2b0a08f6497c9e60f63c892b0f6933b2cf54d8b3d666956a2ba
|
Provenance
The following attestation bundles were made for classic_scenarios-0.1.1.tar.gz:
Publisher:
publish.yml on variasov/classic-scenarios
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
classic_scenarios-0.1.1.tar.gz -
Subject digest:
7e073b44f0f4c2970f29b809a2f8793ee4309415b71e2b20c40a15febef9c24d - Sigstore transparency entry: 770807615
- Sigstore integration time:
-
Permalink:
variasov/classic-scenarios@2c4bd97bc1ed7fbea6cafa1d4a3e073424837f8e -
Branch / Tag:
refs/heads/main - Owner: https://github.com/variasov
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2c4bd97bc1ed7fbea6cafa1d4a3e073424837f8e -
Trigger Event:
push
-
Statement type:
File details
Details for the file classic_scenarios-0.1.1-py3-none-any.whl.
File metadata
- Download URL: classic_scenarios-0.1.1-py3-none-any.whl
- Upload date:
- Size: 5.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6830b70fbeb6a9dc1e245a7a7bb2121fcdd7faa2851b63983d5fcc83f00f20ad
|
|
| MD5 |
a3b1f57f4e57a35ac034047a159b8c57
|
|
| BLAKE2b-256 |
3d401761c3474cf86c19d23c5a70daca80e410939f90f94dac64d9d0f7a0df22
|
Provenance
The following attestation bundles were made for classic_scenarios-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on variasov/classic-scenarios
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
classic_scenarios-0.1.1-py3-none-any.whl -
Subject digest:
6830b70fbeb6a9dc1e245a7a7bb2121fcdd7faa2851b63983d5fcc83f00f20ad - Sigstore transparency entry: 770807626
- Sigstore integration time:
-
Permalink:
variasov/classic-scenarios@2c4bd97bc1ed7fbea6cafa1d4a3e073424837f8e -
Branch / Tag:
refs/heads/main - Owner: https://github.com/variasov
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2c4bd97bc1ed7fbea6cafa1d4a3e073424837f8e -
Trigger Event:
push
-
Statement type: