Files
computer-playbook/utils/install
kevinveenbirkenbachandClaude Opus 5 eda9474e37 test(lint): refuse a default in os.environ.get, and resolve the 25 sites
The deploy decides what ADAPTER_PORT or OPENWEBUI_ADMIN_NAME is and
writes it into the environment. A default in the reader is a second place
that value lives, and it is the one nobody greps for. os.environ["X"]
fails loudly on a missing key, which is the behaviour a misconfiguration
deserves.

Empty values stay free, because they add no second source and only say
absent: "", None, False, 0, the empty containers, and the "[]"/"{}" a
json.loads reader hands an absent variable. A default that is itself an
environ.get is free too, since it reads the one source again under
another key; a literal ending such a chain is still reported. Detection
runs on the parsed tree, so a call split across lines reads the same.

Five sites were real duplication and lost their default: the adapter
port, openwebui's admin name (a role that runs as a bot user), odoo's
OIDC uid field, seaweedfs' public-primary flag, and the swarm hosts
entry IP. Nineteen carry a nocheck naming why the value is not the
deploy's: contributor tooling whose default is the only source, test
scaffolding that writes the file it names, and two readers of
CA_TRUST_CERT_EXTRA_HOST, which nothing in the repo sets.

utils/diagnostics/container.py resolves without a marker: RESCUE_DEPTH is
a recursion base case, and the integer 0 says what the string "0" said.
The file sits exactly at the 500-line cap, so a comment line was not
available.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-10-14 00:26:55 +02:00
..
…
…
…
…

utils/install

This directory hosts the Python implementation behind make install-lint. For the general rules that govern READMEs in code directories see documentation.md.

Purpose

The package installs the lint toolchain (actionlint, shfmt, ruff, ansible-lint, mbake, markdownlint-cli2, eslint, shellcheck, ansible-playbook, ansible-galaxy) using the right channel per tool (system package manager, pip, npm, or GitHub release). Modules at this level are channel-agnostic primitives; per-tool policy lives one level down in lint/.

Structure

File Role
primitives.py Logging, sudo wrapping, PATH mutation, and stdlib-based URL download.
pip.py Venv-aware pip installer with --break-system-packages and --user fallback.
npm.py Global / local npm install with per-user --prefix fallback.
github_release.py Latest-tag resolver and asset downloader for GitHub releases.
system_pkg.py Per-manager dispatch for pacman / apt-get / dnf / yum / brew.
lint/ One module per tool, each exposing ensure(). See lint README.

The CLI entry point lives at __main__.py, invoked from lint.sh as python3 -m utils.install.lint. The matching dispatcher wrapper.sh routes make install-lint host vs container based on INFINITO_LINT_RUNNER.

File Naming

  • Module names MUST stay lowercase snake_case.
  • Channel-agnostic helpers MUST live directly under utils/install/.
  • Per-tool policy (one tool per file) MUST live under lint/ (see lint README).
  • Test files live in tests/unit/python/utils/install/ and mirror the module name with a test_ prefix.

Import Rules

  • primitives.py MUST NOT import from any other module in this package.
  • pip.py, npm.py, github_release.py, and system_pkg.py MAY import from primitives.py.
  • npm.py MAY import from system_pkg.py to bootstrap npm itself; no other cross-imports between these four are allowed.
  • Per-tool modules under lint/ MUST NOT import each other (see lint README).