Skip to content
This repository was archived by the owner on Jun 6, 2025. It is now read-only.

Commit 0ad6b4e

Browse files
prevent early GDAL loading during monkeypatching (#8)
1 parent b885b84 commit 0ad6b4e

File tree

3 files changed

+12
-71
lines changed

3 files changed

+12
-71
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
1717

1818
## [Unreleased]
1919

20+
### Fixed
21+
22+
- Fixed monkeypatching to avoid importing Django's GDAL module during patching, which was triggering GDAL loading
23+
2024
## [0.2.0]
2125

2226
### Changed

src/django_lazy_gdal/__init__.py

Lines changed: 8 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
from __future__ import annotations
22

3-
import importlib
43
import logging
54
import sys
6-
from typing import Any
75

86
logger = logging.getLogger(__name__)
97

@@ -28,66 +26,15 @@ def monkeypatch() -> None:
2826
from django_lazy_gdal import libgdal as lazy_libgdal
2927

3028
django_libgdal_mod = "django.contrib.gis.gdal.libgdal"
31-
lazy_libgdal_mod = "django_lazy_gdal.lazy_libgdal"
32-
33-
original_libgdal = None
34-
original_module_dict: dict[str, Any] = {}
35-
try:
36-
if (
37-
django_libgdal_mod in sys.modules
38-
and sys.modules[django_libgdal_mod] is not lazy_libgdal
39-
):
40-
logger.warning(
41-
f"{django_libgdal_mod} was imported before django_lazy_gdal could monkeypatch it. "
42-
"Call django_lazy_gdal.monkeypatch_libgdal() early in your settings module."
43-
)
44-
original_libgdal = sys.modules[django_libgdal_mod]
45-
elif django_libgdal_mod not in sys.modules:
46-
try:
47-
original_libgdal = importlib.import_module(django_libgdal_mod)
48-
except ImportError:
49-
# This might happen if django.contrib.gis is partially available
50-
# but libgdal itself fails to import. Patching might still be desired
51-
# but attribute copying won't work.
52-
logger.warning(
53-
f"Could not import original {django_libgdal_mod} for attribute copying.",
54-
exc_info=True,
55-
)
56-
pass
57-
58-
if original_libgdal:
59-
original_module_dict = original_libgdal.__dict__.copy()
60-
61-
except Exception:
62-
logger.exception(
63-
f"Error trying to access original module {django_libgdal_mod} for attribute copying."
29+
lazy_libgdal_mod = "django_lazy_gdal.libgdal"
30+
31+
if (
32+
django_libgdal_mod in sys.modules
33+
and sys.modules[django_libgdal_mod] is not lazy_libgdal
34+
):
35+
logger.warning(
36+
f"{django_libgdal_mod} was imported before django_lazy_gdal could monkeypatch it. Call django_lazy_gdal.monkeypatch() early in your settings module."
6437
)
65-
# Decide whether to proceed without attribute copying or bail out.
66-
# Let's proceed but without attributes.
67-
pass
6838

6939
sys.modules[django_libgdal_mod] = lazy_libgdal
7040
logger.debug(f"Monkeypatched {django_libgdal_mod} to use {lazy_libgdal_mod}")
71-
72-
# Transfer attributes from the original module dict if we have it
73-
if original_module_dict:
74-
copied_attrs_count = 0
75-
for key, value in original_module_dict.items():
76-
# Only copy if the attribute doesn't already exist on the lazy module
77-
if not hasattr(lazy_libgdal, key):
78-
try:
79-
setattr(lazy_libgdal, key, value)
80-
copied_attrs_count += 1
81-
except Exception:
82-
logger.warning(
83-
f"Failed to copy attribute '{key}' from original {django_libgdal_mod} to lazy module.",
84-
exc_info=True,
85-
)
86-
pass
87-
logger.debug(
88-
f"Transferred {copied_attrs_count} missing attributes from {django_libgdal_mod}."
89-
)
90-
else:
91-
logger.debug(
92-
f"Skipping attribute transfer as original module dict for {django_libgdal_mod} wasn't available."
93-
)

src/django_lazy_gdal/_typing.py

Lines changed: 0 additions & 10 deletions
This file was deleted.

0 commit comments

Comments
 (0)