From 40c27d418ca35f85027816d7fea169636f300ab5 Mon Sep 17 00:00:00 2001 From: David Mautz Date: Mon, 13 Jul 2026 09:54:43 -0500 Subject: [PATCH] fix(loader): accept str paths in UMFLoader.save/load save() annotated path: Path but never coerced it, so passing an f-string path died with 'str' object has no attribute 'mkdir'. Coerce on entry like load() already did and widen both signatures to str | Path. Co-Authored-By: Claude Fable 5 --- src/tablespec/umf_loader.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/tablespec/umf_loader.py b/src/tablespec/umf_loader.py index 30860e70..06eb931d 100644 --- a/src/tablespec/umf_loader.py +++ b/src/tablespec/umf_loader.py @@ -90,7 +90,7 @@ def _convert_yaml_to_plain_strings(obj: Any) -> Any: return str(obj) return obj - def load(self, path: Path) -> UMF: + def load(self, path: str | Path) -> UMF: """Load UMF from any format (auto-detect). Supports all UMF formats: @@ -576,7 +576,9 @@ def _load_column_centric(self, dir_path: Path) -> UMF: umf.mtime = table_file.stat().st_mtime return umf - def save(self, umf: UMF, path: Path, format: UMFFormat = UMFFormat.SPLIT) -> None: + def save( + self, umf: UMF, path: str | Path, format: UMFFormat = UMFFormat.SPLIT + ) -> None: """Save UMF to path in specified format. Args: @@ -585,6 +587,7 @@ def save(self, umf: UMF, path: Path, format: UMFFormat = UMFFormat.SPLIT) -> Non format: Target format (defaults to SPLIT) """ + path = Path(path) if format == UMFFormat.JSON: self.save_json(umf, path) elif format == UMFFormat.SPLIT: