Skip to content

Commit 258bd25

Browse files
committed
fix: update fact
1 parent d5d578d commit 258bd25

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

memstate/storage.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import copy
22
import threading
3+
import uuid
34
from datetime import datetime, timezone
45
from typing import Any, Callable
56

@@ -133,6 +134,8 @@ def commit(
133134
def commit_model(
134135
self,
135136
model: BaseModel,
137+
fact_id: str | None = None,
138+
source: str | None = None,
136139
session_id: str | None = None,
137140
ephemeral: bool = False,
138141
actor: str | None = None,
@@ -150,7 +153,7 @@ def commit_model(
150153
f"Please call memory.register_schema('your_type_name', {model.__class__.__name__}) first."
151154
)
152155

153-
fact = Fact(type=schema_type, payload=model.model_dump())
156+
fact = Fact(id=fact_id or str(uuid.uuid4()), type=schema_type, payload=model.model_dump(), source=source)
154157

155158
return self.commit(fact, session_id=session_id, ephemeral=ephemeral, actor=actor, reason=reason)
156159

tests/test_storage.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,3 +146,40 @@ def test_commit_model_raises_on_unregistered(memory):
146146

147147
with pytest.raises(MemoryStoreError, match="is not registered"):
148148
memory.commit_model(unknown)
149+
150+
151+
def test_commit_model_create_vs_update(memory):
152+
memory.register_schema("user", User)
153+
154+
user = User(name="Survivor", age=50)
155+
fid = memory.commit_model(user)
156+
157+
assert fid is not None
158+
data_v1 = memory.storage.load(fid)
159+
assert data_v1["payload"]["name"] == "Survivor"
160+
assert data_v1["payload"]["age"] == 50
161+
162+
user_v2 = User(name="Survivor", age=55)
163+
164+
fid_updated = memory.commit_model(user_v2, fact_id=fid)
165+
166+
assert fid_updated == fid
167+
168+
data_v2 = memory.storage.load(fid)
169+
assert data_v2["payload"]["name"] == "Survivor"
170+
assert data_v2["payload"]["age"] == 55
171+
172+
all_facts = memory.storage.query(type_filter="user")
173+
assert len(all_facts) == 1
174+
175+
176+
def test_commit_model_without_id_creates_duplicate(memory):
177+
memory.register_schema("user", User)
178+
user = User(name="Survivor", age=50)
179+
180+
id1 = memory.commit_model(user)
181+
id2 = memory.commit_model(user)
182+
183+
assert id1 != id2
184+
all_facts = memory.storage.query(type_filter="user")
185+
assert len(all_facts) == 2

0 commit comments

Comments
 (0)