From 77714dac26b6cd4946e5e3a212d894ace03280b5 Mon Sep 17 00:00:00 2001 From: Peter van Heusden Date: Fri, 10 Apr 2026 14:28:39 +0200 Subject: [PATCH 1/8] Add kraken2 datatype --- .../config/sample/datatypes_conf.xml.sample | 7 ++++ lib/galaxy/datatypes/binary.py | 34 ++++++++++++++++++ lib/galaxy/datatypes/data.py | 13 +++++++ lib/galaxy/datatypes/test/1.kraken2db.tar.gz | Bin 0 -> 1438 bytes 4 files changed, 54 insertions(+) create mode 100644 lib/galaxy/datatypes/test/1.kraken2db.tar.gz diff --git a/lib/galaxy/config/sample/datatypes_conf.xml.sample b/lib/galaxy/config/sample/datatypes_conf.xml.sample index 936c1357b66c..4591ee03e0de 100644 --- a/lib/galaxy/config/sample/datatypes_conf.xml.sample +++ b/lib/galaxy/config/sample/datatypes_conf.xml.sample @@ -359,6 +359,12 @@ + + + + + + @@ -1526,5 +1532,6 @@ + diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index 7a4f86f295ca..aa5de0e0c74d 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -341,6 +341,40 @@ def sniff(self, filename: str) -> bool: return False +class Kraken2DatabaseArchive(CompressedArchive): + """Kraken2 database is a tar.gz archive with a specific structure described at: + https://github.com/DerrickWood/kraken2/blob/master/docs/MANUAL.markdown#kraken-2-databases + """ + + file_ext = "kraken2db.tar.gz" + + def set_peek(self, dataset: DatasetProtocol, **kwd) -> None: + if not dataset.dataset.purged: + dataset.peek = "Compressed Kraken2 database" + dataset.blurb = f"{nice_size(dataset.get_size())}" + else: + dataset.peek = "file does not exist" + dataset.blurb = "file purged from disk" + + def sniff(self, filename: str) -> bool: + """ + Check data structure: + Contains hash.k2d file + Contains opts.k2d file + Contains taxo.k2d file + Contains seqid2taxid.k2d file + """ + try: + if filename and tarfile.is_tarfile(filename): + with tarfile.open(filename, "r") as temptar: + _tar_content = temptar.getnames() + if "hash.k2d" in _tar_content and "opts.k2d" in _tar_content and "taxo.k2d" in _tar_content and "seqid2taxid.k2d" in _tar_content: + return True + except Exception as e: + log.warning("%s, sniff Exception: %s", self, e) + return False + + class Bref3(Binary): """Bref3 format is a binary format for storing phased, non-missing genotypes for a list of samples.""" diff --git a/lib/galaxy/datatypes/data.py b/lib/galaxy/datatypes/data.py index 63cb7c5f8e7f..214e79193f50 100644 --- a/lib/galaxy/datatypes/data.py +++ b/lib/galaxy/datatypes/data.py @@ -1370,6 +1370,19 @@ def _get_format_version(self, store_root_path: str) -> Optional[str]: return None +class Kraken2DatabaseDirectory(Directory): + """Class representing a Kraken2 database""" + + file_ext = "kraken2db" + + def set_peek(self, dataset: DatasetProtocol, **kwd) -> None: + if not dataset.dataset.purged: + dataset.blurb = "Kraken2 database" + else: + dataset.peek = "file does not exist" + dataset.blurb = "file purged from disk" + + class GenericAsn1(Text): """Class for generic ASN.1 text format""" diff --git a/lib/galaxy/datatypes/test/1.kraken2db.tar.gz b/lib/galaxy/datatypes/test/1.kraken2db.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..f2e7d8ea4e181526687316300d9536f65406f6a0 GIT binary patch literal 1438 zcmb2|=3oE==C_y6W(fz1Fg&>3<^SN4D|3@Q_vyJNGv8ckvfeIwj)%49rB20{Uv_2sT)MIL^`sfcB%%sudh3Qf)zOYxYhWuA8&!Vwx9-=Er{~^3 zm+c$#^Z#myyGF^;5Eu=CAsqrA_&>c|6LUX1U%%LG&CrsmJ$Z+~9i{@rh9Tlc^8 z>AmL%U-N%G+&wv8{o~2+(ovIDXQsaYH2dHG%lF#;|8Luqm7lw>a_7#ix8}Sz`}pwG z*DvvZPygMl_Rn(JiO-P|Z_-mG*?wy1rzNUeOT3qFox8{4#G!WuK~ocLZfb6-ycju4 z{Ptm`H@)h+Z~t_h@no&i>^H4H-LDTK&RbvmxjyV` l;>9(7v&%lSwMQDto!j)OY9Bu$hPR*gU-5p?9EJ*h1^{W`_s;+T literal 0 HcmV?d00001 From 7138ae779ac0d48f50ebdab687e00ec008e2d52c Mon Sep 17 00:00:00 2001 From: Peter van Heusden Date: Fri, 10 Apr 2026 15:27:59 +0200 Subject: [PATCH 2/8] Reformat binary.py --- lib/galaxy/datatypes/binary.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index aa5de0e0c74d..016303ef88af 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -368,7 +368,12 @@ def sniff(self, filename: str) -> bool: if filename and tarfile.is_tarfile(filename): with tarfile.open(filename, "r") as temptar: _tar_content = temptar.getnames() - if "hash.k2d" in _tar_content and "opts.k2d" in _tar_content and "taxo.k2d" in _tar_content and "seqid2taxid.k2d" in _tar_content: + if ( + "hash.k2d" in _tar_content + and "opts.k2d" in _tar_content + and "taxo.k2d" in _tar_content + and "seqid2taxid.k2d" in _tar_content + ): return True except Exception as e: log.warning("%s, sniff Exception: %s", self, e) From 41db163031f7fc8553598e96a2d7f23d84133d79 Mon Sep 17 00:00:00 2001 From: "pvanheusden@uwc.ac.za" Date: Mon, 20 Apr 2026 20:17:14 +0200 Subject: [PATCH 3/8] Add tests for kraken2 db compressed archive --- test/unit/data/datatypes/test_kraken2.py | 31 ++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 test/unit/data/datatypes/test_kraken2.py diff --git a/test/unit/data/datatypes/test_kraken2.py b/test/unit/data/datatypes/test_kraken2.py new file mode 100644 index 000000000000..09eb701c7345 --- /dev/null +++ b/test/unit/data/datatypes/test_kraken2.py @@ -0,0 +1,31 @@ +import pytest + +from galaxy.datatypes.binary import Kraken2DatabaseArchive +from .util import ( + get_input_files, + MockDataset, + MockDatasetDataset, +) + +@pytest.mark.parametrize( + "kraken2db_loader, input_file", + [Kraken2DatabaseArchive, "1.kraken2db.tar.gz"] +) +def test_kraken2dbarchive_sniff(kraken2db_loader, input_file): + loader = kraken2db_loader() + with get_input_files(input_file) as input_files: + assert loader.sniff(input_files[0]) is True + + +@pytest.mark.parametrize( + "kraken2db_loader, input_file", + [Kraken2DatabaseArchive, "1.kraken2db.tar.gz"] +) +def test_kraken2dbarchive_set_peek(kraken2db_loader, input_file): + loader = kraken2db_loader() + with get_input_files(input_file) as input_files: + dataset = MockDataset(1) + dataset.set_file_name(input_files[0]) + dataset.dataset = MockDatasetDataset(dataset.get_file_name()) + loader.set_peek(dataset) + assert dataset.peek == loader.peek_text From 10c2d9d970a028890950a55d83f7ee071fc9c7cf Mon Sep 17 00:00:00 2001 From: "pvanheusden@uwc.ac.za" Date: Mon, 20 Apr 2026 20:29:44 +0200 Subject: [PATCH 4/8] Make Kraken2Database a subclass of Directory --- lib/galaxy/config/sample/datatypes_conf.xml.sample | 6 ++---- lib/galaxy/datatypes/binary.py | 3 ++- lib/galaxy/datatypes/data.py | 13 ------------- 3 files changed, 4 insertions(+), 18 deletions(-) diff --git a/lib/galaxy/config/sample/datatypes_conf.xml.sample b/lib/galaxy/config/sample/datatypes_conf.xml.sample index 4591ee03e0de..169cf54f4b23 100644 --- a/lib/galaxy/config/sample/datatypes_conf.xml.sample +++ b/lib/galaxy/config/sample/datatypes_conf.xml.sample @@ -359,12 +359,10 @@ - + - - - + diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index 016303ef88af..a8fba8e9e8ec 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -347,10 +347,11 @@ class Kraken2DatabaseArchive(CompressedArchive): """ file_ext = "kraken2db.tar.gz" + peek_text = "Compressed Kraken2 database" def set_peek(self, dataset: DatasetProtocol, **kwd) -> None: if not dataset.dataset.purged: - dataset.peek = "Compressed Kraken2 database" + dataset.peek = self.peek_text dataset.blurb = f"{nice_size(dataset.get_size())}" else: dataset.peek = "file does not exist" diff --git a/lib/galaxy/datatypes/data.py b/lib/galaxy/datatypes/data.py index 214e79193f50..63cb7c5f8e7f 100644 --- a/lib/galaxy/datatypes/data.py +++ b/lib/galaxy/datatypes/data.py @@ -1370,19 +1370,6 @@ def _get_format_version(self, store_root_path: str) -> Optional[str]: return None -class Kraken2DatabaseDirectory(Directory): - """Class representing a Kraken2 database""" - - file_ext = "kraken2db" - - def set_peek(self, dataset: DatasetProtocol, **kwd) -> None: - if not dataset.dataset.purged: - dataset.blurb = "Kraken2 database" - else: - dataset.peek = "file does not exist" - dataset.blurb = "file purged from disk" - - class GenericAsn1(Text): """Class for generic ASN.1 text format""" From f7c49318c257415310af92927f62fb497448410a Mon Sep 17 00:00:00 2001 From: "pvanheusden@uwc.ac.za" Date: Mon, 20 Apr 2026 20:36:52 +0200 Subject: [PATCH 5/8] Fix Python linting issues --- test/unit/data/datatypes/test_kraken2.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/unit/data/datatypes/test_kraken2.py b/test/unit/data/datatypes/test_kraken2.py index 09eb701c7345..b032a44531e7 100644 --- a/test/unit/data/datatypes/test_kraken2.py +++ b/test/unit/data/datatypes/test_kraken2.py @@ -7,9 +7,10 @@ MockDatasetDataset, ) + @pytest.mark.parametrize( - "kraken2db_loader, input_file", - [Kraken2DatabaseArchive, "1.kraken2db.tar.gz"] + "kraken2db_loader, input_file", + [Kraken2DatabaseArchive, "1.kraken2db.tar.gz"] ) def test_kraken2dbarchive_sniff(kraken2db_loader, input_file): loader = kraken2db_loader() @@ -18,8 +19,8 @@ def test_kraken2dbarchive_sniff(kraken2db_loader, input_file): @pytest.mark.parametrize( - "kraken2db_loader, input_file", - [Kraken2DatabaseArchive, "1.kraken2db.tar.gz"] + "kraken2db_loader, input_file", + [Kraken2DatabaseArchive, "1.kraken2db.tar.gz"] ) def test_kraken2dbarchive_set_peek(kraken2db_loader, input_file): loader = kraken2db_loader() From d87af7607fe8779f46ae03f4d3172908a4dbf446 Mon Sep 17 00:00:00 2001 From: "pvanheusden@uwc.ac.za" Date: Tue, 21 Apr 2026 13:31:37 +0200 Subject: [PATCH 6/8] Remove kraken2 datatype test --- test/unit/data/datatypes/test_kraken2.py | 32 ------------------------ 1 file changed, 32 deletions(-) delete mode 100644 test/unit/data/datatypes/test_kraken2.py diff --git a/test/unit/data/datatypes/test_kraken2.py b/test/unit/data/datatypes/test_kraken2.py deleted file mode 100644 index b032a44531e7..000000000000 --- a/test/unit/data/datatypes/test_kraken2.py +++ /dev/null @@ -1,32 +0,0 @@ -import pytest - -from galaxy.datatypes.binary import Kraken2DatabaseArchive -from .util import ( - get_input_files, - MockDataset, - MockDatasetDataset, -) - - -@pytest.mark.parametrize( - "kraken2db_loader, input_file", - [Kraken2DatabaseArchive, "1.kraken2db.tar.gz"] -) -def test_kraken2dbarchive_sniff(kraken2db_loader, input_file): - loader = kraken2db_loader() - with get_input_files(input_file) as input_files: - assert loader.sniff(input_files[0]) is True - - -@pytest.mark.parametrize( - "kraken2db_loader, input_file", - [Kraken2DatabaseArchive, "1.kraken2db.tar.gz"] -) -def test_kraken2dbarchive_set_peek(kraken2db_loader, input_file): - loader = kraken2db_loader() - with get_input_files(input_file) as input_files: - dataset = MockDataset(1) - dataset.set_file_name(input_files[0]) - dataset.dataset = MockDatasetDataset(dataset.get_file_name()) - loader.set_peek(dataset) - assert dataset.peek == loader.peek_text From 2b6b9d170eb59055115dbc078748cbb3413a1b0b Mon Sep 17 00:00:00 2001 From: Peter van Heusden Date: Wed, 24 Jun 2026 16:06:33 +0200 Subject: [PATCH 7/8] Implement kraken2db and kraken2db.tar.gz datatypes simply using datatypes_conf.xml --- .../config/sample/datatypes_conf.xml.sample | 7 ++-- lib/galaxy/datatypes/binary.py | 39 ------------------- lib/galaxy/datatypes/data.py | 13 ------- 3 files changed, 3 insertions(+), 56 deletions(-) diff --git a/lib/galaxy/config/sample/datatypes_conf.xml.sample b/lib/galaxy/config/sample/datatypes_conf.xml.sample index 4591ee03e0de..68cf1938f1c2 100644 --- a/lib/galaxy/config/sample/datatypes_conf.xml.sample +++ b/lib/galaxy/config/sample/datatypes_conf.xml.sample @@ -359,11 +359,11 @@ - + - - + + @@ -1532,6 +1532,5 @@ - diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index 016303ef88af..7a4f86f295ca 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -341,45 +341,6 @@ def sniff(self, filename: str) -> bool: return False -class Kraken2DatabaseArchive(CompressedArchive): - """Kraken2 database is a tar.gz archive with a specific structure described at: - https://github.com/DerrickWood/kraken2/blob/master/docs/MANUAL.markdown#kraken-2-databases - """ - - file_ext = "kraken2db.tar.gz" - - def set_peek(self, dataset: DatasetProtocol, **kwd) -> None: - if not dataset.dataset.purged: - dataset.peek = "Compressed Kraken2 database" - dataset.blurb = f"{nice_size(dataset.get_size())}" - else: - dataset.peek = "file does not exist" - dataset.blurb = "file purged from disk" - - def sniff(self, filename: str) -> bool: - """ - Check data structure: - Contains hash.k2d file - Contains opts.k2d file - Contains taxo.k2d file - Contains seqid2taxid.k2d file - """ - try: - if filename and tarfile.is_tarfile(filename): - with tarfile.open(filename, "r") as temptar: - _tar_content = temptar.getnames() - if ( - "hash.k2d" in _tar_content - and "opts.k2d" in _tar_content - and "taxo.k2d" in _tar_content - and "seqid2taxid.k2d" in _tar_content - ): - return True - except Exception as e: - log.warning("%s, sniff Exception: %s", self, e) - return False - - class Bref3(Binary): """Bref3 format is a binary format for storing phased, non-missing genotypes for a list of samples.""" diff --git a/lib/galaxy/datatypes/data.py b/lib/galaxy/datatypes/data.py index 214e79193f50..63cb7c5f8e7f 100644 --- a/lib/galaxy/datatypes/data.py +++ b/lib/galaxy/datatypes/data.py @@ -1370,19 +1370,6 @@ def _get_format_version(self, store_root_path: str) -> Optional[str]: return None -class Kraken2DatabaseDirectory(Directory): - """Class representing a Kraken2 database""" - - file_ext = "kraken2db" - - def set_peek(self, dataset: DatasetProtocol, **kwd) -> None: - if not dataset.dataset.purged: - dataset.blurb = "Kraken2 database" - else: - dataset.peek = "file does not exist" - dataset.blurb = "file purged from disk" - - class GenericAsn1(Text): """Class for generic ASN.1 text format""" From 4c79b752d7854d587a08fb9e49e7712639ccd1ad Mon Sep 17 00:00:00 2001 From: Peter van Heusden Date: Fri, 26 Jun 2026 14:27:00 +0200 Subject: [PATCH 8/8] Remove test file 1.kraken2db.tar.gz --- lib/galaxy/datatypes/test/1.kraken2db.tar.gz | Bin 1438 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 lib/galaxy/datatypes/test/1.kraken2db.tar.gz diff --git a/lib/galaxy/datatypes/test/1.kraken2db.tar.gz b/lib/galaxy/datatypes/test/1.kraken2db.tar.gz deleted file mode 100644 index f2e7d8ea4e181526687316300d9536f65406f6a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1438 zcmb2|=3oE==C_y6W(fz1Fg&>3<^SN4D|3@Q_vyJNGv8ckvfeIwj)%49rB20{Uv_2sT)MIL^`sfcB%%sudh3Qf)zOYxYhWuA8&!Vwx9-=Er{~^3 zm+c$#^Z#myyGF^;5Eu=CAsqrA_&>c|6LUX1U%%LG&CrsmJ$Z+~9i{@rh9Tlc^8 z>AmL%U-N%G+&wv8{o~2+(ovIDXQsaYH2dHG%lF#;|8Luqm7lw>a_7#ix8}Sz`}pwG z*DvvZPygMl_Rn(JiO-P|Z_-mG*?wy1rzNUeOT3qFox8{4#G!WuK~ocLZfb6-ycju4 z{Ptm`H@)h+Z~t_h@no&i>^H4H-LDTK&RbvmxjyV` l;>9(7v&%lSwMQDto!j)OY9Bu$hPR*gU-5p?9EJ*h1^{W`_s;+T