Source code for lakesuperior.messaging.formatters
import json
import logging
import uuid
from abc import ABCMeta, abstractmethod
from lakesuperior.model.ldp.ldpr import RES_CREATED, RES_DELETED, RES_UPDATED
[docs]class BaseASFormatter(metaclass=ABCMeta):
"""
Format message as ActivityStreams.
This is not really a `logging.Formatter` subclass, but a plain string
builder.
"""
ev_types = {
RES_CREATED : 'Create',
RES_DELETED : 'Delete',
RES_UPDATED : 'Update',
}
ev_names = {
RES_CREATED : 'Resource Creation',
RES_DELETED : 'Resource Deletion',
RES_UPDATED : 'Resource Modification',
}
def __init__(
self, rsrc_uri, ev_type, timestamp, rsrc_type, actor, data=None):
"""
Format output according to granularity level.
NOTE: Granularity level does not refer to the logging levels, i.e.
*when* a message gets logged, in fact all the Messaging logger messages
are logged under the same level. This it is rather about *what* gets
logged in a message.
:param rdflib.URIRef rsrc_uri: URI of the resource.
:param str ev_type: one of `create`, `delete` or `update`
:param str timestamp: Timestamp of the event.
:param data: (tuple(set)) if messaging is configured with `provenance`
level, this is a 2-tuple with one set (as 3-tuples of
RDFlib.Identifier instances) for removed triples, and one set for
added triples.
"""
self.rsrc_uri = rsrc_uri
self.ev_type = ev_type
self.timestamp = timestamp
self.rsrc_type = rsrc_type
self.actor = actor
self.data = data
@abstractmethod
def __str__(self):
pass
[docs]class ASResourceFormatter(BaseASFormatter):
"""
Sends information about a resource being created, updated or deleted, by
who and when, with no further information about what changed.
"""
def __str__(self):
"""Output structured data as string."""
ret = {
'@context': 'https://www.w3.org/ns/activitystreams',
'id' : 'urn:uuid:{}'.format(uuid.uuid4()),
'type' : self.ev_types[self.ev_type],
'name' : self.ev_names[self.ev_type],
'object' : {
'id' : self.rsrc_uri,
'updated' : self.timestamp,
'type' : self.rsrc_type,
},
'actor' : self.actor,
}
return json.dumps(ret)
[docs]class ASDeltaFormatter(BaseASFormatter):
"""
Sends the same information as `ASResourceFormatter` with the addition of
the triples that were added and the ones that were removed in the request.
This may be used to send rich provenance data to a preservation system.
"""
def __str__(self):
"""Output structured data as string."""
ret = {
'@context': 'https://www.w3.org/ns/activitystreams',
'id' : 'urn:uuid:{}'.format(uuid.uuid4()),
'type' : self.ev_types[self.ev_type],
'name' : self.ev_names[self.ev_type],
'object' : {
'id' : self.rsrc_uri,
'updated' : self.timestamp,
'type' : self.rsrc_type,
},
'actor' : self.actor,
'data' : self.data,
}
return json.dumps(ret)