Source code for octomachinery.github.models.action_outcomes

"""Processing outcomes for use from within GitHub Action env."""

import logging

import attr


__all__ = ('ActionSuccess', 'ActionNeutral', 'ActionFailure')


logger = logging.getLogger(__name__)


@attr.dataclass
class ActionOutcome:  # pylint: disable=too-few-public-methods
    """GitHub Action processing outcome."""

    message: str
    return_code: int

    def raise_it(self):
        """Print the message and exit the program with current code."""
        logger.info(
            'Terminating the GitHub Action processing: %s',
            self.message,
        )
        raise SystemExit(self.return_code)


[docs]@attr.dataclass # pylint: disable=too-few-public-methods class ActionSuccess(ActionOutcome): """GitHub Action successful outcome.""" return_code: int = attr.ib(default=0, init=False)
[docs]@attr.dataclass # pylint: disable=too-few-public-methods class ActionFailure(ActionOutcome): """GitHub Action failed outcome.""" return_code: int = attr.ib(default=1) @return_code.validator def _validate_return_code( self, attribute, # pylint: disable=unused-argument value, ): if value in NON_FAIL_MODELS: raise ValueError( f'Return code of `{value}` is illegal to use for failure ' f'outcome. Use {NON_FAIL_MODELS[value]} instead', )
[docs]@attr.dataclass # pylint: disable=too-few-public-methods class ActionNeutral(ActionOutcome): """GitHub Action neutral outcome.""" # NOTE: It's EX_CONFIG under BSD and EREMCHG under GNU/Linux # NOTE: that's why we are using just 78 conventional constant # NOTE: here... # NOTE: Ref: # https://developer.github.com/actions/creating-github-actions\ # /accessing-the-runtime-environment/#exit-codes-and-statuses return_code: int = attr.ib(default=78, init=False)
NON_FAIL_MODELS = { 0: 'ActionSuccess', 78: 'ActionNeutral', }