Compare commits
2 Commits
2efdf19ee1
...
8eea62f403
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8eea62f403 | ||
|
|
05ba036346 |
@@ -1,6 +1,5 @@
|
||||
from abc import ABC, abstractmethod
|
||||
from collections.abc import Container, Iterable, MutableMapping, MutableSequence, Sized
|
||||
from copy import copy
|
||||
from typing import Protocol, TypeVar
|
||||
|
||||
from . import events as e
|
||||
@@ -57,9 +56,7 @@ class HookedContainer(ABC, Sized, Iterable[T], Container[T]):
|
||||
# Custom Methods
|
||||
|
||||
def new_path(self, key):
|
||||
new_path = copy(self._path)
|
||||
new_path.append(key)
|
||||
return new_path
|
||||
return (*self._path, key)
|
||||
|
||||
def get_nested(self, keys):
|
||||
"""Recursively call __getitem__ with each key in the iterable."""
|
||||
|
||||
@@ -30,7 +30,7 @@ class HookedMapping(HookedContainer[T], MutableMapping[T, MutableNesting[T]]):
|
||||
|
||||
def __getitem__(self, key: T) -> MutableNesting[T]:
|
||||
if key not in self._data:
|
||||
return self.__setitem__(key, {})
|
||||
return HookedMapping(self.__setitem__(key, {}), hook=self.hook, path=self.new_path(key))
|
||||
value = self._data[key]
|
||||
match value:
|
||||
case MutableMapping() as mapping:
|
||||
@@ -38,7 +38,13 @@ class HookedMapping(HookedContainer[T], MutableMapping[T, MutableNesting[T]]):
|
||||
case _ as item:
|
||||
return item
|
||||
|
||||
def __setitem__(self, key: T, value: MutableNesting[T]) -> MutableNesting[T] | None:
|
||||
def __setitem__(
|
||||
self,
|
||||
key: T,
|
||||
value: MutableNesting[T],
|
||||
*,
|
||||
suppress_hook: bool = False,
|
||||
) -> MutableNesting[T] | None:
|
||||
new_path = self.new_path(key)
|
||||
event = e.SetItemEvent(new_path, value) if key in self._data else e.AddItemEvent(new_path, value)
|
||||
match value:
|
||||
@@ -46,7 +52,7 @@ class HookedMapping(HookedContainer[T], MutableMapping[T, MutableNesting[T]]):
|
||||
self._data[key] = value
|
||||
case _:
|
||||
self._data[key] = value
|
||||
if self.hook:
|
||||
if self.hook and not suppress_hook:
|
||||
self.hook(event)
|
||||
return value
|
||||
|
||||
|
||||
Reference in New Issue
Block a user