From 5e3483ac3c0a3a60d669bddcfa97d0aea2010967 Mon Sep 17 00:00:00 2001 From: Robert Resch Date: Tue, 21 May 2024 09:56:31 +0200 Subject: [PATCH] Use uv instead of pip in development env (#113517) --- .devcontainer/devcontainer.json | 5 +++-- .vscode/tasks.json | 4 ++-- Dockerfile.dev | 19 ++++++++++++++----- script/bootstrap | 6 +++--- script/hassfest/requirements.py | 2 +- script/install_integration_requirements.py | 3 +-- script/monkeytype | 4 ++-- script/run-in-env.sh | 20 ++++++++++++-------- script/setup | 14 +++++++++++--- 9 files changed, 49 insertions(+), 28 deletions(-) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index cd4a7c4345a..77249f53642 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -5,7 +5,6 @@ "postCreateCommand": "script/setup", "postStartCommand": "script/bootstrap", "containerEnv": { - "DEVCONTAINER": "1", "PYTHONASYNCIODEBUG": "1" }, "features": { @@ -29,7 +28,9 @@ // Please keep this file in sync with settings in home-assistant/.vscode/settings.default.json "settings": { "python.experiments.optOutFrom": ["pythonTestAdapter"], - "python.pythonPath": "/usr/local/bin/python", + "python.defaultInterpreterPath": "/home/vscode/.local/ha-venv/bin/python", + "python.pythonPath": "/home/vscode/.local/ha-venv/bin/python", + "python.terminal.activateEnvInCurrentTerminal": true, "python.testing.pytestArgs": ["--no-cov"], "editor.formatOnPaste": false, "editor.formatOnSave": true, diff --git a/.vscode/tasks.json b/.vscode/tasks.json index d6657f04557..23126fd4b52 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -103,7 +103,7 @@ { "label": "Install all Requirements", "type": "shell", - "command": "pip3 install -r requirements_all.txt", + "command": "uv pip install -r requirements_all.txt", "group": { "kind": "build", "isDefault": true @@ -117,7 +117,7 @@ { "label": "Install all Test Requirements", "type": "shell", - "command": "pip3 install -r requirements_test_all.txt", + "command": "uv pip install -r requirements_test_all.txt", "group": { "kind": "build", "isDefault": true diff --git a/Dockerfile.dev b/Dockerfile.dev index 507cc9a7bb2..d7a2f2b7bf9 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -35,21 +35,30 @@ RUN \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* +# Install uv +RUN pip3 install uv + WORKDIR /usr/src # Setup hass-release RUN git clone --depth 1 https://github.com/home-assistant/hass-release \ - && pip3 install -e hass-release/ + && uv pip install --system -e hass-release/ -WORKDIR /workspaces +USER vscode +ENV VIRTUAL_ENV="/home/vscode/.local/ha-venv" +RUN uv venv $VIRTUAL_ENV +ENV PATH="$VIRTUAL_ENV/bin:$PATH" + +WORKDIR /tmp # Install Python dependencies from requirements COPY requirements.txt ./ COPY homeassistant/package_constraints.txt homeassistant/package_constraints.txt -RUN pip3 install -r requirements.txt +RUN uv pip install -r requirements.txt COPY requirements_test.txt requirements_test_pre_commit.txt ./ -RUN pip3 install -r requirements_test.txt -RUN rm -rf requirements.txt requirements_test.txt requirements_test_pre_commit.txt homeassistant/ +RUN uv pip install -r requirements_test.txt + +WORKDIR /workspaces # Set the default shell to bash instead of sh ENV SHELL /bin/bash diff --git a/script/bootstrap b/script/bootstrap index 506e259772c..e60342563ac 100755 --- a/script/bootstrap +++ b/script/bootstrap @@ -7,6 +7,6 @@ set -e cd "$(dirname "$0")/.." echo "Installing development dependencies..." -python3 -m pip install wheel --constraint homeassistant/package_constraints.txt --upgrade -python3 -m pip install colorlog $(grep awesomeversion requirements.txt) --constraint homeassistant/package_constraints.txt --upgrade -python3 -m pip install -r requirements_test.txt -c homeassistant/package_constraints.txt --upgrade +uv pip install wheel --constraint homeassistant/package_constraints.txt --upgrade +uv pip install colorlog $(grep awesomeversion requirements.txt) --constraint homeassistant/package_constraints.txt --upgrade +uv pip install -r requirements_test.txt -c homeassistant/package_constraints.txt --upgrade diff --git a/script/hassfest/requirements.py b/script/hassfest/requirements.py index 2c4ed47b158..f9a8ec2db92 100644 --- a/script/hassfest/requirements.py +++ b/script/hassfest/requirements.py @@ -268,7 +268,7 @@ def install_requirements(integration: Integration, requirements: set[str]) -> bo if is_installed: continue - args = [sys.executable, "-m", "pip", "install", "--quiet"] + args = ["uv", "pip", "install", "--quiet"] if install_args: args.append(install_args) args.append(requirement_arg) diff --git a/script/install_integration_requirements.py b/script/install_integration_requirements.py index fec893c008a..ab91ea71557 100644 --- a/script/install_integration_requirements.py +++ b/script/install_integration_requirements.py @@ -32,8 +32,7 @@ def main() -> int | None: requirements = gather_recursive_requirements(args.integration) cmd = [ - sys.executable, - "-m", + "uv", "pip", "install", "-c", diff --git a/script/monkeytype b/script/monkeytype index dc1894c91ed..02ee46a3035 100755 --- a/script/monkeytype +++ b/script/monkeytype @@ -8,11 +8,11 @@ cd "$(dirname "$0")/.." command -v pytest >/dev/null 2>&1 || { echo >&2 "This script requires pytest but it's not installed." \ - "Aborting. Try: pip install pytest"; exit 1; } + "Aborting. Try: uv pip install pytest"; exit 1; } command -v monkeytype >/dev/null 2>&1 || { echo >&2 "This script requires monkeytype but it's not installed." \ - "Aborting. Try: pip install monkeytype"; exit 1; } + "Aborting. Try: uv pip install monkeytype"; exit 1; } if [ $# -eq 0 ] then diff --git a/script/run-in-env.sh b/script/run-in-env.sh index 085e07bef84..c71738a017b 100755 --- a/script/run-in-env.sh +++ b/script/run-in-env.sh @@ -13,14 +13,18 @@ if [ -s .python-version ]; then export PYENV_VERSION fi -# other common virtualenvs -my_path=$(git rev-parse --show-toplevel) +if [ -n "${VIRTUAL_ENV}" ] && [ -f "${VIRTUAL_ENV}/bin/activate" ]; then + . "${VIRTUAL_ENV}/bin/activate" +else + # other common virtualenvs + my_path=$(git rev-parse --show-toplevel) -for venv in venv .venv .; do - if [ -f "${my_path}/${venv}/bin/activate" ]; then - . "${my_path}/${venv}/bin/activate" - break - fi -done + for venv in venv .venv .; do + if [ -f "${my_path}/${venv}/bin/activate" ]; then + . "${my_path}/${venv}/bin/activate" + break + fi + done +fi exec "$@" diff --git a/script/setup b/script/setup index a5c2d48b2b3..84ee074510a 100755 --- a/script/setup +++ b/script/setup @@ -16,15 +16,23 @@ fi mkdir -p config -if [ ! -n "$DEVCONTAINER" ] && [ ! -n "$VIRTUAL_ENV" ];then - python3 -m venv venv +if [ ! -n "$VIRTUAL_ENV" ]; then + if [ -x "$(command -v uv)" ]; then + uv venv venv + else + python3 -m venv venv + fi source venv/bin/activate fi +if ! [ -x "$(command -v uv)" ]; then + python3 -m pip install uv +fi + script/bootstrap pre-commit install -python3 -m pip install -e . --config-settings editable_mode=compat --constraint homeassistant/package_constraints.txt +uv pip install -e . --config-settings editable_mode=compat --constraint homeassistant/package_constraints.txt python3 -m script.translations develop --all hass --script ensure_config -c config