wsmeext.cornice.signature can now decorate resource class methods

This commit is contained in:
Christophe de Vienne 2013-04-17 16:03:56 +02:00
parent cffcee226c
commit 814e87ea72

View File

@ -16,6 +16,8 @@ And use it::
""" """
from __future__ import absolute_import from __future__ import absolute_import
import inspect
import wsme import wsme
from wsme.rest import json as restjson from wsme.rest import json as restjson
from wsme.rest import xml as restxml from wsme.rest import xml as restxml
@ -66,12 +68,24 @@ def signature(*args, **kwargs):
sig = wsme.signature(*args, **kwargs) sig = wsme.signature(*args, **kwargs)
def decorate(f): def decorate(f):
sig(f) args = inspect.getargspec(f)[0]
with_self = args[0] == 'self' if args else False
f = sig(f)
funcdef = wsme.api.FunctionDefinition.get(f) funcdef = wsme.api.FunctionDefinition.get(f)
funcdef.resolve_types(wsme.types.registry) funcdef.resolve_types(wsme.types.registry)
@functools.wraps(f) @functools.wraps(f)
def callfunction(request): def callfunction(*args):
if with_self:
if len(args) == 1:
self = args[0]
request = self.request
elif len(args) == 2:
self, request = args
else:
raise ValueError("Cannot do anything with these arguments")
else:
request = args[0]
args, kwargs = combine_args( args, kwargs = combine_args(
funcdef, funcdef,
(args_from_args(funcdef, (), request.matchdict), (args_from_args(funcdef, (), request.matchdict),
@ -82,6 +96,8 @@ def signature(*args, **kwargs):
request.override_renderer = 'wsme' + get_outputformat(request) request.override_renderer = 'wsme' + get_outputformat(request)
if funcdef.pass_request: if funcdef.pass_request:
kwargs[funcdef.pass_request] = request kwargs[funcdef.pass_request] = request
if with_self:
args.insert(0, self)
return { return {
'datatype': funcdef.return_type, 'datatype': funcdef.return_type,
'result': f(*args, **kwargs) 'result': f(*args, **kwargs)