Source code for herostools.actor.archiver.json_archiver
# coding:utf-8
import json
from pathlib import Path
from jinja2 import Template
from .base import HERODataArchiver
[docs]
class JsonArchiver(HERODataArchiver):
"""HERODataArchiver that saves dict payloads as ``.json`` files.
Args:
object_selector: Zenoh object selector for the devices to subscribe to.
event_name: Name of the event.
save_template: Jinja2 template used to generate the output file path from
the payload metadata.
merge_metadata: When ``True``, the metadata dict is embedded in the saved
JSON under the key ``metadata``.
default_metadata: Default metadata available to the filename template.
max_retries: Number of times to retry a failed store before dropping the item.
"""
def __init__(
self,
save_template: str,
merge_metadata: bool = False,
*args,
**kwargs,
):
self.name_template = Template(save_template)
self.merge_metadata = merge_metadata
HERODataArchiver.__init__(self, *args, **kwargs)
[docs]
def _store(self, source_name: str, payload: dict, metadata: dict) -> None:
"""Save the payload as a ``.json`` file.
Args:
source_name: Name of the event source (the HERO).
payload: Data to save as a JSON-serialisable dict.
metadata: Incoming metadata merged with ``default_metadata``.
"""
metadata = self.metadata | metadata
if self.merge_metadata:
payload["metadata"] = metadata
full_path = Path(self.name_template.render(metadata))
full_path.parent.mkdir(parents=True, exist_ok=True)
full_path.write_text(json.dumps(payload, indent=4))