junifer 0.0.7.dev111__tar.gz → 0.0.7.dev121__tar.gz

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 (463) hide show
  1. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/PKG-INFO +1 -1
  2. junifer-0.0.7.dev121/docs/changes/newsfragments/452.doc +1 -0
  3. junifer-0.0.7.dev121/docs/changes/newsfragments/452.feature +1 -0
  4. junifer-0.0.7.dev121/docs/extending/data_dump_asset.rst +46 -0
  5. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/index.rst +1 -0
  6. junifer-0.0.7.dev121/docs/using/configuring.rst +65 -0
  7. junifer-0.0.7.dev121/docs/using/dumping.rst +18 -0
  8. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/using/index.rst +2 -0
  9. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/_version.py +2 -2
  10. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/decorators.py +53 -1
  11. junifer-0.0.7.dev121/junifer/api/tests/test_decorators.py +78 -0
  12. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/__init__.pyi +10 -0
  13. junifer-0.0.7.dev121/junifer/pipeline/_data_object_dumper.py +347 -0
  14. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/marker_collection.py +41 -3
  15. junifer-0.0.7.dev121/junifer/pipeline/tests/test_data_object_dumper.py +225 -0
  16. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/typing/__init__.pyi +2 -0
  17. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/typing/_typing.py +2 -0
  18. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer.egg-info/PKG-INFO +1 -1
  19. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer.egg-info/SOURCES.txt +7 -0
  20. junifer-0.0.7.dev111/junifer/api/tests/test_decorators.py +0 -32
  21. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.dockerignore +0 -0
  22. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  23. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  24. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/ISSUE_TEMPLATE/dataset-request.yml +0 -0
  25. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/ISSUE_TEMPLATE/documention-request.yml +0 -0
  26. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
  27. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/ISSUE_TEMPLATE/marker-request.yml +0 -0
  28. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/dependabot.yml +0 -0
  29. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/pull_request_template.md +0 -0
  30. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/workflows/ci-docs.yml +0 -0
  31. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/workflows/ci.yml +0 -0
  32. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/workflows/docker-ci-publish.yml +0 -0
  33. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/workflows/docker-docs-publish.yml +0 -0
  34. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/workflows/docs-preview.yml +0 -0
  35. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/workflows/docs.yml +0 -0
  36. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/workflows/lint.yml +0 -0
  37. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.github/workflows/publish.yml +0 -0
  38. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.gitignore +0 -0
  39. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.gitmodules +0 -0
  40. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/.pre-commit-config.yaml +0 -0
  41. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/AUTHORS.rst +0 -0
  42. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/Dockerfile-ci +0 -0
  43. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/Dockerfile-docs +0 -0
  44. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/LICENSE.md +0 -0
  45. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/README.md +0 -0
  46. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/codecov.yml +0 -0
  47. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/conda-env.yml +0 -0
  48. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/Makefile +0 -0
  49. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/_static/css/custom.css +0 -0
  50. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/_static/js/custom.js +0 -0
  51. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/_templates/versions.html +0 -0
  52. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/api.rst +0 -0
  53. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/cli.rst +0 -0
  54. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/configs.rst +0 -0
  55. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/data.rst +0 -0
  56. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/datagrabbers.rst +0 -0
  57. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/datareaders.rst +0 -0
  58. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/index.rst +0 -0
  59. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/markers.rst +0 -0
  60. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/nilearn.rst +0 -0
  61. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/onthefly.rst +0 -0
  62. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/pipeline.rst +0 -0
  63. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/preprocessing.rst +0 -0
  64. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/stats.rst +0 -0
  65. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/storage.rst +0 -0
  66. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/testing.rst +0 -0
  67. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/api/utils.rst +0 -0
  68. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/builtin.rst +0 -0
  69. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/contributors.inc +0 -0
  70. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/.gitignore +0 -0
  71. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/333.enh +0 -0
  72. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/429.change +0 -0
  73. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/429.enh +0 -0
  74. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/432.feature +0 -0
  75. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/441.misc +0 -0
  76. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/443.feature +0 -0
  77. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/444.bugfix +0 -0
  78. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/450.doc +0 -0
  79. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/450.feature +0 -0
  80. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/451.doc +0 -0
  81. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/changes/newsfragments/451.feature +0 -0
  82. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/conf.py +0 -0
  83. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/contribution.rst +0 -0
  84. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/coordinates.rst +0 -0
  85. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/data_registries.rst +0 -0
  86. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/data_types.rst +0 -0
  87. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/datagrabber.rst +0 -0
  88. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/dependencies.rst +0 -0
  89. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/extension.rst +0 -0
  90. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/marker.rst +0 -0
  91. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/masks.rst +0 -0
  92. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/parcellations.rst +0 -0
  93. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/plugins.rst +0 -0
  94. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/extending/preprocessor.rst +0 -0
  95. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/faq.rst +0 -0
  96. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/help.rst +0 -0
  97. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/images/junifer_logo.png +0 -0
  98. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/index.rst +0 -0
  99. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/installation.rst +0 -0
  100. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/links.inc +0 -0
  101. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/maintaining.rst +0 -0
  102. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/redirect.html +0 -0
  103. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/starting.rst +0 -0
  104. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/understanding/data.rst +0 -0
  105. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/understanding/datagrabber.rst +0 -0
  106. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/understanding/datareader.rst +0 -0
  107. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/understanding/index.rst +0 -0
  108. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/understanding/marker.rst +0 -0
  109. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/understanding/pipeline.rst +0 -0
  110. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/understanding/preprocess.rst +0 -0
  111. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/understanding/storage.rst +0 -0
  112. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/using/codeless.rst +0 -0
  113. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/using/masks.rst +0 -0
  114. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/using/queueing.rst +0 -0
  115. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/using/running.rst +0 -0
  116. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/docs/whats_new.rst +0 -0
  117. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/README.rst +0 -0
  118. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/norun_hcpfc_pearson.py +0 -0
  119. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/norun_ukbvm_gmd.py +0 -0
  120. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/run_compute_parcel_mean.py +0 -0
  121. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/run_datagrabber_bids_datalad.py +0 -0
  122. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/run_ets_rss_marker.py +0 -0
  123. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/run_junifer_julearn.py +0 -0
  124. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/run_run_gmd_mean.py +0 -0
  125. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/yamls/gmd_mean.yaml +0 -0
  126. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/yamls/gmd_mean_htcondor.yaml +0 -0
  127. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/yamls/partly_cloudy_agg_mean_tian.yml +0 -0
  128. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/examples/yamls/ukb_gmd_mean.yaml +0 -0
  129. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/ignore_words.txt +0 -0
  130. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/__init__.py +0 -0
  131. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/__init__.pyi +0 -0
  132. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/__init__.py +0 -0
  133. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/__init__.pyi +0 -0
  134. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/functions.py +0 -0
  135. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/py.typed +0 -0
  136. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/queue_context/__init__.py +0 -0
  137. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/queue_context/__init__.pyi +0 -0
  138. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/queue_context/gnu_parallel_local_adapter.py +0 -0
  139. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/queue_context/htcondor_adapter.py +0 -0
  140. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/queue_context/py.typed +0 -0
  141. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/queue_context/queue_context_adapter.py +0 -0
  142. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/queue_context/tests/test_gnu_parallel_local_adapter.py +0 -0
  143. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/queue_context/tests/test_htcondor_adapter.py +0 -0
  144. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/afni/3dAFNItoNIFTI +0 -0
  145. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/afni/3dRSFC +0 -0
  146. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/afni/3dReHo +0 -0
  147. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/afni/afni +0 -0
  148. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/afni/run_afni_docker.sh +0 -0
  149. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/ants/ResampleImage +0 -0
  150. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/ants/antsApplyTransforms +0 -0
  151. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/ants/antsApplyTransformsToPoints +0 -0
  152. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/ants/run_ants_docker.sh +0 -0
  153. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/freesurfer/mri_binarize +0 -0
  154. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/freesurfer/mri_mc +0 -0
  155. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/freesurfer/mri_pretess +0 -0
  156. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/freesurfer/mris_convert +0 -0
  157. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/freesurfer/run_freesurfer_docker.sh +0 -0
  158. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/fsl/applywarp +0 -0
  159. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/fsl/flirt +0 -0
  160. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/fsl/img2imgcoord +0 -0
  161. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/fsl/run_fsl_docker.sh +0 -0
  162. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/fsl/std2imgcoord +0 -0
  163. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/run_conda.bash +0 -0
  164. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/run_conda.zsh +0 -0
  165. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/run_venv.bash +0 -0
  166. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/res/run_venv.zsh +0 -0
  167. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/api/tests/test_functions.py +0 -0
  168. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/__init__.py +0 -0
  169. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/__init__.pyi +0 -0
  170. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/cli.py +0 -0
  171. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/parser.py +0 -0
  172. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/py.typed +0 -0
  173. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/tests/data/gmd_mean.yaml +0 -0
  174. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/tests/data/gmd_mean_htcondor.yaml +0 -0
  175. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/tests/data/partly_cloudy_agg_mean_tian.yml +0 -0
  176. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/tests/test_cli.py +0 -0
  177. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/tests/test_cli_utils.py +0 -0
  178. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/tests/test_parser.py +0 -0
  179. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/cli/utils.py +0 -0
  180. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/__init__.py +0 -0
  181. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/__init__.py +0 -0
  182. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/__init__.pyi +0 -0
  183. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/__init__.py +0 -0
  184. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/__init__.pyi +0 -0
  185. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/aomic_id1000_vbm.py +0 -0
  186. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/camcan_vbm.py +0 -0
  187. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/ixi_vbm.py +0 -0
  188. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/py.typed +0 -0
  189. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/tests/test_aomic_id1000_vbm.py +0 -0
  190. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/tests/test_camcan_vbm.py +0 -0
  191. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/tests/test_ixi_vbm.py +0 -0
  192. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/tests/test_ucla.py +0 -0
  193. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/tests/test_ukb_vbm.py +0 -0
  194. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/ucla.py +0 -0
  195. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/datagrabbers/ukb_vbm.py +0 -0
  196. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/configs/juseless/py.typed +0 -0
  197. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/conftest.py +0 -0
  198. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/__init__.py +0 -0
  199. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/__init__.pyi +0 -0
  200. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/_dispatch.py +0 -0
  201. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/coordinates/__init__.py +0 -0
  202. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/coordinates/__init__.pyi +0 -0
  203. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/coordinates/_ants_coordinates_warper.py +0 -0
  204. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/coordinates/_coordinates.py +0 -0
  205. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/coordinates/_fsl_coordinates_warper.py +0 -0
  206. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/coordinates/tests/test_coordinates.py +0 -0
  207. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/masks/__init__.py +0 -0
  208. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/masks/__init__.pyi +0 -0
  209. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/masks/_ants_mask_warper.py +0 -0
  210. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/masks/_fsl_mask_warper.py +0 -0
  211. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/masks/_masks.py +0 -0
  212. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/masks/tests/test_masks.py +0 -0
  213. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/parcellations/__init__.py +0 -0
  214. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/parcellations/__init__.pyi +0 -0
  215. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/parcellations/_ants_parcellation_warper.py +0 -0
  216. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/parcellations/_fsl_parcellation_warper.py +0 -0
  217. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/parcellations/_parcellations.py +0 -0
  218. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/parcellations/tests/test_parcellations.py +0 -0
  219. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/pipeline_data_registry_base.py +0 -0
  220. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/py.typed +0 -0
  221. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/template_spaces.py +0 -0
  222. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/tests/test_data_utils.py +0 -0
  223. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/tests/test_dispatch.py +0 -0
  224. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/tests/test_template_spaces.py +0 -0
  225. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/data/utils.py +0 -0
  226. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/__init__.py +0 -0
  227. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/__init__.pyi +0 -0
  228. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/__init__.py +0 -0
  229. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/__init__.pyi +0 -0
  230. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/id1000.py +0 -0
  231. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/piop1.py +0 -0
  232. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/piop2.py +0 -0
  233. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/py.typed +0 -0
  234. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/tests/test_id1000.py +0 -0
  235. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/tests/test_piop1.py +0 -0
  236. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/aomic/tests/test_piop2.py +0 -0
  237. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/base.py +0 -0
  238. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/datalad_base.py +0 -0
  239. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/dmcc13_benchmark.py +0 -0
  240. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/hcp1200/__init__.py +0 -0
  241. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/hcp1200/__init__.pyi +0 -0
  242. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/hcp1200/datalad_hcp1200.py +0 -0
  243. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/hcp1200/hcp1200.py +0 -0
  244. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/hcp1200/py.typed +0 -0
  245. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/hcp1200/tests/test_hcp1200.py +0 -0
  246. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/multiple.py +0 -0
  247. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/pattern.py +0 -0
  248. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/pattern_datalad.py +0 -0
  249. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/pattern_validation_mixin.py +0 -0
  250. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/py.typed +0 -0
  251. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/tests/test_base.py +0 -0
  252. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/tests/test_datalad_base.py +0 -0
  253. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/tests/test_dmcc13_benchmark.py +0 -0
  254. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/tests/test_multiple.py +0 -0
  255. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/tests/test_pattern.py +0 -0
  256. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/tests/test_pattern_datalad.py +0 -0
  257. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datagrabber/tests/test_pattern_validation_mixin.py +0 -0
  258. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datareader/__init__.py +0 -0
  259. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datareader/__init__.pyi +0 -0
  260. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datareader/default.py +0 -0
  261. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datareader/py.typed +0 -0
  262. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/datareader/tests/test_default_reader.py +0 -0
  263. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/BrainPrint/brainprint/__init__.py +0 -0
  264. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/BrainPrint/brainprint/_version.py +0 -0
  265. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/BrainPrint/brainprint/asymmetry.py +0 -0
  266. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/BrainPrint/brainprint/brainprint.py +0 -0
  267. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/BrainPrint/brainprint/surfaces.py +0 -0
  268. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/BrainPrint/brainprint/utils/__init__.py +0 -0
  269. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/BrainPrint/brainprint/utils/_config.py +0 -0
  270. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/BrainPrint/brainprint/utils/utils.py +0 -0
  271. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/__init__.py +0 -0
  272. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/h5io/h5io/__init__.py +0 -0
  273. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/h5io/h5io/_h5io.py +0 -0
  274. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/h5io/h5io/_version.py +0 -0
  275. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/h5io/h5io/chunked_array.py +0 -0
  276. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/h5io/h5io/chunked_list.py +0 -0
  277. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/nilearn/__init__.py +0 -0
  278. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/nilearn/__init__.pyi +0 -0
  279. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/nilearn/junifer_connectivity_measure.py +0 -0
  280. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/nilearn/junifer_nifti_spheres_masker.py +0 -0
  281. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/nilearn/py.typed +0 -0
  282. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/nilearn/tests/test_junifer_connectivity_measure.py +0 -0
  283. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/external/nilearn/tests/test_junifer_nifti_spheres_masker.py +0 -0
  284. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/__init__.py +0 -0
  285. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/__init__.pyi +0 -0
  286. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/base.py +0 -0
  287. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/brainprint.py +0 -0
  288. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/__init__.py +0 -0
  289. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/__init__.pyi +0 -0
  290. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/complexity_base.py +0 -0
  291. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/hurst_exponent.py +0 -0
  292. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/multiscale_entropy_auc.py +0 -0
  293. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/perm_entropy.py +0 -0
  294. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/py.typed +0 -0
  295. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/range_entropy.py +0 -0
  296. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/range_entropy_auc.py +0 -0
  297. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/sample_entropy.py +0 -0
  298. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/tests/test_complexity_base.py +0 -0
  299. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/tests/test_hurst_exponent.py +0 -0
  300. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/tests/test_multiscale_entropy_auc.py +0 -0
  301. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/tests/test_perm_entropy.py +0 -0
  302. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/tests/test_range_entropy.py +0 -0
  303. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/tests/test_range_entropy_auc.py +0 -0
  304. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/tests/test_sample_entropy.py +0 -0
  305. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/tests/test_weighted_perm_entropy.py +0 -0
  306. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/complexity/weighted_perm_entropy.py +0 -0
  307. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/ets_rss.py +0 -0
  308. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/__init__.py +0 -0
  309. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/__init__.pyi +0 -0
  310. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/_afni_falff.py +0 -0
  311. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/_junifer_falff.py +0 -0
  312. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/falff_base.py +0 -0
  313. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/falff_parcels.py +0 -0
  314. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/falff_spheres.py +0 -0
  315. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/py.typed +0 -0
  316. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/tests/test_falff_parcels.py +0 -0
  317. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/falff/tests/test_falff_spheres.py +0 -0
  318. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/__init__.py +0 -0
  319. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/__init__.pyi +0 -0
  320. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/crossparcellation_functional_connectivity.py +0 -0
  321. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/edge_functional_connectivity_parcels.py +0 -0
  322. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/edge_functional_connectivity_spheres.py +0 -0
  323. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/functional_connectivity_base.py +0 -0
  324. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/functional_connectivity_parcels.py +0 -0
  325. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/functional_connectivity_spheres.py +0 -0
  326. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/py.typed +0 -0
  327. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/tests/test_crossparcellation_functional_connectivity.py +0 -0
  328. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_parcels.py +0 -0
  329. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/tests/test_edge_functional_connectivity_spheres.py +0 -0
  330. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/tests/test_functional_connectivity_base.py +0 -0
  331. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/tests/test_functional_connectivity_parcels.py +0 -0
  332. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/functional_connectivity/tests/test_functional_connectivity_spheres.py +0 -0
  333. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/parcel_aggregation.py +0 -0
  334. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/py.typed +0 -0
  335. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/__init__.py +0 -0
  336. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/__init__.pyi +0 -0
  337. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/_afni_reho.py +0 -0
  338. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/_junifer_reho.py +0 -0
  339. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/py.typed +0 -0
  340. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/reho_base.py +0 -0
  341. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/reho_parcels.py +0 -0
  342. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/reho_spheres.py +0 -0
  343. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/tests/test_reho_parcels.py +0 -0
  344. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/reho/tests/test_reho_spheres.py +0 -0
  345. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/sphere_aggregation.py +0 -0
  346. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/__init__.py +0 -0
  347. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/__init__.pyi +0 -0
  348. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/py.typed +0 -0
  349. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/temporal_snr_base.py +0 -0
  350. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/temporal_snr_parcels.py +0 -0
  351. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/temporal_snr_spheres.py +0 -0
  352. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/tests/test_temporal_snr_base.py +0 -0
  353. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/tests/test_temporal_snr_parcels.py +0 -0
  354. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/temporal_snr/tests/test_temporal_snr_spheres.py +0 -0
  355. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/tests/test_brainprint.py +0 -0
  356. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/tests/test_ets_rss.py +0 -0
  357. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/tests/test_marker_utils.py +0 -0
  358. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/tests/test_markers_base.py +0 -0
  359. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/tests/test_parcel_aggregation.py +0 -0
  360. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/tests/test_sphere_aggregation.py +0 -0
  361. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/markers/utils.py +0 -0
  362. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/onthefly/__init__.py +0 -0
  363. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/onthefly/_brainprint.py +0 -0
  364. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/onthefly/read_transform.py +0 -0
  365. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/onthefly/tests/test_read_transform.py +0 -0
  366. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/__init__.py +0 -0
  367. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/pipeline_component_registry.py +0 -0
  368. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/pipeline_step_mixin.py +0 -0
  369. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/py.typed +0 -0
  370. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/tests/test_marker_collection.py +0 -0
  371. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/tests/test_pipeline_component_registry.py +0 -0
  372. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/tests/test_pipeline_step_mixin.py +0 -0
  373. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/tests/test_update_meta_mixin.py +0 -0
  374. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/tests/test_workdir_manager.py +0 -0
  375. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/update_meta_mixin.py +0 -0
  376. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/utils.py +0 -0
  377. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/pipeline/workdir_manager.py +0 -0
  378. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/__init__.py +0 -0
  379. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/__init__.pyi +0 -0
  380. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/_temporal_filter.py +0 -0
  381. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/_temporal_slicer.py +0 -0
  382. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/base.py +0 -0
  383. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/confounds/__init__.py +0 -0
  384. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/confounds/__init__.pyi +0 -0
  385. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/confounds/fmriprep_confound_remover.py +0 -0
  386. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/confounds/py.typed +0 -0
  387. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/confounds/tests/test_fmriprep_confound_remover.py +0 -0
  388. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/py.typed +0 -0
  389. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/smoothing/__init__.py +0 -0
  390. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/smoothing/__init__.pyi +0 -0
  391. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/smoothing/_afni_smoothing.py +0 -0
  392. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/smoothing/_fsl_smoothing.py +0 -0
  393. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/smoothing/_nilearn_smoothing.py +0 -0
  394. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/smoothing/py.typed +0 -0
  395. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/smoothing/smoothing.py +0 -0
  396. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/smoothing/tests/test_smoothing.py +0 -0
  397. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/tests/test_preprocess_base.py +0 -0
  398. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/tests/test_temporal_filter.py +0 -0
  399. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/tests/test_temporal_slicer.py +0 -0
  400. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/warping/__init__.py +0 -0
  401. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/warping/__init__.pyi +0 -0
  402. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/warping/_ants_warper.py +0 -0
  403. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/warping/_fsl_warper.py +0 -0
  404. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/warping/py.typed +0 -0
  405. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/warping/space_warper.py +0 -0
  406. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/preprocess/warping/tests/test_space_warper.py +0 -0
  407. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/py.typed +0 -0
  408. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/stats.py +0 -0
  409. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/__init__.py +0 -0
  410. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/__init__.pyi +0 -0
  411. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/base.py +0 -0
  412. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/hdf5.py +0 -0
  413. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/pandas_base.py +0 -0
  414. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/py.typed +0 -0
  415. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/sqlite.py +0 -0
  416. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/tests/test_hdf5.py +0 -0
  417. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/tests/test_pandas_base.py +0 -0
  418. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/tests/test_sqlite.py +0 -0
  419. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/tests/test_storage_base.py +0 -0
  420. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/tests/test_utils.py +0 -0
  421. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/storage/utils.py +0 -0
  422. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/__init__.py +0 -0
  423. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/__init__.pyi +0 -0
  424. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/data/sub-0001_task-anticipation_acq-seq_desc-confounds_regressors.tsv +0 -0
  425. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/datagrabbers.py +0 -0
  426. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/py.typed +0 -0
  427. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/registry.py +0 -0
  428. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/tests/test_oasisvmbtesting_datagrabber.py +0 -0
  429. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/tests/test_partlycloudytesting_datagrabber.py +0 -0
  430. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/tests/test_spmauditory_datagrabber.py +0 -0
  431. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/tests/test_testing_registry.py +0 -0
  432. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/testing/utils.py +0 -0
  433. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/tests/test_main.py +0 -0
  434. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/tests/test_stats.py +0 -0
  435. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/typing/__init__.py +0 -0
  436. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/__init__.py +0 -0
  437. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/__init__.pyi +0 -0
  438. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/_config.py +0 -0
  439. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/_yaml.py +0 -0
  440. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/fs.py +0 -0
  441. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/helpers.py +0 -0
  442. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/logging.py +0 -0
  443. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/py.typed +0 -0
  444. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/singleton.py +0 -0
  445. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/tests/test_config.py +0 -0
  446. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/tests/test_fs.py +0 -0
  447. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/tests/test_helpers.py +0 -0
  448. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer/utils/tests/test_logging.py +0 -0
  449. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer.egg-info/dependency_links.txt +0 -0
  450. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer.egg-info/entry_points.txt +0 -0
  451. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer.egg-info/requires.txt +0 -0
  452. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/junifer.egg-info/top_level.txt +0 -0
  453. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/pyproject.toml +0 -0
  454. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/setup.cfg +0 -0
  455. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/setup.py +0 -0
  456. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/tools/create_aomic1000_example_dataset.py +0 -0
  457. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/tools/create_aomicpiop1_example_dataset.py +0 -0
  458. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/tools/create_aomicpiop2_example_dataset.py +0 -0
  459. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/tools/create_bids_example_dataset.py +0 -0
  460. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/tools/create_bids_example_dataset_sessions.py +0 -0
  461. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/tools/create_dmcc13_benchmark_example_dataset.py +0 -0
  462. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/tools/create_hcp1200_example_dataset.py +0 -0
  463. {junifer-0.0.7.dev111 → junifer-0.0.7.dev121}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: junifer
