Source code for invenio_records_rest.serializers.jsonld

# -*- coding: utf-8 -*-
#
# This file is part of Invenio.
# Copyright (C) 2017-2018 CERN.
# Copyright (C) 2017 RERO.
#
# Invenio is free software; you can redistribute it and/or modify it
# under the terms of the MIT License; see LICENSE file for more details.

"""Marshmallow based JSON-LD serializer for records."""

import copy

from flask import request
from pyld import jsonld

from .base import TransformerMixinInterface
from .json import JSONSerializer


[docs]class JSONLDTransformerMixin(TransformerMixinInterface): """JSON-LD serializer for records. Note: This serializer is not suitable for serializing large number of records. """ def __init__(self, context, expanded=True, **kwargs): """Initialize record. :param context: JSON-LD context. :param schema_class: Marshmallow schema. :param expanded: expanded form, compacted else. :param replace_refs: replace the ``$ref`` keys within the JSON. """ self.context = context self._expanded = expanded super().__init__(**kwargs) @property def expanded(self): """Get JSON-LD expanded state.""" # Ensure we can run outside a application/request context. if request: if "expanded" in request.args: return True elif "compacted" in request.args: return False return self._expanded
[docs] def transform_jsonld(self, obj): """Compact JSON according to context.""" rec = copy.deepcopy(obj) rec.update(self.context) compacted = jsonld.compact(rec, self.context) if not self.expanded: return compacted else: return jsonld.expand(compacted)[0]
[docs] def transform_record(self, pid, record, links_factory=None, **kwargs): """Transform record into an intermediate representation.""" result = super().transform_record(pid, record, links_factory, **kwargs) return self.transform_jsonld(result)
[docs] def transform_search_hit(self, pid, record_hit, links_factory=None, **kwargs): """Transform search result hit into an intermediate representation.""" result = super().transform_search_hit(pid, record_hit, links_factory, **kwargs) return self.transform_jsonld(result)
[docs]class JSONLDSerializer(JSONLDTransformerMixin, JSONSerializer): """JSON-LD serializer for records supporting Marshmallow schemas."""