spyne icon indicating copy to clipboard operation
spyne copied to clipboard

Possible forgotten method "from_string" for "Enum" classes

Open pavelpatrin opened this issue 10 years ago • 1 comments

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?

pavelpatrin avatar Jun 30 '15 07:06 pavelpatrin

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.

plq avatar Jun 30 '15 14:06 plq