adesse

Signed testimonials for certifications.
Log | Files | Refs

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:
Madesse/attachment.py | 18+++++++++++++++++-
Madesse/entity.py | 16++++++++++++++--
Madesse/store/base.py | 13++++++++-----
Madesse/store/fs.py | 10+++++++++-
Mtest/test_store.py | 10+++++++---
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)