Пример #1
0
 def call_view(self, *args, **kwargs):
     view_fn = self.func
     config = flask.current_app.config
     parser = config.get('APISPEC_WEBARGS_PARSER', flaskparser.parser)
     # Delegate webargs.use_args annotations
     annotation = utils.resolve_annotations(self.func, 'args', self.instance)
     if annotation.apply is not False:
         for option in annotation.options:
             schema = utils.resolve_schema(option['argmap'], request=flask.request)
             view_fn = parser.use_args(schema, **option['kwargs'])(view_fn)
     # Delegate webargs.use_kwargs annotations
     annotation = utils.resolve_annotations(self.func, 'kwargs', self.instance)
     if annotation.apply is not False:
         for option in annotation.options:
             schema = utils.resolve_schema(option['argmap'], request=flask.request)
             if getattr(schema, 'many', False):
                 raise Exception("@use_kwargs cannot be used with a with a "
                                 "'many=True' schema, as it must deserialize "
                                 "to a dict")
             elif isinstance(schema, ma.Schema):
                 # Spy the post_load to provide a more informative error
                 # if it doesn't return a Mapping
                 post_load_fns = post_load_fn_names(schema)
                 for post_load_fn_name in post_load_fns:
                     spy_post_load(schema, post_load_fn_name)
             view_fn = parser.use_kwargs(schema, **option['kwargs'])(view_fn)
     return view_fn(*args, **kwargs)
Пример #2
0
    def get_parameters(self, rule, view, docs, parent=None):
        if APISPEC_VERSION_INFO[0] < 3:
            openapi = self.marshmallow_plugin.openapi
        else:
            openapi = self.marshmallow_plugin.converter
        annotation = resolve_annotations(view, 'args', parent)
        extra_params = []
        for args in annotation.options:
            schema = args.get('args', {})
            if is_instance_or_subclass(schema, Schema):
                converter = openapi.schema2parameters
            elif callable(schema):
                schema = schema(request=None)
                if is_instance_or_subclass(schema, Schema):
                    converter = openapi.schema2parameters
                else:
                    converter = openapi.fields2parameters
            else:
                converter = openapi.fields2parameters
            options = copy.copy(args.get('kwargs', {}))
            locations = options.pop('locations', None)
            if locations:
                options['default_in'] = locations[0]
            elif 'default_in' not in options:
                options['default_in'] = 'body'
            extra_params += converter(schema, **options) if args else []

        rule_params = rule_to_params(rule, docs.get('params')) or []

        return extra_params + rule_params
Пример #3
0
 def call_view(self, *args, **kwargs):
     config = flask.current_app.config
     parser = config.get('APISPEC_WEBARGS_PARSER', fixed_parser)
     annotation = utils.resolve_annotations(self.func, 'args',
                                            self.instance)
     if annotation.apply is not False:
         for option in annotation.options:
             schema = utils.resolve_schema(option['args'],
                                           request=flask.request)
             parsed = parser.parse(schema,
                                   locations=option['kwargs']['locations'])
             # if not isinstance(parsed, dict):
             #     parsed = dict(obj=parsed)
             # print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ args", repr(args))
             # print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ kwargs", repr(kwargs))
             # print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ parsed", repr(parsed))
             if isinstance(parsed, list):
                 # parsed = {"obj": parsed }
                 # if getattr(schema, 'many', False):
                 args += tuple(parsed)
             elif isinstance(parsed, dict):
                 kwargs.update(parsed)
             else:
                 args += (parsed, )
     return self.func(*args, **kwargs)
Пример #4
0
    def get_parameters(self, rule, view, docs, parent=None):
        annotation = resolve_annotations(view, 'args', parent)
        args = merge_recursive(annotation.options)
        schema = args.get('args', {})
        if is_instance_or_subclass(schema, Schema):
            converter = swagger.schema2parameters
        elif callable(schema):
            schema = schema(request=None)
            if is_instance_or_subclass(schema, Schema):
                converter = swagger.schema2parameters
            else:
                converter = swagger.fields2parameters
        else:
            converter = swagger.fields2parameters
        options = copy.copy(args.get('kwargs', {}))
        locations = options.pop('locations', None)
        if locations:
            options['default_in'] = locations[0]
        if parse_version(apispec.__version__) < parse_version('0.20.0'):
            options['dump'] = False

        options['spec'] = self.app.config.get('APISPEC_SPEC', None)

        rule_params = rule_to_params(rule, docs.get('params')) or []
        extra_params = converter(schema, **options) if args else []

        return extra_params + rule_params
Пример #5
0
 def wrapped(*args, **kwargs):
     instance = args[0] if func.__apispec__.get('ismethod') else None
     annotation = utils.resolve_annotations(func, 'wrapper', instance)
     wrapper_cls = utils.merge_recursive(annotation.options).get(
         'wrapper', Wrapper)
     wrapper = wrapper_cls(func, instance)
     return wrapper(*args, **kwargs)
