chore: use dependency-groups for dev (#2287)

# What does this PR do?

The previous `[project.optional-dependencies]` was misrepresenting what
the packages were. They were NOT optional dependencies to the project
but development dependencies. Unlike optional dependencies, development
dependencies are local-only and will not be included in the project
requirements when published to PyPI or other indexes. As such,
development dependencies are not included in the [project] table.
Additionally, the dev group is synced by default.

Source:

https://docs.astral.sh/uv/concepts/projects/dependencies/#development-dependencies

Signed-off-by: Sébastien Han <seb@redhat.com>
This commit is contained in:
Sébastien Han 2025-05-27 23:00:17 +02:00 committed by GitHub
parent 484abe3116
commit 4f3f28f718
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 96 additions and 79 deletions

View file

@ -13,7 +13,7 @@ runs:
- name: Install dependencies - name: Install dependencies
shell: bash shell: bash
run: | run: |
uv sync --all-extras uv sync --all-groups
uv pip install ollama faiss-cpu uv pip install ollama faiss-cpu
# always test against the latest version of the client # always test against the latest version of the client
# TODO: this is not necessarily a good idea. we need to test against both published and latest # TODO: this is not necessarily a good idea. we need to test against both published and latest

View file

@ -61,6 +61,7 @@ repos:
"--frozen", "--frozen",
"--no-hashes", "--no-hashes",
"--no-emit-project", "--no-emit-project",
"--no-default-groups",
"--output-file=requirements.txt" "--output-file=requirements.txt"
] ]
@ -89,7 +90,7 @@ repos:
name: Distribution Template Codegen name: Distribution Template Codegen
additional_dependencies: additional_dependencies:
- uv==0.7.8 - uv==0.7.8
entry: uv run --extra codegen ./scripts/distro_codegen.py entry: uv run --group codegen ./scripts/distro_codegen.py
language: python language: python
pass_filenames: false pass_filenames: false
require_serial: true require_serial: true
@ -98,7 +99,7 @@ repos:
name: API Spec Codegen name: API Spec Codegen
additional_dependencies: additional_dependencies:
- uv==0.7.8 - uv==0.7.8
entry: sh -c 'uv run --with ".[dev]" ./docs/openapi_generator/run_openapi_generator.sh > /dev/null' entry: sh -c 'uv run ./docs/openapi_generator/run_openapi_generator.sh > /dev/null'
language: python language: python
pass_filenames: false pass_filenames: false
require_serial: true require_serial: true

View file

