junifer 0.0.7.dev332__py3-none-any.whl → 0.0.8__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- junifer/_version.py +9 -19
- junifer/api/__init__.pyi +17 -2
- junifer/api/functions.py +222 -39
- junifer/api/queue_context/__init__.pyi +11 -3
- junifer/api/queue_context/gnu_parallel_local_adapter.py +81 -120
- junifer/api/queue_context/htcondor_adapter.py +118 -181
- junifer/api/queue_context/queue_context_adapter.py +51 -7
- junifer/api/queue_context/tests/test_gnu_parallel_local_adapter.py +10 -35
- junifer/api/queue_context/tests/test_htcondor_adapter.py +13 -50
- junifer/api/res/fsl/run_fsl_docker.sh +4 -0
- junifer/api/tests/test_functions.py +863 -36
- junifer/cli/__init__.py +1 -7
- junifer/cli/cli.py +41 -22
- junifer/cli/parser.py +23 -147
- junifer/cli/tests/data/gmd_mean.yaml +6 -6
- junifer/cli/tests/data/gmd_mean_htcondor.yaml +6 -5
- junifer/cli/tests/data/partly_cloudy_agg_mean_tian.yml +1 -0
- junifer/cli/tests/test_cli.py +120 -4
- junifer/cli/tests/test_cli_utils.py +23 -6
- junifer/cli/utils.py +14 -9
- junifer/configs/__init__.py +5 -0
- junifer/configs/__init__.pyi +0 -0
- junifer/configs/juseless/datagrabbers/__init__.pyi +4 -2
- junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py +18 -24
- junifer/configs/juseless/datagrabbers/camcan_vbm.py +20 -27
- junifer/configs/juseless/datagrabbers/ixi_vbm.py +44 -52
- junifer/configs/juseless/datagrabbers/tests/test_ixi_vbm.py +0 -7
- junifer/configs/juseless/datagrabbers/tests/test_ucla.py +2 -19
- junifer/configs/juseless/datagrabbers/ucla.py +111 -104
- junifer/configs/juseless/datagrabbers/ukb_vbm.py +19 -25
- junifer/configs/py.typed +0 -0
- junifer/conftest.py +63 -24
- junifer/data/_dispatch.py +9 -19
- junifer/data/coordinates/_ants_coordinates_warper.py +4 -1
- junifer/data/coordinates/_coordinates.py +51 -6
- junifer/data/coordinates/_fsl_coordinates_warper.py +4 -1
- junifer/data/coordinates/tests/test_coordinates.py +15 -3
- junifer/data/coordinates/tests/test_coordinates_names.py +37 -0
- junifer/data/maps/_ants_maps_warper.py +18 -12
- junifer/data/maps/_fsl_maps_warper.py +7 -3
- junifer/data/maps/_maps.py +12 -8
- junifer/data/maps/tests/test_maps.py +13 -21
- junifer/data/masks/_ants_mask_warper.py +18 -12
- junifer/data/masks/_fsl_mask_warper.py +7 -3
- junifer/data/masks/_masks.py +15 -12
- junifer/data/masks/tests/test_masks.py +20 -17
- junifer/data/parcellations/_ants_parcellation_warper.py +18 -12
- junifer/data/parcellations/_fsl_parcellation_warper.py +7 -5
- junifer/data/parcellations/_parcellations.py +125 -91
- junifer/data/parcellations/tests/test_parcellations.py +122 -1
- junifer/data/template_spaces.py +117 -50
- junifer/data/tests/test_template_spaces.py +10 -7
- junifer/data/utils.py +10 -8
- junifer/datagrabber/__init__.pyi +38 -5
- junifer/datagrabber/aomic/__init__.pyi +8 -1
- junifer/datagrabber/aomic/_types.py +22 -0
- junifer/datagrabber/aomic/id1000.py +193 -183
- junifer/datagrabber/aomic/piop1.py +215 -259
- junifer/datagrabber/aomic/piop2.py +211 -244
- junifer/datagrabber/aomic/tests/test_id1000.py +70 -53
- junifer/datagrabber/aomic/tests/test_piop1.py +98 -102
- junifer/datagrabber/aomic/tests/test_piop2.py +88 -85
- junifer/datagrabber/base.py +253 -79
- junifer/datagrabber/datalad_base.py +127 -76
- junifer/datagrabber/dmcc13_benchmark.py +204 -289
- junifer/datagrabber/hcp1200/__init__.pyi +7 -2
- junifer/datagrabber/hcp1200/datalad_hcp1200.py +61 -40
- junifer/datagrabber/hcp1200/hcp1200.py +151 -164
- junifer/datagrabber/hcp1200/tests/test_hcp1200.py +116 -128
- junifer/datagrabber/multiple.py +183 -63
- junifer/datagrabber/pattern.py +358 -227
- junifer/datagrabber/pattern_datalad.py +84 -124
- junifer/datagrabber/pattern_validation_mixin.py +22 -50
- junifer/datagrabber/tests/test_base.py +17 -4
- junifer/datagrabber/tests/test_datalad_base.py +20 -27
- junifer/datagrabber/tests/test_dmcc13_benchmark.py +110 -122
- junifer/datagrabber/tests/test_multiple.py +293 -31
- junifer/datagrabber/tests/test_pattern.py +577 -18
- junifer/datagrabber/tests/test_pattern_datalad.py +177 -107
- junifer/datagrabber/tests/test_pattern_validation_mixin.py +9 -51
- junifer/datareader/default.py +8 -5
- junifer/datareader/tests/test_default_reader.py +1 -1
- junifer/external/BrainPrint/.codecov.yml +2 -0
- junifer/external/BrainPrint/.codespellignore +2 -0
- junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/bug-report.md +45 -0
- junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/documentation.md +12 -0
- junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/feature-request.md +24 -0
- junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/questions-help-support.md +28 -0
- junifer/external/BrainPrint/.github/dependabot.yml +6 -0
- junifer/external/BrainPrint/.github/workflows/build.yml +53 -0
- junifer/external/BrainPrint/.github/workflows/code-style.yml +44 -0
- junifer/external/BrainPrint/.github/workflows/doc.yml +65 -0
- junifer/external/BrainPrint/.github/workflows/publish.yml +31 -0
- junifer/external/BrainPrint/.github/workflows/pytest.yml +54 -0
- junifer/external/BrainPrint/.gitignore +123 -0
- junifer/external/BrainPrint/LICENSE +21 -0
- junifer/external/BrainPrint/README.md +108 -0
- junifer/external/BrainPrint/brainprint/cli/__init__.py +11 -0
- junifer/external/BrainPrint/brainprint/cli/help_text.py +169 -0
- junifer/external/BrainPrint/brainprint/cli/parser.py +150 -0
- junifer/external/BrainPrint/brainprint/cli/utils.py +14 -0
- junifer/external/BrainPrint/brainprint/commands/__init__.py +0 -0
- junifer/external/BrainPrint/brainprint/commands/sys_info.py +18 -0
- junifer/external/BrainPrint/brainprint/utils/tests/__init__.py +0 -0
- junifer/external/BrainPrint/brainprint/utils/tests/test_config.py +33 -0
- junifer/external/BrainPrint/doc/Makefile +20 -0
- junifer/external/BrainPrint/doc/_static/.gitkeep +0 -0
- junifer/external/BrainPrint/doc/_templates/autosummary/class.rst +10 -0
- junifer/external/BrainPrint/doc/_templates/autosummary/function.rst +8 -0
- junifer/external/BrainPrint/doc/_templates/autosummary/module.rst +6 -0
- junifer/external/BrainPrint/doc/api/index.rst +11 -0
- junifer/external/BrainPrint/doc/conf.py +272 -0
- junifer/external/BrainPrint/doc/index.rst +140 -0
- junifer/external/BrainPrint/doc/links.inc +36 -0
- junifer/external/BrainPrint/doc/make.bat +35 -0
- junifer/external/BrainPrint/doc/references.bib +23 -0
- junifer/external/BrainPrint/pyproject.toml +170 -0
- junifer/external/BrainPrint/setup.py +3 -0
- junifer/external/__init__.py +5 -0
- junifer/external/__init__.pyi +0 -0
- junifer/external/nilearn/junifer_connectivity_measure.py +95 -39
- junifer/external/nilearn/junifer_nifti_spheres_masker.py +226 -67
- junifer/external/nilearn/tests/test_junifer_connectivity_measure.py +39 -27
- junifer/external/nilearn/tests/test_junifer_nifti_spheres_masker.py +231 -21
- junifer/external/py.typed +0 -0
- junifer/markers/__init__.pyi +6 -3
- junifer/markers/base.py +126 -76
- junifer/markers/brainprint.py +30 -39
- junifer/markers/complexity/__init__.py +20 -3
- junifer/markers/complexity/complexity_base.py +40 -41
- junifer/markers/complexity/hurst_exponent.py +22 -35
- junifer/markers/complexity/multiscale_entropy_auc.py +53 -41
- junifer/markers/complexity/perm_entropy.py +22 -36
- junifer/markers/complexity/range_entropy.py +22 -35
- junifer/markers/complexity/range_entropy_auc.py +27 -36
- junifer/markers/complexity/sample_entropy.py +22 -36
- junifer/markers/complexity/tests/test_complexity_registry.py +48 -0
- junifer/markers/complexity/tests/test_hurst_exponent.py +47 -36
- junifer/markers/complexity/tests/test_multiscale_entropy_auc.py +50 -36
- junifer/markers/complexity/tests/test_perm_entropy.py +48 -36
- junifer/markers/complexity/tests/test_range_entropy.py +47 -36
- junifer/markers/complexity/tests/test_range_entropy_auc.py +47 -36
- junifer/markers/complexity/tests/test_sample_entropy.py +48 -36
- junifer/markers/complexity/tests/test_weighted_perm_entropy.py +50 -36
- junifer/markers/complexity/weighted_perm_entropy.py +22 -36
- junifer/markers/ets_rss.py +35 -31
- junifer/markers/falff/__init__.pyi +7 -1
- junifer/markers/falff/_afni_falff.py +22 -9
- junifer/markers/falff/_junifer_falff.py +47 -31
- junifer/markers/falff/falff_base.py +80 -60
- junifer/markers/falff/falff_maps.py +17 -41
- junifer/markers/falff/falff_parcels.py +26 -51
- junifer/markers/falff/falff_spheres.py +34 -61
- junifer/markers/falff/tests/test_falff_maps.py +20 -23
- junifer/markers/falff/tests/test_falff_mask.py +99 -0
- junifer/markers/falff/tests/test_falff_parcels.py +14 -10
- junifer/markers/falff/tests/test_falff_spheres.py +14 -10
- junifer/markers/functional_connectivity/crossparcellation_functional_connectivity.py +32 -34
- junifer/markers/functional_connectivity/edge_functional_connectivity_maps.py +12 -25
- junifer/markers/functional_connectivity/edge_functional_connectivity_parcels.py +19 -34
- junifer/markers/functional_connectivity/edge_functional_connectivity_spheres.py +24 -44
- junifer/markers/functional_connectivity/functional_connectivity_base.py +50 -40
- junifer/markers/functional_connectivity/functional_connectivity_maps.py +12 -25
- junifer/markers/functional_connectivity/functional_connectivity_parcels.py +19 -34
- junifer/markers/functional_connectivity/functional_connectivity_spheres.py +24 -45
- junifer/markers/functional_connectivity/tests/test_crossparcellation_functional_connectivity.py +21 -22
- junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_maps.py +8 -7
- junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_parcels.py +8 -4
- junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_spheres.py +8 -4
- junifer/markers/functional_connectivity/tests/test_functional_connectivity_maps.py +8 -7
- junifer/markers/functional_connectivity/tests/test_functional_connectivity_parcels.py +9 -5
- junifer/markers/functional_connectivity/tests/test_functional_connectivity_spheres.py +8 -12
- junifer/markers/maps_aggregation.py +77 -55
- junifer/markers/parcel_aggregation.py +91 -70
- junifer/markers/reho/__init__.pyi +7 -1
- junifer/markers/reho/_afni_reho.py +23 -14
- junifer/markers/reho/_junifer_reho.py +112 -123
- junifer/markers/reho/reho_base.py +115 -37
- junifer/markers/reho/reho_maps.py +18 -32
- junifer/markers/reho/reho_parcels.py +26 -41
- junifer/markers/reho/reho_spheres.py +33 -54
- junifer/markers/reho/tests/test_junifer_reho.py +178 -0
- junifer/markers/reho/tests/test_reho_maps.py +27 -25
- junifer/markers/reho/tests/test_reho_parcels.py +28 -22
- junifer/markers/reho/tests/test_reho_spheres.py +16 -12
- junifer/markers/sphere_aggregation.py +88 -72
- junifer/markers/temporal_snr/temporal_snr_base.py +32 -30
- junifer/markers/temporal_snr/temporal_snr_maps.py +9 -18
- junifer/markers/temporal_snr/temporal_snr_parcels.py +19 -27
- junifer/markers/temporal_snr/temporal_snr_spheres.py +27 -41
- junifer/markers/temporal_snr/tests/test_temporal_snr_base.py +2 -2
- junifer/markers/temporal_snr/tests/test_temporal_snr_maps.py +17 -22
- junifer/markers/temporal_snr/tests/test_temporal_snr_parcels.py +11 -3
- junifer/markers/temporal_snr/tests/test_temporal_snr_spheres.py +9 -9
- junifer/markers/tests/test_brainprint.py +10 -9
- junifer/markers/tests/test_ets_rss.py +7 -3
- junifer/markers/tests/test_lost_regions.py +279 -0
- junifer/markers/tests/test_maps_aggregation.py +67 -114
- junifer/markers/tests/test_marker_utils.py +40 -1
- junifer/markers/tests/test_markers_base.py +275 -6
- junifer/markers/tests/test_parcel_aggregation.py +91 -53
- junifer/markers/tests/test_sphere_aggregation.py +53 -47
- junifer/markers/utils.py +267 -5
- junifer/onthefly/__init__.py +2 -3
- junifer/onthefly/__init__.pyi +4 -0
- junifer/onthefly/_brainprint.py +3 -5
- junifer/onthefly/py.typed +0 -0
- junifer/onthefly/read_transform.py +11 -9
- junifer/onthefly/tests/test_read_transform.py +7 -7
- junifer/pipeline/__init__.pyi +4 -2
- junifer/pipeline/marker_collection.py +14 -10
- junifer/pipeline/pipeline_component_registry.py +25 -6
- junifer/pipeline/pipeline_step_mixin.py +5 -12
- junifer/pipeline/tests/test_data_object_dumper.py +10 -10
- junifer/pipeline/tests/test_marker_collection.py +145 -168
- junifer/pipeline/tests/test_pipeline_component_registry.py +52 -8
- junifer/pipeline/tests/test_pipeline_step_mixin.py +12 -26
- junifer/pipeline/tests/test_update_meta_mixin.py +4 -5
- junifer/pipeline/tests/test_workdir_manager.py +39 -0
- junifer/pipeline/update_meta_mixin.py +13 -10
- junifer/pipeline/utils.py +22 -17
- junifer/pipeline/workdir_manager.py +41 -32
- junifer/preprocess/__init__.pyi +9 -4
- junifer/preprocess/_temporal_filter.py +34 -33
- junifer/preprocess/_temporal_slicer.py +17 -30
- junifer/preprocess/base.py +99 -55
- junifer/preprocess/confounds/__init__.pyi +10 -2
- junifer/preprocess/confounds/fmriprep_confound_remover.py +87 -109
- junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py +64 -45
- junifer/preprocess/smoothing/__init__.pyi +2 -2
- junifer/preprocess/smoothing/_afni_smoothing.py +8 -7
- junifer/preprocess/smoothing/_fsl_smoothing.py +6 -4
- junifer/preprocess/smoothing/_nilearn_smoothing.py +7 -5
- junifer/preprocess/smoothing/smoothing.py +59 -40
- junifer/preprocess/smoothing/tests/test_smoothing.py +28 -8
- junifer/preprocess/tests/test_preprocess_base.py +17 -9
- junifer/preprocess/tests/test_temporal_filter.py +37 -16
- junifer/preprocess/tests/test_temporal_slicer.py +12 -12
- junifer/preprocess/warping/__init__.pyi +2 -2
- junifer/preprocess/warping/_ants_warper.py +56 -40
- junifer/preprocess/warping/_fsl_warper.py +49 -36
- junifer/preprocess/warping/_utils.py +106 -0
- junifer/preprocess/warping/space_warper.py +99 -98
- junifer/preprocess/warping/tests/test_space_warper.py +46 -41
- junifer/preprocess/warping/tests/test_warping_utils.py +163 -0
- junifer/stats.py +46 -34
- junifer/storage/__init__.pyi +8 -4
- junifer/storage/base.py +129 -64
- junifer/storage/hdf5.py +307 -199
- junifer/storage/pandas_base.py +46 -24
- junifer/storage/sqlite.py +99 -62
- junifer/storage/tests/data/collected_h5io_fork.hdf5 +0 -0
- junifer/storage/tests/test_hdf5.py +147 -12
- junifer/storage/tests/test_repeated_storage.py +293 -0
- junifer/storage/tests/test_sqlite.py +9 -20
- junifer/storage/tests/test_storage_base.py +18 -21
- junifer/storage/tests/test_utils.py +83 -22
- junifer/storage/utils.py +58 -38
- junifer/testing/__init__.pyi +2 -2
- junifer/testing/datagrabbers.py +480 -44
- junifer/testing/registry.py +12 -0
- junifer/testing/tests/test_adhdtesting_datagrabber.py +24 -0
- junifer/testing/tests/test_oasisvmbtesting_datagrabber.py +5 -0
- junifer/testing/tests/test_partlycloudytesting_datagrabber.py +52 -0
- junifer/testing/tests/test_spmauditory_datagrabber.py +16 -0
- junifer/testing/tests/test_testing_registry.py +31 -0
- junifer/testing/tests/test_testing_utils.py +35 -0
- junifer/testing/tests/test_uclacnpvbmtesting_datagrabber.py +81 -0
- junifer/testing/utils.py +33 -1
- junifer/tests/test_stats.py +1 -5
- junifer/typing/__init__.pyi +2 -0
- junifer/typing/_typing.py +34 -19
- junifer/typing/py.typed +0 -0
- junifer/utils/__init__.pyi +10 -1
- junifer/utils/_config.py +1 -2
- junifer/utils/helpers.py +68 -2
- junifer/utils/logging.py +31 -7
- junifer/utils/tests/test_helpers.py +36 -1
- {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/METADATA +43 -35
- junifer-0.0.8.dist-info/RECORD +402 -0
- {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/WHEEL +1 -1
- junifer/cli/tests/test_parser.py +0 -280
- junifer/external/h5io/h5io/__init__.py +0 -15
- junifer/external/h5io/h5io/_h5io.py +0 -767
- junifer/external/h5io/h5io/_version.py +0 -1
- junifer/external/h5io/h5io/chunked_array.py +0 -94
- junifer/external/h5io/h5io/chunked_list.py +0 -65
- junifer/markers/complexity/__init__.pyi +0 -17
- junifer-0.0.7.dev332.dist-info/RECORD +0 -353
- {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/entry_points.txt +0 -0
- {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/licenses/AUTHORS.rst +0 -0
- {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/licenses/LICENSE.md +0 -0
- {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/top_level.txt +0 -0
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
# Authors: Synchon Mandal <s.mandal@fz-juelich.de>
|
|
4
4
|
# License: AGPL
|
|
5
5
|
|
|
6
|
+
import importlib
|
|
6
7
|
import platform as pl
|
|
7
|
-
import sys
|
|
8
8
|
|
|
9
9
|
import pytest
|
|
10
10
|
|
|
@@ -32,8 +32,8 @@ def test_get_python_information() -> None:
|
|
|
32
32
|
|
|
33
33
|
def test_get_dependency_information_short() -> None:
|
|
34
34
|
"""Test short version of _get_dependency_information()."""
|
|
35
|
-
dependency_information = _get_dependency_information(long_=False)
|
|
36
35
|
dependency_list = [
|
|
36
|
+
"aenum",
|
|
37
37
|
"click",
|
|
38
38
|
"numpy",
|
|
39
39
|
"scipy",
|
|
@@ -46,14 +46,20 @@ def test_get_dependency_information_short() -> None:
|
|
|
46
46
|
"tqdm",
|
|
47
47
|
"templateflow",
|
|
48
48
|
"lapy",
|
|
49
|
+
"h5py",
|
|
50
|
+
"h5io",
|
|
49
51
|
"lazy_loader",
|
|
50
52
|
"looseversion",
|
|
51
53
|
"junifer_data",
|
|
52
54
|
"structlog",
|
|
55
|
+
"pydantic",
|
|
56
|
+
"typing_extensions",
|
|
53
57
|
]
|
|
54
58
|
|
|
55
|
-
|
|
56
|
-
|
|
59
|
+
# Import dependencies as only loaded modules are reported
|
|
60
|
+
for module in dependency_list:
|
|
61
|
+
importlib.import_module(module)
|
|
62
|
+
dependency_information = _get_dependency_information(long_=False)
|
|
57
63
|
|
|
58
64
|
assert frozenset(dependency_information.keys()) == frozenset(
|
|
59
65
|
dependency_list
|
|
@@ -62,9 +68,8 @@ def test_get_dependency_information_short() -> None:
|
|
|
62
68
|
|
|
63
69
|
def test_get_dependency_information_long() -> None:
|
|
64
70
|
"""Test long version of _get_dependency_information()."""
|
|
65
|
-
dependency_information = _get_dependency_information(long_=True)
|
|
66
|
-
dependency_information_keys = list(dependency_information.keys())
|
|
67
71
|
dependency_list = [
|
|
72
|
+
"aenum",
|
|
68
73
|
"click",
|
|
69
74
|
"numpy",
|
|
70
75
|
"scipy",
|
|
@@ -77,8 +82,20 @@ def test_get_dependency_information_long() -> None:
|
|
|
77
82
|
"tqdm",
|
|
78
83
|
"templateflow",
|
|
79
84
|
"lapy",
|
|
85
|
+
"h5py",
|
|
86
|
+
"h5io",
|
|
80
87
|
"lazy_loader",
|
|
88
|
+
"looseversion",
|
|
89
|
+
"junifer_data",
|
|
90
|
+
"structlog",
|
|
91
|
+
"pydantic",
|
|
92
|
+
"typing_extensions",
|
|
81
93
|
]
|
|
94
|
+
# Import dependencies as only loaded modules are reported
|
|
95
|
+
for module in dependency_list:
|
|
96
|
+
importlib.import_module(module)
|
|
97
|
+
dependency_information = _get_dependency_information(long_=True)
|
|
98
|
+
dependency_information_keys = list(dependency_information.keys())
|
|
82
99
|
for key in dependency_list:
|
|
83
100
|
assert key in dependency_information_keys
|
|
84
101
|
|
junifer/cli/utils.py
CHANGED
|
@@ -70,18 +70,23 @@ def _get_dependency_information(long_: bool) -> dict[str, str]:
|
|
|
70
70
|
# Get dependencies for junifer
|
|
71
71
|
dist = distribution("junifer")
|
|
72
72
|
# Compile regex pattern
|
|
73
|
-
re_pattern = re.compile("[
|
|
74
|
-
|
|
75
|
-
for
|
|
76
|
-
#
|
|
77
|
-
|
|
73
|
+
re_pattern = re.compile(r"^\s*([A-Za-z0-9][A-Za-z0-9._-]*)")
|
|
74
|
+
|
|
75
|
+
for requirement in dist.requires: # type: ignore
|
|
76
|
+
# Split requirement and environment marker
|
|
77
|
+
pkg_with_version, _, marker = requirement.partition(";")
|
|
78
|
+
# Skip optional dependencies
|
|
79
|
+
if "extra" in marker:
|
|
80
|
+
continue
|
|
78
81
|
# Extract package name
|
|
79
|
-
|
|
82
|
+
match = re_pattern.match(pkg_with_version)
|
|
83
|
+
if match is None:
|
|
84
|
+
continue
|
|
85
|
+
# Convert distribution name to module name
|
|
86
|
+
key = match.group(1).replace("-", "_")
|
|
80
87
|
|
|
81
88
|
if key in dependency_versions.keys():
|
|
82
|
-
|
|
83
|
-
if "extra" not in matches:
|
|
84
|
-
pruned_dependency_versions[key] = dependency_versions[key]
|
|
89
|
+
pruned_dependency_versions[key] = dependency_versions[key]
|
|
85
90
|
|
|
86
91
|
return pruned_dependency_versions
|
|
87
92
|
|
junifer/configs/__init__.py
CHANGED
|
File without changes
|
|
@@ -2,12 +2,14 @@ __all__ = [
|
|
|
2
2
|
"JuselessDataladAOMICID1000VBM",
|
|
3
3
|
"JuselessDataladCamCANVBM",
|
|
4
4
|
"JuselessDataladIXIVBM",
|
|
5
|
+
"IXISite",
|
|
5
6
|
"JuselessUCLA",
|
|
7
|
+
"UCLATask",
|
|
6
8
|
"JuselessDataladUKBVBM",
|
|
7
9
|
]
|
|
8
10
|
|
|
9
11
|
from .aomic_id1000_vbm import JuselessDataladAOMICID1000VBM
|
|
10
12
|
from .camcan_vbm import JuselessDataladCamCANVBM
|
|
11
|
-
from .ixi_vbm import JuselessDataladIXIVBM
|
|
12
|
-
from .ucla import JuselessUCLA
|
|
13
|
+
from .ixi_vbm import JuselessDataladIXIVBM, IXISite
|
|
14
|
+
from .ucla import JuselessUCLA, UCLATask
|
|
13
15
|
from .ukb_vbm import JuselessDataladUKBVBM
|
|
@@ -4,11 +4,13 @@
|
|
|
4
4
|
# Synchon Mandal <s.mandal@fz-juelich.de>
|
|
5
5
|
# License: AGPL
|
|
6
6
|
|
|
7
|
-
from
|
|
8
|
-
|
|
7
|
+
from typing import Literal
|
|
8
|
+
|
|
9
|
+
from pydantic import AnyUrl
|
|
9
10
|
|
|
10
11
|
from ....api.decorators import register_datagrabber
|
|
11
|
-
from ....datagrabber import PatternDataladDataGrabber
|
|
12
|
+
from ....datagrabber import DataType, PatternDataladDataGrabber
|
|
13
|
+
from ....typing import DataGrabberPatterns
|
|
12
14
|
|
|
13
15
|
|
|
14
16
|
__all__ = ["JuselessDataladAOMICID1000VBM"]
|
|
@@ -22,27 +24,19 @@ class JuselessDataladAOMICID1000VBM(PatternDataladDataGrabber):
|
|
|
22
24
|
|
|
23
25
|
Parameters
|
|
24
26
|
----------
|
|
25
|
-
datadir :
|
|
26
|
-
|
|
27
|
-
the datalad dataset will be cloned into a temporary
|
|
28
|
-
|
|
27
|
+
datadir : pathlib.Path, optional
|
|
28
|
+
That path where the datalad dataset will be cloned.
|
|
29
|
+
If not specified, the datalad dataset will be cloned into a temporary
|
|
30
|
+
directory.
|
|
29
31
|
|
|
30
32
|
"""
|
|
31
33
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
super().__init__(
|
|
43
|
-
types=types,
|
|
44
|
-
datadir=datadir,
|
|
45
|
-
uri=uri,
|
|
46
|
-
replacements=replacements,
|
|
47
|
-
patterns=patterns,
|
|
48
|
-
)
|
|
34
|
+
uri: AnyUrl = AnyUrl("https://gin.g-node.org/felixh/ds003097_ReproVBM")
|
|
35
|
+
types: list[Literal[DataType.VBM_GM]] = [DataType.VBM_GM] # noqa: RUF012
|
|
36
|
+
patterns: DataGrabberPatterns = { # noqa: RUF012
|
|
37
|
+
"VBM_GM": {
|
|
38
|
+
"pattern": ("{subject}/mri/mwp1{subject}_run-2_T1w.nii.gz"),
|
|
39
|
+
"space": "IXI549Space",
|
|
40
|
+
},
|
|
41
|
+
}
|
|
42
|
+
replacements: list[str] = ["subject"] # noqa: RUF012
|
|
@@ -5,11 +5,13 @@
|
|
|
5
5
|
# Synchon Mandal <s.mandal@fz-juelich.de>
|
|
6
6
|
# License: AGPL
|
|
7
7
|
|
|
8
|
-
from
|
|
9
|
-
|
|
8
|
+
from typing import Literal
|
|
9
|
+
|
|
10
|
+
from pydantic import AnyUrl
|
|
10
11
|
|
|
11
12
|
from ....api.decorators import register_datagrabber
|
|
12
|
-
from ....datagrabber import PatternDataladDataGrabber
|
|
13
|
+
from ....datagrabber import DataType, PatternDataladDataGrabber
|
|
14
|
+
from ....typing import DataGrabberPatterns
|
|
13
15
|
|
|
14
16
|
|
|
15
17
|
__all__ = ["JuselessDataladCamCANVBM"]
|
|
@@ -23,30 +25,21 @@ class JuselessDataladCamCANVBM(PatternDataladDataGrabber):
|
|
|
23
25
|
|
|
24
26
|
Parameters
|
|
25
27
|
----------
|
|
26
|
-
datadir :
|
|
27
|
-
|
|
28
|
-
the datalad dataset will be cloned into a temporary
|
|
29
|
-
|
|
28
|
+
datadir : pathlib.Path, optional
|
|
29
|
+
That path where the datalad dataset will be cloned.
|
|
30
|
+
If not specified, the datalad dataset will be cloned into a temporary
|
|
31
|
+
directory.
|
|
30
32
|
|
|
31
33
|
"""
|
|
32
34
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
},
|
|
45
|
-
}
|
|
46
|
-
super().__init__(
|
|
47
|
-
types=types,
|
|
48
|
-
datadir=datadir,
|
|
49
|
-
uri=uri,
|
|
50
|
-
replacements=replacements,
|
|
51
|
-
patterns=patterns,
|
|
52
|
-
)
|
|
35
|
+
uri: AnyUrl = AnyUrl(
|
|
36
|
+
"ria+http://cat_12.5.ds.inm7.de#a139b26a-8406-11ea-8f94-a0369f287950"
|
|
37
|
+
)
|
|
38
|
+
types: list[Literal[DataType.VBM_GM]] = [DataType.VBM_GM] # noqa: RUF012
|
|
39
|
+
patterns: DataGrabberPatterns = { # noqa: RUF012
|
|
40
|
+
"VBM_GM": {
|
|
41
|
+
"pattern": "{subject}/mri/m0wp1{subject}.nii.gz",
|
|
42
|
+
"space": "IXI549Space",
|
|
43
|
+
},
|
|
44
|
+
}
|
|
45
|
+
replacements: list[str] = ["subject"] # noqa: RUF012
|
|
@@ -5,15 +5,29 @@
|
|
|
5
5
|
# Synchon Mandal <s.mandal@fz-juelich.de>
|
|
6
6
|
# License: AGPL
|
|
7
7
|
|
|
8
|
-
from
|
|
9
|
-
from typing import
|
|
8
|
+
from enum import StrEnum
|
|
9
|
+
from typing import Annotated, ClassVar, Literal
|
|
10
|
+
|
|
11
|
+
from pydantic import AnyUrl, BeforeValidator
|
|
10
12
|
|
|
11
13
|
from ....api.decorators import register_datagrabber
|
|
12
|
-
from ....datagrabber import PatternDataladDataGrabber
|
|
13
|
-
from ....
|
|
14
|
+
from ....datagrabber import DataType, PatternDataladDataGrabber
|
|
15
|
+
from ....typing import DataGrabberPatterns
|
|
16
|
+
from ....utils import ensure_list
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
__all__ = ["IXISite", "JuselessDataladIXIVBM"]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class IXISite(StrEnum):
|
|
23
|
+
"""Accepted IXI sites."""
|
|
24
|
+
|
|
25
|
+
Guys = "Guys"
|
|
26
|
+
HH = "HH"
|
|
27
|
+
IOP = "IOP"
|
|
14
28
|
|
|
15
29
|
|
|
16
|
-
|
|
30
|
+
_sites = Literal[IXISite.Guys, IXISite.HH, IXISite.IOP]
|
|
17
31
|
|
|
18
32
|
|
|
19
33
|
@register_datagrabber
|
|
@@ -24,53 +38,31 @@ class JuselessDataladIXIVBM(PatternDataladDataGrabber):
|
|
|
24
38
|
|
|
25
39
|
Parameters
|
|
26
40
|
----------
|
|
27
|
-
datadir :
|
|
28
|
-
|
|
29
|
-
the datalad dataset will be cloned into a temporary
|
|
30
|
-
|
|
31
|
-
sites : {"Guys", "HH", "IOP"} or list of the options
|
|
32
|
-
|
|
33
|
-
|
|
41
|
+
datadir : pathlib.Path, optional
|
|
42
|
+
That path where the datalad dataset will be cloned.
|
|
43
|
+
If not specified, the datalad dataset will be cloned into a temporary
|
|
44
|
+
directory.
|
|
45
|
+
sites : {"Guys", "HH", "IOP"} or list of the options, optional
|
|
46
|
+
IXI sites.
|
|
47
|
+
By default, all available sites are selected.
|
|
34
48
|
|
|
35
49
|
"""
|
|
36
50
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
# validate and/or transform 'site' input
|
|
56
|
-
all_sites = ["HH", "Guys", "IOP"]
|
|
57
|
-
if sites is None:
|
|
58
|
-
sites = all_sites
|
|
59
|
-
|
|
60
|
-
if isinstance(sites, str):
|
|
61
|
-
sites = [sites]
|
|
62
|
-
|
|
63
|
-
for s in sites:
|
|
64
|
-
if s not in all_sites:
|
|
65
|
-
raise_error(
|
|
66
|
-
f"{s} not a valid site in IXI VBM dataset!"
|
|
67
|
-
f"Available sites are {all_sites}"
|
|
68
|
-
)
|
|
69
|
-
self.sites = sites
|
|
70
|
-
super().__init__(
|
|
71
|
-
types=types,
|
|
72
|
-
datadir=datadir,
|
|
73
|
-
uri=uri,
|
|
74
|
-
replacements=replacements,
|
|
75
|
-
patterns=patterns,
|
|
76
|
-
)
|
|
51
|
+
uri: AnyUrl = AnyUrl(
|
|
52
|
+
"ria+http://cat_12.5.ds.inm7.de#b7107c52-8408-11ea-89c6-a0369f287950"
|
|
53
|
+
)
|
|
54
|
+
types: list[Literal[DataType.VBM_GM]] = [DataType.VBM_GM] # noqa: RUF012
|
|
55
|
+
sites: ClassVar[
|
|
56
|
+
Annotated[IXISite | list[IXISite], BeforeValidator(ensure_list)]
|
|
57
|
+
] = [
|
|
58
|
+
IXISite.Guys,
|
|
59
|
+
IXISite.HH,
|
|
60
|
+
IXISite.IOP,
|
|
61
|
+
]
|
|
62
|
+
patterns: DataGrabberPatterns = { # noqa: RUF012
|
|
63
|
+
"VBM_GM": {
|
|
64
|
+
"pattern": ("{site}/{subject}/mri/m0wp1{subject}.nii.gz"),
|
|
65
|
+
"space": "IXI549Space",
|
|
66
|
+
},
|
|
67
|
+
}
|
|
68
|
+
replacements: list[str] = ["site", "subject"] # noqa: RUF012
|
|
@@ -31,10 +31,3 @@ def test_JuselessDataladIXIVBM() -> None:
|
|
|
31
31
|
out["VBM_GM"]["path"].name == f"m0wp1sub-{test_element[1]}.nii.gz"
|
|
32
32
|
)
|
|
33
33
|
assert out["VBM_GM"]["path"].exists()
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def test_JuselessDataladIXIVBM_invalid_site() -> None:
|
|
37
|
-
"""Test JuselessDataladIXIVBM with invalid site."""
|
|
38
|
-
with pytest.raises(ValueError, match="notavalidsite not a valid site"):
|
|
39
|
-
with JuselessDataladIXIVBM(sites="notavalidsite"):
|
|
40
|
-
pass
|
|
@@ -6,7 +6,6 @@
|
|
|
6
6
|
# License: AGPL
|
|
7
7
|
|
|
8
8
|
import socket
|
|
9
|
-
from typing import Optional, Union
|
|
10
9
|
|
|
11
10
|
import pytest
|
|
12
11
|
|
|
@@ -53,7 +52,7 @@ def test_JuselessUCLA() -> None:
|
|
|
53
52
|
],
|
|
54
53
|
)
|
|
55
54
|
def test_JuselessUCLA_partial_data_access(
|
|
56
|
-
types:
|
|
55
|
+
types: str | list[str],
|
|
57
56
|
) -> None:
|
|
58
57
|
"""Test JuselessUCLA DataGrabber partial data access.
|
|
59
58
|
|
|
@@ -80,19 +79,11 @@ def test_JuselessUCLA_partial_data_access(
|
|
|
80
79
|
assert types in out
|
|
81
80
|
|
|
82
81
|
|
|
83
|
-
def test_JuselessUCLA_incorrect_data_type() -> None:
|
|
84
|
-
"""Test JuselessUCLA DataGrabber incorrect data type."""
|
|
85
|
-
with pytest.raises(
|
|
86
|
-
ValueError, match="`patterns` must contain all `types`"
|
|
87
|
-
):
|
|
88
|
-
_ = JuselessUCLA(types="Eunomia")
|
|
89
|
-
|
|
90
|
-
|
|
91
82
|
@pytest.mark.parametrize(
|
|
92
83
|
"tasks",
|
|
93
84
|
[None, "rest", ["rest", "stopsignal"]],
|
|
94
85
|
)
|
|
95
|
-
def test_JuselessUCLA_task_params(tasks:
|
|
86
|
+
def test_JuselessUCLA_task_params(tasks: str | None) -> None:
|
|
96
87
|
"""Test JuselessUCLA with different task parameters.
|
|
97
88
|
|
|
98
89
|
Parameters
|
|
@@ -125,11 +116,3 @@ def test_JuselessUCLA_task_params(tasks: Optional[str]) -> None:
|
|
|
125
116
|
else:
|
|
126
117
|
for el in all_elements:
|
|
127
118
|
assert el[1] in ["rest", "stopsignal"]
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def test_JuselessUCLA_invalid_tasks() -> None:
|
|
131
|
-
"""Test JuselessUCLA with invalid task parameters."""
|
|
132
|
-
with pytest.raises(
|
|
133
|
-
ValueError, match="invalid is not a valid task in the UCLA"
|
|
134
|
-
):
|
|
135
|
-
JuselessUCLA(tasks="invalid")
|