|
5 | 5 | from dataclasses import asdict, dataclass, field, is_dataclass |
6 | 6 | from enum import Enum |
7 | 7 | from os import getenv |
8 | | -from pickle import dumps |
9 | 8 | from re import IGNORECASE, compile |
10 | 9 | from types import UnionType |
11 | 10 | from typing import ( |
@@ -176,9 +175,22 @@ def ref(ref_id: str) -> Optional[Anchor]: |
176 | 175 | return cls(name=matched.group(2), id=UUID(matched.group(3))) |
177 | 176 | return None |
178 | 177 |
|
| 178 | + def _save(self) -> None: |
| 179 | + """Save Anchor.""" |
| 180 | + raise NotImplementedError("_save must be implemented in subclasses") |
| 181 | + |
179 | 182 | def save(self) -> None: |
180 | 183 | """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() |
182 | 194 |
|
183 | 195 | def destroy(self) -> None: |
184 | 196 | """Save Anchor.""" |
@@ -284,6 +296,14 @@ def serialize(self) -> dict[str, object]: |
284 | 296 | ), |
285 | 297 | } |
286 | 298 |
|
| 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 | + |
287 | 307 | def report(self) -> dict[str, object]: |
288 | 308 | """Report Anchor.""" |
289 | 309 | return { |
@@ -343,19 +363,6 @@ def _save(self) -> None: |
343 | 363 |
|
344 | 364 | jsrc.set(self) |
345 | 365 |
|
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 | | - |
359 | 366 | def destroy(self) -> None: |
360 | 367 | """Delete Anchor.""" |
361 | 368 | if self.architype and self.current_access_level > 1: |
@@ -512,19 +519,6 @@ def _save(self) -> None: |
512 | 519 |
|
513 | 520 | jsrc.set(self) |
514 | 521 |
|
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 | | - |
528 | 522 | def destroy(self) -> None: |
529 | 523 | """Delete Anchor.""" |
530 | 524 | if self.architype and self.current_access_level == 1: |
@@ -611,19 +605,6 @@ def _save(self) -> None: |
611 | 605 |
|
612 | 606 | ExecutionContext.get().datasource.set(self) |
613 | 607 |
|
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 | | - |
627 | 608 | def destroy(self) -> None: |
628 | 609 | """Delete Anchor.""" |
629 | 610 | if self.architype and self.current_access_level > 1: |
|
0 commit comments