From 4db039581493397620417547799e60e4e66f2f48 Mon Sep 17 00:00:00 2001 From: Adar Nimrod <nimrod@shore.co.il> Date: Thu, 23 Dec 2021 21:46:09 +0200 Subject: [PATCH] First try. Let's say a naive implementation. Mainly to mimic the json.tool format generally (most of the switches are not applicable and I'm not going to mimic it completely). --- .gitlab-ci.yml | 4 ++-- README.rst | 20 ++++++++++++++++++++ yamltool/__main__.py | 44 ++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 64 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d3ab1fb..c38a3fc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -8,5 +8,5 @@ include: install-wheel: extends: .install-wheel script: - - python3 -m yamltool - - yt + - python3 -m yamltool -h + - yt -h diff --git a/README.rst b/README.rst index 25a51ef..46f8cf9 100644 --- a/README.rst +++ b/README.rst @@ -7,6 +7,26 @@ 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). +Usage +----- + +.. code:: shell + + usage: yt [-h] [infile] [outfile] + + 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). + + positional arguments: + infile a YAML file to be validated or pretty-printed + outfile write the output of infile to outfile + + optional arguments: + -h, --help show this help message and exit + License ------- diff --git a/yamltool/__main__.py b/yamltool/__main__.py index 2346b0e..a978124 100644 --- a/yamltool/__main__.py +++ b/yamltool/__main__.py @@ -6,10 +6,50 @@ documents (like comments and anchors). """ +import argparse +import pathlib +import sys +import ruamel.yaml # pylint: disable=import-error + + def main(): """Main entrypoint.""" - return + parser = argparse.ArgumentParser( + description=__doc__, + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + parser.add_argument( + "infile", + nargs="?", + type=argparse.FileType(encoding="utf-8"), + 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, + ) + 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 + 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 if __name__ == "__main__": - main() + try: + main() + except BrokenPipeError as exc: + sys.exit(exc.errno) -- GitLab