3
- Version: 0.0.7.dev111
3
+ Version: 0.0.7.dev121
4
4
  Summary: JUelich NeuroImaging FEature extractoR
5
5
  Author-email: Fede Raimondo <f.raimondo@fz-juelich.de>, Synchon Mandal <s.mandal@fz-juelich.de>
6
6
  Maintainer-email: Fede Raimondo <f.raimondo@fz-juelich.de>, Synchon Mandal <s.mandal@fz-juelich.de>
@@ -0,0 +1 @@
1
+ Add documentation on :class:`.ConfigManager`, dumping data object and extending data dump assets by `Synchon Mandal`_
@@ -0,0 +1 @@
1
+ Allow pipeline data object to be dumped by introducing :class:`.DataObjectDumper` and available dumping / loading assets to be extended by introducing :func:`.register_data_dump_asset` decorator by `Synchon Mandal`_
@@ -0,0 +1,46 @@
1
+ .. include:: ../links.inc
2
+
3
+ .. _adding_data_dump_assets:
4
+
5
+ Adding Data Dump Assets
6
+ =======================
7
+
8
+ ``junifer`` supports dumping ``nibabel.Nifti1Image`` and ``pandas.DataFrame`` which should cover most fMRI use cases. But, in case you work with other modalities like EEG, you can register your own data dump asset.
9
+
10
+ How to add a data dump asset
11
+ ----------------------------
12
+
13
+ This example shows how to create a data dump asset for ``mne.io.Raw``.
14
+
15
+ #. Check :ref:`extending junifer <extending_extension>` on how to create a
16
+ *junifer extension* if you have not done so.
17
+ #. Create the data registry in the *extension script* like so:
18
+
19
+ .. code-block:: python
20
+
21
+ from pathlib import Path
22
+
23
+ from junifer.api.decorators import register_data_dump_asset
24
+ from junifer.pipeline import BaseDataDumpAsset
25
+
26
+ import mne
27
+
28
+ @register_data_dump_asset([mne.io.Raw], [".fif", ".fif.gz"])
29
+ class RawAsset(BaseDataDumpAsset):
30
+ """Class for ``mne.io.Raw`` dumper."""
31
+
32
+ def dump(self) -> None:
33
+ self.data.save(self.path_without_ext.with_suffix(".raw.fif.gz"))
34
+
35
+ @classmethod
36
+ def load(cls: "RawAsset", path: Path) -> mne.io.Raw:
37
+ return mne.io.Raw(path)
38
+
39
+ * :func:`.register_data_dump_asset` registers a class. The first argument is
40
+ a list of types that the class is responsible for saving and the second
41
+ argument is a list of file extensions that the class is responsible for
42
+ loading.
43
+ * Inheriting from ``junifer.pipeline.BaseDumpAsset`` takes care of the class
44
+ acting as a data dump asset.
45
+ * Method ``junifer.pipeline.BaseDumpAsset.dump`` and class method
46
+ ``junifer.pipeline.BaseDumpAsset.load`` need to be implemented.
@@ -33,3 +33,4 @@ DataGrabbers, Preprocessors, Markers, etc., following the *junifer* way.
33
33
  plugins
