Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion devenv/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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")
]

Expand Down
48 changes: 48 additions & 0 deletions devenv/var.py
Original file line number Diff line number Diff line change
@@ -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).",
)
59 changes: 59 additions & 0 deletions tests/test_var.py
Original file line number Diff line number Diff line change
@@ -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
Loading