Skip to content
This repository was archived by the owner on Sep 12, 2024. It is now read-only.

Commit cd22d37

Browse files
committed
[REFACTOR]: Realign saving for proper handling
1 parent cf3d2d7 commit cd22d37

File tree

2 files changed

+26
-41
lines changed

2 files changed

+26
-41
lines changed

jaclang/core/architype.py

Lines changed: 22 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from dataclasses import asdict, dataclass, field, is_dataclass
66
from enum import Enum
77
from os import getenv
8-
from pickle import dumps
98
from re import IGNORECASE, compile
109
from types import UnionType
1110
from typing import (
@@ -176,9 +175,22 @@ def ref(ref_id: str) -> Optional[Anchor]:
176175
return cls(name=matched.group(2), id=UUID(matched.group(3)))
177176
return None
178177

178+
def _save(self) -> None:
179+
"""Save Anchor."""
180+
raise NotImplementedError("_save must be implemented in subclasses")
181+
179182
def save(self) -> None:
180183
"""Save Anchor."""
181-
raise NotImplementedError("save must be implemented in subclasses")
184+
if self.architype:
185+
if not self.connected:
186+
self.connected = True
187+
self.sync_hash()
188+
self._save()
189+
elif self.current_access_level == 0 and self.hash != (
190+
_hash := self.data_hash()
191+
):
192+
self.hash = _hash
193+
self._save()
182194

183195
def destroy(self) -> None:
184196
"""Save Anchor."""
@@ -284,6 +296,14 @@ def serialize(self) -> dict[str, object]:
284296
),
285297
}
286298

299+
def data_hash(self) -> int:
300+
"""Get current serialization hash."""
301+
return hash(self.serialize())
302+
303+
def sync_hash(self) -> None:
304+
"""Sync current serialization hash."""
305+
self.hash = self.data_hash()
306+
287307
def report(self) -> dict[str, object]:
288308
"""Report Anchor."""
289309
return {
@@ -343,19 +363,6 @@ def _save(self) -> None:
343363

344364
jsrc.set(self)
345365

346-
def save(self) -> None:
347-
"""Save Anchor."""
348-
if self.architype:
349-
if not self.connected:
350-
self.connected = True
351-
self.hash = hash(dumps(self))
352-
self._save()
353-
elif self.current_access_level > 0 and self.hash != (
354-
_hash := hash(dumps(self))
355-
):
356-
self.hash = _hash
357-
self._save()
358-
359366
def destroy(self) -> None:
360367
"""Delete Anchor."""
361368
if self.architype and self.current_access_level > 1:
@@ -512,19 +519,6 @@ def _save(self) -> None:
512519

513520
jsrc.set(self)
514521

515-
def save(self) -> None:
516-
"""Save Anchor."""
517-
if self.architype:
518-
if not self.connected:
519-
self.connected = True
520-
self.hash = hash(dumps(self))
521-
self._save()
522-
elif self.current_access_level == 1 and self.hash != (
523-
_hash := hash(dumps(self))
524-
):
525-
self.hash = _hash
526-
self._save()
527-
528522
def destroy(self) -> None:
529523
"""Delete Anchor."""
530524
if self.architype and self.current_access_level == 1:
@@ -611,19 +605,6 @@ def _save(self) -> None:
611605

612606
ExecutionContext.get().datasource.set(self)
613607

614-
def save(self) -> None:
615-
"""Save Anchor."""
616-
if self.architype:
617-
if not self.connected:
618-
self.connected = True
619-
self.hash = hash(dumps(self))
620-
self._save()
621-
elif self.current_access_level > 1 and self.hash != (
622-
_hash := hash(dumps(self))
623-
):
624-
self.hash = _hash
625-
self._save()
626-
627608
def destroy(self) -> None:
628609
"""Delete Anchor."""
629610
if self.architype and self.current_access_level > 1:

jaclang/core/memory.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ def get(self, anchor: dict[str, Any]) -> Anchor:
173173
nanch.architype = NodeArchitype.get(name or "Root")(
174174
__jac__=nanch, **architype
175175
)
176+
nanch.sync_hash()
176177
return nanch
177178
case ObjectType.edge:
178179
eanch = EdgeAnchor(
@@ -185,12 +186,15 @@ def get(self, anchor: dict[str, Any]) -> Anchor:
185186
eanch.architype = EdgeArchitype.get(name or "GenericEdge")(
186187
__jac__=eanch, **architype
187188
)
189+
eanch.sync_hash()
188190
return eanch
189191
case ObjectType.walker:
190192
wanch = WalkerAnchor(access=access, connected=True, **anchor)
191193
wanch.architype = WalkerArchitype.get(name)(__jac__=wanch, **architype)
194+
wanch.sync_hash()
192195
return wanch
193196
case _:
194197
oanch = Anchor(access=access, connected=True, **anchor)
195198
oanch.architype = Architype(__jac__=oanch)
199+
oanch.sync_hash()
196200
return oanch

0 commit comments

Comments
 (0)