Files
galaxy/pyproject.toml
T
paperbenni bec3d3ad9c Drop support for Python 3.8
Drop Python 3.8 support in 5 Pulsar-compatible packages
(job_metrics, tool_util, tool_util_models, util, objectstore)
and run pyupgrade --py310-plus on their source code.

- Bump requires-python from >=3.8 to >=3.10 in all 5 packages
- Remove Python 3.8 and 3.9 classifiers
- Remove ruff per-file-ignores for UP rules on these paths
- Remove backports.zoneinfo conditional dependency
- Remove pydyf<0.11 pin from conditional-requirements.txt
- Update Makefile pyupgrade target (remove PY38_PYUPGRADE_PATHS)
- Update CI workflow to test with Python 3.10 instead of 3.8

Clean up unused deprecated typing imports after pyupgrade

Remove now-unused typing imports (Dict, List, Optional, Set, Tuple,
Type, Union) that became dead after pyupgrade --py310-plus converted
annotations to use built-in types and | syntax.

Also run ruff check --fix --select=UP007,UP045 across the entire
codebase to convert remaining Optional[X] -> X | None and
Union[X, Y] -> X | Y patterns.

Enable ruff UP007/UP045 for Python 3.10 union syntax

Remove UP007 (Union[X,Y] -> X | Y) and UP045 (Optional[X] -> X | None)
from the ruff ignore list and convert all type aliases across the
codebase. These rules were deferred while Python 3.9 was supported;
requires-python is now >=3.10.

A custom script was used because neither ruff --fix nor
pyupgrade --py310-plus converts Optional[X]/Union[X,Y] in type alias
positions (e.g. X = Union[A, B]) — they only handle annotation
positions (e.g. def f(x: Optional[int])). All 167 violations were
module-level type aliases. A few edge cases were fixed manually:
single-element Union[X,], typing.Union qualified refs, runtime
Optional[type] calls, and Annotated[Optional[...]] pydantic fields.

Fix UP007 autofix regression with string forward reference type aliases

Commit fa6bd955a0 enabled ruff UP007/UP045 and auto-fixed
module-level type aliases using Union with string forward
references, producing invalid 'str | str' expressions.

