Skip to content
Commits on Source (2)
......@@ -2,6 +2,8 @@
include:
- project: shore/ci-stuff
file: templates/pre-commit.yml
- project: shore/ci-stuff
file: templates/pre-commit-repo.yml
- project: shore/ci-stuff
file: templates/python.yml
......
......@@ -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:
......@@ -103,3 +96,8 @@ repos:
rev: '0.47'
hooks:
- id: check-manifest
- repo: https://github.com/pre-commit/pre-commit.git
rev: v2.15.0
hooks:
- id: validate_manifest
---
- id: yamltool
name: YAML tool
description: Validate and pretty-print YAML files.
language: python
entry: yt
args: ["--in-place"]
types: [yaml]
include *.rst
include *.txt
exclude .pre-commit-config.yaml
exclude .pre-commit-hooks.yaml
exclude .gitlab-ci.yml
exclude .gitignore
......@@ -16,20 +16,43 @@ 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.
pre-commit hook
---------------
YAML tool can be used as a `pre-commit <https://pre-commit.com/>` hook by
adding the following to your :code:`.pre-commit-config.yaml` file:
.. code:: yaml
---
repos:
- repo: https://git.shore.co.il/nimrod/yamltool.git
rev: 0.1.0 # Check for the latest tag or run pre-commit autoupdate.
hooks:
- id: yamltool
License
-------
......
......@@ -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__":
......