From 93078d949aa902eb7668b559732fbd76d5e04568 Mon Sep 17 00:00:00 2001
From: Nicola Soranzo <nicola.soranzo@earlham.ac.uk>
Date: Tue, 29 Oct 2024 13:48:02 +0000
Subject: [PATCH] Replace poetry with uv

for lightning-fast Python dependency updates.

To update all dependencies (as done by the GitHub action):

$ make update-dependencies

To update only one package:

./lib/galaxy/dependencies/update.sh -p <PKG>
---
 .github/workflows/dependencies.yaml           |   4 +-
 doc/source/admin/framework_dependencies.rst   |  12 +-
 lib/galaxy/dependencies/dev-requirements.txt  | 376 +++++++--------
 .../dependencies/pinned-requirements.txt      | 434 +++++++++---------
 .../pinned-typecheck-requirements.txt         |  62 +--
 lib/galaxy/dependencies/update.sh             |  92 +---
 pyproject.toml                                | 363 ++++++++-------
 7 files changed, 652 insertions(+), 691 deletions(-)

diff --git a/.github/workflows/dependencies.yaml b/.github/workflows/dependencies.yaml
index 9b319d1954e1..7f3e60d54774 100644
--- a/.github/workflows/dependencies.yaml
+++ b/.github/workflows/dependencies.yaml
@@ -17,9 +17,7 @@ jobs:
         with:
           python-version: ${{ matrix.python-version }}
       - name: Update dependencies
-        run: | 
-          python -m venv .venv
-          make update-dependencies
+        run: make update-dependencies
       - name: Create pull request
         uses: peter-evans/create-pull-request@v6
         with:
diff --git a/doc/source/admin/framework_dependencies.rst b/doc/source/admin/framework_dependencies.rst
index 12613a31d460..c142f71cc840 100644
--- a/doc/source/admin/framework_dependencies.rst
+++ b/doc/source/admin/framework_dependencies.rst
@@ -185,7 +185,7 @@ Adding additional Galaxy dependencies
 -------------------------------------
 
 New packages can be added to Galaxy, or the versions of existing packages can be
-updated, using `poetry`_ and `Wheelforge`_.
+updated, using `uv`_ and `Wheelforge`_.
 
 If wheels already exist on PyPI for all platforms and Python versions supported
 by Galaxy, you can skip to step 3 in the process below.
@@ -195,11 +195,13 @@ by Galaxy, you can skip to step 3 in the process below.
 
 2. Submit a pull request to `Wheelforge`_.
 
-3. Add the new dependency to the `[tool.poetry.dependencies]` (or to `[tool.poetry.group.dev.dependencies]` if only needed for Galaxy development) section of `pyproject.toml` .
-4. Run `make update-dependencies` to update the requirements file in `lib/galaxy/dependencies`_.
+3. Add the new dependency to the ``dependencies`` list in the ``[project]``
+   section (or to ``dev`` list in the ``[dependency-groups]`` section if only
+   needed for Galaxy development) of `pyproject.toml`_ .
+4. Run ``make update-dependencies`` to update the requirements files in `lib/galaxy/dependencies`_.
 5. Submit a pull request to Galaxy with your changes.
 
-.. _poetry: https://python-poetry.org/
+.. _uv: https://docs.astral.sh/uv/
 .. _Wheelforge: https://github.com/galaxyproject/wheelforge/
-.. _Pull Request #4891: https://github.com/galaxyproject/galaxy/pull/4891
+.. _pyproject.toml: https://github.com/galaxyproject/galaxy/blob/dev/pyproject.toml
 .. _lib/galaxy/dependencies: https://github.com/galaxyproject/galaxy/tree/dev/lib/galaxy/dependencies
