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
@@ -6,11 +6,17 @@
6
6
  import shutil
7
7
  import textwrap
8
8
  from pathlib import Path
9
- from typing import Optional
9
+ from typing import Any
10
10
 
11
11
  from ...typing import Elements
12
- from ...utils import logger, make_executable, raise_error, run_ext_cmd
13
- from .queue_context_adapter import QueueContextAdapter
12
+ from ...utils import make_executable, raise_error, run_ext_cmd
13
+ from .queue_context_adapter import (
14
+ EnvKind,
15
+ EnvShell,
16
+ QueueContextAdapter,
17
+ QueueContextEnv,
18
+ logger,
19
+ )
14
20
 
15
21
 
16
22
  __all__ = ["GnuParallelLocalAdapter"]
@@ -27,14 +33,14 @@ class GnuParallelLocalAdapter(QueueContextAdapter):
27
33
  The path to the job directory.
28
34
  yaml_config_path : pathlib.Path
29
35
  The path to the YAML config file.
30
- elements : list of str or tuple
36
+ elements : ``Elements``
31
37
  Element(s) to process. Will be used to index the DataGrabber.
32
38
  pre_run : str or None, optional
33
39
  Extra shell commands to source before the run (default None).
34
40
  pre_collect : str or None, optional
35
- Extra bash commands to source before the collect (default None).
36
- env : dict, optional
37
- The Python environment configuration. If None, will run without a
41
+ Extra shell commands to source before the collect (default None).
42
+ env : :class:`.QueueContextEnv` or None, optional
43
+ The environment configuration. If None, will run without a
38
44
  virtual environment of any kind (default None).
39
45
  verbose : str, optional
40
46
  The level of verbosity (default "info").
@@ -44,12 +50,6 @@ class GnuParallelLocalAdapter(QueueContextAdapter):
44
50
  submit : bool, optional
45
51
  Whether to submit the jobs (default False).
46
52
 
47
- Raises
48
- ------
49
- ValueError
50
- If ``env.kind`` is invalid or
51
- if ``env.shell`` is invalid.
52
-
53
53
  See Also
54
54
  --------
55
55
  QueueContextAdapter :
@@ -59,87 +59,44 @@ class GnuParallelLocalAdapter(QueueContextAdapter):
59
59
 
60
60
  """
61
61
 
62
- def __init__(
63
- self,
64
- job_name: str,
65
- job_dir: Path,
66
- yaml_config_path: Path,
67
- elements: Elements,
68
- pre_run: Optional[str] = None,
69
- pre_collect: Optional[str] = None,
70
- env: Optional[dict[str, str]] = None,
71
- verbose: str = "info",
72
- verbose_datalad: Optional[str] = None,
73
- submit: bool = False,
74
- ) -> None:
75
- """Initialize the class."""
76
- self._job_name = job_name
77
- self._job_dir = job_dir
78
- self._yaml_config_path = yaml_config_path
79
- self._elements = elements
80
- self._pre_run = pre_run
81
- self._pre_collect = pre_collect
82
- self._check_env(env)
83
- self._verbose = verbose
84
- self._verbose_datalad = verbose_datalad
85
- self._submit = submit
86
-
87
- self._log_dir = self._job_dir / "logs"
88
- self._pre_run_path = self._job_dir / "pre_run.sh"
89
- self._pre_collect_path = self._job_dir / "pre_collect.sh"
90
- self._run_path = self._job_dir / f"run_{self._job_name}.sh"
91
- self._collect_path = self._job_dir / f"collect_{self._job_name}.sh"
92
- self._run_joblog_path = self._job_dir / f"run_{self._job_name}_joblog"
93
- self._elements_file_path = self._job_dir / "elements"
94
-
95
- def _check_env(self, env: Optional[dict[str, str]]) -> None:
96
- """Check value of env parameter on init.
97
-
98
- Parameters
99
- ----------
100
- env : dict or None
101
- The value of env parameter.
102
-
103
- Raises
104
- ------
105
- ValueError
106
- If ``env.kind`` is invalid.
107
-
108
- """
109
- # Set env related variables
110
- if env is None:
111
- env = {"kind": "local"}
112
- # Check env kind
113
- valid_env_kinds = ["conda", "venv", "local"]
114
- if env["kind"] not in valid_env_kinds:
115
- raise_error(
116
- f"Invalid value for `env.kind`: {env['kind']}, "
117
- f"must be one of {valid_env_kinds}"
62
+ job_name: str
63
+ job_dir: Path
64
+ yaml_config_path: Path
65
+ elements: Elements
66
+ pre_run: str | None = None
67
+ pre_collect: str | None = None
68
+ env: QueueContextEnv | None = None
69
+ verbose: str = "info"
70
+ verbose_datalad: str | None = None
71
+ submit: bool = False
72
+
73
+ def model_post_init(self, context: Any): # noqa: D102
74
+ if self.env is None:
75
+ self.env = QueueContextEnv(
76
+ kind=EnvKind.Local, shell=EnvShell.Bash, name=""
118
77
  )
78
+ if self.env["kind"] == EnvKind.Local:
79
+ # No virtual environment
80
+ self._executable = "junifer"
81
+ self._arguments = ""
119
82
  else:
120
- # Check shell
121
- shell = env.get("shell", "bash")
122
- valid_shells = ["bash", "zsh"]
123
- if shell not in valid_shells:
124
- raise_error(
125
- f"Invalid value for `env.shell`: {shell}, "
126
- f"must be one of {valid_shells}"
127
- )
128
- self._shell = shell
129
- # Set variables
130
- if env["kind"] == "local":
131
- # No virtual environment
132
- self._executable = "junifer"
133
- self._arguments = ""
134
- else:
135
- self._executable = f"run_{env['kind']}.{self._shell}"
136
- self._arguments = f"{env['name']} junifer"
137
- self._exec_path = self._job_dir / self._executable
138
-
139
- def elements(self) -> str:
83
+ if self.env["name"] is None:
84
+ raise_error("`env.name` is required")
85
+ self._executable = f"run_{self.env['kind']}.{self.env['shell']}"
86
+ self._arguments = f"{self.env['name']} junifer"
87
+ self._exec_path = self.job_dir / self._executable
88
+ self._log_dir = self.job_dir / "logs"
89
+ self._pre_run_path = self.job_dir / "pre_run.sh"
90
+ self._pre_collect_path = self.job_dir / "pre_collect.sh"
91
+ self._run_path = self.job_dir / f"run_{self.job_name}.sh"
92
+ self._collect_path = self.job_dir / f"collect_{self.job_name}.sh"
93
+ self._run_joblog_path = self.job_dir / f"run_{self.job_name}_joblog"
94
+ self._elements_file_path = self.job_dir / "elements"
95
+
96
+ def elements_to_run(self) -> str:
140
97
  """Return elements to run."""
141
98
  elements_to_run = []
142
- for element in self._elements:
99
+ for element in self.elements:
143
100
  # Stringify elements if tuple for operation
144
101
  str_element = (
145
102
  ",".join(element) if isinstance(element, tuple) else element
@@ -148,26 +105,26 @@ class GnuParallelLocalAdapter(QueueContextAdapter):
148
105
 
149
106
  return "\n".join(elements_to_run)
150
107
 
151
- def pre_run(self) -> str:
108
+ def pre_run_cmds(self) -> str:
152
109
  """Return pre-run commands."""
153
110
  fixed = (
154
- f"#!/usr/bin/env {self._shell}\n\n"
111
+ f"#!/usr/bin/env {self.env['shell']}\n\n"
155
112
  "# This script is auto-generated by junifer.\n\n"
156
113
  "# Force datalad to run in non-interactive mode\n"
157
114
  "DATALAD_UI_INTERACTIVE=false\n"
158
115
  )
159
- var = self._pre_run or ""
116
+ var = self.pre_run or ""
160
117
  return fixed + "\n" + var
161
118
 
162
- def run(self) -> str:
119
+ def run_cmds(self) -> str:
163
120
  """Return run commands."""
164
- verbose_args = f"--verbose {self._verbose}"
165
- if self._verbose_datalad:
121
+ verbose_args = f"--verbose {self.verbose}"
122
+ if self.verbose_datalad:
166
123
  verbose_args = (
167
- f"{verbose_args} --verbose-datalad {self._verbose_datalad}"
124
+ f"{verbose_args} --verbose-datalad {self.verbose_datalad}"
168
125
  )
169
126
  return (
170
- f"#!/usr/bin/env {self._shell}\n\n"
127
+ f"#!/usr/bin/env {self.env['shell']}\n\n"
171
128
  "# This script is auto-generated by junifer.\n\n"
172
129
  "# Run pre_run.sh\n"
173
130
  f"sh {self._pre_run_path.resolve()!s}\n\n"
@@ -177,38 +134,38 @@ class GnuParallelLocalAdapter(QueueContextAdapter):
177
134
  "--delay 60 " # wait 1 min before next job is spawned
178
135
  f"--results {self._log_dir} "
179
136
  f"--arg-file {self._elements_file_path.resolve()!s} "
180
- f"{self._job_dir.resolve()!s}/{self._executable} "
137
+ f"{self.job_dir.resolve()!s}/{self._executable} "
181
138
  f"{self._arguments} run "
182
- f"{self._yaml_config_path.resolve()!s} "
139
+ f"{self.yaml_config_path.resolve()!s} "
183
140
  f"{verbose_args} "
184
141
  f"--element"
185
142
  )
186
143
 
187
- def pre_collect(self) -> str:
144
+ def pre_collect_cmds(self) -> str:
188
145
  """Return pre-collect commands."""
189
146
  fixed = (
190
- f"#!/usr/bin/env {self._shell}\n\n"
147
+ f"#!/usr/bin/env {self.env['shell']}\n\n"
191
148
  "# This script is auto-generated by junifer.\n"
192
149
  )
193
- var = self._pre_collect or ""
150
+ var = self.pre_collect or ""
194
151
  return fixed + "\n" + var
195
152
 
196
- def collect(self) -> str:
153
+ def collect_cmds(self) -> str:
197
154
  """Return collect commands."""
198
- verbose_args = f"--verbose {self._verbose}"
199
- if self._verbose_datalad:
155
+ verbose_args = f"--verbose {self.verbose}"
156
+ if self.verbose_datalad:
200
157
  verbose_args = (
201
- f"{verbose_args} --verbose-datalad {self._verbose_datalad}"
158
+ f"{verbose_args} --verbose-datalad {self.verbose_datalad}"
202
159
  )
203
160
  return (
204
- f"#!/usr/bin/env {self._shell}\n\n"
161
+ f"#!/usr/bin/env {self.env['shell']}\n\n"
205
162
  "# This script is auto-generated by junifer.\n\n"
206
163
  "# Run pre_collect.sh\n"
207
164
  f"sh {self._pre_collect_path.resolve()!s}\n\n"
208
165
  "# Run `junifer collect`\n"
209
- f"{self._job_dir.resolve()!s}/{self._executable} "
166
+ f"{self.job_dir.resolve()!s}/{self._executable} "
210
167
  f"{self._arguments} collect "
211
- f"{self._yaml_config_path.resolve()!s} "
168
+ f"{self.yaml_config_path.resolve()!s} "
212
169
  f"{verbose_args}"
213
170
  )
214
171
 
@@ -231,40 +188,44 @@ class GnuParallelLocalAdapter(QueueContextAdapter):
231
188
  f"{self._elements_file_path.resolve()!s}"
232
189
  )
233
190
  self._elements_file_path.touch()
234
- self._elements_file_path.write_text(textwrap.dedent(self.elements()))
191
+ self._elements_file_path.write_text(
192
+ textwrap.dedent(self.elements_to_run())
193
+ )
235
194
  # Create pre run
236
195
  logger.info(
237
- f"Writing {self._pre_run_path.name} to {self._job_dir.resolve()!s}"
196
+ f"Writing {self._pre_run_path.name} to {self.job_dir.resolve()!s}"
238
197
  )
239
198
  self._pre_run_path.touch()
240
- self._pre_run_path.write_text(textwrap.dedent(self.pre_run()))
199
+ self._pre_run_path.write_text(textwrap.dedent(self.pre_run_cmds()))
241
200
  make_executable(self._pre_run_path)
242
201
  # Create run
243
202
  logger.info(
244
- f"Writing {self._run_path.name} to {self._job_dir.resolve()!s}"
203
+ f"Writing {self._run_path.name} to {self.job_dir.resolve()!s}"
245
204
  )
246
205
  self._run_path.touch()
247
- self._run_path.write_text(textwrap.dedent(self.run()))
206
+ self._run_path.write_text(textwrap.dedent(self.run_cmds()))
248
207
  make_executable(self._run_path)
249
208
  # Create pre collect
250
209
  logger.info(
251
210
  f"Writing {self._pre_collect_path.name} to "
252
- f"{self._job_dir.resolve()!s}"
211
+ f"{self.job_dir.resolve()!s}"
253
212
  )
254
213
  self._pre_collect_path.touch()
255
- self._pre_collect_path.write_text(textwrap.dedent(self.pre_collect()))
214
+ self._pre_collect_path.write_text(
215
+ textwrap.dedent(self.pre_collect_cmds())
216
+ )
256
217
  make_executable(self._pre_collect_path)
257
218
  # Create collect
258
219
  logger.info(
259
- f"Writing {self._collect_path.name} to {self._job_dir.resolve()!s}"
220
+ f"Writing {self._collect_path.name} to {self.job_dir.resolve()!s}"
260
221
  )
261
222
  self._collect_path.touch()
262
- self._collect_path.write_text(textwrap.dedent(self.collect()))
223
+ self._collect_path.write_text(textwrap.dedent(self.collect_cmds()))
263
224
  make_executable(self._collect_path)
264
225
  # Submit if required
265
226
  run_cmd = f"sh {self._run_path.resolve()!s}"
266
227
  collect_cmd = f"sh {self._collect_path.resolve()!s}"
267
- if self._submit:
228
+ if self.submit:
268
229
  logger.info(
269
230
  "Shell scripts created, the following will be run:\n"
270
231
  f"{run_cmd}\n"