From fae64b65ca3354c6286c43ce8447e8475efe9a0c Mon Sep 17 00:00:00 2001 From: Ali Hamdan Date: Sat, 11 Jul 2026 14:38:32 +0200 Subject: [PATCH 1/6] Add pyogrio stubs --- stubs/pyogrio/@tests/stubtest_allowlist.txt | 2 + stubs/pyogrio/METADATA.toml | 4 + stubs/pyogrio/pyogrio/__init__.pyi | 51 ++++++ stubs/pyogrio/pyogrio/_typing.pyi | 28 +++ stubs/pyogrio/pyogrio/core.pyi | 82 +++++++++ stubs/pyogrio/pyogrio/errors.pyi | 6 + stubs/pyogrio/pyogrio/geopandas.pyi | 80 +++++++++ stubs/pyogrio/pyogrio/raw.pyi | 179 ++++++++++++++++++++ stubs/pyogrio/pyogrio/util.pyi | 11 ++ 9 files changed, 443 insertions(+) create mode 100644 stubs/pyogrio/@tests/stubtest_allowlist.txt create mode 100644 stubs/pyogrio/METADATA.toml create mode 100644 stubs/pyogrio/pyogrio/__init__.pyi create mode 100644 stubs/pyogrio/pyogrio/_typing.pyi create mode 100644 stubs/pyogrio/pyogrio/core.pyi create mode 100644 stubs/pyogrio/pyogrio/errors.pyi create mode 100644 stubs/pyogrio/pyogrio/geopandas.pyi create mode 100644 stubs/pyogrio/pyogrio/raw.pyi create mode 100644 stubs/pyogrio/pyogrio/util.pyi diff --git a/stubs/pyogrio/@tests/stubtest_allowlist.txt b/stubs/pyogrio/@tests/stubtest_allowlist.txt new file mode 100644 index 000000000000..9ac53dcdeb3e --- /dev/null +++ b/stubs/pyogrio/@tests/stubtest_allowlist.txt @@ -0,0 +1,2 @@ +pyogrio\.tests(\..*)? +pyogrio\._typing # stubs only module diff --git a/stubs/pyogrio/METADATA.toml b/stubs/pyogrio/METADATA.toml new file mode 100644 index 000000000000..1e79131a702c --- /dev/null +++ b/stubs/pyogrio/METADATA.toml @@ -0,0 +1,4 @@ +version = "0.13.*" +# Requires a version of numpy with a `py.typed` file +dependencies = ["numpy>=1.20", "types-geopandas"] +upstream-repository = "https://github.com/geopandas/pyogrio" diff --git a/stubs/pyogrio/pyogrio/__init__.pyi b/stubs/pyogrio/pyogrio/__init__.pyi new file mode 100644 index 000000000000..010026975af5 --- /dev/null +++ b/stubs/pyogrio/pyogrio/__init__.pyi @@ -0,0 +1,51 @@ +from .core import ( + __gdal_geos_version__ as __gdal_geos_version__, + __gdal_version__ as __gdal_version__, + __gdal_version_string__ as __gdal_version_string__, + detect_write_driver as detect_write_driver, + get_gdal_config_option as get_gdal_config_option, + get_gdal_data_path as get_gdal_data_path, + list_drivers as list_drivers, + list_drivers_details as list_drivers_details, + list_layers as list_layers, + read_bounds as read_bounds, + read_info as read_info, + set_gdal_config_options as set_gdal_config_options, + vsi_curl_clear_cache as vsi_curl_clear_cache, + vsi_listtree as vsi_listtree, + vsi_rmtree as vsi_rmtree, + vsi_unlink as vsi_unlink, +) +from .geopandas import read_dataframe as read_dataframe, write_dataframe as write_dataframe +from .raw import ( + open_arrow as open_arrow, # pyright: ignore[reportUnknownVariableType] + read_arrow as read_arrow, # pyright: ignore[reportUnknownVariableType] + write_arrow as write_arrow, +) + +__all__ = [ + "__gdal_geos_version__", + "__gdal_version__", + "__gdal_version_string__", + "__version__", + "detect_write_driver", + "get_gdal_config_option", + "get_gdal_data_path", + "list_drivers", + "list_drivers_details", + "list_layers", + "open_arrow", + "read_arrow", + "read_bounds", + "read_dataframe", + "read_info", + "set_gdal_config_options", + "vsi_curl_clear_cache", + "vsi_listtree", + "vsi_rmtree", + "vsi_unlink", + "write_arrow", + "write_dataframe", +] + +__version__: str diff --git a/stubs/pyogrio/pyogrio/_typing.pyi b/stubs/pyogrio/pyogrio/_typing.pyi new file mode 100644 index 000000000000..ac1e0f912d6a --- /dev/null +++ b/stubs/pyogrio/pyogrio/_typing.pyi @@ -0,0 +1,28 @@ +import io +from _typeshed import SupportsRead +from collections.abc import Collection +from pathlib import Path +from typing import Any, Protocol, TypeAlias, TypeVar, type_check_only +from typing_extensions import CapsuleType + +import numpy as np + +_T = TypeVar("_T") +_G = TypeVar("_G", bound=np.generic) +_G_co = TypeVar("_G_co", bound=np.generic, covariant=True) + +@type_check_only +class SupportsArrowCStream(Protocol): + def __arrow_c_stream__(self, requested_schema: object | None = None) -> CapsuleType: ... + +@type_check_only +class SupportsArray(Protocol[_G_co]): + def __array__(self) -> np.ndarray[Any, np.dtype[_G_co]]: ... + +Array1D: TypeAlias = np.ndarray[tuple[int], np.dtype[_G]] +Array2D: TypeAlias = np.ndarray[tuple[int, int], np.dtype[_G]] +ReadPathOrBuffer: TypeAlias = str | Path | bytes | SupportsRead[bytes] +WritePathOrBuffer: TypeAlias = str | Path | io.BytesIO + +DualArrayLike: TypeAlias = SupportsArray[_G] | Collection[_T] | _T +ArrayLikeInt: TypeAlias = DualArrayLike[np.bool | np.integer, int] diff --git a/stubs/pyogrio/pyogrio/core.pyi b/stubs/pyogrio/pyogrio/core.pyi new file mode 100644 index 000000000000..a3b0264eebc6 --- /dev/null +++ b/stubs/pyogrio/pyogrio/core.pyi @@ -0,0 +1,82 @@ +from pathlib import Path +from typing import Any, Literal, TypedDict, type_check_only + +import numpy as np +import shapely as shp + +from ._typing import Array1D, Array2D, ReadPathOrBuffer + +__gdal_version__: tuple[int, int, int] +__gdal_version_string__: str +__gdal_geos_version__: tuple[int, int, int] | None + +@type_check_only +class _Capabilities(TypedDict): + random_read: bool + fast_set_next_by_index: bool + fast_spatial_filter: bool + fast_feature_count: bool + fast_total_bounds: bool + +@type_check_only +class _LayerInfo(TypedDict): + layer_name: str + # crs is `None` for non-spatial layers + crs: str | None + fields: Array1D[np.object_] # field names (strings) + dtypes: Array1D[np.object_] # field dtypes (strings) + ogr_types: list[str] + ogr_subtypes: list[str] + encoding: str + fid_column: str + geometry_name: str + # geometry_type is `None` for non-spatial layers + geometry_type: str | None + features: int + # total_bounds is `None` for non-spatial layers or if expensive to compute + total_bounds: tuple[float, float, float, float] | None + driver: str + capabilities: _Capabilities + dataset_metadata: dict[str, str] | None + layer_metadata: dict[str, str] | None + +@type_check_only +class _DriverDetails(TypedDict): + long_name: str + read: bool + append: bool + write: bool + supports_vsi: bool + help_topic_url: str | None + extensions: list[str] | None + +def list_drivers(read: bool = False, write: bool = False, append: bool = False) -> dict[str, Literal["r", "rw"]]: ... +def list_drivers_details() -> dict[str, _DriverDetails]: ... +def detect_write_driver(path: str | Path) -> str: ... # `path` is coerced to string internally +def list_layers(path_or_buffer: ReadPathOrBuffer, /) -> Array2D[np.object_]: ... +def read_bounds( + path_or_buffer: ReadPathOrBuffer, + /, + layer: int | str | None = None, + skip_features: int = 0, + max_features: int | None = None, + where: str | None = None, + bbox: tuple[float, float, float, float] | None = None, + mask: shp.Geometry | None = None, +) -> tuple[Array1D[np.int64], Array2D[np.float64]]: ... +def read_info( + path_or_buffer: ReadPathOrBuffer, + /, + layer: int | str | None = None, + encoding: str | None = None, + force_feature_count: bool = False, + force_total_bounds: bool = False, + **kwargs: Any, # Dataset open options passed to OGR +) -> _LayerInfo: ... +def set_gdal_config_options(options: dict[str, Any]) -> None: ... +def get_gdal_config_option(name: str) -> Any: ... # Could return str, int, bool, or None +def get_gdal_data_path() -> str: ... +def vsi_listtree(path: str | Path, pattern: str | None = None) -> list[str]: ... +def vsi_rmtree(path: str | Path) -> None: ... +def vsi_unlink(path: str | Path) -> None: ... +def vsi_curl_clear_cache(prefix: str | Path = "") -> None: ... diff --git a/stubs/pyogrio/pyogrio/errors.pyi b/stubs/pyogrio/pyogrio/errors.pyi new file mode 100644 index 000000000000..38f893ce66c9 --- /dev/null +++ b/stubs/pyogrio/pyogrio/errors.pyi @@ -0,0 +1,6 @@ +class DataSourceError(RuntimeError): ... +class DataLayerError(RuntimeError): ... +class CRSError(DataLayerError): ... +class FeatureError(DataLayerError): ... +class GeometryError(DataLayerError): ... +class FieldError(DataLayerError): ... diff --git a/stubs/pyogrio/pyogrio/geopandas.pyi b/stubs/pyogrio/pyogrio/geopandas.pyi new file mode 100644 index 000000000000..ec6f67fb1829 --- /dev/null +++ b/stubs/pyogrio/pyogrio/geopandas.pyi @@ -0,0 +1,80 @@ +import os +from collections.abc import Collection, Mapping +from typing import Any, Literal, overload + +import geopandas as gpd +import pandas as pd +import shapely as shp + +from ._typing import ArrayLikeInt, ReadPathOrBuffer, WritePathOrBuffer + +@overload +def read_dataframe( + path_or_buffer: ReadPathOrBuffer | os.PathLike[str], + /, + layer: int | str | None = None, + encoding: str | None = None, + columns: Collection[str] | None = None, + read_geometry: Literal[True] = True, + force_2d: bool = False, + skip_features: int = 0, + max_features: int | None = None, + where: str | None = None, + bbox: tuple[float, float, float, float] | None = None, + mask: shp.Geometry | None = None, + fids: ArrayLikeInt | None = None, + sql: str | None = None, + sql_dialect: str | None = None, + fid_as_index: bool = False, + use_arrow: bool | None = None, + on_invalid: Literal["raise", "warn", "ignore", "fix"] = "raise", + arrow_to_pandas_kwargs: Mapping[str, Any] | None = None, + datetime_as_string: bool = False, + mixed_offsets_as_utc: bool = True, + **kwargs: Any, # Dataset open options passed to OGR +) -> gpd.GeoDataFrame: ... +@overload +def read_dataframe( + path_or_buffer: ReadPathOrBuffer | os.PathLike[str], + /, + layer: int | str | None = None, + encoding: str | None = None, + columns: Collection[str] | None = None, + *, + read_geometry: Literal[False], + force_2d: bool = False, + skip_features: int = 0, + max_features: int | None = None, + where: str | None = None, + bbox: tuple[float, float, float, float] | None = None, + mask: shp.Geometry | None = None, + fids: ArrayLikeInt | None = None, + sql: str | None = None, + sql_dialect: str | None = None, + fid_as_index: bool = False, + use_arrow: bool | None = None, + on_invalid: Literal["raise", "warn", "ignore", "fix"] = "raise", + arrow_to_pandas_kwargs: Mapping[str, Any] | None = None, + datetime_as_string: bool = False, + mixed_offsets_as_utc: bool = True, + **kwargs: Any, # Dataset open options passed to OGR +) -> pd.DataFrame: ... + +def write_dataframe( + df: pd.DataFrame, + path: WritePathOrBuffer, + layer: str | None = None, + driver: str | None = None, + encoding: str | None = None, + geometry_type: str | None = None, + promote_to_multi: bool | None = None, + nan_as_null: bool = True, + append: bool = False, + use_arrow: bool | None = None, + dataset_metadata: dict[str, Any] | None = None, + layer_metadata: dict[str, Any] | None = None, + metadata: dict[str, Any] | None = None, + dataset_options: dict[str, Any] | None = None, + layer_options: dict[str, Any] | None = None, + **kwargs: Any, # Additional driver-specific dataset or layer creation options passed to OGR +) -> None: ... diff --git a/stubs/pyogrio/pyogrio/raw.pyi b/stubs/pyogrio/pyogrio/raw.pyi new file mode 100644 index 000000000000..f4937a29b968 --- /dev/null +++ b/stubs/pyogrio/pyogrio/raw.pyi @@ -0,0 +1,179 @@ +from collections.abc import Collection, Iterable +from contextlib import AbstractContextManager +from typing import Any, Literal, TypedDict, overload, type_check_only + +import numpy as np +import pyarrow as pa # type: ignore[import-not-found] # pyright: ignore[reportMissingImports] +import shapely as shp + +from ._typing import Array1D, ArrayLikeInt, ReadPathOrBuffer, SupportsArrowCStream, WritePathOrBuffer + +DRIVERS_NO_MIXED_SINGLE_MULTI: set[str] +DRIVERS_NO_MIXED_DIMENSIONS: set[str] + +@type_check_only +class _Meta(TypedDict): + crs: str + fields: Array1D[np.object_] + dtypes: Array1D[np.object_] + ogr_types: list[str] + ogr_subtypes: list[str] + encoding: str + geometry_type: str + geometry_name: str + fid_column: str + +@overload +def read( + path_or_buffer: ReadPathOrBuffer, + /, + layer: int | str | None = None, + encoding: str | None = None, + columns: Collection[str] | None = None, + read_geometry: bool = True, + force_2d: bool = False, + skip_features: int = 0, + max_features: int | None = None, + where: str | None = None, + bbox: tuple[float, float, float, float] | None = None, + mask: shp.Geometry | None = None, + fids: ArrayLikeInt | None = None, + sql: str | None = None, + sql_dialect: str | None = None, + return_fids: Literal[False] = False, + datetime_as_string: bool = False, + **kwargs: Any, # Dataset open options passed to OGR +) -> tuple[_Meta, None, Array1D[np.object_] | None, list[np.ndarray]]: ... +@overload +def read( + path_or_buffer: ReadPathOrBuffer, + /, + layer: int | str | None = None, + encoding: str | None = None, + columns: Collection[str] | None = None, + read_geometry: bool = True, + force_2d: bool = False, + skip_features: int = 0, + max_features: int | None = None, + where: str | None = None, + bbox: tuple[float, float, float, float] | None = None, + mask: shp.Geometry | None = None, + fids: ArrayLikeInt | None = None, + sql: str | None = None, + sql_dialect: str | None = None, + *, + return_fids: Literal[True], + datetime_as_string: bool = False, + **kwargs: Any, # Dataset open options passed to OGR +) -> tuple[_Meta, Array1D[np.int64], Array1D[np.object_] | None, list[np.ndarray]]: ... + +def read_arrow( + path_or_buffer: ReadPathOrBuffer, + /, + layer: int | str | None = None, + encoding: str | None = None, + columns: Collection[str] | None = None, + read_geometry: bool = True, + force_2d: bool = False, + skip_features: int = 0, + max_features: int | None = None, + where: str | None = None, + bbox: tuple[float, float, float, float] | None = None, + mask: shp.Geometry | None = None, + fids: ArrayLikeInt | None = None, + sql: str | None = None, + sql_dialect: str | None = None, + return_fids: bool = False, + datetime_as_string: bool = False, + *, + batch_size: int = 65536, # Extracted from kwargs + **kwargs: Any, # Dataset open options passed to OGR +) -> tuple[_Meta, pa.Table]: ... # pyright: ignore[reportUnknownMemberType] + +@overload +def open_arrow( + path_or_buffer: ReadPathOrBuffer, + /, + layer: int | str | None = None, + encoding: str | None = None, + columns: Collection[str] | None = None, + read_geometry: bool = True, + force_2d: bool = False, + skip_features: int = 0, + max_features: int | None = None, + where: str | None = None, + bbox: tuple[float, float, float, float] | None = None, + mask: shp.Geometry | None = None, + fids: ArrayLikeInt | None = None, + sql: str | None = None, + sql_dialect: str | None = None, + return_fids: bool = False, + batch_size: int = 65536, + use_pyarrow: Literal[False] = False, + datetime_as_string: bool = False, + **kwargs: Any, # Dataset open options passed to OGR +) -> AbstractContextManager[tuple[_Meta, SupportsArrowCStream]]: ... +@overload +def open_arrow( + path_or_buffer: ReadPathOrBuffer, + /, + layer: int | str | None = None, + encoding: str | None = None, + columns: Collection[str] | None = None, + read_geometry: bool = True, + force_2d: bool = False, + skip_features: int = 0, + max_features: int | None = None, + where: str | None = None, + bbox: tuple[float, float, float, float] | None = None, + mask: shp.Geometry | None = None, + fids: ArrayLikeInt | None = None, + sql: str | None = None, + sql_dialect: str | None = None, + return_fids: bool = False, + batch_size: int = 65536, + *, + use_pyarrow: Literal[True], + datetime_as_string: bool = False, + **kwargs: Any, # Dataset open options passed to OGR +) -> AbstractContextManager[tuple[_Meta, pa.RecordBatchReader]]: ... # pyright: ignore[reportUnknownMemberType] + +def write( + path: WritePathOrBuffer, + geometry: np.ndarray | None, # ndarray of WKB encoded geometries or None + field_data: Iterable[np.ndarray] | None, + fields: Iterable[str], + field_mask: Iterable[np.ndarray | None] | None = None, + layer: str | None = None, + driver: str | None = None, + geometry_type: str | None = None, + crs: str | None = None, + encoding: str | None = None, + promote_to_multi: bool | None = None, + nan_as_null: bool = True, + append: bool = False, + dataset_metadata: dict[str, str] | None = None, + layer_metadata: dict[str, str] | None = None, + metadata: dict[str, str] | None = None, + dataset_options: dict[str, Any] | None = None, + layer_options: dict[str, Any] | None = None, + gdal_tz_offsets: dict[str, Any] | None = None, + **kwargs: Any, # Additional driver-specific dataset or layer creation options passed to OGR +) -> None: ... +def write_arrow( + arrow_obj: SupportsArrowCStream, + path: WritePathOrBuffer, + layer: str | None = None, + driver: str | None = None, + geometry_name: str | None = None, + geometry_type: str | None = None, + crs: str | None = None, + encoding: str | None = None, + append: bool = False, + dataset_metadata: dict[str, str] | None = None, + layer_metadata: dict[str, str] | None = None, + metadata: dict[str, str] | None = None, + dataset_options: dict[str, Any] | None = None, + layer_options: dict[str, Any] | None = None, + **kwargs: Any, # Additional driver-specific dataset or layer creation options passed to OGR +) -> None: ... diff --git a/stubs/pyogrio/pyogrio/util.pyi b/stubs/pyogrio/pyogrio/util.pyi new file mode 100644 index 000000000000..758089b2791a --- /dev/null +++ b/stubs/pyogrio/pyogrio/util.pyi @@ -0,0 +1,11 @@ +from pathlib import Path + +from ._typing import ReadPathOrBuffer + +def get_vsi_path_or_buffer(path_or_buffer: ReadPathOrBuffer) -> str | bytes: ... +def vsi_path(path: str | Path) -> str: ... + +SCHEMES: dict[str, str] +CURLSCHEMES: set[str] + +def vsimem_rmtree_toplevel(path: str | Path) -> None: ... From 767f2627466acc6cfdbf736a991bf58962a9eac7 Mon Sep 17 00:00:00 2001 From: Ali Hamdan Date: Sat, 11 Jul 2026 14:49:06 +0200 Subject: [PATCH 2/6] Fix pyright in ci --- stubs/pyogrio/pyogrio/__init__.pyi | 6 +----- stubs/pyogrio/pyogrio/raw.pyi | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/stubs/pyogrio/pyogrio/__init__.pyi b/stubs/pyogrio/pyogrio/__init__.pyi index 010026975af5..22149bb24903 100644 --- a/stubs/pyogrio/pyogrio/__init__.pyi +++ b/stubs/pyogrio/pyogrio/__init__.pyi @@ -17,11 +17,7 @@ from .core import ( vsi_unlink as vsi_unlink, ) from .geopandas import read_dataframe as read_dataframe, write_dataframe as write_dataframe -from .raw import ( - open_arrow as open_arrow, # pyright: ignore[reportUnknownVariableType] - read_arrow as read_arrow, # pyright: ignore[reportUnknownVariableType] - write_arrow as write_arrow, -) +from .raw import open_arrow as open_arrow, read_arrow as read_arrow, write_arrow as write_arrow __all__ = [ "__gdal_geos_version__", diff --git a/stubs/pyogrio/pyogrio/raw.pyi b/stubs/pyogrio/pyogrio/raw.pyi index f4937a29b968..39a97f65a82d 100644 --- a/stubs/pyogrio/pyogrio/raw.pyi +++ b/stubs/pyogrio/pyogrio/raw.pyi @@ -88,7 +88,7 @@ def read_arrow( *, batch_size: int = 65536, # Extracted from kwargs **kwargs: Any, # Dataset open options passed to OGR -) -> tuple[_Meta, pa.Table]: ... # pyright: ignore[reportUnknownMemberType] +) -> tuple[_Meta, pa.Table]: ... @overload def open_arrow( @@ -136,7 +136,7 @@ def open_arrow( use_pyarrow: Literal[True], datetime_as_string: bool = False, **kwargs: Any, # Dataset open options passed to OGR -) -> AbstractContextManager[tuple[_Meta, pa.RecordBatchReader]]: ... # pyright: ignore[reportUnknownMemberType] +) -> AbstractContextManager[tuple[_Meta, pa.RecordBatchReader]]: ... def write( path: WritePathOrBuffer, From 4bc8bf374bafd0a3ac134f3dab839400ca68e91d Mon Sep 17 00:00:00 2001 From: Ali Hamdan Date: Sat, 11 Jul 2026 14:52:08 +0200 Subject: [PATCH 3/6] Py3.15 --- lib/ts_utils/py315.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/ts_utils/py315.py b/lib/ts_utils/py315.py index bcd1e62d79e8..91eacc100c11 100644 --- a/lib/ts_utils/py315.py +++ b/lib/ts_utils/py315.py @@ -8,6 +8,7 @@ "hnswlib", "networkx", "pycocotools", + "pyogrio", "resampy", "shapely", "tensorflow", From 4d19296ced8434b367e6c9f6c478bdf08d133039 Mon Sep 17 00:00:00 2001 From: Ali Hamdan Date: Sat, 11 Jul 2026 15:11:10 +0200 Subject: [PATCH 4/6] Revert "Fix pyright in ci" This reverts commit 767f2627466acc6cfdbf736a991bf58962a9eac7. --- stubs/pyogrio/pyogrio/__init__.pyi | 6 +++++- stubs/pyogrio/pyogrio/raw.pyi | 4 ++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/stubs/pyogrio/pyogrio/__init__.pyi b/stubs/pyogrio/pyogrio/__init__.pyi index 22149bb24903..010026975af5 100644 --- a/stubs/pyogrio/pyogrio/__init__.pyi +++ b/stubs/pyogrio/pyogrio/__init__.pyi @@ -17,7 +17,11 @@ from .core import ( vsi_unlink as vsi_unlink, ) from .geopandas import read_dataframe as read_dataframe, write_dataframe as write_dataframe -from .raw import open_arrow as open_arrow, read_arrow as read_arrow, write_arrow as write_arrow +from .raw import ( + open_arrow as open_arrow, # pyright: ignore[reportUnknownVariableType] + read_arrow as read_arrow, # pyright: ignore[reportUnknownVariableType] + write_arrow as write_arrow, +) __all__ = [ "__gdal_geos_version__", diff --git a/stubs/pyogrio/pyogrio/raw.pyi b/stubs/pyogrio/pyogrio/raw.pyi index 39a97f65a82d..f4937a29b968 100644 --- a/stubs/pyogrio/pyogrio/raw.pyi +++ b/stubs/pyogrio/pyogrio/raw.pyi @@ -88,7 +88,7 @@ def read_arrow( *, batch_size: int = 65536, # Extracted from kwargs **kwargs: Any, # Dataset open options passed to OGR -) -> tuple[_Meta, pa.Table]: ... +) -> tuple[_Meta, pa.Table]: ... # pyright: ignore[reportUnknownMemberType] @overload def open_arrow( @@ -136,7 +136,7 @@ def open_arrow( use_pyarrow: Literal[True], datetime_as_string: bool = False, **kwargs: Any, # Dataset open options passed to OGR -) -> AbstractContextManager[tuple[_Meta, pa.RecordBatchReader]]: ... +) -> AbstractContextManager[tuple[_Meta, pa.RecordBatchReader]]: ... # pyright: ignore[reportUnknownMemberType] def write( path: WritePathOrBuffer, From 7bf3781223a27d59464b337e21c3655a5e90e292 Mon Sep 17 00:00:00 2001 From: Ali Hamdan Date: Sat, 11 Jul 2026 15:14:56 +0200 Subject: [PATCH 5/6] Revert "Revert "Fix pyright in ci"" This reverts commit 4d19296ced8434b367e6c9f6c478bdf08d133039. --- stubs/pyogrio/pyogrio/__init__.pyi | 6 +----- stubs/pyogrio/pyogrio/raw.pyi | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/stubs/pyogrio/pyogrio/__init__.pyi b/stubs/pyogrio/pyogrio/__init__.pyi index 010026975af5..22149bb24903 100644 --- a/stubs/pyogrio/pyogrio/__init__.pyi +++ b/stubs/pyogrio/pyogrio/__init__.pyi @@ -17,11 +17,7 @@ from .core import ( vsi_unlink as vsi_unlink, ) from .geopandas import read_dataframe as read_dataframe, write_dataframe as write_dataframe -from .raw import ( - open_arrow as open_arrow, # pyright: ignore[reportUnknownVariableType] - read_arrow as read_arrow, # pyright: ignore[reportUnknownVariableType] - write_arrow as write_arrow, -) +from .raw import open_arrow as open_arrow, read_arrow as read_arrow, write_arrow as write_arrow __all__ = [ "__gdal_geos_version__", diff --git a/stubs/pyogrio/pyogrio/raw.pyi b/stubs/pyogrio/pyogrio/raw.pyi index f4937a29b968..39a97f65a82d 100644 --- a/stubs/pyogrio/pyogrio/raw.pyi +++ b/stubs/pyogrio/pyogrio/raw.pyi @@ -88,7 +88,7 @@ def read_arrow( *, batch_size: int = 65536, # Extracted from kwargs **kwargs: Any, # Dataset open options passed to OGR -) -> tuple[_Meta, pa.Table]: ... # pyright: ignore[reportUnknownMemberType] +) -> tuple[_Meta, pa.Table]: ... @overload def open_arrow( @@ -136,7 +136,7 @@ def open_arrow( use_pyarrow: Literal[True], datetime_as_string: bool = False, **kwargs: Any, # Dataset open options passed to OGR -) -> AbstractContextManager[tuple[_Meta, pa.RecordBatchReader]]: ... # pyright: ignore[reportUnknownMemberType] +) -> AbstractContextManager[tuple[_Meta, pa.RecordBatchReader]]: ... def write( path: WritePathOrBuffer, From 84499f6dc20806dd43d7de994609dc5c4950e2ec Mon Sep 17 00:00:00 2001 From: Ali Hamdan Date: Sat, 11 Jul 2026 15:15:25 +0200 Subject: [PATCH 6/6] Cannot have both strict and basic --- pyrightconfig.stricter.json | 1 + 1 file changed, 1 insertion(+) diff --git a/pyrightconfig.stricter.json b/pyrightconfig.stricter.json index 0f60940d2d0c..233d97b53514 100644 --- a/pyrightconfig.stricter.json +++ b/pyrightconfig.stricter.json @@ -81,6 +81,7 @@ "stubs/pyasn1", "stubs/Pygments", "stubs/PyMySQL", + "stubs/pyogrio", "stubs/python-jose", "stubs/pywin32", "stubs/PyYAML",