From 5defa9d49d52c3fcd37d08b130e6ddc636a2e120 Mon Sep 17 00:00:00 2001 From: Johannes Kirschbauer Date: Tue, 3 Sep 2024 18:03:13 +0200 Subject: [PATCH] serde/fix: round trip string sanitizing --- pkgs/clan-cli/clan_cli/api/serde.py | 3 +-- pkgs/clan-cli/tests/test_deserializers.py | 12 ++++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/pkgs/clan-cli/clan_cli/api/serde.py b/pkgs/clan-cli/clan_cli/api/serde.py index 0e5876d59..a43b415e8 100644 --- a/pkgs/clan-cli/clan_cli/api/serde.py +++ b/pkgs/clan-cli/clan_cli/api/serde.py @@ -155,13 +155,12 @@ def construct_value( return Path(field_value) - # Trivial values if t is str: if not isinstance(field_value, str): msg = f"Expected string, got {field_value}" raise ClanError(msg, location=f"{loc}") - return field_value + return json.loads(f'"{field_value}"') if t is int and not isinstance(field_value, str): return int(field_value) # type: ignore diff --git a/pkgs/clan-cli/tests/test_deserializers.py b/pkgs/clan-cli/tests/test_deserializers.py index 70ed4a93f..49f964635 100644 --- a/pkgs/clan-cli/tests/test_deserializers.py +++ b/pkgs/clan-cli/tests/test_deserializers.py @@ -265,6 +265,18 @@ def test_none_or_string() -> None: assert checked3 is None +def test_roundtrip_escape() -> None: + assert from_dict(str, "\\n") == "\n" + assert dataclass_to_dict("\n") == "\\n" + + # Test that the functions are inverses of each other + # f(g(x)) == x + # and + # g(f(x)) == x + assert from_dict(str, dataclass_to_dict("\n")) == "\n" + assert dataclass_to_dict(from_dict(str, "\\n")) == "\\n" + + def test_path_field() -> None: @dataclass class Person: