def resolve(self, jref, parser=None): """ JSON reference resolver :param str jref: a JSON Reference, refer to http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03 for details. :param parser: the parser corresponding to target object. :type parser: pyswagger.base.Context :return: the referenced object, wrapped by weakref.ProxyType :rtype: weakref.ProxyType :raises ValueError: if path is not valid """ logger.info('resolving: [{0}]'.format(jref)) if jref == None or len(jref) == 0: raise ValueError('Empty Path is not allowed') obj = None url, jp = utils.jr_split(jref) # check cacahed object against json reference by # comparing url first, and find those object prefixed with # the JSON pointer. o = self.__objs.get(url, None) if o: if isinstance(o, BaseObj): obj = o.resolve(utils.jp_split(jp)[1:]) elif isinstance(o, dict): for k, v in six.iteritems(o): if jp.startswith(k): obj = v.resolve(utils.jp_split(jp[len(k):])[1:]) break else: raise Exception('Unknown Cached Object: {0}'.format( str(type(o)))) # this object is not found in cache if obj == None: if url: obj, _ = self.load_obj(jref, parser=parser) if obj: obj = self.prepare_obj(obj, jref) else: # a local reference, 'jref' is just a json-pointer if not jp.startswith('#'): raise ValueError( 'Invalid Path, root element should be \'#\', but [{0}]' .format(jref)) obj = self.root.resolve(utils.jp_split( jp)[1:]) # heading element is #, mapping to self.root if obj == None: raise ValueError('Unable to resolve path, [{0}]'.format(jref)) if isinstance(obj, (six.string_types, six.integer_types, list, dict)): return obj return weakref.proxy(obj)
def resolve(self, jref, parser=None): """ JSON reference resolver :param str jref: a JSON Reference, refer to http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03 for details. :param parser: the parser corresponding to target object. :type parser: pyswagger.base.Context :return: the referenced object, wrapped by weakref.ProxyType :rtype: weakref.ProxyType :raises ValueError: if path is not valid """ logger.info('resolving: [{0}]'.format(jref)) if jref == None or len(jref) == 0: raise ValueError('Empty Path is not allowed') obj = None url, jp = utils.jr_split(jref) if url: # check cacahed object against json reference by # comparing url first, and find those object prefixed with # the JSON pointer. o = self.__objs.get(url, None) if o: if isinstance(o, BaseObj): obj = o.resolve(utils.jp_split(jp)[1:]) elif isinstance(o, dict): for k, v in six.iteritems(o): if jp.startswith(k): obj = v.resolve(utils.jp_split(jp[len(k):])[1:]) break else: raise Exception('Unknown Cached Object: {0}'.format(str(type(o)))) # this object is not loaded yet, load it if obj == None: obj, _ = self.load_obj(jref, parser=parser) if obj: obj = self.prepare_obj(obj, jref) else: # a local reference, 'jref' is just a json-pointer if not jp.startswith('#'): raise ValueError('Invalid Path, root element should be \'#\', but [{0}]'.format(jref)) obj = self.root.resolve(utils.jp_split(jp)[1:]) # heading element is #, mapping to self.root if obj == None: raise ValueError('Unable to resolve path, [{0}]'.format(jref)) if isinstance(obj, (six.string_types, six.integer_types, list, dict)): return obj return weakref.proxy(obj)
def resolve(self, jref, parser=None): """ JSON reference resolver :param str jref: a JSON Reference, refer to http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03 for details. :param parser: the parser corresponding to target object. :type parser: pyswagger.base.Context :return: the referenced object, wrapped by weakref.ProxyType :rtype: weakref.ProxyType :raises ValueError: if path is not valid """ logger.info('resolving: [{0}]'.format(jref)) if jref == None or len(jref) == 0: raise ValueError('Empty Path is not allowed') url, jp = utils.jr_split(jref) if url: if url not in self.__app_cache: # This loaded SwaggerApp would be kept in app_cache. app = SwaggerApp.load(url, parser=parser, app_cache=self.__app_cache, url_load_hook=self.__url_load_hook) app.prepare() # nothing but only keeping a strong reference of # loaded SwaggerApp. self.__strong_refs.append(app) return self.__app_cache[url].resolve(jp) if not jp.startswith('#'): raise ValueError( 'Invalid Path, root element should be \'#\', but [{0}]'.format( jref)) obj = self.root.resolve(utils.jp_split( jp)[1:]) # heading element is #, mapping to self.root if obj == None: raise ValueError('Unable to resolve path, [{0}]'.format(jref)) if isinstance(obj, (six.string_types, int, list, dict)): return obj return weakref.proxy(obj)
def test_json_pointer(self): """ json pointer io function """ self.assertEqual(utils.jp_compose('/test'), '~1test') self.assertEqual(utils.jp_compose('~test'), '~0test') self.assertEqual(utils.jp_compose('/~test'), '~1~0test') self.assertEqual(utils.jp_compose('a', 'b'), 'b/a') self.assertEqual(utils.jp_compose(''), '') self.assertEqual(utils.jp_compose(None, 'base'), 'base') cs = ['~test1', '/test2', 'test3'] c = utils.jp_compose(cs, 'base') self.assertEqual(c, 'base/~0test1/~1test2/test3') self.assertEqual(utils.jp_split(c)[1:], cs) self.assertEqual(utils.jp_split('~1test'), ['/test']) self.assertEqual(utils.jp_split('~0test'), ['~test']) self.assertEqual(utils.jp_split('~1~0test'), ['/~test']) self.assertEqual(utils.jp_split(''), []) self.assertEqual(utils.jp_split(None), []) self.assertEqual(utils.jp_split('/~1~0test/qq/~0test/~1test/'), ['', '/~test', 'qq', '~test', '/test', ''])