From 5e929d08db725622f27f986d1d2bd2d41877018f Mon Sep 17 00:00:00 2001 From: Vito Zanotelli Date: Mon, 27 Jan 2025 10:23:41 +0100 Subject: [PATCH 1/2] Add test files for legacy v0.1.2 h5mu I noticed errors loading h5mu files from mudata==0.1.2 To generate the test files using this mudata version, uv can be used from within the data archive directory: `uv run create_testfiles.py` The concept of the data archive for legacy files has been modeled from the `anndata` repository. --- tests/data/archives/README.md | 14 ++++++ .../data/archives/v0.1.2/create_testfiles.py | 47 ++++++++++++++++++ tests/data/archives/v0.1.2/mudata.h5mu | Bin 0 -> 56560 bytes 3 files changed, 61 insertions(+) create mode 100644 tests/data/archives/README.md create mode 100644 tests/data/archives/v0.1.2/create_testfiles.py create mode 100644 tests/data/archives/v0.1.2/mudata.h5mu diff --git a/tests/data/archives/README.md b/tests/data/archives/README.md new file mode 100644 index 0000000..0aa2a2a --- /dev/null +++ b/tests/data/archives/README.md @@ -0,0 +1,14 @@ +# Archives with legacy test data + +These archives should contain folders containing `.h5mu` test files +creasted with older `mudata` versions for regression testing. + +## Format + +A folder with the format `v`. + +Containing: +- `create_testfiles.py`: a script creating the testfiles. Should contain a + uv header specifying the critical dependencies. Can be run with `uv run create_testfile.py` + to create the testfile(s) +- `mudata.h5mu`: the created testfile \ No newline at end of file diff --git a/tests/data/archives/v0.1.2/create_testfiles.py b/tests/data/archives/v0.1.2/create_testfiles.py new file mode 100644 index 0000000..6d73ea2 --- /dev/null +++ b/tests/data/archives/v0.1.2/create_testfiles.py @@ -0,0 +1,47 @@ +# /// script +# requires-python = ">=3.10" +# dependencies = [ +# "mudata==0.1.2", +# "numpy==1.*", # required as numpy 2 raises errors +# ] +# [tool.uv] +# exclude-newer = "2024-12-01T00:00:00Z" +# /// +import os + +import numpy as np +from anndata import AnnData + +from mudata import MuData + + +def create_mudata() -> MuData: + """Create a mudata testfile + + Returns: + MuData: MuData object with two AnnData objects + """ + return MuData( + { + "mod1": AnnData(np.arange(0, 100, 0.1).reshape(-1, 10)), + "mod2": AnnData(np.arange(101, 2101, 1).reshape(-1, 20)), + } + ) + + +def write_h5mu_testfile(mdata: MuData, filepath_h5mu: str | os.PathLike) -> None: + """Write a MuData object to a file + + Args: + mdata (MuData): MuData object to write + filepath_h5mu (str | os.PathLike): Path to write the MuData object + + Returns: + None + """ + mdata.write(filepath_h5mu) + + +if __name__ == "__main__": + mdata = create_mudata() + write_h5mu_testfile(mdata, "mudata.h5mu") diff --git a/tests/data/archives/v0.1.2/mudata.h5mu b/tests/data/archives/v0.1.2/mudata.h5mu new file mode 100644 index 0000000000000000000000000000000000000000..adb9812c6eaf65f47bd62cc69bd6047463257084 GIT binary patch literal 56560 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 Rzj{xsrN968^{e;N{uiqfZ3_SZ literal 0 HcmV?d00001 From 6f7621de3cbc987663cb55a0836d5ed85cad89a0 Mon Sep 17 00:00:00 2001 From: Vito Zanotelli Date: Mon, 27 Jan 2025 10:29:41 +0100 Subject: [PATCH 2/2] Add test for reading legacy h5mu files Modeled after the anndata test for backwards compatibility. Checks if loading of all tests/data/archives/vxxx/mudata.h5mu files can be loaded. --- tests/data/archives/README.md | 11 ++++++++-- tests/test_io_backwards_compat.py | 35 +++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 tests/test_io_backwards_compat.py diff --git a/tests/data/archives/README.md b/tests/data/archives/README.md index 0aa2a2a..4ab1252 100644 --- a/tests/data/archives/README.md +++ b/tests/data/archives/README.md @@ -5,10 +5,17 @@ creasted with older `mudata` versions for regression testing. ## Format -A folder with the format `v`. +A folder with the format `v` indicating the `mudata` version used +to create the file. Containing: - `create_testfiles.py`: a script creating the testfiles. Should contain a uv header specifying the critical dependencies. Can be run with `uv run create_testfile.py` to create the testfile(s) -- `mudata.h5mu`: the created testfile \ No newline at end of file +- `mudata.h5mu`: the created testfile. Needs to contain at minimum the data expected by + `test_io_backwards_compat.py`. + +## Automated tests + +The test `test_io_backwards_compat.py` will check each `mudata.h5mu` file in this folder if it can +be loaded correctly by the current `mudata` version. \ No newline at end of file diff --git a/tests/test_io_backwards_compat.py b/tests/test_io_backwards_compat.py new file mode 100644 index 0000000..8ae84ed --- /dev/null +++ b/tests/test_io_backwards_compat.py @@ -0,0 +1,35 @@ +from __future__ import annotations + +from pathlib import Path + +import numpy as np +import pytest +from anndata import AnnData +from anndata.tests.helpers import assert_equal + +from mudata import MuData, read_h5mu + +ARCHIVE_PTH = Path(__file__).parent / "data/archives" + + +@pytest.fixture(params=list(ARCHIVE_PTH.glob("v*")), ids=lambda x: x.name) +def archive_dir(request): + return request.param + + +@pytest.fixture +def mdata(): + return MuData( + { + "mod1": AnnData(np.arange(0, 100, 0.1).reshape(-1, 10)), + "mod2": AnnData(np.arange(101, 2101, 1).reshape(-1, 20)), + } + ) + + +class TestLegacyMuData: + def test_legacy_files(self, archive_dir, mdata): + from_h5mu = read_h5mu(archive_dir / "mudata.h5mu") + + for mod in mdata.mod: + assert_equal(from_h5mu.mod[mod].X, mdata.mod[mod].X, exact=False)