diff --git a/lib/galaxy/config/sample/datatypes_conf.xml.sample b/lib/galaxy/config/sample/datatypes_conf.xml.sample index 54db53a19a98..e82c1ad39cf8 100644 --- a/lib/galaxy/config/sample/datatypes_conf.xml.sample +++ b/lib/galaxy/config/sample/datatypes_conf.xml.sample @@ -463,6 +463,7 @@ + @@ -1379,6 +1380,7 @@ + diff --git a/lib/galaxy/datatypes/text.py b/lib/galaxy/datatypes/text.py index 11f3a7fc2282..d3afea90616b 100644 --- a/lib/galaxy/datatypes/text.py +++ b/lib/galaxy/datatypes/text.py @@ -1532,3 +1532,55 @@ def sniff_prefix(self, file_prefix: FilePrefix) -> bool: False """ return file_prefix.startswith("RBT_PARAMETER_FILE_V1.00") + + +class ODV(Text): + file_ext = "odv" + + MetadataElement(name="meta_var_count", default=0, desc="Number of Meta Variables", readonly=True) + MetadataElement(name="var_count", default=0, desc="Number of Variables", readonly=True) + + def sniff_prefix(self, file_prefix: FilePrefix) -> bool: + """ + Determines whether the file is has some required details in General section + """ + header = file_prefix.contents_header.lower() + keywords = ["collectionformat", "odvcf"] + return all(keyword in header for keyword in keywords) + + def set_meta(self, dataset: DatasetProtocol, overwrite: bool = True, **kwd): + dataset.metadata.meta_var_count = 0 + dataset.metadata.var_count = 0 + + section = None + try: + with open(dataset.get_file_name(), encoding="utf-8") as f: + for line in f: + line = line.strip() + + if line.startswith("[") and line.endswith("]"): + section = line[1:-1].strip() + if section != "General": + # Stop after [General] section + break + continue + + if section != "General" or not line or "=" not in line: + continue + + key, value = map(str.strip, line.split("=", 1)) + if key == "NumberOfMetaVariables": + dataset.metadata.meta_var_count = int(value) + elif key == "NumberOfVariables": + dataset.metadata.var_count = int(value) + + except Exception: + log.exception("Error in set_meta") + + def set_peek(self, dataset: DatasetProtocol, **kwd) -> None: + if not dataset.dataset.purged: + dataset.peek = get_file_peek(dataset.get_file_name()) + dataset.blurb = f"ODV Collection Format: {dataset.metadata.meta_var_count} meta variables, {dataset.metadata.var_count} variables" + else: + dataset.peek = "file does not exist" + dataset.blurb = "file purged from disc"