diff --git a/printer-linter/src/printerlinter/formatters/__init__.py b/printer-linter/src/printerlinter/formatters/__init__.py new file mode 100644 index 0000000000..8f5a01bb25 --- /dev/null +++ b/printer-linter/src/printerlinter/formatters/__init__.py @@ -0,0 +1,4 @@ +from def_json_formatter import DefJsonFormatter +from inst_cfg_formatter import InstCfgFormatter + +__all__ = ["DefJsonFormatter", "InstCfgFormatter"] \ No newline at end of file diff --git a/printer-linter/src/printerlinter/formatters/def_json_formatter.py b/printer-linter/src/printerlinter/formatters/def_json_formatter.py new file mode 100644 index 0000000000..ddeccacffd --- /dev/null +++ b/printer-linter/src/printerlinter/formatters/def_json_formatter.py @@ -0,0 +1,29 @@ +import json +import re +from pathlib import Path + +from .formatter import FileFormatter + +class DefJsonFormatter(FileFormatter): + def format(self, file: Path): + """ Format .def.json files according to the rules in settings """ + definition = json.loads(file.read_text()) + content = json.dumps(definition, indent=self._settings["format"].get("format-definition-indent", 4), + sort_keys=self._settings["format"].get("format-definition-sort-keys", True)) + + if self._settings["format"].get("format-definition-bracket-newline", True): + newline = re.compile(r"(\B\s+)(\"[\w\"]+)(\:\s\{)") + content = newline.sub(r"\1\2:\1{", content) + + if self._settings["format"].get("format-definition-single-value-single-line", True): + single_value_dict = re.compile(r"(:)(\s*\n?.*\{\s+)(\".*)(\d*\s*\})(\s*)(,?)") + content = single_value_dict.sub(r"\1 { \3 }\6", content) + + single_value_list = re.compile(r"(:)(\s*\n?.*\[\s+)(\".*)(\d*\s*\])(\s*)(,?)") + content = single_value_list.sub(r"\1 [ \3 ]\6", content) + + if self._settings["format"].get("format-definition-paired-coordinate-array", True): + paired_coordinates = re.compile(r"(\[)\s+(-?\d*),\s*(-?\d*)\s*(\])") + content = paired_coordinates.sub(r"\1 \2, \3 \4", content) + + file.write_text(content) \ No newline at end of file diff --git a/printer-linter/src/printerlinter/formatters/formatter.py b/printer-linter/src/printerlinter/formatters/formatter.py new file mode 100644 index 0000000000..1425825a82 --- /dev/null +++ b/printer-linter/src/printerlinter/formatters/formatter.py @@ -0,0 +1,16 @@ +from abc import ABC, abstractmethod +from pathlib import Path + + +class FileFormatter(ABC): + def __init__(self, settings: dict) -> None: + """ Yields Diagnostics for file, these are issues with the file such as bad text format or too large file size. + + @param file: A file to generate diagnostics for + @param settings: A list of settings containing rules for creating diagnostics + """ + self._settings = settings + + @abstractmethod + def format(self, file: Path) -> None: + pass \ No newline at end of file diff --git a/printer-linter/src/printerlinter/formatters/inst_cfg_formatter.py b/printer-linter/src/printerlinter/formatters/inst_cfg_formatter.py new file mode 100644 index 0000000000..fc6ccf3c81 --- /dev/null +++ b/printer-linter/src/printerlinter/formatters/inst_cfg_formatter.py @@ -0,0 +1,21 @@ +import configparser +import json +import re +from collections import OrderedDict +from pathlib import Path + +from .formatter import FileFormatter + +class InstCfgFormatter(FileFormatter): + def format(self, file: Path): + """ Format .inst.cfg files according to the rules in settings """ + config = configparser.ConfigParser() + config.read(file) + + if self._settings["format"].get("format-profile-sort-keys", True): + for section in config._sections: + config._sections[section] = OrderedDict(sorted(config._sections[section].items(), key=lambda t: t[0])) + config._sections = OrderedDict(sorted(config._sections.items(), key=lambda t: t[0])) + + with open(file, "w") as f: + config.write(f, space_around_delimiters=self._settings["format"].get("format-profile-space-around-delimiters", True)) \ No newline at end of file