diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 544da8d..5f1fe0b 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -32,55 +32,34 @@ jobs:
fail-fast: false
matrix:
include:
- - os: ubuntu-latest
- python-version: "3.8"
- enable-coverage: "false"
- extra-pytest-warnings: ""
-
- - os: ubuntu-latest
- python-version: "3.9"
- enable-coverage: "false"
- # https://github.com/networkx/networkx/issues/7372
- extra-pytest-warnings: "-W ignore::RuntimeWarning:networkx.utils.backends"
-
- os: ubuntu-latest
python-version: "3.10"
- enable-coverage: "false"
- extra-pytest-warnings: ""
-
- - os: ubuntu-latest
- python-version: "3.11"
- enable-coverage: "false"
- extra-pytest-warnings: ""
-
- - os: ubuntu-latest
- python-version: "3.12"
enable-coverage: "true"
extra-pytest-warnings: ""
- - os: ubuntu-latest
- python-version: "3.13"
- enable-coverage: "false"
- extra-pytest-warnings: ""
-
- os: ubuntu-latest
python-version: "3.14"
enable-coverage: "false"
extra-pytest-warnings: ""
- os: windows-latest
- python-version: "3.9"
+ python-version: "3.10"
enable-coverage: "false"
extra-pytest-warnings: ""
- os: windows-latest
- python-version: "3.10"
+ python-version: "3.14"
enable-coverage: "false"
extra-pytest-warnings: ""
# Run linter / checks
checks:
uses: ewoks-kit/.github/.github/workflows/python-check.yml@main
+ with:
+ enable-black: "false"
+ enable-flake8: "false"
+ enable-isort: "false"
+ enable-ruff: "true"
# Build documentation
docs:
diff --git a/.gitignore b/.gitignore
index 163f553..54df2e6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,6 +18,7 @@ __pycache__/
*.egg-info/
.eggs/
html
+uv.lock
# workflows, tasks and icons folders
/workflows
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9c14e5a..7df4f05 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+### Changed
+
+- Minimal Python version is now 3.10
+
## [2.1.2] - 2026-03-06
### Changed
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b7e10c5..2f826a9 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -2,7 +2,7 @@
## General guidelines
-CONTRIBUTING.md
+CONTRIBUTING.md
## Starting the server
diff --git a/pyproject.toml b/pyproject.toml
index 509319b..d361984 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -14,7 +14,7 @@ classifiers = [
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 3",
]
-requires-python = ">=3.8"
+requires-python = ">=3.10"
dependencies = [
"fastapi",
"uvicorn[standard]",
@@ -34,19 +34,18 @@ Changelog = "https://github.com/ewoks-kit/ewoksserver/blob/main/CHANGELOG.md"
[project.optional-dependencies]
frontend = [
- "ewoksjob[sql]"
+ "ewoksjob[sql]",
]
test = [
"pytest >=7",
"pytest-celery",
"ewoksserver[frontend]",
"pytest-mock",
- "httpx <1.0.dev1", # https://github.com/encode/starlette/issues/2960
+ "httpx <1.0.dev1", # https://github.com/encode/starlette/issues/2960
]
dev = [
"ewoksserver[test]",
- "black >=25",
- "flake8 >=4",
+ "ruff",
"isort",
]
doc = [
@@ -57,7 +56,7 @@ doc = [
"sphinx_design",
"pydata_sphinx_theme",
"sphinx-copybutton",
- "setuptools<82", # Issue https://github.com/sphinx-contrib/redoc/issues/53
+ "setuptools<82", # Issue https://github.com/sphinx-contrib/redoc/issues/53
]
[tool.setuptools]
@@ -76,6 +75,13 @@ omit = ['*/tests/*']
ewoks-server = "ewoksserver.__main__:main"
ewoks-server-spec = "ewoksserver.spec:save"
-[tool.isort]
-profile = "black"
-force_single_line = "True"
+[tool.ruff.lint]
+select = ["E", "F", "I"]
+ignore = ["E501"]
+
+[tool.ruff.lint.per-file-ignores]
+# Ignore `S101` (assert used violations) in all test files
+"src/ewoksserver/tests/*.py" = ["S101"]
+
+[tool.ruff.lint.isort]
+force-single-line = true
diff --git a/src/ewoksserver/tests/api_versions.py b/src/ewoksserver/tests/api_versions.py
index 50fffb7..ed01a36 100644
--- a/src/ewoksserver/tests/api_versions.py
+++ b/src/ewoksserver/tests/api_versions.py
@@ -52,14 +52,14 @@ def api_root(
if min_api_version:
min_api_version_tuple = tuple(map(int, min_api_version.split(".")))
- assert (
- len(min_api_version_tuple) == 3
- ), "min_api_version must be of the form 'x.y.z'"
+ assert len(min_api_version_tuple) == 3, (
+ "min_api_version must be of the form 'x.y.z'"
+ )
if max_api_version:
max_api_version_tuple = tuple(map(int, max_api_version.split(".")))
- assert (
- len(max_api_version_tuple) == 3
- ), "max_api_version must be of the form 'x.y.z'"
+ assert len(max_api_version_tuple) == 3, (
+ "max_api_version must be of the form 'x.y.z'"
+ )
if min_api_version and version_tuple < min_api_version_tuple:
pytest.skip(f"requires API >= {min_api_version}")