diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 41ea1a5d5a1dc6e8fe58cae4810e2b9fb6be5ebd..797bfc63b906b06477d6bedf2c8d937c0acc2082 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,13 +24,6 @@ repos: hooks: - id: detect-secrets - - repo: https://github.com/amperser/proselint.git - rev: 0.10.2 - hooks: - - id: proselint - types: [plain-text] - exclude: LICENSE - - repo: https://gitlab.com/devopshq/gitlab-ci-linter.git rev: v1.0.2 hooks: diff --git a/README.rst b/README.rst index 97bf73a3f1df09c65132c0a94929037a82990f5a..7520f22eb41b60b0d9cb4dabee15b216c1dc8c85 100644 --- a/README.rst +++ b/README.rst @@ -16,20 +16,28 @@ Usage .. code:: shell - usage: yt [-h] [infile] [outfile] + usage: yt [-h] [-i] [files ...] - YAML tool, a clone of the json.tool Python module for YAML. + YAML tool, a clone of the json.tool Python module for YAML. - This tool provides a simple command line interface to validate and pretty-print - YAML documents while trying to preserve as much as possible from the original - documents (like comments and anchors). + This tool provides a simple command line interface to validate and pretty-print + YAML documents while trying to preserve as much as possible from the original + documents (like comments and anchors). - positional arguments: - infile a YAML file to be validated or pretty-printed - outfile write the output of infile to outfile + positional arguments: + files a YAML file to be validated or pretty-printed - optional arguments: - -h, --help show this help message and exit + optional arguments: + -h, --help show this help message and exit + -i, --in-place Perform the pretty-print in place, overwriting the existing files. + + When enabling --in-place, all files are processed as input files. + When --in-place is not enabled and there are more then 2 files + passed, the last files is considered as the output file. If you + wish to pretty-print multiple files and output to standard out, + specify the last file as "-" . + Please note that specifying multiple input files will concatenate + them, resulting in a single file that has multiple documents. License ------- diff --git a/yamltool/__main__.py b/yamltool/__main__.py index a978124242148e6be1316a86befc35d5315c08a6..11df57d2c7db534ce9b70c291aa0e7c9daba5e47 100644 --- a/yamltool/__main__.py +++ b/yamltool/__main__.py @@ -9,43 +9,72 @@ documents (like comments and anchors). import argparse import pathlib import sys +import textwrap import ruamel.yaml # pylint: disable=import-error def main(): """Main entrypoint.""" + epilog = textwrap.dedent( + """ + When enabling --in-place, all files are processed as input files. + When --in-place is not enabled and there are more then 2 files + passed, the last files is considered as the output file. If you + wish to pretty-print multiple files and output to standard out, + specify the last file as "-" . + Please note that specifying multiple input files will concatenate + them, resulting in a single file that has multiple documents.""" + ) parser = argparse.ArgumentParser( description=__doc__, + epilog=epilog, formatter_class=argparse.RawDescriptionHelpFormatter, ) parser.add_argument( - "infile", - nargs="?", - type=argparse.FileType(encoding="utf-8"), + "files", + nargs="*", + type=pathlib.Path, help="a YAML file to be validated or pretty-printed", - default=sys.stdin, ) parser.add_argument( - "outfile", - nargs="?", - type=pathlib.Path, - help="write the output of infile to outfile", - default=None, + "-i", + "--in-place", + help="Perform the pretty-print in place, overwriting the existing files.", # noqa: E501 + action="store_true", ) options = parser.parse_args() - with options.infile as infile: - try: - yaml = ruamel.yaml.YAML(typ="rt") - yaml.explicit_start = True - yaml.indent(mapping=2, sequence=4, offset=2) - yaml.preserve_quotes = True - if options.outfile is None: - out = sys.stdout + try: + yaml = ruamel.yaml.YAML(typ="rt") + yaml.explicit_start = True + yaml.indent(mapping=2, sequence=4, offset=2) + yaml.preserve_quotes = True + if options.in_place: + if len(options.files) == 0: + raise Exception("You must provide a list of files to process.") + for file in options.files: + with open(file, "r", encoding="utf-8") as infile: + docs = list(yaml.load_all(infile)) + with open(file, "w", encoding="utf-8") as outfile: + yaml.dump_all(docs, outfile) + else: + if len(options.files) < 2: + outfile = sys.stdout + elif options.files[-1] == "-": + outfile = sys.stdout + options.files.pop(-1) + else: + outfile = open( # pylint: disable=consider-using-with + options.files[-1], "w", encoding="utf-8" + ) + options.files.pop(-1) + if options.files: + for file in options.files: + with open(file, "r", encoding="utf-8") as infile: + yaml.dump_all(yaml.load_all(infile), outfile) else: - out = options.outfile.open("w", encoding="utf-8") - yaml.dump_all(yaml.load_all(infile), out) - except Exception as ex: - raise SystemExit(ex) # pylint: disable=raise-missing-from + yaml.dump_all(yaml.load_all(sys.stdin), outfile) + except Exception as ex: + raise SystemExit(ex) # pylint: disable=raise-missing-from if __name__ == "__main__":