From 3ad7f83bd3431d9426db2b3bff73f6bc831b6776 Mon Sep 17 00:00:00 2001 From: Fede Raimondo Date: Mon, 23 Jan 2023 09:50:32 +0100 Subject: [PATCH 1/5] Decrease tests running time --- docs/changes/latest.inc | 2 + junifer/datagrabber/tests/test_hcp.py | 159 +++++++++++++++----------- 2 files changed, 95 insertions(+), 66 deletions(-) diff --git a/docs/changes/latest.inc b/docs/changes/latest.inc index 84b6ae143..6d46352eb 100644 --- a/docs/changes/latest.inc +++ b/docs/changes/latest.inc @@ -35,6 +35,8 @@ Enhancements - Add :class:`junifer.markers.EdgeCentricFCParcels` and :class:`junifer.markers.EdgeCentricFCSpheres` (:gh:`64` by `Leonard Sasse`_). +- Change HCP datagrabber tests to decrease CI running time (:gh:`155` by `Fede Raimondo`_). + Bugs ~~~~ diff --git a/junifer/datagrabber/tests/test_hcp.py b/junifer/datagrabber/tests/test_hcp.py index bfbdf4cd2..02f138b08 100644 --- a/junifer/datagrabber/tests/test_hcp.py +++ b/junifer/datagrabber/tests/test_hcp.py @@ -3,17 +3,35 @@ # Authors: Synchon Mandal # License: AGPL -from typing import Optional +from typing import Optional, Iterable import pytest -from junifer.datagrabber.hcp import DataladHCP1200 +from junifer.datagrabber.hcp import DataladHCP1200, HCP1200 from junifer.utils import configure_logging URI = "https://gin.g-node.org/juaml/datalad-example-hcp1200" +@pytest.fixture(scope="module") +def hcpdg() -> Iterable[DataladHCP1200]: + """Return a HCP1200 datagrabber.""" + dg = DataladHCP1200() + # Set URI to Gin + dg.uri = URI + # Set correct root directory + dg._rootdir = "." + with dg: + t_sub = "sub-01" + for t_elem in dg.get_elements(): + if t_elem[0] == t_sub: + dg[t_elem] + else: + break + yield dg + + @pytest.mark.parametrize( "tasks, phase_encodings, expected_path_name", [ @@ -38,15 +56,19 @@ URI = "https://gin.g-node.org/juaml/datalad-example-hcp1200" ("MOTOR", "RL", "tfMRI_MOTOR_RL_hp2000_clean.nii.gz"), ], ) -def test_dataladhcp1200_datagrabber( +def test_hcp1200_datagrabber( + hcpdg: DataladHCP1200, tasks: Optional[str], phase_encodings: Optional[str], expected_path_name: str, ) -> None: - """Test datalad HCP1200 datagrabber. + """Test HCP1200 datagrabber. Parameters ---------- + hcpdg : DataladHCP1200 + The Datalad version of the datagrabber with the first subject + already cloned. tasks : str The parametrized tasks. phase_encodings : str @@ -56,35 +78,31 @@ def test_dataladhcp1200_datagrabber( """ configure_logging(level="DEBUG") - dg = DataladHCP1200( + dg = HCP1200( + datadir=hcpdg.datadir, tasks=tasks, phase_encodings=phase_encodings, ) - # Set URI to Gin - dg.uri = URI - # Set correct root directory - dg._rootdir = "." - with dg: - # Get all elements - all_elements = dg.get_elements() - # Get test element - test_element = all_elements[0] - # Get test element data - out = dg[test_element] - # Asserts data type - assert "BOLD" in out - # Assert data file name - assert out["BOLD"]["path"].name == expected_path_name - # Assert data file path exists - assert out["BOLD"]["path"].exists() - # Assert data file path is a file - assert out["BOLD"]["path"].is_file() - # Assert metadata - assert "meta" in out["BOLD"] - meta = out["BOLD"]["meta"] - assert "element" in meta - assert "subject" in meta["element"] - assert test_element[0] == meta["element"]["subject"] + # Get all elements + all_elements = dg.get_elements() + # Get test element + test_element = all_elements[0] + # Get test element data + out = hcpdg[test_element] + # Asserts data type + assert "BOLD" in out + # Assert data file name + assert out["BOLD"]["path"].name == expected_path_name + # Assert data file path exists + assert out["BOLD"]["path"].exists() + # Assert data file path is a file + assert out["BOLD"]["path"].is_file() + # Assert metadata + assert "meta" in out["BOLD"] + meta = out["BOLD"]["meta"] + assert "element" in meta + assert "subject" in meta["element"] + assert test_element[0] == meta["element"]["subject"] @pytest.mark.parametrize( @@ -110,14 +128,18 @@ def test_dataladhcp1200_datagrabber( ("MOTOR", "RL"), ], ) -def test_dataladhcp1200_datagrabber_single_access( +def test_hcp1200_datagrabber_single_access( + hcpdg: DataladHCP1200, tasks: Optional[str], phase_encodings: Optional[str], ) -> None: - """Test datalad HCP1200 datagrabber single access. + """Test HCP1200 datagrabber single access. Parameters ---------- + hcpdg : DataladHCP1200 + The Datalad version of the datagrabber with the first subject + already cloned. tasks : str The parametrized tasks. phase_encodings : str @@ -125,14 +147,11 @@ def test_dataladhcp1200_datagrabber_single_access( """ configure_logging(level="DEBUG") - dg = DataladHCP1200( + dg = HCP1200( + datadir=hcpdg.datadir, tasks=tasks, phase_encodings=phase_encodings, ) - # Set URI to Gin - dg.uri = URI - # Set correct root directory - dg._rootdir = "." with dg: # Get all elements all_elements = dg.get_elements() @@ -149,14 +168,18 @@ def test_dataladhcp1200_datagrabber_single_access( (["REST1", "REST2"], None), ], ) -def test_dataladhcp1200_datagrabber_multi_access( +def test_hcp1200_datagrabber_multi_access( + hcpdg: DataladHCP1200, tasks: Optional[str], phase_encodings: Optional[str], ) -> None: - """Test datalad HCP1200 datagrabber multiple access. + """Test HCP1200 datagrabber multiple access. Parameters ---------- + hcpdg : DataladHCP1200 + The Datalad version of the datagrabber with the first subject + already cloned. tasks : str The parametrized tasks. phase_encodings : str @@ -164,14 +187,11 @@ def test_dataladhcp1200_datagrabber_multi_access( """ configure_logging(level="DEBUG") - dg = DataladHCP1200( - tasks=["REST1", "REST2"], - phase_encodings=["LR", "RL"], + dg = HCP1200( + datadir=hcpdg.datadir, + tasks=tasks, + phase_encodings=phase_encodings, ) - # Set URI to Gin - dg.uri = URI - # Set correct root directory - dg._rootdir = "." with dg: # Get all elements all_elements = dg.get_elements() @@ -181,17 +201,23 @@ def test_dataladhcp1200_datagrabber_multi_access( assert element[2] in ["LR", "RL"] -def test_dataladhcp1200_datagrabber_multi_access_task_simple() -> None: - """Test datalad HCP1200 datagrabber simple multiple access for task.""" +def test_hcp1200_datagrabber_multi_access_task_simple( + hcpdg: DataladHCP1200, +) -> None: + """Test HCP1200 datagrabber simple multiple access for task. + + Parameters + ---------- + hcpdg : DataladHCP1200 + The Datalad version of the datagrabber with the first subject + already cloned. + """ configure_logging(level="DEBUG") - dg = DataladHCP1200( + dg = HCP1200( + datadir=hcpdg.datadir, tasks="REST1", phase_encodings=["LR", "RL"], ) - # Set URI to Gin - dg.uri = URI - # Set correct root directory - dg._rootdir = "." with dg: # Get all elements all_elements = dg.get_elements() @@ -201,17 +227,16 @@ def test_dataladhcp1200_datagrabber_multi_access_task_simple() -> None: assert element[2] in ["LR", "RL"] -def test_dataladhcp1200_datagrabber_multi_access_phase_simple() -> None: - """Test datalad HCP1200 datagrabber simple multiple access for phase.""" +def test_hcp1200_datagrabber_multi_access_phase_simple( + hcpdg: DataladHCP1200, +) -> None: + """Test HCP1200 datagrabber simple multiple access for phase.""" configure_logging(level="DEBUG") - dg = DataladHCP1200( + dg = HCP1200( + datadir=hcpdg.datadir, tasks=["REST1", "REST2"], phase_encodings="LR", ) - # Set URI to Gin - dg.uri = URI - # Set correct root directory - dg._rootdir = "." with dg: # Get all elements all_elements = dg.get_elements() @@ -230,11 +255,11 @@ def test_dataladhcp1200_datagrabber_multi_access_phase_simple() -> None: (["FOO", "BAR"], "LR"), ], ) -def test_dataladhcp1200_datagrabber_incorrect_access_task( +def test_hcp1200_datagrabber_incorrect_access_task( tasks: Optional[str], phase_encodings: Optional[str], ) -> None: - """Test datalad HCP1200 datagrabber incorrect access for task. + """Test HCP1200 datagrabber incorrect access for task. Parameters ---------- @@ -246,7 +271,8 @@ def test_dataladhcp1200_datagrabber_incorrect_access_task( """ configure_logging(level="DEBUG") with pytest.raises(ValueError, match="not a valid HCP-YA fMRI task input"): - _ = DataladHCP1200( + _ = HCP1200( + datadir=".", tasks=tasks, phase_encodings=phase_encodings, ) @@ -261,11 +287,11 @@ def test_dataladhcp1200_datagrabber_incorrect_access_task( (["REST1", "REST2"], "BAR"), ], ) -def test_dataladhcp1200_datagrabber_incorrect_access_phase( +def test_hcp1200_datagrabber_incorrect_access_phase( tasks: Optional[str], phase_encodings: Optional[str], ) -> None: - """Test datalad HCP1200 datagrabber incorrect access for phase. + """Test HCP1200 datagrabber incorrect access for phase. Parameters ---------- @@ -277,7 +303,8 @@ def test_dataladhcp1200_datagrabber_incorrect_access_phase( """ configure_logging(level="DEBUG") with pytest.raises(ValueError, match="not a valid HCP-YA phase encoding"): - _ = DataladHCP1200( + _ = HCP1200( + datadir=".", tasks=tasks, phase_encodings=phase_encodings, ) -- 2.52.0 From 49089de9b2111eaa3d9e4bb5c0dc86e2a2813b18 Mon Sep 17 00:00:00 2001 From: Fede Raimondo Date: Mon, 23 Jan 2023 10:05:59 +0100 Subject: [PATCH 2/5] critical typo --- junifer/datagrabber/tests/test_hcp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/junifer/datagrabber/tests/test_hcp.py b/junifer/datagrabber/tests/test_hcp.py index 02f138b08..13417e0f3 100644 --- a/junifer/datagrabber/tests/test_hcp.py +++ b/junifer/datagrabber/tests/test_hcp.py @@ -88,7 +88,7 @@ def test_hcp1200_datagrabber( # Get test element test_element = all_elements[0] # Get test element data - out = hcpdg[test_element] + out = dg[test_element] # Asserts data type assert "BOLD" in out # Assert data file name -- 2.52.0 From 66cb81cafe14bd23393c5ed2ecffc0634bde1874 Mon Sep 17 00:00:00 2001 From: Fede Raimondo Date: Mon, 23 Jan 2023 10:27:06 +0100 Subject: [PATCH 3/5] fix tests --- junifer/datagrabber/hcp.py | 6 +++- junifer/datagrabber/tests/test_hcp.py | 42 ++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/junifer/datagrabber/hcp.py b/junifer/datagrabber/hcp.py index d96acac72..d1048c034 100644 --- a/junifer/datagrabber/hcp.py +++ b/junifer/datagrabber/hcp.py @@ -142,7 +142,11 @@ class HCP1200(PatternDataGrabber): The list of elements in the dataset. """ - subjects = [x.name for x in self.datadir.iterdir() if x.is_dir()] + subjects = [ + x.name + for x in self.datadir.iterdir() + if x.is_dir() and not x.name.startswith(".") + ] elems = [] for subject, task, phase_encoding in product( subjects, self.tasks, self.phase_encodings diff --git a/junifer/datagrabber/tests/test_hcp.py b/junifer/datagrabber/tests/test_hcp.py index 13417e0f3..6e8a2d310 100644 --- a/junifer/datagrabber/tests/test_hcp.py +++ b/junifer/datagrabber/tests/test_hcp.py @@ -230,7 +230,14 @@ def test_hcp1200_datagrabber_multi_access_task_simple( def test_hcp1200_datagrabber_multi_access_phase_simple( hcpdg: DataladHCP1200, ) -> None: - """Test HCP1200 datagrabber simple multiple access for phase.""" + """Test HCP1200 datagrabber simple multiple access for phase. + + Parameters + ---------- + hcpdg : DataladHCP1200 + The Datalad version of the datagrabber with the first subject + already cloned. + """ configure_logging(level="DEBUG") dg = HCP1200( datadir=hcpdg.datadir, @@ -308,3 +315,36 @@ def test_hcp1200_datagrabber_incorrect_access_phase( tasks=tasks, phase_encodings=phase_encodings, ) + + +def test_hcp1200_datagrabber_elements( + hcpdg: DataladHCP1200, +) -> None: + """Test HCP1200 datagrabber elements. + + Parameters + ---------- + hcpdg : DataladHCP1200 + The Datalad version of the datagrabber with the first subject + already cloned. + """ + configure_logging(level="DEBUG") + dg = HCP1200( + datadir=hcpdg.datadir, + tasks="REST1", + phase_encodings="LR", + ) + with dg: + # Get all elements + expected_subjects = [ + f"sub-{x:02d}" for x in range(1, 10) + ] + found_subjects = [] + all_elements = dg.get_elements() + # Check only specified task and phase encoding are found + for element in all_elements: + found_subjects.append(element[0]) + assert element[1] == "REST1" + assert element[2] in ["LR", "RL"] + + assert set(found_subjects) == set(expected_subjects) \ No newline at end of file -- 2.52.0 From 0617b0faf67aaffc342b1437648c483ba870c32b Mon Sep 17 00:00:00 2001 From: Fede Raimondo Date: Mon, 23 Jan 2023 10:29:34 +0100 Subject: [PATCH 4/5] damn linter --- junifer/datagrabber/tests/test_hcp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/junifer/datagrabber/tests/test_hcp.py b/junifer/datagrabber/tests/test_hcp.py index 6e8a2d310..10663f283 100644 --- a/junifer/datagrabber/tests/test_hcp.py +++ b/junifer/datagrabber/tests/test_hcp.py @@ -347,4 +347,4 @@ def test_hcp1200_datagrabber_elements( assert element[1] == "REST1" assert element[2] in ["LR", "RL"] - assert set(found_subjects) == set(expected_subjects) \ No newline at end of file + assert set(found_subjects) == set(expected_subjects) -- 2.52.0 From 8583634595bd3ff4821d52449c381b8a5c1ab883 Mon Sep 17 00:00:00 2001 From: Fede Date: Mon, 23 Jan 2023 11:28:32 +0100 Subject: [PATCH 5/5] Datalad get all the files --- junifer/datagrabber/tests/test_hcp.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/junifer/datagrabber/tests/test_hcp.py b/junifer/datagrabber/tests/test_hcp.py index 10663f283..90ddd4329 100644 --- a/junifer/datagrabber/tests/test_hcp.py +++ b/junifer/datagrabber/tests/test_hcp.py @@ -23,12 +23,8 @@ def hcpdg() -> Iterable[DataladHCP1200]: # Set correct root directory dg._rootdir = "." with dg: - t_sub = "sub-01" for t_elem in dg.get_elements(): - if t_elem[0] == t_sub: - dg[t_elem] - else: - break + dg[t_elem] yield dg -- 2.52.0