From cf25f7dcec6f7f7b13aac93a18ced291d5e74444 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Mon, 3 Dec 2018 09:31:59 +0100 Subject: [PATCH 1/2] Fix nesting of repeats and error when repeat is provided literally. This fixex #7048, where in addition to repeat values ('repeat_0|param: some_value') there are also values for the repeat param itself ('repeat': []). --- lib/galaxy/tools/parameters/meta.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/galaxy/tools/parameters/meta.py b/lib/galaxy/tools/parameters/meta.py index d5fb5f53590..7440b1bf64c 100644 --- a/lib/galaxy/tools/parameters/meta.py +++ b/lib/galaxy/tools/parameters/meta.py @@ -72,26 +72,30 @@ def expand_workflow_inputs(inputs): return params, params_keys -def process_key(incoming_key, d): +def process_key(incoming_key, incoming_value, d): key_parts = incoming_key.split('|') if len(key_parts) == 1: # Regular parameter - d[incoming_key] = object() + d[incoming_key] = incoming_value elif key_parts[0].rsplit('_', 1)[-1].isdigit(): # Repeat input_name_index = key_parts[0].rsplit('_', 1) input_name, index = input_name_index + index = int(index) if input_name not in d: d[input_name] = [] - subdict = {} - d[input_name].append(subdict) - process_key("|".join(key_parts[1:]), d=subdict) + if len(d[input_name]) > index: + subdict = d[input_name][index] + else: + subdict = {} + d[input_name].append(subdict) + process_key("|".join(key_parts[1:]), incoming_value=incoming_value, d=subdict) else: # Section / Conditional input_name = key_parts[0] subdict = {} d[input_name] = subdict - process_key("|".join(key_parts[1:]), d=subdict) + process_key("|".join(key_parts[1:]), incoming_value=incoming_value, d=subdict) def expand_meta_parameters(trans, tool, incoming): @@ -113,9 +117,9 @@ def expand_meta_parameters(trans, tool, incoming): # according to tool.inputs (which is ordered). incoming_copy = incoming.copy() nested_dict = {} - for incoming_key in incoming_copy: + for incoming_key, incoming_value in incoming_copy.items(): if not incoming_key.startswith('__'): - process_key(incoming_key, d=nested_dict) + process_key(incoming_key, incoming_value=incoming_value, d=nested_dict) reordered_incoming = OrderedDict() From 3a93fd4f2321bf141b2ccf34ea80c42ee517b33d Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Mon, 3 Dec 2018 09:31:36 +0100 Subject: [PATCH 2/2] Add test for proper nesting in process_keys and a unit test for https://github.com/galaxyproject/galaxy/issues/7048 --- test/unit/tools/test_parameter_parsing.py | 24 +++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/unit/tools/test_parameter_parsing.py b/test/unit/tools/test_parameter_parsing.py index 79b3ac35afd..047222a26be 100644 --- a/test/unit/tools/test_parameter_parsing.py +++ b/test/unit/tools/test_parameter_parsing.py @@ -3,10 +3,34 @@ from xml.etree.ElementTree import XML from galaxy import model from galaxy.tools.parameters import basic +from galaxy.tools.parameters.meta import process_key from galaxy.util import bunch from ..tools_support import UsesApp +def test_process_key(): + nested_dict = {} + d = { + 'repeat_0|inner_repeat_0|data_table_column_value': u'bla', + 'repeat_1|inner_repeat_1|data_table_column_value': u'bla2', + } + for key, value in d.items(): + process_key(key, value, nested_dict) + assert len(nested_dict) == 1 + + +def test_process_key_2(): + nested_dict = {} + d = { + 'data_tables_0|columns_0|data_table_column_value': 'Amel_HAv3.1', + 'data_tables': [], + 'directory_content': [], + } + for key, value in d.items(): + process_key(key, value, nested_dict) + assert len(nested_dict) == 2 + + class BaseParameterTestCase(TestCase, UsesApp): def setUp(self):