This is an automated email from the ASF dual-hosted git repository.
eladkal pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new c89ab99aced Recommend and use ``uv`` instead of ``pipx`` in a few
remaining places (#43866)
c89ab99aced is described below
commit c89ab99aced32c854a7806f3a2e00f8eaeb0764a
Author: Jarek Potiuk <[email protected]>
AuthorDate: Mon Nov 11 05:40:20 2024 +0100
Recommend and use ``uv`` instead of ``pipx`` in a few remaining places
(#43866)
The ``pipx`` has still been used and recommended in a few places
in our documentation and in a few scripts/github actions.
We also installed pipx in the container image to be able to run
mmsql-cli, but this is not needed any more as mssql is not
supported as metadata backend.
This PR updates the remaining parts.
---
.github/workflows/basic-tests.yml | 5 +-
.github/workflows/check-providers.yml | 8 +-
.github/workflows/news-fragment.yml | 2 +-
.github/workflows/task-sdk-tests.yml | 4 +-
Dockerfile.ci | 34 +----
INSTALL | 142 ++++++++-------------
contributing-docs/03_contributors_quick_start.rst | 51 ++++----
.../contributors_quick_start_gitpod.rst | 18 +--
dev/README_RELEASE_AIRFLOW.md | 42 +++---
dev/breeze/README.md | 18 +--
dev/breeze/doc/01_installation.rst | 61 +++++----
dev/breeze/doc/04_troubleshooting.rst | 19 ++-
dev/breeze/doc/10_advanced_breeze_topics.rst | 13 +-
.../doc/adr/0016-use-uv-tool-to-install-breeze.md | 56 ++++++++
dev/breeze/pyproject.toml | 1 -
dev/breeze/src/airflow_breeze/utils/path_utils.py | 8 +-
dev/breeze/src/airflow_breeze/utils/run_utils.py | 4 +-
.../installation/installing-from-pypi.rst | 4 +-
docs/docker-stack/changelog.rst | 3 +
scripts/ci/install_breeze.sh | 10 +-
scripts/ci/pre_commit/update_installers.py | 9 ++
scripts/docker/install_pipx_tools.sh | 43 -------
scripts/tools/setup_breeze | 30 ++---
23 files changed, 268 insertions(+), 317 deletions(-)
diff --git a/.github/workflows/basic-tests.yml
b/.github/workflows/basic-tests.yml
index 7930ba14890..d6b63510e89 100644
--- a/.github/workflows/basic-tests.yml
+++ b/.github/workflows/basic-tests.yml
@@ -187,9 +187,8 @@ jobs:
working-directory: ./airflow-client-python
- name: Install hatch
run: |
- python -m pip install --upgrade pipx
- pipx ensurepath
- pipx install hatch
+ python -m pip install --upgrade uv
+ uv tool install hatch
- name: Run tests
run: hatch run run-coverage
env:
diff --git a/.github/workflows/check-providers.yml
b/.github/workflows/check-providers.yml
index f5ff95b73c2..3faf19b61f5 100644
--- a/.github/workflows/check-providers.yml
+++ b/.github/workflows/check-providers.yml
@@ -102,8 +102,8 @@ jobs:
run: breeze release-management prepare-airflow-package
--version-suffix-for-pypi dev0
- name: "Verify wheel packages with twine"
run: |
- pipx uninstall twine || true
- pipx install twine && twine check dist/*.whl
+ uv tool uninstall twine || true
+ uv tool install twine && twine check dist/*.whl
- name: "Test providers issue generation automatically"
run: >
breeze release-management generate-issue-content-providers
@@ -170,8 +170,8 @@ jobs:
--version-suffix-for-pypi dev0 --package-format sdist
- name: "Verify sdist packages with twine"
run: |
- pipx uninstall twine || true
- pipx install twine && twine check dist/*.tar.gz
+ uv tool uninstall twine || true
+ uv tool install twine && twine check dist/*.tar.gz
- name: "Generate source constraints from CI image"
shell: bash
run: >
diff --git a/.github/workflows/news-fragment.yml
b/.github/workflows/news-fragment.yml
index 6691bf65f9d..31b0f51b1f2 100644
--- a/.github/workflows/news-fragment.yml
+++ b/.github/workflows/news-fragment.yml
@@ -38,7 +38,7 @@ jobs:
- name: Check news fragment
run: >
- pipx run towncrier check
+ uv tool run towncrier check
--dir .
--config newsfragments/config.toml
--compare-with origin/${{ github.base_ref }}
diff --git a/.github/workflows/task-sdk-tests.yml
b/.github/workflows/task-sdk-tests.yml
index d1d152648cb..acc9872e6ed 100644
--- a/.github/workflows/task-sdk-tests.yml
+++ b/.github/workflows/task-sdk-tests.yml
@@ -77,8 +77,8 @@ jobs:
breeze release-management prepare-task-sdk-package --package-format
wheel
- name: "Verify wheel packages with twine"
run: |
- pipx uninstall twine || true
- pipx install twine && twine check dist/*.whl
+ uv tool uninstall twine || true
+ uv tool install twine && twine check dist/*.whl
- name: >
Run unit tests for Airflow Task SDK:Python ${{ matrix.python-version
}}
run: >
diff --git a/Dockerfile.ci b/Dockerfile.ci
index 81f5ac0399b..5adb2d6210a 100644
--- a/Dockerfile.ci
+++ b/Dockerfile.ci
@@ -634,35 +634,6 @@ function common::import_trusted_gpg() {
}
EOF
-# The content below is automatically copied from
scripts/docker/install_pipx_tools.sh
-COPY <<"EOF" /install_pipx_tools.sh
-#!/usr/bin/env bash
-. "$( dirname "${BASH_SOURCE[0]}" )/common.sh"
-
-function install_pipx_tools() {
- echo
- echo "${COLOR_BLUE}Installing pipx tools${COLOR_RESET}"
- echo
- # Make sure PIPX is installed in latest version
- ${PACKAGING_TOOL_CMD} install ${EXTRA_INSTALL_FLAGS} --upgrade
"pipx>=1.2.1"
- if [[ $(uname -m) != "aarch64" ]]; then
- # Do not install mssql-cli for ARM
- # Install all the tools we need available in command line but without
impacting the current environment
- pipx install mssql-cli
-
- # Unfortunately mssql-cli installed by `pipx` does not work out of the
box because it uses
- # its own execution bash script which is not compliant with the
auto-activation of
- # pipx venvs - we need to manually patch Python executable in the
script to fix it: ¯\_(ツ)_/¯
- sed "s/python /\/root\/\.local\/pipx\/venvs\/mssql-cli\/bin\/python /"
-i /root/.local/bin/mssql-cli
- fi
-}
-
-common::get_colors
-common::get_packaging_tool
-
-install_pipx_tools
-EOF
-
# The content below is automatically copied from
scripts/docker/install_airflow.sh
COPY <<"EOF" /install_airflow.sh
#!/usr/bin/env bash
@@ -1381,13 +1352,10 @@ ENV AIRFLOW_PIP_VERSION=${AIRFLOW_PIP_VERSION} \
# The PATH is needed for PIPX to find the tools installed
ENV PATH="/root/.local/bin:${PATH}"
-COPY --from=scripts install_pipx_tools.sh /scripts/docker/
-
# Install useful command line tools in their own virtualenv so that they do
not clash with
# dependencies installed in Airflow also reinstall PIP and UV to make sure
they are installed
# in the version specified above
-RUN bash /scripts/docker/install_packaging_tools.sh; \
- bash /scripts/docker/install_pipx_tools.sh
+RUN bash /scripts/docker/install_packaging_tools.sh
# Airflow sources change frequently but dependency configuration won't change
that often
# We copy pyproject.toml and other files needed to perform setup of
dependencies
diff --git a/INSTALL b/INSTALL
index edf738f5e11..2a83248ad68 100644
--- a/INSTALL
+++ b/INSTALL
@@ -47,7 +47,8 @@ you get all sources in one place. This is the most convenient
way to develop Air
Otherwise, you have to install Airflow and Providers separately from sources
in the same environment, which
is not as convenient.
-## Creating virtualenv
+Creating virtualenv
+-------------------
Airflow pulls in quite a lot of dependencies to connect to other services. You
generally want to
test or run Airflow from a virtualenv to ensure those dependencies are
separated from your system-wide versions. Using system-installed Python
installation is strongly discouraged as the versions of Python
@@ -59,7 +60,8 @@ Once you have a suitable Python version installed, you can
create a virtualenv a
python3 -m venv PATH_TO_YOUR_VENV
source PATH_TO_YOUR_VENV/bin/activate
-## Installing Airflow locally
+Installing Airflow locally
+--------------------------
Installing Airflow locally can be done using pip - note that this will install
"development" version of
Airflow, where all providers are installed from local sources (if available),
not from `pypi`.
@@ -79,7 +81,6 @@ this one contains the minimum set of tools and dependencies
needed to run unit t
pip install -e ".[devel]"
-
You can also install optional packages that are needed to run certain tests.
In case of local installation
for example, you can install all prerequisites for Google provider, tests, and
all Hadoop providers with this command:
@@ -97,122 +98,78 @@ Additionally when you want to develop providers you need
to install providers co
pip install -e "./providers"
-# Using Hatch to manage your Python, virtualenvs, and build packages
-
-Airflow uses [hatch](https://hatch.pypa.io/) as a build and development tool.
It is one of the popular
-build tools and environment managers for Python, maintained by the Python
Packaging Authority.
-It is an optional tool that is only really needed when you want to build
packages from sources, but
-it is also very convenient to manage your Python versions and virtualenvs.
-
-Airflow project contains some pre-defined virtualenv definitions in
`pyproject.toml` that can be
-easily used by Hatch to create your local venvs. This is not necessary for you
to develop and test
-Airflow, but it is a convenient way to manage your local Python versions and
virtualenvs.
-
-Installing Hatch
-----------------
-
-You can install Hatch using various other ways (including Gui installers).
-
-Example using `pipx`:
-
- pipx install hatch
-
-We recommend using `pipx` as you can manage installed Python apps easily and
later use it
-to upgrade `hatch` easily as needed with:
+Using ``uv`` to manage your Python, virtualenvs, and install airflow for
development
+====================================================================================
- pipx upgrade hatch
+While you can manually install airflow locally from sources, Airflow
committers recommend using
+[uv](https://docs.astral.sh/uv/) as a build and development tool. It is a
modern,
+recently introduced popular packaging front-end tool and environment managers
for Python.
+It is an optional tool that is only really needed when you want to build
packages from sources, you can use
+many other packaging frontends (for example ``hatch``) but ``uv`` is very fast
and convenient to manage
+also your Python versions and virtualenvs. Also we use ``
-## Using Hatch to manage your Python versions
-
-You can also use Hatch to install and manage airflow virtualenvs and
development
-environments. For example, you can install Python 3.10 with this command:
-
- hatch python install 3.10
-
-or install all Python versions that are used in Airflow:
-
- hatch python install all
-
-## Using Hatch to manage your virtualenvs
-
-Airflow has some pre-defined virtualenvs that you can use to develop and test
airflow.
-You can see the list of available envs with:
-
- hatch env show
-
-This is what it shows currently:
+Installing ``uv``
+-----------------
-┏━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
-┃ Name ┃ Type ┃ Description
┃
-┡━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
-│ default │ virtual │ Default environment with Python 3.9 for maximum
compatibility │
-├─────────────┼─────────┼───────────────────────────────────────────────────────────────┤
-│ airflow-39 │ virtual │ Environment with Python 3.9. No devel installed.
│
-├─────────────┼─────────┼───────────────────────────────────────────────────────────────┤
-│ airflow-310 │ virtual │ Environment with Python 3.10. No devel installed.
│
-├─────────────┼─────────┼───────────────────────────────────────────────────────────────┤
-│ airflow-311 │ virtual │ Environment with Python 3.11. No devel installed
│
-├─────────────┼─────────┼───────────────────────────────────────────────────────────────┤
-│ airflow-312 │ virtual │ Environment with Python 3.12. No devel installed
│
-└─────────────┴─────────┴───────────────────────────────────────────────────────────────┘
+You can install uv following [the
instructions](https://docs.astral.sh/uv/getting-started/installation/ on
-The default env (if you have not used one explicitly) is `default` and it is a
Python 3.9
-virtualenv for maximum compatibility with `devel` extra installed - this devel
extra contains the minimum set
-of dependencies and tools that should be used during unit testing of core
Airflow and running all `airflow`
-CLI commands - without support for providers or databases.
+Using ``uv`` to manage your virtualenvs
+---------------------------------------
-The other environments are just bare-bones Python virtualenvs with Airflow
core requirements only,
-without any extras installed and without any tools. They are much faster to
create than the default
-environment, and you can manually install either appropriate extras or tools
that you need for
-testing or development.
+You can create a virtualenv with ``uv`` using the following command:
- hatch env create
+ uv venv create
-You can create specific environments by using them in create command:
+You can sync to latest versions of airflow dependencies using:
- hatch env create airflow-310
+ uv sync
-You can install extras in the environment by running pip command:
+And if you want to use some extras (for example because you want to develop
providers) you can add
+extras to the command:
- hatch -e airflow-310 run -- pip install -e ".[devel,google]"
+ uv sync --extra devel
-And you can enter the environment by running a shell of your choice (for
example, zsh) where you
-can run any commands
+You can also synchronize all extras:
- hatch -e airflow-310 shell
+ uv sync --all-extras
-Once you are in the environment (indicated usually by an updated prompt), you
can just install
-the extra dependencies you need:
+Building airflow packages with Hatch
+====================================
- [~/airflow] [airflow-310] pip install -e ".[devel,google]"
+While building packages will work with any compliant packaging front-end tool,
for reproducibility, we
+recommend using ``hatch``. It is a modern, fast, and convenient tool to build
packages from sources managed
+by the Python Packaging Authority. It is also used by Airflow to build
packages in CI/CD as well as by
+release managers to build locally packages for verification of reproducibility
of the build.
-You can exit the environment by just exiting the shell.
+Installing ``hatch``
+--------------------
-You can also see where Hatch created the virtualenvs and use it in your IDE or
activate it manually:
+More information about hatch can be found in https://hatch.pypa.io/
- hatch env find airflow-310
+We recommend to install ``hatch`` using ```uv tool`` command which will make
hatch available as a CLI
+command globally:
-You will get a path similar to the following:
+ uv tool install hatch
- /Users/jarek/Library/Application
Support/hatch/env/virtual/apache-airflow/TReRdyYt/apache-airflow
+You can still install ``hatch`` using ``pipx`` if you prefer:
-Then you will find `python` binary and `activate` script in the `bin`
sub-folder of this directory, and
-you can configure your IDE to use this python virtualenv if you want to use
that environment in your IDE.
+ pipx install hatch
-You can also set the default environment name by the HATCH_ENV environment
variable.
-You can clean the environment by running the following:
+It's important to keep your hatch up to date. You can do this by running:
- hatch env prune
+ uv tool upgrade hatch
-More information about hatch can be found in
https://hatch.pypa.io/1.9/environment/
-## Using Hatch to build your packages
+Using Hatch to build your packages
+----------------------------------
You can use Hatch to build installable packages from the Airflow sources. Such
package will
-include all metadata configured in `pyproject.toml` and will be installable
with pip.
+include all metadata configured in `pyproject.toml` and will be installable
with ``pip`` and and any other
+PEP-compliant packaging front-end.
-The packages will have pre-installed dependencies for providers that are
available when Airflow is installed from PyPI. Both `wheel` and `sdist`
packages are built by default.
+The packages will have pre-installed dependencies for providers that are
available when Airflow is i
+onstalled from PyPI. Both `wheel` and `sdist` packages are built by default.
hatch build
@@ -221,7 +178,8 @@ You can also build only `wheel` or `sdist` packages:
hatch build -t wheel
hatch build -t sdist
-## Installing recommended version of dependencies
+Installing recommended version of dependencies
+==============================================
Whatever virtualenv solution you use, when you want to make sure you are using
the same
version of dependencies as in main, you can install the recommended version of
the dependencies by using
diff --git a/contributing-docs/03_contributors_quick_start.rst
b/contributing-docs/03_contributors_quick_start.rst
index 7869f254a63..e6279936e68 100644
--- a/contributing-docs/03_contributors_quick_start.rst
+++ b/contributing-docs/03_contributors_quick_start.rst
@@ -222,18 +222,20 @@ see in CI in your local environment.
Setting up Breeze
-----------------
-1. Install ``pipx`` (>=1.2.1) - follow the instructions in `Install pipx
<https://pipx.pypa.io/stable/>`_
+1. Install ``uv`` or ``pipx``. We recommend to install ``uv`` as general
purpose python development
+ environment - you can install it via
https://docs.astral.sh/uv/getting-started/installation/ or you can
+ install ``pipx`` (>=1.2.1) - follow the instructions in `Install pipx
<https://pipx.pypa.io/stable/>`_
It is important to install version of pipx >= 1.2.1 to workaround
``packaging`` breaking change introduced
in September 2023
-2. Run ``pipx install -e ./dev/breeze`` in your checked-out repository. Make
sure to follow any instructions
- printed by ``pipx`` during the installation - this is needed to make sure
that ``breeze`` command is
- available in your PATH
+2. Run ``uv tool install -e ./dev/breeze`` (or ``pipx install -e
./dev/breeze`` in your checked-out
+ repository. Make sure to follow any instructions printed by during the
installation - this is needed
+ to make sure that ``breeze`` command is available in your PATH
.. warning::
- If you see below warning - it means that you hit `known issue
<https://github.com/pypa/pipx/issues/1092>`_
- with ``packaging`` version 23.2:
+ If you see below warning while running pipx - it means that you hit the
+ `known issue <https://github.com/pypa/pipx/issues/1092>`_ with ``packaging``
version 23.2:
⚠️ Ignoring --editable install option. pipx disallows it for anything but a
local path,
to avoid having to create a new src/ directory.
@@ -245,7 +247,6 @@ Setting up Breeze
pip install "packaging==23.1"
pipx install -e ./dev/breeze --force
-
3. Initialize breeze autocomplete
.. code-block:: bash
@@ -454,9 +455,7 @@ To avoid burden on CI infrastructure and to save time,
Pre-commit hooks can be r
.. note::
- We have recently started to recommend ``uv`` for our local development.
Currently (October 2024) ``uv``
- speeds up installation more than 10x comparing to ``pip``. While we still
describe ``pip`` and ``pipx``
- below, we also show the ``uv`` alternatives.
+ We have recently started to recommend ``uv`` for our local development.
.. note::
@@ -464,26 +463,28 @@ To avoid burden on CI infrastructure and to save time,
Pre-commit hooks can be r
started to use Python 3.9+ features in Airflow and accompanying scripts.
-Installing pre-commit is best done with ``pipx``:
+Installing pre-commit is best done with ``uv`` (recommended) or ``pipx``:
+
+This will install ``pre-commit`` with ``uv``, and it will change it to use
``uv`` to install its own
+virtualenvs.
.. code-block:: bash
- pipx install pre-commit
+ uv tool install pre-commit --with pre-commit-uv
-You can still add uv support for pre-commit if you use pipx using the commands:
+or
.. code-block:: bash
pipx install pre-commit
- pipx inject
- pipx inject prepare_breeze_and_image
-Also, if you already use ``uvx`` instead of ``pipx``, use this command:
+You can add ````uv`` support for ``pre-commit`` even you install it with
``pipx`` using the commands
+(then pre-commit will use ``uv`` to create virtualenvs for the hooks):
.. code-block:: bash
- uv tool install pre-commit --with pre-commit-uv --force-reinstall
-
+ pipx install pre-commit
+ pipx inject pre-commit pre-commit-uv # optionally if you want to use uv
to install virtualenvs
1. Installing required packages
@@ -499,11 +500,18 @@ on macOS, install via
brew install libxml2
-2. Installing required Python packages
+2. Installing pre-commit (if you have not done it yet):
+
+.. code-block:: bash
+
+ uv tool install pre-commit --with pre-commit-uv
+
+or
.. code-block:: bash
pipx install pre-commit
+ pipx install inject pre-commit pre-commit-uv
3. Go to your project directory
@@ -512,7 +520,7 @@ on macOS, install via
cd ~/Projects/airflow
-1. Running pre-commit hooks
+4. Running pre-commit hooks
.. code-block:: bash
@@ -547,7 +555,6 @@ on macOS, install via
pre-commit run --files airflow/utils/decorators.py
tests/utils/test_task_group.py
-
6. Running specific hook for selected files
.. code-block:: bash
@@ -558,7 +565,6 @@ on macOS, install via
Run ruff............................................................Passed
-
7. Enabling Pre-commit check before push. It will run pre-commit automatically
before committing and stops the commit
.. code-block:: bash
@@ -574,7 +580,6 @@ on macOS, install via
cd ~/Projects/airflow
pre-commit uninstall
-
- For more information on visit |08_static_code_checks.rst|
.. |08_static_code_checks.rst| raw:: html
diff --git
a/contributing-docs/quick-start-ide/contributors_quick_start_gitpod.rst
b/contributing-docs/quick-start-ide/contributors_quick_start_gitpod.rst
index 7a2c13d31fc..f5a0738cdb6 100644
--- a/contributing-docs/quick-start-ide/contributors_quick_start_gitpod.rst
+++ b/contributing-docs/quick-start-ide/contributors_quick_start_gitpod.rst
@@ -56,23 +56,7 @@ Set up Breeze in Gitpod
Gitpod default image have all the required packages installed.
-1. Run ``pipx install -e ./dev/breeze`` to install Breeze
-
-.. warning::
-
- If you see below warning - it means that you hit `known issue
<https://github.com/pypa/pipx/issues/1092>`_
- with ``packaging`` version 23.2:
- ⚠️ Ignoring ``--editable install`` option. ``pipx`` disallows it for
anything but a local path,
- to avoid having to create a new ``src/`` directory.
-
- The workaround is to downgrade packaging to 23.1 and re-running the ``pipx
install`` command. for example
- by running ``pip install "packaging<23.2"``.
-
- .. code-block:: bash
-
- pip install "packaging==23.1"
- pipx install -e ./dev/breeze --force
-
+1. Run ``uv tool install -e ./dev/breeze`` (or ``pipx install -e
./dev/breeze`` ) to install Breeze
2. Run ``breeze`` to enter breeze in Gitpod.
Setting up database in Breeze
diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index 1f56def2764..08a8994529e 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -214,35 +214,39 @@ The Release Candidate artifacts we vote upon should be
the exact ones we vote ag
- Set environment variables
- ```shell script
+```shell script
- # You can avoid repeating this command for every release if you will set
it in .zshrc
- # see
https://unix.stackexchange.com/questions/608842/zshrc-export-gpg-tty-tty-says-not-a-tty
- export GPG_TTY=$(tty)
+# You can avoid repeating this command for every release if you will set it in
.zshrc
+# see
https://unix.stackexchange.com/questions/608842/zshrc-export-gpg-tty-tty-says-not-a-tty
+export GPG_TTY=$(tty)
- # Set Version
- export VERSION=2.1.2rc3
- export VERSION_SUFFIX=rc3
- export VERSION_BRANCH=2-1
- export VERSION_WITHOUT_RC=${VERSION/rc?/}
+# Set Version
+export VERSION=2.1.2rc3
+export VERSION_SUFFIX=rc3
+export VERSION_BRANCH=2-1
+export VERSION_WITHOUT_RC=${VERSION/rc?/}
- # Set AIRFLOW_REPO_ROOT to the path of your git repo
- export AIRFLOW_REPO_ROOT=$(pwd)
+# Set AIRFLOW_REPO_ROOT to the path of your git repo
+export AIRFLOW_REPO_ROOT=$(pwd)
- # Example after cloning
- git clone https://github.com/apache/airflow.git airflow
- cd airflow
- export AIRFLOW_REPO_ROOT=$(pwd)
- ```
+# Example after cloning
+git clone https://github.com/apache/airflow.git airflow
+cd airflow
+export AIRFLOW_REPO_ROOT=$(pwd)
+```
- Install `breeze` command:
- ```shell script
- pipx install -e ./dev/breeze
- ```
+```shell script
+uv tool install -e ./dev/breeze
+```
+or (if you prefer to use pipx):
+```shell script
+pipx install -e ./dev/breeze
+```
- For major/minor version release, run the following commands to create the
'test' and 'stable' branches.
diff --git a/dev/breeze/README.md b/dev/breeze/README.md
index 70ad4076750..b2c8ccf3b2e 100644
--- a/dev/breeze/README.md
+++ b/dev/breeze/README.md
@@ -35,27 +35,19 @@ for Airflow Development.
This package should never be installed in "production" mode. The `breeze`
entrypoint will actually
fail if you do so. It is supposed to be installed only in
[editable/development
mode](https://packaging.python.org/en/latest/guides/distributing-packages-using-setuptools/#working-in-development-mode)
-directly from Airflow sources using `pipx` - usually with `--force` flag to
account for re-installation
-that might often be needed if dependencies change during development.
+directly from Airflow sources using `uv tool``or ``pipx` - usually with
`--force` flag to account
+for re-installation that might often be needed if dependencies change during
development.
```shell
-pipx install -e ./dev/breeze --force
+uv tool install -e ./dev/breeze --force
```
-NOTE! If you see below warning - it means that you hit [known
issue](https://github.com/pypa/pipx/issues/1092)
-with `packaging` version 23.2
-⚠️ Ignoring --editable install option. pipx disallows it for anything but a
local path,
-to avoid having to create a new src/ directory.
-
-The workaround is to downgrade packaging to 23.1 and re-running the `pipx
install` command, for example
-by running `pip install "packaging<23.2"`.
+or
```shell
-pip install "packaging<23.2"
pipx install -e ./dev/breeze --force
```
-
You can read more about Breeze in the
[documentation](https://github.com/apache/airflow/blob/main/dev/breeze/doc/README.rst)
This README file contains automatically generated hash of the `pyproject.toml`
files that were
@@ -136,6 +128,6 @@ PLEASE DO NOT MODIFY THE HASH BELOW! IT IS AUTOMATICALLY
UPDATED BY PRE-COMMIT.
---------------------------------------------------------------------------------------------------------
-Package config hash:
5d32e2c150de1cc22d522f94d86500c739f434439ae064e35791ac795932a1f21509c3d0fcf9f2351e7901a32601190bd4cb640799620a44d0ff6d9244aef57c
+Package config hash:
1a6bdff24f910175038dbd62c1c18dd091958ee2ffbb55ac7d5c93cc43f8f9ad5176093c135ac72031574292397164402a2c17a7c4f7f5fdb3c02e3d576109bf
---------------------------------------------------------------------------------------------------------
diff --git a/dev/breeze/doc/01_installation.rst
b/dev/breeze/doc/01_installation.rst
index 052dc3faca9..9c053bf280b 100644
--- a/dev/breeze/doc/01_installation.rst
+++ b/dev/breeze/doc/01_installation.rst
@@ -262,25 +262,18 @@ Set your working directory to the root of this cloned
repository.
cd airflow
-Run this command to install Breeze (make sure to use ``-e`` flag):
+Run this command to install Breeze (make sure to use ``-e`` flag) - you can
choose ``uv`` (recommended) or
+``pipx``:
-.. code-block:: bash
-
- pipx install -e ./dev/breeze
-.. warning::
+.. code-block:: bash
- If you see below warning - it means that you hit `known issue
<https://github.com/pypa/pipx/issues/1092>`_
- with ``packaging`` version 23.2:
- ⚠️ Ignoring --editable install option. pipx disallows it for anything but a
local path,
- to avoid having to create a new src/ directory.
+ uv tool install -e ./dev/breeze
- The workaround is to downgrade packaging to 23.1 and re-running the ``pipx
install`` command.
- .. code-block:: bash
+.. code-block:: bash
- pip install "packaging<23.2"
- pipx install -e ./dev/breeze --force
+ pipx install -e ./dev/breeze
.. note:: Note for Windows users
@@ -289,6 +282,12 @@ Run this command to install Breeze (make sure to use
``-e`` flag):
If you are on Windows, you should use Windows way to point to the
``dev/breeze`` sub-folder
of Airflow either as absolute or relative path. For example:
+ .. code-block:: bash
+
+ uv tool install -e dev\breeze
+
+ or
+
.. code-block:: bash
pipx install -e dev\breeze
@@ -329,7 +328,13 @@ that Breeze works on
.. warning:: Upgrading from earlier Python version
If you used Breeze with Python 3.8 and when running it, it will complain
that it needs Python 3.9. In this
- case you should force-reinstall Breeze with ``pipx``:
+ case you should force-reinstall Breeze with ``uv`` (or ``pipx``):
+
+ .. code-block:: bash
+
+ uv tool install --force -e ./dev/breeze
+
+ or
.. code-block:: bash
@@ -341,30 +346,35 @@ that Breeze works on
If you are on Windows, you should use Windows way to point to the
``dev/breeze`` sub-folder
of Airflow either as absolute or relative path. For example:
+ .. code-block:: bash
+
+ uv tool install --force -e dev\breeze
+
+ or
+
.. code-block:: bash
pipx install --force -e dev\breeze
- .. note:: creating pipx virtual env ``apache-airflow-breeze`` with a
specific python version
- In ``pipx install -e ./dev/breeze`` or ``pipx install -e
dev\breeze``, ``pipx`` uses default
- system python version to create virtual env for breeze.
- We can use a specific version by providing python executable in
``--python`` argument. For example:
+ .. note:: creating virtual env for ``apache-airflow-breeze`` with a
specific python version
+ The ``uv tool install`` or ``pipx install`` use default system python
version to create virtual
+ env for breeze. You can use a specific version by providing python
version in ``uv`` or
+ python executable in ``pipx`` in ``--python``.
If you have breeze installed already with another Python version you
can reinstall breeze with reinstall
command
.. code-block:: bash
- pipx reinstall --python
/Users/airflow/.pyenv/versions/3.9.16/bin/python apache-airflow-breeze
+ uv tool install --python 3.9.16 ./dev/breeze --force
- Or you can uninstall breeze and install it with a specific python
version:
+ or
.. code-block:: bash
- pipx uninstall apache-airflow-breeze
- pipx install -e ./dev/breeze --python
/Users/airflow/.pyenv/versions/3.9.16/bin/python
+ pipx install -e ./dev/breeze --python
/Users/airflow/.pyenv/versions/3.9.16/bin/python --force
Running Breeze for the first time
@@ -477,19 +487,18 @@ Automating breeze installation
------------------------------
Breeze on POSIX-compliant systems (Linux, MacOS) can be automatically
installed by running the
-``scripts/tools/setup_breeze`` bash script. This includes checking and
installing ``pipx``, setting up
+``scripts/tools/setup_breeze`` bash script. This includes checking and
installing ``uv``, setting up
``breeze`` with it and setting up autocomplete.
Uninstalling Breeze
-------------------
-Since Breeze is installed with ``pipx``, with ``pipx list``, you can list the
installed packages.
-Once you have the name of ``breeze`` package you can proceed to uninstall it.
+Since Breeze is installed with ``uv tool`` or ``pipx``, you need to use the
appropriate tool to uninstall it.
.. code-block:: bash
- pipx list
+ uv tool uninstall apache-airflow-breeze
This will also remove breeze from the folder: ``${HOME}.local/bin/``
diff --git a/dev/breeze/doc/04_troubleshooting.rst
b/dev/breeze/doc/04_troubleshooting.rst
index 1eddfb60ca1..5e44c4dbf79 100644
--- a/dev/breeze/doc/04_troubleshooting.rst
+++ b/dev/breeze/doc/04_troubleshooting.rst
@@ -91,23 +91,32 @@ or
It means that your pre-commit hook is installed with (already End-Of-Life)
Python 3.8 and you should reinstall
it and clean pre-commit cache.
-This can be done (if you use ``pipx`` to install ``pre-commit``):
+This can be done with ``uv tool`` to install ``pre-commit``)
+
+.. code-block:: bash
+
+ uv tool uninstall pre-commit
+ uv tool install pre-commit --python 3.9 --force --with pre-commit-uv
+ pre-commit clean
+ pre-commit install
+
+You can also use ``pipx``
.. code-block:: bash
pipx uninstall pre-commit
pipx install pre-commit --python $(which python3.9) --force
# This one allows pre-commit to use uv for venvs installed by pre-commit
- pipx inject pre-commit pre-commit-uv
+ pipx inject pre-commit pre-commit-uv # optionally if you want to use uv
to install virtualenvs
pre-commit clean
pre-commit install
If you installed ``pre-commit`` differently, you should remove and reinstall
-it (and clean cache) in the way you installed it.
+it (and clean cache) following the way you installed it.
-Bad Interpreter Error
----------------------
+Bad Interpreter Error with ``pipx``
+-----------------------------------
If you are experiencing bad interpreter errors
``zsh: /Users/eladkal/.local/bin/breeze: bad interpreter:
/Users/eladkal/.local/pipx/venvs/apache-airflow-breeze/bin/python: no such file
or directory``
diff --git a/dev/breeze/doc/10_advanced_breeze_topics.rst
b/dev/breeze/doc/10_advanced_breeze_topics.rst
index a4f93848630..9bbf113cb7e 100644
--- a/dev/breeze/doc/10_advanced_breeze_topics.rst
+++ b/dev/breeze/doc/10_advanced_breeze_topics.rst
@@ -29,17 +29,10 @@ Debugging/developing Breeze
Breeze can be quite easily debugged with PyCharm/VSCode or any other IDE - but
it might be less discoverable
if you never tested modules and if you do not know how to bypass version check
of breeze.
-For testing, you can create your own virtual environment, or use the one that
``pipx`` created for you if you
-already installed breeze following the recommended ``pipx install -e
./dev/breeze`` command.
+For testing, you can create your own virtual environment, or use the one that
``uv`` or ``pipx`` created
+for you if you already installed breeze following the recommended installation.
-For local virtualenv, you can use ``pyenv`` or any other virtualenv wrapper.
For example with ``pyenv``,
-you can use ``pyenv virtualenv 3.9.6 airflow-breeze`` to create virtualenv
called ``airflow-breeze``
-with Python 3.9.6. Then you can use ``pyenv activate airflow-breeze`` to
activate it and install breeze
-in editable mode with ``pip install -e ./dev/breeze``.
-
-For ``pipx`` virtualenv, you can use the virtualenv that ``pipx`` created for
you. You can find the name
-where ``pipx`` keeps their venvs via ``pipx list`` command. Usually it is
-``${HOME}/.local/pipx/venvs/apache-airflow-breeze`` where ``$HOME`` is your
home directory.
+Or you can change your directory to
The venv can be used for running breeze tests and for debugging breeze. While
running tests should
be usually "out-of-the-box" for most IDEs, once you configure ``./dev/breeze``
project to use the venv,
diff --git a/dev/breeze/doc/adr/0016-use-uv-tool-to-install-breeze.md
b/dev/breeze/doc/adr/0016-use-uv-tool-to-install-breeze.md
new file mode 100644
index 00000000000..d425b6c40aa
--- /dev/null
+++ b/dev/breeze/doc/adr/0016-use-uv-tool-to-install-breeze.md
@@ -0,0 +1,56 @@
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ -->
+
+<!-- START doctoc generated TOC please keep comment here to allow auto update
-->
+<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
+**Table of Contents** *generated with
[DocToc](https://github.com/thlorenz/doctoc)*
+
+- [10. Use uv tool to install breeze](#10-use-uv-tool-to-install-breeze)
+ - [Status](#status)
+ - [Context](#context)
+ - [Decision](#decision)
+ - [Consequences](#consequences)
+
+<!-- END doctoc generated TOC please keep comment here to allow auto update -->
+
+# 10. Use uv tool to install breeze
+
+Date: 2024-11-11
+
+## Status
+
+Accepted
+
+Supersedes [10. Use pipx to install breeze](0010-use-pipx-to-install-breeze.md)
+
+## Context
+
+The ``uv`` tools is a new modern python development environment management tool
+and we adopt it in ``Airflow`` as recommended way to manage airflow local
virtualenv and development
+setup. It's much faster to install dependencies with ``uv`` than with ``pip``
and it has many
+more features - including managing python interpreters, workspaces, syncing
virtualenv and more.
+
+## Decision
+
+While it is still possible to install breeze using ``pipx``, we are now
recommending ``uv`` and specifically
+``uv tool`` as the way to install breeze. Contributors should use ``uv tool``
to install breeze.
+
+## Consequences
+
+Those who used ``pipx``, should clean-up and reinstall their environment with
``uv``.
diff --git a/dev/breeze/pyproject.toml b/dev/breeze/pyproject.toml
index f5b4b9b98c4..04eae4706e7 100644
--- a/dev/breeze/pyproject.toml
+++ b/dev/breeze/pyproject.toml
@@ -73,7 +73,6 @@ dependencies = [
"jinja2>=3.1.0",
"jsonschema>=4.19.1",
"packaging>=23.2",
- "pipx>=1.4.1",
"pre-commit>=3.5.0",
"pre-commit-uv>=4.1.3",
"psutil>=5.9.6",
diff --git a/dev/breeze/src/airflow_breeze/utils/path_utils.py
b/dev/breeze/src/airflow_breeze/utils/path_utils.py
index cf04ecc2787..9add64abc45 100644
--- a/dev/breeze/src/airflow_breeze/utils/path_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/path_utils.py
@@ -96,8 +96,12 @@ def get_package_setup_metadata_hash() -> str:
from importlib_metadata import distribution # type: ignore[no-redef,
assignment]
prefix = "Package config hash: "
-
- for line in
distribution("apache-airflow-breeze").metadata.as_string().splitlines(keepends=False):
+ metadata = distribution("apache-airflow-breeze").metadata
+ try:
+ description = metadata.json["description"] # type:
ignore[attr-defined]
+ except AttributeError:
+ description = metadata.as_string()
+ for line in description.splitlines(keepends=False):
if line.startswith(prefix):
return line[len(prefix) :]
return "NOT FOUND"
diff --git a/dev/breeze/src/airflow_breeze/utils/run_utils.py
b/dev/breeze/src/airflow_breeze/utils/run_utils.py
index 8396c0016de..25df86203cd 100644
--- a/dev/breeze/src/airflow_breeze/utils/run_utils.py
+++ b/dev/breeze/src/airflow_breeze/utils/run_utils.py
@@ -249,8 +249,8 @@ def assert_pre_commit_installed():
)
get_console().print(
"\n[warning]With pipx you can install it with:[/]\n\n"
- " pipx inject\n"
- " pipx inject pre-commit pre-commit-uv\n"
+ " pipx inject pre-commit pre-commit-uv # optionally
if you want to use uv to "
+ "install virtualenvs\n"
)
else:
get_console().print(
diff --git a/docs/apache-airflow/installation/installing-from-pypi.rst
b/docs/apache-airflow/installation/installing-from-pypi.rst
index fa34287a315..4b2774de6bd 100644
--- a/docs/apache-airflow/installation/installing-from-pypi.rst
+++ b/docs/apache-airflow/installation/installing-from-pypi.rst
@@ -63,8 +63,8 @@ Those are just examples, see further for more explanation why
those are the best
.. note::
Generally speaking, Python community established practice is to perform
application installation in a
- virtualenv created with ``virtualenv`` or ``venv`` tools. You can also use
``pipx`` to install Airflow® in a
- application dedicated virtual environment created for you. There are also
other tools that can be used
+ virtualenv created with ``virtualenv`` or ``venv`` tools. You can also use
``uv`` or ``pipx`` to install
+ Airflow in application dedicated virtual environment created for you. There
are also other tools that can be used
to manage your virtualenv installation and you are free to choose how you
are managing the environments.
Airflow has no limitation regarding to the tool of your choice when it
comes to virtual environment.
diff --git a/docs/docker-stack/changelog.rst b/docs/docker-stack/changelog.rst
index 9b135b80b55..0b1ebf5897d 100644
--- a/docs/docker-stack/changelog.rst
+++ b/docs/docker-stack/changelog.rst
@@ -39,6 +39,9 @@ Airflow 3.0
* The ``virtualenv`` package is no longer installed in the reference
container. Airflow 3 and standard
provider relies on ``venv`` module from Python standard library.
+ * There is no ``pipx`` and ``mssql-cli`` installed in the image by default.
We recommend to use
+ ``uv tool`` instead of ``pipx`` and ``mssql-cli`` is not used in the image
by default as we do not
+ have mssql metadata support any more.
Airflow 2.10
~~~~~~~~~~~~
diff --git a/scripts/ci/install_breeze.sh b/scripts/ci/install_breeze.sh
index aa5a3160060..bdae70b95f5 100755
--- a/scripts/ci/install_breeze.sh
+++ b/scripts/ci/install_breeze.sh
@@ -21,13 +21,15 @@ cd "$( dirname "${BASH_SOURCE[0]}" )/../../"
PYTHON_ARG=""
+PIP_VERSION="24.3.1"
+UV_VERSION="0.5.1"
if [[ ${PYTHON_VERSION=} != "" ]]; then
PYTHON_ARG="--python=$(which python"${PYTHON_VERSION}") "
fi
-python -m pip install --upgrade pip==24.3.1
-python -m pip install "pipx>=1.4.1"
-python -m pipx uninstall apache-airflow-breeze >/dev/null 2>&1 || true
+python -m pip install --upgrade "pip==${PIP_VERSION}"
+python -m pip install "uv==${UV_VERSION}"
+uv tool uninstall apache-airflow-breeze >/dev/null 2>&1 || true
# shellcheck disable=SC2086
-python -m pipx install ${PYTHON_ARG} --force --editable ./dev/breeze/
+uv tool install ${PYTHON_ARG} --force --editable ./dev/breeze/
echo '/home/runner/.local/bin' >> "${GITHUB_PATH}"
diff --git a/scripts/ci/pre_commit/update_installers.py
b/scripts/ci/pre_commit/update_installers.py
index f55a937df0c..28de1988240 100755
--- a/scripts/ci/pre_commit/update_installers.py
+++ b/scripts/ci/pre_commit/update_installers.py
@@ -32,6 +32,7 @@ FILES_TO_UPDATE = [
AIRFLOW_SOURCES_ROOT_PATH / "Dockerfile.ci",
AIRFLOW_SOURCES_ROOT_PATH / "scripts" / "ci" / "install_breeze.sh",
AIRFLOW_SOURCES_ROOT_PATH / "scripts" / "docker" / "common.sh",
+ AIRFLOW_SOURCES_ROOT_PATH / "scripts" / "tools" / "setup_breeze",
AIRFLOW_SOURCES_ROOT_PATH / "pyproject.toml",
AIRFLOW_SOURCES_ROOT_PATH / "dev" / "breeze" / "src" / "airflow_breeze" /
"global_constants.py",
AIRFLOW_SOURCES_ROOT_PATH
@@ -60,12 +61,14 @@ def get_latest_pypi_version(package_name: str) -> str:
AIRFLOW_PIP_PATTERN = re.compile(r"(AIRFLOW_PIP_VERSION=)([0-9.]+)")
AIRFLOW_PIP_QUOTED_PATTERN = re.compile(r"(AIRFLOW_PIP_VERSION =
)(\"[0-9.]+\")")
PIP_QUOTED_PATTERN = re.compile(r"(PIP_VERSION = )(\"[0-9.]+\")")
+PIP_QUOTED_PATTERN_NO_SPACES = re.compile(r"(PIP_VERSION=)(\"[0-9.]+\")")
AIRFLOW_PIP_DOC_PATTERN = re.compile(r"(\| *`AIRFLOW_PIP_VERSION` *\|
*)(`[0-9.]+`)( *\|)")
AIRFLOW_PIP_UPGRADE_PATTERN = re.compile(r"(python -m pip install --upgrade
pip==)([0-9.]+)")
AIRFLOW_UV_PATTERN = re.compile(r"(AIRFLOW_UV_VERSION=)([0-9.]+)")
AIRFLOW_UV_QUOTED_PATTERN = re.compile(r"(AIRFLOW_UV_VERSION = )(\"[0-9.]+\")")
UV_QUOTED_PATTERN = re.compile(r"(UV_VERSION = )(\"[0-9.]+\")")
+UV_QUOTED_PATTERN_NO_SPACES = re.compile(r"(UV_VERSION=)(\"[0-9.]+\")")
AIRFLOW_UV_DOC_PATTERN = re.compile(r"(\| *`AIRFLOW_UV_VERSION` *\|
*)(`[0-9.]+`)( *\|)")
UV_GREATER_PATTERN = re.compile(r'"(uv>=)([0-9]+)"')
@@ -115,6 +118,9 @@ if __name__ == "__main__":
new_content = replace_group_2_while_keeping_total_length(
PIP_QUOTED_PATTERN, f'"{pip_version}"', new_content
)
+ new_content = replace_group_2_while_keeping_total_length(
+ PIP_QUOTED_PATTERN_NO_SPACES, f'"{pip_version}"', new_content
+ )
if UPGRADE_UV:
new_content = replace_group_2_while_keeping_total_length(
AIRFLOW_UV_PATTERN, uv_version, new_content
@@ -128,6 +134,9 @@ if __name__ == "__main__":
new_content = replace_group_2_while_keeping_total_length(
UV_QUOTED_PATTERN, f'"{uv_version}"', new_content
)
+ new_content = replace_group_2_while_keeping_total_length(
+ UV_QUOTED_PATTERN_NO_SPACES, f'"{uv_version}"', new_content
+ )
if new_content != file_content:
file.write_text(new_content)
console.print(f"[bright_blue]Updated {file}")
diff --git a/scripts/docker/install_pipx_tools.sh
b/scripts/docker/install_pipx_tools.sh
deleted file mode 100644
index 534dce8a934..00000000000
--- a/scripts/docker/install_pipx_tools.sh
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/usr/bin/env bash
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-# shellcheck shell=bash disable=SC2086
-# shellcheck source=scripts/docker/common.sh
-. "$( dirname "${BASH_SOURCE[0]}" )/common.sh"
-
-function install_pipx_tools() {
- echo
- echo "${COLOR_BLUE}Installing pipx tools${COLOR_RESET}"
- echo
- # Make sure PIPX is installed in latest version
- ${PACKAGING_TOOL_CMD} install ${EXTRA_INSTALL_FLAGS} --upgrade
"pipx>=1.2.1"
- if [[ $(uname -m) != "aarch64" ]]; then
- # Do not install mssql-cli for ARM
- # Install all the tools we need available in command line but without
impacting the current environment
- pipx install mssql-cli
-
- # Unfortunately mssql-cli installed by `pipx` does not work out of the
box because it uses
- # its own execution bash script which is not compliant with the
auto-activation of
- # pipx venvs - we need to manually patch Python executable in the
script to fix it: ¯\_(ツ)_/¯
- sed "s/python /\/root\/\.local\/pipx\/venvs\/mssql-cli\/bin\/python /"
-i /root/.local/bin/mssql-cli
- fi
-}
-
-common::get_colors
-common::get_packaging_tool
-
-install_pipx_tools
diff --git a/scripts/tools/setup_breeze b/scripts/tools/setup_breeze
index c740b6b4b9b..78d4db3a7d9 100755
--- a/scripts/tools/setup_breeze
+++ b/scripts/tools/setup_breeze
@@ -27,13 +27,14 @@ COLOR_YELLOW=$'\e[33m'
COLOR_BLUE=$'\e[34m'
COLOR_RESET=$'\e[0m'
+UV_VERSION="0.5.1"
+
function manual_instructions() {
echo
echo "${COLOR_BLUE}Please run those commands manually (you might need to
restart shell between them)${COLOR_RESET}"
echo
- echo " python -m pip install \"pipx>=1.2.1\""
- echo " pipx ensurepath"
- echo " pipx install -e '${AIRFLOW_SOURCES}/dev/breeze/'"
+ echo " python -m pip install \"uv==${UV_VERSION}\""
+ echo " uv tool install -e '${AIRFLOW_SOURCES}/dev/breeze/'"
echo " breeze setup autocomplete --force"
echo
echo " After that, both pipx and breeze should be available on your path"
@@ -43,20 +44,20 @@ function manual_instructions() {
function check_breeze_installed() {
set +e
- command -v "${BREEZE_BINARY}" >/dev/null
+ command -v "${BREEZE_BINARY}" >/dev/null 2>/dev/null
local breeze_on_path=$?
- command -v "pipx" >/dev/null
- local pipx_on_path=$?
+ command -v "uv" >/dev/null 2>/dev/null
+ local uv_on_path=$?
set -e
- if [[ ${breeze_on_path} != "0" || ${pipx_on_path} != "0" ]]; then
+ if [[ ${breeze_on_path} != "0" || ${uv_on_path} != "0" ]]; then
echo
- if [[ ${pipx_on_path} != 0 ]]; then
- echo "${COLOR_RED}The 'pipx' is not on path. It should be
installed and 'pipx' should be available on your PATH.${COLOR_RESET}"
+ if [[ ${uv_on_path} != 0 ]]; then
+ echo "${COLOR_RED}The 'uv' is not on path. It should be installed
and 'uv' should be available on your PATH.${COLOR_RESET}"
export TIMEOUT=0
- if "${MY_DIR}/confirm" "Installing pipx?"; then
- python -m pip install "pipx>=1.2.1" --upgrade
+ if "${MY_DIR}/confirm" "Installing uv?"; then
+ python -m pip install "uv==${UV_VERSION}" --upgrade
echo
- echo "${COLOR_YELLOW}Please close and re-open the shell and
retry. You might need to add 'pipx' to the PATH!${COLOR_RESET}"
+ echo "${COLOR_YELLOW}Please close and re-open the shell and
retry. You might need to add 'uv' to the PATH!${COLOR_RESET}"
echo
exit
else
@@ -67,11 +68,10 @@ function check_breeze_installed() {
echo "${COLOR_RED}The '${BREEZE_BINARY}' is not on path. Breeze
should be installed and 'breeze' should be available on your
PATH!${COLOR_RESET}"
export TIMEOUT=0
echo
- echo "${COLOR_YELLOW}Installing Breeze. This will install breeze
via pipx and modify your local rc file for ${SHELL}${COLOR_RESET}"
+ echo "${COLOR_YELLOW}Installing Breeze. This will install breeze
via uv and modify your ${SHELL} to run it${COLOR_RESET}"
echo
if "${MY_DIR}/confirm" "installing and modifying the startup
scripts"; then
- pipx ensurepath --force
- pipx install -e "${AIRFLOW_SOURCES}/dev/breeze/" --force
+ uv tool install -e "${AIRFLOW_SOURCES}/dev/breeze/" --force
${BREEZE_BINARY} setup-autocomplete --force --answer yes
echo
echo "${COLOR_YELLOW}Please close and re-open the shell and
retry. Then rerun your last command!${COLOR_RESET}"