From 41a9af287491d5080f3d6d3568dda26d50f9cedd Mon Sep 17 00:00:00 2001 From: Alexander Tkachev Date: Fri, 22 Jul 2022 23:30:57 +0300 Subject: [PATCH] feat: abstract event Signed-off-by: Alexander Tkachev --- cloudevents/sdk/event/abstract_event.py | 63 +++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 cloudevents/sdk/event/abstract_event.py diff --git a/cloudevents/sdk/event/abstract_event.py b/cloudevents/sdk/event/abstract_event.py new file mode 100644 index 0000000..29b15f5 --- /dev/null +++ b/cloudevents/sdk/event/abstract_event.py @@ -0,0 +1,63 @@ +import abc +import typing + + +class AbstractCloudEvent(abc.ABC): + @property + def _attributes_read_model(self) -> typing.Dict[str, typing.Any]: + raise NotImplementedError() + + @property + def data(self) -> typing.Optional[typing.Any]: + raise NotImplementedError() + + @data.setter + def data(self, value: typing.Optional[typing.Any]) -> None: + raise NotImplementedError() + + def __setitem__(self, key: str, value: typing.Any) -> None: + raise NotImplementedError() + + def __delitem__(self, key: str) -> None: + raise NotImplementedError() + + def __eq__(self, other: typing.Any) -> bool: + if isinstance(other, AbstractCloudEvent): + return ( + self.data == other.data + and self._attributes_read_model == other._attributes_read_model + ) + return False + + # Data access is handled via `.data` member + # Attribute access is managed via Mapping type + def __getitem__(self, key: str) -> typing.Any: + return self._attributes_read_model[key] + + def get( + self, key: str, default: typing.Optional[typing.Any] = None + ) -> typing.Optional[typing.Any]: + """ + Retrieves an event attribute value for the given key. + Returns the default value if not attribute for the given key exists. + + MUST NOT throw an exception when the key does not exist. + + :param key: The event attribute name. + :param default: The default value to be returned when + no attribute with the given key exists. + :returns: The event attribute value if exists, default value otherwise. + """ + return self._attributes_read_model.get(key, default) + + def __iter__(self) -> typing.Iterator[typing.Any]: + return iter(self._attributes_read_model) + + def __len__(self) -> int: + return len(self._attributes_read_model) + + def __contains__(self, key: str) -> bool: + return key in self._attributes_read_model + + def __repr__(self) -> str: + return str({"attributes": self._attributes_read_model, "data": self.data})