Пример #6
0
 def get_operation(self, rule, view, parent=None):
     annotation = resolve_annotations(view, 'docs', parent)
     docs = merge_recursive(annotation.options)
     operation = {
         'responses': self.get_responses(view, parent),
         'parameters': self.get_parameters(rule, view, docs, parent),
     }
     docs.pop('params', None)
     return merge_recursive([operation, docs])
Пример #7
0
 def get_operation(self, rule, view, parent=None):
     annotation = resolve_annotations(view, 'docs', parent)
     docs = merge_recursive(annotation.options)
     operation = {
         'responses': self.get_responses(view, parent),
         'parameters': self.get_parameters(rule, view, docs, parent),
     }
     docs.pop('params', None)
     return merge_recursive([operation, docs])
Пример #8
0
 def call_view(self, *args, **kwargs):
     config = flask.current_app.config
     parser = config.get('APISPEC_WEBARGS_PARSER', flaskparser.parser)
     annotation = utils.resolve_annotations(self.func, 'args', self.instance)
     if annotation.apply is not False:
         for option in annotation.options:
             schema = utils.resolve_instance(option['args'])
             parsed = parser.parse(schema, locations=option['kwargs']['locations'])
             kwargs.update(parsed)
     return self.func(*args, **kwargs)
Пример #9
0
 def get_parameters(self, rule, view, docs, parent=None):
     annotation = resolve_annotations(view, 'args', parent)
     args = merge_recursive(annotation.options)
     converter = (swagger.schema2parameters if is_instance_or_subclass(
         args.get('args', {}), Schema) else swagger.fields2parameters)
     options = copy.copy(args.get('kwargs', {}))
     locations = options.pop('locations', None)
     if locations:
         options['default_in'] = locations[0]
     return converter(args.get('args', {}), dump=False, **
                      options) + rule_to_params(rule, docs.get('params'))
Пример #10
0
 def call_view(self, *args, **kwargs):
     config = flask.current_app.config
     parser = config.get('APISPEC_WEBARGS_PARSER', flaskparser.parser)
     annotation = utils.resolve_annotations(self.func, 'args',
                                            self.instance)
     if annotation.apply is not False:
         for option in annotation.options:
             schema = utils.resolve_instance(option['args'])
             parsed = parser.parse(schema,
                                   locations=option['kwargs']['locations'])
             kwargs.update(parsed)
     return self.func(*args, **kwargs)
Пример #11
0
 def marshal_result(self, unpacked, status_code):
     config = flask.current_app.config
     format_response = config.get('APISPEC_FORMAT_RESPONSE', flask.jsonify) or identity
     annotation = utils.resolve_annotations(self.func, 'schemas', self.instance)
     schemas = utils.merge_recursive(annotation.options)
     schema = schemas.get(status_code, schemas.get('default'))
     if schema and annotation.apply is not False:
         schema = utils.resolve_instance(schema['schema'])
         output = schema.dump(unpacked[0]).data
     else:
         output = unpacked[0]
     return format_output((format_response(output), ) + unpacked[1:])
Пример #12
0
 def marshal_result(self, unpacked, status_code):
     config = flask.current_app.config
     format_response = config.get('APISPEC_FORMAT_RESPONSE', flask.jsonify) or identity
     annotation = utils.resolve_annotations(self.func, 'schemas', self.instance)
     schemas = utils.merge_recursive(annotation.options)
     schema = schemas.get(status_code, schemas.get('default'))
     if schema and annotation.apply is not False:
         schema = utils.resolve_schema(schema['schema'], request=flask.request)
         dumped = schema.dump(unpacked[0])
         output = dumped.data if MARSHMALLOW_VERSION_INFO[0] < 3 else dumped
     else:
         output = unpacked[0]
     return format_output((format_response(output), ) + unpacked[1:])
Пример #13
0
    def call_view(self, *args, **kwargs):
        config = flask.current_app.config
        parser = config.get('APISPEC_WEBARGS_PARSER', flaskparser.parser)
        annotation = utils.resolve_annotations(self.func, 'args', self.instance)
        if annotation.apply is not False:
            for option in annotation.options:
                schema = utils.resolve_schema(option['args'], request=flask.request)
                parsed = parser.parse(schema, location=option['kwargs']['location'])
                if getattr(schema, 'many', False):
                    args += tuple(parsed)
                elif isinstance(parsed, Mapping):
                    kwargs.update(parsed)
                else:
                    args += (parsed,)

        return self.func(*args, **kwargs)
