Reorganise the tg1x adapters, and make the tg 1.5 adapter able to handle multiprotocol on 'native' rest

This commit is contained in:
Christophe de Vienne 2012-11-26 13:55:27 +01:00
parent 39cc2ffc8f
commit d3f1ba4884
5 changed files with 71 additions and 68 deletions

View File

@ -1,6 +1,6 @@
import wsme.tg1 import wsme.tg11
from wsme import WSRoot from wsme import WSRoot
from wsme.tg1 import wsexpose, wsvalidate from wsme.tg11 import wsexpose, wsvalidate
from turbogears.controllers import RootController from turbogears.controllers import RootController
@ -23,7 +23,7 @@ class Root(RootController):
tns=test_soap.tns, tns=test_soap.tns,
typenamespace=test_soap.typenamespace typenamespace=test_soap.typenamespace
) )
ws = wsme.tg1.adapt(ws) ws = wsme.tg11.adapt(ws)
@wsexpose(int) @wsexpose(int)
@wsvalidate(int, int) @wsvalidate(int, int)
@ -48,7 +48,7 @@ class TestController(unittest.TestCase):
def tearDown(self): def tearDown(self):
# implementation copied from turbogears.testutil.stop_server. # implementation copied from turbogears.testutil.stop_server.
# The only change is that cherrypy.root is set to None # 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. # can correctly uninstall its filter.
if config.get("cp_started"): if config.get("cp_started"):
cherrypy.server.stop() cherrypy.server.stop()

View File

@ -1,28 +1,28 @@
import wsme.tg15 import wsme.tg15
from wsme import expose, validate, WSRoot from wsme import WSRoot
from turbogears.controllers import RootController from turbogears.controllers import RootController
import unittest from wsmeext.soap.tests import test_soap
import simplejson import simplejson
class WSController(WSRoot): class Root(RootController):
@expose(int) ws = WSRoot(webpath='/ws')
@validate(int, int) 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): def multiply(self, a, b):
return a * b return a * b
class Root(RootController): from turbogears import testutil
ws = wsme.tg15.adapt(
WSController(webpath='/ws', protocols=['restjson']))
import cherrypy
from turbogears import testutil, config, startup
class TestController(testutil.TGTest): class TestController(testutil.TGTest):
@ -47,9 +47,45 @@ class TestController(testutil.TGTest):
# startup.stopTurboGears() # startup.stopTurboGears()
# config.update({"server_started": False}) # config.update({"server_started": False})
def test_simplecall(self): def test_restcall(self):
response = self.app.post("/ws/multiply", response = self.app.post("/multiply",
simplejson.dumps({'a': 5, 'b': 10}), simplejson.dumps({'a': 5, 'b': 10}),
{'Content-Type': 'application/json'}) {'Content-Type': 'application/json'}
)
print response print response
assert simplejson.loads(response.body) == 50 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 == "<result>50</result>"
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

View File

@ -61,11 +61,13 @@ commands=
[testenv:tg15] [testenv:tg15]
basepython=python2.5 basepython=python2.5
deps= deps=
d2to1
nose nose
webtest webtest
coverage coverage
simplejson simplejson
commands= 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}/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} {envbindir}/coverage run -p {envbindir}/nosetests tests/test_tg15.py --verbose {posargs}

View File

@ -6,10 +6,8 @@ except ImportError:
import functools import functools
import cherrypy import cherrypy
from cherrypy.filters.basefilter import BaseFilter
import webob import webob
from turbogears import expose, config from turbogears import expose
from turbogears.startup import call_on_startup, call_on_shutdown
from wsme.rest import validate as wsvalidate from wsme.rest import validate as wsvalidate
import wsme.api import wsme.api
@ -111,17 +109,6 @@ turbogears.view.engines['wsmejson'] = AutoJSONTemplate(turbogears.view.stdvars)
turbogears.view.engines['wsmexml'] = AutoXMLTemplate(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): class Controller(object):
def __init__(self, wsroot): def __init__(self, wsroot):
self._wsroot = wsroot self._wsroot = wsroot
@ -135,27 +122,6 @@ class Controller(object):
return res.body 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 import wsme.rest

View File

@ -1,21 +1,20 @@
import cherrypy import cherrypy
import webob
from turbogears import expose from wsme.tg1 import wsexpose, wsvalidate
import wsme.tg1
class Controller(object): __all__ = ['adapt', 'wsexpose', 'wsvalidate']
def __init__(self, wsroot):
self._wsroot = wsroot
@expose()
def default(self, *args, **kw): def scan_api(root=None):
req = webob.Request(cherrypy.request.wsgi_environ) for baseurl, instance in cherrypy.tree.apps.items():
res = self._wsroot._handle_request(req) path = [token for token in baseurl.split('/') if token]
cherrypy.response.header_list = res.headerlist for i in wsme.tg1._scan_api(instance.root, path):
cherrypy.response.status = res.status yield i
return res.body
def adapt(wsroot): def adapt(wsroot):
controller = Controller(wsroot) wsroot._scan_api = scan_api
controller = wsme.tg1.Controller(wsroot)
return controller return controller