mirror of
https://github.com/tiqi-group/pydase.git
synced 2025-04-21 00:40:01 +02:00
reduces complexity of DataServiceObserver functions
This commit is contained in:
parent
75ee71cbf8
commit
a9c6070ca3
@ -87,7 +87,16 @@ class DataServiceObserver(Observer):
|
|||||||
def _get_properties_and_their_dependencies(
|
def _get_properties_and_their_dependencies(
|
||||||
self, obj: Observable, prefix: str = ""
|
self, obj: Observable, prefix: str = ""
|
||||||
) -> dict[str, list[str]]:
|
) -> dict[str, list[str]]:
|
||||||
deps = {}
|
deps: dict[str, Any] = {}
|
||||||
|
|
||||||
|
self._process_observable_properties(obj, deps, prefix)
|
||||||
|
self._process_nested_observables_properties(obj, deps, prefix)
|
||||||
|
|
||||||
|
return deps
|
||||||
|
|
||||||
|
def _process_observable_properties(
|
||||||
|
self, obj: Observable, deps: dict[str, Any], prefix: str
|
||||||
|
) -> None:
|
||||||
for k, value in vars(type(obj)).items():
|
for k, value in vars(type(obj)).items():
|
||||||
prefix = (
|
prefix = (
|
||||||
f"{prefix}." if prefix != "" and not prefix.endswith(".") else prefix
|
f"{prefix}." if prefix != "" and not prefix.endswith(".") else prefix
|
||||||
@ -96,50 +105,42 @@ class DataServiceObserver(Observer):
|
|||||||
if isinstance(value, property):
|
if isinstance(value, property):
|
||||||
deps[key] = get_property_dependencies(value, prefix)
|
deps[key] = get_property_dependencies(value, prefix)
|
||||||
|
|
||||||
|
def _process_nested_observables_properties(
|
||||||
|
self, obj: Observable, deps: dict[str, Any], prefix: str
|
||||||
|
) -> None:
|
||||||
for k, value in vars(obj).items():
|
for k, value in vars(obj).items():
|
||||||
prefix = (
|
prefix = (
|
||||||
f"{prefix}." if prefix != "" and not prefix.endswith(".") else prefix
|
f"{prefix}." if prefix != "" and not prefix.endswith(".") else prefix
|
||||||
)
|
)
|
||||||
key = f"{prefix}{k}"
|
parent_path = f"{prefix}{k}"
|
||||||
if isinstance(value, Observable):
|
if isinstance(value, Observable):
|
||||||
new_prefix = f"{key}."
|
new_prefix = f"{parent_path}."
|
||||||
deps.update(
|
deps.update(
|
||||||
self._get_properties_and_their_dependencies(value, new_prefix)
|
self._get_properties_and_their_dependencies(value, new_prefix)
|
||||||
)
|
)
|
||||||
elif isinstance(value, list):
|
elif isinstance(value, list | dict):
|
||||||
for i, item in enumerate(value):
|
self._process_collection_item_properties(value, deps, parent_path)
|
||||||
if isinstance(item, Observable):
|
|
||||||
new_prefix = f"{key}[{i}]"
|
|
||||||
deps.update(
|
|
||||||
self._get_properties_and_their_dependencies(
|
|
||||||
item, new_prefix
|
|
||||||
)
|
|
||||||
)
|
|
||||||
elif isinstance(value, dict):
|
|
||||||
for key, val in value.items():
|
|
||||||
if isinstance(val, Observable):
|
|
||||||
new_prefix = f"{key}['{key}']"
|
|
||||||
deps.update(
|
|
||||||
self._get_properties_and_their_dependencies(val, new_prefix)
|
|
||||||
)
|
|
||||||
|
|
||||||
return deps
|
def _process_collection_item_properties(
|
||||||
|
self,
|
||||||
def _get_property_values(
|
collection: list[Any] | dict[str, Any],
|
||||||
self, obj: Observable, prefix: str = ""
|
deps: dict[str, Any],
|
||||||
) -> dict[str, list[str]]:
|
parent_path: str,
|
||||||
values = {}
|
) -> None:
|
||||||
for k, value in vars(type(obj)).items():
|
if isinstance(collection, list):
|
||||||
key = f"{prefix}{k}"
|
for i, item in enumerate(collection):
|
||||||
if isinstance(value, property):
|
if isinstance(item, Observable):
|
||||||
values[key] = getattr(obj, k)
|
new_prefix = f"{parent_path}[{i}]"
|
||||||
|
deps.update(
|
||||||
for k, value in vars(obj).items():
|
self._get_properties_and_their_dependencies(item, new_prefix)
|
||||||
key = f"{prefix}{k}"
|
)
|
||||||
if isinstance(value, Observable):
|
elif isinstance(collection, dict):
|
||||||
new_prefix = f"{key}." if not key.endswith("]") else key
|
for key, val in collection.items():
|
||||||
values.update(self._get_property_values(value, new_prefix))
|
if isinstance(val, Observable):
|
||||||
return values
|
new_prefix = f"{parent_path}['{key}']"
|
||||||
|
deps.update(
|
||||||
|
self._get_properties_and_their_dependencies(val, new_prefix)
|
||||||
|
)
|
||||||
|
|
||||||
def add_notification_callback(
|
def add_notification_callback(
|
||||||
self, callback: Callable[[str, Any, dict[str, Any]], None]
|
self, callback: Callable[[str, Any, dict[str, Any]], None]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user