def deserialise_result(self, task_result: TaskResult):
        """
        Dserialises a TaskResult back into result and state
        
        :param task_result: the TaskResult
        :return: tuple of result and state
        """
        result = _convert_from_proto(task_result.result,
                                     self._known_proto_types,
                                     self._protobuf_converters)
        state = _convert_from_proto(task_result.state, self._known_proto_types,
                                    self._protobuf_converters)

        return result, state
    def test_convert_dict_to_protofbuf(self):
        data = {
            'int': 123,
            'float': 1.23,
            'str': '123',
            'list': [1, 2, 3],
            'dict': {
                'a': 1,
                'b': 2
            },
            'dict_in_list': [1, {
                'a': 1
            }],
            'proto': Address(namespace="tests", type="test", id="id")
        }

        proto = _convert_to_proto(data, self.default_converters)
        reconsituted_data = _convert_from_proto(proto, [Address],
                                                self.default_converters)

        self.assertEqual(reconsituted_data['int'], 123)
        self.assertEqual(reconsituted_data['float'], 1.23)
        self.assertEqual(reconsituted_data['str'], '123')
        self.assertEqual(reconsituted_data['list'], [1, 2, 3])
        self.assertEqual(reconsituted_data['dict']['a'], 1)
        self.assertEqual(reconsituted_data['dict']['b'], 2)
        self.assertEqual(reconsituted_data['dict_in_list'][0], 1)
        self.assertEqual(reconsituted_data['dict_in_list'][1]['a'], 1)
        self.assertTrue(isinstance(reconsituted_data['proto'], Address))
        self.assertEqual(reconsituted_data['proto'].namespace, 'tests')
        self.assertEqual(reconsituted_data['proto'].type, 'test')
        self.assertEqual(reconsituted_data['proto'].id, 'id')
 def test_to_and_from_protobuf(self):
     obj = self.MyType('my_val')
     converters = [self.MyConverter()]
     proto_message = _convert_to_proto(obj, converters)
     python_val = _convert_from_proto(proto_message, [], converters)
     self.assertIsInstance(proto_message, TestMyType)
     self.assertIsInstance(python_val, self.MyType)
     self.assertEqual(python_val.string_field, 'my_val')
    def deserialise_args_and_kwargs(self, request: Any):
        """
        Deserialises Any into Python args and kwargs
        
        :param request: the protobuf message
        :return: tuple of args and kwargs
        """
        request = _convert_from_proto(request, self._known_proto_types,
                                      self._protobuf_converters)

        if isinstance(request, ArgsAndKwargs):
            args = _convert_from_proto(request.args, self._known_proto_types,
                                       self._protobuf_converters)
            kwargs = _convert_from_proto(request.kwargs,
                                         self._known_proto_types,
                                         self._protobuf_converters)
        else:
            args = request
            kwargs = {}

        return args, kwargs
    def from_proto(self, proto: Message, default=None):
        """
        Converts from protobuf to Python
        
        :param proto: the protobuf message
        :param option default: an optional default value to return
        :return: the Python type or default value if deserialisation return None
        """

        result = _convert_from_proto(proto, self._known_proto_types,
                                     self._protobuf_converters)
        return result if result is not None else default
    def deserialise_request(self, task_request: TaskRequest):
        """
        Dserialises a TaskRequest back into args, kwargs and state
        
        :param task_request: the TaskRequest
        :return: tuple of task args, kwargs and state
        """
        args, kwargs = self.deserialise_args_and_kwargs(task_request.request)

        state = _convert_from_proto(task_request.state,
                                    self._known_proto_types,
                                    self._protobuf_converters)
        return args, kwargs, state
    def test_convert_list_to_protofbuf(self):
        data = [Address(namespace="tests", type="test", id="id"), 1, '123']

        proto = _convert_to_proto(data, _generate_default_converters())
        reconsituted_data = _convert_from_proto(proto, [Address],
                                                self.default_converters)

        self.assertTrue(isinstance(reconsituted_data[0], Address))
        self.assertEqual(reconsituted_data[0].namespace, 'tests')
        self.assertEqual(reconsituted_data[0].type, 'test')
        self.assertEqual(reconsituted_data[0].id, 'id')
        self.assertEqual(reconsituted_data[1], 1)
        self.assertEqual(reconsituted_data[2], '123')
 def to_args_and_kwargs(self, request: Any) -> ArgsAndKwargs:
     """
     Unpacks Any into Protobuf ArgsAndKwargs
     
     :param request: the protobuf message
     :return: ArgsAndKwargs
     """
     unpacked = _convert_from_proto(request, self._known_proto_types,
                                    self._protobuf_converters)
     if isinstance(unpacked, ArgsAndKwargs):
         return unpacked
     else:
         args = TupleOfAny()
         args.items.append(request)
         return ArgsAndKwargs(args=args, kwargs=MapOfStringToAny())