Skip to content

Commit 23dbb67

Browse files
committed
Refactor _resolve_glob to support directories and cleanup
1 parent 50e6685 commit 23dbb67

File tree

2 files changed

+54
-33
lines changed

2 files changed

+54
-33
lines changed

src/sdf_xarray/__init__.py

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -96,23 +96,19 @@ def _process_latex_name(variable_name: str) -> str:
9696
return variable_name
9797

9898

99-
def _resolve_glob(path_glob: PathLike | Iterable[PathLike]) -> list[Path]:
100-
"""Resolve an input path/glob to sorted absolute SDF file paths.
99+
def resolve_paths(path_glob: PathLike | Iterable[PathLike]) -> list[Path]:
100+
"""Resolve a path/glob to sorted absolute SDF file paths.
101101
102-
Accepts either a single path-like glob pattern (e.g. ``"*.sdf"``) or a
102+
Accepts a directory, single path-like glob pattern (e.g. ``"normal_*.sdf"``) or a
103103
list of path-like file names.
104104
"""
105105

106-
if isinstance(path_glob, PathLike):
106+
# Attempt to load directory or glob
107+
try:
107108
p = Path(path_glob)
108-
if p.is_dir():
109-
raise TypeError(
110-
"Directory paths are not supported; pass a glob pattern"
111-
f"(e.g. {(p / '*.sdf').as_posix()}) or a list of file paths"
112-
f"(e.g. {[(p / '0000.sdf').as_posix(), (p / '0001.sdf').as_posix()]})."
113-
)
114-
paths = list(p.parent.glob(p.name))
115-
else:
109+
paths = p.glob("*.sdf") if p.is_dir() else list(p.parent.glob(p.name))
110+
# Otherwise assume the user has passed a list of file paths
111+
except TypeError:
116112
paths = list({Path(p) for p in path_glob})
117113

118114
resolved_paths = sorted(p.resolve() for p in paths)
@@ -121,9 +117,9 @@ def _resolve_glob(path_glob: PathLike | Iterable[PathLike]) -> list[Path]:
121117

122118
for p in resolved_paths:
123119
if not p.is_file():
124-
raise FileNotFoundError(f"{p.as_posix()} does not exist or is not a file.")
120+
raise FileNotFoundError(f"{p.as_posix()} does not exist or is not a file")
125121
if p.suffix.lower() != ".sdf":
126-
raise FileNotFoundError(f"{p.as_posix()} is not an SDF file.")
122+
raise FileNotFoundError(f"{p.as_posix()} is not an SDF file")
127123
return resolved_paths
128124

129125

@@ -340,7 +336,7 @@ def open_mfdataset(
340336
from a relative or absolute file path. See :ref:`loading-input-deck` for details.
341337
"""
342338

343-
paths = _resolve_glob(paths)
339+
paths = resolve_paths(paths)
344340

