From 0c3ee1c0204d22141deef5e0e4229c96d44791a1 Mon Sep 17 00:00:00 2001 From: Bertrand Benjamin Date: Mon, 22 Aug 2022 20:53:02 +0200 Subject: [PATCH] Feat: import old code --- clean_rst/__main__.py | 4 ++ clean_rst/main.py | 140 ++++++++++++++++++++++++++++++++++++++++++ poetry.lock | 70 ++++++++++++++++++++- pyproject.toml | 5 ++ 4 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 clean_rst/__main__.py create mode 100644 clean_rst/main.py diff --git a/clean_rst/__main__.py b/clean_rst/__main__.py new file mode 100644 index 0000000..8ccec5b --- /dev/null +++ b/clean_rst/__main__.py @@ -0,0 +1,4 @@ +from clean_rst.main import main + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/clean_rst/main.py b/clean_rst/main.py new file mode 100644 index 0000000..f4a8e46 --- /dev/null +++ b/clean_rst/main.py @@ -0,0 +1,140 @@ +import logging +import re +import sys +import time + +import restructuredtext_lint +from git import Repo + +formatter = logging.Formatter("%(name)s :: %(levelname)s :: %(message)s") +steam_handler = logging.StreamHandler() +# steam_handler = logging.FileHandler('logging.conf') +steam_handler.setLevel(logging.DEBUG) +steam_handler.setFormatter(formatter) + +# création de l'objet logger qui va nous servir à écrire dans les logs +logger = logging.getLogger("precommit") +# on met le niveau du logger à DEBUG, comme ça il écrit tout +logger.setLevel(logging.WARNING) +logger.addHandler(steam_handler) + +# Files selection + + +def get_commited_files(repo): + hdiff = repo.head.commit.diff() + diff = {"A": [], "M": []} + for f in hdiff.iter_change_type("A"): + diff["A"].append(f.b_path) + for f in hdiff.iter_change_type("M"): + diff["M"].append(f.b_path) + + return diff + + +def select_by_extension(files, ext="rst"): + return [i for i in files if i.split(".")[-1] == ext and "skeleton" not in i] + + +# Rst linter + + +def rst_lint(filename): + with open(filename, "r") as f: + errors = restructuredtext_lint.lint(f.read()) + for e in errors: + logger.warning(f"{filename} \n{e.full_message}\n") + return errors + + +# Rst parameters normalize + + +def normalize_file(filename, normalizers={}): + logger.debug(f"Normalizing {filename}") + logger.debug(f"With {normalizers}") + new_file = "" + modified_lines = [] + with open(filename, "r") as f: + for l in f.readlines(): + new_line = run_normalizers(l, normalizers) + if new_line != l: + modified_lines.append(f"{l}") + logger.warning(f"{filename}\n\t{l}\t{new_line}") + new_file += new_line + + with open(filename, "w") as f: + f.write(new_file) + logger.debug(f"{filename} written") + + return modified_lines + + +def run_normalizers(line, normalizers): + for c in normalizers: + obs = re.search(c, line) + if obs: + logger.debug(f"Find for {c}") + return normalizers[c](line) + return line + + +# Rst function tools + + +def update_date(line): + date = time.strftime("%Y-%m-%d") + logger.debug(f"Update Date to: {date}") + return f":date: {date}\n" + + +def update_modified(line): + modified = time.strftime("%Y-%m-%d") + logger.debug(f"Update modified to: {modified}") + return f":modified: {modified}\n" + + +def normalize_tags(line): + logger.debug(f"Normaizing tags") + tags = line.split(":")[-1] + tags = [i.strip().capitalize() for i in tags.split(",")] + tags_str = ", ".join(tags) + logger.debug(f"Update tags to: {tags_str}") + return f":tags: {tags_str}\n" + + +NORMALIZERS_MODIFIED = { + ":modified:.*": update_modified, + ":tags:.*": normalize_tags, +} + +NORMALIZERS_NEW = { + ":date:.*": update_date, + ":modified:.*": update_modified, + ":tags:.*": normalize_tags, +} + + +def main(argv: list[str] = None) -> int: + r = Repo() + diff = get_commited_files(r) + + errors = [] + modified = [] + + # New files + for f in select_by_extension(diff["A"], "rst"): + errors += rst_lint(f) + modified += normalize_file(f, NORMALIZERS_NEW) + r.index.add([f]) + # Modified files + for f in select_by_extension(diff["M"], "rst"): + errors += rst_lint(f) + modified += normalize_file(f, NORMALIZERS_MODIFIED) + r.index.add([f]) + + return int(len(errors) > 0) + + +if __name__ == "__main__": + main() diff --git a/poetry.lock b/poetry.lock index 47f5ab9..bc4e8e2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -44,6 +44,14 @@ category = "dev" optional = false python-versions = "*" +[[package]] +name = "docutils" +version = "0.19" +description = "Docutils -- Python Documentation Utilities" +category = "main" +optional = false +python-versions = ">=3.7" + [[package]] name = "filelock" version = "3.8.0" @@ -56,6 +64,28 @@ python-versions = ">=3.7" docs = ["furo (>=2022.6.21)", "sphinx (>=5.1.1)", "sphinx-autodoc-typehints (>=1.19.1)"] testing = ["covdefaults (>=2.2)", "coverage (>=6.4.2)", "pytest (>=7.1.2)", "pytest-cov (>=3)", "pytest-timeout (>=2.1)"] +[[package]] +name = "gitdb" +version = "4.0.9" +description = "Git Object Database" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.27" +description = "GitPython is a python library used to interact with Git repositories" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +gitdb = ">=4.0.1,<5" + [[package]] name = "identify" version = "2.5.3" @@ -182,6 +212,25 @@ category = "dev" optional = false python-versions = ">=3.6" +[[package]] +name = "restructuredtext-lint" +version = "1.4.0" +description = "reStructuredText linter" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +docutils = ">=0.11,<1.0" + +[[package]] +name = "smmap" +version = "5.0.0" +description = "A pure Python implementation of a sliding window memory map manager" +category = "main" +optional = false +python-versions = ">=3.6" + [[package]] name = "toml" version = "0.10.2" @@ -218,7 +267,7 @@ python-versions = "*" [metadata] lock-version = "1.1" python-versions = "^3.10" -content-hash = "1e4f6b994d740ae7f8d013222899e67fdb51d817014e239c70f4266618c82919" +content-hash = "f42f1e61719183591304472b3ed90dfbd50fb6ff8ecbd502c7c23c0cd85ce935" [metadata.files] atomicwrites = [ @@ -240,10 +289,22 @@ distlib = [ {file = "distlib-0.3.5-py2.py3-none-any.whl", hash = "sha256:b710088c59f06338ca514800ad795a132da19fda270e3ce4affc74abf955a26c"}, {file = "distlib-0.3.5.tar.gz", hash = "sha256:a7f75737c70be3b25e2bee06288cec4e4c221de18455b2dd037fe2a795cab2fe"}, ] +docutils = [ + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, +] filelock = [ {file = "filelock-3.8.0-py3-none-any.whl", hash = "sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4"}, {file = "filelock-3.8.0.tar.gz", hash = "sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc"}, ] +gitdb = [ + {file = "gitdb-4.0.9-py3-none-any.whl", hash = "sha256:8033ad4e853066ba6ca92050b9df2f89301b8fc8bf7e9324d412a63f8bf1a8fd"}, + {file = "gitdb-4.0.9.tar.gz", hash = "sha256:bac2fd45c0a1c9cf619e63a90d62bdc63892ef92387424b855792a6cabe789aa"}, +] +gitpython = [ + {file = "GitPython-3.1.27-py3-none-any.whl", hash = "sha256:5b68b000463593e05ff2b261acff0ff0972df8ab1b70d3cdbd41b546c8b8fc3d"}, + {file = "GitPython-3.1.27.tar.gz", hash = "sha256:1c885ce809e8ba2d88a29befeb385fcea06338d3640712b59ca623c220bb5704"}, +] identify = [ {file = "identify-2.5.3-py2.py3-none-any.whl", hash = "sha256:25851c8c1370effb22aaa3c987b30449e9ff0cece408f810ae6ce408fdd20893"}, {file = "identify-2.5.3.tar.gz", hash = "sha256:887e7b91a1be152b0d46bbf072130235a8117392b9f1828446079a816a05ef44"}, @@ -319,6 +380,13 @@ pyyaml = [ {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] +restructuredtext-lint = [ + {file = "restructuredtext_lint-1.4.0.tar.gz", hash = "sha256:1b235c0c922341ab6c530390892eb9e92f90b9b75046063e047cacfb0f050c45"}, +] +smmap = [ + {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, + {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, +] toml = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, diff --git a/pyproject.toml b/pyproject.toml index 3fd0ede..45c8ab7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,8 +4,13 @@ version = "0.1.0" description = "pre-commit to clean rst index files" authors = ["Bertrand Benjamin "] +[tool.poetry.scripts] +clean-rst = "clean_rst.main:main" + [tool.poetry.dependencies] python = "^3.10" +restructuredtext-lint = "^1.4.0" +GitPython = "^3.1.27" [tool.poetry.dev-dependencies] pytest = "^5.2"