You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sedona.apache.org by ji...@apache.org on 2024/03/07 07:11:56 UTC

(sedona) branch master updated: [SEDONA-512] Geometry_serde.serialize should report the incorrect type (#1271)

This is an automated email from the ASF dual-hosted git repository.

jiayu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sedona.git


The following commit(s) were added to refs/heads/master by this push:
     new 9b2ebac24 [SEDONA-512] Geometry_serde.serialize should report the incorrect type (#1271)
9b2ebac24 is described below

commit 9b2ebac2453cefbaf7ceea0e978fcf2e64b138a7
Author: Jia Yu <ji...@apache.org>
AuthorDate: Wed Mar 6 23:11:50 2024 -0800

    [SEDONA-512] Geometry_serde.serialize should report the incorrect type (#1271)
    
    Co-authored-by: Ryan Avery <ry...@gmail.com>
---
 python/src/geomserde_speedup_module.c | 38 +++++++++++++++++++++++------------
 1 file changed, 25 insertions(+), 13 deletions(-)

diff --git a/python/src/geomserde_speedup_module.c b/python/src/geomserde_speedup_module.c
index e49efb4f2..2edf4b7b3 100644
--- a/python/src/geomserde_speedup_module.c
+++ b/python/src/geomserde_speedup_module.c
@@ -192,21 +192,33 @@ static GEOSGeometry *do_deserialize(PyObject *args,
 /* serialize/deserialize functions for Shapely 2.x */
 
 static PyObject *serialize(PyObject *self, PyObject *args) {
-  PyObject *pygeos_geom = NULL;
-  if (!PyArg_ParseTuple(args, "O", &pygeos_geom)) {
-    return NULL;
-  }
+    PyObject *pygeos_geom = NULL;
+    if (!PyArg_ParseTuple(args, "O", &pygeos_geom)) {
+        return NULL;  // Argument parsing failed; error already set by PyArg_ParseTuple
+    }
 
-  GEOSGeometry *geos_geom = NULL;
-  char success = PyGEOS_GetGEOSGeometry(pygeos_geom, &geos_geom);
-  if (success == 0) {
-    PyErr_SetString(
-        PyExc_TypeError,
-        "Argument is of incorrect type. Please provide only Geometry objects.");
-    return NULL;
-  }
+    GEOSGeometry *geos_geom = NULL;
+    char success = PyGEOS_GetGEOSGeometry(pygeos_geom, &geos_geom);
+    if (success == 0) {
+        // Retrieve the type of the supplied object
+        PyObject *type = (PyObject *)Py_TYPE(pygeos_geom);
+        PyObject *type_name = PyObject_GetAttrString(type, "__name__");
+        if (type_name == NULL) {
+            // Fallback error if we can't get the type name
+            PyErr_SetString(PyExc_TypeError, "Argument is of incorrect type.");
+        } else {
+            // Construct the error message with the type name
+            const char *type_str = PyUnicode_AsUTF8(type_name);
+            char error_msg[256];
+            snprintf(error_msg, sizeof(error_msg), "Argument is of incorrect type: '%s'. Please provide only Geometry objects.", type_str);
+
+            PyErr_SetString(PyExc_TypeError, error_msg);
+            Py_DECREF(type_name);  // Cleanup the reference to type_name
+        }
+        return NULL;
+    }
 
-  return do_serialize(geos_geom);
+    return do_serialize(geos_geom);
 }
 
 static PyObject *deserialize(PyObject *self, PyObject *args) {