Пример #14
0
    def get_parameters(self, rule, view, docs, parent=None):
        annotation = resolve_annotations(view, 'args', parent)
        args = merge_recursive(annotation.options)
        converter = (swagger.schema2parameters if is_instance_or_subclass(
            args.get('args', {}), Schema) else swagger.fields2parameters)
        options = copy.copy(args.get('kwargs', {}))
        locations = options.pop('locations', None)
        if locations:
            options['default_in'] = locations[0]
        if parse_version(apispec.__version__) < parse_version('0.20.0'):
            options['dump'] = False
        rule_params = rule_to_params(rule, docs.get('params')) or []
        extra_params = converter(args.get('args', {}), **
                                 options) if args else []

        return rule_params + extra_params
Пример #15
0
 def get_parameters(self, rule, view, docs, parent=None):
     annotation = resolve_annotations(view, 'args', parent)
     args = merge_recursive(annotation.options)
     converter = (
         swagger.schema2parameters
         if is_instance_or_subclass(args.get('args', {}), Schema)
         else swagger.fields2parameters
     )
     options = copy.copy(args.get('kwargs', {}))
     locations = options.pop('locations', None)
     if locations:
         options['default_in'] = locations[0]
     return converter(
         args.get('args', {}),
         dump=False,
         **options
     ) + rule_to_params(rule, docs.get('params'))
Пример #16
0
 def get_responses(self, view, parent=None):
     annotation = resolve_annotations(view, 'schemas', parent)
     options = []
     for option in annotation.options:
         exploded = {}
         for status_code, meta in option.items():
             if self.spec.openapi_version.major < 3:
                 meta.pop('content_type', None)
                 exploded[status_code] = meta
             else:
                 content_type = meta['content_type'] or 'application/json'
                 exploded[status_code] = {
                     'content': {
                         content_type: {
                             'schema': meta['schema']
                         }
                     }
                 }
                 if meta['description']:
                     exploded[status_code]['description'] = meta['description']
         options.append(exploded)
     return merge_recursive(options)
Пример #17
0
    def get_parameters(self, rule, view, docs, parent=None):
        openapi = self.marshmallow_plugin.converter
        annotation = resolve_annotations(view, 'args', parent)
        extra_params = []
        for args in annotation.options:
            schema = args.get('args', {})
            openapi_converter = openapi.schema2parameters
            if not is_instance_or_subclass(schema, Schema):
                if callable(schema):
                    schema = schema(request=None)
                else:
                    schema = Schema.from_dict(schema)
                    openapi_converter = functools.partial(
                        self._convert_dict_schema, openapi_converter)

            options = copy.copy(args.get('kwargs', {}))
            if not options.get('location'):
                options['location'] = 'body'
            extra_params += openapi_converter(schema, **
                                              options) if args else []

        rule_params = rule_to_params(rule, docs.get('params')) or []

        return extra_params + rule_params
Пример #18
0
    def get_parameters(self, rule, view, docs, parent=None):
        openapi = self.marshmallow_plugin.openapi
        annotation = resolve_annotations(view, 'args', parent)
        args = merge_recursive(annotation.options)
        schema = args.get('args', {})
        if is_instance_or_subclass(schema, Schema):
            converter = openapi.schema2parameters
        elif callable(schema):
            schema = schema(request=None)
            if is_instance_or_subclass(schema, Schema):
                converter = openapi.schema2parameters
            else:
                converter = openapi.fields2parameters
        else:
            converter = openapi.fields2parameters
        options = copy.copy(args.get('kwargs', {}))
        locations = options.pop('locations', None)
        if locations:
            options['default_in'] = locations[0]

        rule_params = rule_to_params(rule, docs.get('params')) or []
        extra_params = converter(schema, **options) if args else []

        return extra_params + rule_params
Пример #19
0
def parse_kwargs(resource, qs):
    annotation = resolve_annotations(resource.get, 'args', parent=resource)
    fields = utils.extend(*[option['args'] for option in annotation.options])
    with task_utils.get_app().test_request_context(b'?' + qs):
        kwargs = flaskparser.parser.parse(fields)
    return fields, kwargs
Пример #20
0
 def get_responses(self, view, parent=None):
     annotation = resolve_annotations(view, 'schemas', parent)
     return merge_recursive(annotation.options)
Пример #21
0
 def wrapped(*args, **kwargs):
     instance = args[0] if func.__apispec__.get('ismethod') else None
     annotation = utils.resolve_annotations(func, 'wrapper', instance)
     wrapper_cls = utils.merge_recursive(annotation.options).get('wrapper', Wrapper)
     wrapper = wrapper_cls(func, instance)
     return wrapper(*args, **kwargs)
Пример #22
0
def parse_kwargs(resource, qs):
    annotation = resolve_annotations(resource.get, 'args', parent=resource)
    fields = utils.extend(*[option['args'] for option in annotation.options])
    with task_utils.get_app().test_request_context(b'?' + qs):
        kwargs = flaskparser.parser.parse(fields)
    return fields, kwargs
Пример #23
0
 def get_responses(self, view, parent=None):
     annotation = resolve_annotations(view, 'schemas', parent)
     return merge_recursive(annotation.options)