diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d3ab1fb0e0318d910e20670f72aa3e0233fb734c..c38a3fc3d5f8057905b3e70acfb1c76a4a87e680 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 25a51ef1ae8484674f5d23b413976e74a2d78a84..46f8cf9f5ffd32fab169a3b8e1fe269d8b919576 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 2346b0e77329ed8d275726d9a1a0d8da017ba015..a978124242148e6be1316a86befc35d5315c08a6 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)