From cc0e82546b3947b99b714ffc48eda0926882b97f Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Mon, 16 Jun 2025 22:40:35 +0100 Subject: [PATCH 01/11] Update dependencies --- pyproject.toml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7f939ea4..46f063ba 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,11 +21,11 @@ dev = [ "myst_parser>=4.0", "pydocstyle>=6.3", "sphinx>=8.1", - "sphinx-autodoc-typehints>=3.0", + "sphinx-autodoc-typehints>=3.2", "sphinx_rtd_theme>=3.0", ] numpy = [ - "numpy>=2.2" + "numpy>=2.3" ] cffi = [ "cffi>=1.17" @@ -35,7 +35,7 @@ cffi = [ vernamveil = "vernamveil._cli:main" [build-system] -requires = ["setuptools>=68.1", "wheel"] +requires = ["setuptools", "wheel"] build-backend = "setuptools.build_meta" [tool.black] From ea5a66fe5af662331c28f6e1156615d7486d41b6 Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Mon, 16 Jun 2025 22:41:54 +0100 Subject: [PATCH 02/11] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b161fabb..2b4942bd 100644 --- a/README.md +++ b/README.md @@ -454,7 +454,7 @@ See `vernamveil encode --help` and `vernamveil decode --help` for all available - **Compact Implementation**: The core cypher implementation (`_vernamveil.py`) is about 200 lines of code, excluding comments, documentation and empty lines. - **External Dependencies**: Built using only Python's standard library, with NumPy being optional for vectorisation. - **Optional C/C++ Module for Fast Hashing and Byte Search**: An optional C/C++ module (`nphash`) is provided, built using [cffi](https://cffi.readthedocs.io/), which enables fast BLAKE2b, BLAKE3, and SHA-256 keyed hashing for NumPy arrays, and also provides efficient byte search utilities for internal use. BLAKE3 support is exclusive to this extension and benefits from hardware acceleration for optimal performance. Specifically, BLAKE3 uses the [official implementation](https://github.com/BLAKE3-team/BLAKE3) and can utilise SIMD instruction sets such as SSE2, SSE4.1, AVX2, AVX512F, AVX512VL (on x86_64), and NEON (on ARM), as well as hand-written assembly, where supported by your hardware and compiler. These acceleration features are detected and enabled automatically during the build process. The extension includes both C and C++ code (the C++ component is from the BLAKE3 project), so both a C and a C++ compiler (for example, gcc, g++, or MSVC) are required to build it. See the [`nphash` README](nphash/README.md) for further details. -- **Tested with**: Python 3.10 and NumPy 2.2.5. +- **Tested with**: Python 3.10 and NumPy 2.3. ### 🔧 Installation From 9611d2ec0e1f8920afbf4328ae41fc9a58a7642c Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Mon, 16 Jun 2025 22:43:07 +0100 Subject: [PATCH 03/11] fix version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 46f063ba..afc1b9f2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,7 @@ dev = [ "myst_parser>=4.0", "pydocstyle>=6.3", "sphinx>=8.1", - "sphinx-autodoc-typehints>=3.2", + "sphinx-autodoc-typehints>=3.1", "sphinx_rtd_theme>=3.0", ] numpy = [ From 69fa05d075a9d0af2b6e56313388f5b8e76abae9 Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Mon, 16 Jun 2025 22:44:10 +0100 Subject: [PATCH 04/11] restore version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index afc1b9f2..41a34b9c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,7 +21,7 @@ dev = [ "myst_parser>=4.0", "pydocstyle>=6.3", "sphinx>=8.1", - "sphinx-autodoc-typehints>=3.1", + "sphinx-autodoc-typehints>=3.0", "sphinx_rtd_theme>=3.0", ] numpy = [ From 6759ffd4be682f4a3a495566510e972618bb00f7 Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Mon, 16 Jun 2025 22:59:20 +0100 Subject: [PATCH 05/11] Update to Python 3.13 --- .github/workflows/benchmarks.yml | 2 +- .github/workflows/ci.yml | 2 +- .github/workflows/docs.yml | 2 +- .github/workflows/lint.yml | 2 +- README.md | 2 +- nphash/README.md | 4 ++-- pyproject.toml | 6 +++--- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index 823884e5..b5fe69b5 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -19,7 +19,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.10' + python-version: '3.13' - name: Upgrade pip run: python -m pip install --upgrade pip diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b1d087e9..38026f70 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -162,7 +162,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.10' + python-version: '3.13' - name: Upgrade pip run: python -m pip install --upgrade pip diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index f631c15b..443dd1a2 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -19,7 +19,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.10' + python-version: '3.13' - name: Upgrade pip run: python -m pip install --upgrade pip diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 753e8f77..805f7e0c 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -19,7 +19,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.10' + python-version: '3.13' - name: Upgrade pip run: python -m pip install --upgrade pip diff --git a/README.md b/README.md index 2b4942bd..0cad9d5c 100644 --- a/README.md +++ b/README.md @@ -454,7 +454,7 @@ See `vernamveil encode --help` and `vernamveil decode --help` for all available - **Compact Implementation**: The core cypher implementation (`_vernamveil.py`) is about 200 lines of code, excluding comments, documentation and empty lines. - **External Dependencies**: Built using only Python's standard library, with NumPy being optional for vectorisation. - **Optional C/C++ Module for Fast Hashing and Byte Search**: An optional C/C++ module (`nphash`) is provided, built using [cffi](https://cffi.readthedocs.io/), which enables fast BLAKE2b, BLAKE3, and SHA-256 keyed hashing for NumPy arrays, and also provides efficient byte search utilities for internal use. BLAKE3 support is exclusive to this extension and benefits from hardware acceleration for optimal performance. Specifically, BLAKE3 uses the [official implementation](https://github.com/BLAKE3-team/BLAKE3) and can utilise SIMD instruction sets such as SSE2, SSE4.1, AVX2, AVX512F, AVX512VL (on x86_64), and NEON (on ARM), as well as hand-written assembly, where supported by your hardware and compiler. These acceleration features are detected and enabled automatically during the build process. The extension includes both C and C++ code (the C++ component is from the BLAKE3 project), so both a C and a C++ compiler (for example, gcc, g++, or MSVC) are required to build it. See the [`nphash` README](nphash/README.md) for further details. -- **Tested with**: Python 3.10 and NumPy 2.3. +- **Tested with**: Python 3.13 and NumPy 2.3. ### 🔧 Installation diff --git a/nphash/README.md b/nphash/README.md index e1f30781..0e22598e 100644 --- a/nphash/README.md +++ b/nphash/README.md @@ -24,7 +24,7 @@ These features are detected and enabled automatically by the build system. No ma Before building, ensure you have the following dependencies installed: -- **Python 3.10 or later** +- **Python 3.13 or later** - **pip** (Python package manager) - **gcc/g++** (GNU Compiler Collection, including C++ support) _or_ **Microsoft Visual Studio Build Tools** (MSVC, for Windows) @@ -199,4 +199,4 @@ If the C extension is not built or importable, `find`, `find_all` and `hash_nump ```bash /Applications/Python\ /Install\ Certificates.command ``` - Replace `` with your installed Python version (e.g., `3.10`). This will install the required root certificates for SSL verification. + Replace `` with your installed Python version (e.g., `3.13`). This will install the required root certificates for SSL verification. diff --git a/pyproject.toml b/pyproject.toml index 41a34b9c..b2e8eb3c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ authors = [ { name = "Vasilis Vryniotis", email = "datumbox@github.com" } ] readme = "README.md" -requires-python = ">=3.10" +requires-python = ">=3.13" license = { text = "Apache-2.0" } urls = { "Homepage" = "https://github.com/datumbox/vernamveil" } @@ -21,7 +21,7 @@ dev = [ "myst_parser>=4.0", "pydocstyle>=6.3", "sphinx>=8.1", - "sphinx-autodoc-typehints>=3.0", + "sphinx-autodoc-typehints>=3.2", "sphinx_rtd_theme>=3.0", ] numpy = [ @@ -48,7 +48,7 @@ profile = "black" line_length = 100 [tool.mypy] -python_version = "3.10" +python_version = "3.13" ignore_missing_imports = true strict = true From 1225b53d70d0c14aae5003dbc4a1686985f881c6 Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Mon, 16 Jun 2025 23:18:38 +0100 Subject: [PATCH 06/11] Switch to setuptools --- nphash/_build_utils/_ffi_builders.py | 4 ++-- nphash/build.py | 21 ++++++++++++--------- pyproject.toml | 3 ++- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/nphash/_build_utils/_ffi_builders.py b/nphash/_build_utils/_ffi_builders.py index 5c1b068b..664a4c3b 100644 --- a/nphash/_build_utils/_ffi_builders.py +++ b/nphash/_build_utils/_ffi_builders.py @@ -1,17 +1,17 @@ """Compiler utilities for building CFFI extensions for the nphash library. This module provides specialised CFFI (C Foreign Function Interface) setup -functions and a custom distutils build_ext command. These components are +functions and a custom setuptools build_ext command. These components are designed to correctly compile C and C++ sources, including those requiring specific compiler flags for features like OpenMP and C++11, particularly for the BLAKE3 TBB (Threading Building Blocks) integration. """ -from distutils.command.build_ext import build_ext as _build_ext from pathlib import Path from typing import Any from cffi import FFI +from setuptools.command.build_ext import build_ext as _build_ext from nphash._build_utils._blake3_builder import ( _compile_blake3_simd_objects, diff --git a/nphash/build.py b/nphash/build.py index 7d863f70..c95061bd 100644 --- a/nphash/build.py +++ b/nphash/build.py @@ -10,11 +10,13 @@ This will generate the _bytesearchffi, _npblake2bffi, _npblake3ffi and _npsha256ffi extension modules, which can be imported from Python code. """ -import distutils.command.build_ext import os import tempfile -from distutils.dist import Distribution from pathlib import Path +from typing import Callable, cast + +import setuptools.command.build_ext +from setuptools.dist import Distribution from nphash._build_utils._config_builder import _get_build_config from nphash._build_utils._ffi_builders import ( @@ -52,37 +54,38 @@ def main() -> None: ffibuilder_sha256 = _get_npsha256_ffi(config, build_dir) if config.tbb_enabled: - # Patch distutils' build_ext to ensure -std=c++11 is added only for .cpp files during CFFI builds. + # Patch setuptools' build_ext to ensure -std=c++11 is added only for .cpp files during CFFI builds. # This is required for BLAKE3/TBB on macOS, and avoids breaking C builds. # Using setattr avoids mypy errors and keeps the patch local to this build process. - setattr(distutils.command.build_ext, "build_ext", _build_ext_with_cpp11) + setattr(setuptools.command.build_ext, "build_ext", _build_ext_with_cpp11) # Compile FFI Modules with target and temp dir print("Compiling CFFI extensions...") dist = Distribution() - build_ext_cmd = distutils.command.build_ext.build_ext(dist) + build_ext_cmd = setuptools.command.build_ext.build_ext(dist) build_ext_cmd.initialize_options() + get_ext_filename = cast(Callable[[str], str], build_ext_cmd.get_ext_filename) # Compile the CFFI extensions ffibuilder_bytesearch.compile( tmpdir=str(build_dir), - target=str(nphash_dir / build_ext_cmd.get_ext_filename("_bytesearchffi")), + target=str(nphash_dir / get_ext_filename("_bytesearchffi")), verbose=True, ) ffibuilder_blake2b.compile( tmpdir=str(build_dir), - target=str(nphash_dir / build_ext_cmd.get_ext_filename("_npblake2bffi")), + target=str(nphash_dir / get_ext_filename("_npblake2bffi")), verbose=True, ) ffibuilder_npblake3.compile( tmpdir=str(build_dir), - target=str(nphash_dir / build_ext_cmd.get_ext_filename("_npblake3ffi")), + target=str(nphash_dir / get_ext_filename("_npblake3ffi")), verbose=True, ) ffibuilder_sha256.compile( tmpdir=str(build_dir), - target=str(nphash_dir / build_ext_cmd.get_ext_filename("_npsha256ffi")), + target=str(nphash_dir / get_ext_filename("_npsha256ffi")), verbose=True, ) diff --git a/pyproject.toml b/pyproject.toml index b2e8eb3c..5c00535a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,7 @@ dev = [ "sphinx>=8.1", "sphinx-autodoc-typehints>=3.2", "sphinx_rtd_theme>=3.0", + "types-setuptools>=80.9" ] numpy = [ "numpy>=2.3" @@ -35,7 +36,7 @@ cffi = [ vernamveil = "vernamveil._cli:main" [build-system] -requires = ["setuptools", "wheel"] +requires = ["setuptools>=80.9", "wheel"] build-backend = "setuptools.build_meta" [tool.black] From ba4d6d64681234d3b5a42ec8e6bbe0b907f05c9a Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Mon, 16 Jun 2025 23:24:38 +0100 Subject: [PATCH 07/11] Update more dependencies --- pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5c00535a..2e9fb153 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -20,7 +20,7 @@ dev = [ "mypy>=1.16", "myst_parser>=4.0", "pydocstyle>=6.3", - "sphinx>=8.1", + "sphinx>=8.2", "sphinx-autodoc-typehints>=3.2", "sphinx_rtd_theme>=3.0", "types-setuptools>=80.9" @@ -36,7 +36,7 @@ cffi = [ vernamveil = "vernamveil._cli:main" [build-system] -requires = ["setuptools>=80.9", "wheel"] +requires = ["setuptools>=80.9", "wheel>=0.45"] build-backend = "setuptools.build_meta" [tool.black] From db2231d0a09d04d5dbf9b6eb3c04222f406d9dd0 Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Mon, 16 Jun 2025 23:27:10 +0100 Subject: [PATCH 08/11] Add setuptools as dependencies of cffi --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 2e9fb153..19c816e8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,8 @@ numpy = [ "numpy>=2.3" ] cffi = [ - "cffi>=1.17" + "cffi>=1.17", + "setuptools>=80.9" ] [project.scripts] From 48bfa8be1fcbcf3f71269a30e5fa99b5f5b28c9f Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Mon, 16 Jun 2025 23:38:05 +0100 Subject: [PATCH 09/11] Undo python update --- .github/workflows/benchmarks.yml | 2 +- .github/workflows/ci.yml | 2 +- .github/workflows/docs.yml | 2 +- .github/workflows/lint.yml | 2 +- README.md | 2 +- nphash/README.md | 4 ++-- pyproject.toml | 10 +++++----- 7 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/benchmarks.yml b/.github/workflows/benchmarks.yml index b5fe69b5..823884e5 100644 --- a/.github/workflows/benchmarks.yml +++ b/.github/workflows/benchmarks.yml @@ -19,7 +19,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.13' + python-version: '3.10' - name: Upgrade pip run: python -m pip install --upgrade pip diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 38026f70..b1d087e9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -162,7 +162,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.13' + python-version: '3.10' - name: Upgrade pip run: python -m pip install --upgrade pip diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 443dd1a2..f631c15b 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -19,7 +19,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.13' + python-version: '3.10' - name: Upgrade pip run: python -m pip install --upgrade pip diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 805f7e0c..753e8f77 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -19,7 +19,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: '3.13' + python-version: '3.10' - name: Upgrade pip run: python -m pip install --upgrade pip diff --git a/README.md b/README.md index 0cad9d5c..b161fabb 100644 --- a/README.md +++ b/README.md @@ -454,7 +454,7 @@ See `vernamveil encode --help` and `vernamveil decode --help` for all available - **Compact Implementation**: The core cypher implementation (`_vernamveil.py`) is about 200 lines of code, excluding comments, documentation and empty lines. - **External Dependencies**: Built using only Python's standard library, with NumPy being optional for vectorisation. - **Optional C/C++ Module for Fast Hashing and Byte Search**: An optional C/C++ module (`nphash`) is provided, built using [cffi](https://cffi.readthedocs.io/), which enables fast BLAKE2b, BLAKE3, and SHA-256 keyed hashing for NumPy arrays, and also provides efficient byte search utilities for internal use. BLAKE3 support is exclusive to this extension and benefits from hardware acceleration for optimal performance. Specifically, BLAKE3 uses the [official implementation](https://github.com/BLAKE3-team/BLAKE3) and can utilise SIMD instruction sets such as SSE2, SSE4.1, AVX2, AVX512F, AVX512VL (on x86_64), and NEON (on ARM), as well as hand-written assembly, where supported by your hardware and compiler. These acceleration features are detected and enabled automatically during the build process. The extension includes both C and C++ code (the C++ component is from the BLAKE3 project), so both a C and a C++ compiler (for example, gcc, g++, or MSVC) are required to build it. See the [`nphash` README](nphash/README.md) for further details. -- **Tested with**: Python 3.13 and NumPy 2.3. +- **Tested with**: Python 3.10 and NumPy 2.2.5. ### 🔧 Installation diff --git a/nphash/README.md b/nphash/README.md index 0e22598e..e1f30781 100644 --- a/nphash/README.md +++ b/nphash/README.md @@ -24,7 +24,7 @@ These features are detected and enabled automatically by the build system. No ma Before building, ensure you have the following dependencies installed: -- **Python 3.13 or later** +- **Python 3.10 or later** - **pip** (Python package manager) - **gcc/g++** (GNU Compiler Collection, including C++ support) _or_ **Microsoft Visual Studio Build Tools** (MSVC, for Windows) @@ -199,4 +199,4 @@ If the C extension is not built or importable, `find`, `find_all` and `hash_nump ```bash /Applications/Python\ /Install\ Certificates.command ``` - Replace `` with your installed Python version (e.g., `3.13`). This will install the required root certificates for SSL verification. + Replace `` with your installed Python version (e.g., `3.10`). This will install the required root certificates for SSL verification. diff --git a/pyproject.toml b/pyproject.toml index 19c816e8..446a30d9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ authors = [ { name = "Vasilis Vryniotis", email = "datumbox@github.com" } ] readme = "README.md" -requires-python = ">=3.13" +requires-python = ">=3.10" license = { text = "Apache-2.0" } urls = { "Homepage" = "https://github.com/datumbox/vernamveil" } @@ -20,13 +20,13 @@ dev = [ "mypy>=1.16", "myst_parser>=4.0", "pydocstyle>=6.3", - "sphinx>=8.2", - "sphinx-autodoc-typehints>=3.2", + "sphinx>=8.1", + "sphinx-autodoc-typehints>=3.0", "sphinx_rtd_theme>=3.0", "types-setuptools>=80.9" ] numpy = [ - "numpy>=2.3" + "numpy>=2.2" ] cffi = [ "cffi>=1.17", @@ -50,7 +50,7 @@ profile = "black" line_length = 100 [tool.mypy] -python_version = "3.13" +python_version = "3.10" ignore_missing_imports = true strict = true From 0b2713db8cbef2c15445f27bf9bec16f8e3d51c5 Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Mon, 16 Jun 2025 23:41:08 +0100 Subject: [PATCH 10/11] Remove setuptools dep from cffi --- pyproject.toml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 446a30d9..68fbe027 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,22 +22,20 @@ dev = [ "pydocstyle>=6.3", "sphinx>=8.1", "sphinx-autodoc-typehints>=3.0", - "sphinx_rtd_theme>=3.0", - "types-setuptools>=80.9" + "sphinx_rtd_theme>=3.0" ] numpy = [ "numpy>=2.2" ] cffi = [ - "cffi>=1.17", - "setuptools>=80.9" + "cffi>=1.17" ] [project.scripts] vernamveil = "vernamveil._cli:main" [build-system] -requires = ["setuptools>=80.9", "wheel>=0.45"] +requires = ["setuptools", "wheel"] build-backend = "setuptools.build_meta" [tool.black] From 3965f03d6c7ee092616393cd4c748729e6a61f70 Mon Sep 17 00:00:00 2001 From: Vasilis Vryniotis Date: Mon, 16 Jun 2025 23:42:59 +0100 Subject: [PATCH 11/11] Add types-setuptools dep --- pyproject.toml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 68fbe027..46f98509 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,8 @@ dev = [ "pydocstyle>=6.3", "sphinx>=8.1", "sphinx-autodoc-typehints>=3.0", - "sphinx_rtd_theme>=3.0" + "sphinx_rtd_theme>=3.0", + "types-setuptools>=80.9" ] numpy = [ "numpy>=2.2"