From: Christian Heller Date: Fri, 14 Jun 2024 18:37:44 +0000 (+0200) Subject: Enhance BaseModel comparisons by hashing versioned and relations attributes. X-Git-Url: https://plomlompom.com/repos/%7B%7B%20web_path%20%7D%7D/decks/%7B%7Bdeck_id%7D%7D/cards/%7B%7Bcard_id%7D%7D/form?a=commitdiff_plain;h=fa05073a6ebaf46e8f72bec10a3dc03021ce704c;p=plomtask Enhance BaseModel comparisons by hashing versioned and relations attributes. --- diff --git a/plomtask/db.py b/plomtask/db.py index b2f2142..a47dff1 100644 --- a/plomtask/db.py +++ b/plomtask/db.py @@ -250,14 +250,19 @@ class BaseModel(Generic[BaseModelId]): raise HandledException(msg) self.id_ = id_ + def __hash__(self) -> int: + hashable = [self.id_] + [getattr(self, name) for name in self.to_save] + for definition in self.to_save_relations: + attr = getattr(self, definition[2]) + hashable += [tuple(rel.id_ for rel in attr)] + for name in self.to_save_versioned: + hashable += [hash(getattr(self, name))] + return hash(tuple(hashable)) + def __eq__(self, other: object) -> bool: if not isinstance(other, self.__class__): return False - to_hash_me = tuple([self.id_] + - [getattr(self, name) for name in self.to_save]) - to_hash_other = tuple([other.id_] + - [getattr(other, name) for name in other.to_save]) - return hash(to_hash_me) == hash(to_hash_other) + return hash(self) == hash(other) def __lt__(self, other: Any) -> bool: if not isinstance(other, self.__class__): diff --git a/plomtask/versioned_attributes.py b/plomtask/versioned_attributes.py index d3c3649..cbd1c8e 100644 --- a/plomtask/versioned_attributes.py +++ b/plomtask/versioned_attributes.py @@ -19,6 +19,12 @@ class VersionedAttribute: self.default = default self.history: dict[str, str | float] = {} + def __hash__(self) -> int: + history_tuples = tuple((k, v) for k, v in self.history.items()) + hashable = (self.parent.id_, self.table_name, self.default, + history_tuples) + return hash(hashable) + @property def _newest_timestamp(self) -> str: """Return most recent timestamp."""