diff --git a/src/nooa/storage/snapshot_vars.py b/src/nooa/storage/snapshot_vars.py index 6973e0014..f8f1fba6e 100644 --- a/src/nooa/storage/snapshot_vars.py +++ b/src/nooa/storage/snapshot_vars.py @@ -55,6 +55,15 @@ def __getitem__(self, key: str) -> Any: return self._data[key] def __setitem__(self, key: str, value: Any) -> None: + if not isinstance(key, str): + logger.warning( + "SnapshotVars: key %r (%s) is not a string and will NOT be persisted " + "(it won't survive /exit + resume): snapshots are JSON, which requires " + "string keys", + key, + type(key).__name__, + ) + return try: serialize(value) except (SerializationError, TypeError, ValueError, RecursionError) as exc: diff --git a/tests/storage/test_snapshot_vars.py b/tests/storage/test_snapshot_vars.py index 0b7f0ce8b..c0b04b4ca 100644 --- a/tests/storage/test_snapshot_vars.py +++ b/tests/storage/test_snapshot_vars.py @@ -71,6 +71,13 @@ def test_snapshot_serialize_succeeds_even_after_bad_write(self): assert blob["__type__"] == "dict_class" assert blob["data"]["_data"] == {"keep": {"token": "abc"}} + def test_snapshot_serialize_succeeds_even_after_non_string_key_write(self): + v = SnapshotVars() + v["keep"] = {"token": "abc"} + v[123] = "bad key" # skipped on write + blob, _allow = serialize(v) + assert blob["data"]["_data"] == {"keep": {"token": "abc"}} + def test_round_trip_preserves_kept_values(self): from nooa.storage.serialization import deserialize