From a6204f72410c4ab6493636391051ab95ea48f8f8 Mon Sep 17 00:00:00 2001 From: Ali Hamdan Date: Sat, 27 Jun 2026 10:25:41 +0200 Subject: [PATCH] shapely: narrower types for geom_type in BaseGeometry subclasses --- stubs/shapely/shapely/geometry/collection.pyi | 4 +++- stubs/shapely/shapely/geometry/linestring.pyi | 2 ++ stubs/shapely/shapely/geometry/multilinestring.pyi | 3 +++ stubs/shapely/shapely/geometry/multipoint.pyi | 3 +++ stubs/shapely/shapely/geometry/multipolygon.pyi | 3 +++ stubs/shapely/shapely/geometry/point.pyi | 4 +++- stubs/shapely/shapely/geometry/polygon.pyi | 6 +++++- 7 files changed, 22 insertions(+), 3 deletions(-) diff --git a/stubs/shapely/shapely/geometry/collection.pyi b/stubs/shapely/shapely/geometry/collection.pyi index bbac18efee0e..abc1b7e42af1 100644 --- a/stubs/shapely/shapely/geometry/collection.pyi +++ b/stubs/shapely/shapely/geometry/collection.pyi @@ -1,5 +1,5 @@ from collections.abc import Collection -from typing import overload +from typing import Literal, overload from typing_extensions import Self from .._typing import OptGeoArrayLike @@ -18,4 +18,6 @@ class GeometryCollection(BaseMultipartGeometry[_GeoT_co]): # more precise base overrides @property + def geom_type(self) -> Literal["GeometryCollection"]: ... + @property def boundary(self) -> None: ... diff --git a/stubs/shapely/shapely/geometry/linestring.pyi b/stubs/shapely/shapely/geometry/linestring.pyi index 7e0cc926a7ff..54649d1e6963 100644 --- a/stubs/shapely/shapely/geometry/linestring.pyi +++ b/stubs/shapely/shapely/geometry/linestring.pyi @@ -35,6 +35,8 @@ class LineString(BaseGeometry): ) -> LineString | MultiLineString: ... # more precise base overrides @property + def geom_type(self) -> Literal["LineString", "LinearRing"]: ... # LinearRing is a subclass of LineString + @property def boundary(self) -> MultiPoint: ... @property def convex_hull(self) -> LineString: ... diff --git a/stubs/shapely/shapely/geometry/multilinestring.pyi b/stubs/shapely/shapely/geometry/multilinestring.pyi index c4c561f4f803..ec0f6c53857c 100644 --- a/stubs/shapely/shapely/geometry/multilinestring.pyi +++ b/stubs/shapely/shapely/geometry/multilinestring.pyi @@ -1,4 +1,5 @@ from collections.abc import Collection +from typing import Literal from typing_extensions import Self from .base import BaseMultipartGeometry @@ -13,4 +14,6 @@ class MultiLineString(BaseMultipartGeometry[LineString]): def svg(self, scale_factor: float = 1.0, stroke_color: str | None = None, opacity: float | None = None) -> str: ... # type: ignore[override] # more precise base overrides @property + def geom_type(self) -> Literal["MultiLineString"]: ... + @property def boundary(self) -> MultiPoint: ... diff --git a/stubs/shapely/shapely/geometry/multipoint.pyi b/stubs/shapely/shapely/geometry/multipoint.pyi index 6647a93404d5..c931c474d165 100644 --- a/stubs/shapely/shapely/geometry/multipoint.pyi +++ b/stubs/shapely/shapely/geometry/multipoint.pyi @@ -1,4 +1,5 @@ from collections.abc import Collection +from typing import Literal from typing_extensions import Self from .base import BaseMultipartGeometry @@ -18,4 +19,6 @@ class MultiPoint(BaseMultipartGeometry[Point]): def svg(self, scale_factor: float = 1.0, fill_color: str | None = None, opacity: float | None = None) -> str: ... # type: ignore[override] # more precise base overrides @property + def geom_type(self) -> Literal["MultiPoint"]: ... + @property def boundary(self) -> GeometryCollection: ... # empty geometry collection diff --git a/stubs/shapely/shapely/geometry/multipolygon.pyi b/stubs/shapely/shapely/geometry/multipolygon.pyi index eb3428ee6f1a..0c60c5fa7da9 100644 --- a/stubs/shapely/shapely/geometry/multipolygon.pyi +++ b/stubs/shapely/shapely/geometry/multipolygon.pyi @@ -1,4 +1,5 @@ from collections.abc import Collection +from typing import Literal from typing_extensions import Self from .base import BaseMultipartGeometry @@ -20,4 +21,6 @@ class MultiPolygon(BaseMultipartGeometry[Polygon]): def svg(self, scale_factor: float = 1.0, fill_color: str | None = None, opacity: float | None = None) -> str: ... # type: ignore[override] # more precise base overrides @property + def geom_type(self) -> Literal["MultiPolygon"]: ... + @property def boundary(self) -> MultiLineString: ... diff --git a/stubs/shapely/shapely/geometry/point.pyi b/stubs/shapely/shapely/geometry/point.pyi index 1622185fff4a..5f37e65a7b93 100644 --- a/stubs/shapely/shapely/geometry/point.pyi +++ b/stubs/shapely/shapely/geometry/point.pyi @@ -1,5 +1,5 @@ from collections.abc import Iterable -from typing import TypeAlias, overload +from typing import Literal, TypeAlias, overload from typing_extensions import Self from .._typing import ArrayLikeSeq @@ -33,6 +33,8 @@ class Point(BaseGeometry): def svg(self, scale_factor: float = 1.0, fill_color: str | None = None, opacity: float | None = None) -> str: ... # type: ignore[override] # more precise base overrides @property + def geom_type(self) -> Literal["Point"]: ... + @property def boundary(self) -> GeometryCollection: ... # empty geometry collection @property def convex_hull(self) -> Point: ... diff --git a/stubs/shapely/shapely/geometry/polygon.pyi b/stubs/shapely/shapely/geometry/polygon.pyi index 240674200a0f..c64dd7796dcf 100644 --- a/stubs/shapely/shapely/geometry/polygon.pyi +++ b/stubs/shapely/shapely/geometry/polygon.pyi @@ -1,5 +1,5 @@ from collections.abc import Collection -from typing import NoReturn, TypeAlias, overload +from typing import Literal, NoReturn, TypeAlias, overload from typing_extensions import Self from .base import BaseGeometry @@ -17,6 +17,8 @@ class LinearRing(LineString): def __new__(self, coordinates: _ConvertibleToLinearRing | None = None) -> Self: ... @property def is_ccw(self) -> bool: ... + @property + def geom_type(self) -> Literal["LinearRing"]: ... class InteriorRingSequence: def __init__(self, parent: Polygon) -> None: ... @@ -43,6 +45,8 @@ class Polygon(BaseGeometry): def from_bounds(cls, xmin: float, ymin: float, xmax: float, ymax: float) -> Self: ... # more precise base overrides @property + def geom_type(self) -> Literal["Polygon"]: ... + @property def boundary(self) -> MultiLineString: ... def orient(polygon: Polygon, sign: float = 1.0) -> Polygon: ...