345341
if not separate_times:
346342
return combine_datasets(

tests/test_dataset.py

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
from sdf_xarray import (
1010
SDFPreprocess,
1111
_process_latex_name,
12-
_resolve_glob,
1312
download,
13+
resolve_paths,
1414
)
1515

1616
TEST_FILES_DIR = download.fetch_dataset("test_files_1D")
@@ -205,70 +205,95 @@ def test_multiple_files_multiple_time_dims():
205205
assert df["Absorption_Total_Laser_Energy_Injected"].shape == (11,)
206206

207207

208-
def test_resolve_glob_from_string_pattern():
208+
def test_resolve_paths_from_string_pattern():
209209
pattern = str(TEST_FILES_DIR / "*.sdf")
210-
result = _resolve_glob(pattern)
210+
result = resolve_paths(pattern)
211211
expected = sorted(TEST_FILES_DIR.glob("*.sdf"))
212212
assert result == expected
213213

214214

215-
def test_resolve_glob_from_multiple_names_string_pattern(tmp_path):
215+
def test_resolve_paths_from_multiple_names_string_pattern(tmp_path):
216216
mock_test_files_dir = tmp_path
217217
(mock_test_files_dir / "normal_0000.sdf").touch()
218218
(mock_test_files_dir / "normal_0001.sdf").touch()
219219
(mock_test_files_dir / "other_0000.sdf").touch()
220220

221221
pattern = str(mock_test_files_dir / "normal_*.sdf")
222-
result = _resolve_glob(pattern)
222+
result = resolve_paths(pattern)
223223
expected = sorted(mock_test_files_dir.glob("normal_*.sdf"))
224224
assert result == expected
225225

226226

227-
def test_resolve_glob_from_path_glob():
227+
def test_resolve_paths_from_path_glob():
228228
pattern = TEST_FILES_DIR.glob("*.sdf")
229-
result = _resolve_glob(pattern)
229+
result = resolve_paths(pattern)
230230
expected = sorted(TEST_FILES_DIR.glob("*.sdf"))
231231
assert result == expected
232232

233233

234-
def test_resolve_glob_from_path_missing_glob():
234+
def test_resolve_paths_from_directory_path():
235235
pattern = TEST_FILES_DIR
236-
with pytest.raises(TypeError):
237-
_resolve_glob(pattern)
236+
result = resolve_paths(pattern)
237+
expected = sorted(TEST_FILES_DIR.glob("*.sdf"))
238+
assert result == expected
238239

239240

240-
def test_resolve_glob_from_path_list():
241+
def test_resolve_paths_from_path_list():
241242
pattern = [TEST_FILES_DIR / "0000.sdf"]
242-
result = _resolve_glob(pattern)
243+
result = resolve_paths(pattern)
243244
expected = [TEST_FILES_DIR / "0000.sdf"]
244245
assert result == expected
245246

246247

247-
def test_resolve_glob_from_path_list_multiple():
248+
def test_resolve_paths_from_missing_file():
249+
pattern = ["/test/0000.sdf"]
250+
with pytest.raises(FileNotFoundError):
251+
resolve_paths(pattern)
252+
253+
254+
def test_resolve_paths_from_non_sdf_file():
255+
pattern = [TEST_FILES_DIR / "input.deck"]
256+
with pytest.raises(FileNotFoundError):
257+
resolve_paths(pattern)
258+
259+
260+
def test_resolve_paths_from_path_list_multiple():
248261
pattern = [TEST_FILES_DIR / "0000.sdf", TEST_FILES_DIR / "0001.sdf"]
249-
result = _resolve_glob(pattern)
262+
result = resolve_paths(pattern)
250263
expected = [TEST_FILES_DIR / "0000.sdf", TEST_FILES_DIR / "0001.sdf"]
251264
assert result == expected
252265

253266

254-
def test_resolve_glob_from_path_list_multiple_unordered():
267+
def test_resolve_paths_from_path_list_multiple_unordered():
255268
pattern = [TEST_FILES_DIR / "0001.sdf", TEST_FILES_DIR / "0000.sdf"]
256-
result = _resolve_glob(pattern)
269+
result = resolve_paths(pattern)
257270
expected = [TEST_FILES_DIR / "0000.sdf", TEST_FILES_DIR / "0001.sdf"]
258271
assert result == expected
259272

260273

261-
def test_resolve_glob_from_path_list_multiple_duplicates():
274+
def test_resolve_paths_from_path_list_multiple_duplicates():
262275
pattern = [
263276
TEST_FILES_DIR / "0000.sdf",
264277
TEST_FILES_DIR / "0000.sdf",
265278
TEST_FILES_DIR / "0001.sdf",
266279
]
267-
result = _resolve_glob(pattern)
280+
result = resolve_paths(pattern)
268281
expected = [TEST_FILES_DIR / "0000.sdf", TEST_FILES_DIR / "0001.sdf"]
269282
assert result == expected
270283

271284

285+
def test_resolve_paths_from_path_list_missing_files():
286+
pattern = [TEST_FILES_DIR / "0000.sdf", "/test/0000.sdf"]
287+
with pytest.raises(FileNotFoundError):
288+
resolve_paths(pattern)
289+
290+
291+
def test_resolve_paths_from_path_list_non_sdf_files():
292+
pattern = [TEST_FILES_DIR / "0000.sdf", TEST_FILES_DIR / "input.deck"]
293+
with pytest.raises(FileNotFoundError):
294+
resolve_paths(pattern)
295+
296+
272297
@pytest.mark.parametrize(
273298
("xrlib", "params"),
274299
[

0 commit comments

Comments
 (0)