From ae396f0a3e3d2e39cb0a4015ee38ceb2d86a5ce4 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 and pip-compile 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. (cherry picked from commit 40285f8de939487c2aa4f33ec40130bb61e4eee0) 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..a4f9eff6a6a --- /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", "constraints-base"} +) + + +@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