diff --git a/CHANGELOG.md b/CHANGELOG.md index 23ddf8609f2467865cdee0964ef53931d1ef115c..20f2498a09e5599933c18606febf8f160594a3c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ## ### Added ### +- convenience functions `value_matches_versionid`, `get_id_from_versionid` and `get_versionid` ### Changed ### diff --git a/src/linkahead/common/models.py b/src/linkahead/common/models.py index 75b03b70907abdde50fb383c54a02e94cad115ad..bfe43b01367c9a8b47768240aa3f47a3cf31354c 100644 --- a/src/linkahead/common/models.py +++ b/src/linkahead/common/models.py @@ -505,6 +505,10 @@ class Entity: return self + def get_versionid(self): + """Returns the concatenation of ID and version""" + return str(self.id)+"@"+str(self.version.id) + def get_importance(self, property): # @ReservedAssignment """Get the importance of a given property regarding this entity.""" @@ -2125,6 +2129,14 @@ class Property(Entity): else: return is_reference(self.datatype) + def value_matches_versionid(self): + """Returns True if the value matches the pattern <id>@<version>""" + return value_matches_versionid(self.value) + + def get_id_from_versionid_value(self): + """Returns the ID part of the versionid with the pattern <id>@<version>""" + return get_id_from_versionid(self.value) + class Message(object): @@ -5670,3 +5682,18 @@ def _filter_entity_list_by_identity(listobject: list[Entity], if pid_none and name_match: matches.append(candidate) return matches + + +def value_matches_versionid(value: Union[int, str]): + """Returns True if the value matches the pattern <id>@<version>""" + if isinstance(value, int): + return False + if not isinstance(value, str): + raise ValueError(f"A reference value needs to be int or str. It was {type(value)}. " + "Did you call value_matches_versionid on a non reference value?") + return "@" in value + + +def get_id_from_versionid(versionid: str): + """Returns the ID part of the versionid with the pattern <id>@<version>""" + return versionid.split("@")[0] diff --git a/unittests/test_entity.py b/unittests/test_entity.py index 855e5a39d53180d32a40de46bc7bb43d0bbd58bc..2f413717c48f9e5424b6a380127db6a6be9760df 100644 --- a/unittests/test_entity.py +++ b/unittests/test_entity.py @@ -30,7 +30,9 @@ import linkahead from linkahead import (INTEGER, Entity, Parent, Property, Record, RecordType, configure_connection) import warnings -from linkahead.common.models import SPECIAL_ATTRIBUTES +from linkahead.common.models import (SPECIAL_ATTRIBUTES, get_id_from_versionid, + value_matches_versionid) +from linkahead.common.versioning import Version from linkahead.connection.mockup import MockUpServerConnection from lxml import etree from pytest import raises @@ -295,3 +297,29 @@ def test_filter_by_identity(): t.parents.filter(pid=234) assert issubclass(w[-1].category, DeprecationWarning) assert "This function was renamed" in str(w[-1].message) + + +def test_value_matches_versionid(): + assert value_matches_versionid(234) is False, "integer is no version id" + assert value_matches_versionid("234") is False, ("string that only contains an integer is no " + "version id") + assert value_matches_versionid("234@bfe1a42cb37aae8ac625a757715d38814c274158") is True, ( + "integer is no version id") is True + with raises(ValueError): + value_matches_versionid(234.0) + p = Property(value=234) + assert p.value_matches_versionid() is False + p = Property(value="234@bfe1a42cb37aae8ac625a757715d38814c274158") + assert p.value_matches_versionid() is True + + +def test_get_id_from_versionid(): + assert get_id_from_versionid("234@bfe1a42cb37aae8ac625a757715d38814c274158") == "234" + p = Property(value="234@bfe1a42cb37aae8ac625a757715d38814c274158") + assert p.get_id_from_versionid_value() == "234" + + +def test_get_versionid(): + e = Entity(id=234) + e.version = Version(id="bfe1a42cb37aae8ac625a757715d38814c274158") + assert e.get_versionid() == "234@bfe1a42cb37aae8ac625a757715d38814c274158"