From d3f1ba48841b2f6b95df9e51a1aa145a07834060 Mon Sep 17 00:00:00 2001 From: Christophe de Vienne Date: Mon, 26 Nov 2012 13:55:27 +0100 Subject: [PATCH] Reorganise the tg1x adapters, and make the tg 1.5 adapter able to handle multiprotocol on 'native' rest --- tests/test_tg1.py | 8 +++--- tests/test_tg15.py | 68 +++++++++++++++++++++++++++++++++++----------- tox.ini | 2 ++ wsme/tg1.py | 36 +----------------------- wsme/tg15.py | 25 ++++++++--------- 5 files changed, 71 insertions(+), 68 deletions(-) diff --git a/tests/test_tg1.py b/tests/test_tg1.py index f9b0a4c..e8d4183 100644 --- a/tests/test_tg1.py +++ b/tests/test_tg1.py @@ -1,6 +1,6 @@ -import wsme.tg1 +import wsme.tg11 from wsme import WSRoot -from wsme.tg1 import wsexpose, wsvalidate +from wsme.tg11 import wsexpose, wsvalidate from turbogears.controllers import RootController @@ -23,7 +23,7 @@ class Root(RootController): tns=test_soap.tns, typenamespace=test_soap.typenamespace ) - ws = wsme.tg1.adapt(ws) + ws = wsme.tg11.adapt(ws) @wsexpose(int) @wsvalidate(int, int) @@ -48,7 +48,7 @@ class TestController(unittest.TestCase): def tearDown(self): # implementation copied from turbogears.testutil.stop_server. # The only change is that cherrypy.root is set to None - # AFTER stopTurbogears has been called so that wsme.tg1 + # AFTER stopTurbogears has been called so that wsme.tg11 # can correctly uninstall its filter. if config.get("cp_started"): cherrypy.server.stop() diff --git a/tests/test_tg15.py b/tests/test_tg15.py index 3faf063..3a1d093 100644 --- a/tests/test_tg15.py +++ b/tests/test_tg15.py @@ -1,28 +1,28 @@ import wsme.tg15 -from wsme import expose, validate, WSRoot +from wsme import WSRoot from turbogears.controllers import RootController -import unittest +from wsmeext.soap.tests import test_soap import simplejson -class WSController(WSRoot): - @expose(int) - @validate(int, int) +class Root(RootController): + ws = WSRoot(webpath='/ws') + ws.addprotocol('soap', + tns=test_soap.tns, + typenamespace=test_soap.typenamespace + ) + ws = wsme.tg15.adapt(ws) + + @wsme.tg15.wsexpose(int) + @wsme.tg15.wsvalidate(int, int) def multiply(self, a, b): return a * b -class Root(RootController): - ws = wsme.tg15.adapt( - WSController(webpath='/ws', protocols=['restjson'])) - - -import cherrypy - -from turbogears import testutil, config, startup +from turbogears import testutil class TestController(testutil.TGTest): @@ -47,9 +47,45 @@ class TestController(testutil.TGTest): # startup.stopTurboGears() # config.update({"server_started": False}) - def test_simplecall(self): - response = self.app.post("/ws/multiply", + def test_restcall(self): + response = self.app.post("/multiply", simplejson.dumps({'a': 5, 'b': 10}), - {'Content-Type': 'application/json'}) + {'Content-Type': 'application/json'} + ) print response assert simplejson.loads(response.body) == 50 + + response = self.app.post("/multiply", + simplejson.dumps({'a': 5, 'b': 10}), + {'Content-Type': 'application/json', 'Accept': 'application/json'} + ) + print response + assert simplejson.loads(response.body) == 50 + + response = self.app.post("/multiply", + simplejson.dumps({'a': 5, 'b': 10}), + {'Content-Type': 'application/json', 'Accept': 'text/javascript'} + ) + print response + assert simplejson.loads(response.body) == 50 + + response = self.app.post("/multiply", + simplejson.dumps({'a': 5, 'b': 10}), + {'Content-Type': 'application/json', + 'Accept': 'text/xml'} + ) + print response + assert response.body == "50" + + def test_soap_wsdl(self): + wsdl = self.app.get('/ws/api.wsdl').body + print wsdl + assert 'multiply' in wsdl + + def test_soap_call(self): + ts = test_soap.TestSOAP('test_wsdl') + ts.app = self.app + ts.ws_path = '/ws' + + print ts.ws_path + assert ts.call('multiply', a=5, b=10, _rt=int) == 50 diff --git a/tox.ini b/tox.ini index 3a4f2ff..8838eee 100644 --- a/tox.ini +++ b/tox.ini @@ -61,11 +61,13 @@ commands= [testenv:tg15] basepython=python2.5 deps= + d2to1 nose webtest coverage simplejson commands= + {envbindir}/easy_install https://bitbucket.org/cdevienne/wsme-soap/get/tip.zip {envbindir}/easy_install -i http://www.turbogears.org/1.5/downloads/current/index/ 'TurboGears<1.5.99' {envbindir}/coverage run -p {envbindir}/nosetests tests/test_tg15.py --verbose {posargs} diff --git a/wsme/tg1.py b/wsme/tg1.py index b59e6ca..475b98e 100644 --- a/wsme/tg1.py +++ b/wsme/tg1.py @@ -6,10 +6,8 @@ except ImportError: import functools import cherrypy -from cherrypy.filters.basefilter import BaseFilter import webob -from turbogears import expose, config -from turbogears.startup import call_on_startup, call_on_shutdown +from turbogears import expose from wsme.rest import validate as wsvalidate import wsme.api @@ -111,17 +109,6 @@ turbogears.view.engines['wsmejson'] = AutoJSONTemplate(turbogears.view.stdvars) turbogears.view.engines['wsmexml'] = AutoXMLTemplate(turbogears.view.stdvars) -class WSMECherrypyFilter(BaseFilter): - def __init__(self, controller): - self.controller = controller - self.webpath = None - - def on_start_resource(self): - path = cherrypy.request.path - if path.startswith(self.controller._wsroot._webpath): - cherrypy.request.processRequestBody = False - - class Controller(object): def __init__(self, wsroot): self._wsroot = wsroot @@ -135,27 +122,6 @@ class Controller(object): return res.body -def adapt(wsroot): - wsroot._scan_api = scan_api - controller = Controller(wsroot) - filter_ = WSMECherrypyFilter(controller) - - def install_filter(): - filter_.webpath = config.get('server.webpath') or '' - controller._wsroot._webpath = \ - filter_.webpath + controller._wsroot._webpath - cherrypy.root._cp_filters.append(filter_) - - def uninstall_filter(): - cherrypy.root._cp_filters.remove(filter_) - controller._wsroot._webpath = \ - controller._wsroot._webpath[len(filter_.webpath):] - - call_on_startup.append(install_filter) - call_on_shutdown.insert(0, uninstall_filter) - return controller - - import wsme.rest diff --git a/wsme/tg15.py b/wsme/tg15.py index af4cebc..425d81b 100644 --- a/wsme/tg15.py +++ b/wsme/tg15.py @@ -1,21 +1,20 @@ import cherrypy -import webob -from turbogears import expose + +from wsme.tg1 import wsexpose, wsvalidate +import wsme.tg1 -class Controller(object): - def __init__(self, wsroot): - self._wsroot = wsroot +__all__ = ['adapt', 'wsexpose', 'wsvalidate'] - @expose() - def default(self, *args, **kw): - req = webob.Request(cherrypy.request.wsgi_environ) - res = self._wsroot._handle_request(req) - cherrypy.response.header_list = res.headerlist - cherrypy.response.status = res.status - return res.body + +def scan_api(root=None): + for baseurl, instance in cherrypy.tree.apps.items(): + path = [token for token in baseurl.split('/') if token] + for i in wsme.tg1._scan_api(instance.root, path): + yield i def adapt(wsroot): - controller = Controller(wsroot) + wsroot._scan_api = scan_api + controller = wsme.tg1.Controller(wsroot) return controller