34
34
  data_registries
35
35
  data_types
36
+ data_dump_asset
@@ -0,0 +1,65 @@
1
+ .. include:: ../links.inc
2
+
3
+ .. _configuring:
4
+
5
+ Configuring Pipeline Behaviour
6
+ ==============================
7
+
8
+ It is also possible to configure some internal :ref:`pipeline <pipeline>` behaviour via :obj:`.ConfigManager`.
9
+ It can be done either via the command-line interface (CLI) or the application programming
10
+ interface (API).
11
+
12
+ To use via the CLI, one would do:
13
+
14
+ .. code-block:: bash
15
+
16
+ <CONFIG-KEY>=<CONFIG-VAL> junifer run ...
17
+
18
+ and via the API like so:
19
+
20
+ .. code-block:: python
21
+
22
+ from junifer.utils import config
23
+
24
+ # Add config
25
+ config.set(key="<config-key>", val=<config-val>)
26
+
27
+ # do feature extraction
28
+ ...
29
+
30
+ # Remove config
31
+ config.delete("<config-key>")
32
+
33
+ .. _available_configurations:
34
+
35
+ Available Configurations
36
+ ------------------------
37
+
38
+ .. list-table::
39
+ :widths: auto
40
+ :header-rows: 1
41
+
42
+ * - CLI Key
43
+ - API Key
44
+ - Value
45
+ - Description
46
+ * - ``JUNIFER_DATA_LOCATION``
47
+ - ``data.location``
48
+ - str
49
+ - Alternative location for ``junifer-data``
50
+ * - ``JUNIFER_DATAGRABBER_SKIPIDCHECK``
51
+ - ``datagrabber.skipidcheck``
52
+ - bool
53
+ - Skip DataLad-based DataGrabber's ID check
54
+ * - ``JUNIFER_DATAGRABBER_SKIPDIRTYCHECK``
55
+ - ``datagrabber.skipdirtycheck``
56
+ - bool
57
+ - Skip Git "dirty" check for a DataLad dataset clone of a DataGrabber
58
+ * - ``JUNIFER_PREPROCESSING_DUMP_LOCATION``
59
+ - ``preprocessing.dump.location``
60
+ - str
61
+ - Dump location of pre-processed data for debugging purposes
62
+ * - ``JUNIFER_PREPROCESSING_DUMP_GRANULARITY``
63
+ - ``preprocessing.dump.granularity``
64
+ - "full" or "final"
65
+ - Dump all pre-processing steps or just the final pre-processed data
@@ -0,0 +1,18 @@
1
+ .. include:: ../links.inc
2
+
3
+ .. _dumping:
4
+
5
+ Dumping Pipeline Data
6
+ =====================
7
+
8
+ It is usually not required to check the :ref:`data object <data_object>` but
9
+ for debugging purposes one can do that. Since, there is no direct way to interact
10
+ with it, ``junifer`` provides a way to dump the object before, in between and / or after
11
+ pre-processing. It is controlled by the ``JUNIFER_PREPROCESSING_DUMP_LOCATION`` and
12
+ ``JUNIFER_PREPROCESSING_DUMP_GRANULARITY`` :ref:`configuration options <available_configurations>`.
13
+
14
+ ``junifer`` dumps the ``"data"`` attribute of the data object as proper files in their respective formats,
15
+ for example, ``nibabel.Nifti1Image`` gets dumped as a ``.nii.gz`` file. As of now, ``junifer`` can dump
16
+ ``nibabel.Nifti1Image`` and ``pandas.DataFrame`` (confound files) file formats. In case you
17
+ :ref:`add custom data types <adding_data_types>` which support different file formats, you can create and
18
+ register a :ref:`custom dumper <adding_data_dump_assets>`.
@@ -18,6 +18,8 @@ to interact with HPC and HTC systems.
18
18
  codeless
