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" },