def resolve(self, pointer): try: dp = DocumentPointer(pointer) if dp.is_inner(): logger.debug('resolve inner %s', pointer) return self.factory.local(self.registry.resolve(pointer), pointer, self.registry, self.spec) logger.debug('resolve outside %s', pointer) return self.factory(self.registry.resolve(pointer), pointer, self.spec) except ExtractError as error: raise CompilationError({}, error)
def __call__(self, schema, pointer, spec=None): try: spec = schema.get('$schema', spec or self.spec) compiler = self.compilers[spec] except KeyError: raise CompilationError('{!r} not registered'.format(spec), schema) registry = LocalRegistry(schema, self.provider) local = DocumentPointer(pointer) if local.document: registry[local.document] = schema local.document = '<local>' context = Context(self, registry, spec, self.formats) return compiler(schema, pointer, context)
def resolve(obj, pointer, registry=None): """resolve a local object :param obj: the local object. :param pointer: the pointer :type pointer: DocumentPointer, str :param registry: the registry. It mays be omited if inner json references document don't refer to other documents. :type registry: Provider, dict .. warning:: Once pointer is extracted, it won't follow sub mapping /element! For example, the value of:: value = resolve({ 'foo': {'$ref': '#/bar'}, 'bar': [{'$ref': '#/baz'}], 'baz': 'quux', }, '#/foo') is:: assert value == [{'$ref': '#/baz'}] and not:: assert value == ['quux'] """ registry = LocalRegistry(obj, registry or {}) local = DocumentPointer(pointer) if local.document: registry[local.document] = obj local.document = '<local>' return registry.resolve(local)
def resolve(self, pointer): """Resolve from documents. :param pointer: foo :type pointer: DocumentPointer """ dp = DocumentPointer(pointer) obj, fetcher = self.prototype(dp) for token in dp.pointer: obj = token.extract(obj, bypass_ref=True) reference = ref(obj) if reference: obj = fetcher.resolve(reference) return obj
def test_inner_document(self): dp = DocumentPointer('#/foo') assert dp.is_inner() assert dp.document == '' assert dp.pointer == '/foo'
def test_document(self): dp = DocumentPointer('example.com#/foo') assert not dp.is_inner() assert dp.document == 'example.com' assert dp.pointer == '/foo'
def __init__(self, pointer, context): super(ReferenceValidator, self).__init__() self.pointer = DocumentPointer(pointer) self.context = context self.uri = str(self.pointer)