From 1cb1ac3dfd4649a45071c10882fd7f2fcb6e8597 Mon Sep 17 00:00:00 2001 From: Matthias Bernt Date: Mon, 19 Sep 2022 10:24:49 +0200 Subject: [PATCH] adapt linter to check also for options_filter_attribute --- lib/galaxy/tool_util/linters/inputs.py | 26 +++++++++++++++++------ test/unit/tool_util/test_tool_linters.py | 27 ++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 8 deletions(-) diff --git a/lib/galaxy/tool_util/linters/inputs.py b/lib/galaxy/tool_util/linters/inputs.py index 3fcf9b5068f..16455b51a32 100644 --- a/lib/galaxy/tool_util/linters/inputs.py +++ b/lib/galaxy/tool_util/linters/inputs.py @@ -168,21 +168,35 @@ def lint_inputs(tool_xml, lint_ctx): f"Param input [{param_name}] with no format specified - 'data' format will be assumed.", node=param ) options = param.findall("./options") + has_options_filter_attribute = False if len(options) == 1: - if len(options[0].attrib) > 0: - lint_ctx.error( - f"Data parameter [{param_name}] uses invalid attributes: {options[0].attrib}", node=param - ) + for oa in options[0].attrib: + if oa == "options_filter_attribute": + has_options_filter_attribute = True + else: + lint_ctx.error(f"Data parameter [{param_name}] uses invalid attribute: {oa}", node=param) elif len(options) > 1: lint_ctx.error(f"Data parameter [{param_name}] contains multiple options elements.", node=options[1]) # for data params only filters with key='build' of type='data_meta' are allowed filters = param.findall("./options/filter") for f in filters: - if f.get("key") != "dbkey" or f.get("type") != "data_meta": + if not f.get("ref"): lint_ctx.error( - f'Data parameter [{param_name}] for filters only type="data_meta" and key="dbkey" are allowed, found type="{f.get("type")}" and key="{f.get("key")}"', + f"Data parameter [{param_name}] filter needs to define a ref attribute", node=f, ) + if has_options_filter_attribute: + if f.get("type") != "data_meta": + lint_ctx.error( + f'Data parameter [{param_name}] for filters only type="data_meta" is allowed, found type="{f.get("type")}"', + node=f, + ) + else: + if f.get("key") != "dbkey" or f.get("type") != "data_meta": + lint_ctx.error( + f'Data parameter [{param_name}] for filters only type="data_meta" and key="dbkey" are allowed, found type="{f.get("type")}" and key="{f.get("key")}"', + node=f, + ) elif param_type == "select": # get dynamic/statically defined options diff --git a/test/unit/tool_util/test_tool_linters.py b/test/unit/tool_util/test_tool_linters.py index 2d28f3b8531..533dcd31e36 100644 --- a/test/unit/tool_util/test_tool_linters.py +++ b/test/unit/tool_util/test_tool_linters.py @@ -195,7 +195,19 @@ INPUTS_DATA_PARAM_OPTIONS = """ - + + + + + +""" + +INPUTS_DATA_PARAM_OPTIONS_FILTER_ATTRIBUTE = """ + + + + + @@ -1047,6 +1059,16 @@ def test_inputs_data_param_options(lint_ctx): assert not lint_ctx.error_messages +def test_inputs_data_param_options_filter_attribute(lint_ctx): + tool_source = get_xml_tool_source(INPUTS_DATA_PARAM_OPTIONS_FILTER_ATTRIBUTE) + run_lint(lint_ctx, inputs.lint_inputs, tool_source) + assert not lint_ctx.valid_messages + assert "Found 1 input parameters." in lint_ctx.info_messages + assert len(lint_ctx.info_messages) == 1 + assert not lint_ctx.warn_messages + assert not lint_ctx.error_messages + + def test_inputs_data_param_invalidoptions(lint_ctx): tool_source = get_xml_tool_source(INPUTS_DATA_PARAM_INVALIDOPTIONS) run_lint(lint_ctx, inputs.lint_inputs, tool_source) @@ -1055,11 +1077,12 @@ def test_inputs_data_param_invalidoptions(lint_ctx): assert len(lint_ctx.info_messages) == 1 assert not lint_ctx.warn_messages assert "Data parameter [valid_name] contains multiple options elements." in lint_ctx.error_messages + assert "Data parameter [valid_name] filter needs to define a ref attribute" in lint_ctx.error_messages assert ( 'Data parameter [valid_name] for filters only type="data_meta" and key="dbkey" are allowed, found type="expression" and key="None"' in lint_ctx.error_messages ) - assert len(lint_ctx.error_messages) == 2 + assert len(lint_ctx.error_messages) == 3 def test_inputs_conditional(lint_ctx):