Fix object encode

This commit is contained in:
liyaxing
2023-09-15 14:01:26 +08:00
parent 6ea83729a5
commit b59af5d4a7
5 changed files with 38 additions and 13 deletions
+2 -2
View File
@@ -1,9 +1,9 @@
from enum import Enum from enum import IntEnum
from ..object import ObjectID from ..object import ObjectID
ChunkID = ObjectID ChunkID = ObjectID
class PositionType(Enum): class PositionType(IntEnum):
Unknown = 1 Unknown = 1
Device = 2 Device = 2
File = 3 File = 3
+17 -7
View File
@@ -1,4 +1,3 @@
# define a object type enum # define a object type enum
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from enum import Enum from enum import Enum
@@ -6,6 +5,16 @@ from .object_id import ObjectID, ObjectType
import hashlib import hashlib
import json import json
import pickle import pickle
from typing import Any
class ObjectEnhancedJSONEncoder(json.JSONEncoder):
def default(self, o: Any) -> Any:
if isinstance(o, ObjectID):
return o.to_base58()
return super().default(o)
class KnowledgeObject(ABC): class KnowledgeObject(ABC):
def __init__(self, object_type: ObjectType, desc: dict = {}, body: dict = {}): def __init__(self, object_type: ObjectType, desc: dict = {}, body: dict = {}):
@@ -18,7 +27,7 @@ class KnowledgeObject(ABC):
def object_id(self) -> ObjectID: def object_id(self) -> ObjectID:
return self.calculate_id() return self.calculate_id()
def set_desc_with_key_value(self, key, value): def set_desc_with_key_value(self, key, value):
self.desc[key] = value self.desc[key] = value
@@ -27,7 +36,7 @@ class KnowledgeObject(ABC):
def get_desc(self) -> dict: def get_desc(self) -> dict:
return self.desc return self.desc
def set_body_with_key_value(self, key, value): def set_body_with_key_value(self, key, value):
self.body[key] = value self.body[key] = value
@@ -36,10 +45,13 @@ class KnowledgeObject(ABC):
def get_body(self) -> dict: def get_body(self) -> dict:
return self.body return self.body
def calculate_id(self): def calculate_id(self):
# Convert the object_type and desc to string and compute the SHA256 hash # Convert the object_type and desc to string and compute the SHA256 hash
data = json.dumps({"object_type": self.object_type, "desc": self.desc}) data = json.dumps(
{"object_type": self.object_type, "desc": self.desc},
cls=ObjectEnhancedJSONEncoder,
)
sha256 = hashlib.sha256() sha256 = hashlib.sha256()
sha256.update(data.encode()) sha256.update(data.encode())
return ObjectID(sha256.digest()) return ObjectID(sha256.digest())
@@ -50,5 +62,3 @@ class KnowledgeObject(ABC):
@staticmethod @staticmethod
def decode(data: bytes): def decode(data: bytes):
return pickle.loads(data) return pickle.loads(data)
+2 -2
View File
@@ -1,12 +1,12 @@
# define a object type enum # define a object type enum
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
from enum import Enum from enum import IntEnum
from .hash import HashValue from .hash import HashValue
import base58 import base58
import base36 import base36
class ObjectType(Enum): class ObjectType(IntEnum):
Chunk = 7 Chunk = 7
Image = 101 Image = 101
Video = 102 Video = 102
+2 -2
View File
@@ -4,10 +4,10 @@ import sqlite3
from typing import List, Tuple, Optional from typing import List, Tuple, Optional
import logging import logging
import os import os
from enum import Enum from enum import IntEnum
class ObjectRelationType(Enum): class ObjectRelationType(IntEnum):
Parent = 1 Parent = 1
+15
View File
@@ -23,6 +23,7 @@ from knowledge import (
EmailObjectBuilder, EmailObjectBuilder,
ObjectRelationStore, ObjectRelationStore,
KnowledgeStore, KnowledgeStore,
EmailObject,
) )
import asyncio import asyncio
import unittest import unittest
@@ -42,6 +43,20 @@ class TestVectorSTorage(unittest.TestCase):
email_folder = "F:\\system\\Downloads\\8081ffdb80925f5bff9c6ab9c4756c7d" email_folder = "F:\\system\\Downloads\\8081ffdb80925f5bff9c6ab9c4756c7d"
email_object = EmailObjectBuilder({}, email_folder).build() email_object = EmailObjectBuilder({}, email_folder).build()
id = email_object.calculate_id()
print(f"got email object: {id.to_base58()}")
# test encode & decode
ret = email_object.encode()
obj = EmailObject.decode(ret)
id2 = obj.calculate_id()
print(f"got email object: {id2.to_base58()}")
self.assertEqual(id.to_base58(), id2.to_base58())
ret2 = obj.encode()
self.assertEqual(ret, ret2)
def test_relation(self): def test_relation(self):
obj1 = ObjectID.hash_data("12345".encode("utf-8")) obj1 = ObjectID.hash_data("12345".encode("utf-8"))