|
5 | 5 |
|
6 | 6 |
|
7 | 7 | class StreamingObject[T]: |
| 8 | + _on_complete_funcs: list[Callable[[T], None]] |
| 9 | + |
| 10 | + def __init__(self) -> None: |
| 11 | + self._on_complete_funcs = [] |
| 12 | + |
8 | 13 | def update(self, value: T) -> None: |
9 | 14 | return None |
10 | 15 |
|
11 | 16 | def _complete(self) -> None: ... |
12 | 17 |
|
| 18 | + def on_complete(self, func: Callable[[T], None]) -> None: |
| 19 | + self._on_complete_funcs.append(func) |
| 20 | + |
13 | 21 |
|
14 | 22 | class Object(StreamingObject[dict[str, Any]]): |
15 | 23 | _keys: list[str] |
16 | 24 | _parsed_keys: list[str] |
17 | | - _on_complete_funcs: list[Callable[[dict[str, Any]], None]] |
18 | 25 | _value: dict[str, Any] |
19 | 26 |
|
20 | 27 | def __init__(self) -> None: |
21 | 28 | super().__init__() |
22 | 29 | self._keys = [] |
23 | 30 | self._parsed_keys = [] |
24 | 31 | self._value = {} |
25 | | - self._on_complete_funcs = [] |
26 | 32 |
|
27 | | - for key, type_hint in type(self).__annotations__.items(): |
| 33 | + # initialize keys for potential parent classes |
| 34 | + for cls in self.__class__.mro()[1:-1]: |
| 35 | + if cls.__name__ == "Object" or cls.__name__ == "StreamingObject": |
| 36 | + break |
| 37 | + |
| 38 | + self._initialize_attributes(cls.__annotations__) |
| 39 | + |
| 40 | + self._initialize_attributes(type(self).__annotations__) |
| 41 | + |
| 42 | + def _initialize_attributes(self, attributes: dict[str, Any]) -> None: |
| 43 | + for key, type_hint in attributes.items(): |
28 | 44 | self._keys.append(key) |
29 | 45 |
|
30 | 46 | # Handle List[T] |
@@ -167,23 +183,19 @@ def get_value(self) -> list[T]: |
167 | 183 | return self._values |
168 | 184 |
|
169 | 185 |
|
170 | | -class Atomic[T](StreamingObject[T]): |
| 186 | +class Atomic[T](StreamingObject[T | None]): |
171 | 187 | _is_empty: bool |
172 | 188 | _value: T | None |
173 | | - _on_complete_funcs: list[Callable[[T | None], None]] |
174 | 189 |
|
175 | 190 | def __init__(self, item_cls: type[T]) -> None: |
176 | 191 | self._is_empty = True |
177 | 192 | self._value = None |
178 | 193 | self._on_complete_funcs = [] |
179 | 194 |
|
180 | | - def update(self, value: T) -> None: |
| 195 | + def update(self, value: T | None) -> None: |
181 | 196 | self._value = value |
182 | 197 | self._is_empty = False |
183 | 198 |
|
184 | | - def on_complete(self, func: Callable[[T | None], None]) -> None: |
185 | | - self._on_complete_funcs.append(func) |
186 | | - |
187 | 199 | def _complete(self) -> None: |
188 | 200 | if not self._is_empty: |
189 | 201 | for func in self._on_complete_funcs: |
|
0 commit comments