Source code for jsonresolver.contrib.jsonschema
# -*- 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 ``RefResolver`` factory using ``JSONResolver``.
The ``ref_resolver_factory`` uses an instance of ``JSONResolver`` for
implementation of remote URL resolver. The resolver is used to retrieve JSON
object based on registered plugins.
Example:
.. code-block:: python
>>> from jsonschema import validate
>>> from jsonresolver import JSONResolver
>>> from jsonresolver.contrib.jsonschema import ref_resolver_factory
>>> schema = {'$ref': 'http://localhost:4000/schema/authors.json#'}
>>> json_resolver = JSONResolver(plugins=['demo.schema'])
>>> resolver_cls = ref_resolver_factory(json_resolver)
>>> resolver = resolver_cls.from_schema(schema)
>>> validate(['foo', 'bar'], schema, resolver=resolver)
None
"""
from __future__ import absolute_import
from jsonschema import RefResolver as _RefResolver
from werkzeug.exceptions import NotFound
[docs]def ref_resolver_factory(resolver):
"""Generate new RefResolver class that uses given resolver."""
class RefResolver(_RefResolver):
"""Implement custom remote URL resolver."""
def resolve_remote(self, uri):
"""Resolve remove uri using given resolver."""
try:
result = resolver.resolve(uri)
if self.cache_remote:
self.store[uri] = result
return result
except NotFound:
return super(RefResolver, self).resolve_remote(uri)
return RefResolver