Reorganise the tg1x adapters, and make the tg 1.5 adapter able to handle multiprotocol on 'native' rest
This commit is contained in:
parent
39cc2ffc8f
commit
d3f1ba4884
@ -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()
|
||||||
|
@ -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
|
||||||
|
2
tox.ini
2
tox.ini
@ -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}
|
||||||
|
|
||||||
|
36
wsme/tg1.py
36
wsme/tg1.py
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
25
wsme/tg15.py
25
wsme/tg15.py
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user