diff --git a/src/specify_cli/bundler/lib/yamlio.py b/src/specify_cli/bundler/lib/yamlio.py index fc90580275..b5fb0e5691 100644 --- a/src/specify_cli/bundler/lib/yamlio.py +++ b/src/specify_cli/bundler/lib/yamlio.py @@ -60,7 +60,13 @@ def dump_yaml(path: Path, data: Any, *, within: Path | None = None) -> Path: try: path.parent.mkdir(parents=True, exist_ok=True) with path.open("w", encoding="utf-8") as handle: - yaml.safe_dump(data, handle, sort_keys=False, default_flow_style=False) + yaml.safe_dump( + data, + handle, + sort_keys=False, + default_flow_style=False, + allow_unicode=True, + ) except OSError as exc: raise BundlerError(f"Could not write {path}: {exc}") from exc return path diff --git a/tests/unit/test_bundler_yamlio.py b/tests/unit/test_bundler_yamlio.py new file mode 100644 index 0000000000..e9c60d762e --- /dev/null +++ b/tests/unit/test_bundler_yamlio.py @@ -0,0 +1,26 @@ +"""Unit tests for the bundler YAML I/O helpers.""" +from __future__ import annotations + +from pathlib import Path + +from specify_cli.bundler.lib.yamlio import dump_yaml, load_yaml + + +def test_dump_yaml_preserves_unicode(tmp_path: Path): + # dump_yaml must write literal UTF-8, not \xNN / \uXXXX escapes, so bundle + # config stays human-readable — matching _utils.dump_frontmatter and the + # extensions/presets config writers (all allow_unicode=True). + path = tmp_path / "f.yml" + data = {"note": "café-münchen", "url": "https://例え.example"} + dump_yaml(path, data) + raw = path.read_text(encoding="utf-8") + assert "café-münchen" in raw + assert "例え" in raw + assert "\\x" not in raw and "\\u" not in raw + + +def test_dump_yaml_round_trips_unicode(tmp_path: Path): + path = tmp_path / "f.yml" + data = {"note": "café", "city": "münchen"} + dump_yaml(path, data) + assert load_yaml(path) == data