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.0.2.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.0.2-py3-none-any.whl (5.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: classic_scenarios-0.0.2.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.0.2.tar.gz
Algorithm Hash digest
SHA256 09db07b0fb1f0da956c1a01120aeaf98f737ebf84ccc2f91bd33b86a5efc2578
MD5 b5c7ea21550987c809ae331dd1290448
BLAKE2b-256 9c2550b8db6f58cf27b7ea4370a455527ba1a40904a4f10b43967d8ac4f6a9f5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for classic_scenarios-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 63a05d0d0d6210115c2d245e6a2ec2fd9eef82978219196d35b886ffb6b69259
MD5 c068179a55ce4839f241dbb9c0b60042
BLAKE2b-256 2718c067ed5303e3e08eb8429902b32c7e68b9f2fbe1b46fb473891d4c47ce6a

See more details on using hashes here.

Provenance

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