From f6c3fba01eaad2f2e282a423e775ea60b53477c4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Henrik=20tom=20W=C3=B6rden?= <h.tomwoerden@indiscale.com>
Date: Fri, 24 Jan 2025 10:52:05 +0100
Subject: [PATCH] ENH: add convenience functions

`value_matches_versionid`, `get_id_from_versionid` and `get_versionid`
---
 CHANGELOG.md                   |  1 +
 src/linkahead/common/models.py | 21 +++++++++++++++++++++
 unittests/test_entity.py       | 28 +++++++++++++++++++++++++++-
 3 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 23ddf860..20f2498a 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 75b03b70..0912647a 100644
--- a/src/linkahead/common/models.py
+++ b/src/linkahead/common/models.py
@@ -505,6 +505,9 @@ class Entity:
 
         return self
 
+    def get_versionid(self):
+        return str(self.id)+"@"+str(self.version.id)
+
     def get_importance(self, property):  # @ReservedAssignment
         """Get the importance of a given property regarding this entity."""
 
@@ -1954,6 +1957,7 @@ class QueryTemplate():
         return len(self.get_errors()) > 0
 
 
+
 class Parent(Entity):
     """The parent entities."""
 
@@ -2126,6 +2130,12 @@ class Property(Entity):
             return is_reference(self.datatype)
 
 
+    def value_matches_versionid(self):
+        return value_matches_versionid(self.value)
+
+    def get_id_from_versionid_value(self):
+        return get_id_from_versionid(self.value)
+
 class Message(object):
 
     def __init__(
@@ -5670,3 +5680,14 @@ 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]):
+    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):
+    return versionid.split("@")[0]
diff --git a/unittests/test_entity.py b/unittests/test_entity.py
index 855e5a39..722930b2 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,27 @@ 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"
-- 
GitLab