From 2f172479ec79f3ccfe0f1ec7d013dfc17fc3e83c Mon Sep 17 00:00:00 2001 From: Jayaram Kancherla Date: Wed, 13 May 2026 20:41:05 -0700 Subject: [PATCH] Fix issue saving data frame lists; add tests --- CHANGELOG.md | 3 +- setup.cfg | 2 +- src/dolomite_ranges/__init__.py | 4 +- .../read_atomic_vector_list.py | 4 +- src/dolomite_ranges/save_frame_list.py | 4 +- tests/test_frame_list.py | 48 +++++++++++++++++++ 6 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 tests/test_frame_list.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 9414d46..c85f888 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,9 @@ # Changelog -## Version 0.4.0 +## Version 0.4.0 - 0.4.1 - Support for compressed lists. +- Fix the copy paste issue for Compressed data frame lists. ## Version 0.3.0 diff --git a/setup.cfg b/setup.cfg index 6fb7015..93ea6b9 100644 --- a/setup.cfg +++ b/setup.cfg @@ -52,7 +52,7 @@ install_requires = dolomite-base>=0.4.2 genomicranges>=0.8.2 biocframe>=0.7.2 - compressed-lists>=0.4.4 + compressed-lists>=0.4.5 h5py diff --git a/src/dolomite_ranges/__init__.py b/src/dolomite_ranges/__init__.py index ce82bcf..1b64df6 100644 --- a/src/dolomite_ranges/__init__.py +++ b/src/dolomite_ranges/__init__.py @@ -16,7 +16,9 @@ del version, PackageNotFoundError from .save_sequence_information import save_sequence_information -from .read_sequence_information import read_sequence_information +from .read_sequence_information import read_sequence_information +from .read_frame_list import read_data_frame_list +from .save_frame_list import save_data_frame_list from .save_genomic_ranges import save_genomic_ranges from .read_genomic_ranges import read_genomic_ranges from .save_genomic_ranges_list import save_compressed_genomic_ranges_list diff --git a/src/dolomite_ranges/read_atomic_vector_list.py b/src/dolomite_ranges/read_atomic_vector_list.py index 596abee..c4b3b70 100644 --- a/src/dolomite_ranges/read_atomic_vector_list.py +++ b/src/dolomite_ranges/read_atomic_vector_list.py @@ -21,9 +21,7 @@ def read_atomic_vector_list(path: str, metadata: Optional[dict], **kwargs): kwargs: Further arguments, ignored. - - - """ + """ return _read_compressed_list(path, metadata, "atomic_vector_list", **kwargs) diff --git a/src/dolomite_ranges/save_frame_list.py b/src/dolomite_ranges/save_frame_list.py index 6678324..db86cea 100644 --- a/src/dolomite_ranges/save_frame_list.py +++ b/src/dolomite_ranges/save_frame_list.py @@ -6,7 +6,7 @@ @dl.save_object.register @dl.validate_saves -def save_compressed_genomic_ranges_list(x: CompressedSplitBiocFrameList, path: str, **kwargs): +def save_data_frame_list(x: CompressedSplitBiocFrameList, path: str, **kwargs): """Method for saving :py:class:`~compressed_lists.biocframe_list.CompressedSplitBiocFrameList` objects to their corresponding file representations, see :py:meth:`~dolomite_base.save_object.save_object` for details. @@ -28,4 +28,4 @@ def save_compressed_genomic_ranges_list(x: CompressedSplitBiocFrameList, path: s Returns: `x` is saved to `path`. """ - return _save_compressed_list(x, path=path, name="genomic_ranges_list", **kwargs) + return _save_compressed_list(x, path=path, name="data_frame_list", **kwargs) diff --git a/tests/test_frame_list.py b/tests/test_frame_list.py new file mode 100644 index 0000000..ca37a1e --- /dev/null +++ b/tests/test_frame_list.py @@ -0,0 +1,48 @@ +import os +from tempfile import mkdtemp + +from biocframe import BiocFrame +from dolomite_base import read_object, save_object +from compressed_lists import CompressedSplitBiocFrameList +import numpy as np +import dolomite_ranges + + +def test_dataframe_list(): + a = BiocFrame({ + "seqnames":["chr1", "chr2", "chr1", "chr3"], + "strand":["-", "+", "*", "+"], + "mcols":BiocFrame({"score": [1, 2, 3, 4]}) + }) + + b = BiocFrame({ + "seqnames":["chr2", "chr4", "chr5"], + "strand":["-", "+", "*"], + "mcols":BiocFrame({"score": [2, 3, 4]}) + }) + + gdf = CompressedSplitBiocFrameList.from_list(lst=[a, b], names=["a", "b"]) + + dir = os.path.join(mkdtemp(), "dframe") + save_object(gdf, dir) + + roundtrip = read_object(dir) + assert isinstance(roundtrip, CompressedSplitBiocFrameList) + assert roundtrip.get_names() == gdf.get_names() + assert len(roundtrip.get_unlist_data()) == len(gdf.get_unlist_data()) + assert list(roundtrip[0].get_column("seqnames")) == gdf[0].get_column("seqnames") + assert list(roundtrip[0].get_column("strand")) ==gdf[0].get_column("strand") + + +def test_dframe_empty(): + gdf = CompressedSplitBiocFrameList.empty(n=100) + + print(gdf) + + dir = os.path.join(mkdtemp(), "dframe_empty") + save_object(gdf, dir) + + roundtrip = read_object(dir) + assert roundtrip.get_names() == gdf.get_names() + assert len(roundtrip.get_unlist_data()) == len(gdf.get_unlist_data()) + assert np.allclose(roundtrip.get_element_lengths(), gdf.get_element_lengths()) \ No newline at end of file