From 0f0116be7870490447bbfa794c118205e8eca120 Mon Sep 17 00:00:00 2001 From: Christophe de Vienne Date: Sun, 14 Oct 2012 01:40:27 +0200 Subject: [PATCH] Add an adapter for pecan. --- wsme/pecan.py | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 wsme/pecan.py diff --git a/wsme/pecan.py b/wsme/pecan.py new file mode 100644 index 0000000..a8fcbc3 --- /dev/null +++ b/wsme/pecan.py @@ -0,0 +1,75 @@ +import inspect +import sys + +import json + +import xml.etree.ElementTree as et + +import wsme +import wsme.protocols.commons +import wsme.protocols.restjson +import wsme.protocols.restxml + +pecan = sys.modules['pecan'] + + +class JSonRenderer(object): + def __init__(self, path, extra_vars): + pass + + def render(self, template_path, namespace): + data = wsme.protocols.restjson.tojson( + namespace['datatype'], + namespace['result'] + ) + return json.dumps(data) + + +class XMLRenderer(object): + def __init__(self, path, extra_vars): + pass + + def render(self, template_path, namespace): + data = wsme.protocols.restxml.toxml( + namespace['datatype'], + 'result', + namespace['result'] + ) + return et.tostring(data) + +pecan.templating._builtin_renderers['wsmejson'] = JSonRenderer +pecan.templating._builtin_renderers['wsmexml'] = XMLRenderer + + +def wsexpose(*args, **kwargs): + 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 + ) + sig = wsme.sig(*args, **kwargs) + + def decorate(f): + sig(f) + funcdef = wsme.api.FunctionDefinition.get(f) + + def callfunction(self, *args, **kwargs): + args, kwargs = wsme.protocols.commons.get_args( + funcdef, args, kwargs + ) + result = f(self, *args, **kwargs) + return dict( + datatype=funcdef.return_type, + result=result + ) + + pecan_json_decorate(callfunction) + pecan_xml_decorate(callfunction) + pecan.util._cfg(callfunction)['argspec'] = inspect.getargspec(f) + return callfunction + + return decorate