From d3e7a49f9289f763c7bc0e31d79fa171b36f480d Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Sat, 15 Nov 2025 10:32:11 -0500 Subject: [PATCH] Simplify by recursion Use _handle_ast_node to process everything before the function name in an Attribute call --- .../confluent/config/configmanager.py | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/confluent_server/confluent/config/configmanager.py b/confluent_server/confluent/config/configmanager.py index a5132e93..1810641a 100644 --- a/confluent_server/confluent/config/configmanager.py +++ b/confluent_server/confluent/config/configmanager.py @@ -1208,30 +1208,18 @@ class _ExpressionFormat(string.Formatter): return node.value elif isinstance(node, ast.Call): key = '' + baseval = '' if isinstance(node.func, ast.Attribute): fun_name = node.func.attr - left = node.func.value - while isinstance(left, ast.Attribute): - # Loop through, to handle multi dot expressions - # such as 'net.pxe.hwaddr' - key = '.' + left.attr + key - left = left.value - if isinstance(left, ast.Name): - key = left.id + key - else: - raise ValueError("Invalid AST structure: expected ast.Name at end of attribute chain") + baseval = self._handle_ast_node(node.func.value) else: - raise ValueError(f"Unsupported function in expression") + raise ValueError("Invalid function call syntax in expression") if fun_name == 'replace': if len(node.args) != 2: raise ValueError("Invalid number of arguments to replace") arg1 = self._handle_ast_node(node.args[0]) arg2 = self._handle_ast_node(node.args[1]) - if key in ('node', 'nodename'): - keyval = self._nodename - else: - keyval = self._expand_attribute(key).get('value', '') - return keyval.replace(arg1, arg2) + return baseval.replace(arg1, arg2) else: raise ValueError("Unsupported function in expression") else: