From eba18bca846b9b4bd6cdafdca210d63fd8b7649e Mon Sep 17 00:00:00 2001 From: Justin Mayer Date: Tue, 4 May 2021 05:37:47 -0500 Subject: [PATCH] Support Poetry-managed virtualenvs in Invoke tasks --- tasks.py | 69 +++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/tasks.py b/tasks.py index 0377b73..f0fbc52 100644 --- a/tasks.py +++ b/tasks.py @@ -1,79 +1,102 @@ +from inspect import cleandoc import os from pathlib import Path from shutil import which +import sys from invoke import task PKG_NAME = "share_post" PKG_PATH = Path(f"pelican/plugins/{PKG_NAME}") +TOOLS = ("poetry", "pre-commit") + ACTIVE_VENV = os.environ.get("VIRTUAL_ENV", None) VENV_HOME = Path(os.environ.get("WORKON_HOME", "~/.local/share/virtualenvs")) -VENV_PATH = Path(ACTIVE_VENV) if ACTIVE_VENV else (VENV_HOME / PKG_NAME) +VENV_PATH = Path(ACTIVE_VENV) if ACTIVE_VENV else (VENV_HOME.expanduser() / PKG_NAME) VENV = str(VENV_PATH.expanduser()) - -TOOLS = ["poetry", "pre-commit"] -POETRY = which("poetry") if which("poetry") else (VENV / Path("bin") / "poetry") -PRECOMMIT = ( - which("pre-commit") if which("pre-commit") else (VENV / Path("bin") / "pre-commit") -) +BIN_DIR = "bin" if os.name != "nt" else "Scripts" +VENV_BIN = Path(VENV) / Path(BIN_DIR) +POETRY = which("poetry") if which("poetry") else (VENV_BIN / "poetry") +CMD_PREFIX = f"{VENV_BIN}/" if ACTIVE_VENV else f"{POETRY} run " +PRECOMMIT = which("pre-commit") if which("pre-commit") else f"{CMD_PREFIX}pre-commit" +PTY = True if os.name != "nt" else False @task def tests(c): - """Run the test suite""" - c.run(f"{VENV}/bin/pytest", pty=True) + """Run the test suite.""" + c.run(f"{CMD_PREFIX}pytest", pty=PTY) @task def black(c, check=False, diff=False): - """Run Black auto-formatter, optionally with --check or --diff""" + """Run Black auto-formatter, optionally with `--check` or `--diff`.""" check_flag, diff_flag = "", "" if check: check_flag = "--check" if diff: diff_flag = "--diff" - c.run(f"{VENV}/bin/black {check_flag} {diff_flag} {PKG_PATH} tasks.py") + c.run(f"{CMD_PREFIX}black {check_flag} {diff_flag} {PKG_PATH} tasks.py") @task def isort(c, check=False, diff=False): + """Ensure imports are sorted according to project standards.""" check_flag, diff_flag = "", "" if check: check_flag = "-c" if diff: diff_flag = "--diff" - c.run(f"{VENV}/bin/isort {check_flag} {diff_flag} .") + c.run(f"{CMD_PREFIX}isort {check_flag} {diff_flag} .") @task def flake8(c): - c.run(f"{VENV}/bin/flake8 {PKG_PATH} tasks.py") + """Check code for PEP8 compliance via Flake8.""" + c.run(f"{CMD_PREFIX}flake8 {PKG_PATH} tasks.py") @task -def lint(c): - isort(c, check=True) - black(c, check=True) +def lint(c, diff=False): + """Check code style via linting tools.""" + isort(c, check=True, diff=diff) + black(c, check=True, diff=diff) flake8(c) @task def tools(c): - """Install tools in the virtual environment if not already on PATH""" + """Install development tools in the virtual environment if not already on PATH.""" for tool in TOOLS: if not which(tool): - c.run(f"{VENV}/bin/pip install {tool}") + print(f"** Installing {tool}.") + c.run(f"{CMD_PREFIX}pip install {tool}") @task def precommit(c): - """Install pre-commit hooks to .git/hooks/pre-commit""" + """Install pre-commit hooks to `.git/hooks/pre-commit`.""" + print("** Installing pre-commit hooks.") c.run(f"{PRECOMMIT} install") @task def setup(c): - c.run(f"{VENV}/bin/pip install -U pip") - tools(c) - c.run(f"{POETRY} install") - precommit(c) + """Set up the development environment.""" + if which("poetry") or ACTIVE_VENV: + tools(c) + c.run(f"{CMD_PREFIX}python -m pip install --upgrade pip") + c.run(f"{POETRY} install") + precommit(c) + print("\nDevelopment environment should now be set up and ready!\n") + else: + error_message = """ + Poetry is not installed, and there is no active virtual environment available. + You can either manually create and activate a virtual environment, or you can + install Poetry via: + + curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python - + + Once you have taken one of the above two steps, run `invoke setup` again. + """ # noqa: E501 + sys.exit(cleandoc(error_message))