Пример #1
0
    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)
Пример #2
0
    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)
Пример #3
0
    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)
Пример #4
0
    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', ''])
Пример #5
0
    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', ''])