From 65785c57e5401bd046c6b3de0d536de821b6266a Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Thu, 1 Jan 2026 04:35:16 -0500 Subject: [PATCH] [FIX] script search_class_model: support lambda datetime now and clean code --- script/code_generator/search_class_model.py | 95 ++++++--------------- 1 file changed, 25 insertions(+), 70 deletions(-) diff --git a/script/code_generator/search_class_model.py b/script/code_generator/search_class_model.py index 6a5de4a..d20dfd6 100755 --- a/script/code_generator/search_class_model.py +++ b/script/code_generator/search_class_model.py @@ -173,7 +173,7 @@ def fill_search_field(ast_obj, var_name="", py_filename=""): elif ast_obj_type is ast.UnaryOp: if type(ast_obj.op) is ast.USub: # value is negative - result = ast_obj.operand.n * -1 + result = ast_obj.operand.value * -1 else: _logger.warning( f"Cannot support keyword of variable {var_name} type" @@ -186,7 +186,7 @@ def fill_search_field(ast_obj, var_name="", py_filename=""): # Support -> fields.Date.context_today parent_node = ast_obj lst_call_lambda = [] - if hasattr(parent_node, "id"): + if hasattr(parent_node, "id") or hasattr(parent_node, "attr"): while hasattr(parent_node, "value"): lst_call_lambda.insert(0, parent_node.attr) parent_node = parent_node.value @@ -200,16 +200,28 @@ def fill_search_field(ast_obj, var_name="", py_filename=""): " parent_node is type ast.Call." ) elif ast_obj_type is ast.List: - result = [fill_search_field(a, var_name) for a in ast_obj.elts] + result = [ + fill_search_field(a, var_name=var_name, py_filename=py_filename) + for a in ast_obj.elts + ] elif ast_obj_type is ast.Dict: result = { - fill_search_field(k, var_name): fill_search_field( - ast_obj.values[i], var_name + fill_search_field( + k, var_name=var_name, py_filename=py_filename + ): fill_search_field( + ast_obj.values[i], var_name=var_name, py_filename=py_filename ) for (i, k) in enumerate(ast_obj.keys) } elif ast_obj_type is ast.Tuple: - result = tuple([fill_search_field(a, var_name) for a in ast_obj.elts]) + result = tuple( + [ + fill_search_field( + a, var_name=var_name, py_filename=py_filename + ) + for a in ast_obj.elts + ] + ) else: _logger.warning( f"Cannot support keyword of variable {var_name} type" @@ -321,8 +333,10 @@ def main(): dct_fields[var_name] = d lst_args = [] for keyword in node.value.args: - value = _fill_search_field( - keyword, var_name + value = fill_search_field( + keyword, + var_name=var_name, + py_filename=str(py_file), ) # Waste to stock None value if value is not None: @@ -350,7 +364,9 @@ def main(): ) for keyword in node.value.keywords: value = fill_search_field( - keyword.value, var_name + keyword.value, + var_name=var_name, + py_filename=str(py_file), ) if value is not None: d[keyword.arg] = value @@ -411,67 +427,6 @@ def main(): return 0 -def extract_lambda(self, node): - result = ast.unparse(node) - if result[0] == "(" and result[-1] == ")": - result = result[1:-1] - return result - - -def _fill_search_field(ast_obj, var_name=""): - ast_obj_type = type(ast_obj) - result = None - if ast_obj_type is ast.Lambda: - result = extract_lambda(ast_obj) - elif ast_obj_type is ast.Constant: - result = ast_obj.value - elif ast_obj_type is ast.UnaryOp: - if type(ast_obj.op) is ast.USub: - # value is negative - result = ast_obj.operand.n * -1 - else: - _logger.warning( - f"Cannot support keyword of variable {var_name} type" - f" {ast_obj_type} operator {type(ast_obj.op)}." - ) - elif ast_obj_type is ast.Name: - result = ast_obj.id - elif ast_obj_type is ast.Attribute: - # Support -> fields.Date.context_today - parent_node = ast_obj - lst_call_lambda = [] - if hasattr(parent_node, "id"): - while hasattr(parent_node, "value"): - lst_call_lambda.insert(0, parent_node.attr) - parent_node = parent_node.value - lst_call_lambda.insert(0, parent_node.id) - result = ".".join(lst_call_lambda) - # else: - # # default=uuid.uuid4().hex - # _logger.warning( - # f"Cannot support keyword of variable {var_name} type" - # f" {ast_obj_type} in filename {self.py_filename}, because" - # " parent_node is type ast.Call." - # ) - elif ast_obj_type is ast.List: - result = [_fill_search_field(a, var_name) for a in ast_obj.elts] - elif ast_obj_type is ast.Dict: - result = { - _fill_search_field(k, var_name): _fill_search_field( - ast_obj.values[i], var_name - ) - for (i, k) in enumerate(ast_obj.keys) - } - elif ast_obj_type is ast.Tuple: - result = tuple([_fill_search_field(a, var_name) for a in ast_obj.elts]) - else: - _logger.warning( - f"Cannot support keyword of variable {var_name} type" - f" {ast_obj_type}." - ) - return result - - if __name__ == "__main__": status = main() sys.exit(status)