rejiggering file pointers
This commit is contained in:
parent
7ddc9531bb
commit
ee886fe5e2
|
|
@ -295,13 +295,28 @@ class BinaryFilePointer(Field):
|
||||||
def relpath(self, record):
|
def relpath(self, record):
|
||||||
return Path(record._metadata.table) / record[record._metadata.primary_key] / f"{self.name}{self.extension}"
|
return Path(record._metadata.table) / record[record._metadata.primary_key] / f"{self.name}{self.extension}"
|
||||||
|
|
||||||
|
def reference(self, record):
|
||||||
|
return f"/::{self.relpath(record)}"
|
||||||
|
|
||||||
|
def dereference(self, reference, db):
|
||||||
|
relpath = reference.replace("/::", "", 1)
|
||||||
|
try:
|
||||||
|
return (db.path / relpath).read_bytes()
|
||||||
|
except FileNotFoundError:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def serialize(self, value: value_type | str, record: Record | None = None) -> str:
|
||||||
|
return self.reference(record)
|
||||||
|
|
||||||
def deserialize(self, value: str, db: TinyDB, recurse: bool = True) -> value_type:
|
def deserialize(self, value: str, db: TinyDB, recurse: bool = True) -> value_type:
|
||||||
if not value:
|
if not value:
|
||||||
return None
|
return None
|
||||||
_, relpath = value.split("::")
|
return self.dereference(value, db)
|
||||||
return self.value_type((db.path / relpath).read_bytes())
|
|
||||||
|
|
||||||
def prepare(self, data: value_type):
|
def prepare(self, data: value_type):
|
||||||
|
"""
|
||||||
|
Return bytes to be written to disk
|
||||||
|
"""
|
||||||
if not data:
|
if not data:
|
||||||
return
|
return
|
||||||
if not isinstance(data, self.value_type):
|
if not isinstance(data, self.value_type):
|
||||||
|
|
@ -315,7 +330,6 @@ class BinaryFilePointer(Field):
|
||||||
path = db.path / relpath
|
path = db.path / relpath
|
||||||
path.parent.mkdir(parents=True, exist_ok=True)
|
path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
path.write_bytes(self.prepare(value))
|
path.write_bytes(self.prepare(value))
|
||||||
record[self.name] = f"File::{self.relpath(record)}"
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
|
@ -335,8 +349,8 @@ class TextFilePointer(BinaryFilePointer):
|
||||||
def deserialize(self, value: str, db: TinyDB, recurse: bool = True) -> value_type:
|
def deserialize(self, value: str, db: TinyDB, recurse: bool = True) -> value_type:
|
||||||
if not value:
|
if not value:
|
||||||
return None
|
return None
|
||||||
_, relpath = value.split("::")
|
buf = super().deserialize(value, db)
|
||||||
return (db.path / relpath).read_text()
|
return buf.decode() if buf else None
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user