Skip to content

Commit d350ad5

Browse files
committed
refactor: replace try_import_xarray with the generic try_import
Drop the specific try_import_xarray helper now that a generic try_import exists, and check for xarray and xarray-sql directly at the call sites in the xarray source and the UI upload handlers.
1 parent c03b638 commit d350ad5

5 files changed

Lines changed: 15 additions & 40 deletions

File tree

lumen/ai/ui.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
from ..sources import Source
3838
from ..sources.duckdb import DuckDBSource
3939
from ..sources.xarray_sql import XArraySQLSource
40-
from ..util import log, normalize_table_name, try_import_xarray
40+
from ..util import log, normalize_table_name, try_import
4141
from .agents import (
4242
AnalysisAgent, BaseCodeAgent, ChatAgent, DocumentListAgent,
4343
DocumentSummarizerAgent, SourceAgent, SQLAgent, TableListAgent,
@@ -537,7 +537,7 @@ def _handle_xarray_upload(context, file_obj, alias, filename):
537537
_temp_files.append(tmp.name)
538538
return XArraySQLSource(uri=tmp.name, name=alias)
539539

540-
if try_import_xarray() is None:
540+
if try_import("xarray") is None or try_import("xarray_sql") is None:
541541
return {}
542542

543543
_temp_files: list[str] = []

lumen/sources/xarray_sql.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import param
1515

1616
from ..transforms.sql import SQLFilter
17-
from ..util import try_import_xarray
17+
from ..util import try_import
1818
from .base import BaseSQLSource, cached
1919

2020

@@ -93,7 +93,7 @@ class XArraySQLSource(BaseSQLSource):
9393
The SQL expression template for table queries.""")
9494

9595
def __init__(self, _dataset=None, _ctx=None, **params):
96-
if try_import_xarray() is None:
96+
if try_import("xarray") is None or try_import("xarray_sql") is None:
9797
raise ImportError(
9898
"xarray and xarray-sql are required for XArraySQLSource. "
9999
"Install them with: pip install lumen[xarray]"
@@ -161,7 +161,7 @@ def _load_dataset(cls, dataset, uri, engine, chunks, open_kwargs, variables):
161161
kw["engine"] = resolved_engine
162162
if chunks is not None:
163163
kw["chunks"] = chunks
164-
xr = try_import_xarray()
164+
xr = try_import("xarray")
165165
ds = xr.open_dataset(uri, **kw)
166166
else:
167167
raise ValueError("Either 'uri' or '_dataset' must be provided.")

lumen/tests/ai/test_ui.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1165,7 +1165,7 @@ def test_resolve_data_netcdf_file(self):
11651165

11661166
def test_resolve_data_xarray_import_error(self):
11671167
"""Test graceful error when xarray-sql not installed."""
1168-
with patch('lumen.sources.xarray_sql.try_import_xarray', return_value=None):
1168+
with patch('lumen.sources.xarray_sql.try_import', return_value=None):
11691169
with pytest.raises(ImportError, match="xarray"):
11701170
UI._resolve_data('data.nc')
11711171

@@ -1244,7 +1244,7 @@ def test_upload_handler_creates_source_from_nc(self):
12441244

12451245
def test_upload_handler_returns_empty_without_xarray(self):
12461246
"""Upload handlers should be empty if xarray-sql not installed."""
1247-
with patch('lumen.ai.ui.try_import_xarray', return_value=None):
1247+
with patch('lumen.ai.ui.try_import', return_value=None):
12481248
handlers = UI._get_xarray_upload_handlers()
12491249
assert handlers == {}
12501250

lumen/tests/sources/test_optional_imports.py

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
import pytest
1616

17-
from lumen.util import try_import_xarray
17+
from lumen.util import try_import
1818

1919
# Each entry: (module_path, class_name, guard_package, pip_extra)
2020
OPTIONAL_SOURCES = [
@@ -88,28 +88,13 @@ def mock_import(name, *args, **kwargs):
8888
sys.modules.update(saved)
8989

9090

91-
def test_try_import_xarray_returns_module_when_installed():
92-
"""try_import_xarray returns the xarray module when xarray and xarray-sql are installed."""
93-
xr = pytest.importorskip("xarray")
94-
pytest.importorskip("xarray_sql")
95-
assert try_import_xarray() is xr
91+
def test_try_import_returns_module_when_installed():
92+
"""try_import returns the imported module when it is available."""
93+
import json
9694

95+
assert try_import("json") is json
9796

98-
def test_try_import_xarray_none_when_missing():
99-
"""try_import_xarray returns None (not raises) when xarray-sql is absent."""
100-
real_import = builtins.__import__
101-
102-
def mock_import(name, *args, **kwargs):
103-
if name == "xarray_sql" or name.startswith("xarray_sql."):
104-
raise ImportError("No module named 'xarray_sql'")
105-
return real_import(name, *args, **kwargs)
10697

107-
saved = {
108-
key: sys.modules.pop(key)
109-
for key in [k for k in sys.modules if k == "xarray_sql" or k.startswith("xarray_sql.")]
110-
}
111-
try:
112-
with patch("builtins.__import__", side_effect=mock_import):
113-
assert try_import_xarray() is None
114-
finally:
115-
sys.modules.update(saved)
98+
def test_try_import_none_when_missing():
99+
"""try_import returns None (not raises) when the module is absent."""
100+
assert try_import("a_module_that_definitely_does_not_exist_xyz") is None

lumen/util.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -505,13 +505,3 @@ def try_import(module: str):
505505
return importlib.import_module(module)
506506
except ImportError:
507507
return None
508-
509-
510-
def try_import_xarray():
511-
"""Import and return xarray, or None if xarray or xarray-sql is unavailable."""
512-
try:
513-
import xarray
514-
import xarray_sql # noqa
515-
return xarray
516-
except ImportError:
517-
return None

0 commit comments

Comments
 (0)