spyne
spyne copied to clipboard
Possible forgotten method "from_string" for "Enum" classes
I have spyne service with JSON transport.
application = FlaskApplication(Application(
[CryptoService], tns='project.services',
in_protocol=JsonDocument(validator='soft'),
out_protocol=JsonDocument()))
Also I have a enum type as a service argument:
HashAlgorithm = Enum('md5', 'sha256', type_name='HashAlgorithm')
class CryptoService(ServiceBase):
@rpc(ByteArray, HashAlgorithm, _returns=ByteArray)
def hash(ctx, data, algorithm):
pass
When i do:
curl -s http://localhost:5000/service/ -d '{"hash": {"data": "", "algorithm": "md5"}}'
I got exception:
Traceback (most recent call last):
... skipped project traceback ...
File "/home/pavelpat/VirtualEnvs/project/venv/lib/python2.7/site-packages/spyne/server/wsgi.py", line 232, in __call__
return self.handle_rpc(req_env, start_response)
File "/home/pavelpat/VirtualEnvs/project/venv/lib/python2.7/site-packages/spyne/server/wsgi.py", line 342, in handle_rpc
self.get_in_object(p_ctx)
File "/home/pavelpat/VirtualEnvs/project/venv/lib/python2.7/site-packages/spyne/server/_base.py", line 88, in get_in_object
message=self.app.in_protocol.REQUEST)
File "/home/pavelpat/VirtualEnvs/project/venv/lib/python2.7/site-packages/spyne/protocol/dictdoc.py", line 572, in deserialize
self.validator)
File "/home/pavelpat/VirtualEnvs/project/venv/lib/python2.7/site-packages/spyne/protocol/dictdoc.py", line 698, in _doc_to_object
value = self._from_dict_value(k, member, v, validator)
File "/home/pavelpat/VirtualEnvs/project/venv/lib/python2.7/site-packages/spyne/protocol/dictdoc.py", line 644, in _from_dict_value
retval = self.from_string(class_, value)
File "/home/pavelpat/VirtualEnvs/project/venv/lib/python2.7/site-packages/spyne/protocol/_base.py", line 359, in from_string
return handler(class_, string, *args, **kwargs)
File "/home/pavelpat/VirtualEnvs/project/venv/lib/python2.7/site-packages/spyne/protocol/_base.py", line 537, in model_base_from_string
return cls.from_string(value)
AttributeError: type object 'EnumType' has no attribute 'from_string'
Instead of normal work.
Currently fix problem locally:
HashAlgorithm = Enum('md5', 'sha256', type_name='HashAlgorithm')
HashAlgorithm.from_string = classmethod(lambda c, s: getattr(c, s))
Where I am wrong?
This is a bug, thanks for reporting this..
But Enum is there only for some WSDL compatibility reasons, which, I suppose, don't concern you at all. So you could use:
HashAlgorithm = Unicode(values=['md5', 'sha256'], type_name='HashAlgorithm')
and you'd be just as good.