Source code for ampel.base.LogicalUnit

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# File:                Ampel-interface/ampel/base/LogicalUnit.py
# License:             BSD-3-Clause
# Author:              valery brinnel <firstname.lastname@gmail.com>
# Date:                12.10.2019
# Last Modified Date:  09.01.2022
# Last Modified By:    valery brinnel <firstname.lastname@gmail.com>

from typing import Any, ClassVar

from ampel.base.AmpelUnit import AmpelUnit
from ampel.protocol.LoggerProtocol import LoggerProtocol
from ampel.types import Traceless


[docs] class LogicalUnit(AmpelUnit): """ Logical as in: performing logic operations of ampel's tier: add, combine, augment, synthetise. Base for standardized t0, t1, t2 and t3 units. Note: - the defined parameters must be serializable - logical units are initialized (by UnitLoader) as follows: * ctor * if available, secrets are resolved * if defined by sub-class, post_init() is called """ logger: Traceless[LoggerProtocol] #: Resources requirements as class variable (passed on to and merged with subclasses). require: ClassVar[None | tuple[str, ...]] = None resource: Traceless[None | dict[str, Any]] = None #: Private variable potentially set by UnitLoader for provenance purposes. Either: #: * None if provanance flag is False #: * 0 in case model content is not serializable #: * any other signed int value _trace_id: None | int = None # Some unit contributors might want to restrict units usage # by scoping them to their respective distribution name (str) # private: ClassVar[None | str] = None @classmethod def __init_subclass__(cls, **kwargs) -> None: super().__init_subclass__(**kwargs) # type: ignore cls.require = tuple( set(getattr(cls, "require", None) or []) | { el for base in cls.__bases__ for el in (getattr(base, "require", None) or []) } )