From 02549482eb0584b7353050edfce68ebb6dbfc237 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Mon, 5 May 2025 18:00:00 +0200 Subject: [PATCH 1/5] Improve tool output parsing defaults --- lib/galaxy/tool_util/parser/output_objects.py | 17 +++++++++-------- lib/galaxy/tool_util_models/tool_outputs.py | 1 + 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/lib/galaxy/tool_util/parser/output_objects.py b/lib/galaxy/tool_util/parser/output_objects.py index 86a627d15de..fd52a7695c2 100644 --- a/lib/galaxy/tool_util/parser/output_objects.py +++ b/lib/galaxy/tool_util/parser/output_objects.py @@ -177,22 +177,23 @@ class ToolOutput(ToolOutputBase): format_source=self.format_source, metadata_source=self.metadata_source or None, # model is decorated as Optional discover_datasets=[d.to_model() for d in self.dataset_collector_descriptions], + from_work_dir=self.from_work_dir, ) @staticmethod def from_dict(name: str, output_dict: Dict[str, Any], app: Optional[ToolOutputActionApp] = None) -> "ToolOutput": output = ToolOutput(name) - output.format = output_dict.get("format", "data") + output.format = output_dict.get("format") or "data" output.change_format = [] - output.format_source = output_dict.get("format_source", None) - output.default_identifier_source = output_dict.get("default_identifier_source", None) - output.metadata_source = output_dict.get("metadata_source", "") - output.parent = output_dict.get("parent", None) - output.label = output_dict.get("label", None) + output.format_source = output_dict.get("format_source") + output.default_identifier_source = output_dict.get("default_identifier_source") + output.metadata_source = output_dict.get("metadata_source") or "" + output.parent = output_dict.get("parent") + output.label = output_dict.get("label") output.count = output_dict.get("count", 1) output.filters = [] - output.from_work_dir = output_dict.get("from_work_dir", None) - output.hidden = output_dict.get("hidden", False) + output.from_work_dir = output_dict.get("from_work_dir") + output.hidden = output_dict.get("hidden") or False # TODO: implement tool output action group fixes if app is not None: output.actions = ToolOutputActionGroup(app, None) diff --git a/lib/galaxy/tool_util_models/tool_outputs.py b/lib/galaxy/tool_util_models/tool_outputs.py index 322f338aa06..0c686fdfaa3 100644 --- a/lib/galaxy/tool_util_models/tool_outputs.py +++ b/lib/galaxy/tool_util_models/tool_outputs.py @@ -33,6 +33,7 @@ class ToolOutputDataset(ToolOutputBaseModel): format_source: Optional[str] metadata_source: Optional[str] discover_datasets: Optional[List["DatasetCollectionDescriptionT"]] + from_work_dir: Optional[str] = None class ToolOutputCollectionStructure(BaseModel): From 83127ea44cc8c2af9622a9d8158ba6c5486c457d Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Mon, 5 May 2025 18:02:41 +0200 Subject: [PATCH 2/5] Use `None` instead of empty string as (default) metadata_source --- lib/galaxy/tool_util/parser/cwl.py | 2 +- lib/galaxy/tool_util/parser/output_objects.py | 4 ++-- lib/galaxy/tool_util/parser/xml.py | 4 ++-- lib/galaxy/tool_util/parser/yaml.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/galaxy/tool_util/parser/cwl.py b/lib/galaxy/tool_util/parser/cwl.py index 77066125dee..00ce4738eab 100644 --- a/lib/galaxy/tool_util/parser/cwl.py +++ b/lib/galaxy/tool_util/parser/cwl.py @@ -159,7 +159,7 @@ class CwlToolSource(ToolSource): output.format = "expression.json" output.change_format = [] output.format_source = None - output.metadata_source = "" + output.metadata_source = None output.parent = None output.label = None output.count = None diff --git a/lib/galaxy/tool_util/parser/output_objects.py b/lib/galaxy/tool_util/parser/output_objects.py index fd52a7695c2..090b38ac63b 100644 --- a/lib/galaxy/tool_util/parser/output_objects.py +++ b/lib/galaxy/tool_util/parser/output_objects.py @@ -175,7 +175,7 @@ class ToolOutput(ToolOutputBase): hidden=self.hidden, format=self.format, format_source=self.format_source, - metadata_source=self.metadata_source or None, # model is decorated as Optional + metadata_source=self.metadata_source, discover_datasets=[d.to_model() for d in self.dataset_collector_descriptions], from_work_dir=self.from_work_dir, ) @@ -187,7 +187,7 @@ class ToolOutput(ToolOutputBase): output.change_format = [] output.format_source = output_dict.get("format_source") output.default_identifier_source = output_dict.get("default_identifier_source") - output.metadata_source = output_dict.get("metadata_source") or "" + output.metadata_source = output_dict.get("metadata_source") output.parent = output_dict.get("parent") output.label = output_dict.get("label") output.count = output_dict.get("count", 1) diff --git a/lib/galaxy/tool_util/parser/xml.py b/lib/galaxy/tool_util/parser/xml.py index bbff153fd55..f0a8fdcb30e 100644 --- a/lib/galaxy/tool_util/parser/xml.py +++ b/lib/galaxy/tool_util/parser/xml.py @@ -489,7 +489,7 @@ class XmlToolSource(ToolSource): inherit_format = string_as_bool(collection_elem.get("inherit_format", None)) inherit_metadata = string_as_bool(collection_elem.get("inherit_metadata", None)) default_format_source = collection_elem.get("format_source", None) - default_metadata_source = collection_elem.get("metadata_source", "") + default_metadata_source = collection_elem.get("metadata_source", None) filters = collection_elem.findall("filter") dataset_collector_descriptions = None @@ -560,7 +560,7 @@ class XmlToolSource(ToolSource): app: Optional[ToolOutputActionApp] = None, default_format="data", default_format_source=None, - default_metadata_source="", + default_metadata_source=None, expression_type=None, ): from_expression = data_elem.get("from") diff --git a/lib/galaxy/tool_util/parser/yaml.py b/lib/galaxy/tool_util/parser/yaml.py index 4a553785c9b..c7f7eea3e08 100644 --- a/lib/galaxy/tool_util/parser/yaml.py +++ b/lib/galaxy/tool_util/parser/yaml.py @@ -180,7 +180,7 @@ class YamlToolSource(ToolSource): inherit_format = output_dict.get("inherit_format", None) inherit_metadata = output_dict.get("inherit_metadata", None) default_format_source = output_dict.get("format_source", None) - default_metadata_source = output_dict.get("metadata_source", "") + default_metadata_source = output_dict.get("metadata_source", None) filters = [] dataset_collector_descriptions = dataset_collector_descriptions_from_output_dict(output_dict) From 993b569e4aca3843360b6d207e1491f293f77496 Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Mon, 5 May 2025 18:04:42 +0200 Subject: [PATCH 3/5] Fix dataset_collector_descriptions_from_output_dict --- lib/galaxy/tool_util/parser/output_collection_def.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/galaxy/tool_util/parser/output_collection_def.py b/lib/galaxy/tool_util/parser/output_collection_def.py index b588957d651..f5c279dd372 100644 --- a/lib/galaxy/tool_util/parser/output_collection_def.py +++ b/lib/galaxy/tool_util/parser/output_collection_def.py @@ -58,7 +58,7 @@ def dataset_collector_descriptions_from_elem(elem, legacy=True): def dataset_collector_descriptions_from_output_dict(as_dict): - discover_datasets_dicts = as_dict.get("discover_datasets", []) + discover_datasets_dicts = as_dict.get("discover_datasets") or [] if is_dict(discover_datasets_dicts): discover_datasets_dicts = [discover_datasets_dicts] dataset_collector_descriptions = dataset_collector_descriptions_from_list(discover_datasets_dicts) From bd05b3d0e149752b61aa3f043a470ea996f9f59e Mon Sep 17 00:00:00 2001 From: mvdbeek Date: Mon, 5 May 2025 18:12:27 +0200 Subject: [PATCH 4/5] Settle on type instead of reftyp inside xref We could also make it an alias, but it seems muich simpler to not refer to the same attribute with different names. So far this has used internally only. --- client/src/components/Tool/ToolFooter.vue | 6 +++--- lib/galaxy/tool_util/linters/general.py | 2 +- lib/galaxy/tool_util/ontologies/ontology_data.py | 6 +++--- lib/galaxy/tool_util/parser/xml.py | 2 +- lib/galaxy/tool_util/parser/yaml.py | 2 +- lib/galaxy/tool_util_models/tool_source.py | 2 +- lib/galaxy_test/api/test_tools.py | 2 +- .../frontend/src/components/pages/ToolVersionPage.vue | 6 +++--- test/unit/tool_util/test_ontologies.py | 2 +- test/unit/tool_util/test_parsing.py | 4 ++-- 10 files changed, 17 insertions(+), 17 deletions(-) diff --git a/client/src/components/Tool/ToolFooter.vue b/client/src/components/Tool/ToolFooter.vue index 6766a8ffa0f..d7775129712 100644 --- a/client/src/components/Tool/ToolFooter.vue +++ b/client/src/components/Tool/ToolFooter.vue @@ -40,7 +40,7 @@ References
- -