@ -42,6 +42,14 @@ dependencies = [
] ]
[project.optional-dependencies] [project.optional-dependencies]
ui = [
"streamlit",
"pandas",
"llama-stack-client>=0.2.8",
"streamlit-option-menu",
]
[dependency-groups]
dev = [ dev = [
"pytest", "pytest",
"pytest-timeout", "pytest-timeout",
@ -112,12 +120,6 @@ docs = [
"sphinxcontrib.openapi", "sphinxcontrib.openapi",
] ]
codegen = ["rich", "pydantic", "jinja2>=3.1.6"] codegen = ["rich", "pydantic", "jinja2>=3.1.6"]
ui = [
"streamlit",
"pandas",
"llama-stack-client>=0.2.8",
"streamlit-option-menu",
]
[project.urls] [project.urls]
Homepage = "https://github.com/meta-llama/llama-stack" Homepage = "https://github.com/meta-llama/llama-stack"

View file

@ -1,5 +1,5 @@
# This file was autogenerated by uv via the following command: # This file was autogenerated by uv via the following command:
# uv export --frozen --no-hashes --no-emit-project --output-file=requirements.txt # uv export --frozen --no-hashes --no-emit-project --no-default-groups --output-file=requirements.txt
annotated-types==0.7.0 annotated-types==0.7.0
# via pydantic # via pydantic
anyio==4.8.0 anyio==4.8.0

View file

@ -10,10 +10,10 @@ PYTHON_VERSION=${PYTHON_VERSION:-3.10}
command -v uv >/dev/null 2>&1 || { echo >&2 "uv is required but it's not installed. Exiting."; exit 1; } command -v uv >/dev/null 2>&1 || { echo >&2 "uv is required but it's not installed. Exiting."; exit 1; }
uv python find $PYTHON_VERSION uv python find "$PYTHON_VERSION"
FOUND_PYTHON=$? FOUND_PYTHON=$?
if [ $FOUND_PYTHON -ne 0 ]; then if [ $FOUND_PYTHON -ne 0 ]; then
uv python install $PYTHON_VERSION uv python install "$PYTHON_VERSION"
fi fi
uv run --python $PYTHON_VERSION --with-editable . --with-editable ".[dev]" --with-editable ".[unit]" pytest --asyncio-mode=auto -s -v tests/unit/ $@ uv run --python "$PYTHON_VERSION" --with-editable . --group unit pytest --asyncio-mode=auto -s -v tests/unit/ $@

146
uv.lock generated
View file

@ -1477,6 +1477,14 @@ dependencies = [
] ]
[package.optional-dependencies] [package.optional-dependencies]
ui = [
{ name = "llama-stack-client" },
{ name = "pandas" },
{ name = "streamlit" },
{ name = "streamlit-option-menu" },
]
[package.dev-dependencies]
codegen = [ codegen = [
{ name = "jinja2" }, { name = "jinja2" },
{ name = "pydantic" }, { name = "pydantic" },
@ -1533,12 +1541,6 @@ test = [
{ name = "torchvision", version = "0.21.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, { name = "torchvision", version = "0.21.0+cpu", source = { registry = "https://download.pytorch.org/whl/cpu" }, marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" },
{ name = "transformers" }, { name = "transformers" },
] ]
ui = [
{ name = "llama-stack-client" },
{ name = "pandas" },
{ name = "streamlit" },
{ name = "streamlit-option-menu" },
]
unit = [ unit = [
{ name = "aiohttp" }, { name = "aiohttp" },
{ name = "aiosqlite" }, { name = "aiosqlite" },
@ -1555,89 +1557,101 @@ unit = [
[package.metadata] [package.metadata]
requires-dist = [ requires-dist = [
{ name = "aiohttp", marker = "extra == 'test'" },
{ name = "aiohttp", marker = "extra == 'unit'" },
{ name = "aiosqlite", marker = "extra == 'test'" },
{ name = "aiosqlite", marker = "extra == 'unit'" },
{ name = "autoevals", marker = "extra == 'test'" },
{ name = "black", marker = "extra == 'dev'" },
{ name = "blobfile", marker = "extra == 'unit'" },
{ name = "chardet", marker = "extra == 'test'" },
{ name = "chardet", marker = "extra == 'unit'" },
{ name = "datasets", marker = "extra == 'test'" },
{ name = "fastapi", marker = "extra == 'dev'" },
{ name = "fire" }, { name = "fire" },
{ name = "h11", specifier = ">=0.16.0" }, { name = "h11", specifier = ">=0.16.0" },
{ name = "httpx" }, { name = "httpx" },
{ name = "huggingface-hub" }, { name = "huggingface-hub" },
{ name = "jinja2", specifier = ">=3.1.6" }, { name = "jinja2", specifier = ">=3.1.6" },
{ name = "jinja2", marker = "extra == 'codegen'", specifier = ">=3.1.6" },
{ name = "jsonschema" }, { name = "jsonschema" },
{ name = "linkify", marker = "extra == 'docs'" },
{ name = "llama-stack-client", specifier = ">=0.2.8" }, { name = "llama-stack-client", specifier = ">=0.2.8" },
{ name = "llama-stack-client", marker = "extra == 'ui'", specifier = ">=0.2.8" }, { name = "llama-stack-client", marker = "extra == 'ui'", specifier = ">=0.2.8" },
{ name = "mcp", marker = "extra == 'test'" },
{ name = "mcp", marker = "extra == 'unit'" },
{ name = "myst-parser", marker = "extra == 'docs'" },
{ name = "nbval", marker = "extra == 'dev'" },
{ name = "openai", specifier = ">=1.66" }, { name = "openai", specifier = ">=1.66" },
{ name = "openai", marker = "extra == 'test'" },
{ name = "openai", marker = "extra == 'unit'" },
{ name = "opentelemetry-exporter-otlp-proto-http", marker = "extra == 'test'" },
{ name = "opentelemetry-exporter-otlp-proto-http", marker = "extra == 'unit'" },
{ name = "opentelemetry-sdk", marker = "extra == 'test'" },
{ name = "pandas", marker = "extra == 'ui'" }, { name = "pandas", marker = "extra == 'ui'" },
{ name = "pillow" }, { name = "pillow" },
{ name = "pre-commit", marker = "extra == 'dev'" },
{ name = "prompt-toolkit" }, { name = "prompt-toolkit" },
{ name = "pydantic", specifier = ">=2" }, { name = "pydantic", specifier = ">=2" },
{ name = "pydantic", marker = "extra == 'codegen'" },
{ name = "pypdf", marker = "extra == 'test'" },
{ name = "pypdf", marker = "extra == 'unit'" },
{ name = "pytest", marker = "extra == 'dev'" },
{ name = "pytest-asyncio", marker = "extra == 'dev'" },
{ name = "pytest-cov", marker = "extra == 'dev'" },
{ name = "pytest-html", marker = "extra == 'dev'" },
{ name = "pytest-json-report", marker = "extra == 'dev'" },
{ name = "pytest-timeout", marker = "extra == 'dev'" },
{ name = "python-dotenv" }, { name = "python-dotenv" },
{ name = "python-jose" }, { name = "python-jose" },
{ name = "qdrant-client", marker = "extra == 'unit'" },
{ name = "requests" }, { name = "requests" },
{ name = "rich" }, { name = "rich" },
{ name = "rich", marker = "extra == 'codegen'" },
{ name = "ruamel-yaml", marker = "extra == 'dev'" },
{ name = "ruff", marker = "extra == 'dev'" },
{ name = "setuptools" }, { name = "setuptools" },
{ name = "sphinx", marker = "extra == 'docs'" },
{ name = "sphinx-autobuild", marker = "extra == 'docs'" },
{ name = "sphinx-copybutton", marker = "extra == 'docs'" },
{ name = "sphinx-design", marker = "extra == 'docs'" },
{ name = "sphinx-rtd-dark-mode", marker = "extra == 'docs'" },
{ name = "sphinx-rtd-theme", marker = "extra == 'docs'" },
{ name = "sphinx-tabs", marker = "extra == 'docs'" },
{ name = "sphinxcontrib-mermaid", marker = "extra == 'docs'" },
{ name = "sphinxcontrib-openapi", marker = "extra == 'docs'" },
{ name = "sphinxcontrib-redoc", marker = "extra == 'docs'" },
{ name = "sphinxcontrib-video", marker = "extra == 'docs'" },
{ name = "sqlalchemy", marker = "extra == 'test'" },
{ name = "sqlalchemy", marker = "extra == 'unit'" },
{ name = "sqlalchemy", extras = ["asyncio"], marker = "extra == 'test'", specifier = ">=2.0.41" },
{ name = "sqlalchemy", extras = ["asyncio"], marker = "extra == 'unit'", specifier = ">=2.0.41" },
{ name = "sqlite-vec", marker = "extra == 'unit'" },
{ name = "streamlit", marker = "extra == 'ui'" }, { name = "streamlit", marker = "extra == 'ui'" },
{ name = "streamlit-option-menu", marker = "extra == 'ui'" }, { name = "streamlit-option-menu", marker = "extra == 'ui'" },
{ name = "termcolor" }, { name = "termcolor" },
{ name = "tiktoken" }, { name = "tiktoken" },
{ name = "tomli", marker = "extra == 'docs'" },
{ name = "torch", marker = "extra == 'test'", specifier = ">=2.6.0", index = "https://download.pytorch.org/whl/cpu" },
{ name = "torchvision", marker = "extra == 'test'", specifier = ">=0.21.0", index = "https://download.pytorch.org/whl/cpu" },
{ name = "transformers", marker = "extra == 'test'" },
{ name = "types-requests", marker = "extra == 'dev'" },
{ name = "types-setuptools", marker = "extra == 'dev'" },
{ name = "uvicorn", marker = "extra == 'dev'" },
] ]
provides-extras = ["dev", "unit", "test", "docs", "codegen", "ui"] provides-extras = ["ui"]
[package.metadata.requires-dev]
codegen = [
{ name = "jinja2", specifier = ">=3.1.6" },
{ name = "pydantic" },
{ name = "rich" },
]
dev = [
{ name = "black" },
{ name = "fastapi" },
{ name = "nbval" },
{ name = "pre-commit" },
{ name = "pytest" },
{ name = "pytest-asyncio" },
{ name = "pytest-cov" },
{ name = "pytest-html" },
{ name = "pytest-json-report" },
{ name = "pytest-timeout" },
{ name = "ruamel-yaml" },
{ name = "ruff" },
{ name = "types-requests" },
{ name = "types-setuptools" },
{ name = "uvicorn" },
]
docs = [
{ name = "linkify" },
{ name = "myst-parser" },
{ name = "sphinx" },
{ name = "sphinx-autobuild" },
{ name = "sphinx-copybutton" },
{ name = "sphinx-design" },
{ name = "sphinx-rtd-dark-mode" },
{ name = "sphinx-rtd-theme" },
{ name = "sphinx-tabs" },
{ name = "sphinxcontrib-mermaid" },
{ name = "sphinxcontrib-openapi" },
{ name = "sphinxcontrib-redoc" },
{ name = "sphinxcontrib-video" },
{ name = "tomli" },
]
test = [
{ name = "aiohttp" },
{ name = "aiosqlite" },
{ name = "autoevals" },
{ name = "chardet" },
{ name = "datasets" },
{ name = "mcp" },
{ name = "openai" },
{ name = "opentelemetry-exporter-otlp-proto-http" },
{ name = "opentelemetry-sdk" },
{ name = "pypdf" },
{ name = "sqlalchemy" },
{ name = "sqlalchemy", extras = ["asyncio"], specifier = ">=2.0.41" },
{ name = "torch", specifier = ">=2.6.0", index = "https://download.pytorch.org/whl/cpu" },
{ name = "torchvision", specifier = ">=0.21.0", index = "https://download.pytorch.org/whl/cpu" },
{ name = "transformers" },
]
unit = [
{ name = "aiohttp" },
{ name = "aiosqlite" },
{ name = "blobfile" },
{ name = "chardet" },
{ name = "mcp" },
{ name = "openai" },
{ name = "opentelemetry-exporter-otlp-proto-http" },
{ name = "pypdf" },
{ name = "qdrant-client" },
{ name = "sqlalchemy" },
{ name = "sqlalchemy", extras = ["asyncio"], specifier = ">=2.0.41" },
{ name = "sqlite-vec" },
]
[[package]] [[package]]
name = "llama-stack-client" name = "llama-stack-client"