fix(bundler): dump_yaml writes literal UTF-8 (allow_unicode=True) (#3660)

dump_yaml called yaml.safe_dump without allow_unicode=True, so non-ASCII
content was written as \xNN / \uXXXX escapes instead of literal UTF-8 — a
round-trip readability loss for bundle config. The centralized helper
_utils.dump_frontmatter and the extensions/presets config writers all pass
allow_unicode=True; align dump_yaml with them.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ali jawwad
2026-07-23 18:12:26 +05:00
committed by GitHub
parent e4cfa4c19c
commit 5e384bb9f5
2 changed files with 33 additions and 1 deletions

View File

@@ -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

View File

@@ -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