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.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()

View File

@ -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 == "<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]
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}

View File

@ -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

View File

@ -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