diff --git a/lib/galaxy/dependencies/dev-requirements.txt b/lib/galaxy/dependencies/dev-requirements.txt
index 1258d2e754e2..a0b0f68801f0 100644
--- a/lib/galaxy/dependencies/dev-requirements.txt
+++ b/lib/galaxy/dependencies/dev-requirements.txt
@@ -1,188 +1,188 @@
---extra-index-url https://wheels.galaxyproject.org/simple
-
-aiohappyeyeballs==2.4.3 ; python_version >= "3.8" and python_version < "3.13"
-aiohttp==3.10.10 ; python_version >= "3.8" and python_version < "3.13"
-aiosignal==1.3.1 ; python_version >= "3.8" and python_version < "3.13"
-alabaster==0.7.13 ; python_version >= "3.8" and python_version < "3.13"
-anyio==4.5.2 ; python_version >= "3.8" and python_version < "3.13"
-ase==3.23.0 ; python_version >= "3.8" and python_version < "3.13"
-async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.11"
-attrs==24.2.0 ; python_version >= "3.8" and python_version < "3.13"
-axe-selenium-python==2.1.6 ; python_version >= "3.8" and python_version < "3.13"
-babel==2.16.0 ; python_version >= "3.8" and python_version < "3.13"
-backports-tarfile==1.2.0 ; python_version >= "3.8" and python_version < "3.12"
-backports-zoneinfo==0.2.1 ; python_version >= "3.8" and python_version < "3.9"
-black==24.8.0 ; python_version >= "3.8" and python_version < "3.13"
-boto3==1.35.36 ; python_version >= "3.8" and python_version < "3.13"
-botocore==1.35.36 ; python_version >= "3.8" and python_version < "3.13"
-build==1.2.2.post1 ; python_version >= "3.8" and python_version < "3.13"
-cachecontrol[filecache]==0.14.0 ; python_version >= "3.8" and python_version < "3.13"
-certifi==2024.8.30 ; python_version >= "3.8" and python_version < "3.13"
-cffi==1.17.1 ; python_version >= "3.8" and python_version < "3.13"
-charset-normalizer==3.4.0 ; python_version >= "3.8" and python_version < "3.13"
-click==8.1.7 ; python_version >= "3.8" and python_version < "3.13"
-codespell==2.3.0 ; python_version >= "3.8" and python_version < "3.13"
-colorama==0.4.6 ; python_version >= "3.8" and python_version < "3.13" and (sys_platform == "win32" or platform_system == "Windows" or os_name == "nt")
-contourpy==1.1.1 ; python_version >= "3.8" and python_version < "3.9"
-contourpy==1.3.0 ; python_version >= "3.9" and python_version < "3.13"
-coverage[toml]==7.6.1 ; python_version >= "3.8" and python_version < "3.13"
-cryptography==43.0.3 ; python_version >= "3.8" and python_version < "3.13"
-cwltest==2.5.20240906231108 ; python_version >= "3.8" and python_version < "3.13"
-cycler==0.12.1 ; python_version >= "3.8" and python_version < "3.13"
-darker==2.1.1 ; python_version >= "3.8" and python_version < "3.13"
-darkgraylib==1.2.1 ; python_version >= "3.8" and python_version < "3.13"
-decorator==5.1.1 ; python_version >= "3.9" and python_version < "3.13"
-defusedxml==0.7.1 ; python_version >= "3.8" and python_version < "3.13"
-deprecated==1.2.14 ; python_version >= "3.8" and python_version < "3.13"
-docutils==0.20.1 ; python_version >= "3.8" and python_version < "3.13"
-dogpile-cache==1.3.3 ; python_version >= "3.9" and python_version < "3.13"
-exceptiongroup==1.2.2 ; python_version >= "3.8" and python_version < "3.11"
-filelock==3.16.1 ; python_version >= "3.8" and python_version < "3.13"
-fluent-logger==0.11.1 ; python_version >= "3.8" and python_version < "3.13"
-fonttools==4.54.1 ; python_version >= "3.8" and python_version < "3.13"
-frozenlist==1.5.0 ; python_version >= "3.8" and python_version < "3.13"
-galaxy-release-util==0.1.11 ; python_version >= "3.8" and python_version < "3.13"
-graylint==1.1.1 ; python_version >= "3.8" and python_version < "3.13"
-greenlet==3.1.1 ; python_version >= "3.8" and python_version < "3.13"
-h11==0.14.0 ; python_version >= "3.8" and python_version < "3.13"
-httpcore==1.0.6 ; python_version >= "3.8" and python_version < "3.13"
-httpx==0.27.2 ; python_version >= "3.8" and python_version < "3.13"
-idna==3.10 ; python_version >= "3.8" and python_version < "3.13"
-imagesize==1.4.1 ; python_version >= "3.8" and python_version < "3.13"
-importlib-metadata==8.5.0 ; python_version >= "3.8" and python_version < "3.13"
-importlib-resources==6.4.5 ; python_version >= "3.8" and python_version < "3.10"
-iniconfig==2.0.0 ; python_version >= "3.8" and python_version < "3.13"
-isodate==0.6.1 ; python_version >= "3.8" and python_version < "3.13"
-isort==5.13.2 ; python_version >= "3.8" and python_version < "3.13"
-jaraco-classes==3.4.0 ; python_version >= "3.8" and python_version < "3.13"
-jaraco-context==6.0.1 ; python_version >= "3.8" and python_version < "3.13"
-jaraco-functools==4.1.0 ; python_version >= "3.8" and python_version < "3.13"
-jeepney==0.8.0 ; python_version >= "3.8" and python_version < "3.13" and sys_platform == "linux"
-jinja2==3.1.4 ; python_version >= "3.8" and python_version < "3.13"
-jmespath==1.0.1 ; python_version >= "3.8" and python_version < "3.13"
-jsonschema-specifications==2023.12.1 ; python_version >= "3.9" and python_version < "3.13"
-jsonschema==4.23.0 ; python_version >= "3.9" and python_version < "3.13"
-junit-xml==1.9 ; python_version >= "3.8" and python_version < "3.13"
-keyring==25.4.1 ; python_version >= "3.8" and python_version < "3.13"
-kiwisolver==1.4.7 ; python_version >= "3.8" and python_version < "3.13"
-lxml==5.3.0 ; python_version >= "3.8" and python_version < "3.13"
-markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "3.13"
-markdown-it-reporter==0.0.2 ; python_version >= "3.8" and python_version < "3.13"
-markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "3.13"
-matplotlib==3.7.5 ; python_version >= "3.8" and python_version < "3.9"
-matplotlib==3.9.2 ; python_version >= "3.9" and python_version < "3.13"
-mdit-py-plugins==0.4.2 ; python_version >= "3.8" and python_version < "3.13"
-mdurl==0.1.2 ; python_version >= "3.8" and python_version < "3.13"
-mirakuru==2.5.2 ; python_version >= "3.8" and python_version < "3.13"
-mistune==3.0.2 ; python_version >= "3.8" and python_version < "3.13"
-more-itertools==10.5.0 ; python_version >= "3.8" and python_version < "3.13"
-msgpack==1.1.0 ; python_version >= "3.8" and python_version < "3.13"
-multidict==6.1.0 ; python_version >= "3.8" and python_version < "3.13"
-mypy-extensions==1.0.0 ; python_version >= "3.8" and python_version < "3.13"
-myst-parser==3.0.1 ; python_version >= "3.8" and python_version < "3.13"
-nh3==0.2.18 ; python_version >= "3.8" and python_version < "3.13"
-numpy==1.24.4 ; python_version >= "3.8" and python_version < "3.9"
-numpy==2.0.2 ; python_version >= "3.9" and python_version < "3.10"
-numpy==2.1.2 ; python_version >= "3.10" and python_version < "3.13"
-onedatafilerestclient==21.2.5.2 ; python_version >= "3.8" and python_version < "3.13"
-outcome==1.3.0.post0 ; python_version >= "3.8" and python_version < "3.13"
-packaging==24.1 ; python_version >= "3.8" and python_version < "3.13"
-pathspec==0.12.1 ; python_version >= "3.8" and python_version < "3.13"
-pbr==6.1.0 ; python_version >= "3.9" and python_version < "3.13"
-pillow==10.4.0 ; python_version >= "3.8" and python_version < "3.13"
-pkce==1.0.3 ; python_version >= "3.8" and python_version < "3.13"
-pkginfo==1.10.0 ; python_version >= "3.8" and python_version < "3.13"
-platformdirs==4.3.6 ; python_version >= "3.8" and python_version < "3.13"
-playwright==1.48.0 ; python_version >= "3.8" and python_version < "3.13"
-pluggy==1.5.0 ; python_version >= "3.8" and python_version < "3.13"
-port-for==0.7.3 ; python_version >= "3.8" and python_version < "3.13"
-prettytable==3.11.0 ; python_version >= "3.8" and python_version < "3.13"
-propcache==0.2.0 ; python_version >= "3.8" and python_version < "3.13"
-psutil==6.1.0 ; python_version >= "3.8" and python_version < "3.13" and sys_platform != "cygwin"
-psycopg==3.2.3 ; python_version >= "3.8" and python_version < "3.13"
-pycparser==2.22 ; python_version >= "3.8" and python_version < "3.13"
-pyee==12.0.0 ; python_version >= "3.8" and python_version < "3.13"
-pygithub==2.4.0 ; python_version >= "3.8" and python_version < "3.13"
-pygments==2.18.0 ; python_version >= "3.8" and python_version < "3.13"
-pyjwt[crypto]==2.9.0 ; python_version >= "3.8" and python_version < "3.13"
-pynacl==1.5.0 ; python_version >= "3.8" and python_version < "3.13"
-pyparsing==3.1.4 ; python_version >= "3.8" and python_version < "3.13"
-pyproject-hooks==1.2.0 ; python_version >= "3.8" and python_version < "3.13"
-pysocks==1.7.1 ; python_version >= "3.8" and python_version < "3.13"
-pytest-asyncio==0.23.8 ; python_version >= "3.8" and python_version < "3.13"
-pytest-base-url==2.1.0 ; python_version >= "3.8" and python_version < "3.13"
-pytest-cov==5.0.0 ; python_version >= "3.8" and python_version < "3.13"
-pytest-html==4.1.1 ; python_version >= "3.8" and python_version < "3.13"
-pytest-httpserver==1.1.0 ; python_version >= "3.8" and python_version < "3.13"
-pytest-json-report==1.5.0 ; python_version >= "3.8" and python_version < "3.13"
-pytest-metadata==3.1.1 ; python_version >= "3.8" and python_version < "3.13"
-pytest-mock==3.14.0 ; python_version >= "3.8" and python_version < "3.13"
-pytest-playwright==0.5.2 ; python_version >= "3.8" and python_version < "3.13"
-pytest-postgresql==6.1.1 ; python_version >= "3.8" and python_version < "3.13"
-pytest-shard==0.1.2 ; python_version >= "3.8" and python_version < "3.13"
-pytest==7.4.4 ; python_version >= "3.8" and python_version < "3.13"
-python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "3.13"
-python-irodsclient==2.2.0 ; python_version >= "3.8" and python_version < "3.13"
-python-slugify==8.0.4 ; python_version >= "3.8" and python_version < "3.13"
-pytz==2024.2 ; python_version >= "3.8" and python_version < "3.9"
-pywin32-ctypes==0.2.3 ; python_version >= "3.8" and python_version < "3.13" and sys_platform == "win32"
-pyyaml==6.0.2 ; python_version >= "3.8" and python_version < "3.13"
-rdflib==6.3.2 ; python_version >= "3.8" and python_version < "3.13"
-readme-renderer==43.0 ; python_version >= "3.8" and python_version < "3.13"
-referencing==0.35.1 ; python_version >= "3.9" and python_version < "3.13"
-requests-toolbelt==1.0.0 ; python_version >= "3.8" and python_version < "3.13"
-requests==2.32.3 ; python_version >= "3.8" and python_version < "3.13"
-responses==0.25.3 ; python_version >= "3.8" and python_version < "3.13"
-rfc3986==2.0.0 ; python_version >= "3.8" and python_version < "3.13"
-rich==13.9.3 ; python_version >= "3.8" and python_version < "3.13"
-rpds-py==0.20.0 ; python_version >= "3.9" and python_version < "3.13"
-ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8"
-ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "3.13"
-rucio-clients==35.4.1 ; python_version >= "3.9" and python_version < "3.13"
-s3transfer==0.10.3 ; python_version >= "3.8" and python_version < "3.13"
-schema-salad==8.7.20241010092723 ; python_version >= "3.8" and python_version < "3.13"
-scipy==1.10.1 ; python_version >= "3.8" and python_version < "3.9"
-scipy==1.13.1 ; python_version >= "3.9" and python_version < "3.10"
-scipy==1.14.1 ; python_version >= "3.10" and python_version < "3.13"
-secretstorage==3.3.3 ; python_version >= "3.8" and python_version < "3.13" and sys_platform == "linux"
-selenium==4.25.0 ; python_version >= "3.8" and python_version < "3.13"
-seletools==1.5.0 ; python_version >= "3.8" and python_version < "3.13"
-setuptools==75.2.0 ; python_version >= "3.8" and python_version < "3.13"
-six==1.16.0 ; python_version >= "3.8" and python_version < "3.13"
-sniffio==1.3.1 ; python_version >= "3.8" and python_version < "3.13"
-snowballstemmer==2.2.0 ; python_version >= "3.8" and python_version < "3.13"
-sortedcontainers==2.4.0 ; python_version >= "3.8" and python_version < "3.13"
-sphinx-rtd-theme==3.0.1 ; python_version >= "3.8" and python_version < "3.13"
-sphinx==7.1.2 ; python_version >= "3.8" and python_version < "3.13"
-sphinxcontrib-applehelp==1.0.4 ; python_version >= "3.8" and python_version < "3.13"
-sphinxcontrib-devhelp==1.0.2 ; python_version >= "3.8" and python_version < "3.13"
-sphinxcontrib-htmlhelp==2.0.1 ; python_version >= "3.8" and python_version < "3.13"
-sphinxcontrib-jquery==4.1 ; python_version >= "3.8" and python_version < "3.13"
-sphinxcontrib-jsmath==1.0.1 ; python_version >= "3.8" and python_version < "3.13"
-sphinxcontrib-qthelp==1.0.3 ; python_version >= "3.8" and python_version < "3.13"
-sphinxcontrib-serializinghtml==1.1.5 ; python_version >= "3.8" and python_version < "3.13"
-statsd==4.0.1 ; python_version >= "3.8" and python_version < "3.13"
-stevedore==5.3.0 ; python_version >= "3.9" and python_version < "3.13"
-tabulate==0.9.0 ; python_version >= "3.9" and python_version < "3.13"
-testfixtures==8.3.0 ; python_version >= "3.8" and python_version < "3.13"
-text-unidecode==1.3 ; python_version >= "3.8" and python_version < "3.13"
-tinydb==4.8.2 ; python_version >= "3.8" and python_version < "3.13"
-toml==0.10.2 ; python_version >= "3.8" and python_version < "3.13"
-tomli==2.0.2 ; python_version >= "3.8" and python_full_version <= "3.11.0a6"
-trio-websocket==0.11.1 ; python_version >= "3.8" and python_version < "3.13"
-trio==0.27.0 ; python_version >= "3.8" and python_version < "3.13"
-tuspy==1.0.3 ; python_version >= "3.8" and python_version < "3.13"
-twill==3.3 ; python_version >= "3.8" and python_version < "3.13"
-twine==5.1.1 ; python_version >= "3.8" and python_version < "3.13"
-typing-extensions==4.12.2 ; python_version >= "3.8" and python_version < "3.13"
-tzdata==2024.2 ; python_version >= "3.8" and python_version < "3.13" and sys_platform == "win32"
-urllib3==1.26.20 ; python_version >= "3.8" and python_version < "3.13"
-urllib3[socks]==1.26.20 ; python_version >= "3.8" and python_version < "3.13"
-watchdog==4.0.2 ; python_version >= "3.8" and python_version < "3.13"
-wcwidth==0.2.13 ; python_version >= "3.8" and python_version < "3.13"
-websocket-client==1.8.0 ; python_version >= "3.8" and python_version < "3.13"
-werkzeug==3.0.6 ; python_version >= "3.8" and python_version < "3.13"
-wrapt==1.16.0 ; python_version >= "3.8" and python_version < "3.13"
-wsproto==1.2.0 ; python_version >= "3.8" and python_version < "3.13"
-yarl==1.15.2 ; python_version >= "3.8" and python_version < "3.13"
-zipp==3.20.2 ; python_version >= "3.8" and python_version < "3.13"
+# This file was autogenerated by uv via the following command:
+#    uv export --no-hashes --only-group=dev
+aiohappyeyeballs==2.4.3
+aiohttp==3.10.10
+aiosignal==1.3.1
+alabaster==0.7.13
+anyio==4.5.2
+ase==3.23.0
+async-timeout==4.0.3 ; python_full_version < '3.11'
+attrs==24.2.0
+axe-selenium-python==2.1.6
+babel==2.16.0
+backports-tarfile==1.2.0 ; python_full_version < '3.12'
+backports-zoneinfo==0.2.1 ; python_full_version < '3.9'
+black==24.8.0
+boto3==1.35.36
+botocore==1.35.36
+build==1.2.2.post1
+cachecontrol==0.14.0
+certifi==2024.8.30
+cffi==1.17.1
+charset-normalizer==3.4.0
+click==8.1.7
+codespell==2.3.0
+colorama==0.4.6 ; (platform_system != 'Windows' and sys_platform == 'win32') or platform_system == 'Windows' or os_name == 'nt'
+contourpy==1.1.1 ; python_full_version < '3.9'
+contourpy==1.3.0 ; python_full_version >= '3.9'
+coverage==7.6.1
+cryptography==43.0.3
+cwltest==2.5.20240906231108
+cycler==0.12.1
+darker==2.1.1
+darkgraylib==1.2.1
+decorator==5.1.1 ; python_full_version >= '3.9'
+defusedxml==0.7.1
+deprecated==1.2.14
+docutils==0.20.1
+dogpile-cache==1.3.3 ; python_full_version >= '3.9'
+exceptiongroup==1.2.2 ; python_full_version < '3.11'
+filelock==3.16.1
+fluent-logger==0.11.1
+fonttools==4.54.1
+frozenlist==1.5.0
+galaxy-release-util==0.1.11
+graylint==1.1.1
+greenlet==3.1.1
+h11==0.14.0
+httpcore==1.0.6
+httpx==0.27.2
+idna==3.10
+imagesize==1.4.1
+importlib-metadata==8.5.0
+importlib-resources==6.4.5 ; python_full_version < '3.10'
+iniconfig==2.0.0
+isodate==0.6.1
+isort==5.13.2
+jaraco-classes==3.4.0
+jaraco-context==6.0.1
+jaraco-functools==4.1.0
+jeepney==0.8.0 ; sys_platform == 'linux'
+jinja2==3.1.4
+jmespath==1.0.1
+jsonschema==4.23.0 ; python_full_version >= '3.9'
+jsonschema-specifications==2023.12.1 ; python_full_version >= '3.9'
+junit-xml==1.9
+keyring==25.5.0
+kiwisolver==1.4.7
+lxml==5.3.0
+markdown-it-py==3.0.0
+markdown-it-reporter==0.0.2
+markupsafe==2.1.5
+matplotlib==3.7.5 ; python_full_version < '3.9'
+matplotlib==3.9.2 ; python_full_version >= '3.9'
+mdit-py-plugins==0.4.2
+mdurl==0.1.2
+mirakuru==2.5.2
+mistune==3.0.2
+more-itertools==10.5.0
+msgpack==1.1.0
+multidict==6.1.0
+mypy-extensions==1.0.0
+myst-parser==3.0.1
+nh3==0.2.18
+numpy==1.24.4 ; python_full_version < '3.9'
+numpy==2.0.2 ; python_full_version == '3.9.*'
+numpy==2.1.2 ; python_full_version >= '3.10'
+onedatafilerestclient==21.2.5.2
+outcome==1.3.0.post0
+packaging==24.1
+pathspec==0.12.1
+pbr==6.1.0 ; python_full_version >= '3.9'
+pillow==10.4.0
+pkce==1.0.3
+pkginfo==1.10.0
+pkgutil-resolve-name==1.3.10 ; python_version < '0'
+platformdirs==4.3.6
+playwright==1.48.0
+pluggy==1.5.0
+port-for==0.7.3
+prettytable==3.11.0
+propcache==0.2.0
+psutil==6.1.0 ; sys_platform != 'cygwin'
+psycopg==3.2.3
+pycparser==2.22
+pyee==12.0.0
+pygithub==2.4.0
+pygments==2.18.0
+pyjwt==2.9.0
+pynacl==1.5.0
+pyparsing==3.1.4
+pyproject-hooks==1.2.0
+pysocks==1.7.1
+pytest==7.4.4
+pytest-asyncio==0.23.8
+pytest-base-url==2.1.0
+pytest-cov==5.0.0
+pytest-html==4.1.1
+pytest-httpserver==1.1.0
+pytest-json-report==1.5.0
+pytest-metadata==3.1.1
+pytest-mock==3.14.0
+pytest-playwright==0.5.2
+pytest-postgresql==6.1.1
+pytest-shard==0.1.2
+python-dateutil==2.9.0.post0
+python-irodsclient==2.2.0
+python-slugify==8.0.4
+pytz==2024.2 ; python_full_version < '3.9'
+pywin32-ctypes==0.2.3 ; sys_platform == 'win32'
+pyyaml==6.0.2
+rdflib==6.3.2
+readme-renderer==43.0
+referencing==0.35.1 ; python_full_version >= '3.9'
+requests==2.32.3
+requests-toolbelt==1.0.0
+responses==0.25.3
+rfc3986==2.0.0
+rich==13.9.3
+rpds-py==0.20.0 ; python_full_version >= '3.9'
+ruamel-yaml==0.18.6
+ruamel-yaml-clib==0.2.8 ; python_full_version < '3.13' and platform_python_implementation == 'CPython'
+rucio-clients==35.4.1 ; python_full_version >= '3.9'
+s3transfer==0.10.3
+schema-salad==8.7.20241010092723
+scipy==1.10.1 ; python_full_version < '3.9'
+scipy==1.13.1 ; python_full_version == '3.9.*'
+scipy==1.14.1 ; python_full_version >= '3.10'
+secretstorage==3.3.3 ; sys_platform == 'linux'
+selenium==4.25.0
+seletools==1.5.0
+setuptools==75.2.0
+six==1.16.0
+sniffio==1.3.1
+snowballstemmer==2.2.0
+sortedcontainers==2.4.0
+sphinx==7.1.2
+sphinx-rtd-theme==3.0.1
+sphinxcontrib-applehelp==1.0.4
+sphinxcontrib-devhelp==1.0.2
+sphinxcontrib-htmlhelp==2.0.1
+sphinxcontrib-jquery==4.1
+sphinxcontrib-jsmath==1.0.1
+sphinxcontrib-qthelp==1.0.3
+sphinxcontrib-serializinghtml==1.1.5
+statsd==4.0.1
+stevedore==5.3.0 ; python_full_version >= '3.9'
+tabulate==0.9.0 ; python_full_version >= '3.9'
+testfixtures==8.3.0
+text-unidecode==1.3
+tinydb==4.8.2
+toml==0.10.2
+tomli==2.0.2 ; python_full_version <= '3.11'
+trio==0.27.0
+trio-websocket==0.11.1
+tuspy==1.0.3
+twill==3.3
+twine==5.1.1
+typing-extensions==4.12.2
+tzdata==2024.2 ; sys_platform == 'win32'
+urllib3==1.26.20
+watchdog==4.0.2
+wcwidth==0.2.13
+websocket-client==1.8.0
+werkzeug==3.0.6
+wrapt==1.16.0
+wsproto==1.2.0
+yarl==1.15.2
+zipp==3.20.2
diff --git a/lib/galaxy/dependencies/pinned-requirements.txt b/lib/galaxy/dependencies/pinned-requirements.txt
index 91752afea326..c911f9b8b305 100644
--- a/lib/galaxy/dependencies/pinned-requirements.txt
+++ b/lib/galaxy/dependencies/pinned-requirements.txt
@@ -1,218 +1,216 @@
---extra-index-url https://wheels.galaxyproject.org/simple
-
-a2wsgi==1.10.7 ; python_version >= "3.8" and python_version < "3.13"
-adal==1.2.7 ; python_version >= "3.8" and python_version < "3.13"
-aiobotocore==2.15.2 ; python_version >= "3.8" and python_version < "3.13"
-aiodataloader==0.4.0 ; python_version >= "3.8" and python_version < "3.13"
-aiofiles==24.1.0 ; python_version >= "3.8" and python_version < "3.13"
-aiohappyeyeballs==2.4.3 ; python_version >= "3.8" and python_version < "3.13"
-aiohttp==3.10.10 ; python_version >= "3.8" and python_version < "3.13"
-aioitertools==0.12.0 ; python_version >= "3.8" and python_version < "3.13"
-aiosignal==1.3.1 ; python_version >= "3.8" and python_version < "3.13"
-alembic==1.13.3 ; python_version >= "3.8" and python_version < "3.13"
-amqp==5.2.0 ; python_version >= "3.8" and python_version < "3.13"
-annotated-types==0.7.0 ; python_version >= "3.8" and python_version < "3.13"
-anyio==4.5.2 ; python_version >= "3.8" and python_version < "3.13"
-apispec==6.6.1 ; python_version >= "3.8" and python_version < "3.13"
-appdirs==1.4.4 ; python_version >= "3.8" and python_version < "3.13"
-arcp==0.2.1 ; python_version >= "3.8" and python_version < "3.13"
-argcomplete==3.5.1 ; python_version >= "3.8" and python_version < "3.13"
-async-timeout==4.0.3 ; python_version >= "3.8" and python_version < "3.11"
-attmap==0.13.2 ; python_version >= "3.8" and python_version < "3.13"
-attrs==24.2.0 ; python_version >= "3.8" and python_version < "3.13"
-babel==2.16.0 ; python_version >= "3.8" and python_version < "3.13"
-backports-zoneinfo==0.2.1 ; python_version >= "3.8" and python_version < "3.9"
-backports-zoneinfo[tzdata]==0.2.1 ; python_version >= "3.8" and python_version < "3.9"
-bagit-profile==1.3.1 ; python_version >= "3.8" and python_version < "3.13"
-bagit==1.8.1 ; python_version >= "3.8" and python_version < "3.13"
-bcrypt==4.2.0 ; python_version >= "3.8" and python_version < "3.13"
-bdbag==1.7.3 ; python_version >= "3.8" and python_version < "3.13"
-beaker==1.13.0 ; python_version >= "3.8" and python_version < "3.13"
-billiard==4.2.1 ; python_version >= "3.8" and python_version < "3.13"
-bioblend==1.3.0 ; python_version >= "3.8" and python_version < "3.13"
-bleach==6.1.0 ; python_version >= "3.8" and python_version < "3.13"
-boltons==24.0.0 ; python_version >= "3.8" and python_version < "3.13"
-boto==2.49.0 ; python_version >= "3.8" and python_version < "3.13"
-botocore==1.35.36 ; python_version >= "3.8" and python_version < "3.13"
-bx-python==0.13.0 ; python_version >= "3.8" and python_version < "3.13"
-cachecontrol[filecache]==0.14.0 ; python_version >= "3.8" and python_version < "3.13"
-celery==5.4.0 ; python_version >= "3.8" and python_version < "3.13"
-certifi==2024.8.30 ; python_version >= "3.8" and python_version < "3.13"
-cffi==1.17.1 ; python_version >= "3.8" and python_version < "3.13"
-charset-normalizer==3.4.0 ; python_version >= "3.8" and python_version < "3.13"
-cheetah3==3.2.6.post1 ; python_version >= "3.8" and python_version < "3.13"
-circus==0.18.0 ; python_version >= "3.8" and python_version < "3.13"
-click-didyoumean==0.3.1 ; python_version >= "3.8" and python_version < "3.13"
-click-plugins==1.1.1 ; python_version >= "3.8" and python_version < "3.13"
-click-repl==0.3.0 ; python_version >= "3.8" and python_version < "3.13"
-click==8.1.7 ; python_version >= "3.8" and python_version < "3.13"
-cloudauthz==0.6.0 ; python_version >= "3.8" and python_version < "3.13"
-cloudbridge==3.2.0 ; python_version >= "3.8" and python_version < "3.13"
-colorama==0.4.6 ; python_version >= "3.8" and python_version < "3.13" and platform_system == "Windows"
-coloredlogs==15.0.1 ; python_version >= "3.8" and python_version < "3.13"
-conda-package-streaming==0.11.0 ; python_version >= "3.8" and python_version < "3.13"
-cryptography==43.0.3 ; python_version >= "3.8" and python_version < "3.13"
-cwl-upgrader==1.2.11 ; python_version >= "3.8" and python_version < "3.13"
-cwl-utils==0.35 ; python_version >= "3.8" and python_version < "3.13"
-cwltool==3.1.20241007082533 ; python_version >= "3.8" and python_version < "3.13"
-defusedxml==0.7.1 ; python_version >= "3.8" and python_version < "3.13"
-deprecation==2.1.0 ; python_version >= "3.8" and python_version < "3.13"
-dictobj==0.4 ; python_version >= "3.8" and python_version < "3.13"
-dnspython==2.6.1 ; python_version >= "3.8" and python_version < "3.13"
-docopt==0.6.2 ; python_version >= "3.8" and python_version < "3.13"
-docutils==0.20.1 ; python_version >= "3.8" and python_version < "3.13"
-dparse==0.6.3 ; python_version >= "3.8" and python_version < "3.13"
-edam-ontology==1.25.2 ; python_version >= "3.8" and python_version < "3.13"
-email-validator==2.2.0 ; python_version >= "3.8" and python_version < "3.13"
-exceptiongroup==1.2.2 ; python_version >= "3.8" and python_version < "3.11"
-fastapi-slim==0.115.3 ; python_version >= "3.8" and python_version < "3.13"
-filelock==3.16.1 ; python_version >= "3.8" and python_version < "3.13"
-frozenlist==1.5.0 ; python_version >= "3.8" and python_version < "3.13"
-fs==2.4.16 ; python_version >= "3.8" and python_version < "3.13"
-fsspec==2024.10.0 ; python_version >= "3.8" and python_version < "3.13"
-future==1.0.0 ; python_version >= "3.8" and python_version < "3.13"
-galaxy2cwl==0.1.4 ; python_version >= "3.8" and python_version < "3.13"
-graphene-sqlalchemy==3.0.0rc1 ; python_version >= "3.8" and python_version < "3.13"
-graphene==3.4 ; python_version >= "3.8" and python_version < "3.13"
-graphql-core==3.2.5 ; python_version >= "3.8" and python_version < "3.13"
-graphql-relay==3.2.0 ; python_version >= "3.8" and python_version < "3.13"
-gravity==1.0.6 ; python_version >= "3.8" and python_version < "3.13"
-greenlet==3.1.1 ; python_version < "3.13" and (platform_machine == "aarch64" or platform_machine == "ppc64le" or platform_machine == "x86_64" or platform_machine == "amd64" or platform_machine == "AMD64" or platform_machine == "win32" or platform_machine == "WIN32") and python_version >= "3.8"
-gunicorn==23.0.0 ; python_version >= "3.8" and python_version < "3.13"
-gxformat2==0.20.0 ; python_version >= "3.8" and python_version < "3.13"
-h11==0.14.0 ; python_version >= "3.8" and python_version < "3.13"
-h5grove==2.3.0 ; python_version >= "3.8" and python_version < "3.13"
-h5py==3.11.0 ; python_version >= "3.8" and python_version < "3.9"
-h5py==3.12.1 ; python_version >= "3.9" and python_version < "3.13"
-humanfriendly==10.0 ; python_version >= "3.8" and python_version < "3.13"
-idna==3.10 ; python_version >= "3.8" and python_version < "3.13"
-importlib-metadata==8.5.0 ; python_version >= "3.8" and python_version < "3.13"
-importlib-resources==6.4.5 ; python_version >= "3.8" and python_version < "3.9"
-isa-rwval @ git+https://github.com/nsoranzo/isa-rwval.git@3d989181058d2765a93cb0e7ca85d6955e0eb6ef ; python_version >= "3.8" and python_version < "3.13"
-isal==1.7.1 ; python_version >= "3.8" and python_version < "3.13"
-isodate==0.6.1 ; python_version >= "3.8" and python_version < "3.13"
-jinja2==3.1.4 ; python_version >= "3.8" and python_version < "3.13"
-jmespath==1.0.1 ; python_version >= "3.8" and python_version < "3.13"
-jsonref==1.1.0 ; python_version >= "3.8" and python_version < "3.13"
-jsonschema-specifications==2023.12.1 ; python_version >= "3.8" and python_version < "3.13"
-jsonschema==4.23.0 ; python_version >= "3.8" and python_version < "3.13"
-kombu==5.4.2 ; python_version >= "3.8" and python_version < "3.13"
-lagom==2.6.0 ; python_version >= "3.8" and python_version < "3.13"
-lxml==5.3.0 ; python_version >= "3.8" and python_version < "3.13"
-mako==1.3.6 ; python_version >= "3.8" and python_version < "3.13"
-markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "3.13"
-markdown==3.7 ; python_version >= "3.8" and python_version < "3.13"
-markupsafe==2.1.5 ; python_version >= "3.8" and python_version < "3.13"
-mdurl==0.1.2 ; python_version >= "3.8" and python_version < "3.13"
-mercurial==6.8.1 ; python_version >= "3.8" and python_version < "3.13"
-mistune==3.0.2 ; python_version >= "3.8" and python_version < "3.13"
-mrcfile==1.5.3 ; python_version >= "3.8" and python_version < "3.13"
-msal==1.31.0 ; python_version >= "3.8" and python_version < "3.13"
-msgpack==1.1.0 ; python_version >= "3.8" and python_version < "3.13"
-multidict==6.1.0 ; python_version >= "3.8" and python_version < "3.13"
-mypy-extensions==1.0.0 ; python_version >= "3.8" and python_version < "3.13"
-networkx==3.1 ; python_version >= "3.8" and python_version < "3.13"
-nodeenv==1.9.1 ; python_version >= "3.8" and python_version < "3.13"
-numpy==1.24.4 ; python_version >= "3.8" and python_version < "3.9"
-numpy==2.0.2 ; python_version >= "3.9" and python_version < "3.10"
-numpy==2.1.2 ; python_version >= "3.10" and python_version < "3.13"
-oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "3.13"
-orjson==3.10.10 ; python_version >= "3.8" and python_version < "3.13"
-oyaml==1.0 ; python_version >= "3.8" and python_version < "3.13"
-packaging==24.1 ; python_version >= "3.8" and python_version < "3.13"
-paramiko==3.5.0 ; python_version >= "3.8" and python_version < "3.13"
-parsley==1.3 ; python_version >= "3.8" and python_version < "3.13"
-paste==3.10.1 ; python_version >= "3.8" and python_version < "3.13"
-pastedeploy==3.1.0 ; python_version >= "3.8" and python_version < "3.13"
-pebble==5.0.7 ; python_version >= "3.8" and python_version < "3.13"
-pillow==10.4.0 ; python_version >= "3.8" and python_version < "3.13"
-pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9"
-promise==2.3 ; python_version >= "3.8" and python_version < "3.13"
-prompt-toolkit==3.0.48 ; python_version >= "3.8" and python_version < "3.13"
-propcache==0.2.0 ; python_version >= "3.8" and python_version < "3.13"
-prov==1.5.1 ; python_version >= "3.8" and python_version < "3.13"
-psutil==6.1.0 ; python_version >= "3.8" and python_version < "3.13"
-pulsar-galaxy-lib==0.15.6 ; python_version >= "3.8" and python_version < "3.13"
-pycparser==2.22 ; python_version >= "3.8" and python_version < "3.13"
-pycryptodome==3.21.0 ; python_version >= "3.8" and python_version < "3.13"
-pydantic-core==2.23.4 ; python_version >= "3.8" and python_version < "3.13"
-pydantic-tes==0.1.5 ; python_version >= "3.8" and python_version < "3.13"
-pydantic==2.9.2 ; python_version >= "3.8" and python_version < "3.13"
-pydantic[email]==2.9.2 ; python_version >= "3.8" and python_version < "3.13"
-pydot==2.0.0 ; python_version >= "3.8" and python_version < "3.13"
-pyeventsystem==0.1.0 ; python_version >= "3.8" and python_version < "3.13"
-pyfaidx==0.8.1.3 ; python_version >= "3.8" and python_version < "3.13"
-pygments==2.18.0 ; python_version >= "3.8" and python_version < "3.13"
-pyjwt==2.9.0 ; python_version >= "3.8" and python_version < "3.13"
-pyjwt[crypto]==2.9.0 ; python_version >= "3.8" and python_version < "3.13"
-pykwalify==1.8.0 ; python_version >= "3.8" and python_version < "3.13"
-pylibmagic==0.5.0 ; python_version >= "3.8" and python_version < "3.13"
-pynacl==1.5.0 ; python_version >= "3.8" and python_version < "3.13"
-pyparsing==3.1.4 ; python_version >= "3.8" and python_version < "3.13"
-pyreadline3==3.5.4 ; sys_platform == "win32" and python_version >= "3.8" and python_version < "3.13"
-pysam==0.22.1 ; python_version >= "3.8" and python_version < "3.13"
-python-dateutil==2.9.0.post0 ; python_version >= "3.8" and python_version < "3.13"
-python-magic==0.4.27 ; python_version >= "3.8" and python_version < "3.13"
-python-multipart==0.0.12 ; python_version >= "3.8" and python_version < "3.13"
-python3-openid==3.2.0 ; python_version >= "3.8" and python_version < "3.13"
-pytz==2024.2 ; python_version >= "3.8" and python_version < "3.13"
-pyyaml==6.0.2 ; python_version >= "3.8" and python_version < "3.13"
-pyzmq==26.2.0 ; python_version >= "3.8" and python_version < "3.13"
-rdflib==6.3.2 ; python_version >= "3.8" and python_version < "3.13"
-referencing==0.35.1 ; python_version >= "3.8" and python_version < "3.13"
-refgenconf==0.12.2 ; python_version >= "3.8" and python_version < "3.13"
-regex==2024.9.11 ; python_version >= "3.8" and python_version < "3.13"
-repoze-lru==0.7 ; python_version >= "3.8" and python_version < "3.13"
-requests-oauthlib==2.0.0 ; python_version >= "3.8" and python_version < "3.13"
-requests-toolbelt==1.0.0 ; python_version >= "3.8" and python_version < "3.13"
-requests-unixsocket==0.3.0 ; python_version >= "3.8" and python_version < "3.13"
-requests==2.32.3 ; python_version >= "3.8" and python_version < "3.13"
-rich==13.9.3 ; python_version >= "3.8" and python_version < "3.13"
-rocrate==0.11.0 ; python_version >= "3.8" and python_version < "3.13"
-routes==2.5.1 ; python_version >= "3.8" and python_version < "3.13"
-rpds-py==0.20.0 ; python_version >= "3.8" and python_version < "3.13"
-ruamel-yaml-clib==0.2.8 ; platform_python_implementation == "CPython" and python_version < "3.13" and python_version >= "3.8"
-ruamel-yaml==0.18.6 ; python_version >= "3.8" and python_version < "3.13"
-s3fs==2024.10.0 ; python_version >= "3.8" and python_version < "3.13"
-schema-salad==8.7.20241010092723 ; python_version >= "3.8" and python_version < "3.13"
-setuptools-scm==5.0.2 ; python_version >= "3.8" and python_version < "3.13"
-setuptools==75.2.0 ; python_version >= "3.8" and python_version < "3.13"
-six==1.16.0 ; python_version >= "3.8" and python_version < "3.13"
-sniffio==1.3.1 ; python_version >= "3.8" and python_version < "3.13"
-social-auth-core==4.5.4 ; python_version >= "3.8" and python_version < "3.13"
-sortedcontainers==2.4.0 ; python_version >= "3.8" and python_version < "3.13"
-spython==0.3.14 ; python_version >= "3.8" and python_version < "3.13"
-sqlalchemy==2.0.35 ; python_version >= "3.8" and python_version < "3.13"
-sqlitedict==2.1.0 ; python_version >= "3.8" and python_version < "3.13"
-sqlparse==0.5.1 ; python_version >= "3.8" and python_version < "3.13"
-starlette-context==0.3.6 ; python_version >= "3.8" and python_version < "3.13"
-starlette-graphene3==0.6.0 ; python_version >= "3.8" and python_version < "3.13"
-starlette==0.41.0 ; python_version >= "3.8" and python_version < "3.13"
-supervisor==4.2.5 ; python_version >= "3.8" and python_version < "3.13"
-svgwrite==1.4.3 ; python_version >= "3.8" and python_version < "3.13"
-tenacity==9.0.0 ; python_version >= "3.8" and python_version < "3.13"
-tifffile==2023.7.10 ; python_version >= "3.8" and python_version < "3.13"
-tinydb==4.8.2 ; python_version >= "3.8" and python_version < "3.13"
-tomli==2.0.2 ; python_version >= "3.8" and python_version < "3.11"
-tornado==6.4.1 ; python_version >= "3.8" and python_version < "3.13"
-tqdm==4.66.5 ; python_version >= "3.8" and python_version < "3.13"
-tuspy==1.0.3 ; python_version >= "3.8" and python_version < "3.13"
-tuswsgi==0.5.5 ; python_version >= "3.8" and python_version < "3.13"
-typing-extensions==4.12.2 ; python_version >= "3.8" and python_version < "3.13"
-tzdata==2024.2 ; python_version >= "3.8" and python_version < "3.13"
-tzlocal==5.2 ; python_version >= "3.8" and python_version < "3.13"
-ubiquerg==0.8.0 ; python_version >= "3.8" and python_version < "3.13"
-urllib3==1.26.20 ; python_version >= "3.8" and python_version < "3.13"
-uvicorn==0.32.0 ; python_version >= "3.8" and python_version < "3.13"
-uvloop==0.21.0 ; python_version >= "3.8" and python_version < "3.13"
-vine==5.1.0 ; python_version >= "3.8" and python_version < "3.13"
-wcwidth==0.2.13 ; python_version >= "3.8" and python_version < "3.13"
-webencodings==0.5.1 ; python_version >= "3.8" and python_version < "3.13"
-webob==1.8.9 ; python_version >= "3.8" and python_version < "3.13"
-whoosh==2.7.4 ; python_version >= "3.8" and python_version < "3.13"
-wrapt==1.16.0 ; python_version >= "3.8" and python_version < "3.13"
-yacman==0.9.3 ; python_version >= "3.8" and python_version < "3.13"
-yarl==1.15.2 ; python_version >= "3.8" and python_version < "3.13"
-zipp==3.20.2 ; python_version >= "3.8" and python_version < "3.13"
-zipstream-new==1.1.8 ; python_version >= "3.8" and python_version < "3.13"
-zstandard==0.23.0 ; python_version >= "3.8" and python_version < "3.13"
+# This file was autogenerated by uv via the following command:
+#    uv export --no-hashes --no-dev
+a2wsgi==1.10.7
+adal==1.2.7
+aiobotocore==2.15.2
+aiodataloader==0.4.0
+aiofiles==24.1.0
+aiohappyeyeballs==2.4.3
+aiohttp==3.10.10
+aioitertools==0.12.0
+aiosignal==1.3.1
+alembic==1.13.3
+amqp==5.2.0
+annotated-types==0.7.0
+anyio==4.5.2
+apispec==6.6.1
+appdirs==1.4.4
+arcp==0.2.1
+argcomplete==3.5.1
+async-timeout==4.0.3 ; python_full_version < '3.11'
+attmap==0.13.2
+attrs==24.2.0
+babel==2.16.0
+backports-zoneinfo==0.2.1 ; python_full_version < '3.9'
+bagit==1.8.1
+bagit-profile==1.3.1
+bcrypt==4.2.0
+bdbag==1.7.3
+beaker==1.13.0
+billiard==4.2.1
+bioblend==1.3.0
+bleach==6.1.0
+boltons==24.0.0
+boto==2.49.0
+botocore==1.35.36
+bx-python==0.13.0
+cachecontrol==0.14.0
+celery==5.4.0
+certifi==2024.8.30
+cffi==1.17.1
+charset-normalizer==3.4.0
+cheetah3==3.2.6.post1
+circus==0.18.0
+click==8.1.7
+click-didyoumean==0.3.1
+click-plugins==1.1.1
+click-repl==0.3.0
+cloudauthz==0.6.0
+cloudbridge==3.2.0
+colorama==0.4.6 ; platform_system == 'Windows'
+coloredlogs==15.0.1
+conda-package-streaming==0.11.0
+cryptography==43.0.3
+cwl-upgrader==1.2.11
+cwl-utils==0.35
+cwltool==3.1.20241007082533
+defusedxml==0.7.1
+deprecation==2.1.0
+dictobj==0.4
+dnspython==2.6.1
+docopt==0.6.2
+docutils==0.20.1
+dparse==0.6.3
+edam-ontology==1.25.2
+email-validator==2.2.0
+exceptiongroup==1.2.2 ; python_full_version < '3.11'
+fastapi-slim==0.115.4
+filelock==3.16.1
+frozenlist==1.5.0
+fs==2.4.16
+fsspec==2024.10.0
+future==1.0.0
+galaxy2cwl==0.1.4
+graphene==3.4.1
+graphene-sqlalchemy==3.0.0rc1
+graphql-core==3.2.5
+graphql-relay==3.2.0
+gravity==1.0.6
+greenlet==3.1.1 ; (python_full_version < '3.13' and platform_machine == 'AMD64') or (python_full_version < '3.13' and platform_machine == 'WIN32') or (python_full_version < '3.13' and platform_machine == 'aarch64') or (python_full_version < '3.13' and platform_machine == 'amd64') or (python_full_version < '3.13' and platform_machine == 'ppc64le') or (python_full_version < '3.13' and platform_machine == 'win32') or (python_full_version < '3.13' and platform_machine == 'x86_64')
+gunicorn==23.0.0
+gxformat2==0.20.0
+h11==0.14.0
+h5grove==2.3.0
+h5py==3.11.0 ; python_full_version < '3.9'
+h5py==3.12.1 ; python_full_version >= '3.9'
+humanfriendly==10.0
+idna==3.10
+importlib-metadata==8.5.0
+importlib-resources==6.4.5 ; python_full_version < '3.9'
+isa-rwval @ git+https://github.com/nsoranzo/isa-rwval.git@3d989181058d2765a93cb0e7ca85d6955e0eb6ef
+isal==1.7.1
+isodate==0.6.1
+jinja2==3.1.4
+jmespath==1.0.1
+jsonref==1.1.0
+jsonschema==4.23.0
+jsonschema-specifications==2023.12.1
+kombu==5.4.2
+lagom==2.6.0
+legacy-cgi==2.6.1 ; python_full_version >= '3.13'
+lxml==5.3.0
+mako==1.3.6
+markdown==3.7
+markdown-it-py==3.0.0
+markupsafe==2.1.5
+mdurl==0.1.2
+mercurial==6.8.2
+mistune==3.0.2
+mrcfile==1.5.3
+msal==1.31.0
+msgpack==1.1.0
+multidict==6.1.0
+mypy-extensions==1.0.0
+networkx==3.1
+nodeenv==1.9.1
+numpy==1.24.4 ; python_full_version < '3.9'
+numpy==2.0.2 ; python_full_version == '3.9.*'
+numpy==2.1.2 ; python_full_version >= '3.10'
+oauthlib==3.2.2
+orjson==3.10.10
+oyaml==1.0
+packaging==24.1
+paramiko==3.5.0
+parsley==1.3
+paste==3.10.1
+pastedeploy==3.1.0
+pebble==5.0.7
+pillow==10.4.0
+pkgutil-resolve-name==1.3.10 ; python_full_version < '3.9'
+promise==2.3
+prompt-toolkit==3.0.48
+propcache==0.2.0
+prov==1.5.1
+psutil==6.1.0
+pulsar-galaxy-lib==0.15.6
+pycparser==2.22
+pycryptodome==3.21.0
+pydantic==2.9.2
+pydantic-core==2.23.4
+pydantic-tes==0.1.5
+pydot==2.0.0
+pyeventsystem==0.1.0
+pyfaidx==0.8.1.3
+pygments==2.18.0
+pyjwt==2.9.0
+pykwalify==1.8.0
+pylibmagic==0.5.0
+pynacl==1.5.0
+pyparsing==3.1.4
+pyreadline3==3.5.4 ; sys_platform == 'win32'
+pysam==0.22.1
+python-dateutil==2.9.0.post0
+python-magic==0.4.27
+python-multipart==0.0.16
+python3-openid==3.2.0
+pytz==2024.2
+pyyaml==6.0.2
+pyzmq==26.2.0
+rdflib==6.3.2
+referencing==0.35.1
+refgenconf==0.12.2
+regex==2024.9.11
+repoze-lru==0.7
+requests==2.32.3
+requests-oauthlib==2.0.0
+requests-toolbelt==1.0.0
+requests-unixsocket==0.3.0
+rich==13.9.3
+rocrate==0.11.0
+routes==2.5.1
+rpds-py==0.20.0
+ruamel-yaml==0.18.6
+ruamel-yaml-clib==0.2.8 ; python_full_version < '3.13' and platform_python_implementation == 'CPython'
+s3fs==2024.10.0
+schema-salad==8.7.20241010092723
+setuptools==75.2.0
+setuptools-scm==5.0.2
+six==1.16.0
+sniffio==1.3.1
+social-auth-core==4.5.4
+sortedcontainers==2.4.0
+spython==0.3.14
+sqlalchemy==2.0.35
+sqlitedict==2.1.0
+sqlparse==0.5.1
+starlette==0.41.2
+starlette-context==0.3.6
+starlette-graphene3==0.6.0
+supervisor==4.2.5
+svgwrite==1.4.3
+tenacity==9.0.0
+tifffile==2023.7.10
+tinydb==4.8.2
+tomli==2.0.2 ; python_full_version < '3.11'
+tornado==6.4.1
+tqdm==4.66.6
+tuspy==1.0.3
+tuswsgi==0.5.5
+typing-extensions==4.12.2
+tzdata==2024.2
+tzlocal==5.2
+ubiquerg==0.8.0
+urllib3==1.26.20
+uvicorn==0.32.0
+uvloop==0.21.0
+vine==5.1.0
+wcwidth==0.2.13
+webencodings==0.5.1
+webob==1.8.9
+whoosh==2.7.4
+wrapt==1.16.0
+yacman==0.9.3
+yarl==1.15.2
+zipp==3.20.2
+zipstream-new==1.1.8
+zstandard==0.23.0
diff --git a/lib/galaxy/dependencies/pinned-typecheck-requirements.txt b/lib/galaxy/dependencies/pinned-typecheck-requirements.txt
index 30501dcbe567..a835c64276fa 100644
--- a/lib/galaxy/dependencies/pinned-typecheck-requirements.txt
+++ b/lib/galaxy/dependencies/pinned-typecheck-requirements.txt
@@ -1,30 +1,32 @@
-annotated-types==0.7.0 ; python_version >= "3.8" and python_version < "3.13"
-boto3-stubs[s3]==1.35.49 ; python_version >= "3.8" and python_version < "3.13"
-botocore-stubs==1.35.49 ; python_version >= "3.8" and python_version < "3.13"
-cffi==1.17.1 ; python_version >= "3.8" and python_version < "3.13" and platform_python_implementation != "PyPy"
-cryptography==43.0.3 ; python_version >= "3.8" and python_version < "3.13"
-lxml-stubs==0.5.1 ; python_version >= "3.8" and python_version < "3.13"
-mypy-boto3-s3==1.35.46 ; python_version >= "3.8" and python_version < "3.13"
-mypy-extensions==1.0.0 ; python_version >= "3.8" and python_version < "3.13"
-mypy==1.13.0 ; python_version >= "3.8" and python_version < "3.13"
-pycparser==2.22 ; python_version >= "3.8" and python_version < "3.13" and platform_python_implementation != "PyPy"
-pydantic-core==2.23.4 ; python_version >= "3.8" and python_version < "3.13"
-pydantic==2.9.2 ; python_version >= "3.8" and python_version < "3.13"
-tomli==2.0.2 ; python_version >= "3.8" and python_version < "3.11"
-types-awscrt==0.23.0 ; python_version >= "3.8" and python_version < "3.13"
-types-bleach==6.1.0.20240331 ; python_version >= "3.8" and python_version < "3.13"
-types-boto==2.49.18.20241019 ; python_version >= "3.8" and python_version < "3.13"
-types-contextvars==2.4.7.3 ; python_version >= "3.8" and python_version < "3.13"
-types-dataclasses==0.6.6 ; python_version >= "3.8" and python_version < "3.13"
-types-docutils==0.21.0.20241005 ; python_version >= "3.8" and python_version < "3.13"
-types-html5lib==1.1.11.20241018 ; python_version >= "3.8" and python_version < "3.13"
-types-markdown==3.7.0.20240822 ; python_version >= "3.8" and python_version < "3.13"
-types-paramiko==3.5.0.20240928 ; python_version >= "3.8" and python_version < "3.13"
-types-python-dateutil==2.9.0.20241003 ; python_version >= "3.8" and python_version < "3.13"
-types-pyyaml==6.0.12.20240917 ; python_version >= "3.8" and python_version < "3.13"
-types-requests==2.31.0.6 ; python_version >= "3.8" and python_version < "3.13"
-types-s3transfer==0.10.3 ; python_version >= "3.8" and python_version < "3.13"
-types-setuptools==75.2.0.20241025 ; python_version >= "3.8" and python_version < "3.13"
-types-six==1.16.21.20241009 ; python_version >= "3.8" and python_version < "3.13"
-types-urllib3==1.26.25.14 ; python_version >= "3.8" and python_version < "3.13"
-typing-extensions==4.12.2 ; python_version >= "3.8" and python_version < "3.13"
+# This file was autogenerated by uv via the following command:
+#    uv export --no-hashes --only-group=typecheck
+annotated-types==0.7.0
+boto3-stubs==1.35.49
+botocore-stubs==1.35.49
+cffi==1.17.1 ; platform_python_implementation != 'PyPy'
+cryptography==43.0.3
+lxml-stubs==0.5.1
+mypy==1.13.0
+mypy-boto3-s3==1.35.46
+mypy-extensions==1.0.0
+pycparser==2.22 ; platform_python_implementation != 'PyPy'
+pydantic==2.9.2
+pydantic-core==2.23.4
+tomli==2.0.2 ; python_full_version < '3.11'
+types-awscrt==0.23.0
+types-bleach==6.1.0.20240331
+types-boto==2.49.18.20241019
+types-contextvars==2.4.7.3
+types-dataclasses==0.6.6
+types-docutils==0.21.0.20241005
+types-html5lib==1.1.11.20241018
+types-markdown==3.7.0.20240822
+types-paramiko==3.5.0.20240928
+types-python-dateutil==2.9.0.20241003
+types-pyyaml==6.0.12.20240917
+types-requests==2.31.0.6
+types-s3transfer==0.10.3
+types-setuptools==75.2.0.20241025
+types-six==1.16.21.20241009
+types-urllib3==1.26.25.14
+typing-extensions==4.12.2
diff --git a/lib/galaxy/dependencies/update.sh b/lib/galaxy/dependencies/update.sh
index 8175144aba5d..2d26f6b40bef 100755
--- a/lib/galaxy/dependencies/update.sh
+++ b/lib/galaxy/dependencies/update.sh
@@ -1,25 +1,25 @@
 #!/bin/sh
 
