Skip to content

Commit b1acb5e

Browse files
authored
Merge pull request #620 from yukinarit/feature/fix-render-tuple
Fix render_tuple with coerce
2 parents 1562940 + b55ec71 commit b1acb5e

File tree

4 files changed

+17
-4
lines changed

4 files changed

+17
-4
lines changed

serde/de.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -956,7 +956,9 @@ def primitive(self, arg: DeField[Any], suppress_coerce: bool = False) -> str:
956956
if self.suppress_coerce and suppress_coerce:
957957
return dat
958958
else:
959-
return f'coerce_object("{self.class_name}", "{arg.name}", {typ}, {dat})'
959+
assert arg.name
960+
escaped_arg_name = arg.name.replace('"', '\\"')
961+
return f'coerce_object("{self.class_name}", "{escaped_arg_name}", {typ}, {dat})'
960962

961963
def c_tor(self, arg: DeField[Any]) -> str:
962964
return f"{typename(arg.type)}({arg.data})"

serde/se.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -923,7 +923,9 @@ def primitive(self, arg: SeField[Any]) -> str:
923923
if self.suppress_coerce:
924924
return var
925925
else:
926-
return f'coerce_object("{self.class_name}", "{arg.name}", {typ}, {var})'
926+
assert arg.name
927+
escaped_arg_name = arg.name.replace('"', '\\"')
928+
return f'coerce_object("{self.class_name}", "{escaped_arg_name}", {typ}, {var})'
927929

928930
def string(self, arg: SeField[Any]) -> str:
929931
return f"str({arg.varname})"

tests/test_de.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ class Foo:
6060
pass
6161

6262
rendered = Renderer("foo").render(DeField(tuple[str, int, list[int], Foo], "d", datavar="data"))
63-
rendered_str = 'coerce_object("None", "data["d"][0]", str, data["d"][0])'
64-
rendered_int = 'coerce_object("None", "data["d"][1]", int, data["d"][1])'
63+
rendered_str = 'coerce_object("None", "data[\\"d\\"][0]", str, data["d"][0])'
64+
rendered_int = 'coerce_object("None", "data[\\"d\\"][1]", int, data["d"][1])'
6565
rendered_lst = '[coerce_object("None", "v", int, v) for v in data["d"][2]]'
6666
rendered_foo = f"Foo.__serde__.funcs['foo'](data=data[\"d\"][3], {kwargs})"
6767
assert rendered == f"({rendered_str}, {rendered_int}, {rendered_lst}, {rendered_foo},)"

tests/test_type_check.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,3 +184,12 @@ class Nested:
184184
assert p3.s.s == "100"
185185
assert p3.f.f == 1000.0
186186
assert p3.b.b
187+
188+
@serde.serde(type_check=serde.coerce)
189+
class InnerTuple:
190+
# Note: `foo` needs to be longer than 1 char, to properly test
191+
# quote escaping
192+
foo: tuple[float, float]
193+
194+
f = InnerTuple(foo=(1, 2))
195+
assert f.foo == (1.0, 2.0)

0 commit comments

Comments
 (0)