Source code for jsonresolver.contrib.jsonref

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

"""Module that implements ``JsonLoader`` factory using ``JSONResolver``.

Use ``json_loader_factory`` if you want to take advantage of default
``JsonLoader.get_remote_json`` method for URIs that are not handled
by your ``JSONResolver`` instance.

Example:

.. code-block:: python

   >>> from jsonref import JsonRef
   >>> from jsonresolver import JSONResolver
   >>> from jsonresolver.contrib.jsonref import json_loader_factory
   >>> schema = {'$ref': 'http://localhost:4000/schema/authors.json#'}
   >>> json_resolver = JSONResolver(plugins=['demo.schema'])
   >>> loader_cls = json_loader_factory(json_resolver)
   >>> loader = loader_cls(cache_results=False)
   >>> dict(JsonRef.replace_refs(schema, loader=loader))
   {'type': 'array'}
   # if you do not want default fallback:
   >>> dict(JsonRef.replace_refs(schema, loader=json_resolver.resolve))
   {'type': 'array'}

"""

from __future__ import absolute_import

from jsonref import JsonLoader as _JsonLoader
from werkzeug.exceptions import NotFound


[docs]def json_loader_factory(resolver): """Generate new ``JsonLoader`` class that uses given resolver.""" class JsonLoader(_JsonLoader): """Implement custom remote reference resolver.""" def get_remote_json(self, uri, **kwargs): """Resolve remove uri using given resolver.""" try: return resolver.resolve(uri) except NotFound: return super(JsonLoader, self).get_remote_json(uri, **kwargs) return JsonLoader