diff --git a/devenv/main.py b/devenv/main.py index c41202a..42daa4b 100644 --- a/devenv/main.py +++ b/devenv/main.py @@ -11,6 +11,7 @@ from devenv import pin_gha from devenv import sync from devenv import update +from devenv import var from devenv.constants import home from devenv.constants import troubleshooting_help from devenv.constants import user @@ -46,7 +47,7 @@ def devenv(argv: Sequence[str], config_path: str) -> ExitCode: modinfo_list: Sequence[DevModuleInfo] = [ module.module_info - for module in [bootstrap, fetch, colima, doctor, pin_gha, sync, update] + for module in [bootstrap, fetch, colima, doctor, pin_gha, sync, update, var] if hasattr(module, "module_info") ] diff --git a/devenv/var.py b/devenv/var.py new file mode 100644 index 0000000..8779e07 --- /dev/null +++ b/devenv/var.py @@ -0,0 +1,48 @@ +from __future__ import annotations + +import argparse +import sys +from collections.abc import Sequence + +from devenv.lib.context import Context +from devenv.lib.modules import DevModuleInfo + + +def _vars(context: Context) -> dict[str, str]: + return { + "coderoot": context["code_root"], + } + + +def main(context: Context, argv: Sequence[str] | None = None) -> int: + parser = argparse.ArgumentParser() + parser.add_argument( + "name", + nargs="?", + type=str, + help="variable name to look up", + ) + args = parser.parse_args(argv) + + vs = _vars(context) + + if args.name is None: + print(f"available variables:") + for name in sorted(vs): + print(name) + return 0 + + if args.name not in vs: + print(f"unknown variable: {args.name}", file=sys.stderr) + return 1 + + print(vs[args.name]) + return 0 + + +module_info = DevModuleInfo( + action=main, + name=__name__, + command="var", + help="Print the value of a devenv variable (coderoot).", +) diff --git a/tests/test_var.py b/tests/test_var.py new file mode 100644 index 0000000..231eafe --- /dev/null +++ b/tests/test_var.py @@ -0,0 +1,59 @@ +from __future__ import annotations + +import os +from typing import Generator +from unittest.mock import patch + +import pytest + +from devenv import main + + +@pytest.fixture +def config_path( + tmp_path: str, capsys: pytest.CaptureFixture[str] +) -> Generator[str, None, None]: + config_path = f"{tmp_path}/.config/sentry-devenv/config.ini" + coderoot = f"{tmp_path}/code" + with patch("devenv.constants.CI", True): + main.devenv( + ( + "/path/to/argv0", + "bootstrap", + "-d", + f"coderoot:{coderoot}", + ), + config_path, + ) + capsys.readouterr() + yield config_path + + +def test_var_coderoot( + config_path: str, capsys: pytest.CaptureFixture[str] +) -> None: + rc = main.devenv(("/argv0", "var", "coderoot"), config_path) + assert rc == 0 + captured = capsys.readouterr() + # coderoot is non-empty and is a valid absolute path + assert os.path.isabs(captured.out.strip()) + + +def test_var_no_arg_lists_vars( + config_path: str, capsys: pytest.CaptureFixture[str] +) -> None: + rc = main.devenv(("/argv0", "var"), config_path) + assert rc == 0 + captured = capsys.readouterr() + assert "coderoot" in captured.out + + +def test_var_unknown( + config_path: str, capsys: pytest.CaptureFixture[str] +) -> None: + rc = main.devenv( + ("/argv0", "var", "nonexistent"), config_path + ) + assert rc == 1 + captured = capsys.readouterr() + assert "unknown variable: nonexistent" in captured.out