fix: freeze evidence metadata lists as lists (preserve JSON shape)
This commit is contained in:
@@ -26,6 +26,26 @@ class FrozenDict(dict):
|
||||
update = _immutable
|
||||
|
||||
|
||||
class FrozenList(list):
|
||||
"""A JSON-serializable list whose mutation operations are disabled."""
|
||||
|
||||
def _immutable(self, *args, **kwargs):
|
||||
raise TypeError("frozen JSON metadata cannot be mutated")
|
||||
|
||||
__delitem__ = _immutable
|
||||
__iadd__ = _immutable
|
||||
__imul__ = _immutable
|
||||
__setitem__ = _immutable
|
||||
append = _immutable
|
||||
clear = _immutable
|
||||
extend = _immutable
|
||||
insert = _immutable
|
||||
pop = _immutable
|
||||
remove = _immutable
|
||||
reverse = _immutable
|
||||
sort = _immutable
|
||||
|
||||
|
||||
_CAMEL_BOUNDARY = re.compile(r"(?<=[a-z0-9])(?=[A-Z])")
|
||||
_SEPARATORS = re.compile(r"[^a-z0-9]+")
|
||||
_NAMESPACED_VALUE = re.compile(r"^[a-z][a-z0-9_-]*:[A-Za-z0-9._:-]+$")
|
||||
@@ -72,7 +92,7 @@ def freeze_json(value):
|
||||
if isinstance(value, Mapping):
|
||||
return FrozenDict({str(key): freeze_json(child) for key, child in value.items()})
|
||||
if isinstance(value, Sequence) and not isinstance(value, (str, bytes, bytearray)):
|
||||
return tuple(freeze_json(child) for child in value)
|
||||
return FrozenList(freeze_json(child) for child in value)
|
||||
return value
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user