Add to/from_pydict methods (#203)
* add to/from_pydict methods * Remove unnecessary method call * Fix formatting Co-authored-by: James Hilton-Balfe <gobot1234yt@gmail.com>
This commit is contained in:
@@ -3,7 +3,10 @@ from copy import (
|
||||
deepcopy,
|
||||
)
|
||||
from dataclasses import dataclass
|
||||
from datetime import datetime
|
||||
from datetime import (
|
||||
datetime,
|
||||
timedelta,
|
||||
)
|
||||
from inspect import (
|
||||
Parameter,
|
||||
signature,
|
||||
@@ -79,6 +82,7 @@ def test_class_init():
|
||||
foo = Foo(name="foo", child=Bar(name="bar"))
|
||||
|
||||
assert foo.to_dict() == {"name": "foo", "child": {"name": "bar"}}
|
||||
assert foo.to_pydict() == {"name": "foo", "child": {"name": "bar"}}
|
||||
|
||||
|
||||
def test_enum_as_int_json():
|
||||
@@ -98,6 +102,11 @@ def test_enum_as_int_json():
|
||||
foo.bar = 1
|
||||
assert foo.to_dict() == {"bar": "ONE"}
|
||||
|
||||
# Similar expectations for pydict
|
||||
foo = Foo().from_pydict({"bar": 1})
|
||||
assert foo.bar == TestEnum.ONE
|
||||
assert foo.to_pydict() == {"bar": TestEnum.ONE}
|
||||
|
||||
|
||||
def test_unknown_fields():
|
||||
@dataclass
|
||||
@@ -188,6 +197,12 @@ def test_json_casing():
|
||||
"snakeCase": 3,
|
||||
"kabobCase": 4,
|
||||
}
|
||||
assert test.to_pydict() == {
|
||||
"pascalCase": 1,
|
||||
"camelCase": 2,
|
||||
"snakeCase": 3,
|
||||
"kabobCase": 4,
|
||||
}
|
||||
|
||||
assert test.to_dict(casing=betterproto.Casing.SNAKE) == {
|
||||
"pascal_case": 1,
|
||||
@@ -195,6 +210,12 @@ def test_json_casing():
|
||||
"snake_case": 3,
|
||||
"kabob_case": 4,
|
||||
}
|
||||
assert test.to_pydict(casing=betterproto.Casing.SNAKE) == {
|
||||
"pascal_case": 1,
|
||||
"camel_case": 2,
|
||||
"snake_case": 3,
|
||||
"kabob_case": 4,
|
||||
}
|
||||
|
||||
|
||||
def test_optional_flag():
|
||||
@@ -230,6 +251,15 @@ def test_to_dict_default_values():
|
||||
"someBool": False,
|
||||
}
|
||||
|
||||
test = TestMessage().from_pydict({})
|
||||
|
||||
assert test.to_pydict(include_default_values=True) == {
|
||||
"someInt": 0,
|
||||
"someDouble": 0.0,
|
||||
"someStr": "",
|
||||
"someBool": False,
|
||||
}
|
||||
|
||||
# All default values
|
||||
test = TestMessage().from_dict(
|
||||
{"someInt": 0, "someDouble": 0.0, "someStr": "", "someBool": False}
|
||||
@@ -242,6 +272,17 @@ def test_to_dict_default_values():
|
||||
"someBool": False,
|
||||
}
|
||||
|
||||
test = TestMessage().from_pydict(
|
||||
{"someInt": 0, "someDouble": 0.0, "someStr": "", "someBool": False}
|
||||
)
|
||||
|
||||
assert test.to_pydict(include_default_values=True) == {
|
||||
"someInt": 0,
|
||||
"someDouble": 0.0,
|
||||
"someStr": "",
|
||||
"someBool": False,
|
||||
}
|
||||
|
||||
# Some default and some other values
|
||||
@dataclass
|
||||
class TestMessage2(betterproto.Message):
|
||||
@@ -278,6 +319,30 @@ def test_to_dict_default_values():
|
||||
"someDefaultBool": False,
|
||||
}
|
||||
|
||||
test = TestMessage2().from_pydict(
|
||||
{
|
||||
"someInt": 2,
|
||||
"someDouble": 1.2,
|
||||
"someStr": "hello",
|
||||
"someBool": True,
|
||||
"someDefaultInt": 0,
|
||||
"someDefaultDouble": 0.0,
|
||||
"someDefaultStr": "",
|
||||
"someDefaultBool": False,
|
||||
}
|
||||
)
|
||||
|
||||
assert test.to_pydict(include_default_values=True) == {
|
||||
"someInt": 2,
|
||||
"someDouble": 1.2,
|
||||
"someStr": "hello",
|
||||
"someBool": True,
|
||||
"someDefaultInt": 0,
|
||||
"someDefaultDouble": 0.0,
|
||||
"someDefaultStr": "",
|
||||
"someDefaultBool": False,
|
||||
}
|
||||
|
||||
# Nested messages
|
||||
@dataclass
|
||||
class TestChildMessage(betterproto.Message):
|
||||
@@ -297,6 +362,36 @@ def test_to_dict_default_values():
|
||||
"someMessage": {"someOtherInt": 0},
|
||||
}
|
||||
|
||||
test = TestParentMessage().from_pydict({"someInt": 0, "someDouble": 1.2})
|
||||
|
||||
assert test.to_pydict(include_default_values=True) == {
|
||||
"someInt": 0,
|
||||
"someDouble": 1.2,
|
||||
"someMessage": {"someOtherInt": 0},
|
||||
}
|
||||
|
||||
|
||||
def test_to_dict_datetime_values():
|
||||
@dataclass
|
||||
class TestDatetimeMessage(betterproto.Message):
|
||||
bar: datetime = betterproto.message_field(1)
|
||||
baz: timedelta = betterproto.message_field(2)
|
||||
|
||||
test = TestDatetimeMessage().from_dict(
|
||||
{"bar": "2020-01-01T00:00:00Z", "baz": "86400.000s"}
|
||||
)
|
||||
|
||||
assert test.to_dict() == {"bar": "2020-01-01T00:00:00Z", "baz": "86400.000s"}
|
||||
|
||||
test = TestDatetimeMessage().from_pydict(
|
||||
{"bar": datetime(year=2020, month=1, day=1), "baz": timedelta(days=1)}
|
||||
)
|
||||
|
||||
assert test.to_pydict() == {
|
||||
"bar": datetime(year=2020, month=1, day=1),
|
||||
"baz": timedelta(days=1),
|
||||
}
|
||||
|
||||
|
||||
def test_oneof_default_value_set_causes_writes_wire():
|
||||
@dataclass
|
||||
|
Reference in New Issue
Block a user