Open bw7715 opened 2 years ago
Please can you test pip install betterproto --pre
?
With betterproto version 2.0.0b4 to_dict works, but unlike version 1.2.4 the field as bool is always set to False for empty proto messages:
msg=Test(on=False, count=0, name='', get_info=CommandGetInfo(), get_name=CommandGetName())
msg_one_of=('', None)
msg to dict={}
to bool test:
msg.on=False
msg.count=False
msg.name=False
msg.get_info=False
msg.get_name=False
to bytes: b''
msg=Test(on=False, count=0, name='', get_info=CommandGetInfo(), get_name=CommandGetName())
msg_one_of=('get_name', CommandGetName())
msg to dict={'getName': {}}
to bool test:
msg.on=False
msg.count=False
msg.name=False
msg.get_info=False
msg.get_name=False
to bytes: b'*\x00'
msg=Test(on=True, count=0, name='', get_info=CommandGetInfo(), get_name=CommandGetName())
msg_one_of=('on', True)
msg to dict={'on': True}
to bool test:
msg.on=True
msg.count=False
msg.name=False
msg.get_info=False
msg.get_name=False
to bytes: b'\x08\x01'
msg=Test(on=False, count=57, name='', get_info=CommandGetInfo(), get_name=CommandGetName())
msg_one_of=('count', 57)
msg to dict={'count': 57}
to bool test:
msg.on=False
msg.count=True
msg.name=False
msg.get_info=False
msg.get_name=False
to bytes: b'\x109'
msg=Test(on=False, count=0, name='Name', get_info=CommandGetInfo(), get_name=CommandGetName())
msg_one_of=('name', 'Name')
msg to dict={'name': 'Name'}
to bool test:
msg.on=False
msg.count=False
msg.name=True
msg.get_info=False
msg.get_name=False
to bytes: b'\x1a\x04Name'
msg=Test(on=False, count=0, name='', get_info=CommandGetInfo(), get_name=CommandGetName())
msg_one_of=('get_info', CommandGetInfo())
msg to dict={'getInfo': {}}
to bool test:
msg.on=False
msg.count=False
msg.name=False
msg.get_info=False
msg.get_name=False
to bytes: b'"\x00'
Process finished with exit code 0
I think this is fixed in 2.0.0b6
, but appears to be broken with pydantic_dataclasses
enabled. AFAICT it's doing some extra validation twice - once when creating the Message, and once when serializing the message. The first one works, but the second fails and throws an error.
I am affected as well. For now, I disabled the Pydantic data classes. I would like to enable them as soon as possible, they are really helpful. I haven't found a workaround solution yet.
My case:
message MetadataObjectProperties {
message Empty {}
message VisualizationObject {
string content = 1;
}
....
oneof properties {
Empty empty = 1;
VisualizationObject visualization_object = 2;
....
I also tried to inject optional string empty = 1;
into Empty, but it didn't help.
When try to use empty Message (Message without fields) in one_of group, I cannot convert it to dict or bool.
Code to reproduce:
Output:
We can see that bool values are always set to True for empty proto messages, serializing them to dictionary gives empty dictionary, serializing to bytes also gives empty value.
I tested on python versions 3.9 and 3.10. Betterproto: 1.2.5