summaryrefslogtreecommitdiff
path: root/wsmeext/pecan.py
diff options
context:
space:
mode:
Diffstat (limited to 'wsmeext/pecan.py')
-rw-r--r--wsmeext/pecan.py142
1 files changed, 0 insertions, 142 deletions
diff --git a/wsmeext/pecan.py b/wsmeext/pecan.py
deleted file mode 100644
index 9d63dde..0000000
--- a/wsmeext/pecan.py
+++ /dev/null
@@ -1,142 +0,0 @@
-from __future__ import absolute_import
-
-import functools
-import inspect
-import sys
-
-import wsme
-import wsme.rest.args
-import wsme.rest.json
-import wsme.rest.xml
-
-import pecan
-
-from wsme.utils import is_valid_code
-
-
-class JSonRenderer(object):
- @staticmethod
- def __init__(path, extra_vars):
- pass
-
- @staticmethod
- def render(template_path, namespace):
- if 'faultcode' in namespace:
- return wsme.rest.json.encode_error(None, namespace)
- return wsme.rest.json.encode_result(
- namespace['result'],
- namespace['datatype']
- )
-
-
-class XMLRenderer(object):
- @staticmethod
- def __init__(path, extra_vars):
- pass
-
- @staticmethod
- def render(template_path, namespace):
- if 'faultcode' in namespace:
- return wsme.rest.xml.encode_error(None, namespace)
- return wsme.rest.xml.encode_result(
- namespace['result'],
- namespace['datatype']
- )
-
-
-pecan.templating._builtin_renderers['wsmejson'] = JSonRenderer
-pecan.templating._builtin_renderers['wsmexml'] = XMLRenderer
-
-pecan_json_decorate = pecan.expose(
- template='wsmejson:',
- content_type='application/json',
- generic=False)
-pecan_xml_decorate = pecan.expose(
- template='wsmexml:',
- content_type='application/xml',
- generic=False
-)
-pecan_text_xml_decorate = pecan.expose(
- template='wsmexml:',
- content_type='text/xml',
- generic=False
-)
-
-
-def wsexpose(*args, **kwargs):
- sig = wsme.signature(*args, **kwargs)
-
- def decorate(f):
- sig(f)
- funcdef = wsme.api.FunctionDefinition.get(f)
- funcdef.resolve_types(wsme.types.registry)
-
- @functools.wraps(f)
- def callfunction(self, *args, **kwargs):
- return_type = funcdef.return_type
-
- try:
- args, kwargs = wsme.rest.args.get_args(
- funcdef, args, kwargs, pecan.request.params, None,
- pecan.request.body, pecan.request.content_type
- )
- if funcdef.pass_request:
- kwargs[funcdef.pass_request] = pecan.request
- result = f(self, *args, **kwargs)
-
- # NOTE: Support setting of status_code with default 201
- pecan.response.status = funcdef.status_code
- if isinstance(result, wsme.api.Response):
- pecan.response.status = result.status_code
-
- # NOTE(lucasagomes): If the return code is 204
- # (No Response) we have to make sure that we are not
- # returning anything in the body response and the
- # content-length is 0
- if result.status_code == 204:
- return_type = None
- elif not isinstance(result.return_type,
- wsme.types.UnsetType):
- return_type = result.return_type
-
- result = result.obj
-
- except Exception:
- try:
- exception_info = sys.exc_info()
- orig_exception = exception_info[1]
- orig_code = getattr(orig_exception, 'code', None)
- data = wsme.api.format_exception(
- exception_info,
- pecan.conf.get('wsme', {}).get('debug', False)
- )
- finally:
- del exception_info
-
- if orig_code and is_valid_code(orig_code):
- pecan.response.status = orig_code
- else:
- pecan.response.status = 500
-
- return data
-
- if return_type is None:
- pecan.request.pecan['content_type'] = None
- pecan.response.content_type = None
- return ''
-
- return dict(
- datatype=return_type,
- result=result
- )
-
- if 'xml' in funcdef.rest_content_types:
- pecan_xml_decorate(callfunction)
- pecan_text_xml_decorate(callfunction)
- if 'json' in funcdef.rest_content_types:
- pecan_json_decorate(callfunction)
- pecan.util._cfg(callfunction)['argspec'] = inspect.getargspec(f)
- callfunction._wsme_definition = funcdef
- return callfunction
-
- return decorate