Reject non-string atomic text writes (#1819)
This commit is contained in:
parent
a326a6a555
commit
3021569081
2 changed files with 12 additions and 0 deletions
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue