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

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.1.0.tar.gz (5.2 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.1.0-py3-none-any.whl (5.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: classic_scenarios-0.1.0.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

Hashes for classic_scenarios-0.1.0.tar.gz
Algorithm Hash digest
SHA256 d080150a4718ac492072f35c8ac6576ee8498cce6458a3a2d6280258ae1c825c
MD5 0b1a6a8a1b7a99089ae1c56f0476bac2
BLAKE2b-256 f7030085413429828a368778190e9768cbb6243a974409fa6db672f4c66f8809

See more details on using hashes here.

Provenance

The following attestation bundles were made for classic_scenarios-0.1.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.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for classic_scenarios-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b5deea35ca40afa4a976fb642d59978bf6e591fbb9cbed941d3826c088faa2fb
MD5 093231cc2be44d46446d148cdfb5d830
BLAKE2b-256 29ae3ca8da34fe61eca5c6d1733d24395fecf3c2e1b9604f09d3a41855c9ca43

See more details on using hashes here.

Provenance

The following attestation bundles were made for classic_scenarios-0.1.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