From 68e4e607acf5339e65854d263dd261b03f66b0ed Mon Sep 17 00:00:00 2001 From: Pieter Roggemans Date: Sat, 9 Aug 2025 23:46:28 +0200 Subject: [PATCH 1/2] ENH: add whether append is supported in list_drivers --- pyogrio/_ogr.pyx | 19 ++++++++++++++----- pyogrio/tests/test_core.py | 9 ++++++--- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/pyogrio/_ogr.pyx b/pyogrio/_ogr.pyx index 404029dd..3efac9a4 100644 --- a/pyogrio/_ogr.pyx +++ b/pyogrio/_ogr.pyx @@ -100,6 +100,14 @@ def get_gdal_config_option(str name): return str_value +def ogr_driver_supports_update(driver): + # check metadata for driver to see if it supports update + if _get_driver_metadata_item(driver, "DCAP_UPDATE") == "YES": + return True + + return False + + def ogr_driver_supports_write(driver): # check metadata for driver to see if it supports write if _get_driver_metadata_item(driver, "DCAP_CREATE") == "YES": @@ -125,14 +133,15 @@ def ogr_list_drivers(): for i in range(OGRGetDriverCount()): driver = OGRGetDriver(i) name_c = OGR_Dr_GetName(driver) - name = get_string(name_c) + capability = "r" + IF CTE_GDAL_VERSION >= (3, 11, 0): + if ogr_driver_supports_update(name): + capability += "a" if ogr_driver_supports_write(name): - drivers[name] = "rw" - - else: - drivers[name] = "r" + capability += "w" + drivers[name] = capability return drivers diff --git a/pyogrio/tests/test_core.py b/pyogrio/tests/test_core.py index e428beb9..52532f9f 100644 --- a/pyogrio/tests/test_core.py +++ b/pyogrio/tests/test_core.py @@ -18,7 +18,7 @@ vsi_rmtree, vsi_unlink, ) -from pyogrio._compat import GDAL_GE_38 +from pyogrio._compat import GDAL_GE_38, GDAL_GE_311 from pyogrio._env import GDALEnv from pyogrio.errors import DataLayerError, DataSourceError from pyogrio.raw import read, write @@ -136,11 +136,14 @@ def test_list_drivers(): for name in ("ESRI Shapefile", "GeoJSON", "GeoJSONSeq", "GPKG", "OpenFileGDB"): assert name in all_drivers - expected_capability = "rw" + if GDAL_GE_311 and name in ("ESRI Shapefile", "GeoJSON", "GPKG", "OpenFileGDB"): + expected_capability = "raw" + else: + expected_capability = "rw" if name == "OpenFileGDB" and __gdal_version__ < (3, 6, 0): expected_capability = "r" - assert all_drivers[name] == expected_capability + assert all_drivers[name] == expected_capability, f"Error for {name}" drivers = list_drivers(read=True) expected = {k: v for k, v in all_drivers.items() if v.startswith("r")} From 5a85bd38ab95bfe853f021c763762e5f688b72c0 Mon Sep 17 00:00:00 2001 From: Pieter Roggemans Date: Sun, 10 Aug 2025 00:31:58 +0200 Subject: [PATCH 2/2] Update test_core.py --- pyogrio/tests/test_core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyogrio/tests/test_core.py b/pyogrio/tests/test_core.py index 52532f9f..8fcb79ba 100644 --- a/pyogrio/tests/test_core.py +++ b/pyogrio/tests/test_core.py @@ -136,7 +136,7 @@ def test_list_drivers(): for name in ("ESRI Shapefile", "GeoJSON", "GeoJSONSeq", "GPKG", "OpenFileGDB"): assert name in all_drivers - if GDAL_GE_311 and name in ("ESRI Shapefile", "GeoJSON", "GPKG", "OpenFileGDB"): + if GDAL_GE_311: expected_capability = "raw" else: expected_capability = "rw"