-
Notifications
You must be signed in to change notification settings - Fork 39
feat: migrate to uv #7669
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: migrate to uv #7669
Conversation
WalkthroughThe PR migrates project tooling from Poetry to uv across the repository. Dockerfiles, devcontainer scripts, and compose builds now install/use UV (UV_VER) and reference `uv.lock`; many commands changed from `poetry ...` to `uv ...` or `uv sync`. GitHub workflows, file filters, and CODEOWNERS were updated to use UV/infrahub_uv_files and UV_VERSION outputs. pyproject.toml files were restructured to PEP 621/Hatch (hatchling) build-system. Several service healthchecks switched from httpx to curl and `.venv/*` was added to .gitignore. Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
5568f1f to
0d7edf9
Compare
CodSpeed Performance ReportMerging #7669 will not alter performanceComparing Summary
|
a3e3947 to
aee50c7
Compare
.github/workflows/publish-pypi.yml
Outdated
| run: uv sync --all-groups --all-extras | ||
| - name: "Add PyPI secret" | ||
| run: "poetry config pypi-token.pypi ${{ secrets.PYPI_TOKEN }}" | ||
| run: "uv config token pypi ${{ secrets.PYPI_TOKEN }}" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks like this uv config came from some AI hallucination in the SDK repo..
root@c59566bd89ad:/# uv self version
uv 0.9.10
root@c59566bd89ad:/# uv config
error: unrecognized subcommand 'config'
Usage: uv [OPTIONS] <COMMAND>
For more information, try '--help'.
root@c59566bd89ad:/#There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good catch! Indeed, I thought it would be a good idea to copy the SDK PR...
I will fix this in both repos
db11269 to
15b660f
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
🧹 Nitpick comments (3)
tasks/backend.py (1)
51-52: Backend lint and test tasks correctly migrated touv runThe
ruff,mypy, and all pytest-based tasks now execute viauv run, which is consistent with the rest of the tooling migration and keeps arguments/coverage options unchanged. You may optionally align_format_ruffto also useuv run ruff ...for version consistency, but that’s not required for correctness.Also applies to: 62-63, 80-81, 90-91, 100-101, 110-111
tasks/main.py (1)
23-24: Main ruff tasks now correctly run underuvBoth the format and lint helpers now invoke ruff via
uv runwith the pyproject config, matching the new dependency tooling. The slight difference between{REPO_BASE / 'pyproject.toml'}and{REPO_BASE}/pyproject.tomlis only stylistic; you can normalize it later if you want consistent string building.Also applies to: 42-42
CLAUDE.md (1)
54-54: Grammar: Use a hyphen to join compound adjectives.Line 54 should read "user-wide" instead of "user wide" to properly join the compound adjective modifying "way". The updated text reads correctly otherwise.
Apply this diff to fix the grammar:
-Now we need to make sure we have a compatible version of Python that Infrahub can run on top of, uv to create virtual environment and Invoke to run commands. Invoke can be installed in many ways, but we recommend to use the `pipx` way to get it available user wide while without messing with the system Python. +Now we need to make sure we have a compatible version of Python that Infrahub can run on top of, uv to create virtual environment and Invoke to run commands. Invoke can be installed in many ways, but we recommend to use the `pipx` way to get it available user-wide while without messing with the system Python.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (4)
poetry.lockis excluded by!**/*.lockpython_testcontainers/poetry.lockis excluded by!**/*.lockpython_testcontainers/uv.lockis excluded by!**/*.lockuv.lockis excluded by!**/*.lock
📒 Files selected for processing (40)
.devcontainer/Dockerfile(1 hunks).devcontainer/onCreateCommand.sh(1 hunks).devcontainer/postCreateCommand.sh(1 hunks).devcontainer/updateContentCommand.sh(1 hunks).github/CODEOWNERS(1 hunks).github/copilot-instructions.md(1 hunks).github/file-filters.yml(3 hunks).github/instructions/python.instructions.md(1 hunks).github/instructions/tooling.instructions.md(1 hunks).github/workflows/ci-docker-image.yml(1 hunks).github/workflows/ci.yml(19 hunks).github/workflows/define-versions.yml(1 hunks).github/workflows/publish-pypi.yml(1 hunks).github/workflows/release.yml(1 hunks).github/workflows/update-compose-file-and-chart.yml(2 hunks).github/workflows/uv-check.yml(2 hunks).github/workflows/version-upgrade.yml(5 hunks).gitignore(1 hunks).vale/styles/spelling-exceptions.txt(1 hunks)CLAUDE.md(4 hunks)development/Dockerfile(3 hunks)development/docker-compose-deps-nats.yml(1 hunks)development/docker-compose-deps.yml(1 hunks)development/docker-compose.yml(2 hunks)docker-compose.yml(1 hunks)docs/docs/development/backend.mdx(5 hunks)docs/docs/development/git-best-practices.mdx(1 hunks)docs/docs/guides/installation.mdx(3 hunks)docs/docs/snippets/pre-reqs-base.mdx(1 hunks)pyproject.toml(2 hunks)python_testcontainers/infrahub_testcontainers/docker-compose-cluster.test.yml(1 hunks)python_testcontainers/infrahub_testcontainers/docker-compose.test.yml(1 hunks)python_testcontainers/pyproject.toml(2 hunks)tasks/backend.py(6 hunks)tasks/docs.py(1 hunks)tasks/main.py(2 hunks)tasks/release.py(1 hunks)tasks/schema.py(2 hunks)tasks/utils.py(3 hunks)utilities/scan.py(1 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
tasks/utils.py (1)
backend/infrahub/config.py (1)
load(990-1007)
.devcontainer/onCreateCommand.sh (1)
backend/infrahub/git/repository.py (1)
sync(64-122)
🪛 LanguageTool
docs/docs/development/backend.mdx
[grammar] ~54-~54: Use a hyphen to join words.
Context: ... the pipx way to get it available user wide while without messing with the syst...
(QB_NEW_EN_HYPHEN)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (9)
- GitHub Check: E2E-testing-version-upgrade / From 1.3.0
- GitHub Check: backend-benchmark
- GitHub Check: E2E-testing-playwright
- GitHub Check: backend-tests-unit
- GitHub Check: documentation
- GitHub Check: backend-tests-integration
- GitHub Check: backend-tests-functional
- GitHub Check: backend-docker-integration
- GitHub Check: Cloudflare Pages
🔇 Additional comments (48)
.vale/styles/spelling-exceptions.txt (1)
226-226: Correct alphabetical placement of new exception.The "uv" entry is correctly positioned alphabetically between "UUIDs" and "validator", and its addition aligns with the PR's migration to UV for Python dependency management.
tasks/docs.py (1)
180-180: Now let me verify UV configuration in the project and check that the migration is complete and consistent:Now let me check if there are any other
poetry runreferences in the file that should have been migrated:Change approved: Poetry-to-UV migration is correctly implemented.
The syntax change from
poetry run typertouv run typercorrectly replaces every instance ofpoetrywithuv run, which is the standard migration pattern. The invoke tasks in this file properly follow the convention wherepoetry run invokebecomesuv run typer, and UV's run command ensures the script is executed inside the virtual environment UV created. The typer dependency is properly declared in pyproject.toml (version 0.19.2), and UV will automatically manage the environment and dependencies without requiring additional configuration..devcontainer/postCreateCommand.sh (1)
5-5: LGTM!The command migration from
poetry run invoketouv run invokeis correct and preserves the arguments..github/instructions/tooling.instructions.md (1)
11-11: LGTM!Documentation update correctly reflects the migration to UV for Python dependency management.
.gitignore (1)
15-15: LGTM!Adding
.venv/*to gitignore is appropriate for UV's default virtual environment directory..devcontainer/updateContentCommand.sh (1)
4-12: LGTM!All four command invocations are correctly migrated from
poetry run invoketouv run invoke, preserving arguments and execution order.utilities/scan.py (1)
95-95: LGTM!Docstring example correctly updated to reflect UV usage.
.github/instructions/python.instructions.md (1)
17-18: LGTM!Documentation examples correctly updated to use
uv run invokeinstead ofpoetry run invoke.tasks/release.py (1)
83-83: Verified: UV command equivalence confirmed.UV's
uv sync --all-groupsprovides the same behavior as Poetry'spoetry install --sync: both synchronize the environment to the lockfile (install missing/locked packages and remove untracked/extraneous ones) while including all dependency groups. The migration is correct..github/CODEOWNERS (1)
5-5: uv.lock ownership entry looks correctAssigning
uv.lockto@opsmill/backendis consistent withpyproject.tomlownership and the Poetry→uv migration.development/docker-compose-deps-nats.yml (1)
35-35: Healthcheck migration to curl looks fineUsing
curl -s -f -o /dev/null ... || exit 1is a solid, Docker‑friendly healthcheck pattern; just ensure curl is present in${IMAGE_NAME}:${IMAGE_VER}as it is in your other images..github/file-filters.yml (1)
22-24: File filter anchor update is consistent with uv migrationThe new
infrahub_uv_filesanchor and its use inbackend_allande2e_allcorrectly tracks bothpyproject.tomlanduv.lockacross the repo, aligning filters with the new tooling.Also applies to: 71-71, 97-97
.devcontainer/onCreateCommand.sh (1)
5-9: Devcontainer uv setup flow looks reasonableRunning
uv sync --all-groupsfollowed byuv run invoke demo.pullmaintains the previous setup semantics while switching to uv, andgit submodule update --initremains in place between them. No issues from this change alone.tasks/schema.py (1)
25-25: Schema generation tasks correctly switched touv runAll three schema tasks now invoke the same underlying
infrahub devcommands viauv run, which is consistent with the rest of the migration and keeps behavior unchanged apart from using the uv-managed environment.Also applies to: 33-33, 56-56
tasks/utils.py (1)
12-12: Toml version helpers now correctly target[project]The updated error message aligns with uv usage, and both
project_ver()andget_version_from_pyproject()now read version data from the[project]table, which matches the new pyproject layout. Keeping a default inproject_ver()while havingget_version_from_pyproject()fail loudly on missing version is a sensible split.Also applies to: 53-53, 111-111
python_testcontainers/pyproject.toml (2)
4-4: Verify Python 3.9 support intentional removal.The requires-python constraint was tightened from
>=3.9to>=3.10. Confirm this breaking change is intentional and has been communicated to users/maintainers. If accidental, this should be reverted.
32-33: Entry-point migration looks correct.The pytest plugin entry-point was correctly migrated to PEP 621 format under
[project.entry-points.pytest11].docs/docs/snippets/pre-reqs-base.mdx (1)
5-5: Documentation update aligns with tooling migration.The prerequisite table was updated from Poetry to uv, and the post-installation step now references
uv syncinstead of Poetry's equivalent. This is consistent with the broader migration across the project..github/workflows/define-versions.yml (1)
7-8: Verify UV version 0.9.9 currency.Confirm that UV version 0.9.9 was the intended version at the time this PR was created. Consider checking against the latest released version to ensure the project isn't pinning an outdated build tool.
python_testcontainers/infrahub_testcontainers/docker-compose-cluster.test.yml (1)
199-203: Healthcheck migration to curl is appropriate.The change from httpx to curl improves portability and follows Docker best practices. The curl flags (
-s -f -o /dev/null) and retry configuration are correctly applied..github/copilot-instructions.md (1)
20-20: Documentation correctly reflects tooling transition.The AI agent instructions were updated to reference uv for dependency management and pyproject.toml for project configuration, aligning with the PEP 621 standard adopted in this migration.
docs/docs/guides/installation.mdx (2)
132-192: Installation guide correctly migrated to UV.The documentation comprehensively migrates from Poetry to UV commands with accurate equivalents:
uv sync --all-groupsreplacespoetry installuv runreplacespoetry runThe narrative and success messages are appropriately updated.
201-201: Command migration accurate.The command
uv run invoke demo.startcorrectly replaces the Poetry equivalent and preserves the invoke task invocation pattern.development/docker-compose.yml (1)
121-121: Build arguments consistently migrated to UV versioning.Both the
serverandtask-workerservices now referenceUV_VERinstead ofPOETRY_VER, with the version updated to0.9.9. This aligns with the workflow version output changes.Also applies to: 178-178
docker-compose.yml (1)
212-216: Healthcheck successfully migrated to curl.The task-manager healthcheck was updated from httpx to curl with correct flags (
-s -f -o /dev/null), matching the pattern used elsewhere in the migration. Timing configuration is preserved appropriately.docs/docs/development/git-best-practices.mdx (1)
231-242: Excellent documentation updates for UV migration.The command transitions are properly aligned:
uv sync --all-groupsreplaces Poetry's dependency installation for dev tasksuv run invoke <task>correctly wraps invoke commands with UV's execution context.github/workflows/uv-check.yml (2)
26-32: Validation approach is more rigorous than Poetry.The switch from
poetry checktouv lock --locked --offlineis an improvement—it ensures the lock file is in sync withpyproject.tomlwithout requiring network access. This provides better CI/CD reliability.
3-3: No action required—uv.lock file already exists and is committed to the repository.Verification confirms the repository contains
uv.lockat the root level, which is required for theuv lock --locked --offlinevalidation to function correctly. The workflow change frompoetry checkto UV validation is properly supported by the existing lock file..github/workflows/release.yml (2)
34-39: Verify UV command replacements with the project's pyproject.toml.The UV setup and dependency installation look correct and follow the pattern from other workflows.
44-47: Incorrect review comment:uv version --shortcorrectly retrieves the project version, not UV's own version.Since uv 0.7.0,
uv version --shortretrieves the project version, while UV's own version is obtained viauv self version. The workflow specifies UV version0.9.9, which is well above this threshold. The code in lines 44-47 is correct and will properly extract the project version frompyproject.toml.Likely an incorrect or invalid review comment.
development/docker-compose-deps.yml (1)
33-33: Verify curl is available in the task-manager Docker image.The healthcheck is updated from
httpxtocurlfor improved portability. Confirm thatcurlis included in the${IMAGE_NAME}:${IMAGE_VER}image used by the task-manager service..github/workflows/update-compose-file-and-chart.yml (1)
42-47: UV setup and invoke command patterns are correct.The UV setup, dependency installation, and
uv run invokecommand patterns follow the established conventions from other workflows and should function correctly once the version extraction issue is resolved.Also applies to: 57-57, 60-60, 62-62, 86-86
.github/workflows/ci-docker-image.yml (1)
52-52: No issues found—UV_VERSION is properly defined.Verification confirms that
define-versions.ymlcorrectly definesUV_VERSIONin its outputs section with the value"0.9.9". The reference toneeds.prepare-environment.outputs.UV_VERSIONin the workflow is valid..github/workflows/publish-pypi.yml (1)
52-57: No issues found—UV commands and configuration are correct.UV provides
uv buildfor building Python packages,uv publishfor publishing, and supportsUV_PUBLISH_TOKENfor authentication. All three concerns raised in the original review are confirmed valid by the official documentation. The workflow configuration is sound.python_testcontainers/infrahub_testcontainers/docker-compose.test.yml (1)
110-110: Curl is available in the Docker image — verification complete.The
opsmill/infrahubimage is built fromdevelopment/Dockerfilewith thebackendtarget, which inherits from thebasestage. Line 19 ofdevelopment/Dockerfileexplicitly installs curl as part of the base stage dependencies, ensuring it's available in the final image used by the healthcheck.CLAUDE.md (1)
16-16: Poetry-to-UV migration is consistent and accurate.All command references have been properly updated from Poetry to UV equivalents across this context file. The documentation now correctly reflects
uv sync --all-groups,uv run invoke, anduv run pytestpatterns. This aligns well with the broader migration across CI/CD workflows and other documentation files.Also applies to: 25-25, 28-28, 31-31, 34-36, 50-50, 53-53, 56-56, 63-63, 66-66, 111-112, 127-127
.github/workflows/version-upgrade.yml (2)
53-53: UV version environment setup looks correct.The workflow properly receives
UV_VERSIONfrom the prepare-environment job and installs UV using the officialastral-sh/setup-uv@v7action. This pattern is consistent across the CI workflows.Also applies to: 63-68
80-80: All task invocations properly wrapped withuv run.All
invokecommands throughout the workflow have been correctly updated from direct Poetry execution touv run invokepattern. This maintains consistency with the broader migration.Also applies to: 86-86, 92-92, 97-97, 103-103, 114-114, 117-117, 125-125, 128-128, 131-131, 139-139, 167-167
docs/docs/development/backend.mdx (1)
11-11: Documentation migration to UV is complete and accurate.The backend development guide has been thoroughly updated with correct UV equivalents. All Poetry commands (
poetry install,poetry run invoke, etc.) have been replaced with their UV counterparts (uv sync --all-groups,uv run invoke, etc.). The narrative text and tool descriptions are also properly updated.Also applies to: 54-54, 58-58, 71-71, 77-77, 83-83, 103-103, 128-128, 136-136
development/Dockerfile (1)
5-5: Docker UV integration is well-structured and optimized.The Dockerfile properly migrates to UV with several good practices:
- UV is installed via the official install script with version parameter (Line 28)
UV_PROJECT_ENVIRONMENTcorrectly sets the virtual environment path (Line 104)- Layer caching is optimized by separating dependency resolution from project installation, with cache mounts for
/root/.cache/uv(Lines 106, 112)--frozen --no-devflags ensure reproducible buildsuv.lockfiles properly replacepoetry.lockin COPY commands (Line 105)- PATH is explicitly configured to include venv binaries (Line 114)
Also applies to: 28-28, 104-106, 112-112, 114-114
.github/workflows/ci.yml (4)
50-50: Job and file filter naming properly updated.The CI workflow correctly renames the Poetry-based check job to
infrahub-uv-checkand updates the file filter output frominfrahub_poetry_filestoinfrahub_uv_files. The workflow reference has been properly updated to call./.github/workflows/uv-check.ymlinstead of the Poetry equivalent.Also applies to: 158-158, 160-160, 165-165
186-191: UV setup and dependency installation patterns are consistent throughout.All instances of Python environment setup and dependency installation follow the correct pattern:
astral-sh/setup-uv@v7action with version parameter from prepare-environment outputsuv sync --all-groupsfor complete dependency installation- Proper placement before any Python-based tasks
This pattern is consistently applied across all job definitions in the workflow.
Also applies to: 241-248, 290-297, 344-349, 391-396, 452-457, 536-543, 602-609, 628-635, 665-670, 702-709
195-195: All command invocations properly useuv runwrapper.Throughout the workflow, all task invocations have been correctly wrapped with
uv run:
uv run invokefor Invoke tasks (multiple lines)uv run pytestfor test execution (benchmarks section)uv version --shortfor version checking (Lines 195, 199)The migration from Poetry command execution to UV's command runner is comprehensive and consistent.
Also applies to: 199-199, 297-297, 351-351, 353-353, 398-398, 400-400, 459-459, 462-462, 515-515, 609-609, 635-635, 675-675, 709-709, 1104-1104, 1113-1113
789-789: UV_VERSION properly propagated through workflow matrix and environment.Environment variables correctly reference
needs.prepare-environment.outputs.UV_VERSIONacross different job contexts, including the E2E testing matrix (Line 789) and Docker integration tests (Line 424). This ensures consistent UV version usage throughout the CI pipeline.Also applies to: 424-424
pyproject.toml (4)
1-6: PEP 621 project metadata and dependencies properly structured.The migration from Poetry-specific format to PEP 621 is correctly implemented:
- Project metadata (name, version, description) properly moved to
[project]section- Authors converted to list-of-objects format (Line 5)
requires-pythonexplicitly specified (Line 6)- All dependencies converted to PEP 508 string format in a flat list (Lines 16-70)
- Dependency version constraints and comments preserved
Also applies to: 16-70
72-80: URL and UV source configurations correctly defined.Project URLs are properly organized in
[project.urls](Lines 72-75), and the new[tool.uv.sources]section (Lines 77-80) correctly specifies workspace and editable path dependencies for SDK and testcontainers. The[dependency-groups]section (Lines 82-113) properly consolidates dev dependencies that were previously under[tool.poetry.group.dev.dependencies].Also applies to: 82-113
128-133: Entry points and CLI scripts properly configured for PEP 621.CLI scripts are defined in
[project.scripts](Lines 122-126), and plugin entry points are properly registered in[project.entry-points.*]sections:
pytest11plugin entry (Line 128)prefect.collectionsentry (Line 132)This format is compatible with the new build system and UV's handling of entry points.
866-887: Build system migration to Hatchling is properly configured.The new build system correctly specifies:
[tool.hatch.build.targets.sdist]and[tool.hatch.build.targets.wheel]with proper package includes- Source path mappings in
[tool.hatch.build.targets.wheel.sources]to correctly place packages in the correct namespaces (Lines 880-883)build-systemsection updated to usehatchlingas build backend (Lines 886-887)The configuration ensures that all three packages (infrahub, infrahub_sdk, infrahub_testcontainers) are properly included in distributions.
15b660f to
00b8152
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Nitpick comments (5)
docs/docs/snippets/pre-reqs-base.mdx (1)
1-5: Confirm whetheruv syncoruv sync --all-groupsshould be the canonical quickstartThe prereqs snippet suggests
uv sync, while the backend guide recommendsuv sync --all-groups. If both are valid but serve different purposes, consider clarifying that distinction here; otherwise, it may be worth standardizing on a single command for consistency..devcontainer/onCreateCommand.sh (1)
5-9: Check ordering ofuv syncvs submodule initializationRunning
uv sync --all-groupsbeforegit submodule update --initcan fail on first setup if submodules (e.g.,python_sdk) weren’t cloned with--recursive, since workspace/path deps may be missing. Consider running the submodule update first, thenuv sync, to make the devcontainer more resilient to non-recursive clones.CLAUDE.md (1)
16-44: uv-centric assistant context looks good; update pyproject commentThe updated examples and tooling notes for
uv sync/uv run …align with the rest of the migration and should help keep generated commands consistent with reality. One small follow-up: in the project structure section,pyproject.tomlis still described as “Poetry configuration” even though the project has moved away from Poetry—consider renaming this to something like “Project configuration (PEP 621 / build backend)” to avoid confusion.Also applies to: 49-57, 62-67, 111-113, 127-128, 300-308
docs/docs/development/backend.mdx (1)
71-84: uv command examples are consistent; consider aligninginvoke pullThe updated examples for
uv run invoke dev.build/dev.deps/dev.status,INFRAHUB_LOG_LEVEL=CRITICAL uv run pytest -v …,uv run infrahubctl schema load …, anduv run invoke formatform a coherent uv-based workflow and match the rest of the PR.At the end of the file, the sentence “use
invoke pull” is slightly inconsistent with the earlier guidance to run Invoke tasks viauv run invoke …. If the intent is to always execute tasks in the uv-managed environment, you may want to update that example touv run invoke pullfor consistency (or briefly explain when plaininvokeis appropriate).Also applies to: 103-104, 128-129, 136-137, 157-157
pyproject.toml (1)
6-6: Standardizerequires-pythonversion constraint formatting.Line 6 has inconsistent spacing in the version specifier:
">=3.12, < 3.13". PEP 440 and common practice recommend removing spaces:">=3.12,<3.13".-requires-python = ">=3.12, < 3.13" +requires-python = ">=3.12,<3.13"
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (4)
poetry.lockis excluded by!**/*.lockpython_testcontainers/poetry.lockis excluded by!**/*.lockpython_testcontainers/uv.lockis excluded by!**/*.lockuv.lockis excluded by!**/*.lock
📒 Files selected for processing (40)
.devcontainer/Dockerfile(1 hunks).devcontainer/onCreateCommand.sh(1 hunks).devcontainer/postCreateCommand.sh(1 hunks).devcontainer/updateContentCommand.sh(1 hunks).github/CODEOWNERS(1 hunks).github/copilot-instructions.md(1 hunks).github/file-filters.yml(3 hunks).github/instructions/python.instructions.md(1 hunks).github/instructions/tooling.instructions.md(1 hunks).github/workflows/ci-docker-image.yml(1 hunks).github/workflows/ci.yml(19 hunks).github/workflows/define-versions.yml(1 hunks).github/workflows/publish-pypi.yml(1 hunks).github/workflows/release.yml(1 hunks).github/workflows/update-compose-file-and-chart.yml(2 hunks).github/workflows/uv-check.yml(2 hunks).github/workflows/version-upgrade.yml(5 hunks).gitignore(1 hunks).vale/styles/spelling-exceptions.txt(1 hunks)CLAUDE.md(4 hunks)development/Dockerfile(3 hunks)development/docker-compose-deps-nats.yml(1 hunks)development/docker-compose-deps.yml(1 hunks)development/docker-compose.yml(2 hunks)docker-compose.yml(1 hunks)docs/docs/development/backend.mdx(5 hunks)docs/docs/development/git-best-practices.mdx(1 hunks)docs/docs/guides/installation.mdx(3 hunks)docs/docs/snippets/pre-reqs-base.mdx(1 hunks)pyproject.toml(2 hunks)python_testcontainers/infrahub_testcontainers/docker-compose-cluster.test.yml(1 hunks)python_testcontainers/infrahub_testcontainers/docker-compose.test.yml(1 hunks)python_testcontainers/pyproject.toml(2 hunks)tasks/backend.py(6 hunks)tasks/docs.py(1 hunks)tasks/main.py(2 hunks)tasks/release.py(1 hunks)tasks/schema.py(2 hunks)tasks/utils.py(3 hunks)utilities/scan.py(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (26)
- .vale/styles/spelling-exceptions.txt
- .github/workflows/ci-docker-image.yml
- docs/docs/development/git-best-practices.mdx
- .github/workflows/uv-check.yml
- python_testcontainers/infrahub_testcontainers/docker-compose.test.yml
- docker-compose.yml
- .github/file-filters.yml
- tasks/main.py
- docs/docs/guides/installation.mdx
- utilities/scan.py
- .devcontainer/Dockerfile
- .devcontainer/updateContentCommand.sh
- development/docker-compose-deps.yml
- .github/workflows/define-versions.yml
- .github/workflows/version-upgrade.yml
- .github/CODEOWNERS
- development/docker-compose-deps-nats.yml
- python_testcontainers/pyproject.toml
- .gitignore
- development/docker-compose.yml
- tasks/schema.py
- tasks/release.py
- tasks/backend.py
- .github/instructions/python.instructions.md
- tasks/utils.py
- .github/workflows/publish-pypi.yml
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: fatih-acar
Repo: opsmill/infrahub PR: 7669
File: .github/workflows/update-compose-file-and-chart.yml:52-53
Timestamp: 2025-11-18T08:30:19.700Z
Learning: The `uv version` command returns the project version from pyproject.toml (since astral-sh/uv PR #12349). Use `uv version --short` to extract project version for version checks and comparisons in workflows. The old behavior (showing UV's own tool version) is now `uv self version`.
📚 Learning: 2025-11-18T08:30:19.700Z
Learnt from: fatih-acar
Repo: opsmill/infrahub PR: 7669
File: .github/workflows/update-compose-file-and-chart.yml:52-53
Timestamp: 2025-11-18T08:30:19.700Z
Learning: The `uv version` command returns the project version from pyproject.toml (since astral-sh/uv PR #12349). Use `uv version --short` to extract project version for version checks and comparisons in workflows. The old behavior (showing UV's own tool version) is now `uv self version`.
Applied to files:
.github/workflows/release.yml.github/workflows/update-compose-file-and-chart.ymlCLAUDE.md
🧬 Code graph analysis (1)
.devcontainer/onCreateCommand.sh (1)
backend/infrahub/git/repository.py (1)
sync(64-122)
🪛 LanguageTool
docs/docs/development/backend.mdx
[grammar] ~54-~54: Use a hyphen to join words.
Context: ... the pipx way to get it available user wide while without messing with the syst...
(QB_NEW_EN_HYPHEN)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (13)
- GitHub Check: E2E-testing-version-upgrade / From 1.3.0
- GitHub Check: backend-benchmark
- GitHub Check: E2E-testing-playwright
- GitHub Check: frontend-tests
- GitHub Check: documentation
- GitHub Check: validate-generated-documentation
- GitHub Check: backend-tests-functional
- GitHub Check: backend-tests-unit
- GitHub Check: backend-tests-integration
- GitHub Check: graphql-schema
- GitHub Check: json-schema
- GitHub Check: backend-docker-integration
- GitHub Check: Cloudflare Pages
🔇 Additional comments (14)
.github/copilot-instructions.md (1)
20-20: Documentation update accurately reflects UV migration.The backend workflow documentation has been correctly updated to reference UV for dependency management, replacing the previous Poetry-based guidance. This aligns with the PR's broader migration strategy and accurately reflects the current tooling.
python_testcontainers/infrahub_testcontainers/docker-compose-cluster.test.yml (1)
198-203: Healthcheck migration away from httpx to curl is appropriate.The change removes the Python httpx dependency from the healthcheck, aligning with the UV migration goal of reducing runtime Python dependencies. The curl command syntax is correct—
-s -f -o /dev/nullprovides silent operation with failure detection and suppressed output—and the endpoint/api/localhost:4200/api/healthmatches the task-manager's prefect server. The start_period grace of 10s is reasonable for service startup. This brings task-manager's healthcheck in line with infrahub-server (line 301).Verify that
curlis available in${INFRAHUB_TESTING_DOCKER_IMAGE}. Since this is part of a broader multi-file migration, this likely already holds across the codebase, but it's worth confirming in the image build..github/instructions/tooling.instructions.md (1)
11-11: Tooling guidance now aligned with uv migrationThe new bullet is clear and consistent with the rest of the repo’s move to uv for dependency management. Just keep this in sync with CLAUDE.md and other instruction docs if the workflow evolves.
.devcontainer/postCreateCommand.sh (1)
5-5: Post-create demo start via uv looks correctSwitching to
uv run invoke demo.start --waitaftergit pulland submodule update is consistent with the new tooling and should preserve previous behavior, assuming the on-create step has already runuv sync.tasks/docs.py (1)
170-181: CLI docs generation correctly migrated to uvReplacing
poetry run typerwithuv run typerin the CLI docs generator keeps semantics intact, provided the typer CLI dependency is installed via uv in the project environment.development/Dockerfile (1)
5-6: uv-based Docker build flow looks solid; ensureUV_VERis wired throughThe new stages (installing uv, using
UV_PROJECT_ENVIRONMENT="/.venv", and the two-stepuv syncfor dependencies + project) form a clean, cache-friendly pattern and should behave as intended. Just make sure all build entry points (docker-compose, CI, etc.) actually passUV_VERwhen you want a pinned tool version; otherwise this will install whatever the default script serves.Also applies to: 28-32, 102-107, 111-115
pyproject.toml (1)
1-887: Migration to PEP 621/Hatch format is comprehensive and well-structured.The pyproject.toml migration from Poetry to UV/Hatch is thorough:
- Metadata correctly migrated to [project] section with proper PEP 621 structure
- Dependencies converted to flat list format with version constraints preserved
- Development dependencies properly restructured under [dependency-groups]
- Entry points and scripts correctly declared
- Build system and Hatch configuration properly configured with wheel/sdist source mappings
- Tool-specific settings (pytest, mypy, ruff, etc.) preserved
.github/workflows/release.yml (1)
34-47: Version extraction and workflow setup correctly aligned with UV.The UV installation, dependency sync, and version extraction pattern is correct and aligns with recent UV changes. Per the learning provided,
uv version --shortnow correctly returns the project version frompyproject.toml(as of astral-sh/uv PR #12349), making the prerelease/devrelease and tag validation checks reliable.Please confirm this workflow executes successfully in your CI environment to ensure the version extraction works as expected with the updated UV behavior.
.github/workflows/update-compose-file-and-chart.yml (1)
42-53: Version extraction pattern correctly updated for UV.The migration from Poetry to UV is consistent with release.yml. The
uv version --shortcommand now returns the project version frompyproject.toml(per astral-sh/uv PR #12349), making the prerelease/devrelease status checks reliable. All invoke commands are properly wrapped withuv run.Verify that the conditional checks (lines 56, 59, 77, 85, 89) execute correctly when merging to the stable branch to ensure the docker-compose and helm chart updates are triggered at the right times.
.github/workflows/ci.yml (5)
158-167: Job renaming and workflow reference updated correctly.The rename from
infrahub-poetry-checktoinfrahub-uv-checkand corresponding file-filter output change is consistent and correct.
186-191: UV installation and dependency sync pattern is consistent.This pattern is used throughout the workflow and correctly sets up the UV environment. All instances follow the same convention of installing UV via
astral-sh/setup-uv@v7with the version fromprepare-environmentoutputs, followed byuv sync --all-groups.
290-296: UV setup pattern correctly replicated in backend-tests-unit job.The UV installation, dependency sync, and subsequent
uv run invokepattern is consistent with earlier jobs.
424-424: UV_VERSION environment variable correctly threaded through workflow.The
UV_VERSIONfromprepare-environment.outputs.UV_VERSIONis correctly passed to jobs that need it and used consistently inastral-sh/setup-uvversion constraints.Also applies to: 789-789
193-208: Version comparison logic verified and correct.The verification confirms both
pyproject.tomlfiles exist with matching versions (1.5.1). The code correctly usesuv version --shortin different working directories—at the root for infrahub and inpython_testcontainers/for the testcontainers project. Sinceuv version --shortreturns the project version from each directory'spyproject.toml, the comparison will work as intended without false failures.
| * [Python](https://www.python.org/) to be able to run the code | ||
| * [Invoke](https://www.pyinvoke.org/) to run some commands bundled with Infrahub | ||
| * [Poetry](https://python-poetry.org/) to manage our Python virtual environment | ||
| * [uv](https://docs.astral.sh/uv/) to manage our Python virtual environment | ||
| * [Docker](https://www.docker.com/) and its Compose extension to run dependencies such as the database, cache and queueing system | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Minor wording and hyphenation tweak around uv setup
The switch to uv in the tool list and setup instructions reads well and matches the rest of the changes. For polish, consider changing “available user wide” to “available user-wide” in the paragraph introducing pipx and Invoke.
Also applies to: 54-59
🤖 Prompt for AI Agents
In docs/docs/development/backend.mdx around lines 9 to 13 (and also apply the
same change at lines 54 to 59), update the wording in the paragraph introducing
pipx and Invoke by replacing the phrase "available user wide" with the
hyphenated form "available user-wide" to correct hyphenation and match
surrounding copy style.
00b8152 to
51e5cde
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
tasks/backend.py (1)
28-29: Update ruff commands to useuv runfor consistency.Verification confirms an inconsistency: tasks/backend.py lines 28–29 use bare
ruff formatandruff check --fix, while other commands in the same file (referenced in your note at lines 51, 62, 80, 90, 100, 110) useuv run. Additionally, tasks/main.py consistently prefixes these commands withuv run. For consistency with the uv migration and within the file itself, update lines 28–29 and any other bare ruff invocations in tasks/backend.py to useuv run.exec_cmd = f"uv run ruff format {MAIN_DIRECTORY} --config {REPO_BASE}/pyproject.toml && " exec_cmd += f"uv run ruff check --fix {MAIN_DIRECTORY} --config {REPO_BASE}/pyproject.toml"
♻️ Duplicate comments (1)
docs/docs/development/backend.mdx (1)
54-54: Hyphenation issue: "user wide" should be "user-wide".The phrase "available user wide" should use a hyphen: "available user-wide" to match standard English hyphenation rules for compound modifiers.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (4)
poetry.lockis excluded by!**/*.lockpython_testcontainers/poetry.lockis excluded by!**/*.lockpython_testcontainers/uv.lockis excluded by!**/*.lockuv.lockis excluded by!**/*.lock
📒 Files selected for processing (40)
.devcontainer/Dockerfile(1 hunks).devcontainer/onCreateCommand.sh(1 hunks).devcontainer/postCreateCommand.sh(1 hunks).devcontainer/updateContentCommand.sh(1 hunks).github/CODEOWNERS(1 hunks).github/copilot-instructions.md(1 hunks).github/file-filters.yml(3 hunks).github/instructions/python.instructions.md(1 hunks).github/instructions/tooling.instructions.md(1 hunks).github/workflows/ci-docker-image.yml(1 hunks).github/workflows/ci.yml(19 hunks).github/workflows/define-versions.yml(1 hunks).github/workflows/publish-pypi.yml(1 hunks).github/workflows/release.yml(1 hunks).github/workflows/update-compose-file-and-chart.yml(2 hunks).github/workflows/uv-check.yml(2 hunks).github/workflows/version-upgrade.yml(5 hunks).gitignore(1 hunks).vale/styles/spelling-exceptions.txt(1 hunks)CLAUDE.md(4 hunks)development/Dockerfile(3 hunks)development/docker-compose-deps-nats.yml(1 hunks)development/docker-compose-deps.yml(1 hunks)development/docker-compose.yml(2 hunks)docker-compose.yml(1 hunks)docs/docs/development/backend.mdx(5 hunks)docs/docs/development/git-best-practices.mdx(1 hunks)docs/docs/guides/installation.mdx(3 hunks)docs/docs/snippets/pre-reqs-base.mdx(1 hunks)pyproject.toml(2 hunks)python_testcontainers/infrahub_testcontainers/docker-compose-cluster.test.yml(1 hunks)python_testcontainers/infrahub_testcontainers/docker-compose.test.yml(1 hunks)python_testcontainers/pyproject.toml(2 hunks)tasks/backend.py(6 hunks)tasks/docs.py(1 hunks)tasks/main.py(2 hunks)tasks/release.py(1 hunks)tasks/schema.py(2 hunks)tasks/utils.py(3 hunks)utilities/scan.py(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (21)
- docs/docs/snippets/pre-reqs-base.mdx
- tasks/docs.py
- .gitignore
- development/docker-compose-deps-nats.yml
- .devcontainer/Dockerfile
- development/docker-compose.yml
- .devcontainer/postCreateCommand.sh
- tasks/utils.py
- .github/workflows/release.yml
- .devcontainer/updateContentCommand.sh
- .github/instructions/python.instructions.md
- CLAUDE.md
- .vale/styles/spelling-exceptions.txt
- tasks/main.py
- utilities/scan.py
- python_testcontainers/infrahub_testcontainers/docker-compose.test.yml
- python_testcontainers/infrahub_testcontainers/docker-compose-cluster.test.yml
- docker-compose.yml
- .github/workflows/version-upgrade.yml
- .github/copilot-instructions.md
- .github/workflows/update-compose-file-and-chart.yml
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: fatih-acar
Repo: opsmill/infrahub PR: 7669
File: .github/workflows/update-compose-file-and-chart.yml:52-53
Timestamp: 2025-11-18T08:30:19.700Z
Learning: The `uv version` command returns the project version from pyproject.toml (since astral-sh/uv PR #12349). Use `uv version --short` to extract project version for version checks and comparisons in workflows. The old behavior (showing UV's own tool version) is now `uv self version`.
📚 Learning: 2025-11-18T08:30:19.700Z
Learnt from: fatih-acar
Repo: opsmill/infrahub PR: 7669
File: .github/workflows/update-compose-file-and-chart.yml:52-53
Timestamp: 2025-11-18T08:30:19.700Z
Learning: The `uv version` command returns the project version from pyproject.toml (since astral-sh/uv PR #12349). Use `uv version --short` to extract project version for version checks and comparisons in workflows. The old behavior (showing UV's own tool version) is now `uv self version`.
Applied to files:
.github/workflows/define-versions.yml.github/workflows/uv-check.yml.github/workflows/publish-pypi.yml
🧬 Code graph analysis (1)
.devcontainer/onCreateCommand.sh (1)
backend/infrahub/git/repository.py (1)
sync(64-122)
🪛 LanguageTool
docs/docs/development/backend.mdx
[grammar] ~54-~54: Use a hyphen to join words.
Context: ... the pipx way to get it available user wide while without messing with the syst...
(QB_NEW_EN_HYPHEN)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
- GitHub Check: E2E-testing-version-upgrade / From 1.3.0
- GitHub Check: E2E-testing-playwright
- GitHub Check: backend-benchmark
- GitHub Check: documentation
- GitHub Check: validate-generated-documentation
- GitHub Check: backend-tests-functional
- GitHub Check: backend-tests-unit
- GitHub Check: backend-tests-integration
- GitHub Check: backend-docker-integration
- GitHub Check: Cloudflare Pages
🔇 Additional comments (26)
tasks/backend.py (3)
51-51: LGTM! The migration frompoetry runtouv runis correct.The updated commands maintain the same arguments and behavior while properly using the new uv tooling.
Also applies to: 62-62, 80-80, 90-90, 100-100, 110-110
151-151: Verify consistency: Should python invocation useuv runhere?The test_scale task uses a bare
pythoncommand, while other test tasks now useuv run pytest. Consider whether this should beuv run pythonto ensure it executes in the correct environment with proper dependencies.
229-230: I need to check the linting tasks at lines 51 and 62 to verify if they indeed useuv runand understand the consistency question.Let me inspect the actual code at the referenced lines to understand the context.
Add
uv runprefix to ruff commands in generation tasks for consistency with UV migration.The ruff invocations in generation tasks at lines 229-230, 308-309, 322-323, and 335-336 don't use the
uv runprefix, while ruff commands running project-related code should useuv runto ensure consistent execution within the project environment. If the linting tasks at lines 51 and 62 already use this pattern, the generation tasks should adopt the same approach for consistency across the UV migration.Recommended changes:
- Line 229:
execute_command(context=context, command=f"uv run ruff format {generated}")- Line 230:
execute_command(context=context, command=f"uv run ruff check --fix {generated}")- Apply the same pattern to lines 308-309, 322-323, and 335-336.
development/Dockerfile (4)
28-28: UV installation command looks correct.The installation command follows astral's official installation pattern. Ensure that
UV_VERis provided (e.g.,--build-arg UV_VER=v0.5.0) when invoking the build, as this ARG lacks a default value.
112-112: Layer caching strategy is well-structured.The two-stage
uv syncapproach (dependency-only layer, then full installation) is effective for Docker layer caching and aligns with build optimization best practices.
114-114: PATH configuration is correct.The PATH is correctly prepended with the venv bin directory, ensuring that venv-installed binaries take precedence. This aligns with the
UV_PROJECT_ENVIRONMENTsetting and is necessary for the runtime container.
104-106: No issues found —UV_PROJECT_ENVIRONMENTis the correct variable.The uv documentation confirms that
UV_PROJECT_ENVIRONMENTis the proper environment variable for configuring a project's environment path. The Dockerfile usage on line 104 is correct..github/instructions/tooling.instructions.md (1)
11-11: LGTM - Documentation updated to reflect UV migration.The tooling instructions now correctly reference UV as the Python project and dependency management tool, aligning with the broader migration across the repository.
development/docker-compose-deps.yml (1)
33-33: LGTM - Healthcheck migrated from httpx to curl.The switch from httpx (Python HTTP client) to curl reduces Python dependencies and uses a standard UNIX utility. The curl command is properly configured with appropriate flags (
-s -f -o /dev/null) and explicit exit code handling..github/CODEOWNERS (1)
5-5: LGTM - CODEOWNERS updated for UV lock file.The ownership for the dependency lock file has been correctly updated from
poetry.locktouv.lock, maintaining@opsmill/backendas the responsible team..devcontainer/onCreateCommand.sh (1)
7-9: LGTM - DevContainer commands migrated to UV.The setup commands have been correctly updated:
uv sync --all-groupsreplaces Poetry's virtualenv configuration and installation stepsuv run invoke demo.pullreplacespoetry run invoke demo.pullThe migration is clean and follows UV best practices.
docs/docs/development/git-best-practices.mdx (1)
231-243: LGTM - Test workflow updated with explicit dependency installation.The test preparation steps have been improved:
- Added explicit
uv sync --all-groupsfor dependency installation- All commands (
test,lint,format,backend.test) now useuv run invokeprefixThis provides clearer guidance and ensures dependencies are properly installed before testing.
.github/workflows/ci-docker-image.yml (1)
52-52: LGTM - Docker build workflow updated to use UV version.The environment variable has been correctly updated from
POETRY_VERSIONtoUV_VERSION, sourcing from theprepare-environmentjob output. This aligns with the version definition changes in.github/workflows/define-versions.yml.docs/docs/development/backend.mdx (1)
11-11: LGTM - Backend documentation comprehensively updated to UV.All command invocations and tooling references have been successfully migrated:
- Tool reference updated to UV (line 11)
- Environment setup uses
uv sync --all-groups(line 58)- All
invokecommands now useuv runprefix (lines 71, 77, 83, 136)- Direct Python tool invocations use
uv run(lines 103, 128)The documentation now provides accurate, UV-based guidance for backend development.
Also applies to: 58-58, 71-71, 77-77, 83-83, 103-103, 128-128, 136-136
.github/workflows/define-versions.yml (1)
7-8: I need to clarify the security vulnerability search. Since the context is the AstraluvPython package manager (from astral-sh/uv on GitHub, published on PyPI), let me search for known vulnerabilities in that specific package:UV version 0.9.9 is valid, current, and secure—no action required.
UV version 0.9.5 and newer address known tar parsing vulnerabilities, and ZIP parsing vulnerabilities were fixed in uv 0.8.6. Since 0.9.9 is after both fixes and the latest stable version, there are no known security vulnerabilities affecting this version.
.github/workflows/publish-pypi.yml (1)
52-68: Clean Poetry-to-uv migration in publishing workflow.The workflow correctly replaces Poetry-based setup with UV: uv is installed via
astral-sh/setup-uv@v7, dependencies are installed withuv sync --all-groups --all-extras, and the package is built and published usinguv buildanduv publish. TheUV_PUBLISH_TOKENenvironment variable is properly sourced from the PyPI token secret.python_testcontainers/pyproject.toml (1)
1-64: Successful PEP 621 and Hatchling migration for testcontainers package.The pyproject.toml is properly restructured from Poetry format to PEP 621 standard with Hatchling as the build backend. Metadata is correctly formatted (authors as structured object, URLs moved to
[project.urls]), dependencies are converted to the flat list format, and the[tool.hatch.build.targets.*]sections correctly specify which packages to include in distributions. The Python requirement>=3.10appropriately accommodates the package's multi-version test matrix.pyproject.toml (2)
1-70: Comprehensive PEP 621 migration with workspace and editable dependencies support.The main pyproject.toml is thoroughly migrated from Poetry to Hatchling. Project metadata, dependencies, and entry points follow PEP 621 standards. The new
[tool.uv.sources]section (lines 77–80) properly configures editable installs forinfrahub-sdkandinfrahub-testcontainersalongside the workspace reference. The[dependency-groups]section correctly organizes dev dependencies. Build target configuration includes proper source mappings for the multi-package workspace layout (backend, python_sdk, python_testcontainers).Also applies to: 77-80, 82-113, 122-133, 866-887
6-6: Consider relaxing Python version constraint to support 3.13.Line 6 specifies
requires-python = ">=3.12,<3.13", which only permits Python 3.12. This is unusually restrictive and may exclude users on Python 3.13+. The CI matrix (ci.yml) includes 3.13 and 3.14 test runs, suggesting broader compatibility intent. If the testcontainers package (which supports ≥3.10) is meant to integrate with the main package, confirm whether this constraint is intentional for the 1.5.1 release or if it should be relaxed to>=3.12,<3.14or similar.docs/docs/guides/installation.mdx (1)
132-132: Documentation correctly reflects uv tooling migration.Prerequisites updated to reference uv instead of Poetry (line 132), installation command updated to
uv sync --all-groups(line 187), and demo startup updated touv run invoke demo.start(line 201). Success messaging and supporting text appropriately reflect the new tooling. Commands and instructions are consistent with the uv migration across the codebase.Also applies to: 187-187, 201-201
.github/file-filters.yml (1)
22-24: File filter aliases correctly migrated to uv tooling.Alias
infrahub_poetry_filesrenamed toinfrahub_uv_files(line 22), and the lock file pattern updated frompoetry.locktouv.lock(line 24). References inbackend_allande2e_allsections (lines 71, 97) are correctly updated to use the new alias. This ensures CI workflows properly detect changes to pyproject.toml and uv.lock files.Also applies to: 71-71, 97-97
.github/workflows/uv-check.yml (1)
3-3: Workflow cleanly replaced Poetry check with uv lock validation.Workflow name, job name, and input descriptions updated to reflect uv (lines 3, 9, 14). UV installation via
astral-sh/setup-uv@v7retrieves the version fromprepare-environmentoutputs (lines 26–29). The validation commanduv lock --locked --offline(line 32) correctly replaces Poetry's consistency check by verifying that the lock file is up-to-date and all dependencies can be resolved without network access. This is a proper functional equivalent.Also applies to: 9-9, 14-14, 26-32
.github/workflows/ci.yml (3)
50-50: Output and workflow references correctly migrated to uv naming.Output variable renamed from
infrahub_poetry_filestoinfrahub_uv_files(line 50), and workflow jobinfrahub-uv-checkcorrectly calls the updated./.github/workflows/uv-check.ymlworkflow (line 165). This ensures the CI file-change detection and validation steps align with uv tooling.Also applies to: 158-167
193-209: Correct use ofuv version --shortto retrieve project version.Lines 195 and 199 correctly use
uv version --shortto extract the project version from pyproject.toml for the version comparison check. This follows the updated uv behavior (as per astral-sh/uv PR #12349), whereuv version --shortreturns the project version rather than the uv tool version (which is now accessed viauv self version). The version-mismatch validation logic properly ensures infrahub and infrahub-testcontainers maintain version parity. Based on learnings.
241-248: Pervasive and consistent uv migration across all CI job definitions.Throughout the workflow, UV is installed consistently using
astral-sh/setup-uv@v7withUV_VERSIONfromprepare-environment, dependencies are installed viauv sync --all-groups, and Poetry commands are replaced with their uv equivalents (uv run invoke ...,uv build,uv run pytest, etc.). TheUV_VERSIONenvironment variable is properly threaded through Docker integration (line 424) and benchmark jobs (lines 1089–1104). No commands reference the non-existentuv config(which was previously flagged in SDK PR) or other invalid uv subcommands. The migration is thorough and technically sound.Also applies to: 290-297, 344-353, 391-400, 452-462, 536-543, 602-609, 628-635, 665-675, 702-709, 789-789, 1089-1104
tasks/schema.py (1)
25-25: LGTM - changes verified.The migration from
poetry runtouv runis complete across the codebase. Nopoetry runusage remains, and the three schema generation commands intasks/schema.py(lines 25, 33, 56) follow the same established pattern used throughouttasks/main.pyandtasks/backend.py. TheinfrahubCLI is properly registered inpyproject.toml, anduvis configured in the project workspace via[tool.uv.sources].
| print(" - [release] Update local environment") | ||
| with context.cd(ESCAPED_REPO_PATH): | ||
| context.run("poetry install --sync") | ||
| context.run("uv sync --all-groups") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
Migration to uv looks correct.
The command change from poetry install --sync to uv sync --all-groups is appropriate. The uv sync command syncs the environment to match the lock file (equivalent to poetry's sync behavior), and --all-groups ensures all optional dependency groups are installed, which is suitable for release tasks that may require all dependencies.
Note that unlike the towncrier availability check (lines 74-78), there's no check for uv availability before running this command. While this is likely intentional as part of the migration, ensure that uv is available in all environments where this task is executed.
🏁 Script executed:
#!/bin/bash
# Description: Verify that other tasks in the repository have been similarly migrated to uv
# and check if there's a pattern for uv availability checks
# Search for any remaining poetry install commands in task files
rg -n "poetry install" --type=py -g 'tasks/**'
# Search for uv sync patterns to confirm migration consistency
rg -n "uv sync" --type=py -g 'tasks/**'
# Check if there are any uv availability checks elsewhere
rg -n "check_if_command_available.*uv" --type=py -g 'tasks/**'Length of output: 183
Now let me investigate the actual patterns used in the repository for handling command availability and dependencies:
Based on my verification, the migration from Poetry to uv is correct and follows the established pattern for this repository. The script search confirmed that:
- No remaining Poetry commands: There are no lingering
poetry installcommands in the tasks directory—the migration is complete - Consistent with uv patterns: The command
uv sync --all-groupsmatches the documented migration pattern from Poetry - No availability checks needed: uv is a system tool (like Poetry), and in typical CI/CD workflows (which is where release tasks run), uv availability is guaranteed by a setup action or pre-installation step, not by inline task checks
The --all-groups flag correctly ensures all optional dependency groups are installed, appropriate for release tasks that require comprehensive dependencies. The standard migration pattern shows poetry install --with docs becoming uv sync --group=docs, and typical CI workflows use uv sync --all-groups.
Migration to uv is correct and requires no changes.
[resolve_review_comment]
🏁 Script executed:
#!/bin/bash
# Check for command availability checks in the tasks directory
rg -n "shutil\.which|which\s*\(|command -v" --type=py tasks/
# Look for the towncrier check pattern mentioned in review
rg -n "towncrier" --type=py -B2 -A2 tasks/release.py
# Check for uv configuration in project root
fd -e toml -e yaml -e yml -e txt . --max-depth 1 | head -20Length of output: 1464
🏁 Script executed:
#!/bin/bash
# Check for command availability checks patterns in tasks
rg -n "shutil\.which|subprocess\.run.*which|command -v|find_spec" --type=py tasks/
# Look at the towncrier check implementation more carefully
rg -n "towncrier" -B5 -A5 --type=py tasks/release.pyLength of output: 1945
Add availability check for uv to match established pattern.
The codebase has an established pattern for checking external CLI tool availability using check_if_command_available() (used for towncrier and markdownlint-cli2). At line 83, uv sync --all-groups runs without this check, creating an inconsistency in error handling. If uv is not installed, the task will fail with an unclear error from context.run() instead of the graceful warning messages provided for other tools.
For consistency and better user experience, add a check before line 83:
has_uv = check_if_command_available(context=context, command_name="uv")
if not has_uv:
print("Warning, uv is not installed")
returnThis follows the pattern established in the same file for external dependencies.
🤖 Prompt for AI Agents
In tasks/release.py around line 83, the call to run "uv sync --all-groups" lacks
the established check for external CLI availability; add a pre-check using
check_if_command_available(context=context, command_name="uv"), and if it
returns False print "Warning, uv is not installed" and return early so the task
fails gracefully and matches the pattern used for towncrier/markdownlint-cli2.
51e5cde to
788d00f
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
♻️ Duplicate comments (1)
docs/docs/development/backend.mdx (1)
54-54: Fix hyphenation: "user wide" → "user-wide".The phrase "available user wide" should be hyphenated as "available user-wide" for correct grammar.
Apply this diff:
-Now we need to make sure we have a compatible version of Python that Infrahub can run on top of, uv to create virtual environment and Invoke to run commands. Invoke can be installed in many ways, but we recommend to use the `pipx` way to get it available user wide while without messing with the system Python. Assuming we have these utilities ready, we can run the following commands to build a proper Python environment: +Now we need to make sure we have a compatible version of Python that Infrahub can run on top of, uv to create virtual environment and Invoke to run commands. Invoke can be installed in many ways, but we recommend to use the `pipx` way to get it available user-wide while without messing with the system Python. Assuming we have these utilities ready, we can run the following commands to build a proper Python environment:
🧹 Nitpick comments (1)
.gitignore (1)
15-15: Approve the venv directory pattern; consider.venv/for consistency.The addition of
.venv/*properly supports the uv migration by ignoring the virtual environment directory that uv creates. However, the codebase already uses.direnv/(line 25) with a trailing slash pattern. For consistency, consider using.venv/instead, which is also slightly more idiomatic.- .venv/* + .venv/
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (4)
poetry.lockis excluded by!**/*.lockpython_testcontainers/poetry.lockis excluded by!**/*.lockpython_testcontainers/uv.lockis excluded by!**/*.lockuv.lockis excluded by!**/*.lock
📒 Files selected for processing (40)
.devcontainer/Dockerfile(1 hunks).devcontainer/onCreateCommand.sh(1 hunks).devcontainer/postCreateCommand.sh(1 hunks).devcontainer/updateContentCommand.sh(1 hunks).github/CODEOWNERS(1 hunks).github/copilot-instructions.md(1 hunks).github/file-filters.yml(3 hunks).github/instructions/python.instructions.md(1 hunks).github/instructions/tooling.instructions.md(1 hunks).github/workflows/ci-docker-image.yml(2 hunks).github/workflows/ci.yml(19 hunks).github/workflows/define-versions.yml(1 hunks).github/workflows/publish-pypi.yml(1 hunks).github/workflows/release.yml(1 hunks).github/workflows/update-compose-file-and-chart.yml(2 hunks).github/workflows/uv-check.yml(2 hunks).github/workflows/version-upgrade.yml(5 hunks).gitignore(1 hunks).vale/styles/spelling-exceptions.txt(1 hunks)CLAUDE.md(4 hunks)development/Dockerfile(3 hunks)development/docker-compose-deps-nats.yml(1 hunks)development/docker-compose-deps.yml(1 hunks)development/docker-compose.yml(2 hunks)docker-compose.yml(1 hunks)docs/docs/development/backend.mdx(5 hunks)docs/docs/development/git-best-practices.mdx(1 hunks)docs/docs/guides/installation.mdx(3 hunks)docs/docs/snippets/pre-reqs-base.mdx(1 hunks)pyproject.toml(2 hunks)python_testcontainers/infrahub_testcontainers/docker-compose-cluster.test.yml(1 hunks)python_testcontainers/infrahub_testcontainers/docker-compose.test.yml(1 hunks)python_testcontainers/pyproject.toml(2 hunks)tasks/backend.py(6 hunks)tasks/docs.py(1 hunks)tasks/main.py(2 hunks)tasks/release.py(1 hunks)tasks/schema.py(2 hunks)tasks/utils.py(3 hunks)utilities/scan.py(1 hunks)
✅ Files skipped from review due to trivial changes (1)
- .github/copilot-instructions.md
🚧 Files skipped from review as they are similar to previous changes (18)
- tasks/main.py
- .devcontainer/updateContentCommand.sh
- tasks/backend.py
- .vale/styles/spelling-exceptions.txt
- .github/instructions/python.instructions.md
- python_testcontainers/infrahub_testcontainers/docker-compose.test.yml
- docker-compose.yml
- .github/workflows/uv-check.yml
- tasks/release.py
- .github/workflows/publish-pypi.yml
- .github/instructions/tooling.instructions.md
- utilities/scan.py
- .github/file-filters.yml
- .github/CODEOWNERS
- development/docker-compose-deps.yml
- development/docker-compose.yml
- tasks/schema.py
- python_testcontainers/infrahub_testcontainers/docker-compose-cluster.test.yml
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: fatih-acar
Repo: opsmill/infrahub PR: 7669
File: .github/workflows/update-compose-file-and-chart.yml:52-53
Timestamp: 2025-11-18T08:30:19.721Z
Learning: The `uv version` command returns the project version from pyproject.toml (since astral-sh/uv PR #12349). Use `uv version --short` to extract project version for version checks and comparisons in workflows. The old behavior (showing UV's own tool version) is now `uv self version`.
📚 Learning: 2025-11-18T08:30:19.721Z
Learnt from: fatih-acar
Repo: opsmill/infrahub PR: 7669
File: .github/workflows/update-compose-file-and-chart.yml:52-53
Timestamp: 2025-11-18T08:30:19.721Z
Learning: The `uv version` command returns the project version from pyproject.toml (since astral-sh/uv PR #12349). Use `uv version --short` to extract project version for version checks and comparisons in workflows. The old behavior (showing UV's own tool version) is now `uv self version`.
Applied to files:
CLAUDE.md.github/workflows/version-upgrade.yml.github/workflows/release.yml.github/workflows/define-versions.ymltasks/utils.py.github/workflows/update-compose-file-and-chart.yml
🧬 Code graph analysis (1)
tasks/utils.py (1)
backend/infrahub/config.py (1)
load(1018-1035)
🪛 LanguageTool
docs/docs/development/backend.mdx
[grammar] ~54-~54: Use a hyphen to join words.
Context: ... the pipx way to get it available user wide while without messing with the syst...
(QB_NEW_EN_HYPHEN)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (11)
- GitHub Check: publish-docker-image / build
- GitHub Check: E2E-testing-version-upgrade / From 1.3.0
- GitHub Check: E2E-testing-playwright
- GitHub Check: documentation
- GitHub Check: validate-generated-documentation
- GitHub Check: backend-benchmark
- GitHub Check: backend-tests-functional
- GitHub Check: backend-tests-unit
- GitHub Check: backend-tests-integration
- GitHub Check: backend-docker-integration
- GitHub Check: Cloudflare Pages
🔇 Additional comments (42)
docs/docs/snippets/pre-reqs-base.mdx (1)
5-5: Documentation update looks good.The replacement of the Poetry entry with the uv entry is accurate and consistent with the broader Poetry-to-uv migration. The
uv sync --all-groupscommand correctly installs all dependency groups, and the link format is consistent with other prerequisite tools documented in this snippet.docs/docs/guides/installation.mdx (3)
130-134: Prerequisites update is clear and correct.The replacement of Poetry with uv in the prerequisites section is appropriate. The link to
https://docs.astral.sh/uv/provides current official documentation for new developers.
184-192: Installation and success messaging align well with uv migration.The commands and narrative text are correctly updated.
uv sync --all-groupsis semantically equivalent to the previous Poetry install, and the success message appropriately references uv.Please confirm that all dependency groups referenced by
--all-groupsare properly defined in the project'spyproject.tomlto ensure the command succeeds for developers following this guide.
201-201: Demo start command correctly updated.The change from
poetry run invoke demo.starttouv run invoke demo.startis appropriate. This aligns with uv's task execution model.development/docker-compose-deps-nats.yml (1)
35-35: Verify that the infrahub image has curl installed.The healthcheck was changed from httpx (Python) to curl, which aligns with removing Python dependencies. However, if the infrahub image (referenced as
${IMAGE_NAME}:${IMAGE_VER}) doesn't have curl installed, the healthcheck will fail, and the task-manager service won't be marked as healthy. This could cause service startup and orchestration issues.Please verify one of the following:
- Confirm curl is available in the image by checking the Dockerfile or image definition for the infrahub service to ensure curl is installed.
- Run the container and verify the healthcheck passes after startup.
Additionally, note that other services in this file use
wgetfor healthchecks (message-queue, cache). If curl is not already a standard tool in the infrahub image, consider using wget instead to maintain consistency within this compose file..github/workflows/ci-docker-image.yml (1)
52-52: The review comment is incorrect.The original concern flagged the potential misuse of
uv versioncommand (which now returns project version instead of UV tool version). However, examination ofdefine-versions.ymlreveals it does not execute any dynamic version extraction. Instead, it simply outputs a hardcoded value:UV_VERSION: "0.9.9". There are nouv version,uv self version, or similar commands in the workflow.The ci-docker-image.yml correctly consumes this output and passes it to the Docker build as the
UV_VERargument (lines 52 and 89-90). The issue described in the review comment does not exist in the codebase.Likely an incorrect or invalid review comment.
.devcontainer/postCreateCommand.sh (1)
5-5: LGTM!The command migration from Poetry to UV is correct and maintains the same functionality.
.devcontainer/Dockerfile (1)
39-41: LGTM!The UV installation is properly configured with the build argument defined and the PATH correctly updated in
.bashrc. This addresses the previous review concern about the missingUV_VERargument.tasks/docs.py (1)
180-180: LGTM!The command migration from
poetry run typertouv run typeris correct and maintains the same functionality for CLI documentation generation..devcontainer/onCreateCommand.sh (1)
7-9: LGTM!The migration from Poetry to UV is correctly implemented:
uv sync --all-groupsappropriately replacespoetry installfor dependency installationuv run invoke demo.pullcorrectly replaces the Poetry equivalentdocs/docs/development/git-best-practices.mdx (1)
231-243: LGTM!The documentation correctly reflects the migration to UV-based tooling:
- Added dependency installation step with
uv sync --all-groups- All test, lint, and format commands properly updated from
poetry runtouv runtasks/utils.py (3)
12-12: LGTM!The error message correctly guides users to UV-based installation, aligning with the repository's migration to UV tooling.
111-111: Consistent version reading path.This function correctly uses the same
["project"]["version"]path asproject_ver(), ensuring consistency across version retrieval functions.
53-53: Migration to PEP 621 format verified successfully.All
pyproject.tomlfiles have been updated correctly with the[project]table containingversionfields. Both./pyproject.tomland./python_testcontainers/pyproject.tomldefineversion = "1.5.2"in their[project]sections. The code change at tasks/utils.py:53 correctly accesses the new path with a fallback to"latest". No remnants of the old[tool.poetry]version path remain in the codebase.docs/docs/development/backend.mdx (2)
11-11: LGTM!The tool list correctly reflects the migration to UV for Python environment management.
58-58: LGTM!All commands have been correctly updated from Poetry to UV across the documentation:
- Environment setup:
uv sync --all-groups- Service management:
uv run invoke dev.*commands- Testing:
uv run pytest- Schema loading:
uv run infrahubctl schema load- Code formatting:
uv run invoke formatThe migration is comprehensive and consistent throughout the guide.
Also applies to: 71-71, 77-77, 83-83, 103-103, 128-128, 136-136
.github/workflows/update-compose-file-and-chart.yml (3)
42-47: UV setup and dependency installation are correctly configured.Standard UV installation pattern with
astral-sh/setup-uv@v7anduv sync --all-groupsproperly replaces Poetry setup. The UV_VERSION is correctly sourced from the prepare-environment job output.
52-53: Version extraction usinguv version --shortis correct.The implementation properly uses
uv version --shortto extract the project version frompyproject.tomlfor prerelease/devrelease checks. As per the learning from fatih-acar,uv version(post-PR #12349) correctly returns the project version, not UV's own tool version—the old behavior is nowuv self version.
57-57: Invoke task invocation through UV is correctly migrated.All
invoketask calls properly useuv run invoke <task>pattern, maintaining task semantics and conditional logic. Consistent with the Poetry → UV migration across the codebase.Also applies to: 60-60, 62-62, 86-86
CLAUDE.md (3)
16-16: Key Technologies section correctly updated to reflect UV.Documentation accurately reflects the dependency management tool change from Poetry to uv.
24-66: Development commands correctly updated to UV equivalents.All commands properly migrated:
uv syncfor dependency installation,uv run invokefor task execution,uv run pytestfor testing. Documentation mirrors actual tooling changes and is usable for developers following this guide.
111-112: Formatting, linting, and tooling guidance correctly updated.All references to UV-based command execution are accurate. Vale remains independent as appropriate. Documentation is complete and actionable.
Also applies to: 127-127
.github/workflows/version-upgrade.yml (2)
53-53: UV environment setup and dependency installation follow standard patterns.Correct integration of
astral-sh/setup-uv@v7with UV_VERSION sourced from prepare-environment job, followed byuv sync --all-groups. Consistent with other migrated workflows.Also applies to: 63-68
80-80: All invoke task invocations properly useuv run invokepattern.Comprehensive migration of demo and dev tasks maintains semantic correctness. Commands are consistently formatted across development, migration testing, and verification steps.
Also applies to: 86-86, 92-92, 97-97, 103-103, 114-114, 117-117, 125-125, 128-128, 131-131, 139-139, 167-167
development/Dockerfile (1)
104-114: UV environment configuration and dependency installation are correctly structured.
UV_PROJECT_ENVIRONMENTis properly set, dependency files are efficiently copied (layer cache benefit),uv sync --frozenensures reproducibility, and PATH is correctly updated to use the UV virtual environment. Docker layer caching with--mount=type=cacheis well-placed.python_testcontainers/pyproject.toml (3)
1-18: PEP 621 metadata migration is correctly structured.Project table properly declares metadata with
authorsas structured objects, appropriate Python version range (>=3.9), and comprehensive classifier coverage for Python 3.9–3.14. Metadata aligns with Hatchling build system expectations.
20-41: Dependency declarations and entry-points are correctly migrated to PEP 621 + UV.Dependencies maintained in flat array format;
[project.entry-points.pytest11]correctly replaces Poetry plugin registration;[dependency-groups]properly isolates dev dependencies for UV. No functional changes to dependency versions or constraints.
47-65: Hatch build configuration is correctly structured.Sdist and wheel targets include necessary Python packages and configuration files.
build-systemproperly declareshatchlingas the build backend. Configuration aligns with PEP 517/518 standards and Hatch conventions..github/workflows/release.yml (3)
34-39: UV installation and dependency sync follow standard patterns.Correct use of
astral-sh/setup-uv@v7with UV_VERSION sourced from prepare-environment job, followed byuv sync --all-groups. Consistent with workflow patterns.
44-47: Version extraction and prerelease checks correctly useuv version --short.All four version-related outputs (is_prerelease, is_devrelease, version, major_minor_version) properly extract project metadata via
uv version --short. As confirmed in the learning, this correctly returns the project version frompyproject.toml, enabling accurate release validation.
55-71: Release validation logic correctly gates downstream jobs.Tag validation, prerelease consistency, and release consistency checks properly use version outputs to ensure tagged releases match project metadata. Conditional logic is sound and prevents invalid releases.
.github/workflows/ci.yml (6)
50-50: File-change output name correctly updated toinfrahub_uv_files.Output migration from Poetry to UV naming is consistent. Note: This change requires a corresponding update in
.github/file-filters.ymlto define theinfrahub_uv_filesfilter. Please verify that file was updated as part of this PR.
158-165: UV-based check jobs correctly renamed and reference uv-check.yml workflow.Jobs
infrahub-uv-checkandinfrahub-testcontainers-uv-checkproperly replace Poetry equivalents and gate oninfrahub_uv_files. Workflow references to./.github/workflows/uv-check.ymlare consistent. Note: This requires.github/workflows/uv-check.ymlto exist and implement UV-based checks.Also applies to: 250-259
169-209: Testcontainers version validation correctly usesuv version --shortto enforce parity.UV setup and sync properly performed; version extraction via
uv version --shortis correct; validation logic ensures infrahub and infrahub-testcontainers versions match. Error messaging is clear and actionable.
241-248: Test job migrations to UV are consistently implemented.All test jobs (unit, integration, functional, testcontainers) properly install UV, sync dependencies with
uv sync --all-groups, and invoke tests viauv run pytestoruv run invoke. Pattern is uniform and correct across the CI workflow.Also applies to: 290-297, 344-353, 391-400
602-609: Schema validation jobs correctly migrated to UV.GraphQL and JSON schema validation jobs properly use UV installation, dependency sync, and
uv run invokefor schema validation tasks. Consistent with other migrated jobs.Also applies to: 628-635
665-675: Documentation and benchmark jobs correctly use UV for task execution.Documentation build and benchmark jobs properly install UV, sync dependencies, and invoke tasks via
uv run. Consistent with other workflow migrations.Also applies to: 1089-1113
pyproject.toml (5)
6-6: Verify intent of strict Python version constraint.Line 6 specifies
requires-python = ">=3.12,<3.13", which locks the project to Python 3.12 only and will fail on 3.13+. Classifiers (lines 10–14) only list Python 3.12. This is unusually restrictive. Is this intentional for therelease-1.6branch (version freeze), or should it be>=3.12,<3.14or broader to support newer Python versions?Also applies to: 10-14
16-70: Dependencies array correctly migrated to PEP 621 format.All dependencies preserved with original version constraints. Comprehensive set of packages properly declared for backend (neo4j, fastapi, uvicorn), SDK (rich, pyarrow), and auxiliary tools (prefect, structlog). No functional changes.
77-113: UV workspace sources and dependency-groups correctly configured.
[tool.uv.sources]properly defines workspace members with editable installs for SDK and testcontainers.[dependency-groups]correctly isolates dev dependencies. Configuration aligns with UV project management standards.
122-133: Entry-points correctly migrated from Poetry to PEP 621 format.CLI scripts, pytest plugins, and Prefect collections properly declared in corresponding
[project.*]sections. Plugin registration aligns with PEP 621 standards.
865-886: Hatch build configuration correctly handles workspace layout.Sdist and wheel targets include all Python packages. Wheel sources mapping correctly remaps workspace paths (e.g.,
backend/infrahub→infrahub) for proper packaging.build-systemcorrectly declareshatchlingbackend. Configuration enables multi-package distribution from workspace structure.
| UV_VERSION: | ||
| value: "0.9.9" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
Verify UV version is current and stable.
The workflow now outputs UV_VERSION as "0.9.9". Please confirm this is a stable, production-ready version suitable for your workflow requirements.
🌐 Web query:
What is the latest stable version of uv (Astral's Python package manager)?
💡 Result:
The latest stable uv release is 0.9.11 (released November 20, 2025). [1][2]
Sources:
[1] GitHub Releases — astral-sh/uv.
[2] astral-sh/uv repository.
Update UV_VERSION to 0.9.11 (latest stable, released November 20, 2025).
The latest stable uv release is 0.9.11, but the workflow specifies 0.9.9. Update .github/workflows/define-versions.yml line 8 to use 0.9.11.
🤖 Prompt for AI Agents
In .github/workflows/define-versions.yml around lines 7 to 8, the UV_VERSION is
set to "0.9.9"; update that value to "0.9.11" so the workflow uses the latest
stable uv release. Open the file, change the value for UV_VERSION from "0.9.9"
to "0.9.11", save and commit the change.
Signed-off-by: Fatih Acar <[email protected]>
httpx changed location since uv migration. We can now use curl since we now use the Infrahub image to run the task manager. Signed-off-by: Fatih Acar <[email protected]>
deepdiff is required for the infrahub upgrade CLI. Signed-off-by: Fatih Acar <[email protected]>
788d00f to
4066cc6
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
♻️ Duplicate comments (1)
docs/docs/development/backend.mdx (1)
11-12: UV-based backend commands are consistent; fix minor “user‑wide” wordingThe migration of backend docs to
uv sync --all-groupsanduv run invoke …/uv run pytest …matches the task definitions and the rest of the PR; the commands themselves look correct.One minor lingering wording nit at Line 54:
“get it available user wide”
Consider changing this to:
“get it available user-wide”
and simplifying the clause to something like:
“…to get it available user-wide without messing with the system Python.”
This was noted in a previous review and is purely stylistic.
Also applies to: 54-59, 71-72, 77-78, 83-84, 103-104, 128-129, 136-137
🧹 Nitpick comments (6)
.github/instructions/python.instructions.md (1)
17-18: UV-based format/lint commands look correct; consider tiny wording polishThe switch to
uv run invoke format/uv run invoke lintmatches the rest of the tooling and looks good. Optionally, you could capitalize the sentences (“You can format…”, “And you can validate…”) for consistency with surrounding prose..devcontainer/Dockerfile (1)
39-41: UV_VER ARG addition fixes the earlier devcontainer build issueDefining
ARG UV_VER=0.9.9and using it in the install URL resolves the earlier problem where$UV_VERwas undefined in this Dockerfile. The uv install flow is now consistent with the rest of the PR.If you want the PATH to be evaluated at shell startup rather than at build time, you could optionally switch the echo to single quotes:
RUN curl -sSL "https://astral.sh/uv/${UV_VER}/install.sh" | sh - \ && echo 'export PATH="$HOME/.local/bin:$PATH"' >> "$HOME/.bashrc"tasks/main.py (1)
23-24: Ruff tasks’ switch touv runis correct; only minor style nitUsing
uv run ruff … --config {REPO_BASE / 'pyproject.toml'}anduv run ruff check --diff …keeps the previous behavior while routing through uv’s environment, which aligns with the rest of the migration.If you want to tidy style, you could consistently use the
Path-join form for the config path in both places:config = REPO_BASE / "pyproject.toml" exec_cmd = f"uv run ruff format {' '.join(DIRECTORIES)} --config {config} && " exec_cmd += f"uv run ruff check --fix {' '.join(DIRECTORIES)} --config {config}" # ... exec_cmd = f"uv run ruff check --diff {' '.join(DIRECTORIES)} --config {config}"Also applies to: 42-42
.github/workflows/release.yml (1)
34-39: Release workflow’s switch to UV-based version detection looks sound; consider DRYinguv versionusageInstalling uv via
astral-sh/setup-uv@v7and using:
uv sync --all-groupsfor dependencies, anduv version --short(wrapped inuv run python -c "from packaging.version import Version; …") to computeis_prerelease,is_devrelease,version, andmajor_minor_versioncorrectly moves the release checks from Poetry to uv while keeping the existing semantics. Based on learnings,
uv version --shortnow returns the project version frompyproject.toml, so this wiring is appropriate.For readability and to avoid running
uv version --shortmultiple times in the same step, you might capture it once in a shell variable:VERSION="$(uv version --short)" echo is_prerelease=$(uv run python -c "from packaging.version import Version; print(int(Version('$VERSION').is_prerelease))") >> "$GITHUB_OUTPUT" echo is_devrelease=$(uv run python -c "from packaging.version import Version; print(int(Version('$VERSION').is_devrelease))") >> "$GITHUB_OUTPUT" echo "version=$VERSION" >> "$GITHUB_OUTPUT" echo major_minor_version=$(uv run python -c "from packaging.version import Version; v = Version('$VERSION'); print(f'{v.major}.{v.minor}')") >> "$GITHUB_OUTPUT"Also worth double-checking that
packagingis available in the synced environment used by this job.Also applies to: 44-47
CLAUDE.md (1)
16-17: UV-centric assistant instructions are aligned with the new toolingThe updates here (adding uv to key technologies, switching all the example commands to
uv sync/uv run invoke …/uv run pytest …, and calling out uv as the dependency manager in the Python guidelines) are consistent with the rest of the migration and match the actual task and workflow definitions. This should help keep AI-generated suggestions in sync with the current tooling.One small follow-up you might consider, although it’s outside the changed lines: in the project structure snippet,
pyproject.tomlis still labeled as “Poetry configuration”. Renaming that to something like “Python project configuration (PEP 621 / uv)” would better reflect the current setup.Also applies to: 24-37, 50-57, 62-67, 111-113, 127-128
.github/workflows/define-versions.yml (1)
7-8: Consider updating UV_VERSION to latest stable (0.9.11).The workflow currently specifies UV_VERSION as
0.9.9, but a more recent stable version,0.9.11, was released on November 20, 2025. While0.9.9is stable, updating to0.9.11ensures access to latest fixes and improvements.If version
0.9.9was intentionally pinned for release-1.6 stability, this comment can be disregarded. Otherwise, consider updating.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (4)
poetry.lockis excluded by!**/*.lockpython_testcontainers/poetry.lockis excluded by!**/*.lockpython_testcontainers/uv.lockis excluded by!**/*.lockuv.lockis excluded by!**/*.lock
📒 Files selected for processing (40)
.devcontainer/Dockerfile(1 hunks).devcontainer/onCreateCommand.sh(1 hunks).devcontainer/postCreateCommand.sh(1 hunks).devcontainer/updateContentCommand.sh(1 hunks).github/CODEOWNERS(1 hunks).github/copilot-instructions.md(1 hunks).github/file-filters.yml(3 hunks).github/instructions/python.instructions.md(1 hunks).github/instructions/tooling.instructions.md(1 hunks).github/workflows/ci-docker-image.yml(2 hunks).github/workflows/ci.yml(19 hunks).github/workflows/define-versions.yml(1 hunks).github/workflows/publish-pypi.yml(1 hunks).github/workflows/release.yml(1 hunks).github/workflows/update-compose-file-and-chart.yml(2 hunks).github/workflows/uv-check.yml(2 hunks).github/workflows/version-upgrade.yml(5 hunks).gitignore(1 hunks).vale/styles/spelling-exceptions.txt(1 hunks)CLAUDE.md(4 hunks)development/Dockerfile(3 hunks)development/docker-compose-deps-nats.yml(1 hunks)development/docker-compose-deps.yml(1 hunks)development/docker-compose.yml(2 hunks)docker-compose.yml(1 hunks)docs/docs/development/backend.mdx(5 hunks)docs/docs/development/git-best-practices.mdx(1 hunks)docs/docs/guides/installation.mdx(3 hunks)docs/docs/snippets/pre-reqs-base.mdx(1 hunks)pyproject.toml(2 hunks)python_testcontainers/infrahub_testcontainers/docker-compose-cluster.test.yml(1 hunks)python_testcontainers/infrahub_testcontainers/docker-compose.test.yml(1 hunks)python_testcontainers/pyproject.toml(2 hunks)tasks/backend.py(6 hunks)tasks/docs.py(1 hunks)tasks/main.py(2 hunks)tasks/release.py(1 hunks)tasks/schema.py(2 hunks)tasks/utils.py(3 hunks)utilities/scan.py(1 hunks)
✅ Files skipped from review due to trivial changes (1)
- utilities/scan.py
🚧 Files skipped from review as they are similar to previous changes (22)
- development/docker-compose.yml
- .github/instructions/tooling.instructions.md
- development/docker-compose-deps-nats.yml
- .devcontainer/postCreateCommand.sh
- docs/docs/guides/installation.mdx
- .devcontainer/updateContentCommand.sh
- tasks/release.py
- .github/file-filters.yml
- .gitignore
- docs/docs/development/git-best-practices.mdx
- docker-compose.yml
- development/docker-compose-deps.yml
- .github/workflows/ci-docker-image.yml
- python_testcontainers/infrahub_testcontainers/docker-compose.test.yml
- tasks/schema.py
- docs/docs/snippets/pre-reqs-base.mdx
- .devcontainer/onCreateCommand.sh
- tasks/utils.py
- tasks/docs.py
- .github/copilot-instructions.md
- .vale/styles/spelling-exceptions.txt
- python_testcontainers/infrahub_testcontainers/docker-compose-cluster.test.yml
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: fatih-acar
Repo: opsmill/infrahub PR: 7669
File: .github/workflows/update-compose-file-and-chart.yml:52-53
Timestamp: 2025-11-18T08:30:19.721Z
Learning: The `uv version` command returns the project version from pyproject.toml (since astral-sh/uv PR #12349). Use `uv version --short` to extract project version for version checks and comparisons in workflows. The old behavior (showing UV's own tool version) is now `uv self version`.
📚 Learning: 2025-11-18T08:30:19.721Z
Learnt from: fatih-acar
Repo: opsmill/infrahub PR: 7669
File: .github/workflows/update-compose-file-and-chart.yml:52-53
Timestamp: 2025-11-18T08:30:19.721Z
Learning: The `uv version` command returns the project version from pyproject.toml (since astral-sh/uv PR #12349). Use `uv version --short` to extract project version for version checks and comparisons in workflows. The old behavior (showing UV's own tool version) is now `uv self version`.
Applied to files:
.github/workflows/uv-check.yml.github/workflows/release.yml.github/workflows/update-compose-file-and-chart.yml.github/workflows/version-upgrade.yml.github/workflows/publish-pypi.yml.github/workflows/define-versions.ymlCLAUDE.md
🪛 LanguageTool
docs/docs/development/backend.mdx
[grammar] ~54-~54: Use a hyphen to join words.
Context: ... the pipx way to get it available user wide while without messing with the syst...
(QB_NEW_EN_HYPHEN)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (11)
- GitHub Check: E2E-testing-version-upgrade / From 1.3.0
- GitHub Check: backend-benchmark
- GitHub Check: frontend-tests
- GitHub Check: E2E-testing-playwright
- GitHub Check: validate-generated-documentation
- GitHub Check: backend-tests-integration
- GitHub Check: documentation
- GitHub Check: backend-tests-functional
- GitHub Check: backend-tests-unit
- GitHub Check: backend-docker-integration
- GitHub Check: Cloudflare Pages
🔇 Additional comments (21)
.github/CODEOWNERS (1)
5-5: LGTM: CODEOWNERS updated to trackuv.lockAssigning
uv.lockto@opsmill/backendis consistent with the backend ownership ofpyproject.tomland the migration away from Poetry.tasks/backend.py (2)
47-55: Ruff and mypy backend tasks correctly migrated touv runRouting the backend
ruffandmypytasks throughuv runkeeps execution inside the managed environment and matches the docs and other task modules. The commands and arguments are unchanged apart from the runner and look correct.Also applies to: 58-66
77-115: Backend pytest tasks’ switch touv run pytestpreserves behaviorFor
test_unit,test_core,test_integration, andtest_functional, changing the prefix from Poetry touv run pytestmaintains the same options (-n {NBR_WORKERS} -v --cov=infrahub …plus the optional--neo4jflag) while aligning with the uv-based environment setup described elsewhere. No functional regressions are apparent..github/workflows/update-compose-file-and-chart.yml (3)
42-47: LGTM—uv setup and dependencies installation look correct.The UV installation using
astral-sh/setup-uv@v7withUV_VERSIONfrom prepare-environment, followed byuv sync --all-groups, aligns with the broader migration strategy.
52-53: Version extraction usinguv version --shortis correct.Per learnings,
uv versionnow returns the project version frompyproject.toml(since astral-sh/uv PR #12349). The prerelease/devrelease checks are semantically sound.
57-57: Commands successfully migrated frompoetry runtouv run.All invoke task invocations (gen-config-env, update-docker-compose, update-test-containers, update-helm-chart) are properly switched to
uv run invoke ....Also applies to: 60-60, 62-62, 86-86
.github/workflows/publish-pypi.yml (2)
52-59: UV-based build and dependency setup looks correct.The migration from Poetry to UV (install uv, run
uv sync --all-groups --all-extras, useuv build) is correctly structured for building the package in matrix strategy.
64-68: The environment variableUV_PUBLISH_TOKENis confirmed as the correct name for authenticatinguv publishto PyPI. The workflow configuration is correct as written.development/Dockerfile (1)
104-114: UV environment configuration and PATH setup look correct.The
UV_PROJECT_ENVIRONMENT="/.venv"setting,uv syncinvocations with cache mounts, and final PATH adjustment to include/.venv/binare properly aligned with UV's project environment model..github/workflows/version-upgrade.yml (2)
63-68: UV setup and dependency installation follow established patterns.UV installation via
astral-sh/setup-uv@v7withUV_VERSIONfrom prepare-environment, followed byuv sync --all-groups, is consistent with other workflows in the PR.
80-80: All invoke commands successfully migrated frompoetry runtouv run.The comprehensive test workflow correctly invokes demo, dev, and upgrade tasks via
uv run invoke <task>, maintaining the same argument structure and environment variable configuration as before.Also applies to: 86-86, 92-92, 97-97, 103-103, 114-114, 117-117, 125-125, 128-128, 131-131, 139-139, 167-167
python_testcontainers/pyproject.toml (2)
1-42: PEP 621 and Hatch migration is correctly structured.The migration from Poetry to Hatch/PEP 621 standard is sound:
[project]metadata andauthorsformatting updated correctly[dependencies]properly flattened from Poetry's map format[dependency-groups]correctly defines dev dependencies[project.entry-points.pytest11]and[project.urls]sections properly migrated
47-65: Hatch build targets and backend configuration look correct.The
[tool.hatch.build.targets.*]sections properly specify which packages to include in sdist and wheel distributions, and[build-system]correctly declareshatchlingas the build backend.pyproject.toml (5)
1-20: PEP 621 project metadata correctly structured.The migration from Poetry's
[tool.poetry]to PEP 621's[project]is correctly implemented with proper metadata, authors format, requires-python constraint, and classifiers.
72-80:[project.urls]and[tool.uv.sources]sections properly configured.Homepage, Repository, and Documentation URLs are correctly moved to
[project.urls]. The[tool.uv.sources]workspace references for infrahub-sdk and infrahub-testcontainers (marked as editable/path) are correctly set up for local development.
82-113:[dependency-groups]correctly defines development dependencies.The dev group is properly structured with extensive tooling (ruff, mypy, pytest, pre-commit, etc.), replacing the former
[tool.poetry.group.dev.dependencies]pattern.
122-134:[project.scripts]and[project.entry-points]sections correctly migrated.Scripts (infrahub, infrahub-git-credential, infrahubctl) and entry-points (pytest11, prefect.collections) are properly relocated from
[tool.poetry.scripts]and[tool.poetry.plugins]to their PEP 621 equivalents.
865-886: Hatch build targets and backend configuration correctly specified.
[tool.hatch.build.targets.sdist],[tool.hatch.build.targets.wheel], and[tool.hatch.build.targets.wheel.sources]properly define which source paths map to importable packages.[build-system]correctly specifieshatchling.buildas the backend..github/workflows/uv-check.yml (1)
3-9: UV-check workflow correctly migrated from poetry-check.The workflow name, description, and validation logic are properly updated to use
uv lock --locked --offlineinstead ofpoetry check. The--lockedand--offlineflags provide stricter validation that ensures the lock file is current and consistent without requiring network access.Also applies to: 26-32
.github/workflows/ci.yml (2)
186-199:uv version --shortcorrectly extracts project version per latest uv behavior.The version comparison logic at lines 195 and 199 is properly using
uv version --shortto extract the project version from pyproject.toml in each directory. Based on the learnings provided, this aligns with recent changes to the uv tool (astral-sh/uv PR #12349) whereuv versionnow returns the project version rather than the tool version.
50-50: Migration to uv is comprehensive and consistent.The transition from Poetry to uv across the CI workflow is well-executed:
- Output references correctly updated from
infrahub_poetry_filestoinfrahub_uv_files(line 50)- Job names and workflow references updated (
infrahub-uv-check,.github/workflows/uv-check.ymlat line 165)- All
poetry runinvocations replaced withuv runequivalents- All
uv synccalls include the--all-groupsflag consistentlyUV_VERSIONfromprepare-environmentoutputs is properly threaded through setup-uv steps across jobsThe migration logic is sound and aligns with best practices for the uv package manager.
Also applies to: 158-165, 186-296
| env: | ||
| INFRAHUB_DB_TYPE: neo4j | ||
| POETRY_VERSION: ${{ needs.prepare-environment.outputs.POETRY_VERSION }} | ||
| UV_VERSION: ${{ needs.prepare-environment.outputs.UV_VERSION }} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
Missing setup-uv step in E2E-testing-playwright job.
The UV_VERSION environment variable is set in the matrix (line 789), but there is no corresponding setup-uv action in the job's steps. Every other job that runs Python code or invoke tasks includes a setup-uv step to install the correct uv version. If the invoke tasks (e.g., invoke dev.build, invoke dev.start) rely on uv internally, this step is required.
Add the following step after setting up Python (around line 816) in the E2E-testing-playwright job:
- name: Set up Python
id: python
uses: actions/setup-python@v6
with:
python-version: 3.12
+ - name: Install uv
+ uses: astral-sh/setup-uv@v7
+ with:
+ version: ${{ needs.prepare-environment.outputs.UV_VERSION }}
+
- name: Install Invoke
run: pip install invokeI'll verify this review comment by examining the GitHub Actions workflow file to check if the E2E-testing-playwright job is indeed missing a setup-uv step.
---
🏁 Script executed:
```shell
#!/bin/bash
# Extract the E2E-testing-playwright job from the workflow file
cd /tmp && cat .github/workflows/ci.yml | grep -A 100 "E2E-testing-playwright:" | head -120
Length of output: 56
🏁 Script executed:
#!/bin/bash
# Search for all setup-uv steps in the workflow to see which jobs have them
rg -n "setup-uv" .github/workflows/ci.yml -A 2 -B 2Length of output: 2960
🏁 Script executed:
#!/bin/bash
# Get context around line 789 to understand the matrix and environment variables
sed -n '780,800p' .github/workflows/ci.ymlLength of output: 719
🏁 Script executed:
#!/bin/bash
# Get context around line 816 to see the Python setup and subsequent steps in E2E-testing-playwright
sed -n '810,840p' .github/workflows/ci.ymlLength of output: 1260
I need to check what invoke tasks are being called in the E2E-testing-playwright job to confirm whether they depend on uv.
---
🏁 Script executed:
```shell
#!/bin/bash
# Find invoke task calls within the E2E-testing-playwright job section (around lines 770-900)
sed -n '770,900p' .github/workflows/ci.yml | grep -i "invoke"
Length of output: 358
🏁 Script executed:
#!/bin/bash
# Get a broader view of the E2E-testing-playwright job steps to see all invoke calls
sed -n '770,950p' .github/workflows/ci.ymlLength of output: 6722
Now I need to verify if the invoke tasks actually depend on uv. Let me check the project configuration.
---
🏁 Script executed:
```shell
#!/bin/bash
# Check if there's a pyproject.toml or tasks.py that shows invoke dependencies on uv
fd -e "pyproject.toml" -o -e "tasks.py" -o -e "Taskfile" | head -5
Length of output: 116
🏁 Script executed:
#!/bin/bash
# Search for uv references in invoke task definitions
rg -i "uv" tasks.py tasks/ -A 2 -B 2 2>/dev/null | head -50Length of output: 2568
🏁 Script executed:
#!/bin/bash
# Check pyproject.toml for uv as a dependency or requirement
cat pyproject.toml | grep -A 5 -B 5 "uv"Length of output: 1068
Add missing setup-uv step to E2E-testing-playwright job.
The E2E-testing-playwright job sets UV_VERSION but lacks the corresponding setup-uv action. Verification confirms that invoke tasks called in this job internally use uv run and uv sync commands (found in tasks/schema.py, tasks/main.py, tasks/release.py, and tasks/utils.py). Without the setup-uv step, these commands will fail. All other jobs referencing UV_VERSION include this step consistently.
Add the step after Python setup (around line 817):
- name: Set up Python
id: python
uses: actions/setup-python@v6
with:
python-version: 3.12
+ - name: Install uv
+ uses: astral-sh/setup-uv@v7
+ with:
+ version: ${{ needs.prepare-environment.outputs.UV_VERSION }}
+
- name: Install Invoke
run: pip install invoke🤖 Prompt for AI Agents
In .github/workflows/ci.yml around lines 789–817 in the E2E-testing-playwright
job, the job exports UV_VERSION but never runs the corresponding setup-uv step;
add a step immediately after the Python setup step that runs the repository's
setup-uv action using the UV_VERSION value
(needs.prepare-environment.outputs.UV_VERSION) so that subsequent invoke tasks
that call `uv run`/`uv sync` succeed; ensure the step is inserted only in this
job and matches how other jobs invoke setup-uv (using the same action and input
name) to keep behavior consistent.
| # **************************************************************** | ||
| ARG PYTHON_VER=3.12 | ||
| ARG POETRY_VER | ||
| ARG UV_VER |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Critical: ARG UV_VER must have a default value or be passed as build-arg.
Line 5 declares ARG UV_VER without a default. If the build argument is not provided during docker build, line 28 will construct a malformed URL (https://astral.sh/uv//install.sh), causing the build to fail.
This issue was flagged in previous reviews and remains unresolved.
Recommended fix: Add a default value matching the UV version used in workflows:
-ARG UV_VER
+ARG UV_VER=0.9.9Alternatively, if UV_VER is intentionally required at build time, ensure your CI passes it explicitly via docker/build-push-action:
build-args: |
UV_VER=${{ env.UV_VERSION }}Also applies to: 28-28
🤖 Prompt for AI Agents
development/Dockerfile around line 5 and 28: ARG UV_VER is declared without a
default which can produce a malformed URL at line 28
(https://astral.sh/uv//install.sh) if the build-arg is not provided; fix by
either setting a sensible default value for ARG UV_VER (matching the UV version
used in workflows) on line 5 or ensure every CI/docker build invocation supplies
UV_VER via build-args (e.g., docker build --build-arg UV_VER=... or configure
docker/build-push-action to pass UV_VER from env) so the constructed URL is
valid.
Replaces #6209
Summary by CodeRabbit
✏️ Tip: You can customize this high-level summary in your review settings.