diff --git a/src/bub/builtin/store.py b/src/bub/builtin/store.py index 9c91753d..0a2a1ea3 100644 --- a/src/bub/builtin/store.py +++ b/src/bub/builtin/store.py @@ -301,7 +301,7 @@ def append(self, entry: TapeEntry) -> None: self._read_locked() with self.path.open("a", encoding="utf-8") as handle: next_id = self._next_id() - stored = TapeEntry(next_id, entry.kind, dict(entry.payload), dict(entry.meta)) - handle.write(json.dumps(asdict(entry), ensure_ascii=False) + "\n") + stored = TapeEntry(next_id, entry.kind, dict(entry.payload), dict(entry.meta), entry.date) + handle.write(json.dumps(asdict(stored), ensure_ascii=False) + "\n") self._read_entries.append(stored) self._read_offset = handle.tell() diff --git a/tests/test_file_tape_store_entry_ids.py b/tests/test_file_tape_store_entry_ids.py new file mode 100644 index 00000000..15d50baf --- /dev/null +++ b/tests/test_file_tape_store_entry_ids.py @@ -0,0 +1,22 @@ +from __future__ import annotations + +import pytest +from republic import TapeEntry + +from bub.builtin.store import FileTapeStore, ForkTapeStore + + +@pytest.mark.asyncio +async def test_file_tape_store_assigns_monotonic_ids_when_merging_forked_entries(tmp_path) -> None: + parent = FileTapeStore(directory=tmp_path) + store = ForkTapeStore(parent) + + async with store.fork("tape", merge_back=True): + await store.append("tape", TapeEntry.event(name="first", data={"n": 1})) + + async with store.fork("tape", merge_back=True): + await store.append("tape", TapeEntry.event(name="second", data={"n": 2})) + + entries = parent.read("tape") or [] + assert [entry.id for entry in entries] == [1, 2] + assert [entry.payload.get("name") for entry in entries] == ["first", "second"]