Reject non-string atomic text writes (#1819)

This commit is contained in:
red person
2026-06-29 06:36:21 -07:00
committed by GitHub
parent a326a6a555
commit 3021569081
2 changed files with 12 additions and 0 deletions
+2
View File
@@ -34,6 +34,8 @@ def atomic_write_json(path: str, data: Any, *, indent: Optional[int] = None) ->
def atomic_write_text(path: str, text: str) -> None: def atomic_write_text(path: str, text: str) -> None:
if not isinstance(text, str):
raise TypeError("atomic_write_text expects a string")
os.makedirs(os.path.dirname(path) or ".", exist_ok=True) os.makedirs(os.path.dirname(path) or ".", exist_ok=True)
tmp = f"{path}.tmp.{os.getpid()}" tmp = f"{path}.tmp.{os.getpid()}"
with open(tmp, "w", encoding="utf-8") as f: with open(tmp, "w", encoding="utf-8") as f:
+10
View File
@@ -138,6 +138,16 @@ def test_atomic_write_text_leaves_no_tmp_file(tmp_path):
assert _tmp_siblings(tmp_path, "note.txt") == [] assert _tmp_siblings(tmp_path, "note.txt") == []
def test_atomic_write_text_rejects_non_string_before_tmp_file(tmp_path):
target = tmp_path / "note.txt"
with pytest.raises(TypeError):
atomic_write_text(str(target), 123)
assert not target.exists()
assert _tmp_siblings(tmp_path, "note.txt") == []
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# atomic_write_text — failure path: target preserved when replace fails. # atomic_write_text — failure path: target preserved when replace fails.
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------