Skip to content

Commit 5dce2af

Browse files
authored
fix(models): check env var before auto-sync, fix tests (#275)
Support MODFLOW_DEVTOOLS_NO_AUTO_SYNC env var for Models API (like Programs API), use it in CI tests. And filter out None recursively before writing TOML to the cache.
1 parent a149779 commit 5dce2af

3 files changed

Lines changed: 21 additions & 6 deletions

File tree

.github/workflows/ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ jobs:
104104
working-directory: modflow-devtools/autotest
105105
env:
106106
REPOS_PATH: ${{ github.workspace }}
107+
MODFLOW_DEVTOOLS_NO_AUTO_SYNC: 1
107108
# use --dist loadfile to so tests requiring pytest-virtualenv run on the same worker
108109
run: uv run pytest -v -n auto --dist loadfile --durations 0 --ignore test_download.py --ignore test_models.py
109110

@@ -120,6 +121,7 @@ jobs:
120121
TEST_REF: registry
121122
TEST_SOURCE: modflow6-testmodels
122123
TEST_SOURCE_NAME: mf6/test
124+
MODFLOW_DEVTOOLS_NO_AUTO_SYNC: 1
123125
run: uv run pytest -v -n auto --dist loadgroup --durations 0 test_download.py test_models.py
124126

125127
rtd:

autotest/test_models.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,8 @@ def test_sync_force(self):
329329
)
330330

331331
# First sync
332-
source.sync(ref=TEST_REF)
332+
result_initial = source.sync(ref=TEST_REF)
333+
assert len(result_initial.failed) == 0, f"Initial sync failed: {result_initial.failed}"
333334

334335
# Force sync
335336
result = source.sync(ref=TEST_REF, force=True)
@@ -405,7 +406,8 @@ def synced_registry(self):
405406
name=TEST_SOURCE_NAME,
406407
refs=[TEST_REF],
407408
)
408-
source.sync(ref=TEST_REF)
409+
result = source.sync(ref=TEST_REF)
410+
assert len(result.failed) == 0, f"Fixture sync failed: {result.failed}"
409411
registry = _DEFAULT_CACHE.load(TEST_SOURCE_NAME, TEST_REF)
410412
return registry
411413

@@ -478,7 +480,12 @@ def test_cli_list_with_cache(self, capsys):
478480
name=TEST_SOURCE_NAME,
479481
refs=[TEST_REF],
480482
)
481-
source.sync(ref=TEST_REF)
483+
result = source.sync(ref=TEST_REF)
484+
485+
# Verify sync succeeded before testing list command
486+
assert len(result.failed) == 0, f"Sync failed: {result.failed}"
487+
assert len(result.synced) == 1, f"Expected 1 synced registry, got {len(result.synced)}"
488+
assert (TEST_SOURCE_NAME, TEST_REF) in result.synced
482489

483490
import argparse
484491

modflow_devtools/models/__init__.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,13 @@ def save(self, registry: ModelRegistry, source: str, ref: str) -> Path:
211211
cache_dir.mkdir(parents=True, exist_ok=True)
212212

213213
registry_file = cache_dir / _DEFAULT_REGISTRY_FILE_NAME
214+
215+
# Convert registry to dict and clean None/empty values before serializing to TOML
216+
registry_dict = registry.model_dump(mode="json", by_alias=True, exclude_none=True)
217+
registry_dict = remap(registry_dict, visit=drop_none_or_empty)
218+
214219
with registry_file.open("wb") as f:
215-
tomli_w.dump(registry.model_dump(mode="json", by_alias=True, exclude_none=True), f)
220+
tomli_w.dump(registry_dict, f)
216221

217222
return registry_file
218223

@@ -1260,8 +1265,9 @@ def _try_best_effort_sync():
12601265
pass
12611266

12621267

1263-
# Try to sync on first import
1264-
_try_best_effort_sync()
1268+
# Try to sync on first import (unless disabled)
1269+
if not os.environ.get("MODFLOW_DEVTOOLS_NO_AUTO_SYNC"):
1270+
_try_best_effort_sync()
12651271

12661272
# Lazy initialization of default registry
12671273
_default_registry_cache = None

0 commit comments

Comments
 (0)