Creating own Target from scratch
You may decide you need more (or less) startup and shutdown stages and they doesn't match target, provided by systempy. It's time to define your own:
Here TargetMeta relies on class name, so it's important to make class name
str.endswith(("Target", "TargetABC"))
from systempy import DIRECTION, TargetMeta, register_target_method
class MySpecialTarget(metaclass=TargetMeta):
@register_target_method(DIRECTION.FORWARD)
def first_startup_stage(self) -> None: ...
@register_target_method(DIRECTION.FORWARD)
def second_startup_stage(self) -> None: ...
@register_target_method(DIRECTION.FORWARD)
def third_startup_stage(self) -> None: ...
@register_target_method(DIRECTION.FORWARD)
def fourth_startup_stage(self) -> None: ...
@register_target_method(DIRECTION.FORWARD)
async def fifth_startup_stage(self) -> None: ...
@register_target_method(DIRECTION.GATHER)
async def sixth_startup_stage(self) -> None: ...
@register_target_method(DIRECTION.GATHER)
async def seventh_startup_stage(self) -> None: ...
# ===
@register_target_method(DIRECTION.GATHER)
async def first_shutdown_stage(self) -> None: ...
@register_target_method(DIRECTION.GATHER)
async def second_shutdown_stage(self) -> None: ...
@register_target_method(DIRECTION.BACKWARD)
async def third_shutdown_stage(self) -> None: ...
@register_target_method(DIRECTION.BACKWARD)
def fourth_shutdown_stage(self) -> None: ...
@register_target_method(DIRECTION.BACKWARD)
def fifth_shutdown_stage(self) -> None: ...
@register_target_method(DIRECTION.BACKWARD)
def sixth_shutdown_stage(self) -> None: ...
@register_target_method(DIRECTION.BACKWARD)
def seventh_shutdown_stage(self) -> None: ...
Here TargetMeta relies on explicit role kwarg and doesn't check class
name, so you may give your class arbitrary name
from systempy import DIRECTION, ROLE, TargetMeta, register_target_method
class MySpecialTarget(metaclass=TargetMeta, role=ROLE.TARGET):
@register_target_method(DIRECTION.FORWARD)
def first_startup_stage(self) -> None: ...
@register_target_method(DIRECTION.FORWARD)
def second_startup_stage(self) -> None: ...
@register_target_method(DIRECTION.FORWARD)
def third_startup_stage(self) -> None: ...
@register_target_method(DIRECTION.FORWARD)
def fourth_startup_stage(self) -> None: ...
@register_target_method(DIRECTION.FORWARD)
async def fifth_startup_stage(self) -> None: ...
@register_target_method(DIRECTION.GATHER)
async def sixth_startup_stage(self) -> None: ...
@register_target_method(DIRECTION.GATHER)
async def seventh_startup_stage(self) -> None: ...
# ===
@register_target_method(DIRECTION.GATHER)
async def first_shutdown_stage(self) -> None: ...
@register_target_method(DIRECTION.GATHER)
async def second_shutdown_stage(self) -> None: ...
@register_target_method(DIRECTION.BACKWARD)
async def third_shutdown_stage(self) -> None: ...
@register_target_method(DIRECTION.BACKWARD)
def fourth_shutdown_stage(self) -> None: ...
@register_target_method(DIRECTION.BACKWARD)
def fifth_shutdown_stage(self) -> None: ...
@register_target_method(DIRECTION.BACKWARD)
def sixth_shutdown_stage(self) -> None: ...
@register_target_method(DIRECTION.BACKWARD)
def seventh_shutdown_stage(self) -> None: ...
Here it's completely your business, how and why does these stages happens. You may create stages, which will be executed only when any event is happened, but not on init or shutdown