summaryrefslogtreecommitdiff
path: root/noxfile.py
diff options
context:
space:
mode:
authoraktersnurra <gustaf.rydholm@gmail.com>2020-06-02 22:49:22 +0200
committeraktersnurra <gustaf.rydholm@gmail.com>2020-06-02 22:49:22 +0200
commit118c02c2730aaac2d10c2b9847339f6ffc83223f (patch)
treef7e1dc9a7159b63945a19d742a525f20c90c969e /noxfile.py
parent81d48b6a4da96696afde87a54f9fb7d89dd64cd2 (diff)
Working on lab 1.
Diffstat (limited to 'noxfile.py')
-rw-r--r--noxfile.py143
1 files changed, 143 insertions, 0 deletions
diff --git a/noxfile.py b/noxfile.py
new file mode 100644
index 0000000..d391ff4
--- /dev/null
+++ b/noxfile.py
@@ -0,0 +1,143 @@
+"""Nox sessions."""
+import tempfile
+from typing import Any
+
+
+import nox
+from nox.sessions import Session
+
+package = "text-recognizer"
+nox.options.sessions = "lint", "mypy", "pytype", "safety", "tests"
+locations = "src", "tests", "noxfile.py", "docs/conf.py"
+
+
+def install_with_constraints(session: Session, *args: str, **kwargs: Any) -> None:
+ """Install packages constrained by Poetry's lock file.
+
+ This function is a wrapper for nox.sessions.Session.install. It
+ invokes pip to install packages inside of the session's virtualenv.
+ Additionally, pip is passed a constraints file generated from
+ Poetry's lock file, to ensure that the packages are pinned to the
+ versions specified in poetry.lock. This allows you to manage the
+ packages as Poetry development dependencies.
+
+ Args:
+ session: The Session object.
+ args: Command-line arguments for pip.
+ kwargs: Additional keyword arguments for Session.install.
+
+ """
+ with tempfile.NamedTemporaryFile() as requirements:
+ session.run(
+ "poetry",
+ "export",
+ "--dev",
+ "--format=requirements.txt",
+ f"--output={requirements.name}",
+ external=True,
+ )
+ session.install(f"--constraint={requirements.name}", *args, **kwargs)
+
+
+@nox.session(python="3.8")
+def black(session: Session) -> None:
+ """Run black code formatter."""
+ args = session.posargs or locations
+ install_with_constraints(session, "black")
+ session.run("black", *args)
+
+
+@nox.session(python=["3.8", "3.7"])
+def lint(session: Session) -> None:
+ """Lint using flake8."""
+ args = session.posargs or locations
+ install_with_constraints(
+ session,
+ "flake8",
+ "flake8-annotations",
+ "flake8-bandit",
+ "flake8-black",
+ "flake8-bugbear",
+ "flake8-docstrings",
+ "flake8-import-order",
+ "darglint",
+ )
+ session.run("flake8", *args)
+
+
+@nox.session(python="3.8")
+def safety(session: Session) -> None:
+ """Scan dependencies for insecure packages."""
+ with tempfile.NamedTemporaryFile() as requirements:
+ session.run(
+ "poetry",
+ "export",
+ "--dev",
+ "--format=requirements.txt",
+ "--without-hashes",
+ f"--output={requirements.name}",
+ external=True,
+ )
+ install_with_constraints(session, "safety")
+ session.run("safety", "check", f"--file={requirements.name}", "--full-report")
+
+
+@nox.session(python=["3.8", "3.7"])
+def mypy(session: Session) -> None:
+ """Type-check using mypy."""
+ args = session.posargs or locations
+ install_with_constraints(session, "mypy")
+ session.run("mypy", *args)
+
+
+@nox.session(python="3.7")
+def pytype(session: Session) -> None:
+ """Type-check using pytype."""
+ args = session.posargs or ["--disable=import-error", *locations]
+ install_with_constraints(session, "pytype")
+ session.run("pytype", *args)
+
+
+@nox.session(python=["3.8", "3.7"])
+def tests(session: Session) -> None:
+ """Run the test suite."""
+ args = session.posargs or ["--cov", "-m", "not e2e"]
+ session.run("poetry", "install", "--no-dev", external=True)
+ install_with_constraints(
+ session, "coverage[toml]", "pytest", "pytest-cov", "pytest-mock"
+ )
+ session.run("pytest", *args)
+
+
+@nox.session(python=["3.8", "3.7"])
+def typeguard(session: Session) -> None:
+ """Runtime type checking using Typeguard."""
+ args = session.posargs or ["-m", "not e2e"]
+ session.run("poetry", "install", "--no-dev", external=True)
+ install_with_constraints(session, "pytest", "pytest-mock", "typeguard")
+ session.run("pytest", f"--typeguard-packages={package}", *args)
+
+
+@nox.session(python=["3.8", "3.7"])
+def xdoctest(session: Session) -> None:
+ """Run examples with xdoctest."""
+ args = session.posargs or ["all"]
+ session.run("poetry", "install", "--no-dev", external=True)
+ install_with_constraints(session, "xdoctest")
+ session.run("python", "-m", "xdoctest", package, *args)
+
+
+@nox.session(python="3.8")
+def coverage(session: Session) -> None:
+ """Upload coverage data."""
+ install_with_constraints(session, "coverage[toml]", "codecov")
+ session.run("coverage", "xml", "--fail-under=0")
+ session.run("codecov", *session.posargs)
+
+
+@nox.session(python="3.8")
+def docs(session: Session) -> None:
+ """Build the documentation."""
+ session.run("poetry", "install", "--no-dev", external=True)
+ install_with_constraints(session, "sphinx", "sphinx-autodoc-typehints")
+ session.run("sphinx-build", "docs", "docs/_build")