Problem
The experimenter app and its integration-tests project manage Python dependencies with Poetry. We are standardizing the repo's Python projects on uv, which is now the best supported way to manage Python dependencies (faster installs, native Dependabot support). This completes the migration started with cirrus (#16174) and schemas (#16201).
Change
Both projects (/experimenter and /experimenter/tests):
- Convert
pyproject.toml from [tool.poetry] to PEP 621 [project] + [tool.uv] package = false.
- Replace
poetry.lock with uv.lock.
- Install dependencies via uv in the Dockerfiles (venv copied across build stages).
- Switch the Dependabot entries from
pip to uv.
To avoid sneaking dependency upgrades into the migration, both uv.locks are frozen to the exact versions from the pre-migration poetry.lock via a [tool.uv] constraint-dependencies block (0 version drift; the block is commented as a migration freeze to drop in a follow-up for controlled upgrades).
Integration-test plumbing (nimbus_integration_tests.sh, nimbus_rust_tests.sh, the Makefile fenix/ios enrollment targets, and the ios/fenix workflows) is switched from poetry -C ... install/run to uv sync/uv run, and pipx install poetry to astral-sh/setup-uv.
Two ruff adjustments follow from PEP 621 declaring the accurate requires-python (py311), not version bumps: import tomllib moves to the stdlib group in two files, and UP042 is added to the ruff ignore list (matching the existing UP006/UP007/UP045 ignores) rather than forcing a StrEnum rewrite.
Acceptance criteria
make check passes (lint + full pytest suite).
- The experimenter image builds and runs via uv.
- Integration/enrollment suites (Selenium, ios, fenix) pass in CI.
- Dependabot tracks both
uv.locks via the uv ecosystem.
┆Issue is synchronized with this Jira Task
Problem
The experimenter app and its integration-tests project manage Python dependencies with Poetry. We are standardizing the repo's Python projects on uv, which is now the best supported way to manage Python dependencies (faster installs, native Dependabot support). This completes the migration started with cirrus (#16174) and schemas (#16201).
Change
Both projects (
/experimenterand/experimenter/tests):pyproject.tomlfrom[tool.poetry]to PEP 621[project]+[tool.uv] package = false.poetry.lockwithuv.lock.piptouv.To avoid sneaking dependency upgrades into the migration, both
uv.locks are frozen to the exact versions from the pre-migrationpoetry.lockvia a[tool.uv] constraint-dependenciesblock (0 version drift; the block is commented as a migration freeze to drop in a follow-up for controlled upgrades).Integration-test plumbing (
nimbus_integration_tests.sh,nimbus_rust_tests.sh, the Makefile fenix/ios enrollment targets, and the ios/fenix workflows) is switched frompoetry -C ... install/runtouv sync/uv run, andpipx install poetrytoastral-sh/setup-uv.Two ruff adjustments follow from PEP 621 declaring the accurate
requires-python(py311), not version bumps:import tomllibmoves to the stdlib group in two files, andUP042is added to the ruff ignore list (matching the existing UP006/UP007/UP045 ignores) rather than forcing aStrEnumrewrite.Acceptance criteria
make checkpasses (lint + full pytest suite).uv.locks via theuvecosystem.┆Issue is synchronized with this Jira Task