-# This script installs poetry if it's not already installed in the user account.
-# It then runs poetry inside Galaxy's root directory, potentially updating 
-# pyproject.toml and poetry.lock, and the pinned and dev requirements files.
+# This script installs uv if it's not already installed in the user account.
+# It then runs uv inside Galaxy's root directory, potentially updating
+# pyproject.toml and uv.lock, and the pinned requirements files.
 
 set -e
 
-SUPPORTED_PYTHON_VERSIONS="3.8 3.9 3.10 3.11 3.12"
-NOT_SUPPORTED_NEXT_PYTHON_VERSION="3.13"
-
 this_directory="$(cd "$(dirname "$0")" > /dev/null && pwd)"
 
 usage() {
-    printf "Usage: %s: [-a] [pkg_spec...]\n" "${0##*/}" >&2
+    printf "Usage: %s: [-p pkg]\n" "${0##*/}" >&2
 }
 
-add=
-while getopts 'a' OPTION
+pkg=
+while getopts 'p:h' OPTION
 do
     case $OPTION in
-        a) add=1
+        p) pkg="$OPTARG"
+           ;;
+        h) usage
+           exit 0
            ;;
         ?) usage
            exit 2
@@ -28,68 +28,20 @@ do
 done
 shift $((OPTIND - 1))
 
