|  | 
| 21 | 21 | 
 | 
| 22 | 22 | import httpx | 
| 23 | 23 | import ujson | 
| 24 |  | -from typing_extensions import NotRequired, Self | 
| 25 |  | -from typing_extensions import TypedDict as ExtensionTypedDict | 
|  | 24 | +from typing_extensions import Self | 
| 26 | 25 | 
 | 
| 27 | 26 | from infrahub_sdk.batch import InfrahubBatch | 
| 28 | 27 | from infrahub_sdk.branch import ( | 
|  | 
| 33 | 32 | from infrahub_sdk.config import Config | 
| 34 | 33 | from infrahub_sdk.constants import InfrahubClientMode | 
| 35 | 34 | from infrahub_sdk.data import RepositoryBranchInfo, RepositoryData | 
|  | 35 | +from infrahub_sdk.diff import NodeDiff, diff_tree_node_to_node_diff, get_diff_summary_query | 
| 36 | 36 | from infrahub_sdk.exceptions import ( | 
| 37 | 37 |     AuthenticationError, | 
| 38 | 38 |     Error, | 
|  | 
| 66 | 66 | SchemaTypeSync = TypeVar("SchemaTypeSync", bound=CoreNodeSync) | 
| 67 | 67 | 
 | 
| 68 | 68 | 
 | 
| 69 |  | -class NodeDiff(ExtensionTypedDict): | 
| 70 |  | -    branch: str | 
| 71 |  | -    kind: str | 
| 72 |  | -    id: str | 
| 73 |  | -    action: str | 
| 74 |  | -    display_label: str | 
| 75 |  | -    elements: list[NodeDiffElement] | 
| 76 |  | - | 
| 77 |  | - | 
| 78 |  | -class NodeDiffElement(ExtensionTypedDict): | 
| 79 |  | -    name: str | 
| 80 |  | -    element_type: str | 
| 81 |  | -    action: str | 
| 82 |  | -    summary: NodeDiffSummary | 
| 83 |  | -    peers: NotRequired[list[NodeDiffPeer]] | 
| 84 |  | - | 
| 85 |  | - | 
| 86 |  | -class NodeDiffSummary(ExtensionTypedDict): | 
| 87 |  | -    added: int | 
| 88 |  | -    updated: int | 
| 89 |  | -    removed: int | 
| 90 |  | - | 
| 91 |  | - | 
| 92 |  | -class NodeDiffPeer(ExtensionTypedDict): | 
| 93 |  | -    action: str | 
| 94 |  | -    summary: NodeDiffSummary | 
| 95 |  | - | 
| 96 |  | - | 
| 97 | 69 | class ProcessRelationsNode(TypedDict): | 
| 98 | 70 |     nodes: list[InfrahubNode] | 
| 99 | 71 |     related_nodes: list[InfrahubNode] | 
| @@ -1011,41 +983,26 @@ async def get_diff_summary( | 
| 1011 | 983 |         tracker: Optional[str] = None, | 
| 1012 | 984 |         raise_for_error: bool = True, | 
| 1013 | 985 |     ) -> list[NodeDiff]: | 
| 1014 |  | -        query = """ | 
| 1015 |  | -            query { | 
| 1016 |  | -                DiffSummary { | 
| 1017 |  | -                    branch | 
| 1018 |  | -                    id | 
| 1019 |  | -                    kind | 
| 1020 |  | -                    action | 
| 1021 |  | -                    display_label | 
| 1022 |  | -                    elements { | 
| 1023 |  | -                        element_type | 
| 1024 |  | -                        name | 
| 1025 |  | -                        action | 
| 1026 |  | -                        summary { | 
| 1027 |  | -                            added | 
| 1028 |  | -                            updated | 
| 1029 |  | -                            removed | 
| 1030 |  | -                        } | 
| 1031 |  | -                        ... on DiffSummaryElementRelationshipMany { | 
| 1032 |  | -                            peers { | 
| 1033 |  | -                                action | 
| 1034 |  | -                                summary { | 
| 1035 |  | -                                    added | 
| 1036 |  | -                                    updated | 
| 1037 |  | -                                    removed | 
| 1038 |  | -                                } | 
| 1039 |  | -                            } | 
| 1040 |  | -                        } | 
| 1041 |  | -                    } | 
| 1042 |  | -                } | 
| 1043 |  | -            } | 
| 1044 |  | -        """ | 
|  | 986 | +        query = get_diff_summary_query() | 
| 1045 | 987 |         response = await self.execute_graphql( | 
| 1046 |  | -            query=query, branch_name=branch, timeout=timeout, tracker=tracker, raise_for_error=raise_for_error | 
|  | 988 | +            query=query, | 
|  | 989 | +            branch_name=branch, | 
|  | 990 | +            timeout=timeout, | 
|  | 991 | +            tracker=tracker, | 
|  | 992 | +            raise_for_error=raise_for_error, | 
|  | 993 | +            variables={"branch_name": branch}, | 
| 1047 | 994 |         ) | 
| 1048 |  | -        return response["DiffSummary"] | 
|  | 995 | + | 
|  | 996 | +        node_diffs: list[NodeDiff] = [] | 
|  | 997 | +        diff_tree = response["DiffTree"] | 
|  | 998 | + | 
|  | 999 | +        if diff_tree is None or "nodes" not in diff_tree: | 
|  | 1000 | +            return [] | 
|  | 1001 | +        for node_dict in diff_tree["nodes"]: | 
|  | 1002 | +            node_diff = diff_tree_node_to_node_diff(node_dict=node_dict, branch_name=branch) | 
|  | 1003 | +            node_diffs.append(node_diff) | 
|  | 1004 | + | 
|  | 1005 | +        return node_diffs | 
| 1049 | 1006 | 
 | 
| 1050 | 1007 |     @overload | 
| 1051 | 1008 |     async def allocate_next_ip_address( | 
| @@ -2003,41 +1960,26 @@ def get_diff_summary( | 
| 2003 | 1960 |         tracker: Optional[str] = None, | 
| 2004 | 1961 |         raise_for_error: bool = True, | 
| 2005 | 1962 |     ) -> list[NodeDiff]: | 
| 2006 |  | -        query = """ | 
| 2007 |  | -            query { | 
| 2008 |  | -                DiffSummary { | 
| 2009 |  | -                    branch | 
| 2010 |  | -                    id | 
| 2011 |  | -                    kind | 
| 2012 |  | -                    action | 
| 2013 |  | -                    display_label | 
| 2014 |  | -                    elements { | 
| 2015 |  | -                        element_type | 
| 2016 |  | -                        name | 
| 2017 |  | -                        action | 
| 2018 |  | -                        summary { | 
| 2019 |  | -                            added | 
| 2020 |  | -                            updated | 
| 2021 |  | -                            removed | 
| 2022 |  | -                        } | 
| 2023 |  | -                        ... on DiffSummaryElementRelationshipMany { | 
| 2024 |  | -                            peers { | 
| 2025 |  | -                                action | 
| 2026 |  | -                                summary { | 
| 2027 |  | -                                    added | 
| 2028 |  | -                                    updated | 
| 2029 |  | -                                    removed | 
| 2030 |  | -                                } | 
| 2031 |  | -                            } | 
| 2032 |  | -                        } | 
| 2033 |  | -                    } | 
| 2034 |  | -                } | 
| 2035 |  | -            } | 
| 2036 |  | -        """ | 
|  | 1963 | +        query = get_diff_summary_query() | 
| 2037 | 1964 |         response = self.execute_graphql( | 
| 2038 |  | -            query=query, branch_name=branch, timeout=timeout, tracker=tracker, raise_for_error=raise_for_error | 
|  | 1965 | +            query=query, | 
|  | 1966 | +            branch_name=branch, | 
|  | 1967 | +            timeout=timeout, | 
|  | 1968 | +            tracker=tracker, | 
|  | 1969 | +            raise_for_error=raise_for_error, | 
|  | 1970 | +            variables={"branch_name": branch}, | 
| 2039 | 1971 |         ) | 
| 2040 |  | -        return response["DiffSummary"] | 
|  | 1972 | + | 
|  | 1973 | +        node_diffs: list[NodeDiff] = [] | 
|  | 1974 | +        diff_tree = response["DiffTree"] | 
|  | 1975 | + | 
|  | 1976 | +        if diff_tree is None or "nodes" not in diff_tree: | 
|  | 1977 | +            return [] | 
|  | 1978 | +        for node_dict in diff_tree["nodes"]: | 
|  | 1979 | +            node_diff = diff_tree_node_to_node_diff(node_dict=node_dict, branch_name=branch) | 
|  | 1980 | +            node_diffs.append(node_diff) | 
|  | 1981 | + | 
|  | 1982 | +        return node_diffs | 
| 2041 | 1983 | 
 | 
| 2042 | 1984 |     @overload | 
| 2043 | 1985 |     def allocate_next_ip_address( | 
|  | 
0 commit comments