pep8 fixes, including a declaration in tox.ini for running flake8
Change-Id: I2adc6a5cbd76edd16e6079046b67b8fc10bf1671
This commit is contained in:
parent
72c20e7ea1
commit
f91767bf1e
@ -1,6 +1,6 @@
|
||||
# content of: tox.ini , put in same dir as setup.py
|
||||
[tox]
|
||||
envlist = py26,py26-nolxml,py27,py27-nolxml,py32,py32-nolxml,pypy,sphinxext,tg11,tg15,pecan,flask,cornice,coverage,py33,py33-nolxml
|
||||
envlist = py26,py26-nolxml,py27,py27-nolxml,py32,py32-nolxml,pypy,sphinxext,tg11,tg15,pecan,flask,cornice,coverage,py33,py33-nolxml,pep8
|
||||
|
||||
[common]
|
||||
testtools=
|
||||
@ -209,3 +209,7 @@ changedir=
|
||||
|
||||
commands=
|
||||
make clean ziphtml
|
||||
|
||||
[testenv:pep8]
|
||||
deps = flake8
|
||||
commands = flake8 wsme wsmeext setup.py
|
||||
|
6
tox.ini
6
tox.ini
@ -1,5 +1,5 @@
|
||||
[tox]
|
||||
envlist = py26,py26-nolxml,py27,py27-nolxml,py32,py32-nolxml,pypy,sphinxext,tg11,tg15,pecan,flask,cornice,coverage,py33,py33-nolxml
|
||||
envlist = py26,py26-nolxml,py27,py27-nolxml,py32,py32-nolxml,pypy,sphinxext,tg11,tg15,pecan,flask,cornice,coverage,py33,py33-nolxml,pep8
|
||||
|
||||
[common]
|
||||
testtools =
|
||||
@ -130,6 +130,10 @@ changedir =
|
||||
commands =
|
||||
make clean ziphtml
|
||||
|
||||
[testenv:pep8]
|
||||
deps = flake8
|
||||
commands = flake8 wsme wsmeext setup.py
|
||||
|
||||
[testenv:py26-sa5-lxml-json]
|
||||
commands =
|
||||
{envbindir}/coverage run {envbindir}/nosetests --nologcapture --with-xunit --xunit-file nosetests-{envname}.xml wsme/tests wsmeext/tests --verbose {posargs}
|
||||
|
@ -68,8 +68,10 @@ def from_params(datatype, params, path, hit_paths):
|
||||
if objfound:
|
||||
r = datatype()
|
||||
for attrdef in list_attributes(datatype):
|
||||
value = from_params(attrdef.datatype,
|
||||
params, '%s.%s' % (path, attrdef.key), hit_paths)
|
||||
value = from_params(
|
||||
attrdef.datatype,
|
||||
params, '%s.%s' % (path, attrdef.key), hit_paths
|
||||
)
|
||||
if value is not Unset:
|
||||
setattr(r, attrdef.key, value)
|
||||
return r
|
||||
|
@ -239,9 +239,8 @@ def encode_error(context, errordetail):
|
||||
|
||||
def encode_sample_value(datatype, value, format=False):
|
||||
r = tojson(datatype, value)
|
||||
content = json.dumps(r, ensure_ascii=False,
|
||||
indent=4 if format else 0,
|
||||
sort_keys=format)
|
||||
content = json.dumps(r, ensure_ascii=False, indent=4 if format else 0,
|
||||
sort_keys=format)
|
||||
return ('javascript', content)
|
||||
|
||||
|
||||
@ -249,9 +248,8 @@ def encode_sample_params(params, format=False):
|
||||
kw = {}
|
||||
for name, datatype, value in params:
|
||||
kw[name] = tojson(datatype, value)
|
||||
content = json.dumps(kw, ensure_ascii=False,
|
||||
indent=4 if format else 0,
|
||||
sort_keys=format)
|
||||
content = json.dumps(kw, ensure_ascii=False, indent=4 if format else 0,
|
||||
sort_keys=format)
|
||||
return ('javascript', content)
|
||||
|
||||
|
||||
@ -259,7 +257,6 @@ def encode_sample_result(datatype, value, format=False):
|
||||
r = tojson(datatype, value)
|
||||
#if self.nest_result:
|
||||
#r = {'result': r}
|
||||
content = json.dumps(r, ensure_ascii=False,
|
||||
indent=4 if format else 0,
|
||||
sort_keys=format)
|
||||
content = json.dumps(r, ensure_ascii=False, indent=4 if format else 0,
|
||||
sort_keys=format)
|
||||
return ('javascript', content)
|
||||
|
@ -79,7 +79,7 @@ class WSRoot(object):
|
||||
__registry__ = wsme.types.registry
|
||||
|
||||
def __init__(self, protocols=[], webpath='', transaction=None,
|
||||
scan_api=scan_api):
|
||||
scan_api=scan_api):
|
||||
self._debug = True
|
||||
self._webpath = webpath
|
||||
self.protocols = []
|
||||
@ -242,8 +242,8 @@ class WSRoot(object):
|
||||
if protocol is None:
|
||||
if msg is None:
|
||||
msg = ("None of the following protocols can handle this "
|
||||
"request : %s" % ','.join(
|
||||
(p.name for p in self.protocols)))
|
||||
"request : %s" % ','.join((
|
||||
p.name for p in self.protocols)))
|
||||
res.status = 500
|
||||
res.content_type = 'text/plain'
|
||||
res.text = u(msg)
|
||||
|
@ -35,7 +35,8 @@ class CallException(RuntimeError):
|
||||
|
||||
def __str__(self):
|
||||
return 'faultcode=%s, faultstring=%s, debuginfo=%s' % (
|
||||
self.faultcode, self.faultstring, self.debuginfo)
|
||||
self.faultcode, self.faultstring, self.debuginfo
|
||||
)
|
||||
|
||||
|
||||
myenumtype = wsme.types.Enum(wsme.types.bytes, 'v1', 'v2')
|
||||
@ -382,7 +383,7 @@ class ProtocolTestCase(unittest.TestCase):
|
||||
e = sys.exc_info()[1]
|
||||
self.assertEquals(e.faultcode, 'Client')
|
||||
self.assertEquals(e.faultstring.lower(),
|
||||
u('unknown function name: invalid_function'))
|
||||
u('unknown function name: invalid_function'))
|
||||
|
||||
def test_serverside_error(self):
|
||||
try:
|
||||
@ -471,23 +472,21 @@ class ProtocolTestCase(unittest.TestCase):
|
||||
|
||||
def test_return_nesteddict(self):
|
||||
r = self.call('returntypes/getnesteddict',
|
||||
_rt={wsme.types.bytes: NestedOuter})
|
||||
_rt={wsme.types.bytes: NestedOuter})
|
||||
self.assertEquals(r, {
|
||||
b('a'): {'inner': {'aint': 0}},
|
||||
b('b'): {'inner': {'aint': 0}}
|
||||
})
|
||||
|
||||
def test_return_objectarrayattribute(self):
|
||||
r = self.call('returntypes/getobjectarrayattribute',
|
||||
_rt=NestedOuter)
|
||||
r = self.call('returntypes/getobjectarrayattribute', _rt=NestedOuter)
|
||||
self.assertEquals(r, {
|
||||
'inner': {'aint': 0},
|
||||
'inner_array': [{'aint': 12}, {'aint': 13}]
|
||||
})
|
||||
|
||||
def test_return_objectdictattribute(self):
|
||||
r = self.call('returntypes/getobjectdictattribute',
|
||||
_rt=NestedOuter)
|
||||
r = self.call('returntypes/getobjectdictattribute', _rt=NestedOuter)
|
||||
self.assertEquals(r, {
|
||||
'inner': {'aint': 0},
|
||||
'inner_dict': {
|
||||
@ -506,15 +505,15 @@ class ProtocolTestCase(unittest.TestCase):
|
||||
|
||||
def test_setbytes(self):
|
||||
assert self.call('argtypes/setbytes', value=b('astring'),
|
||||
_rt=wsme.types.bytes) == b('astring')
|
||||
_rt=wsme.types.bytes) == b('astring')
|
||||
|
||||
def test_settext(self):
|
||||
assert self.call('argtypes/settext', value=u('\xe3\x81\xae'),
|
||||
_rt=wsme.types.text) == u('\xe3\x81\xae')
|
||||
_rt=wsme.types.text) == u('\xe3\x81\xae')
|
||||
|
||||
def test_settext_empty(self):
|
||||
assert self.call('argtypes/settext', value=u(''),
|
||||
_rt=wsme.types.text) == u('')
|
||||
_rt=wsme.types.text) == u('')
|
||||
|
||||
def test_settext_none(self):
|
||||
self.assertEquals(
|
||||
@ -564,14 +563,14 @@ class ProtocolTestCase(unittest.TestCase):
|
||||
def test_setbinary(self):
|
||||
value = binarysample
|
||||
r = self.call('argtypes/setbinary', value=(value, wsme.types.binary),
|
||||
_rt=wsme.types.binary) == value
|
||||
_rt=wsme.types.binary) == value
|
||||
print(r)
|
||||
|
||||
def test_setnested(self):
|
||||
value = {'inner': {'aint': 54}}
|
||||
r = self.call('argtypes/setnested',
|
||||
value=(value, NestedOuter),
|
||||
_rt=NestedOuter)
|
||||
value=(value, NestedOuter),
|
||||
_rt=NestedOuter)
|
||||
self.assertEquals(r, value)
|
||||
|
||||
def test_setnested_nullobj(self):
|
||||
@ -586,15 +585,15 @@ class ProtocolTestCase(unittest.TestCase):
|
||||
def test_setbytesarray(self):
|
||||
value = [b("1"), b("2"), b("three")]
|
||||
r = self.call('argtypes/setbytesarray',
|
||||
value=(value, [wsme.types.bytes]),
|
||||
_rt=[wsme.types.bytes])
|
||||
value=(value, [wsme.types.bytes]),
|
||||
_rt=[wsme.types.bytes])
|
||||
self.assertEquals(r, value)
|
||||
|
||||
def test_settextarray(self):
|
||||
value = [u("1")]
|
||||
r = self.call('argtypes/settextarray',
|
||||
value=(value, [wsme.types.text]),
|
||||
_rt=[wsme.types.text])
|
||||
value=(value, [wsme.types.text]),
|
||||
_rt=[wsme.types.text])
|
||||
self.assertEquals(r, value)
|
||||
|
||||
def test_setdatetimearray(self):
|
||||
@ -603,8 +602,8 @@ class ProtocolTestCase(unittest.TestCase):
|
||||
datetime.datetime(2008, 4, 6, 2, 12, 15),
|
||||
]
|
||||
r = self.call('argtypes/setdatetimearray',
|
||||
value=(value, [datetime.datetime]),
|
||||
_rt=[datetime.datetime])
|
||||
value=(value, [datetime.datetime]),
|
||||
_rt=[datetime.datetime])
|
||||
self.assertEquals(r, value)
|
||||
|
||||
def test_setnestedarray(self):
|
||||
@ -613,8 +612,8 @@ class ProtocolTestCase(unittest.TestCase):
|
||||
{'inner': {'aint': 55}},
|
||||
]
|
||||
r = self.call('argtypes/setnestedarray',
|
||||
value=(value, [NestedOuter]),
|
||||
_rt=[NestedOuter])
|
||||
value=(value, [NestedOuter]),
|
||||
_rt=[NestedOuter])
|
||||
self.assertEquals(r, value)
|
||||
|
||||
def test_setnesteddict(self):
|
||||
@ -623,8 +622,8 @@ class ProtocolTestCase(unittest.TestCase):
|
||||
b('o2'): {'inner': {'aint': 55}},
|
||||
}
|
||||
r = self.call('argtypes/setnesteddict',
|
||||
value=(value, {six.binary_type: NestedOuter}),
|
||||
_rt={six.binary_type: NestedOuter})
|
||||
value=(value, {six.binary_type: NestedOuter}),
|
||||
_rt={six.binary_type: NestedOuter})
|
||||
print(r)
|
||||
self.assertEquals(r, value)
|
||||
|
||||
@ -637,8 +636,8 @@ class ProtocolTestCase(unittest.TestCase):
|
||||
def test_setnamedattrsobj(self):
|
||||
value = {'attr.1': 10, 'attr.2': 20}
|
||||
r = self.call('argtypes/setnamedattrsobj',
|
||||
value=(value, NamedAttrsObject),
|
||||
_rt=NamedAttrsObject)
|
||||
value=(value, NamedAttrsObject),
|
||||
_rt=NamedAttrsObject)
|
||||
self.assertEquals(r, value)
|
||||
|
||||
def test_nested_api(self):
|
||||
@ -661,5 +660,5 @@ class ProtocolTestCase(unittest.TestCase):
|
||||
|
||||
def test_html_format(self):
|
||||
res = self.call('argtypes/setdatetime', _accept="text/html",
|
||||
_no_result_decode=True)
|
||||
_no_result_decode=True)
|
||||
self.assertEquals(res.content_type, 'text/html')
|
||||
|
@ -1,6 +1,7 @@
|
||||
# encoding=utf8
|
||||
|
||||
from wsme.exc import *
|
||||
from wsme.exc import (ClientSideError, InvalidInput, MissingArgument,
|
||||
UnknownArgument)
|
||||
from six import u
|
||||
|
||||
|
||||
@ -19,9 +20,10 @@ def test_unicode_clientside_error():
|
||||
def test_invalidinput():
|
||||
e = InvalidInput('field', 'badvalue', "error message")
|
||||
|
||||
assert e.faultstring == \
|
||||
u("Invalid input for field/attribute field. Value: 'badvalue'. " \
|
||||
"error message"), e.faultstring
|
||||
assert e.faultstring == u(
|
||||
"Invalid input for field/attribute field. Value: 'badvalue'. "
|
||||
"error message"
|
||||
), e.faultstring
|
||||
|
||||
|
||||
def test_missingargument():
|
||||
|
@ -68,4 +68,3 @@ class TestProtocols(unittest.TestCase):
|
||||
assert p.encode_sample_value(None, None) == ('none', 'N/A')
|
||||
assert p.encode_sample_params(None) == ('none', 'N/A')
|
||||
assert p.encode_sample_result(None, None) == ('none', 'N/A')
|
||||
|
||||
|
@ -42,8 +42,12 @@ class TestProtocolsCommons(unittest.TestCase):
|
||||
assert from_params(ArrayType(int), {}, 'a', set()) is Unset
|
||||
|
||||
def test_from_params_dict(self):
|
||||
value = from_params(DictType(int, str), {
|
||||
'a[2]': 'a2', 'a[3]': 'a3'}, 'a', set())
|
||||
value = from_params(
|
||||
DictType(int, str),
|
||||
{'a[2]': 'a2', 'a[3]': 'a3'},
|
||||
'a',
|
||||
set()
|
||||
)
|
||||
assert value == {2: 'a2', 3: 'a3'}, value
|
||||
|
||||
def test_from_params_dict_unset(self):
|
||||
|
@ -143,8 +143,8 @@ wsme.tests.protocol.WSTestRoot.crud = MiniCrud()
|
||||
class TestRestJson(wsme.tests.protocol.ProtocolTestCase):
|
||||
protocol = 'restjson'
|
||||
|
||||
def call(self, fpath, _rt=None, _accept=None,
|
||||
_no_result_decode=False, **kw):
|
||||
def call(self, fpath, _rt=None, _accept=None, _no_result_decode=False,
|
||||
**kw):
|
||||
for key in kw:
|
||||
if isinstance(kw[key], tuple):
|
||||
value, datatype = kw[key]
|
||||
@ -175,14 +175,15 @@ class TestRestJson(wsme.tests.protocol.ProtocolTestCase):
|
||||
return r
|
||||
else:
|
||||
raise wsme.tests.protocol.CallException(
|
||||
r['faultcode'],
|
||||
r['faultstring'],
|
||||
r.get('debuginfo'))
|
||||
r['faultcode'],
|
||||
r['faultstring'],
|
||||
r.get('debuginfo')
|
||||
)
|
||||
|
||||
return json.loads(res.text)
|
||||
|
||||
def test_fromjson(self):
|
||||
assert fromjson(str, None) == None
|
||||
assert fromjson(str, None) is None
|
||||
|
||||
def test_keyargs(self):
|
||||
r = self.app.get('/argtypes/setint.json?value=2')
|
||||
@ -202,8 +203,11 @@ class TestRestJson(wsme.tests.protocol.ProtocolTestCase):
|
||||
'value[1].inner.aint': 55
|
||||
}
|
||||
body = urlencode(params)
|
||||
r = self.app.post('/argtypes/setnestedarray.json', body,
|
||||
headers={'Content-Type': 'application/x-www-form-urlencoded'})
|
||||
r = self.app.post(
|
||||
'/argtypes/setnestedarray.json',
|
||||
body,
|
||||
headers={'Content-Type': 'application/x-www-form-urlencoded'}
|
||||
)
|
||||
print(r)
|
||||
|
||||
assert json.loads(r.text) == [
|
||||
@ -211,10 +215,9 @@ class TestRestJson(wsme.tests.protocol.ProtocolTestCase):
|
||||
{'inner': {'aint': 55}}]
|
||||
|
||||
def test_body_and_params(self):
|
||||
r = self.app.post('/argtypes/setint.json?value=2',
|
||||
'{"value": 2}',
|
||||
headers={"Content-Type": "application/json"},
|
||||
expect_errors=True)
|
||||
r = self.app.post('/argtypes/setint.json?value=2', '{"value": 2}',
|
||||
headers={"Content-Type": "application/json"},
|
||||
expect_errors=True)
|
||||
print(r)
|
||||
assert r.status_int == 400
|
||||
assert json.loads(r.text)['faultstring'] == \
|
||||
@ -233,21 +236,21 @@ class TestRestJson(wsme.tests.protocol.ProtocolTestCase):
|
||||
assert json.loads(r.text) == 2
|
||||
|
||||
def test_unknown_arg(self):
|
||||
r = self.app.post('/returntypes/getint.json',
|
||||
'{"a": 2}',
|
||||
headers={"Content-Type": "application/json"},
|
||||
expect_errors=True)
|
||||
r = self.app.post('/returntypes/getint.json', '{"a": 2}',
|
||||
headers={"Content-Type": "application/json"},
|
||||
expect_errors=True)
|
||||
print(r)
|
||||
assert r.status_int == 400
|
||||
assert json.loads(r.text)['faultstring'].startswith(
|
||||
"Unknown argument:")
|
||||
"Unknown argument:"
|
||||
)
|
||||
|
||||
r = self.app.get('/returntypes/getint.json?a=2',
|
||||
expect_errors=True)
|
||||
r = self.app.get('/returntypes/getint.json?a=2', expect_errors=True)
|
||||
print(r)
|
||||
assert r.status_int == 400
|
||||
assert json.loads(r.text)['faultstring'].startswith(
|
||||
"Unknown argument:")
|
||||
"Unknown argument:"
|
||||
)
|
||||
|
||||
def test_unset_attrs(self):
|
||||
class AType(object):
|
||||
@ -269,14 +272,12 @@ class TestRestJson(wsme.tests.protocol.ProtocolTestCase):
|
||||
|
||||
def test_None_tojson(self):
|
||||
for dt in (datetime.date, datetime.time, datetime.datetime,
|
||||
decimal.Decimal):
|
||||
decimal.Decimal):
|
||||
assert tojson(dt, None) is None
|
||||
|
||||
def test_None_fromjson(self):
|
||||
for dt in (str, int,
|
||||
datetime.date, datetime.time, datetime.datetime,
|
||||
decimal.Decimal,
|
||||
[int], {int: int}):
|
||||
for dt in (str, int, datetime.date, datetime.time, datetime.datetime,
|
||||
decimal.Decimal, [int], {int: int}):
|
||||
assert fromjson(dt, None) is None
|
||||
|
||||
def test_nest_result(self):
|
||||
@ -299,8 +300,8 @@ class TestRestJson(wsme.tests.protocol.ProtocolTestCase):
|
||||
r = wsme.rest.json.encode_sample_value(MyType, v, True)
|
||||
print(r)
|
||||
assert r[0] == ('javascript')
|
||||
assert r[1] == json.dumps({'aint': 4, 'astr': 's'},
|
||||
ensure_ascii=False, indent=4, sort_keys=True)
|
||||
assert r[1] == json.dumps({'aint': 4, 'astr': 's'}, ensure_ascii=False,
|
||||
indent=4, sort_keys=True)
|
||||
|
||||
def test_bytes_tojson(self):
|
||||
assert tojson(wsme.types.bytes, None) is None
|
||||
|
@ -40,7 +40,7 @@ def dumpxml(key, obj, datatype=None):
|
||||
el.text = six.text_type(obj)
|
||||
elif type(obj) in (datetime.date, datetime.time, datetime.datetime):
|
||||
el.text = obj.isoformat()
|
||||
elif type(obj) == type(None):
|
||||
elif isinstance(obj, type(None)):
|
||||
el.set('nil', 'true')
|
||||
elif hasattr(datatype, '_wsme_attributes'):
|
||||
for attr in datatype._wsme_attributes:
|
||||
@ -120,8 +120,8 @@ def loadxml(el, datatype):
|
||||
class TestRestXML(wsme.tests.protocol.ProtocolTestCase):
|
||||
protocol = 'restxml'
|
||||
|
||||
def call(self, fpath, _rt=None, _accept=None,
|
||||
_no_result_decode=False, **kw):
|
||||
def call(self, fpath, _rt=None, _accept=None, _no_result_decode=False,
|
||||
**kw):
|
||||
el = dumpxml('parameters', kw)
|
||||
content = et.tostring(el)
|
||||
headers = {
|
||||
@ -142,10 +142,11 @@ class TestRestXML(wsme.tests.protocol.ProtocolTestCase):
|
||||
el = et.fromstring(res.body)
|
||||
if el.tag == 'error':
|
||||
raise wsme.tests.protocol.CallException(
|
||||
el.find('faultcode').text,
|
||||
el.find('faultstring').text,
|
||||
el.find('debuginfo') is not None and
|
||||
el.find('debuginfo').text or None)
|
||||
el.find('faultcode').text,
|
||||
el.find('faultstring').text,
|
||||
el.find('debuginfo') is not None and
|
||||
el.find('debuginfo').text or None
|
||||
)
|
||||
|
||||
else:
|
||||
return loadxml(et.fromstring(res.body), _rt)
|
||||
|
@ -47,7 +47,7 @@ class TestTypes(unittest.TestCase):
|
||||
assert attrs[0].name == 'aint'
|
||||
assert isinstance(attrs[0], types.wsattr)
|
||||
assert attrs[0].datatype == int
|
||||
assert attrs[0].mandatory == False
|
||||
assert attrs[0].mandatory is False
|
||||
assert attrs[1].key == 'abytes'
|
||||
assert attrs[1].name == 'abytes'
|
||||
assert attrs[2].key == 'atext'
|
||||
@ -322,9 +322,9 @@ class TestTypes(unittest.TestCase):
|
||||
def test_register_invalid_dict(self):
|
||||
self.assertRaises(ValueError, types.register_type, {})
|
||||
self.assertRaises(ValueError, types.register_type,
|
||||
{int: str, str: int})
|
||||
{int: str, str: int})
|
||||
self.assertRaises(ValueError, types.register_type,
|
||||
{types.Unset: str})
|
||||
{types.Unset: str})
|
||||
|
||||
def test_list_attribute_no_auto_register(self):
|
||||
class MyType(object):
|
||||
@ -454,6 +454,7 @@ class TestTypes(unittest.TestCase):
|
||||
class buffer:
|
||||
def read(self):
|
||||
return 'from-file'
|
||||
|
||||
class fieldstorage:
|
||||
filename = 'static.json'
|
||||
file = buffer()
|
||||
@ -465,6 +466,7 @@ class TestTypes(unittest.TestCase):
|
||||
class buffer:
|
||||
def read(self):
|
||||
return 'from-file'
|
||||
|
||||
class fieldstorage:
|
||||
filename = 'static.json'
|
||||
file = None
|
||||
|
@ -87,7 +87,8 @@ def parse_isodatetime(value):
|
||||
try:
|
||||
from collections import OrderedDict
|
||||
except ImportError:
|
||||
# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy.
|
||||
# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7
|
||||
# and pypy.
|
||||
# Passes Python2.7's test suite and incorporates all the latest updates.
|
||||
|
||||
try:
|
||||
@ -103,14 +104,17 @@ except ImportError:
|
||||
class OrderedDict(dict):
|
||||
'Dictionary that remembers insertion order'
|
||||
# An inherited dict maps keys to values.
|
||||
# The inherited dict provides __getitem__, __len__, __contains__, and get.
|
||||
# The remaining methods are order-aware.
|
||||
# Big-O running times for all methods are the same as for regular dictionaries.
|
||||
# The inherited dict provides __getitem__, __len__, __contains__, and
|
||||
# get. The remaining methods are order-aware.
|
||||
#
|
||||
# Big-O running times for all methods are the same as for regular
|
||||
# dictionaries.
|
||||
|
||||
# The internal self.__map dictionary maps keys to links in a doubly linked list.
|
||||
# The circular doubly linked list starts and ends with a sentinel element.
|
||||
# The sentinel element never gets deleted (this simplifies the algorithm).
|
||||
# Each link is stored as a list of length three: [PREV, NEXT, KEY].
|
||||
# The internal self.__map dictionary maps keys to links in a doubly
|
||||
# linked list. The circular doubly linked list starts and ends with
|
||||
# a sentinel element. The sentinel element never gets deleted (this
|
||||
# simplifies the algorithm). Each link is stored as a list of length
|
||||
# three: [PREV, NEXT, KEY].
|
||||
|
||||
def __init__(self, *args, **kwds):
|
||||
'''Initialize an ordered dictionary. Signature is the same as for
|
||||
@ -119,7 +123,9 @@ except ImportError:
|
||||
|
||||
'''
|
||||
if len(args) > 1:
|
||||
raise TypeError('expected at most 1 arguments, got %d' % len(args))
|
||||
raise TypeError(
|
||||
'expected at most 1 arguments, got %d' % len(args)
|
||||
)
|
||||
try:
|
||||
self.__root
|
||||
except AttributeError:
|
||||
@ -130,8 +136,9 @@ except ImportError:
|
||||
|
||||
def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
|
||||
'od.__setitem__(i, y) <==> od[i]=y'
|
||||
# Setting a new item creates a new link which goes at the end of the linked
|
||||
# list, and the inherited dictionary is updated with the new key/value pair.
|
||||
# Setting a new item creates a new link which goes at the end of
|
||||
# the linked list, and the inherited dictionary is updated with the
|
||||
# new key/value pair.
|
||||
if key not in self:
|
||||
root = self.__root
|
||||
last = root[0]
|
||||
@ -140,8 +147,9 @@ except ImportError:
|
||||
|
||||
def __delitem__(self, key, dict_delitem=dict.__delitem__):
|
||||
'od.__delitem__(y) <==> del od[y]'
|
||||
# Deleting an existing item uses self.__map to find the link which is
|
||||
# then removed by updating the links in the predecessor and successor nodes.
|
||||
# Deleting an existing item uses self.__map to find the link which
|
||||
# is then removed by updating the links in the predecessor and
|
||||
# successor nodes.
|
||||
dict_delitem(self, key)
|
||||
link_prev, link_next, key = self.__map.pop(key)
|
||||
link_prev[1] = link_next
|
||||
@ -177,7 +185,8 @@ except ImportError:
|
||||
|
||||
def popitem(self, last=True):
|
||||
'''od.popitem() -> (k, v), return and remove a (key, value) pair.
|
||||
Pairs are returned in LIFO order if last is true or FIFO order if false.
|
||||
Pairs are returned in LIFO order if last is true or FIFO order if
|
||||
false.
|
||||
|
||||
'''
|
||||
if not self:
|
||||
@ -227,12 +236,12 @@ except ImportError:
|
||||
yield (k, self[k])
|
||||
|
||||
def update(*args, **kwds):
|
||||
'''od.update(E, **F) -> None. Update od from dict/iterable E and F.
|
||||
'''od.update(E, **F) -> None. Update od from dict/iterable E and F
|
||||
|
||||
If E is a dict instance, does: for k in E: od[k] = E[k]
|
||||
If E has a .keys() method, does: for k in E.keys(): od[k] = E[k]
|
||||
If E has a .keys() method, does: for k in E.keys(): od[k] = E[k] # noqa
|
||||
Or if E is an iterable of items, does: for k, v in E: od[k] = v
|
||||
In either case, this is followed by: for k, v in F.items(): od[k] = v
|
||||
In either case, this is followed by: for k, v in F.items(): od[k] = v # noqa
|
||||
|
||||
'''
|
||||
if len(args) > 2:
|
||||
@ -257,14 +266,15 @@ except ImportError:
|
||||
for key, value in kwds.items():
|
||||
self[key] = value
|
||||
|
||||
__update = update # let subclasses override update without breaking __init__
|
||||
# let subclasses override update without breaking __init__
|
||||
__update = update
|
||||
|
||||
__marker = object()
|
||||
|
||||
def pop(self, key, default=__marker):
|
||||
'''od.pop(k[,d]) -> v, remove specified key and return the corresponding value.
|
||||
If key is not found, d is returned if given, otherwise KeyError is raised.
|
||||
|
||||
'''od.pop(k[,d]) -> v, remove specified key and return the
|
||||
corresponding value. If key is not found, d is returned if given,
|
||||
otherwise KeyError is raised.
|
||||
'''
|
||||
if key in self:
|
||||
result = self[key]
|
||||
@ -275,7 +285,8 @@ except ImportError:
|
||||
return default
|
||||
|
||||
def setdefault(self, key, default=None):
|
||||
'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'
|
||||
'''od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not
|
||||
in od'''
|
||||
if key in self:
|
||||
return self[key]
|
||||
self[key] = default
|
||||
@ -320,12 +331,15 @@ except ImportError:
|
||||
return d
|
||||
|
||||
def __eq__(self, other):
|
||||
'''od.__eq__(y) <==> od==y. Comparison to another OD is order-sensitive
|
||||
while comparison to a regular mapping is order-insensitive.
|
||||
|
||||
'''od.__eq__(y) <==> od==y. Comparison to another OD is
|
||||
order-sensitive while comparison to a regular mapping is
|
||||
order-insensitive.
|
||||
'''
|
||||
if isinstance(other, OrderedDict):
|
||||
return len(self)==len(other) and self.items() == other.items()
|
||||
return (
|
||||
len(self) == len(other) and
|
||||
self.items() == other.items()
|
||||
)
|
||||
return dict.__eq__(self, other)
|
||||
|
||||
def __ne__(self, other):
|
||||
@ -342,5 +356,6 @@ except ImportError:
|
||||
return ValuesView(self)
|
||||
|
||||
def viewitems(self):
|
||||
"od.viewitems() -> a set-like object providing a view on od's items"
|
||||
"""od.viewitems() -> a set-like object providing a view on od's
|
||||
items"""
|
||||
return ItemsView(self)
|
||||
|
@ -1 +1 @@
|
||||
from wsmeext.extdirect.protocol import ExtDirectProtocol
|
||||
from wsmeext.extdirect.protocol import ExtDirectProtocol # noqa
|
||||
|
@ -60,8 +60,7 @@ class DataStoreControllerMixin(object):
|
||||
def create(self, obj):
|
||||
pass
|
||||
|
||||
def read(self, query=None, sort=None,
|
||||
page=None, start=None, limit=None):
|
||||
def read(self, query=None, sort=None, page=None, start=None, limit=None):
|
||||
pass
|
||||
|
||||
def update(self, obj):
|
||||
@ -116,5 +115,7 @@ Ext.define('%(appns)s.store.%(classname)s', {
|
||||
return tpl % d
|
||||
|
||||
|
||||
DataStoreController = DataStoreControllerMeta('DataStoreController',
|
||||
(DataStoreControllerMixin,), {})
|
||||
DataStoreController = DataStoreControllerMeta(
|
||||
'DataStoreController',
|
||||
(DataStoreControllerMixin,), {}
|
||||
)
|
||||
|
@ -269,8 +269,7 @@ class ExtDirectProtocol(Protocol):
|
||||
displayname = 'ExtDirect'
|
||||
content_types = ['application/json', 'text/javascript']
|
||||
|
||||
def __init__(self, namespace='', params_notation='named',
|
||||
nsfolder=None):
|
||||
def __init__(self, namespace='', params_notation='named', nsfolder=None):
|
||||
self.namespace = namespace
|
||||
self.appns, self.apins = namespace.rsplit('.', 2) \
|
||||
if '.' in namespace else (namespace, '')
|
||||
@ -290,9 +289,11 @@ class ExtDirectProtocol(Protocol):
|
||||
assert path.startswith(self.root._webpath)
|
||||
path = path[len(self.root._webpath):]
|
||||
|
||||
return path == self.api_alias or \
|
||||
path == "/extdirect/api" or \
|
||||
path.startswith("/extdirect/router")
|
||||
return (
|
||||
path == self.api_alias or
|
||||
path == "/extdirect/api" or
|
||||
path.startswith("/extdirect/router")
|
||||
)
|
||||
|
||||
def iter_calls(self, req):
|
||||
path = req.path
|
||||
@ -333,12 +334,14 @@ class ExtDirectProtocol(Protocol):
|
||||
|
||||
def read_std_arguments(self, context):
|
||||
funcdef = context.funcdef
|
||||
notation = funcdef.extra_options.get(
|
||||
'extdirect_params_notation', self.default_params_notation)
|
||||
notation = funcdef.extra_options.get('extdirect_params_notation',
|
||||
self.default_params_notation)
|
||||
args = context.params
|
||||
if notation == 'positional':
|
||||
kw = dict((argdef.name, fromjson(argdef.datatype, arg))
|
||||
for argdef, arg in zip(funcdef.arguments, args))
|
||||
kw = dict(
|
||||
(argdef.name, fromjson(argdef.datatype, arg))
|
||||
for argdef, arg in zip(funcdef.arguments, args)
|
||||
)
|
||||
elif notation == 'named':
|
||||
if len(args) == 0:
|
||||
args = [{}]
|
||||
@ -357,8 +360,8 @@ class ExtDirectProtocol(Protocol):
|
||||
def read_form_arguments(self, context):
|
||||
kw = {}
|
||||
for argdef in context.funcdef.arguments:
|
||||
value = from_params(argdef.datatype,
|
||||
context.request.params, argdef.name, set())
|
||||
value = from_params(argdef.datatype, context.request.params,
|
||||
argdef.name, set())
|
||||
if value is not Unset:
|
||||
kw[argdef.name] = value
|
||||
return kw
|
||||
@ -421,14 +424,14 @@ class ExtDirectProtocol(Protocol):
|
||||
if action not in namespaces[namespace]:
|
||||
namespaces[namespace][action] = []
|
||||
notation = funcdef.extra_options.get('extdirect_params_notation',
|
||||
self.default_params_notation)
|
||||
self.default_params_notation)
|
||||
method = {
|
||||
'name': funcdef.name}
|
||||
|
||||
if funcdef.extra_options.get('extdirect_formhandler', False):
|
||||
method['formHandler'] = True
|
||||
method['len'] = 1 if notation == 'named' \
|
||||
else len(funcdef.arguments)
|
||||
else len(funcdef.arguments)
|
||||
namespaces[namespace][action].append(method)
|
||||
webpath = self.root._webpath
|
||||
if webpath and not webpath.endswith('/'):
|
||||
@ -442,7 +445,6 @@ class ExtDirectProtocol(Protocol):
|
||||
|
||||
def encode_sample_value(self, datatype, value, format=False):
|
||||
r = tojson(datatype, value)
|
||||
content = json.dumps(r, ensure_ascii=False,
|
||||
indent=4 if format else 0,
|
||||
sort_keys=format)
|
||||
content = json.dumps(r, ensure_ascii=False, indent=4 if format else 0,
|
||||
sort_keys=format)
|
||||
return ('javascript', content)
|
||||
|
@ -5,8 +5,7 @@ class SADataStoreController(datastore.DataStoreController):
|
||||
__dbsession__ = None
|
||||
__datatype__ = None
|
||||
|
||||
def read(self, query=None, sort=None,
|
||||
page=None, start=None, limit=None):
|
||||
def read(self, query=None, sort=None, page=None, start=None, limit=None):
|
||||
q = self.__dbsession__.query(self.__datatype__.__saclass__)
|
||||
total = q.count()
|
||||
if start is not None and limit is not None:
|
||||
|
@ -125,9 +125,8 @@ class SoapEncoder(object):
|
||||
el.set(type_qn, xsitype)
|
||||
el.text = value
|
||||
elif wsme.types.isusertype(datatype):
|
||||
return self.tosoap(
|
||||
datatype.basetype, tag,
|
||||
datatype.tobasetype(value))
|
||||
return self.tosoap(datatype.basetype, tag,
|
||||
datatype.tobasetype(value))
|
||||
elif wsme.types.iscomplex(datatype):
|
||||
el.set(type_qn, 'types:%s' % (datatype.__name__))
|
||||
for attrdef in wsme.types.list_attributes(datatype):
|
||||
@ -182,8 +181,11 @@ class SoapEncoder(object):
|
||||
|
||||
@tosoap.when_object(bool)
|
||||
def bool_tosoap(self, datatype, tag, value):
|
||||
return self.make_soap_element(datatype, tag,
|
||||
'true' if value is True else 'false' if value is False else None)
|
||||
return self.make_soap_element(
|
||||
datatype,
|
||||
tag,
|
||||
'true' if value is True else 'false' if value is False else None
|
||||
)
|
||||
|
||||
@tosoap.when_object(wsme.types.bytes)
|
||||
def bytes_tosoap(self, datatype, tag, value):
|
||||
@ -194,8 +196,11 @@ class SoapEncoder(object):
|
||||
|
||||
@tosoap.when_object(datetime.datetime)
|
||||
def datetime_tosoap(self, datatype, tag, value):
|
||||
return self.make_soap_element(datatype, tag,
|
||||
value is not None and value.isoformat() or None)
|
||||
return self.make_soap_element(
|
||||
datatype,
|
||||
tag,
|
||||
value is not None and value.isoformat() or None
|
||||
)
|
||||
|
||||
@tosoap.when_object(wsme.types.binary)
|
||||
def binary_tosoap(self, datatype, tag, value):
|
||||
@ -326,10 +331,8 @@ class SoapProtocol(Protocol):
|
||||
"soapenc": "http://schemas.xmlsoap.org/soap/encoding/",
|
||||
}
|
||||
|
||||
def __init__(self, tns=None,
|
||||
typenamespace=None,
|
||||
baseURL=None,
|
||||
servicename='MyApp'):
|
||||
def __init__(self, tns=None, typenamespace=None, baseURL=None,
|
||||
servicename='MyApp'):
|
||||
self.tns = tns
|
||||
self.typenamespace = typenamespace
|
||||
self.servicename = servicename
|
||||
@ -343,7 +346,8 @@ class SoapProtocol(Protocol):
|
||||
self._name_mapping[service] = dict(
|
||||
(soap_fname(path, f), path)
|
||||
for path, f in self.root.getapi()
|
||||
if service is None or (path and path[0] == service))
|
||||
if service is None or (path and path[0] == service)
|
||||
)
|
||||
return self._name_mapping[service]
|
||||
|
||||
def accept(self, req):
|
||||
|
@ -8,6 +8,7 @@ except ImportError:
|
||||
classtypes = type
|
||||
InstanceType = None
|
||||
|
||||
|
||||
def generic(func, argpos=None):
|
||||
"""Create a simple generic function"""
|
||||
|
||||
@ -25,7 +26,7 @@ def generic(func, argpos=None):
|
||||
|
||||
def _by_class(*args, **kw):
|
||||
cls = args[argpos].__class__
|
||||
for t in type(cls.__name__, (cls,object), {}).__mro__:
|
||||
for t in type(cls.__name__, (cls, object), {}).__mro__:
|
||||
f = _gbt(t, _sentinel)
|
||||
if f is not _sentinel:
|
||||
return f(*args, **kw)
|
||||
@ -42,9 +43,10 @@ def generic(func, argpos=None):
|
||||
raise TypeError(
|
||||
"%r is not a type or class" % (t,)
|
||||
)
|
||||
|
||||
def decorate(f):
|
||||
for t in types:
|
||||
if _by_type.setdefault(t,f) is not f:
|
||||
if _by_type.setdefault(t, f) is not f:
|
||||
raise TypeError(
|
||||
"%r already has method for type %r" % (func, t)
|
||||
)
|
||||
@ -58,14 +60,13 @@ def generic(func, argpos=None):
|
||||
"""Decorator to add a method to be called for the given object(s)"""
|
||||
def decorate(f):
|
||||
for o in obs:
|
||||
if _by_object.setdefault(id(o), (o,f))[1] is not f:
|
||||
if _by_object.setdefault(id(o), (o, f))[1] is not f:
|
||||
raise TypeError(
|
||||
"%r already has method for object %r" % (func, o)
|
||||
)
|
||||
return f
|
||||
return decorate
|
||||
|
||||
|
||||
def dispatch(*args, **kw):
|
||||
f = _gbo(id(args[argpos]), _sentinel)
|
||||
if f is _sentinel:
|
||||
@ -78,59 +79,29 @@ def generic(func, argpos=None):
|
||||
else:
|
||||
return f[1](*args, **kw)
|
||||
|
||||
dispatch.__name__ = func.__name__
|
||||
dispatch.__dict__ = func.__dict__.copy()
|
||||
dispatch.__doc__ = func.__doc__
|
||||
dispatch.__module__ = func.__module__
|
||||
dispatch.__name__ = func.__name__
|
||||
dispatch.__dict__ = func.__dict__.copy()
|
||||
dispatch.__doc__ = func.__doc__
|
||||
dispatch.__module__ = func.__module__
|
||||
|
||||
dispatch.when_type = when_type
|
||||
dispatch.when_object = when_object
|
||||
dispatch.default = func
|
||||
dispatch.has_object = lambda o: id(o) in _by_object
|
||||
dispatch.has_type = lambda t: t in _by_type
|
||||
dispatch.has_type = lambda t: t in _by_type
|
||||
dispatch.argpos = argpos
|
||||
return dispatch
|
||||
|
||||
|
||||
|
||||
def test_suite():
|
||||
import doctest
|
||||
return doctest.DocFileSuite(
|
||||
'README.txt',
|
||||
optionflags=doctest.ELLIPSIS|doctest.REPORT_ONLY_FIRST_FAILURE,
|
||||
optionflags=doctest.ELLIPSIS | doctest.REPORT_ONLY_FIRST_FAILURE,
|
||||
)
|
||||
|
||||
if __name__=='__main__':
|
||||
|
||||
if __name__ == '__main__':
|
||||
import unittest
|
||||
r = unittest.TextTestRunner()
|
||||
r.run(test_suite())
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -158,7 +158,7 @@ class TypeDirective(PyClasslike):
|
||||
class AttributeDirective(PyClassmember):
|
||||
doc_field_types = [
|
||||
Field('datatype', label=l_('Type'), has_arg=False,
|
||||
names=('type', 'datatype'))
|
||||
names=('type', 'datatype'))
|
||||
]
|
||||
|
||||
|
||||
@ -429,8 +429,11 @@ def document_function(funcdef, docstrings=None, protocols=['restjson']):
|
||||
if protocols:
|
||||
params = []
|
||||
for arg in funcdef.arguments:
|
||||
params.append((arg.name, arg.datatype,
|
||||
make_sample_object(arg.datatype)))
|
||||
params.append((
|
||||
arg.name,
|
||||
arg.datatype,
|
||||
make_sample_object(arg.datatype)
|
||||
))
|
||||
codesamples.extend([
|
||||
u':%s:' % l_(u'Parameters samples'),
|
||||
u' .. cssclass:: toggle',
|
||||
@ -494,8 +497,10 @@ class FunctionDocumenter(autodoc.MethodDocumenter):
|
||||
|
||||
def format_args(self):
|
||||
args = [arg.name for arg in self.wsme_fd.arguments]
|
||||
defaults = [arg.default
|
||||
for arg in self.wsme_fd.arguments if not arg.mandatory]
|
||||
defaults = [
|
||||
arg.default
|
||||
for arg in self.wsme_fd.arguments if not arg.mandatory
|
||||
]
|
||||
return inspect.formatargspec(args, defaults=defaults)
|
||||
|
||||
def get_doc(self, encoding=None):
|
||||
|
@ -92,4 +92,5 @@ class CRUDControllerBase(object):
|
||||
return None
|
||||
|
||||
CRUDController = CRUDControllerMeta(
|
||||
'CRUDController', (CRUDControllerBase,), {})
|
||||
'CRUDController', (CRUDControllerBase,), {}
|
||||
)
|
||||
|
@ -72,8 +72,7 @@ def make_wsattr(registry, saproperty):
|
||||
saproperty.columns[0].type)
|
||||
elif isinstance(saproperty, RelationProperty):
|
||||
other_saclass = saproperty.mapper.class_
|
||||
datatype = SQLAlchemyRegistry.get(registry).getdatatype(
|
||||
other_saclass)
|
||||
datatype = SQLAlchemyRegistry.get(registry).getdatatype(other_saclass)
|
||||
if saproperty.uselist:
|
||||
datatype = [datatype]
|
||||
else:
|
||||
|
@ -98,8 +98,8 @@ class TestExtDirectProtocol(wsme.tests.protocol.ProtocolTestCase):
|
||||
'nsfolder': 'app'
|
||||
}
|
||||
|
||||
def call(self, fname, _rt=None, _no_result_decode=False,
|
||||
_accept=None, **kw):
|
||||
def call(self, fname, _rt=None, _no_result_decode=False, _accept=None,
|
||||
**kw):
|
||||
path = fname.split('/')
|
||||
try:
|
||||
func, funcdef, args = self.root._lookup_function(path)
|
||||
@ -132,8 +132,8 @@ class TestExtDirectProtocol(wsme.tests.protocol.ProtocolTestCase):
|
||||
headers = {'Content-Type': 'application/json'}
|
||||
if _accept:
|
||||
headers['Accept'] = _accept
|
||||
res = self.app.post('/extdirect/router/%s' % ns, data,
|
||||
headers=headers, expect_errors=True)
|
||||
res = self.app.post('/extdirect/router/%s' % ns, data, headers=headers,
|
||||
expect_errors=True)
|
||||
|
||||
print(res.body)
|
||||
|
||||
@ -170,8 +170,7 @@ class TestExtDirectProtocol(wsme.tests.protocol.ProtocolTestCase):
|
||||
'data': [2, 5],
|
||||
})
|
||||
headers = {'Content-Type': 'application/json'}
|
||||
res = self.app.post('/extdirect/router', data,
|
||||
headers=headers)
|
||||
res = self.app.post('/extdirect/router', data, headers=headers)
|
||||
|
||||
print(res.body)
|
||||
|
||||
@ -220,8 +219,11 @@ class TestExtDirectProtocol(wsme.tests.protocol.ProtocolTestCase):
|
||||
}
|
||||
|
||||
body = urlencode(params)
|
||||
r = self.app.post('/extdirect/router', body,
|
||||
headers={'Content-Type': 'application/x-www-form-urlencoded'})
|
||||
r = self.app.post(
|
||||
'/extdirect/router',
|
||||
body,
|
||||
headers={'Content-Type': 'application/x-www-form-urlencoded'}
|
||||
)
|
||||
print (r)
|
||||
|
||||
assert json.loads(r.text) == {
|
||||
|
@ -114,9 +114,7 @@ soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
|
||||
</soap:Body>
|
||||
|
||||
</soap:Envelope>
|
||||
""" % dict(method=method,
|
||||
params=params,
|
||||
typenamespace=typenamespace)
|
||||
""" % dict(method=method, params=params, typenamespace=typenamespace)
|
||||
return message
|
||||
|
||||
|
||||
@ -124,11 +122,15 @@ python_types = {
|
||||
int: ('xs:int', str),
|
||||
float: ('xs:float', str),
|
||||
bool: ('xs:boolean', str),
|
||||
wsme.types.bytes: ('xs:string',
|
||||
lambda x: x.decode('ascii') if isinstance(x, wsme.types.bytes) else x),
|
||||
wsme.types.bytes: (
|
||||
'xs:string',
|
||||
lambda x: x.decode('ascii') if isinstance(x, wsme.types.bytes) else x
|
||||
),
|
||||
wsme.types.text: ('xs:string', wsme.types.text),
|
||||
wsme.types.binary: ('xs:base64Binary',
|
||||
lambda x: base64.encodestring(x).decode('ascii')),
|
||||
wsme.types.binary: (
|
||||
'xs:base64Binary',
|
||||
lambda x: base64.encodestring(x).decode('ascii')
|
||||
),
|
||||
decimal.Decimal: ('xs:decimal', str),
|
||||
datetime.date: ('xs:date', datetime.date.isoformat),
|
||||
datetime.time: ('xs:time', datetime.time.isoformat),
|
||||
@ -278,9 +280,7 @@ def fromsuds(dt, value):
|
||||
|
||||
class TestSOAP(wsme.tests.protocol.ProtocolTestCase):
|
||||
protocol = 'soap'
|
||||
protocol_options = dict(
|
||||
tns=tns,
|
||||
typenamespace=typenamespace)
|
||||
protocol_options = dict(tns=tns, typenamespace=typenamespace)
|
||||
ws_path = '/'
|
||||
_sudsclient = None
|
||||
|
||||
@ -290,19 +290,22 @@ class TestSOAP(wsme.tests.protocol.ProtocolTestCase):
|
||||
def test_simple_call(self):
|
||||
message = build_soap_message('touch')
|
||||
print(message)
|
||||
res = self.app.post(self.ws_path, message,
|
||||
res = self.app.post(
|
||||
self.ws_path,
|
||||
message,
|
||||
headers={"Content-Type": "application/soap+xml; charset=utf-8"},
|
||||
expect_errors=True)
|
||||
expect_errors=True
|
||||
)
|
||||
print(res.body)
|
||||
assert res.status.startswith('200')
|
||||
|
||||
def call(self, fpath, _rt=None, _accept=None,
|
||||
_no_result_decode=False, **kw):
|
||||
def call(self, fpath, _rt=None, _accept=None, _no_result_decode=False,
|
||||
**kw):
|
||||
|
||||
if _no_result_decode or _accept or self._testMethodName in (
|
||||
'test_missing_argument', 'test_invalid_path',
|
||||
'test_settext_empty', 'test_settext_none'
|
||||
):
|
||||
'test_missing_argument', 'test_invalid_path', 'test_settext_empty',
|
||||
'test_settext_none'
|
||||
):
|
||||
return self.raw_call(fpath, _rt, _accept, _no_result_decode, **kw)
|
||||
|
||||
path = fpath.strip('/').split('/')
|
||||
@ -318,13 +321,13 @@ class TestSOAP(wsme.tests.protocol.ProtocolTestCase):
|
||||
except suds.WebFault:
|
||||
exc = sys.exc_info()[1]
|
||||
raise wsme.tests.protocol.CallException(
|
||||
exc.fault.faultcode,
|
||||
exc.fault.faultstring,
|
||||
getattr(exc.fault, 'detail', None) or None
|
||||
exc.fault.faultcode,
|
||||
exc.fault.faultstring,
|
||||
getattr(exc.fault, 'detail', None) or None
|
||||
)
|
||||
|
||||
def raw_call(self, fpath, _rt=None, _accept=None,
|
||||
_no_result_decode=False, **kw):
|
||||
def raw_call(self, fpath, _rt=None, _accept=None, _no_result_decode=False,
|
||||
**kw):
|
||||
path = fpath.strip('/').split('/')
|
||||
methodname = ''.join([path[0]] + [i.capitalize() for i in path[1:]])
|
||||
# get the actual definition so we can build the adequate request
|
||||
@ -366,17 +369,17 @@ class TestSOAP(wsme.tests.protocol.ProtocolTestCase):
|
||||
elif res.status_int == 400:
|
||||
fault = body.find(fault_qn)
|
||||
raise wsme.tests.protocol.CallException(
|
||||
fault.find(faultcode_qn).text,
|
||||
fault.find(faultstring_qn).text,
|
||||
"")
|
||||
fault.find(faultcode_qn).text,
|
||||
fault.find(faultstring_qn).text,
|
||||
"")
|
||||
|
||||
elif res.status_int == 500:
|
||||
fault = body.find(fault_qn)
|
||||
raise wsme.tests.protocol.CallException(
|
||||
fault.find(faultcode_qn).text,
|
||||
fault.find(faultstring_qn).text,
|
||||
fault.find(faultdetail_qn) is not None and
|
||||
fault.find(faultdetail_qn).text or None)
|
||||
fault.find(faultcode_qn).text,
|
||||
fault.find(faultstring_qn).text,
|
||||
fault.find(faultdetail_qn) is not None and
|
||||
fault.find(faultdetail_qn).text or None)
|
||||
|
||||
@property
|
||||
def sudsclient(self):
|
||||
|
@ -23,9 +23,8 @@ from wsmeext.sqlalchemy.controllers import CRUDController
|
||||
from six import u
|
||||
|
||||
engine = create_engine('sqlite:///')
|
||||
DBSession = scoped_session(sessionmaker(autocommit=False,
|
||||
autoflush=False,
|
||||
bind=engine))
|
||||
DBSession = scoped_session(sessionmaker(autocommit=False, autoflush=False,
|
||||
bind=engine))
|
||||
DBBase = declarative_base()
|
||||
|
||||
registry = wsme.types.Registry()
|
||||
@ -55,8 +54,8 @@ class DBAddress(DBBase):
|
||||
|
||||
|
||||
globals().update(
|
||||
generate_types(DBPerson, DBAddress,
|
||||
makename=lambda s: s[2:], registry=registry))
|
||||
generate_types(DBPerson, DBAddress, makename=lambda s: s[2:],
|
||||
registry=registry))
|
||||
|
||||
|
||||
class PersonController(CRUDController):
|
||||
@ -97,9 +96,7 @@ class TestCRUDController():
|
||||
birthdate=u('1809-01-15')
|
||||
))
|
||||
r = self.app.post('/person/create', json.dumps(data),
|
||||
headers={
|
||||
'Content-Type': 'application/json'
|
||||
})
|
||||
headers={'Content-Type': 'application/json'})
|
||||
r = json.loads(r.text)
|
||||
print(r)
|
||||
assert r['name'] == u('Pierre-Joseph')
|
||||
@ -111,9 +108,7 @@ class TestCRUDController():
|
||||
birthdate=u('1809-01-15')
|
||||
))
|
||||
r = self.app.put('/person', json.dumps(data),
|
||||
headers={
|
||||
'Content-Type': 'application/json'
|
||||
})
|
||||
headers={'Content-Type': 'application/json'})
|
||||
r = json.loads(r.text)
|
||||
print(r)
|
||||
assert r['name'] == u('Pierre-Joseph')
|
||||
@ -127,9 +122,7 @@ class TestCRUDController():
|
||||
DBSession.flush()
|
||||
pid = p.id
|
||||
r = self.app.post('/person/read', '{"ref": {"id": %s}}' % pid,
|
||||
headers={
|
||||
'Content-Type': 'application/json'
|
||||
})
|
||||
headers={'Content-Type': 'application/json'})
|
||||
r = json.loads(r.text)
|
||||
print(r)
|
||||
assert r['name'] == u('Pierre-Joseph')
|
||||
@ -143,9 +136,7 @@ class TestCRUDController():
|
||||
DBSession.flush()
|
||||
pid = p.id
|
||||
r = self.app.get('/person?ref.id=%s' % pid,
|
||||
headers={
|
||||
'Content-Type': 'application/json'
|
||||
})
|
||||
headers={'Content-Type': 'application/json'})
|
||||
r = json.loads(r.text)
|
||||
print(r)
|
||||
assert r['name'] == u('Pierre-Joseph')
|
||||
@ -163,9 +154,7 @@ class TestCRUDController():
|
||||
"name": u('Pierre-Joseph Proudon')
|
||||
}
|
||||
r = self.app.post('/person/update', json.dumps(dict(data=data)),
|
||||
headers={
|
||||
'Content-Type': 'application/json'
|
||||
})
|
||||
headers={'Content-Type': 'application/json'})
|
||||
r = json.loads(r.text)
|
||||
print(r)
|
||||
assert r['name'] == u('Pierre-Joseph Proudon')
|
||||
@ -183,9 +172,7 @@ class TestCRUDController():
|
||||
"name": u('Pierre-Joseph Proudon')
|
||||
}
|
||||
r = self.app.post('/person', json.dumps(dict(data=data)),
|
||||
headers={
|
||||
'Content-Type': 'application/json'
|
||||
})
|
||||
headers={'Content-Type': 'application/json'})
|
||||
r = json.loads(r.text)
|
||||
print(r)
|
||||
assert r['name'] == u('Pierre-Joseph Proudon')
|
||||
@ -214,9 +201,7 @@ class TestCRUDController():
|
||||
DBSession.flush()
|
||||
pid = p.id
|
||||
r = self.app.delete('/person?ref.id=%s' % pid,
|
||||
headers={
|
||||
'Content-Type': 'application/json'
|
||||
})
|
||||
headers={'Content-Type': 'application/json'})
|
||||
print(r)
|
||||
assert DBSession.query(DBPerson).get(pid) is None
|
||||
|
||||
|
@ -9,8 +9,14 @@ class TestUtils():
|
||||
|
||||
def test_validator_with_invalid_int_code(self):
|
||||
invalid_int_code = 648
|
||||
assert not is_valid_code(invalid_int_code), "Invalid status code not detected"
|
||||
assert (
|
||||
not is_valid_code(invalid_int_code),
|
||||
"Invalid status code not detected"
|
||||
)
|
||||
|
||||
def test_validator_with_invalid_str_code(self):
|
||||
invalid_str_code = '404'
|
||||
assert not is_valid_code(invalid_str_code), "Invalid status code not detected"
|
||||
assert (
|
||||
not is_valid_code(invalid_str_code),
|
||||
"Invalid status code not detected"
|
||||
)
|
||||
|
Loading…
Reference in New Issue
Block a user