commit 815e92606cc26170aabee94ee01565c47ff0d667
parent 5413251ea7939ffb7da95da941bde7f5af87892b
Author: lash <dev@holbrook.no>
Date: Mon, 7 Sep 2026 17:41:49 -0600
Enable toplevel subject, same uuid as store for attach
Diffstat:
5 files changed, 55 insertions(+), 12 deletions(-)
diff --git a/adesse/attachment.py b/adesse/attachment.py
@@ -20,16 +20,18 @@ class Attachment(Entity):
default_sum = Sums.SHA256
- def __init__(self, title, description, date, mime, typ=None, lang=None, uu=None, opener=None):
+ def __init__(self, title, description, date, mime, typ=None, subject=None, lang=None, uu=None, opener=None):
super().__init__(title, uu=uu)
self.description = description
self.dt = date.astimezone(datetime.timezone.utc)
self.mime = mime
self.typ = typ
+ self.subject = subject
self.sums = {}
self.tag = []
self.opener = opener
self.source = []
+ self.meta = {}
def srcadd(self, v):
@@ -70,6 +72,17 @@ class Attachment(Entity):
self.tag.append(v)
+ def add_meta_source(self, typ, filepath):
+ self.meta[typ] = filepath
+
+
+ def get_meta_sources(self):
+ r = []
+ for k in self.meta.keys():
+ r.append((k, self.meta[k],))
+ return r
+
+
def _apply_tags(self, o, uu):
nod = BNode()
r = Bag(o, nod)
@@ -81,8 +94,11 @@ class Attachment(Entity):
def apply(self, g):
uu = to_uuid_uri(self.uu)
g.add((uu, DC.format, Literal(self.mime)))
+ g.add((uu, DCTERMS.identifier, uu))
g.add((uu, DCTERMS.title, Literal(self.common_name)))
g.add((uu, DCTERMS.description, Literal(self.description)))
+ if self.subject != None:
+ g.add((uu, DCTERMS.subject, Literal(self.subject)))
for k in self.sums.keys():
v = self.sums[k]
prd = to_df_sum(k)
diff --git a/adesse/entity.py b/adesse/entity.py
@@ -10,16 +10,28 @@ from .uri import to_uuid_uri
class Entity:
- def __init__(self, common_name, uu=None):
+ def __init__(self, common_name, uu=None, protect_uu=False):
if not uu:
uu = uuid.uuid4()
elif not isinstance(uu, uuid.UUID):
raise ValueError("not uuid")
- self.uu = uu
self.dt = datetime.datetime.now()
self.dt = self.dt.astimezone(datetime.timezone.utc)
self.common_name = common_name
self.url = None
+ self.protect_uu = protect_uu
+ self.uu = None
+ self.set_uu(uu)
+
+
+ def set_uu(self, uu):
+ if self.uu != None and self.protect_uu:
+ raise PermissionError()
+ if isinstance(uu, str):
+ uu = uuid.UUID(uu)
+ elif isinstance(uu, bytes):
+ uu = uuid.UUID(bytes=uu)
+ self.uu = uu
def set_url(self, v):
diff --git a/adesse/store/base.py b/adesse/store/base.py
@@ -3,10 +3,6 @@ import enum
import uuid
-class MetaType(enum.Enum):
- ADESSE = ('-adesse.rdf', 'application/rdf+xml',)
- XMP = ('.xmp', 'application/rdf+xml',)
-
def hash_for_io(f, hasher):
h = hasher()
@@ -31,13 +27,16 @@ def sha512_for_path(filepath):
class BaseStore:
+ default_canon = 'uuid'
+
def __init__(self, seed=None):
self.transformers = {}
if seed == None:
seed = uuid.uuid4()
self.seed = seed
self.register_uuid()
- self.canon = 'uuid'
+ self.canon = BaseStore.default_canon
+ self.meta = {}
def register(self, key, transformer):
@@ -59,3 +58,7 @@ class BaseStore:
def uuid_for_sum(self, v):
r = uuid.uuid5(self.seed, v)
return r.bytes
+
+
+ def put(self, attachment):
+ raise NotImplementedError()
diff --git a/adesse/store/fs.py b/adesse/store/fs.py
@@ -3,8 +3,9 @@ import shutil
import logging
import tempfile
-from .base import BaseStore, MetaType
+from .base import BaseStore
from adesse import Serializer
+from adesse.file import MetaType
from adesse.crypto import str_to_sumtype
logg = logging.getLogger('store.fs')
@@ -47,6 +48,7 @@ class FsStore(BaseStore):
logg.debug('file contents in {}'.format(fp))
v = self.transformers[self.canon](fp)
+ attachment.set_uu(v)
dst = os.path.join(self.canon_path, v.hex())
shutil.copyfile(fp, dst)
logg.info('canon file to {}'.format(dst))
@@ -69,3 +71,9 @@ class FsStore(BaseStore):
w = open(dstmeta, 'w')
w.write(s)
w.close()
+ logg.debug('write meta {} {}'.format(MetaType.ADESSE, dstmeta))
+
+ for v in attachment.get_meta_sources():
+ dstmeta = dst + v[0].value[0]
+ shutil.copyfile(v[1], dstmeta)
+ logg.debug('write meta {} {}'.format(v[0], dstmeta))
diff --git a/test/test_store.py b/test/test_store.py
@@ -8,6 +8,7 @@ import datetime
from adesse.store import FsStore
from adesse import Attachment
+from adesse.file import MetaType
thisdir = os.path.realpath(os.path.dirname(__file__))
@@ -30,14 +31,17 @@ class TestFsStore(unittest.TestCase):
def tearDown(self):
- #shutil.rmtree(self.storedir)
- pass
+ shutil.rmtree(self.storedir)
def test_put(self):
- o = Attachment('title', 'description', datetime.datetime.now(datetime.UTC), 'application/pdf', lang='es', opener=testopener)
+ o = Attachment('sometitle', 'somedescription', datetime.datetime.now(datetime.UTC), 'application/pdf', lang='es', opener=testopener, subject='a test subject')
fp = os.path.join(thisdir, 'import.pdf')
o.srcadd(fp)
+ metafile = os.path.join(thisdir, 'import.xmp')
+ o.add_meta_source(MetaType.XMP, metafile)
+ o.add_tag('foo')
+ o.add_tag('bar')
self.store.put(o)