diff --git a/README.md b/README.md
index fea8316..dc6bede 100644
--- a/README.md
+++ b/README.md
@@ -77,16 +77,6 @@ This project is licensed under the MIT License.
Incomplete |
Yes |
-
- | pyogrio |
- pyogrio |
-
- PyPI,
- GitHub
- |
- Complete |
- Yes |
-
## Upstreamed stubs
@@ -114,4 +104,9 @@ These stubs were included here in the past and have been moved to typeshed or to
typeshed |
pip install types-geopandas |
+
+ | pyogrio |
+ typeshed |
+ pip install types-pyogrio |
+
diff --git a/pyproject.toml b/pyproject.toml
index 253c164..bd04a2d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -24,8 +24,6 @@ tests = [
"geopandas>=1.0.0",
"pandapower>=3.1.2,<3.5", # TODO: remove upper bound
"types-networkx>=3.4.2",
- # pyogrio
- "pyogrio>=0.13.0",
]
dev = [
"ruff>=0.15.21",
diff --git a/run.py b/run.py
index a379077..af9e1a9 100755
--- a/run.py
+++ b/run.py
@@ -17,7 +17,7 @@
"pyright": ["tests", "stubs"],
"ty-check": ["tests", "stubs"],
"pyrefly-check": ["tests", "stubs"],
- "stubtest": ["--allowlist=stubtest_allowlist.txt", "pandapower", "pyogrio"],
+ "stubtest": ["--allowlist=stubtest_allowlist.txt", "pandapower"],
"pytest": [],
}
if (num_mypy_workers := min(os.cpu_count() or 1, 6)) > 1:
diff --git a/stubs/pyogrio-stubs/.ruff.toml b/stubs/pyogrio-stubs/.ruff.toml
deleted file mode 100644
index ae4b722..0000000
--- a/stubs/pyogrio-stubs/.ruff.toml
+++ /dev/null
@@ -1,4 +0,0 @@
-extend = "../../pyproject.toml"
-
-[lint]
-isort.known-first-party = ["pyogrio"]
diff --git a/stubs/pyogrio-stubs/__init__.pyi b/stubs/pyogrio-stubs/__init__.pyi
deleted file mode 100644
index 55b95dc..0000000
--- a/stubs/pyogrio-stubs/__init__.pyi
+++ /dev/null
@@ -1,47 +0,0 @@
-from pyogrio.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 pyogrio.geopandas import read_dataframe as read_dataframe, write_dataframe as write_dataframe
-from pyogrio.raw import open_arrow as open_arrow, read_arrow as read_arrow, 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-stubs/_typing.pyi b/stubs/pyogrio-stubs/_typing.pyi
deleted file mode 100644
index ca5b429..0000000
--- a/stubs/pyogrio-stubs/_typing.pyi
+++ /dev/null
@@ -1,24 +0,0 @@
-import io
-from _typeshed import SupportsRead
-from collections.abc import Collection
-from pathlib import Path
-from typing import Any, Protocol, type_check_only
-from typing_extensions import CapsuleType
-
-import numpy as np
-
-@type_check_only
-class SupportsArrowCStream(Protocol):
- def __arrow_c_stream__(self, requested_schema: object | None = None) -> CapsuleType: ...
-
-@type_check_only
-class SupportsArray[G: np.generic](Protocol):
- def __array__(self) -> np.ndarray[Any, np.dtype[G]]: ...
-
-type Array1D[G: np.generic] = np.ndarray[tuple[int], np.dtype[G]]
-type Array2D[G: np.generic] = np.ndarray[tuple[int, int], np.dtype[G]]
-type ReadPathOrBuffer = str | Path | bytes | SupportsRead[bytes]
-type WritePathOrBuffer = str | Path | io.BytesIO
-
-type DualArrayLike[G: np.generic, T] = SupportsArray[G] | Collection[T] | T
-type ArrayLikeInt = DualArrayLike[np.bool | np.integer, int]
diff --git a/stubs/pyogrio-stubs/core.pyi b/stubs/pyogrio-stubs/core.pyi
deleted file mode 100644
index 52eecdd..0000000
--- a/stubs/pyogrio-stubs/core.pyi
+++ /dev/null
@@ -1,82 +0,0 @@
-from pathlib import Path
-from typing import Any, Literal, TypedDict, type_check_only
-
-import numpy as np
-import shapely as shp
-
-from pyogrio._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-stubs/errors.pyi b/stubs/pyogrio-stubs/errors.pyi
deleted file mode 100644
index 38f893c..0000000
--- a/stubs/pyogrio-stubs/errors.pyi
+++ /dev/null
@@ -1,6 +0,0 @@
-class DataSourceError(RuntimeError): ...
-class DataLayerError(RuntimeError): ...
-class CRSError(DataLayerError): ...
-class FeatureError(DataLayerError): ...
-class GeometryError(DataLayerError): ...
-class FieldError(DataLayerError): ...
diff --git a/stubs/pyogrio-stubs/geopandas.pyi b/stubs/pyogrio-stubs/geopandas.pyi
deleted file mode 100644
index ada2e7f..0000000
--- a/stubs/pyogrio-stubs/geopandas.pyi
+++ /dev/null
@@ -1,79 +0,0 @@
-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 pyogrio._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-stubs/raw.pyi b/stubs/pyogrio-stubs/raw.pyi
deleted file mode 100644
index 9685ab3..0000000
--- a/stubs/pyogrio-stubs/raw.pyi
+++ /dev/null
@@ -1,176 +0,0 @@
-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
-import shapely as shp
-
-from pyogrio._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]: ...
-@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]]: ...
-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-stubs/util.pyi b/stubs/pyogrio-stubs/util.pyi
deleted file mode 100644
index 3903cd9..0000000
--- a/stubs/pyogrio-stubs/util.pyi
+++ /dev/null
@@ -1,11 +0,0 @@
-from pathlib import Path
-
-from pyogrio._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: ...
diff --git a/stubtest_allowlist.txt b/stubtest_allowlist.txt
index 2ff653b..4bae7f6 100644
--- a/stubtest_allowlist.txt
+++ b/stubtest_allowlist.txt
@@ -32,11 +32,3 @@ pandapower\.topology\.BASE_KV
pandapower\.timeseries\.ts_runpp # requires numba
pandapower\.pf\.(makeYbus_numba|dSbus_dV_numba|create_jacobian_numba) # requires numba
pandapower\.topology\.graph_tool_interface # requires graph-tool
-
-# pyogrio allowlist
-# ====================
-# OK: stubs-only
-pyogrio\._typing
-
-# OK: tests
-pyogrio\.tests(\..*)?
diff --git a/uv.lock b/uv.lock
index 4414e24..71ad167 100644
--- a/uv.lock
+++ b/uv.lock
@@ -1306,7 +1306,6 @@ dev = [
{ name = "pandapower" },
{ name = "pandas-stubs" },
{ name = "pyarrow-stubs" },
- { name = "pyogrio" },
{ name = "pyrefly" },
{ name = "pyright" },
{ name = "pytest" },
@@ -1331,7 +1330,6 @@ tests = [
{ name = "pandapower" },
{ name = "pandas-stubs" },
{ name = "pyarrow-stubs" },
- { name = "pyogrio" },
{ name = "rtree" },
{ name = "types-geopandas" },
{ name = "types-netaddr" },
@@ -1355,7 +1353,6 @@ dev = [
{ name = "pandapower", specifier = ">=3.1.2,<3.5" },
{ name = "pandas-stubs", specifier = ">=2.2.2" },
{ name = "pyarrow-stubs", specifier = ">=20.0.0" },
- { name = "pyogrio", specifier = ">=0.13.0" },
{ name = "pyrefly", specifier = ">=1.1.1" },
{ name = "pyright", specifier = ">=1.1.411" },
{ name = "pytest", specifier = ">=9.0" },
@@ -1380,7 +1377,6 @@ tests = [
{ name = "pandapower", specifier = ">=3.1.2,<3.5" },
{ name = "pandas-stubs", specifier = ">=2.2.2" },
{ name = "pyarrow-stubs", specifier = ">=20.0.0" },
- { name = "pyogrio", specifier = ">=0.13.0" },
{ name = "rtree", specifier = ">=1.2.0" },
{ name = "types-geopandas", specifier = ">=1.0.1" },
{ name = "types-netaddr", specifier = ">=1.2.0" },