From 7b032f41b6863eaae3da80f37f7d32dad9ec67d3 Mon Sep 17 00:00:00 2001 From: jorenham Date: Mon, 7 Jul 2025 19:20:56 +0200 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=8E=A8=20use=2088=20as=20max=20line?= =?UTF-8?q?=20length=20for=20`scipts/*.py`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/.ruff.toml | 2 ++ scripts/generate_matrix.py | 59 +++++++++++++++++++++++++----------- scripts/unstubbed_modules.py | 20 +++++++++--- 3 files changed, 60 insertions(+), 21 deletions(-) create mode 100644 scripts/.ruff.toml diff --git a/scripts/.ruff.toml b/scripts/.ruff.toml new file mode 100644 index 00000000..483be1d9 --- /dev/null +++ b/scripts/.ruff.toml @@ -0,0 +1,2 @@ +extend = "../pyproject.toml" +line-length = 88 diff --git a/scripts/generate_matrix.py b/scripts/generate_matrix.py index 5ade2c87..6a8438b3 100644 --- a/scripts/generate_matrix.py +++ b/scripts/generate_matrix.py @@ -19,7 +19,7 @@ (Version("3.11"), Version("1.25")), (Version("3.12"), Version("1.26")), (Version("3.13"), Version("2.1")), -) # fmt: skip +) class UVPythonVersionParts(TypedDict): @@ -81,7 +81,9 @@ def get_package_minimum_python_version(package: str) -> Version: """ raw_version = importlib.metadata.metadata(package)["Requires-Python"] if "<" in raw_version: - raise NotImplementedError("Version specifier with upper bound not yet supported!") + raise NotImplementedError( + "Version specifier with upper bound not yet supported!" + ) return parse(raw_version.replace(">=", "").replace("~=", "")) @@ -98,7 +100,8 @@ def get_dependency_minimum_version(package: str, dependency: str) -> Version: Version: The minimum required version of the dependency. Raises: - ValueError: If the package does not list any requirements or the dependency is not found. + ValueError: + The package does not list any requirements or the dependency is not found. """ requirements = importlib.metadata.requires(package) @@ -107,25 +110,40 @@ def get_dependency_minimum_version(package: str, dependency: str) -> Version: try: # Find the first requirement that matches the dependency and is not an extra - dependency_req = next(req for req in requirements if req.startswith(dependency) and " extra " not in req) + dependency_req = next( + req + for req in requirements + if req.startswith(dependency) and " extra " not in req + ) except StopIteration as e: - raise ValueError(f"Dependency {dependency} not found in requirements for {package}") from e + raise ValueError( + f"Dependency {dependency} not found in requirements for {package}" + ) from e # Extract the version specifier (e.g., ">=1.21.0") - version_specifier = next((ver for ver in dependency_req.split(",") if ">" in ver), None) + version_specifier = next( + (ver for ver in dependency_req.split(",") if ">" in ver), None + ) if version_specifier is None: - raise ValueError(f"No version specifier found for dependency {dependency} in {package}") + raise ValueError( + f"No version specifier found for dependency {dependency} in {package}" + ) # Remove dependency name and comparison operator to get the version - version_str = version_specifier.replace(dependency, "").replace(">=", "").replace(">", "") + version_str = ( + version_specifier.replace(dependency, "").replace(">=", "").replace(">", "") + ) return parse(version_str) def get_available_python_versions( - min_version: Version | None = None, max_version: Version | None = None, pre_releases: bool = False + min_version: Version | None = None, + max_version: Version | None = None, + pre_releases: bool = False, ) -> list[Version]: """ - Get a list of available Python versions from GitHub Actions' Python Versions Manifest. + Get a list of available Python versions from GitHub Actions' Python Versions + Manifest. Args: min_version (Version | None): The minimum Python version to include in the list. @@ -133,7 +151,8 @@ def get_available_python_versions( pre_releases (bool): Whether to include pre-release versions. Returns: - list[Version]: A list of available Python versions satisfying the specified criteria. + list[Version]: + A list of available Python versions satisfying the specified criteria. Raises: urllib.error.URLError: If fetching data fails. @@ -189,10 +208,12 @@ def fetch_json(url: str) -> Any: sys.exit(1) -def get_available_package_versions(package_name: str, min_version: Version, pre_releases: bool = False) -> dict[Version, str]: +def get_available_package_versions( + package_name: str, min_version: Version, pre_releases: bool = False +) -> dict[Version, str]: """ - Get available package versions from PyPI starting from the specified minimum version, - but only include the latest micro version within each minor version series, + Get available package versions from PyPI starting from the specified minimum + version, but only include the latest micro version within each minor version series, along with their 'requires_python' specifiers. Args: @@ -200,8 +221,9 @@ def get_available_package_versions(package_name: str, min_version: Version, pre_ min_version (Version): The minimum version to include. Returns: - dict[Version, str]: A mapping from the latest package versions in each minor version - series to their 'requires_python' specifier. + dict[Version, str]: + A mapping from the latest package versions in each minor version series to + their 'requires_python' specifier. Raises: RuntimeError: If no 'requires_python' is found for a package version. @@ -268,7 +290,10 @@ def main() -> None: continue # Skip incompatible combinations - if any(py_version >= py_min and np_version < np_min for py_min, np_min in MIN_VERSIONS): + if any( + py_version >= py_min and np_version < np_min + for py_min, np_min in MIN_VERSIONS + ): continue matrix_entries.append({ diff --git a/scripts/unstubbed_modules.py b/scripts/unstubbed_modules.py index 74ca09bb..97b049f3 100644 --- a/scripts/unstubbed_modules.py +++ b/scripts/unstubbed_modules.py @@ -11,10 +11,16 @@ import scipy -BUNDLED = "scipy._lib.array_api_compat", "scipy._lib.array_api_extra", "scipy.fft._pocketfft" +BUNDLED = ( + "scipy._lib.array_api_compat", + "scipy._lib.array_api_extra", + "scipy.fft._pocketfft", +) -def modules(mod: types.ModuleType, _seen: set[types.ModuleType] | None = None) -> list[str]: +def modules( + mod: types.ModuleType, _seen: set[types.ModuleType] | None = None +) -> list[str]: seen = _seen or set() out: list[str] = [] @@ -28,7 +34,11 @@ def modules(mod: types.ModuleType, _seen: set[types.ModuleType] | None = None) - mod_vars |= vars(mod) for k, v in mod_vars.items(): - if isinstance(v, types.ModuleType) and v not in seen and v.__name__.startswith("scipy"): + if ( + isinstance(v, types.ModuleType) + and v not in seen + and v.__name__.startswith("scipy") + ): seen.add(v) fname = v.__spec__.name if v.__spec__ else k if "." in fname: @@ -51,7 +61,9 @@ def is_stubbed(mod: str) -> bool: *subpackages, submod = submods subpackage_path = stubs_path.joinpath(*subpackages) - return (subpackage_path / f"{submod}.pyi").is_file() or (subpackage_path / submod / "__init__.pyi").is_file() + return (subpackage_path / f"{submod}.pyi").is_file() or ( + subpackage_path / submod / "__init__.pyi" + ).is_file() if __name__ == "__main__": From d7cb06ccee8e96b789ea3e9a7ab59d3a43a55e81 Mon Sep 17 00:00:00 2001 From: jorenham Date: Mon, 7 Jul 2025 19:21:54 +0200 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=99=88=20exclude=20more=20bundled=20p?= =?UTF-8?q?ackages?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/unstubbed_modules.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/unstubbed_modules.py b/scripts/unstubbed_modules.py index 97b049f3..4cda18c3 100644 --- a/scripts/unstubbed_modules.py +++ b/scripts/unstubbed_modules.py @@ -15,6 +15,9 @@ "scipy._lib.array_api_compat", "scipy._lib.array_api_extra", "scipy.fft._pocketfft", + "scipy.optimize._highspy", + "scipy.sparse.linalg._eigen.arpack", + "scipy.sparse.linalg._propack", )