|
8 | 8 | from ..exceptions import FeatureNotSupportedError, NodeNotFoundError, ResourceNotDefinedError, SchemaNotFoundError |
9 | 9 | from ..graphql import Mutation, Query |
10 | 10 | from ..schema import GenericSchemaAPI, RelationshipCardinality, RelationshipKind |
11 | | -from ..utils import compare_lists, generate_short_id, get_flat_value |
| 11 | +from ..utils import compare_lists, generate_short_id |
12 | 12 | from .attribute import Attribute |
13 | 13 | from .constants import ( |
14 | 14 | ARTIFACT_DEFINITION_GENERATE_FEATURE_NOT_SUPPORTED_MESSAGE, |
@@ -418,14 +418,6 @@ def generate_query_data_init( |
418 | 418 |
|
419 | 419 | return data |
420 | 420 |
|
421 | | - def extract(self, params: dict[str, str]) -> dict[str, Any]: |
422 | | - """Extract some datapoints defined in a flat notation.""" |
423 | | - result: dict[str, Any] = {} |
424 | | - for key, value in params.items(): |
425 | | - result[key] = get_flat_value(self, key=value) |
426 | | - |
427 | | - return result |
428 | | - |
429 | 421 | def __hash__(self) -> int: |
430 | 422 | return hash(self.id) |
431 | 423 |
|
@@ -1036,6 +1028,46 @@ def _get_relationship_one(self, name: str) -> RelatedNode: |
1036 | 1028 |
|
1037 | 1029 | raise ResourceNotDefinedError(message=f"The node doesn't have a cardinality=one relationship for {name}") |
1038 | 1030 |
|
| 1031 | + async def get_flat_value(self, key: str, separator: str = "__") -> Any: |
| 1032 | + """Query recursively a value defined in a flat notation (string), on a hierarchy of objects |
| 1033 | +
|
| 1034 | + Examples: |
| 1035 | + name__value |
| 1036 | + module.object.value |
| 1037 | + """ |
| 1038 | + if separator not in key: |
| 1039 | + return getattr(self, key) |
| 1040 | + |
| 1041 | + first, remaining = key.split(separator, maxsplit=1) |
| 1042 | + |
| 1043 | + if first in self._schema.attribute_names: |
| 1044 | + attr = getattr(self, first) |
| 1045 | + for part in remaining.split(separator): |
| 1046 | + attr = getattr(attr, part) |
| 1047 | + return attr |
| 1048 | + |
| 1049 | + try: |
| 1050 | + rel = self._schema.get_relationship(name=first) |
| 1051 | + except ValueError as exc: |
| 1052 | + raise ValueError(f"No attribute or relationship named '{first}' for '{self._schema.kind}'") from exc |
| 1053 | + |
| 1054 | + if rel.cardinality != RelationshipCardinality.ONE: |
| 1055 | + raise ValueError( |
| 1056 | + f"Can only look up flat value for relationships of cardinality {RelationshipCardinality.ONE.value}" |
| 1057 | + ) |
| 1058 | + |
| 1059 | + related_node: RelatedNode = getattr(self, first) |
| 1060 | + await related_node.fetch() |
| 1061 | + return await related_node.peer.get_flat_value(key=remaining, separator=separator) |
| 1062 | + |
| 1063 | + async def extract(self, params: dict[str, str]) -> dict[str, Any]: |
| 1064 | + """Extract some datapoints defined in a flat notation.""" |
| 1065 | + result: dict[str, Any] = {} |
| 1066 | + for key, value in params.items(): |
| 1067 | + result[key] = await self.get_flat_value(key=value) |
| 1068 | + |
| 1069 | + return result |
| 1070 | + |
1039 | 1071 | def __dir__(self) -> Iterable[str]: |
1040 | 1072 | base = list(super().__dir__()) |
1041 | 1073 | return sorted( |
@@ -1622,6 +1654,46 @@ def _get_relationship_one(self, name: str) -> RelatedNode | RelatedNodeSync: |
1622 | 1654 |
|
1623 | 1655 | raise ResourceNotDefinedError(message=f"The node doesn't have a cardinality=one relationship for {name}") |
1624 | 1656 |
|
| 1657 | + def get_flat_value(self, key: str, separator: str = "__") -> Any: |
| 1658 | + """Query recursively a value defined in a flat notation (string), on a hierarchy of objects |
| 1659 | +
|
| 1660 | + Examples: |
| 1661 | + name__value |
| 1662 | + module.object.value |
| 1663 | + """ |
| 1664 | + if separator not in key: |
| 1665 | + return getattr(self, key) |
| 1666 | + |
| 1667 | + first, remaining = key.split(separator, maxsplit=1) |
| 1668 | + |
| 1669 | + if first in self._schema.attribute_names: |
| 1670 | + attr = getattr(self, first) |
| 1671 | + for part in remaining.split(separator): |
| 1672 | + attr = getattr(attr, part) |
| 1673 | + return attr |
| 1674 | + |
| 1675 | + try: |
| 1676 | + rel = self._schema.get_relationship(name=first) |
| 1677 | + except ValueError as exc: |
| 1678 | + raise ValueError(f"No attribute or relationship named '{first}' for '{self._schema.kind}'") from exc |
| 1679 | + |
| 1680 | + if rel.cardinality != RelationshipCardinality.ONE: |
| 1681 | + raise ValueError( |
| 1682 | + f"Can only look up flat value for relationships of cardinality {RelationshipCardinality.ONE.value}" |
| 1683 | + ) |
| 1684 | + |
| 1685 | + related_node: RelatedNodeSync = getattr(self, first) |
| 1686 | + related_node.fetch() |
| 1687 | + return related_node.peer.get_flat_value(key=remaining, separator=separator) |
| 1688 | + |
| 1689 | + def extract(self, params: dict[str, str]) -> dict[str, Any]: |
| 1690 | + """Extract some datapoints defined in a flat notation.""" |
| 1691 | + result: dict[str, Any] = {} |
| 1692 | + for key, value in params.items(): |
| 1693 | + result[key] = self.get_flat_value(key=value) |
| 1694 | + |
| 1695 | + return result |
| 1696 | + |
1625 | 1697 | def __dir__(self) -> Iterable[str]: |
1626 | 1698 | base = list(super().__dir__()) |
1627 | 1699 | return sorted( |
|
0 commit comments