From bf656a1141ebf635ad3e073f176ca1cac964c05b Mon Sep 17 00:00:00 2001 From: Yifan Liu Date: Fri, 6 May 2022 08:48:32 +0800 Subject: [PATCH] misc: configurator: Bugfix: Incorrect DynamicEnum type Currently dynamicEnum hook returns all available options (enums) as a list of strings. However in some cases strings need to be converted to target types. One example is CPU affinity. The dynamicEnum should produce a list of all available pCPUIDs (a list of integers), instead of a list of strings. This patch adds a converter in get_enum to do the type conversion. Tracked-On: #7420 Signed-off-by: Yifan Liu --- misc/config_tools/configurator/pyodide/loadBoard.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/misc/config_tools/configurator/pyodide/loadBoard.py b/misc/config_tools/configurator/pyodide/loadBoard.py index 9f7fb1742..48bb02715 100644 --- a/misc/config_tools/configurator/pyodide/loadBoard.py +++ b/misc/config_tools/configurator/pyodide/loadBoard.py @@ -19,11 +19,15 @@ def get_dynamic_scenario(board): """ board_xml = etree.fromstring(board) - def get_enum(source, options): + def get_enum(source, options, obj_type): elements = [str(x) for x in elementpath.select(source, options) if x] elements = list(set(elements)) if not elements: elements = [''] + # TODO: Add more converters if needed + enum_type_convert = {'integer': int} + if obj_type in enum_type_convert.keys(): + elements = [enum_type_convert[obj_type](x) for x in elements] return elements def dynamic_enum(**enum_setting): @@ -33,10 +37,10 @@ def get_dynamic_scenario(board): for key in ['function', 'source'] ] # value from given - selector, sorted_func = [enum_setting[key] for key in ['selector', 'sorted']] + selector, sorted_func, obj_type = [enum_setting[key] for key in ['selector', 'sorted', 'type']] # get enum data - enum = function(source, selector) + enum = function(source, selector, obj_type) if sorted_func: enum = sorted(enum, key=eval(sorted_func)) return enum @@ -47,7 +51,7 @@ def get_dynamic_scenario(board): enum_setting = obj['enum'] # check enum obj type if enum_setting['type'] == 'dynamicEnum': - del enum_setting['type'] + enum_setting['type'] = obj.get('type', '') # replace json schema obj enum field data obj['enum'] = dynamic_enum(**enum_setting) return obj