This was a known ruff bug (charliermarsh/ruff#826) that has since
been fixed in later ruff versions, but this codebase was
converted before the fix was in place.

Revert to Union syntax and restore TYPE_CHECKING imports that
ruff's TCH rule cleaned up as a side effect when it thought the
forward references were unused.
2026-06-25 15:12:05 +01:00

266 lines
8.1 KiB
TOML

[project]
name = "galaxy"
version = "0.1.0" # Not the real version, which is instead defined in lib/galaxy/version/__init__.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.10"
dependencies = [
"a2wsgi",
"aiofiles",
"alembic",
"apispec",
"Babel",
"bdbag>=1.6.3",
"Beaker",
"bioblend",
"bleach",
"boltons",
"boto",
"bx-python",
"celery>=5.4.0", # prefer not downgrading this to upgrading typing-extensions
"cloudauthz==0.6.0",
"cloudbridge",
"circus",
"conda-package-streaming",
"CT3>=3.3.3", # Python 3.13 support
"cwl-utils>=0.13",
"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>=0.133.0", # First version compatible with starlette>=1.0.0
"fissix",
"fs",
"future>=1.0.0", # Python 3.12 support
"gravity>=1.2.3", # Graceful restart on galaxy >= 26.1
"gunicorn!=25.1.0", # https://github.com/benoitc/gunicorn/discussions/3509
"gxformat2>=0.27.0",
"h5grove>=1.2.1",
"h5py>=3.12", # Python 3.13 support
"httpx",
"ijson",
"importlib-resources ; python_version<'3.12'", # for importlib.{abc.Traversable,resources.{files, Package}}
"isa-rwval>=0.10.11", # https://github.com/ISA-tools/isa-rwval/pull/17
"isal>=1.7.0", # Python 3.13 support
"jinja2",
"kombu>=5.5.0", # prefer not downgrading this to upgrading typing-extensions
"lagom",
"Mako",
"Markdown",
"MarkupSafe",
"mercurial>=7.2", # Python 3.14 support
"mrcfile",
"more-itertools",
"msal",
"nodejs-wheel>=22,<23",
"numpy>=1.26.0", # Python 3.12 support
"numpy>=2.1.0 ; python_version>='3.10'", # Python 3.13 support
"openpyxl>=3.1.5", # Minimum version ever tested with
"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.10",
"pycryptodome",
"pydantic[email]>=2.7.4", # https://github.com/pydantic/pydantic/pull/9639
"pydantic-ai>=1.56.0", # https://github.com/pydantic/pydantic-ai/security/advisories/GHSA-2jrp-274c-jhv3
"pydantic-extra-types",
"pydicom; python_version >= '3.10'",
"PyJWT",
"pykwalify",
"pylibmagic",
"pyparsing>=3.0.0",
"pypng",
"pysam>=0.21", # for Python 3.11 support on macOS
"python-dateutil",
"python-magic",
"python-multipart", # required to support form parsing in FastAPI/Starlette
"python-slugify",
"PyYAML",
"refgenconf>=0.13.0", # https://github.com/refgenie/refgenconf/pull/149
"regex",
"requests",
"rocrate<0.15.0", # https://github.com/crs4/rocrate-validator/issues/107
"Routes",
"s3fs>=2023.1.0",
"schema-salad>=8.7.20240905150001", # Python 3.13 support
"slowapi",
"social-auth-core>=4.5.0", # to drop dependency on abandoned python-jose
"sortedcontainers",
"SQLAlchemy>=2.0.37,<2.1,!=2.0.41", # https://github.com/sqlalchemy/sqlalchemy/issues/12019 , https://github.com/sqlalchemy/sqlalchemy/issues/12600
"sqlparse",
"starlette>=1.0.1", # CVE-2026-48710 BadHost
"starlette-context",
"svgwrite",
"tifffile",
"typing-extensions",
"tuspyserver",
"uvicorn!=0.28.0", # https://github.com/galaxyproject/galaxy/issues/17669
"uvloop>=0.21.0", # Python 3.13 support
"WebOb>=1.8.9", # Python 3.13 support
"Whoosh",
"zipstream-new",
"fsspec>=2025.7.0",
]
[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]
test = [
"aiocop",
"ase>=3.18.1",
"axe-selenium-python",
"boto3",
"cwltest>=2.5.20240906231108", # Python 3.13 support
"fluent-logger",
"gcsfs",
"hvac",
"lxml!=4.2.2",
"onedatafilerestclient==21.2.5.2",
"pkce",
"playwright>=1.48.0", # Python 3.13 support
"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",
"roc-validator!=0.7.2", # https://github.com/crs4/rocrate-validator/pull/97
"rucio-clients>=37.2.0", # https://github.com/rucio/rucio/pull/7665
"selenium",
"seletools",
"statsd",
"testfixtures",
"total-perspective-vortex>=3.1.1,<4", # https://github.com/galaxyproject/total-perspective-vortex/pull/173
"tuspy",
"watchdog",
"Werkzeug",
]
dev = [
{include-group = "test"},
"black",
"codespell",
"darker",
"galaxy-release-util",
"isort",
"markdown-it-reporter",
"myst-parser",
"Sphinx>=4.0", # support docutils 0.17
"sphinx-rtd-theme",
]
typecheck = [
"boto3-stubs[s3]",
"lxml-stubs",
"mypy",
"pydantic>=2.7.4", # for pydantic.mypy plugin
"types-bleach",
"types-boto",
"types-cachetools",
"types-contextvars",
"types-dataclasses",
"types-docutils",
"types-Markdown",
"types-paramiko",
"types-python-dateutil",
"types-python-slugify",
"types-PyYAML",
"types-requests",
"types-setuptools",
"types-six",
]
[tool.black]
line-length = 120
include = '\.pyi?$'
extend-exclude = '''
^/(
| packages
| lib/tool_shed/test/test_data/repos
)/
'''
[tool.darker]
isort = true
[tool.ruff]
exclude = [
"lib/tool_shed/test/test_data/repos"
]
line-length = 120
src = ["lib"]
namespace-packages = ["lib/galaxy"]
[tool.ruff.lint]
# Enable: pycodestyle errors (E), Pyflakes (F), flake8-bugbear (B),
# flake8-comprehensions (C4), flake8-logging-format (G),
# flake8-implicit-str-concat (ISC) and pyupgrade (UP)
select = ["E", "F", "B", "C4", "G", "ISC", "NPY", "UP"]
# Exceptions:
# B008 Do not perform function calls in argument defaults (for FastAPI Depends and Body)
# B9 flake8-bugbear opinionated warnings
# E402 module level import not at top of file # TODO, we would like to improve this.
# E501 is line length (delegated to black)
# G* are TODOs
ignore = ["B008", "B9", "E402", "E501", "G001", "G002", "G004"]
[tool.ruff.lint.flake8-comprehensions]
allow-dict-calls-with-keyword-arguments = true
[tool.ruff.lint.isort]
# We are not selecting "I" rules in ruff yet because the isort option
# force_grid_wrap=2 is not currently supported:
# https://github.com/astral-sh/ruff/issues/2601
case-sensitive = false
combine-as-imports = true
no-lines-before = ["local-folder"]
order-by-type = false
relative-imports-order = "closest-to-furthest"
[tool.ruff.lint.pyupgrade]
# Preserve types, even if a file imports `from __future__ import annotations`.
keep-runtime-typing = true
[tool.ruff.lint.per-file-ignores]
# Don't check pyupgrade rules on tool scripts, which may use different Python versions
"test/functional/tools/*" = ["UP"]
"tools/*" = ["UP"]
# Don't check pyupgrade rules on generated files
"lib/galaxy/schema/bco/*" = ["UP"]
"lib/galaxy/schema/drs/*" = ["UP"]
"lib/tool_shed_client/schema/trs.py" = ["UP"]
"lib/tool_shed_client/schema/trs_service_info.py" = ["UP"]
[tool.uv]
constraint-dependencies = [
"limits>=2.5.0", # prefer not downgrading this to upgrading packaging
"mirakuru!=3.0.0", # https://github.com/dbfixtures/mirakuru/pull/949
"setuptools<82", # https://github.com/PyFilesystem/pyfilesystem2/issues/597
"scipy>=1.14.1; python_version>='3.10'", # Python 3.13 support
]
default-groups = []
extra-index-url = ["https://wheels.galaxyproject.org/simple"]
index-strategy = "unsafe-best-match"
package = false