From aea6789af65b78f5001d43ff6eb5b2f2d761b338 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Na=C3=AFm=20Favier?= Date: Fri, 18 Dec 2020 13:04:13 +0100 Subject: [PATCH] Improve nix.py (#254) Co-authored-by: Rok Garbas --- import-scripts/import_scripts/nix.py | 26 +++++++++++++++++++++----- import-scripts/tests/test_nix.py | 19 ++++++++++++++++++- 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/import-scripts/import_scripts/nix.py b/import-scripts/import_scripts/nix.py index c00c05a..9b4b60f 100644 --- a/import-scripts/import_scripts/nix.py +++ b/import-scripts/import_scripts/nix.py @@ -4,8 +4,12 @@ def prettyPrintAttrName(attr_name): return attr_name +stringEscapes = str.maketrans({"\\": "\\\\", '"': '\\"'}) + + def prettyPrint(item, level=""): next_level = level + " " + if item is None: return "null" @@ -18,16 +22,28 @@ def prettyPrint(item, level=""): return f"{item}" elif type(item) == str: + item = item.strip() if "\n" in item: - return f"''{item}''" - return f'"{item}"' + return "".join( + [ + "''\n", + "".join( + [ + f"{next_level}{line}" + for line in item.splitlines(keepends=True) + ] + ), + f"\n{level}''", + ] + ) + return f'"{item.translate(stringEscapes)}"' elif type(item) == list: if len(item) == 0: return "[ ]" return ( "[\n" - + ("".join([f"{level} {prettyPrint(i, next_level)}\n" for i in item])) + + ("".join([f"{next_level}{prettyPrint(i, next_level)}\n" for i in item])) + f"{level}]" ) @@ -38,13 +54,13 @@ def prettyPrint(item, level=""): if type(item["text"]) == str: return item["text"] else: - return prettyPrint(item["text"], next_level) + return prettyPrint(item["text"], level) return ( "{\n" + ( "".join( [ - f"{level} {prettyPrintAttrName(n)} = {prettyPrint(v, next_level)};\n" + f"{next_level}{prettyPrintAttrName(n)} = {prettyPrint(v, next_level)};\n" for n, v in item.items() ] ) diff --git a/import-scripts/tests/test_nix.py b/import-scripts/tests/test_nix.py index 4be8486..5687d0f 100644 --- a/import-scripts/tests/test_nix.py +++ b/import-scripts/tests/test_nix.py @@ -7,9 +7,26 @@ import pytest # type: ignore (None, "null",), (True, "true",), ("text", '"text"',), + ( + "\nnew line is ignored at start and end\n", + '"new line is ignored at start and end"', + ), + ('"double quotes"', '"\\"double quotes\\""',), + ("multi\nline\ntext", "''\n multi\n line\n text\n''",), + ('"multi line\ndouble quotes"', "''\n \"multi line\n double quotes\"\n''",), (123, "123",), (123.123, "123.123",), - ([False, "text"], ("[\n" " false\n" ' "text"\n' "]"),), + ( + [False, "text", "multi\nline\ntext"], + "".join( + [ + "[\n", + " false\n", + ' "text"\n', + " ''\n multi\n" " line\n" " text\n" " ''\n" "]", + ] + ), + ), ( {"name1": "value1", "name.2": True, "name3": [False, "text"]}, (