From 182d4da8e97224e8956a23a27e2e0420310afa77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Eustace?= Date: Wed, 19 May 2021 11:10:49 +0200 Subject: [PATCH] Fix indent for nested table elements when updating Fixes #106 --- tests/test_toml_document.py | 21 +++++++++++++++++++++ tomlkit/items.py | 4 +++- tomlkit/parser.py | 6 ++++-- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/tests/test_toml_document.py b/tests/test_toml_document.py index 5fed0848..1f30e79e 100644 --- a/tests/test_toml_document.py +++ b/tests/test_toml_document.py @@ -618,3 +618,24 @@ def test_string_output_order_is_preserved_for_out_of_order_tables(): """ assert expected == doc.as_string() + + +def test_updating_nested_value_keeps_correct_indent(): + content = """ +[Key1] + [key1.Key2] + Value1 = 10 + Value2 = 30 +""" + + doc = parse(content) + doc["key1"]["Key2"]["Value1"] = 20 + + expected = """ +[Key1] + [key1.Key2] + Value1 = 20 + Value2 = 30 +""" + + assert doc.as_string() == expected diff --git a/tomlkit/items.py b/tomlkit/items.py index 184ffe7d..26b8f9fe 100644 --- a/tomlkit/items.py +++ b/tomlkit/items.py @@ -1018,6 +1018,8 @@ def __getitem__(self, key): # type: (Union[Key, str]) -> Item return self._value[key] def __setitem__(self, key, value): # type: (Union[Key, str], Any) -> None + fix_indent = key not in self + if not isinstance(value, Item): value = item(value) @@ -1027,7 +1029,7 @@ def __setitem__(self, key, value): # type: (Union[Key, str], Any) -> None super(Table, self).__setitem__(key, value) m = re.match("(?s)^[^ ]*([ ]+).*$", self._trivia.indent) - if not m: + if not m or not fix_indent: return indent = m.group(1) diff --git a/tomlkit/parser.py b/tomlkit/parser.py index 49929954..7d3c8348 100644 --- a/tomlkit/parser.py +++ b/tomlkit/parser.py @@ -1138,9 +1138,11 @@ def _parse_table( ) if is_aot and i == len(name_parts[1:]) - 1: - table.append(_name, AoT([child], name=table.name, parsed=True)) + table.raw_append( + _name, AoT([child], name=table.name, parsed=True) + ) else: - table.append(_name, child) + table.raw_append(_name, child) table = child values = table.value