commit 0da6e63a21abffcba0447c66403805b578f070ca
parent 93faf56e03006afdc6553d2ec7fc644fe057449c
Author: lash <dev@holbrook.no>
Date: Wed, 24 Sep 2025 05:15:14 +0100
Make entity uris flexible
Diffstat:
4 files changed, 33 insertions(+), 9 deletions(-)
diff --git a/adesse/config.py b/adesse/config.py
@@ -0,0 +1,7 @@
+namespace_sources = {
+ 'DF': 'http://defalsify.org/rdf/0.1/core/',
+ 'COUNTRY': 'http://www.iso.org/obp/ui/#iso:code:3166:',
+ 'MIME': 'http://www.iana.org/assignments/media-types/',
+ 'PSS': 'http://standards.internetofproduction.org/pub/r7g0n9fo/release/4#',
+ 'WOT': 'http://xmlns.com/wot/0.1/#',
+ }
diff --git a/adesse/ns.py b/adesse/ns.py
@@ -1,22 +1,27 @@
from rdflib.namespace import Namespace, DefinedNamespace
from rdflib.term import URIRef
+from .config import namespace_sources as ns
+
UU = Namespace('URN:uuid:')
-COUNTRY = Namespace('http://www.iso.org/obp/ui/#iso:code:3166:')
+COUNTRY = Namespace(ns['COUNTRY'])
SHA256 = Namespace('URN:sha256:')
-MIME = Namespace('http://www.iana.org/assignments/media-types/')
+MIME = Namespace(ns['MIME'])
class DF(DefinedNamespace):
subject: URIRef
object: URIRef
agent: URIRef
perceivedThrough: URIRef
+ perceivedTime: URIRef
+ hasIdentity: URIRef
verdict: URIRef
hasClaim: URIRef
testimonyFor: URIRef
+ sum: URIRef
# classes
Event: URIRef
@@ -24,12 +29,16 @@ class DF(DefinedNamespace):
Testimony: URIRef
# perceptionmedium
- inPerson: URIRef
+ video: URIRef
+ audio: URIRef
+ text: URIRef
+ presence: URIRef
+ realtime: URIRef
# results
certified: URIRef
- _NS = Namespace('http://defalsify.org/rdf/0.1/core/')
+ _NS = Namespace(ns['DF'])
class PSS(DefinedNamespace):
@@ -42,11 +51,11 @@ class PSS(DefinedNamespace):
PRINT3D: URIRef
- _NS = Namespace('http://standards.internetofproduction.org/pub/r7g0n9fo/release/4#')
+ _NS = Namespace(ns['PSS'])
class WOT(DefinedNamespace):
PubKey: URIRef
- _NS = Namespace('http://xmlns.com/wot/0.1/#')
+ _NS = Namespace(ns['WOT'])
diff --git a/adesse/testimony.py b/adesse/testimony.py
@@ -8,9 +8,9 @@ from adesse.uri import to_uuid_uri
class Testimony(Entity):
- def __init__(self, label, date: datetime.datetime, target, identity, medium=DF.inPerson, uu=None):
+ def __init__(self, label, date: datetime.datetime, target, identity, uu=None):
super().__init__(label, uu=uu)
- self.medium = medium
+ self.medium = []
self.dt = date
self.target = target
self.identity = identity
@@ -27,14 +27,19 @@ class Testimony(Entity):
self.behalf.append(v)
+ def add_medium(self, v):
+ self.medium.append(v)
+
+
def apply(self, g):
uu = to_uuid_uri(self.uu)
g.add((uu, RDF.type, DF.Testimony))
g.add((uu, DF.perceivedTime, Literal(self.dt.isoformat(timespec='seconds'), datatype=XSD.dateTime)))
- g.add((uu, DF.perceivedThrough, DF.inPerson))
g.add((uu, DF.verdict, self.verdict))
g.add((uu, DF.testimonyFor, self.target.to_ref()))
g.add((uu, DF.hasIdentity, self.identity))
+ for v in self.medium:
+ g.add((uu, DF.perceivedThrough, v))
for v in self.behalf:
g.add((uu, PROV.actedOnBehalfOf, v))
for v in self.claim:
diff --git a/test/test_serialize.py b/test/test_serialize.py
@@ -12,6 +12,7 @@ from adesse.event import Event
from adesse.bundle import Bundle
from adesse.testimony import Testimony
from adesse.attachment import Attachment
+from adesse.ns import DF
class TestSerialize(unittest.TestCase):
@@ -39,6 +40,8 @@ class TestSerialize(unittest.TestCase):
b = URIRef('http://internetofproduction.org')
v.add_behalf(b)
+ v.add_medium(DF.presence)
+ v.add_medium(DF.realtime)
o.add_testimony(v)
o.apply(z)