Source code for aws_stepfunction.model

# -*- coding: utf-8 -*-

"""
AWS StepFunction data model common module.
"""

import typing as T
import attr
from .constant import Constant as C


class _StepFunctionObject:
    """
    Attributes:

    - ``_field_order``: a private class attribute to provide
        field order information for serialization.
    """
    _field_order: T.List[str] = None


[docs]@attr.s class StepFunctionObject(_StepFunctionObject): """ Base class for all serializable StepFunction object. """
[docs] def to_dict( self, exclude_none: bool = True, exclude_empty_string: bool = True, exclude_empty_collection: bool = True, exclude_private_attr: bool = True ) -> dict: """ Convert StepFunction Object to Python dict. A revision of the ``attr.asdict`` API, allow to exclude: - None - empty string - empty collection (list, dict) """ data = dict() for k, v in attr.asdict(self).items(): if k.startswith("_"): if exclude_private_attr: continue if v is None: if exclude_none: continue elif isinstance(v, str): if len(v) == 0: if exclude_empty_string: continue elif isinstance(v, (list, dict)): if len(v) == 0: if exclude_empty_collection: continue else: pass data[k] = v return data
@classmethod def _to_alias(cls, data: dict) -> dict: """ Change Python class attribute name to StepFunction JSON field name (if available). Alias information is stored in class field definition metadata. For example, ``Workflow._start_at`` -> ``StartAt``. """ mapper = { field.name: field.metadata.get(C.ALIAS, field.name) for field in attr.fields(cls) } return { mapper.get(k, k): v for k, v in data.items() } @classmethod def _sort_field(cls, data: dict) -> dict: """ Sort the field based on the defined ``_field_order`` class attribute. """ if cls._field_order is None: return data ordered_data = dict() for key in cls._field_order: if key in data: ordered_data[key] = data[key] return ordered_data def _pre_serialize_validation(self): # pragma: no cover """ A pre-serialization hook for validation. """ pass def _post_serialize_validation(self, data: dict): # pragma: no cover """ A post-serialization hook for validation. :param data: the serialization output data. """ pass def _serialize(self) -> dict: # pragma: no cover """ The low level serialization implementation. """ raise NotImplementedError
[docs] def serialize( self, do_pre_validation=True, do_post_validation=True, ) -> dict: """ Public API for serialization """ if do_pre_validation: self._pre_serialize_validation() data = self._serialize() # DO NOT call self._to_alias here, let the subclass decides # when should call it new_data = self._sort_field(data) if do_post_validation: self._post_serialize_validation(new_data) return new_data