From 2f4dfa2040f4156f8c1183d87f50696ef07242e8 Mon Sep 17 00:00:00 2001 From: Maxwell G Date: Wed, 26 Jul 2023 16:30:55 +0000 Subject: [PATCH] add noxfile to run python linters Currently, this only lints the noxfile itself and the issue labeler script. We can expand the noxfile to build docs and lint other new files in hacking. Relates: https://github.com/ansible/ansible-documentation/issues/54 --- .isort.cfg | 2 ++ noxfile.py | 79 ++++++++++++++++++++++++++++++++++++++++++++ tests/formatters.in | 2 ++ tests/formatters.txt | 22 ++++++++++++ tests/static.in | 1 + tests/static.txt | 8 +++++ tests/typing.in | 3 ++ tests/typing.txt | 67 +++++++++++++++++++++++++++++++++++++ 8 files changed, 184 insertions(+) create mode 100644 .isort.cfg create mode 100644 noxfile.py create mode 100644 tests/formatters.in create mode 100644 tests/formatters.txt create mode 100644 tests/static.in create mode 100644 tests/static.txt create mode 100644 tests/typing.in create mode 100644 tests/typing.txt diff --git a/.isort.cfg b/.isort.cfg new file mode 100644 index 00000000000..c76db01ff4e --- /dev/null +++ b/.isort.cfg @@ -0,0 +1,2 @@ +[isort] +profile = black diff --git a/noxfile.py b/noxfile.py new file mode 100644 index 00000000000..131bf79f971 --- /dev/null +++ b/noxfile.py @@ -0,0 +1,79 @@ +import os +from pathlib import Path + +import nox + +LINT_FILES = ("hacking/pr_labeler/label.py", "noxfile.py") +PINNED = os.environ.get("PINNED", "true").lower() in {"1", "true"} +nox.options.sessions = ("lint",) + + +def install(session: nox.Session, *args, req: str, **kwargs): + if PINNED: + kwargs.setdefault("env", {})["PIP_CONSTRAINT"] = f"tests/{req}.txt" + session.install("-r", f"tests/{req}.in", *args, **kwargs) + + +@nox.session +def static(session: nox.Session): + """ + Run static checkers + """ + install(session, req="static") + session.run("ruff", *session.posargs, *LINT_FILES) + + +@nox.session +def formatters(session: nox.Session): + """ + Reformat code + """ + install(session, req="formatters") + session.run("isort", *session.posargs, *LINT_FILES) + session.run("black", *session.posargs, *LINT_FILES) + + +@nox.session +def formatters_check(session: nox.Session): + """ + Check code formatting without making changes + """ + install(session, req="formatters") + session.run("isort", "--check", *session.posargs, *LINT_FILES) + session.run("black", "--check", *session.posargs, *LINT_FILES) + + +@nox.session +def typing(session: nox.Session): + install(session, req="typing") + session.run("mypy", *session.posargs, *LINT_FILES) + + +@nox.session +def lint(session: nox.Session): + session.notify("static") + session.notify("formatters") + + +requirements_files = list( + {path.name.replace(".in", "") for path in Path("tests").glob("*in")} + - {"constraints"} +) + + +@nox.session(name="pip-compile", python=["3.10"]) +@nox.parametrize(["req"], requirements_files, requirements_files) +def pip_compile(session: nox.Session, req: str): + session.install("pip-tools") + # fmt: off + session.run( + "pip-compile", + "--resolver", "backtracking", + "--upgrade", + "--allow-unsafe", + "--quiet", + "--strip-extras", + "--output-file", f"tests/{req}.txt", + f"tests/{req}.in", + ) + # fmt: on diff --git a/tests/formatters.in b/tests/formatters.in new file mode 100644 index 00000000000..7559a405a0f --- /dev/null +++ b/tests/formatters.in @@ -0,0 +1,2 @@ +black +isort diff --git a/tests/formatters.txt b/tests/formatters.txt new file mode 100644 index 00000000000..6bc6dfadcbd --- /dev/null +++ b/tests/formatters.txt @@ -0,0 +1,22 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --output-file=tests/formatters.txt --strip-extras tests/formatters.in +# +black==23.7.0 + # via -r tests/formatters.in +click==8.1.6 + # via black +isort==5.12.0 + # via -r tests/formatters.in +mypy-extensions==1.0.0 + # via black +packaging==23.1 + # via black +pathspec==0.11.2 + # via black +platformdirs==3.10.0 + # via black +tomli==2.0.1 + # via black diff --git a/tests/static.in b/tests/static.in new file mode 100644 index 00000000000..af3ee576386 --- /dev/null +++ b/tests/static.in @@ -0,0 +1 @@ +ruff diff --git a/tests/static.txt b/tests/static.txt new file mode 100644 index 00000000000..998a51184f4 --- /dev/null +++ b/tests/static.txt @@ -0,0 +1,8 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --output-file=tests/static.txt --strip-extras tests/static.in +# +ruff==0.0.284 + # via -r tests/static.in diff --git a/tests/typing.in b/tests/typing.in new file mode 100644 index 00000000000..63112a0d90a --- /dev/null +++ b/tests/typing.in @@ -0,0 +1,3 @@ +-r ../hacking/pr_labeler/requirements.txt +mypy +nox diff --git a/tests/typing.txt b/tests/typing.txt new file mode 100644 index 00000000000..7ffa43ee932 --- /dev/null +++ b/tests/typing.txt @@ -0,0 +1,67 @@ +# +# This file is autogenerated by pip-compile with Python 3.10 +# by the following command: +# +# pip-compile --allow-unsafe --output-file=tests/typing.txt --strip-extras tests/typing.in +# +argcomplete==3.1.1 + # via nox +certifi==2023.7.22 + # via requests +cffi==1.15.1 + # via + # cryptography + # pynacl +charset-normalizer==3.2.0 + # via requests +click==8.1.6 + # via typer +codeowners==0.6.0 + # via -r tests/../hacking/pr_labeler/requirements.txt +colorlog==6.7.0 + # via nox +cryptography==41.0.3 + # via pyjwt +deprecated==1.2.14 + # via pygithub +distlib==0.3.7 + # via virtualenv +filelock==3.12.2 + # via virtualenv +idna==3.4 + # via requests +mypy==1.5.0 + # via -r tests/typing.in +mypy-extensions==1.0.0 + # via mypy +nox==2023.4.22 + # via -r tests/typing.in +packaging==23.1 + # via nox +platformdirs==3.10.0 + # via virtualenv +pycparser==2.21 + # via cffi +pygithub==1.59.1 + # via -r tests/../hacking/pr_labeler/requirements.txt +pyjwt==2.8.0 + # via pygithub +pynacl==1.5.0 + # via pygithub +requests==2.31.0 + # via pygithub +tomli==2.0.1 + # via mypy +typer==0.9.0 + # via -r tests/../hacking/pr_labeler/requirements.txt +typing-extensions==4.7.1 + # via + # codeowners + # mypy + # typer +urllib3==2.0.4 + # via requests +virtualenv==20.24.2 + # via nox +wrapt==1.15.0 + # via deprecated