Skip to main content

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. В целом, если такое свойство испольpуется только для чтения, в этом нет проблем. Кроме того, сложно представить себе такое свойство, которое имело бы свойство по умолчанию, то есть инициализировалось бы конструктором, и при этом было бы изменяемо, потому такое поведение не кажется проблемой.

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

classic_scenarios-0.2.0.tar.gz (5.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

classic_scenarios-0.2.0-py3-none-any.whl (5.9 kB view details)

Uploaded Python 3

File details

Details for the file classic_scenarios-0.2.0.tar.gz.

File metadata

  • Download URL: classic_scenarios-0.2.0.tar.gz
  • Upload date:
  • Size: 5.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for classic_scenarios-0.2.0.tar.gz
Algorithm Hash digest
SHA256 71c651c5e4813e064b7173197516c13c87442fb80b041132b0463f109abc5fe3
MD5 698f1fc2b905c6ae99f3333f5dfab279
BLAKE2b-256 972bc0f476c83b67485f73950242638258ebde751f8e903de0cfd4ad3231fc35

See more details on using hashes here.

Provenance

The following attestation bundles were made for classic_scenarios-0.2.0.tar.gz:

Publisher: publish.yml on variasov/classic-scenarios

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file classic_scenarios-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for classic_scenarios-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 300872f9227c4ef3e34c587f35bb17ec1809131aa3931069a82c986dc38a13cf
MD5 4d127d1779b82dc8f67c88cd9a6a20f6
BLAKE2b-256 55562a0db7310a75989c4ffc46f17b68966eff1bee5075ff369d0cf1f927df5c

See more details on using hashes here.

Provenance

The following attestation bundles were made for classic_scenarios-0.2.0-py3-none-any.whl:

Publisher: publish.yml on variasov/classic-scenarios

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page