]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
fix: manage shapely conditional imports explicitly
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Tue, 25 Mar 2025 18:23:41 +0000 (19:23 +0100)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Wed, 26 Mar 2025 18:27:20 +0000 (19:27 +0100)
psycopg/psycopg/types/shapely.py
tests/types/test_shapely.py

index b8e287b1179c94a8780f5d8f95675b16eb8d4389..a6251666fff85f84c08fd0a9521c4a01e322a0d7 100644 (file)
@@ -12,46 +12,48 @@ from .._compat import cache
 from .._typeinfo import TypeInfo
 
 try:
-    from shapely.geometry.base import BaseGeometry
+    import shapely
+
 except ImportError:
     raise ImportError(
         "The module psycopg.types.shapely requires the package 'Shapely'"
         " to be installed"
     )
 
+from shapely.geometry.base import BaseGeometry
 
-try:
-    from shapely import from_wkb as from_wkb_compat
-    from shapely import to_wkb as to_wkb_compat
-except ImportError:
-    # Shapely<2 compatibility
-    from shapely.wkb import dumps as to_wkb_compat  # type: ignore[no-redef]
-    from shapely.wkb import loads as from_wkb_compat  # type: ignore[no-redef]
+shapely_version = tuple(int(s) for s in shapely.__version__.split(".") if s.isdigit())
+
+if shapely_version >= (2, 0):
+    from shapely import from_wkb, to_wkb
+else:
+    from shapely.wkb import dumps as to_wkb  # type: ignore[no-redef]
+    from shapely.wkb import loads as from_wkb  # type: ignore[no-redef]
 
 
 class GeometryBinaryLoader(Loader):
     format = Format.BINARY
 
     def load(self, data: Buffer) -> BaseGeometry:
-        return from_wkb_compat(bytes(data))
+        return from_wkb(bytes(data))
 
 
 class GeometryLoader(Loader):
     def load(self, data: Buffer) -> BaseGeometry:
         # it's a hex string in binary
-        return from_wkb_compat(bytes(data))
+        return from_wkb(bytes(data))
 
 
 class BaseGeometryBinaryDumper(Dumper):
     format = Format.BINARY
 
     def dump(self, obj: BaseGeometry) -> Buffer | None:
-        return to_wkb_compat(obj, include_srid=True)
+        return to_wkb(obj, include_srid=True)
 
 
 class BaseGeometryDumper(Dumper):
     def dump(self, obj: BaseGeometry) -> Buffer | None:
-        return to_wkb_compat(obj, True, include_srid=True).encode()
+        return to_wkb(obj, True, include_srid=True).encode()
 
 
 def register_shapely(info: TypeInfo, context: AdaptContext | None = None) -> None:
index b2c61c03674e585ffd6253f3126c8f5bd1e99519..b4027b0cbbbea647d3f7c0c35079b31ba52d1d6b 100644 (file)
@@ -9,14 +9,12 @@ pytest.importorskip("shapely")
 
 from shapely.geometry import MultiPolygon, Point, Polygon
 
-try:
-    from shapely import get_srid, set_srid
-except ImportError:
-    # Shapely<2 compatibility, no notion of SRID
-    get_srid = None  # type: ignore[assignment]
-    set_srid = None  # type: ignore[assignment]
+from psycopg.types.shapely import register_shapely, shapely_version
 
-from psycopg.types.shapely import register_shapely
+if shapely_version >= (2, 0):
+    from shapely import get_srid, set_srid
+else:
+    set_srid = get_srid = None  # type: ignore[assignment]
 
 pytestmark = [
     pytest.mark.postgis,