19
19
  running
20
20
  queueing
21
+ configuring
22
+ dumping
21
23
 
22
24
 
23
25
  .. _using_components:
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.0.7.dev111'
21
- __version_tuple__ = version_tuple = (0, 0, 7, 'dev111')
20
+ __version__ = version = '0.0.7.dev121'
21
+ __version_tuple__ = version_tuple = (0, 0, 7, 'dev121')
@@ -6,8 +6,13 @@
6
6
  # License: AGPL
7
7
 
8
8
  from ..data import DataDispatcher
9
- from ..pipeline import PipelineComponentRegistry
9
+ from ..pipeline import (
10
+ AssetDumperDispatcher,
11
+ AssetLoaderDispatcher,
12
+ PipelineComponentRegistry,
13
+ )
10
14
  from ..typing import (
15
+ DataDumpAssetLike,
11
16
  DataGrabberLike,
12
17
  DataRegistryLike,
13
18
  MarkerLike,
@@ -17,6 +22,7 @@ from ..typing import (
17
22
 
18
23
 
19
24
  __all__ = [
25
+ "register_data_dump_asset",
20
26
  "register_data_registry",
21
27
  "register_datagrabber",
22
28
  "register_datareader",
@@ -184,3 +190,49 @@ def register_data_registry(name: str) -> DataRegistryLike:
184
190
  return klass
185
191
 
186
192
  return decorator
193
+
194
+
195
+ def register_data_dump_asset(
196
+ types: list[type], exts: list[str]
197
+ ) -> DataDumpAssetLike:
198
+ """Asset registration decorator.
199
+
200
+ Registers the data dump asset for ``types`` with ``exts``.
201
+
202
+ Parameters
203
+ ----------
204
+ types : list of class
205
+ The classes to dump.
206
+ exts : list of str
207
+ The extensions to load.
208
+
209
+ Returns
210
+ -------
211
+ class
212
+ The unmodified input class.
213
+
214
+ """
215
+
216
+ def decorator(klass: DataDumpAssetLike) -> DataDumpAssetLike:
217
+ """Actual decorator.
218
+
219
+ Parameters
220
+ ----------
221
+ klass : class
222
+ The class of the data dump asset to register.
223
+
224
+ Returns
225
+ -------
226
+ class
227
+ The unmodified input class.
228
+
229
+ """
230
+ # Add asset dumper
231
+ for t in types:
232
+ AssetDumperDispatcher()[t] = klass
233
+ # Add asset loader
234
+ for e in exts:
235
+ AssetLoaderDispatcher()[e] = klass
236
+ return klass
237
+
238
+ return decorator
@@ -0,0 +1,78 @@
1
+ """Provide tests for public decorators."""
2
+
3
+ # Authors: Synchon Mandal <s.mandal@fz-juelich.de>
4
+ # License: AGPL
5
+
6
+ import pickle
7
+
8
+ from junifer.api.decorators import (
9
+ register_data_dump_asset,
10
+ register_data_registry,
11
+ )
12
+ from junifer.data import BasePipelineDataRegistry, DataDispatcher
13
+ from junifer.pipeline import (
14
+ AssetDumperDispatcher,
15
+ AssetLoaderDispatcher,
16
+ BaseDataDumpAsset,
17
+ )
18
+
19
+
20
+ def test_register_data_registry() -> None:
21
+ """Test data registry registration."""
22
+
23
+ @register_data_registry("dumb")
24
+ class DumDum(BasePipelineDataRegistry):
25
+ def __init__(self):
26
+ super().__init__()
27
+
28
+ def register(self):
29
+ pass
30
+
31
+ def deregister(self):
32
+ pass
33
+
34
+ def load(self):
35
+ pass
36
+
37
+ def get(self):
38
+ pass
39
+
40
+ assert "dumb" in DataDispatcher()
41
+ _ = DataDispatcher().pop("dumb")
42
+ assert "dumb" not in DataDispatcher()
43
+
44
+
45
+ def test_register_data_dump_asset() -> None:
46
+ """Test data dump asset registration."""
47
+
48
+ class Int(int): ...
49
+
50
+ class Float(float): ...
51
+
52
+ @register_data_dump_asset([Int, Float], [".int", ".float"])
53
+ class DumAsset(BaseDataDumpAsset):
54
+ def dump(self):
55
+ suffix = ""
56
+ if isinstance(self.data, Int):
57
+ suffix = ".int"
58
+ else:
59
+ suffix = ".float"
60
+ pickle.dump(self.data, self.path_without_ext.with_suffix(suffix))
61
+
62
+ @classmethod
63
+ def load(cls, path):
64
+ return pickle.load(path)
65
+
66
+ assert Int in AssetDumperDispatcher()
67
+ assert Float in AssetDumperDispatcher()
68
+ _ = AssetDumperDispatcher().pop(Int)
69
+ _ = AssetDumperDispatcher().pop(Float)
70
+ assert Int not in AssetDumperDispatcher()
71
+ assert Float not in AssetDumperDispatcher()
72
+
73
+ assert ".int" in AssetLoaderDispatcher()
74
+ assert ".float" in AssetLoaderDispatcher()
75
+ _ = AssetLoaderDispatcher().pop(".int")
76
+ _ = AssetLoaderDispatcher().pop(".float")
77
+ assert ".int" not in AssetLoaderDispatcher()
78
+ assert ".float" not in AssetLoaderDispatcher()
@@ -1,4 +1,8 @@
1
1
  __all__ = [
2
+ "AssetDumperDispatcher",
3
+ "AssetLoaderDispatcher",
4
+ "BaseDataDumpAsset",
5
+ "DataObjectDumper",
2
6
  "PipelineComponentRegistry",
3
7
  "PipelineStepMixin",
4
8
  "UpdateMetaMixin",
@@ -6,6 +10,12 @@ __all__ = [
6
10
  "MarkerCollection",
7
11
  ]
8
12
 
13
+ from ._data_object_dumper import (
14
+ AssetDumperDispatcher,
15
+ AssetLoaderDispatcher,
16
+ BaseDataDumpAsset,
17
+ DataObjectDumper,
18
+ )
9
19
  from .pipeline_component_registry import PipelineComponentRegistry
10
20
  from .pipeline_step_mixin import PipelineStepMixin
11
21
  from .update_meta_mixin import UpdateMetaMixin
@@ -0,0 +1,347 @@
1
+ """Provide pipeline data object dumper and data dump asset classes."""
2
+
3
+ # Authors: Synchon Mandal <s.mandal@fz-juelich.de>
4
+ # License: AGPL
5
+
6
+ from abc import ABC, abstractmethod
7
+ from collections.abc import Iterator, MutableMapping
8
+ from copy import deepcopy
9
+ from pathlib import Path
10
+ from typing import Any
11
+
12
+ import nibabel
13
+ import pandas
14
+
15
+ from ..utils import raise_error, yaml
16
+
17
+
18
+ __all__ = [
19
+ "AssetDumperDispatcher",
20
+ "AssetLoaderDispatcher",
21
+ "BaseDataDumpAsset",
22
+ "DataObjectDumper",
23
+ ]
24
+
25
+
26
+ class BaseDataDumpAsset(ABC):
27
+ """Abstract base class for a data dump asset.
28
+
29
+ Parameters
30
+ ----------
31
+ data : Any
32
+ Data to save.
33
+ path_without_ext : pathlib.Path
34
+ Path to the asset without extension.
35
+ The subclass should add the extension when saving.
36
+
37
+ """
38
+
39
+ def __init__(self, data: Any, path_without_ext: Path) -> None:
40
+ """Initialize the class."""
41
+ self.data = data
42
+ self.path_without_ext = path_without_ext
43
+
44
+ @abstractmethod
45
+ def dump(self) -> None:
46
+ """Dump asset."""
47
+ raise_error(
48
+ msg="Concrete classes need to implement dump().",
49
+ klass=NotImplementedError,
50
+ )
51
+
52
+ @classmethod
53
+ @abstractmethod
54
+ def load(cls: type["BaseDataDumpAsset"], path: Path) -> Any:
55
+ """Load asset from path."""
56
+ raise_error(
57
+ msg="Concrete classes need to implement load().",
58
+ klass=NotImplementedError,
59
+ )
60
+
61
+
62
+ class Nifti1ImageAsset(BaseDataDumpAsset):
63
+ """Class for ``nibabel.Nifti1Image`` dumper."""
64
+
65
+ def dump(self) -> None:
66
+ nibabel.save(self.data, self.path_without_ext.with_suffix(".nii.gz"))
67
+
68
+ @classmethod
69
+ def load(cls: "Nifti1ImageAsset", path: Path) -> nibabel.Nifti1Image:
70
+ return nibabel.load(path)
71
+
72
+
73
+ class PandasDataFrameAsset(BaseDataDumpAsset):
74
+ """Class for ``pandas.DataFrame`` dumper."""
75
+
76
+ def dump(self) -> None:
77
+ self.data.to_csv(self.path_without_ext.with_suffix(".csv"))
78
+
79
+ @classmethod
80
+ def load(cls: "PandasDataFrameAsset", path: Path) -> pandas.DataFrame:
81
+ return pandas.read_csv(path, index_col=0)
82
+
83
+
84
+ class AssetDumperDispatcher(MutableMapping):
85
+ """Class for helping dynamic asset dumper dispatch."""
86
+
87
+ _instance = None
88
+
89
+ def __new__(cls):
90
+ # Make class singleton
91
+ if cls._instance is None:
92
+ cls._instance = super().__new__(cls)
93
+ # Set dumpers
94
+ cls._dumpers: dict[type, type[BaseDataDumpAsset]] = {}
95
+ cls._builtin: dict[type, type[BaseDataDumpAsset]] = {}
96
+ cls._external: dict[type, type[BaseDataDumpAsset]] = {}
97
+ cls._builtin.update(
98
+ {
99
+ nibabel.Nifti1Image: Nifti1ImageAsset,
100
+ pandas.DataFrame: PandasDataFrameAsset,
101
+ }
102
+ )
103
+ cls._dumpers.update(cls._builtin)
104
+ return cls._instance
105
+
106
+ def __getitem__(self, key: type) -> type[BaseDataDumpAsset]:
107
+ return self._dumpers[key]
108
+
109
+ def __iter__(self) -> Iterator[type]:
110
+ return iter(self._dumpers)
111
+
112
+ def __len__(self) -> int:
113
+ return len(self._dumpers)
114
+
115
+ def __delitem__(self, key: type) -> None:
116
+ # Internal check
117
+ if key in self._builtin:
118
+ raise_error(f"Cannot delete in-built key: {key}")
119
+ # Non-existing key
120
+ if key not in self._external:
121
+ raise_error(klass=KeyError, msg=str(key))
122
+ # Update external
123
+ _ = self._external.pop(key)
124
+ # Update global
125
+ _ = self._dumpers.pop(key)
126
+
127
+ def __setitem__(self, key: type, value: type[BaseDataDumpAsset]) -> None:
128
+ # Internal check
129
+ if key in self._builtin:
130
+ raise_error(f"Cannot set value for in-built key: {key}")
131
+ # Value type check
132
+ if not issubclass(value, BaseDataDumpAsset):
133
+ raise_error(f"Invalid value type: {type(value)}")
134
+ # Update external
135
+ self._external[key] = value
136
+ # Update global
137
+ self._dumpers[key] = value
138
+
139
+ def popitem():
140
+ """Not implemented."""
141
+ pass
142
+
143
+ def clear(self):
144
+ """Not implemented."""
145
+ pass
146
+
147
+ def setdefault(self, key: type, value=None):
148
+ """Not implemented."""
149
+ pass
150
+
151
+
152
+ class AssetLoaderDispatcher(MutableMapping):
153
+ """Class for helping dynamic asset loader dispatch."""
154
+
155
+ _instance = None
156
+
157
+ def __new__(cls):
158
+ # Make class singleton
159
+ if cls._instance is None:
160
+ cls._instance = super().__new__(cls)
161
+ # Set loaders
162
+ cls._loaders: dict[str, type[BaseDataDumpAsset]] = {}
163
+ cls._builtin: dict[str, type[BaseDataDumpAsset]] = {}
164
+ cls._external: dict[str, type[BaseDataDumpAsset]] = {}
165
+ cls._builtin.update(
166
+ {
167
+ ".nii.gz": Nifti1ImageAsset,
168
+ ".nii": Nifti1ImageAsset,
169
+ ".csv": PandasDataFrameAsset,
170
+ }
171
+ )
172
+ cls._loaders.update(cls._builtin)
173
+ return cls._instance
174
+
175
+ def __getitem__(self, key: str) -> type[BaseDataDumpAsset]:
176
+ return self._loaders[key]
177
+
178
+ def __iter__(self) -> Iterator[str]:
179
+ return iter(self._loaders)
180
+
181
+ def __len__(self) -> int:
182
+ return len(self._loaders)
183
+
184
+ def __delitem__(self, key: str) -> None:
185
+ # Internal check
186
+ if key in self._builtin:
187
+ raise_error(f"Cannot delete in-built key: {key}")
188
+ # Non-existing key
189
+ if key not in self._external:
190
+ raise_error(klass=KeyError, msg=key)
191
+ # Update external
192
+ _ = self._external.pop(key)
193
+ # Update global
194
+ _ = self._loaders.pop(key)
195
+
196
+ def __setitem__(self, key: str, value: type[BaseDataDumpAsset]) -> None:
197
+ # Internal check
198
+ if key in self._builtin:
199
+ raise_error(f"Cannot set value for in-built key: {key}")
200
+ # Value type check
201
+ if not issubclass(value, BaseDataDumpAsset):
202
+ raise_error(f"Invalid value type: {type(value)}")
203
+ # Update external
204
+ self._external[key] = value
205
+ # Update global
206
+ self._loaders[key] = value
207
+
208
+ def popitem():
209
+ """Not implemented."""
210
+ pass
211
+
212
+ def clear(self):
213
+ """Not implemented."""
214
+ pass
215
+
216
+ def setdefault(self, key: str, value=None):
217
+ """Not implemented."""
218
+ pass
219
+
220
+
221
+ class DataObjectDumper:
222
+ """Class for pipeline data object dumping."""
223
+
224
+ _instance = None
225
+
226
+ def __new__(cls):
227
+ """Overridden to make the class singleton."""
228
+ # Make class singleton
229
+ if cls._instance is None:
230
+ cls._instance = super().__new__(cls)
231
+ return cls._instance
232
+
233
+ def dump(self, data: dict, path: Path, step: str) -> None:
234
+ """Dump data object at path.
235
+
236
+ Parameters
237
+ ----------
238
+ data : dict
239
+ The data object state to dump.
240
+ path : pathlib.Path
241
+ The path to dump the data object.
242
+ step : str
243
+ The step name. Also sets the dump directory.
244
+
245
+ """
246
+ # Make a deep copy of data
247
+ data_copy = deepcopy(data)
248
+ # Initialize list for storing assets to save
249
+ assets = []
250
+
251
+ dump_file_root = path / step
252
+
253
+ for k, v in data_copy.items():
254
+ # Conditional for Warp type; kept separate for low cognitive load
255
+ if isinstance(v, list):
256
+ for idx, _ in enumerate(v):
257
+ data_copy[k][idx]["path"] = str(data_copy[k][idx]["path"])
258
+ continue
259
+
260
+ # Transform Path to str
261
+ data_copy[k]["path"] = str(data_copy[k]["path"])
262
+ # Pop out first level assets; some data types might not have
263
+ if "data" in v:
264
+ dumper = AssetDumperDispatcher()[type(v["data"])]
265
+ assets.append(
266
+ dumper(
267
+ data=v.pop("data"),
268
+ path_without_ext=dump_file_root / k,
269
+ )
270
+ )
271
+ for kk, vv in v.items():
272
+ if isinstance(vv, dict) and kk != "meta":
273
+ # Transform Path to str
274
+ data_copy[k][kk]["path"] = str(data_copy[k][kk]["path"])
275
+ # Pop out second level assets
276
+ if "data" in vv:
277
+ dumper = AssetDumperDispatcher()[type(vv["data"])]
278
+ assets.append(
279
+ dumper(
280
+ data=vv.pop("data"),
281
+ path_without_ext=dump_file_root / f"{k}_{kk}",
282
+ )
283
+ )
284
+
285
+ # Save yaml
286
+ dump_file_path = dump_file_root / "data.yaml"
287
+ dump_file_path.parent.mkdir(parents=True, exist_ok=True)
288
+ yaml.dump(data_copy, stream=dump_file_path)
289
+
290
+ # Save assets
291
+ for x in assets:
292
+ x.dump()
293
+
294
+ def load(self, path: Path) -> dict:
295
+ """Load data object from path.
296
+
297
+ Parameters
298
+ ----------
299
+ path : pathlib.Path
300
+ The path to the dumped data object.
301
+
302
+ Returns
303
+ -------
304
+ dict
305
+ The restored data object dump.
306
+
307
+ """
308
+ data = yaml.load(path)
309
+ # Load assets; stem => path mapping
310
+ assets = {
311
+ child.stem.split(".")[0]: child
312
+ for child in path.parent.iterdir()
313
+ if "".join(child.suffixes) in AssetLoaderDispatcher()
314
+ }
315
+
316
+ for k, v in data.items():
317
+ # Conditional for Warp type; kept separate for low cognitive load
318
+ if isinstance(v, list):
319
+ for idx, _ in enumerate(v):
320
+ data[k][idx]["path"] = Path(data[k][idx]["path"])
321
+ continue
322
+
323
+ # Transform str to Path
324
+ data[k]["path"] = Path(data[k]["path"])
325
+ # Insert first level assets if matching asset is found
326
+ if k in assets:
327
+ # Get path
328
+ p = assets[k]
329
+ data[k]["path"] = p
330
+ # Get correct loader using extension
331
+ loader = AssetLoaderDispatcher()["".join(p.suffixes)]
332
+ data[k]["data"] = loader.load(p)
333
+ for kk, vv in v.items():
334
+ if isinstance(vv, dict) and kk != "meta":
335
+ # Transform str to Path
336
+ data[k][kk]["path"] = Path(data[k][kk]["path"])
337
+ # Insert second level assets
338
+ key = f"{k}_{kk}"
339
+ if key in assets:
340
+ # Get path
341
+ pp = assets[key]
342
+ data[k][kk]["path"] = pp
343
+ # Get correct loader using extension
344
+ loader = AssetLoaderDispatcher()["".join(pp.suffixes)]
345
+ data[k][kk]["data"] = loader.load(pp)
346
+
347
+ return data