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