-if [ -n "$add" ] && [ $# -eq 0 ]; then
-    printf "When adding (-a), you must provide at least one package specification.\n" >&2
-    usage
-    exit 2
-fi
-
-# Install the latest version of poetry into the user account
-curl -sSL https://install.python-poetry.org | python3 -
-poetry self add 'poetry-plugin-export!=1.7.0'  # https://github.com/python-poetry/poetry-plugin-export/issues/269
+# Create a virtual environment in a tmp directory and install uv into it
+uv_venv=$(mktemp -d "${TMPDIR:-/tmp}/uv_venv.XXXXXXXXXX")
+python3 -m venv "${uv_venv}"
+"${uv_venv}/bin/python" -m pip install uv
+uv="${uv_venv}/bin/uv"
 
-# Run poetry (this may update pyproject.toml and poetry.lock).
-if [ -z "$add" ]; then
-    poetry update -vv --lock "$@"
+# Run uv (this may update pyproject.toml and uv.lock).
+if [ -n "$pkg" ]; then
+    ${uv} lock --upgrade-package "$pkg"
 else
-    poetry add -vv --lock "$@"
+    ${uv} lock
 fi
 
 # Update pinned requirements files.
-PINNED_REQUIREMENTS_FILE=$this_directory/pinned-requirements.txt
-PINNED_DEV_REQUIREMENTS_FILE=$this_directory/dev-requirements.txt
-poetry export -f requirements.txt --without-hashes --output "$PINNED_REQUIREMENTS_FILE"
-poetry export --only dev -f requirements.txt --without-hashes --output "$PINNED_DEV_REQUIREMENTS_FILE"
-poetry export --only typecheck -f requirements.txt --without-hashes --output "$this_directory/pinned-typecheck-requirements.txt"
-
-# Fix requirements
-
-latest_package_version_for_python_version () {
-    PIP_INDEX_OUT=$(pip index versions --python-version "$2" "$1")
-    echo "$PIP_INDEX_OUT" | head -n 1 | sed -e 's/.* (\(.*\)).*/\1/'
-}
-
-split_requirement () {
-    PACKAGE_NAME=$1
-
-    if ! pip index version --help >/dev/null; then
-        echo "pip >= 21.2.1 required for the 'index' command"
-        exit 1
-    fi
-
-    NEW_REQUIREMENTS=
-    PREVIOUS_LATEST_PACKAGE_VERSION=
-    for PYTHON_VERSION in $SUPPORTED_PYTHON_VERSIONS; do
-        LATEST_PACKAGE_VERSION=$(latest_package_version_for_python_version "$PACKAGE_NAME" "$PYTHON_VERSION")
-        if [ -z "$NEW_REQUIREMENTS" ]; then
-            NEW_REQUIREMENTS="$PACKAGE_NAME==$LATEST_PACKAGE_VERSION ; python_version >= \"$PYTHON_VERSION\""
-        elif [ "$LATEST_PACKAGE_VERSION" != "$PREVIOUS_LATEST_PACKAGE_VERSION" ]; then
-            NEW_REQUIREMENTS="$NEW_REQUIREMENTS and python_version < \"$PYTHON_VERSION\"\n$PACKAGE_NAME==$LATEST_PACKAGE_VERSION ; python_version >= \"$PYTHON_VERSION\""
-        fi
-        PREVIOUS_LATEST_PACKAGE_VERSION=$LATEST_PACKAGE_VERSION
-    done
-    if [ -n "$NOT_SUPPORTED_NEXT_PYTHON_VERSION" ]; then
-        NEW_REQUIREMENTS="$NEW_REQUIREMENTS and python_version < \"$NOT_SUPPORTED_NEXT_PYTHON_VERSION\""
-    fi
-
-    sed -i.orig -e "s/^$PACKAGE_NAME==.*/$NEW_REQUIREMENTS/" "$PINNED_REQUIREMENTS_FILE" "$PINNED_DEV_REQUIREMENTS_FILE"
-}
-
-# For some packages there is no recent version that works on all Python versions
-# supported by Galaxy, so Poetry resorts to an old version. Here we replace any
-# such requirement with multiple Python-version-specific requirements.
-split_requirement contourpy
-split_requirement h5py
-split_requirement matplotlib
-split_requirement numpy
-split_requirement scipy
+${uv} export --no-hashes --no-dev > "$this_directory/pinned-requirements.txt"
+${uv} export --no-hashes --only-group=dev > "$this_directory/dev-requirements.txt"
+${uv} export --no-hashes --only-group=typecheck > "$this_directory/pinned-typecheck-requirements.txt"
diff --git a/pyproject.toml b/pyproject.toml
index 96860904bd55..131444f7c10b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,3 +1,182 @@
+[project]
+name = "galaxy"
+version = "0.1.0"  # Not the real version, which is instead defined in lib/galaxy/version.py
+description = "Galaxy is an open, web-based platform for accessible, reproducible, and transparent computational research."
+authors = [
+    {name = "Galaxy Contributors"},
+]
+maintainers = [
+    {name = "Galaxy Committers", email = "galaxy-committers@lists.galaxyproject.org"}
+]
+license = {file = "LICENSE.txt"}
+readme = "README.rst"
+requires-python = ">=3.8"
+dependencies = [
+    "a2wsgi",
+    "aiofiles",
+    "alembic",
+    "apispec",
+    "Babel",
+    "bdbag>=1.6.3",
+    "Beaker",
+    "bioblend",
+    "bleach",
+    "boltons",
+    "boto",
+    "bx-python",
+    "celery",
+    "Cheetah3",
+    "cloudauthz==0.6.0",
+    "cloudbridge",
+    "circus",
+    "conda-package-streaming",
+    "cwltool>=3.1.20230624081518",  # save time, minimum needed by cwl-1.0 branch
+    "dictobj",
+    "dnspython",
+    "docutils!=0.17,!=0.17.1",
+    "dparse",
+    "edam-ontology",
+    "fastapi-slim>=0.111.0",
+    "fs",
+    "future>=1.0.0",  # Python 3.12 support
+    "graphene",
+    "graphene-sqlalchemy>=3.0.0rc1",  # need a beta release to be compat. with starlette plugin
+    "graphql-core",
+    "gravity>=1.0.4",
+    "gunicorn",
+    "gxformat2",
+    "h5grove>=1.2.1",
+    "h5py",  # Python 3.8 support
+    "h5py>=3.12 ; python_version>='3.9'",  # Python 3.13 support
+    "importlib-resources ; python_version<'3.9'",  # for importlib.{abc.Traversable,resources.{files, Package}}
+    "isa-rwval @ git+https://github.com/nsoranzo/isa-rwval.git@master",  # https://github.com/ISA-tools/isa-rwval/pull/17
+    "isal",
+    "jinja2",
+    "kombu>=5.3",  # for importlib-metadata fix
+    "lagom",
+    "Mako",
+    "Markdown",
+    "MarkupSafe",
+    "mercurial",
+    "mrcfile",
+    "msal",
+    "nodeenv",
+    "numpy",
+    "numpy>=1.26.0 ; python_version=='3.9'",  # Python 3.12 support
+    "numpy>=2.1.0 ; python_version>='3.10'",  # Python 3.13 support
+    "packaging",
+    "paramiko!=2.9.0,!=2.9.1",  # https://github.com/paramiko/paramiko/issues/1961
+    "Parsley",
+    "Paste",
+    "pebble",
+    "pillow",
+    "psutil",
+    "pulsar-galaxy-lib>=0.15.0.dev0",
+    "pycryptodome",
+    "pydantic[email]>=2.7.4",  # https://github.com/pydantic/pydantic/pull/9639
+    "PyJWT",
+    "pykwalify",
+    "pylibmagic",
+    "pyparsing",
+    "pysam>=0.21",  # for Python 3.11 support on macOS
+    "python-dateutil",
+    "python-magic",
+    "python-multipart",  # required to support form parsing in FastAPI/Starlette
+    "PyYAML",
+    "refgenconf>=0.12.0",
+    "regex",
+    "requests",
+    "rocrate",
+    "Routes",
+    "s3fs>=2023.1.0",
+    "schema-salad!=8.3.20220721194857",  # https://github.com/common-workflow-language/schema_salad/issues/575
+    "social-auth-core>=4.5.0",  # to drop dependency on abandoned python-jose
+    "sortedcontainers",
+    "SQLAlchemy>=2.0,<2.1,!=2.0.36",  # https://github.com/sqlalchemy/sqlalchemy/issues/12019,
+    "sqlitedict",
+    "sqlparse",
+    "starlette",
+    "starlette-context",
+    "starlette-graphene3",
+    "svgwrite",
+    "tifffile",
+    "tuswsgi",
+    "typing-extensions",
+    "uvicorn!=0.28.0",  # https://github.com/galaxyproject/galaxy/issues/17669
+    "uvloop",
+    "WebOb",
+    "Whoosh",
+    "zipstream-new",
+]
+
+[project.urls]
+Homepage = "https://galaxyproject.org/"
+Documentation = "https://docs.galaxyproject.org/"
+Repository = "https://github.com/galaxyproject/galaxy"
+"Bug Tracker" = "https://github.com/galaxyproject/galaxy/issues"
+
+[dependency-groups]
+dev = [
+    "ase>=3.18.1",
+    "axe-selenium-python",
+    "black",
+    "boto3",
+    "codespell",
+    "cwltest",
+    "darker",
+    "fluent-logger",
+    "galaxy-release-util",
+    "httpx",
+    "isort",
+    "lxml!=4.2.2",
+    "markdown-it-reporter",
+    "myst-parser",
+    "onedatafilerestclient==21.2.5.2",
+    "pkce",
+    "playwright",
+    "pytest<8",  # https://github.com/galaxyproject/galaxy/issues/17561
+    "pytest-asyncio",
+    "pytest-cov",
+    "pytest-html",
+    "pytest-httpserver",
+    "python-irodsclient!=1.1.2",  # https://github.com/irods/python-irodsclient/issues/356
+    "pytest-json-report",
+    "pytest-mock",
+    "pytest-playwright",
+    "pytest-postgresql!=3.0.0",  # https://github.com/ClearcodeHQ/pytest-postgresql/issues/426
+    "pytest-shard",
+    "responses",
+    "rucio-clients>=33.6.0 ; python_version>='3.9'",  # https://github.com/galaxyproject/galaxy/pull/17156
+    "selenium",
+    "seletools",
+    "Sphinx>=4.0",  # support docutils 0.17
+    "sphinx-rtd-theme",
+    "statsd",
+    "testfixtures",
+    "tuspy",
+    "twill>=3.2.1",  # https://github.com/twill-tools/twill/issues/18
+    "watchdog",
+    "Werkzeug",
+]
+typecheck = [
+    "boto3-stubs[s3]",
+    "lxml-stubs",
+    "mypy",
+    "pydantic>=2.7.4",  # for pydantic.mypy plugin
+    "types-bleach",
+    "types-boto",
+    "types-contextvars",
+    "types-dataclasses",
+    "types-docutils",
+    "types-Markdown",
+    "types-paramiko",
+    "types-python-dateutil",
+    "types-PyYAML",
+    "types-requests",
+    "types-setuptools",
+    "types-six",
+]
+
 [tool.black]
 line-length = 120
 target-version = ['py38']
@@ -12,186 +191,10 @@ extend-exclude = '''
 [tool.darker]
 isort = true
 
-[tool.poetry]
-package-mode = false
-name = "galaxy"
-description = "Galaxy is an open, web-based platform for accessible, reproducible, and transparent computational research."
-authors = ["Galaxy Contributors"]
-license = "AFL-3.0"
-readme = "README.rst"
-homepage = "https://galaxyproject.org/"
-repository = "https://github.com/galaxyproject/galaxy/"
-documentation = "https://docs.galaxyproject.org/"
-
-[[tool.poetry.source]]
-name = "galaxyproject"
-url = "https://wheels.galaxyproject.org/simple"
-priority = "primary"
-
-[[tool.poetry.source]]
-name = "PyPI"
-priority = "primary"
-
-[tool.poetry.dependencies]
-a2wsgi = "*"
-aiofiles = "*"
-alembic = "*"
-apispec = "*"
-Babel = "*"
-bdbag = ">=1.6.3"
-Beaker = "*"
-bioblend = "*"
-bleach = "*"
-boltons = "*"
-boto = "*"
-bx-python = "*"
-celery = "*"
-Cheetah3 = "*"
-cloudauthz = "==0.6.0"
-cloudbridge = "*"
-circus = "*"
-cwltool = ">=3.1.20230624081518"  # save time, minimum needed by cwl-1.0 branch
-conda-package-streaming = "*"
-dictobj = "*"
-dnspython = "*"
-docutils = "!=0.17, !=0.17.1"
-dparse = "*"
-edam-ontology = "*"
-fastapi-slim = ">=0.111.0"
-fs = "*"
-future = ">=1.0.0"  # Python 3.12 support
-graphene = "*"
-graphene-sqlalchemy = ">=3.0.0rc1"  # need a beta release to be compat. with starlette plugin
-graphql-core = "*"
-gravity = ">=1.0.4"
-gunicorn = "*"
-gxformat2 = "*"
-h5grove = ">=1.2.1"
-h5py = "*"
-importlib-resources = { version = "*", python = "<3.9" }  # for importlib.{abc.Traversable,resources.{files, Package}}
-isa-rwval = { git = "https://github.com/nsoranzo/isa-rwval.git", branch = "master" }  # https://github.com/ISA-tools/isa-rwval/pull/17
-jinja2 = "*"
-kombu = ">=5.3"  # for importlib-metadata fix
-isal = "*"
-lagom = "*"
-Mako = "*"
-Markdown = "*"
-MarkupSafe = "*"
-Mercurial = "*"
-mrcfile = "*"
-msal = "*"
-nodeenv = "*"
-numpy = "*"
-packaging = "*"
-paramiko = "!=2.9.0, !=2.9.1"  # https://github.com/paramiko/paramiko/issues/1961
-Parsley = "*"
-Paste = "*"
-pebble = "*"
-pillow = "*"
-psutil = "*"
-pulsar-galaxy-lib = ">=0.15.0.dev0"
-pycryptodome = "*"
-pydantic = {version = ">=2.7.4", extras = ["email"]}  # https://github.com/pydantic/pydantic/pull/9639
-PyJWT = "*"
-pykwalify = "*"
-pylibmagic = "*"
-pyparsing = "*"
-pysam = ">=0.21"  # for Python 3.11 support on macOS
-python = ">=3.8,<3.13"  # Keep maximum version strict to appease numpy and scipy
-python-dateutil = "*"
-python-magic = "*"
-python-multipart = "*"  # required to support form parsing in FastAPI/Starlette
-PyYAML = "*"
-refgenconf = ">=0.12.0"
-regex = "*"
-requests = "*"
-rocrate = "*"
-Routes = "*"
-schema-salad = "!=8.3.20220721194857"  # https://github.com/common-workflow-language/schema_salad/issues/575
-social-auth-core = ">=4.5.0"  # to drop dependency on abandoned python-jose
-sortedcontainers = "*"
-SQLAlchemy = ">=2.0,<2.1,!=2.0.36"  # https://github.com/sqlalchemy/sqlalchemy/issues/12019
-sqlitedict = "*"
-sqlparse = "*"
-starlette = "*"
-starlette-context = "*"
-starlette-graphene3 = "*"
-svgwrite = "*"
-tifffile = "*"
-tuswsgi = "*"
-typing-extensions = "*"
-uvicorn = "!=0.28.0"  # https://github.com/galaxyproject/galaxy/issues/17669
-uvloop = "*"
-WebOb = "*"
-Whoosh = "*"
-zipstream-new = "*"
-s3fs = ">=2023.1.0"
-
-[tool.poetry.group.dev.dependencies]
-ase = ">=3.18.1"
-axe-selenium-python = "*"
-black = "*"
-boto3 = "*"
-codespell = "*"
-cwltest = "*"
-darker = "*"
-fluent-logger = "*"
-galaxy-release-util = "*"
-httpx = "*"
-isort = "*"
-lxml = "!=4.2.2"
-markdown-it-reporter = "*"
-myst-parser = "*"
-onedatafilerestclient = "==21.2.5.2"
-pkce = "*"
-playwright = "*"
-pytest = "*"
-pytest-asyncio = "*"
-pytest-cov = "*"
-pytest-html = "*"
-pytest-httpserver = "*"
-python-irodsclient = "!=1.1.2"  # https://github.com/irods/python-irodsclient/issues/356
-pytest-json-report = "*"
-pytest-mock = "*"
-pytest-playwright = "*"
-pytest-postgresql = "!=3.0.0"  # https://github.com/ClearcodeHQ/pytest-postgresql/issues/426
-pytest-shard = "*"
-responses = "*"
-rucio-clients = {version = ">=33.6.0", python = ">=3.9"}  # https://github.com/galaxyproject/galaxy/pull/17156
-selenium = "*"
-urllib3 = "<2"  # Necessary for poetry for resolve deps for Python 3.8+
-seletools = "*"
-Sphinx = ">=4.0"  # support docutils 0.17
-sphinx-rtd-theme = "*"
-statsd = "*"
-testfixtures = "*"
-tuspy = "*"
-twill = ">=3.2.1"  # https://github.com/twill-tools/twill/issues/18
-watchdog = "*"
-Werkzeug = "*"
-
-[tool.poetry.group.typecheck.dependencies]
-mypy = "*"
-boto3-stubs = {version = "*", extras = ["s3"]}
-lxml-stubs = "*"
-pydantic = ">=2.7.4"  # for pydantic.mypy plugin
-types-bleach = "*"
-types-boto = "*"
-types-contextvars = "*"
-types-dataclasses = "*"
-types-docutils = "*"
-types-Markdown = "*"
-types-paramiko = "*"
-types-python-dateutil = "*"
-types-PyYAML = "*"
-types-requests = "*"
-types-setuptools = "*"
-types-six = "*"
-
 [tool.ruff]
 target-version = "py38"
 exclude = [
-  "lib/tool_shed/test/test_data/repos"
+    "lib/tool_shed/test/test_data/repos"
 ]
 
 [tool.ruff.lint]
@@ -229,3 +232,9 @@ keep-runtime-typing = true
 "lib/galaxy/schema/drs/*" = ["UP006", "UP007"]
 "lib/tool_shed_client/schema/trs.py" = ["UP006", "UP007"]
 "lib/tool_shed_client/schema/trs_service_info.py" = ["UP006", "UP007"]
+
+[tool.uv]
+default-groups = []
+extra-index-url = ["https://wheels.galaxyproject.org/simple"]
+index-strategy = "unsafe-best-match"
+package = false