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.
Files changed (293) hide show
  1. junifer/_version.py +9 -19
  2. junifer/api/__init__.pyi +17 -2
  3. junifer/api/functions.py +222 -39
  4. junifer/api/queue_context/__init__.pyi +11 -3
  5. junifer/api/queue_context/gnu_parallel_local_adapter.py +81 -120
  6. junifer/api/queue_context/htcondor_adapter.py +118 -181
  7. junifer/api/queue_context/queue_context_adapter.py +51 -7
  8. junifer/api/queue_context/tests/test_gnu_parallel_local_adapter.py +10 -35
  9. junifer/api/queue_context/tests/test_htcondor_adapter.py +13 -50
  10. junifer/api/res/fsl/run_fsl_docker.sh +4 -0
  11. junifer/api/tests/test_functions.py +863 -36
  12. junifer/cli/__init__.py +1 -7
  13. junifer/cli/cli.py +41 -22
  14. junifer/cli/parser.py +23 -147
  15. junifer/cli/tests/data/gmd_mean.yaml +6 -6
  16. junifer/cli/tests/data/gmd_mean_htcondor.yaml +6 -5
  17. junifer/cli/tests/data/partly_cloudy_agg_mean_tian.yml +1 -0
  18. junifer/cli/tests/test_cli.py +120 -4
  19. junifer/cli/tests/test_cli_utils.py +23 -6
  20. junifer/cli/utils.py +14 -9
  21. junifer/configs/__init__.py +5 -0
  22. junifer/configs/__init__.pyi +0 -0
  23. junifer/configs/juseless/datagrabbers/__init__.pyi +4 -2
  24. junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py +18 -24
  25. junifer/configs/juseless/datagrabbers/camcan_vbm.py +20 -27
  26. junifer/configs/juseless/datagrabbers/ixi_vbm.py +44 -52
  27. junifer/configs/juseless/datagrabbers/tests/test_ixi_vbm.py +0 -7
  28. junifer/configs/juseless/datagrabbers/tests/test_ucla.py +2 -19
  29. junifer/configs/juseless/datagrabbers/ucla.py +111 -104
  30. junifer/configs/juseless/datagrabbers/ukb_vbm.py +19 -25
  31. junifer/configs/py.typed +0 -0
  32. junifer/conftest.py +63 -24
  33. junifer/data/_dispatch.py +9 -19
  34. junifer/data/coordinates/_ants_coordinates_warper.py +4 -1
  35. junifer/data/coordinates/_coordinates.py +51 -6
  36. junifer/data/coordinates/_fsl_coordinates_warper.py +4 -1
  37. junifer/data/coordinates/tests/test_coordinates.py +15 -3
  38. junifer/data/coordinates/tests/test_coordinates_names.py +37 -0
  39. junifer/data/maps/_ants_maps_warper.py +18 -12
  40. junifer/data/maps/_fsl_maps_warper.py +7 -3
  41. junifer/data/maps/_maps.py +12 -8
  42. junifer/data/maps/tests/test_maps.py +13 -21
  43. junifer/data/masks/_ants_mask_warper.py +18 -12
  44. junifer/data/masks/_fsl_mask_warper.py +7 -3
  45. junifer/data/masks/_masks.py +15 -12
  46. junifer/data/masks/tests/test_masks.py +20 -17
  47. junifer/data/parcellations/_ants_parcellation_warper.py +18 -12
  48. junifer/data/parcellations/_fsl_parcellation_warper.py +7 -5
  49. junifer/data/parcellations/_parcellations.py +125 -91
  50. junifer/data/parcellations/tests/test_parcellations.py +122 -1
  51. junifer/data/template_spaces.py +117 -50
  52. junifer/data/tests/test_template_spaces.py +10 -7
  53. junifer/data/utils.py +10 -8
  54. junifer/datagrabber/__init__.pyi +38 -5
  55. junifer/datagrabber/aomic/__init__.pyi +8 -1
  56. junifer/datagrabber/aomic/_types.py +22 -0
  57. junifer/datagrabber/aomic/id1000.py +193 -183
  58. junifer/datagrabber/aomic/piop1.py +215 -259
  59. junifer/datagrabber/aomic/piop2.py +211 -244
  60. junifer/datagrabber/aomic/tests/test_id1000.py +70 -53
  61. junifer/datagrabber/aomic/tests/test_piop1.py +98 -102
  62. junifer/datagrabber/aomic/tests/test_piop2.py +88 -85
  63. junifer/datagrabber/base.py +253 -79
  64. junifer/datagrabber/datalad_base.py +127 -76
  65. junifer/datagrabber/dmcc13_benchmark.py +204 -289
  66. junifer/datagrabber/hcp1200/__init__.pyi +7 -2
  67. junifer/datagrabber/hcp1200/datalad_hcp1200.py +61 -40
  68. junifer/datagrabber/hcp1200/hcp1200.py +151 -164
  69. junifer/datagrabber/hcp1200/tests/test_hcp1200.py +116 -128
  70. junifer/datagrabber/multiple.py +183 -63
  71. junifer/datagrabber/pattern.py +358 -227
  72. junifer/datagrabber/pattern_datalad.py +84 -124
  73. junifer/datagrabber/pattern_validation_mixin.py +22 -50
  74. junifer/datagrabber/tests/test_base.py +17 -4
  75. junifer/datagrabber/tests/test_datalad_base.py +20 -27
  76. junifer/datagrabber/tests/test_dmcc13_benchmark.py +110 -122
  77. junifer/datagrabber/tests/test_multiple.py +293 -31
  78. junifer/datagrabber/tests/test_pattern.py +577 -18
  79. junifer/datagrabber/tests/test_pattern_datalad.py +177 -107
  80. junifer/datagrabber/tests/test_pattern_validation_mixin.py +9 -51
  81. junifer/datareader/default.py +8 -5
  82. junifer/datareader/tests/test_default_reader.py +1 -1
  83. junifer/external/BrainPrint/.codecov.yml +2 -0
  84. junifer/external/BrainPrint/.codespellignore +2 -0
  85. junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/bug-report.md +45 -0
  86. junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/documentation.md +12 -0
  87. junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/feature-request.md +24 -0
  88. junifer/external/BrainPrint/.github/ISSUE_TEMPLATE/questions-help-support.md +28 -0
  89. junifer/external/BrainPrint/.github/dependabot.yml +6 -0
  90. junifer/external/BrainPrint/.github/workflows/build.yml +53 -0
  91. junifer/external/BrainPrint/.github/workflows/code-style.yml +44 -0
  92. junifer/external/BrainPrint/.github/workflows/doc.yml +65 -0
  93. junifer/external/BrainPrint/.github/workflows/publish.yml +31 -0
  94. junifer/external/BrainPrint/.github/workflows/pytest.yml +54 -0
  95. junifer/external/BrainPrint/.gitignore +123 -0
  96. junifer/external/BrainPrint/LICENSE +21 -0
  97. junifer/external/BrainPrint/README.md +108 -0
  98. junifer/external/BrainPrint/brainprint/cli/__init__.py +11 -0
  99. junifer/external/BrainPrint/brainprint/cli/help_text.py +169 -0
  100. junifer/external/BrainPrint/brainprint/cli/parser.py +150 -0
  101. junifer/external/BrainPrint/brainprint/cli/utils.py +14 -0
  102. junifer/external/BrainPrint/brainprint/commands/__init__.py +0 -0
  103. junifer/external/BrainPrint/brainprint/commands/sys_info.py +18 -0
  104. junifer/external/BrainPrint/brainprint/utils/tests/__init__.py +0 -0
  105. junifer/external/BrainPrint/brainprint/utils/tests/test_config.py +33 -0
  106. junifer/external/BrainPrint/doc/Makefile +20 -0
  107. junifer/external/BrainPrint/doc/_static/.gitkeep +0 -0
  108. junifer/external/BrainPrint/doc/_templates/autosummary/class.rst +10 -0
  109. junifer/external/BrainPrint/doc/_templates/autosummary/function.rst +8 -0
  110. junifer/external/BrainPrint/doc/_templates/autosummary/module.rst +6 -0
  111. junifer/external/BrainPrint/doc/api/index.rst +11 -0
  112. junifer/external/BrainPrint/doc/conf.py +272 -0
  113. junifer/external/BrainPrint/doc/index.rst +140 -0
  114. junifer/external/BrainPrint/doc/links.inc +36 -0
  115. junifer/external/BrainPrint/doc/make.bat +35 -0
  116. junifer/external/BrainPrint/doc/references.bib +23 -0
  117. junifer/external/BrainPrint/pyproject.toml +170 -0
  118. junifer/external/BrainPrint/setup.py +3 -0
  119. junifer/external/__init__.py +5 -0
  120. junifer/external/__init__.pyi +0 -0
  121. junifer/external/nilearn/junifer_connectivity_measure.py +95 -39
  122. junifer/external/nilearn/junifer_nifti_spheres_masker.py +226 -67
  123. junifer/external/nilearn/tests/test_junifer_connectivity_measure.py +39 -27
  124. junifer/external/nilearn/tests/test_junifer_nifti_spheres_masker.py +231 -21
  125. junifer/external/py.typed +0 -0
  126. junifer/markers/__init__.pyi +6 -3
  127. junifer/markers/base.py +126 -76
  128. junifer/markers/brainprint.py +30 -39
  129. junifer/markers/complexity/__init__.py +20 -3
  130. junifer/markers/complexity/complexity_base.py +40 -41
  131. junifer/markers/complexity/hurst_exponent.py +22 -35
  132. junifer/markers/complexity/multiscale_entropy_auc.py +53 -41
  133. junifer/markers/complexity/perm_entropy.py +22 -36
  134. junifer/markers/complexity/range_entropy.py +22 -35
  135. junifer/markers/complexity/range_entropy_auc.py +27 -36
  136. junifer/markers/complexity/sample_entropy.py +22 -36
  137. junifer/markers/complexity/tests/test_complexity_registry.py +48 -0
  138. junifer/markers/complexity/tests/test_hurst_exponent.py +47 -36
  139. junifer/markers/complexity/tests/test_multiscale_entropy_auc.py +50 -36
  140. junifer/markers/complexity/tests/test_perm_entropy.py +48 -36
  141. junifer/markers/complexity/tests/test_range_entropy.py +47 -36
  142. junifer/markers/complexity/tests/test_range_entropy_auc.py +47 -36
  143. junifer/markers/complexity/tests/test_sample_entropy.py +48 -36
  144. junifer/markers/complexity/tests/test_weighted_perm_entropy.py +50 -36
  145. junifer/markers/complexity/weighted_perm_entropy.py +22 -36
  146. junifer/markers/ets_rss.py +35 -31
  147. junifer/markers/falff/__init__.pyi +7 -1
  148. junifer/markers/falff/_afni_falff.py +22 -9
  149. junifer/markers/falff/_junifer_falff.py +47 -31
  150. junifer/markers/falff/falff_base.py +80 -60
  151. junifer/markers/falff/falff_maps.py +17 -41
  152. junifer/markers/falff/falff_parcels.py +26 -51
  153. junifer/markers/falff/falff_spheres.py +34 -61
  154. junifer/markers/falff/tests/test_falff_maps.py +20 -23
  155. junifer/markers/falff/tests/test_falff_mask.py +99 -0
  156. junifer/markers/falff/tests/test_falff_parcels.py +14 -10
  157. junifer/markers/falff/tests/test_falff_spheres.py +14 -10
  158. junifer/markers/functional_connectivity/crossparcellation_functional_connectivity.py +32 -34
  159. junifer/markers/functional_connectivity/edge_functional_connectivity_maps.py +12 -25
  160. junifer/markers/functional_connectivity/edge_functional_connectivity_parcels.py +19 -34
  161. junifer/markers/functional_connectivity/edge_functional_connectivity_spheres.py +24 -44
  162. junifer/markers/functional_connectivity/functional_connectivity_base.py +50 -40
  163. junifer/markers/functional_connectivity/functional_connectivity_maps.py +12 -25
  164. junifer/markers/functional_connectivity/functional_connectivity_parcels.py +19 -34
  165. junifer/markers/functional_connectivity/functional_connectivity_spheres.py +24 -45
  166. junifer/markers/functional_connectivity/tests/test_crossparcellation_functional_connectivity.py +21 -22
  167. junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_maps.py +8 -7
  168. junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_parcels.py +8 -4
  169. junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_spheres.py +8 -4
  170. junifer/markers/functional_connectivity/tests/test_functional_connectivity_maps.py +8 -7
  171. junifer/markers/functional_connectivity/tests/test_functional_connectivity_parcels.py +9 -5
  172. junifer/markers/functional_connectivity/tests/test_functional_connectivity_spheres.py +8 -12
  173. junifer/markers/maps_aggregation.py +77 -55
  174. junifer/markers/parcel_aggregation.py +91 -70
  175. junifer/markers/reho/__init__.pyi +7 -1
  176. junifer/markers/reho/_afni_reho.py +23 -14
  177. junifer/markers/reho/_junifer_reho.py +112 -123
  178. junifer/markers/reho/reho_base.py +115 -37
  179. junifer/markers/reho/reho_maps.py +18 -32
  180. junifer/markers/reho/reho_parcels.py +26 -41
  181. junifer/markers/reho/reho_spheres.py +33 -54
  182. junifer/markers/reho/tests/test_junifer_reho.py +178 -0
  183. junifer/markers/reho/tests/test_reho_maps.py +27 -25
  184. junifer/markers/reho/tests/test_reho_parcels.py +28 -22
  185. junifer/markers/reho/tests/test_reho_spheres.py +16 -12
  186. junifer/markers/sphere_aggregation.py +88 -72
  187. junifer/markers/temporal_snr/temporal_snr_base.py +32 -30
  188. junifer/markers/temporal_snr/temporal_snr_maps.py +9 -18
  189. junifer/markers/temporal_snr/temporal_snr_parcels.py +19 -27
  190. junifer/markers/temporal_snr/temporal_snr_spheres.py +27 -41
  191. junifer/markers/temporal_snr/tests/test_temporal_snr_base.py +2 -2
  192. junifer/markers/temporal_snr/tests/test_temporal_snr_maps.py +17 -22
  193. junifer/markers/temporal_snr/tests/test_temporal_snr_parcels.py +11 -3
  194. junifer/markers/temporal_snr/tests/test_temporal_snr_spheres.py +9 -9
  195. junifer/markers/tests/test_brainprint.py +10 -9
  196. junifer/markers/tests/test_ets_rss.py +7 -3
  197. junifer/markers/tests/test_lost_regions.py +279 -0
  198. junifer/markers/tests/test_maps_aggregation.py +67 -114
  199. junifer/markers/tests/test_marker_utils.py +40 -1
  200. junifer/markers/tests/test_markers_base.py +275 -6
  201. junifer/markers/tests/test_parcel_aggregation.py +91 -53
  202. junifer/markers/tests/test_sphere_aggregation.py +53 -47
  203. junifer/markers/utils.py +267 -5
  204. junifer/onthefly/__init__.py +2 -3
  205. junifer/onthefly/__init__.pyi +4 -0
  206. junifer/onthefly/_brainprint.py +3 -5
  207. junifer/onthefly/py.typed +0 -0
  208. junifer/onthefly/read_transform.py +11 -9
  209. junifer/onthefly/tests/test_read_transform.py +7 -7
  210. junifer/pipeline/__init__.pyi +4 -2
  211. junifer/pipeline/marker_collection.py +14 -10
  212. junifer/pipeline/pipeline_component_registry.py +25 -6
  213. junifer/pipeline/pipeline_step_mixin.py +5 -12
  214. junifer/pipeline/tests/test_data_object_dumper.py +10 -10
  215. junifer/pipeline/tests/test_marker_collection.py +145 -168
  216. junifer/pipeline/tests/test_pipeline_component_registry.py +52 -8
  217. junifer/pipeline/tests/test_pipeline_step_mixin.py +12 -26
  218. junifer/pipeline/tests/test_update_meta_mixin.py +4 -5
  219. junifer/pipeline/tests/test_workdir_manager.py +39 -0
  220. junifer/pipeline/update_meta_mixin.py +13 -10
  221. junifer/pipeline/utils.py +22 -17
  222. junifer/pipeline/workdir_manager.py +41 -32
  223. junifer/preprocess/__init__.pyi +9 -4
  224. junifer/preprocess/_temporal_filter.py +34 -33
  225. junifer/preprocess/_temporal_slicer.py +17 -30
  226. junifer/preprocess/base.py +99 -55
  227. junifer/preprocess/confounds/__init__.pyi +10 -2
  228. junifer/preprocess/confounds/fmriprep_confound_remover.py +87 -109
  229. junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py +64 -45
  230. junifer/preprocess/smoothing/__init__.pyi +2 -2
  231. junifer/preprocess/smoothing/_afni_smoothing.py +8 -7
  232. junifer/preprocess/smoothing/_fsl_smoothing.py +6 -4
  233. junifer/preprocess/smoothing/_nilearn_smoothing.py +7 -5
  234. junifer/preprocess/smoothing/smoothing.py +59 -40
  235. junifer/preprocess/smoothing/tests/test_smoothing.py +28 -8
  236. junifer/preprocess/tests/test_preprocess_base.py +17 -9
  237. junifer/preprocess/tests/test_temporal_filter.py +37 -16
  238. junifer/preprocess/tests/test_temporal_slicer.py +12 -12
  239. junifer/preprocess/warping/__init__.pyi +2 -2
  240. junifer/preprocess/warping/_ants_warper.py +56 -40
  241. junifer/preprocess/warping/_fsl_warper.py +49 -36
  242. junifer/preprocess/warping/_utils.py +106 -0
  243. junifer/preprocess/warping/space_warper.py +99 -98
  244. junifer/preprocess/warping/tests/test_space_warper.py +46 -41
  245. junifer/preprocess/warping/tests/test_warping_utils.py +163 -0
  246. junifer/stats.py +46 -34
  247. junifer/storage/__init__.pyi +8 -4
  248. junifer/storage/base.py +129 -64
  249. junifer/storage/hdf5.py +307 -199
  250. junifer/storage/pandas_base.py +46 -24
  251. junifer/storage/sqlite.py +99 -62
  252. junifer/storage/tests/data/collected_h5io_fork.hdf5 +0 -0
  253. junifer/storage/tests/test_hdf5.py +147 -12
  254. junifer/storage/tests/test_repeated_storage.py +293 -0
  255. junifer/storage/tests/test_sqlite.py +9 -20
  256. junifer/storage/tests/test_storage_base.py +18 -21
  257. junifer/storage/tests/test_utils.py +83 -22
  258. junifer/storage/utils.py +58 -38
  259. junifer/testing/__init__.pyi +2 -2
  260. junifer/testing/datagrabbers.py +480 -44
  261. junifer/testing/registry.py +12 -0
  262. junifer/testing/tests/test_adhdtesting_datagrabber.py +24 -0
  263. junifer/testing/tests/test_oasisvmbtesting_datagrabber.py +5 -0
  264. junifer/testing/tests/test_partlycloudytesting_datagrabber.py +52 -0
  265. junifer/testing/tests/test_spmauditory_datagrabber.py +16 -0
  266. junifer/testing/tests/test_testing_registry.py +31 -0
  267. junifer/testing/tests/test_testing_utils.py +35 -0
  268. junifer/testing/tests/test_uclacnpvbmtesting_datagrabber.py +81 -0
  269. junifer/testing/utils.py +33 -1
  270. junifer/tests/test_stats.py +1 -5
  271. junifer/typing/__init__.pyi +2 -0
  272. junifer/typing/_typing.py +34 -19
  273. junifer/typing/py.typed +0 -0
  274. junifer/utils/__init__.pyi +10 -1
  275. junifer/utils/_config.py +1 -2
  276. junifer/utils/helpers.py +68 -2
  277. junifer/utils/logging.py +31 -7
  278. junifer/utils/tests/test_helpers.py +36 -1
  279. {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/METADATA +43 -35
  280. junifer-0.0.8.dist-info/RECORD +402 -0
  281. {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/WHEEL +1 -1
  282. junifer/cli/tests/test_parser.py +0 -280
  283. junifer/external/h5io/h5io/__init__.py +0 -15
  284. junifer/external/h5io/h5io/_h5io.py +0 -767
  285. junifer/external/h5io/h5io/_version.py +0 -1
  286. junifer/external/h5io/h5io/chunked_array.py +0 -94
  287. junifer/external/h5io/h5io/chunked_list.py +0 -65
  288. junifer/markers/complexity/__init__.pyi +0 -17
  289. junifer-0.0.7.dev332.dist-info/RECORD +0 -353
  290. {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/entry_points.txt +0 -0
  291. {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/licenses/AUTHORS.rst +0 -0
  292. {junifer-0.0.7.dev332.dist-info → junifer-0.0.8.dist-info}/licenses/LICENSE.md +0 -0
  293. {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
- if sys.version_info < (3, 11):
56
- dependency_list.append("importlib_metadata")
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("[a-z-_.]+")
74
-
75
- for pkg_with_version in dist.requires: # type: ignore
76
- # Perform regex search
77
- matches = re.findall(pattern=re_pattern, string=pkg_with_version)
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
- key = matches[0]
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
- # Check if pkg part of optional dependencies
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
 
@@ -2,3 +2,8 @@
2
2
 
3
3
  # Authors: Federico Raimondo <f.raimondo@fz-juelich.de>
4
4
  # License: AGPL
5
+
6
+ import lazy_loader as lazy
7
+
8
+
9
+ __getattr__, __dir__, __all__ = lazy.attach_stub(__name__, __file__)
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 pathlib import Path
8
- from typing import Union
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 : str or pathlib.Path or None, optional
26
- The directory where the datalad dataset will be cloned. If None,
27
- the datalad dataset will be cloned into a temporary directory
28
- (default None).
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
- def __init__(self, datadir: Union[str, Path, None] = None) -> None:
33
- uri = "https://gin.g-node.org/felixh/ds003097_ReproVBM"
34
- types = ["VBM_GM"]
35
- replacements = ["subject"]
36
- patterns = {
37
- "VBM_GM": {
38
- "pattern": ("{subject}/mri/mwp1{subject}_run-2_T1w.nii.gz"),
39
- "space": "IXI549Space",
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 pathlib import Path
9
- from typing import Union
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 : str or pathlib.Path or None, optional
27
- The directory where the datalad dataset will be cloned. If None,
28
- the datalad dataset will be cloned into a temporary directory
29
- (default None).
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
- def __init__(self, datadir: Union[str, Path, None] = None) -> None:
34
- uri = (
35
- "ria+http://cat_12.5.ds.inm7.de"
36
- "#a139b26a-8406-11ea-8f94-a0369f287950"
37
- )
38
- types = ["VBM_GM"]
39
- replacements = ["subject"]
40
- patterns = {
41
- "VBM_GM": {
42
- "pattern": "{subject}/mri/m0wp1{subject}.nii.gz",
43
- "space": "IXI549Space",
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 pathlib import Path
9
- from typing import Union
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 ....utils import raise_error
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
- __all__ = ["JuselessDataladIXIVBM"]
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 : str or pathlib.Path or None, optional
28
- The directory where the datalad dataset will be cloned. If None,
29
- the datalad dataset will be cloned into a temporary directory
30
- (default None).
31
- sites : {"Guys", "HH", "IOP"} or list of the options or None, optional
32
- Which sites to access data from. If None, all available sites are
33
- selected (default None).
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
- def __init__(
38
- self,
39
- datadir: Union[str, Path, None] = None,
40
- sites: Union[str, list[str], None] = None,
41
- ) -> None:
42
- uri = (
43
- "ria+http://cat_12.5.ds.inm7.de"
44
- "#b7107c52-8408-11ea-89c6-a0369f287950"
45
- )
46
- types = ["VBM_GM"]
47
- replacements = ["site", "subject"]
48
- patterns = {
49
- "VBM_GM": {
50
- "pattern": ("{site}/{subject}/mri/m0wp1{subject}.nii.gz"),
51
- "space": "IXI549Space",
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: Union[str, list[str]],
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: Optional[str]) -> None:
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")