diff --git a/.cspell.json b/.cspell.json index 56112fe4..247e5db8 100644 --- a/.cspell.json +++ b/.cspell.json @@ -25,6 +25,7 @@ "*.ico", "*.rst_t", ".editorconfig", + ".envrc", ".gitignore", ".gitpod.*", ".pre-commit-config.yaml", diff --git a/.envrc b/.envrc index cce3aa58..a00cf019 100644 --- a/.envrc +++ b/.envrc @@ -1 +1,7 @@ -layout anaconda +if [ -e .venv ]; then + source .venv/bin/activate +elif [ -e venv ]; then + source venv/bin/activate +else + layout anaconda +fi diff --git a/src/compwa_policy/.template/.cspell.json b/src/compwa_policy/.template/.cspell.json index efe4a740..d264b409 100644 --- a/src/compwa_policy/.template/.cspell.json +++ b/src/compwa_policy/.template/.cspell.json @@ -27,6 +27,7 @@ "*particle*.*ml", ".constraints/*.txt", ".editorconfig", + ".envrc", ".gitignore", ".gitpod.*", ".mypy.ini", diff --git a/src/compwa_policy/check_dev_files/direnv.py b/src/compwa_policy/check_dev_files/direnv.py index ae267024..d21850ff 100644 --- a/src/compwa_policy/check_dev_files/direnv.py +++ b/src/compwa_policy/check_dev_files/direnv.py @@ -2,29 +2,50 @@ from __future__ import annotations -from textwrap import dedent +from textwrap import dedent, indent from compwa_policy.errors import PrecommitError from compwa_policy.utilities import CONFIG_PATH from compwa_policy.utilities.pyproject import Pyproject +__SCRIPTS = { + "conda": "layout anaconda", + "pixi": """ + watch_file pixi.lock + eval "$(pixi shell-hook)" + """, + "venv": "source venv/bin/activate", + "uv-venv": "source .venv/bin/activate", +} + def main() -> None: + statements: list[tuple[str | None, str]] = [ + (".venv", __SCRIPTS["uv-venv"]), + ("venv", __SCRIPTS["venv"]), + ] if ( CONFIG_PATH.pixi_lock.exists() or CONFIG_PATH.pixi_toml.exists() or (CONFIG_PATH.pyproject.exists() and Pyproject.load().has_table("tool.pixi")) ): - _update_envrc(""" - watch_file pixi.lock - eval "$(pixi shell-hook)" - """) - elif CONFIG_PATH.conda.exists(): - _update_envrc("layout anaconda") - - -def _update_envrc(expected: str) -> None: - expected = dedent(expected).strip() + "\n" + statements.append((".pixi", __SCRIPTS["pixi"])) + if CONFIG_PATH.conda.exists(): + statements.append((None, __SCRIPTS["conda"])) + _update_envrc(statements) + + +def _update_envrc(statements: list[tuple[str | None, str]]) -> None: + expected = "" + for i, (trigger_path, script) in enumerate(statements): + if trigger_path is not None: + if_or_elif = "if" if i == 0 else "elif" + expected += f"{if_or_elif} [ -e {trigger_path} ]; then\n" + else: + expected += "else\n" + script = dedent(script).strip() + expected += indent(script, prefix=" ") + "\n" + expected += "fi\n" existing = __get_existing_envrc() if existing == expected: return