sdcflows 2.13.2__tar.gz → 2.14.0__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 (269) hide show
  1. sdcflows-2.14.0/.circleci/version.py +6 -0
  2. sdcflows-2.14.0/.git-blame-ignore-revs +12 -0
  3. {sdcflows-2.13.2 → sdcflows-2.14.0}/.github/workflows/build-test-publish.yml +9 -9
  4. {sdcflows-2.13.2 → sdcflows-2.14.0}/.github/workflows/docs-build-update.yml +2 -2
  5. {sdcflows-2.13.2 → sdcflows-2.14.0}/.github/workflows/validate.yml +2 -2
  6. {sdcflows-2.13.2 → sdcflows-2.14.0}/.maint/update_authors.py +16 -14
  7. {sdcflows-2.13.2 → sdcflows-2.14.0}/.pre-commit-config.yaml +6 -9
  8. {sdcflows-2.13.2 → sdcflows-2.14.0}/CHANGES.rst +11 -0
  9. {sdcflows-2.13.2 → sdcflows-2.14.0}/PKG-INFO +15 -16
  10. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/notebooks/SDC - Theory and physics.ipynb +1 -1
  11. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/tools/apigen.py +22 -39
  12. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/tools/buildmodref.py +3 -5
  13. {sdcflows-2.13.2 → sdcflows-2.14.0}/env.yml +6 -5
  14. {sdcflows-2.13.2 → sdcflows-2.14.0}/pyproject.toml +19 -12
  15. {sdcflows-2.13.2 → sdcflows-2.14.0}/requirements.txt +50 -67
  16. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/_version.py +16 -3
  17. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/cli/main.py +0 -3
  18. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/cli/parser.py +3 -8
  19. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/config.py +5 -15
  20. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/fieldmaps.py +6 -6
  21. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/interfaces/bspline.py +1 -1
  22. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/interfaces/epi.py +2 -1
  23. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/interfaces/fmap.py +1 -1
  24. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/interfaces/reportlets.py +2 -2
  25. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/interfaces/utils.py +18 -12
  26. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/test_fieldmaps.py +1 -1
  27. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/test_transform.py +7 -5
  28. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/transform.py +16 -21
  29. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/utils/bimap.py +6 -6
  30. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/utils/phasemanip.py +5 -3
  31. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/utils/wrangler.py +16 -16
  32. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/viz/utils.py +2 -2
  33. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/apply/registration.py +2 -1
  34. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/base.py +2 -2
  35. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/fit/base.py +1 -1
  36. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/fit/pepolar.py +2 -3
  37. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/fit/tests/test_syn.py +4 -1
  38. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/outputs.py +1 -1
  39. {sdcflows-2.13.2 → sdcflows-2.14.0}/tox.ini +2 -5
  40. sdcflows-2.13.2/.circleci/version.py +0 -5
  41. sdcflows-2.13.2/.git-blame-ignore-revs +0 -6
  42. {sdcflows-2.13.2 → sdcflows-2.14.0}/.circleci/artifact_path +0 -0
  43. {sdcflows-2.13.2 → sdcflows-2.14.0}/.circleci/config.yml +0 -0
  44. {sdcflows-2.13.2 → sdcflows-2.14.0}/.codecov.yml +0 -0
  45. {sdcflows-2.13.2 → sdcflows-2.14.0}/.coveragerc +0 -0
  46. {sdcflows-2.13.2 → sdcflows-2.14.0}/.docker/files/neurodebian.gpg +0 -0
  47. {sdcflows-2.13.2 → sdcflows-2.14.0}/.docker/files/nipype.cfg +0 -0
  48. {sdcflows-2.13.2 → sdcflows-2.14.0}/.dockerignore +0 -0
  49. {sdcflows-2.13.2 → sdcflows-2.14.0}/.gitattributes +0 -0
  50. {sdcflows-2.13.2 → sdcflows-2.14.0}/.github/dependabot.yml +0 -0
  51. {sdcflows-2.13.2 → sdcflows-2.14.0}/.gitignore +0 -0
  52. {sdcflows-2.13.2 → sdcflows-2.14.0}/.mailmap +0 -0
  53. {sdcflows-2.13.2 → sdcflows-2.14.0}/.maint/CONTRIBUTORS.md +0 -0
  54. {sdcflows-2.13.2 → sdcflows-2.14.0}/.maint/FORMER.md +0 -0
  55. {sdcflows-2.13.2 → sdcflows-2.14.0}/.maint/MAINTAINERS.md +0 -0
  56. {sdcflows-2.13.2 → sdcflows-2.14.0}/.maint/PIs.md +0 -0
  57. {sdcflows-2.13.2 → sdcflows-2.14.0}/.maint/ROADMAP.md +0 -0
  58. {sdcflows-2.13.2 → sdcflows-2.14.0}/.pep8speaks.yml +0 -0
  59. {sdcflows-2.13.2 → sdcflows-2.14.0}/.zenodo.json +0 -0
  60. {sdcflows-2.13.2 → sdcflows-2.14.0}/CONTRIBUTING.md +0 -0
  61. {sdcflows-2.13.2 → sdcflows-2.14.0}/Dockerfile +0 -0
  62. {sdcflows-2.13.2 → sdcflows-2.14.0}/LICENSE +0 -0
  63. {sdcflows-2.13.2 → sdcflows-2.14.0}/Makefile +0 -0
  64. {sdcflows-2.13.2 → sdcflows-2.14.0}/README.rst +0 -0
  65. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/Makefile +0 -0
  66. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/_static/config-example.toml +0 -0
  67. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/_static/css/version-switch.css +0 -0
  68. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/_static/js/version-switch.js +0 -0
  69. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/_static/sdcflows-OHBM21-fig1.png +0 -0
  70. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/_templates/sidebar/brand.html +0 -0
  71. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/api.rst +0 -0
  72. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/changes.rst +0 -0
  73. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/cli.rst +0 -0
  74. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/conf.py +0 -0
  75. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/examples.rst +0 -0
  76. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/index.rst +0 -0
  77. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/installation.rst +0 -0
  78. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/links.rst +0 -0
  79. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/methods.rst +0 -0
  80. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/notebooks/fieldmap.nii.gz +0 -0
  81. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/reference/.gitignore +0 -0
  82. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/requirements.txt +0 -0
  83. {sdcflows-2.13.2 → sdcflows-2.14.0}/docs/tools/LICENSE.txt +0 -0
  84. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/__init__.py +0 -0
  85. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/_warnings.py +0 -0
  86. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/cli/__init__.py +0 -0
  87. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/cli/tests/__init__.py +0 -0
  88. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/cli/tests/test_find_estimators.py +0 -0
  89. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/cli/workflow.py +0 -0
  90. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/conftest.py +0 -0
  91. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/data/__init__.py +0 -0
  92. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/data/affine.json +0 -0
  93. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/data/flirtsch/b02b0.cnf +0 -0
  94. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/data/flirtsch/b02b0_1.cnf +0 -0
  95. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/data/flirtsch/b02b0_2.cnf +0 -0
  96. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/data/flirtsch/b02b0_4.cnf +0 -0
  97. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/data/flirtsch/b02b0_quick.cnf +0 -0
  98. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/data/fmap-any_registration.json +0 -0
  99. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/data/fmap-any_registration_testing.json +0 -0
  100. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/data/fmap_atlas.nii.gz +0 -0
  101. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/data/fmap_atlas_2_MNI152NLin2009cAsym_affine.mat +0 -0
  102. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/data/sd_syn.json +0 -0
  103. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/data/sd_syn_sloppy.json +0 -0
  104. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/data/translation_rigid.json +0 -0
  105. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/interfaces/__init__.py +0 -0
  106. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/interfaces/brainmask.py +0 -0
  107. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/interfaces/tests/__init__.py +0 -0
  108. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/interfaces/tests/test_bspline.py +0 -0
  109. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/interfaces/tests/test_epi.py +0 -0
  110. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/interfaces/tests/test_fmap.py +0 -0
  111. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/interfaces/tests/test_reportlets.py +0 -0
  112. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/interfaces/tests/test_utils.py +0 -0
  113. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/__init__.py +0 -0
  114. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/dataset_description.json +0 -0
  115. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/anat/sub-01_FLAIR.nii.gz +0 -0
  116. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/anat/sub-01_T1w.nii.gz +0 -0
  117. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/anat/sub-01_T2w.nii.gz +0 -0
  118. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/dwi/sub-01_dir-AP_dwi.nii.gz +0 -0
  119. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/dwi/sub-01_dir-AP_sbref.json +0 -0
  120. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/dwi/sub-01_dir-AP_sbref.nii.gz +0 -0
  121. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/dwi/sub-01_dir-LR_dwi.nii.gz +0 -0
  122. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/dwi/sub-01_dir-LR_sbref.json +0 -0
  123. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/dwi/sub-01_dir-LR_sbref.nii.gz +0 -0
  124. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/dwi/sub-01_dir-PA_dwi.nii.gz +0 -0
  125. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/dwi/sub-01_dir-PA_sbref.json +0 -0
  126. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/dwi/sub-01_dir-PA_sbref.nii.gz +0 -0
  127. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/dwi/sub-01_dir-RL_dwi.nii.gz +0 -0
  128. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/dwi/sub-01_dir-RL_sbref.json +0 -0
  129. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/dwi/sub-01_dir-RL_sbref.nii.gz +0 -0
  130. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_acq-single_dir-PA_epi.json +0 -0
  131. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_acq-single_dir-PA_epi.nii.gz +0 -0
  132. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_dir-AP_epi.json +0 -0
  133. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_dir-AP_epi.nii.gz +0 -0
  134. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_dir-LR_epi.json +0 -0
  135. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_dir-LR_epi.nii.gz +0 -0
  136. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_dir-PA_epi.json +0 -0
  137. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_dir-PA_epi.nii.gz +0 -0
  138. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_dir-RL_epi.json +0 -0
  139. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_dir-RL_epi.nii.gz +0 -0
  140. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_fieldmap.json +0 -0
  141. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_fieldmap.nii.gz +0 -0
  142. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_magnitude.nii.gz +0 -0
  143. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_magnitude1.nii.gz +0 -0
  144. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_magnitude2.nii.gz +0 -0
  145. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_phase1.json +0 -0
  146. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_phase1.nii.gz +0 -0
  147. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_phase2.json +0 -0
  148. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_phase2.nii.gz +0 -0
  149. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_phasediff.json +0 -0
  150. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/fmap/sub-01_phasediff.nii.gz +0 -0
  151. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/func/sub-01_task-rest_bold.nii.gz +0 -0
  152. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsA/sub-01/func/sub-01_task-rest_sbref.nii.gz +0 -0
  153. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/dataset_description.json +0 -0
  154. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/anat/sub-01_ses-1_FLAIR.nii.gz +0 -0
  155. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/anat/sub-01_ses-1_T1w.nii.gz +0 -0
  156. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/anat/sub-01_ses-1_T2w.nii.gz +0 -0
  157. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/dwi/sub-01_ses-1_dir-AP_dwi.nii.gz +0 -0
  158. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/dwi/sub-01_ses-1_dir-AP_sbref.json +0 -0
  159. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/dwi/sub-01_ses-1_dir-AP_sbref.nii.gz +0 -0
  160. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/dwi/sub-01_ses-1_dir-LR_dwi.nii.gz +0 -0
  161. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/dwi/sub-01_ses-1_dir-LR_sbref.json +0 -0
  162. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/dwi/sub-01_ses-1_dir-LR_sbref.nii.gz +0 -0
  163. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/dwi/sub-01_ses-1_dir-PA_dwi.nii.gz +0 -0
  164. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/dwi/sub-01_ses-1_dir-PA_sbref.json +0 -0
  165. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/dwi/sub-01_ses-1_dir-PA_sbref.nii.gz +0 -0
  166. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/dwi/sub-01_ses-1_dir-RL_dwi.nii.gz +0 -0
  167. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/dwi/sub-01_ses-1_dir-RL_sbref.json +0 -0
  168. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/dwi/sub-01_ses-1_dir-RL_sbref.nii.gz +0 -0
  169. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_acq-single_dir-PA_epi.json +0 -0
  170. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_acq-single_dir-PA_epi.nii.gz +0 -0
  171. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_dir-AP_epi.json +0 -0
  172. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_dir-AP_epi.nii.gz +0 -0
  173. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_dir-LR_epi.json +0 -0
  174. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_dir-LR_epi.nii.gz +0 -0
  175. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_dir-PA_epi.json +0 -0
  176. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_dir-PA_epi.nii.gz +0 -0
  177. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_dir-RL_epi.json +0 -0
  178. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_dir-RL_epi.nii.gz +0 -0
  179. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_fieldmap.json +0 -0
  180. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_fieldmap.nii.gz +0 -0
  181. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_magnitude.nii.gz +0 -0
  182. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_magnitude1.nii.gz +0 -0
  183. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_magnitude2.nii.gz +0 -0
  184. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_phase1.json +0 -0
  185. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_phase1.nii.gz +0 -0
  186. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_phase2.json +0 -0
  187. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_phase2.nii.gz +0 -0
  188. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_phasediff.json +0 -0
  189. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/fmap/sub-01_ses-1_phasediff.nii.gz +0 -0
  190. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/func/sub-01_ses-1_task-rest_bold.nii.gz +0 -0
  191. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsB/sub-01/ses-1/func/sub-01_ses-1_task-rest_sbref.nii.gz +0 -0
  192. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/dataset_description.json +0 -0
  193. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/anat/sub-01_FLAIR.nii.gz +0 -0
  194. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/anat/sub-01_T1w.nii.gz +0 -0
  195. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/anat/sub-01_T2w.nii.gz +0 -0
  196. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/dwi/sub-01_dir-AP_dwi.nii.gz +0 -0
  197. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/dwi/sub-01_dir-AP_sbref.json +0 -0
  198. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/dwi/sub-01_dir-AP_sbref.nii.gz +0 -0
  199. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/dwi/sub-01_dir-LR_dwi.nii.gz +0 -0
  200. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/dwi/sub-01_dir-LR_sbref.json +0 -0
  201. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/dwi/sub-01_dir-LR_sbref.nii.gz +0 -0
  202. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/dwi/sub-01_dir-PA_dwi.nii.gz +0 -0
  203. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/dwi/sub-01_dir-PA_sbref.json +0 -0
  204. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/dwi/sub-01_dir-PA_sbref.nii.gz +0 -0
  205. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/dwi/sub-01_dir-RL_dwi.nii.gz +0 -0
  206. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/dwi/sub-01_dir-RL_sbref.json +0 -0
  207. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/dwi/sub-01_dir-RL_sbref.nii.gz +0 -0
  208. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_acq-single_dir-PA_epi.json +0 -0
  209. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_acq-single_dir-PA_epi.nii.gz +0 -0
  210. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_dir-AP_epi.json +0 -0
  211. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_dir-AP_epi.nii.gz +0 -0
  212. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_dir-LR_epi.json +0 -0
  213. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_dir-LR_epi.nii.gz +0 -0
  214. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_dir-PA_epi.json +0 -0
  215. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_dir-PA_epi.nii.gz +0 -0
  216. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_dir-RL_epi.json +0 -0
  217. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_dir-RL_epi.nii.gz +0 -0
  218. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_fieldmap.json +0 -0
  219. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_fieldmap.nii.gz +0 -0
  220. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_magnitude.nii.gz +0 -0
  221. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_magnitude1.nii.gz +0 -0
  222. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_magnitude2.nii.gz +0 -0
  223. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_phase1.json +0 -0
  224. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_phase1.nii.gz +0 -0
  225. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_phase2.json +0 -0
  226. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_phase2.nii.gz +0 -0
  227. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_phasediff.json +0 -0
  228. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/fmap/sub-01_phasediff.nii.gz +0 -0
  229. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/func/sub-01_task-rest_bold.nii.gz +0 -0
  230. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/sub-01/func/sub-01_task-rest_sbref.nii.gz +0 -0
  231. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/dsC/task-rest_bold.json +0 -0
  232. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/epi.nii.gz +0 -0
  233. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/epi2fmap_xfm.txt +0 -0
  234. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/field-coeff-tests.nii.gz +0 -0
  235. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/fmap2epi_xfm.txt +0 -0
  236. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/topup-coeff-fixed.nii.gz +0 -0
  237. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/topup-coeff.nii.gz +0 -0
  238. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/data/topup-field.nii.gz +0 -0
  239. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/tests/test_version.py +0 -0
  240. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/utils/__init__.py +0 -0
  241. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/utils/epimanip.py +0 -0
  242. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/utils/misc.py +0 -0
  243. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/utils/telemetry.py +0 -0
  244. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/utils/tests/__init__.py +0 -0
  245. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/utils/tests/test_misc.py +0 -0
  246. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/utils/tests/test_phasemanip.py +0 -0
  247. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/utils/tests/test_tools.py +0 -0
  248. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/utils/tests/test_wrangler.py +0 -0
  249. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/utils/tools.py +0 -0
  250. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/viz/__init__.py +0 -0
  251. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/__init__.py +0 -0
  252. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/ancillary.py +0 -0
  253. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/apply/__init__.py +0 -0
  254. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/apply/correction.py +0 -0
  255. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/apply/tests/__init__.py +0 -0
  256. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/apply/tests/test_correction.py +0 -0
  257. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/apply/tests/test_registration.py +0 -0
  258. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/fit/__init__.py +0 -0
  259. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/fit/fieldmap.py +0 -0
  260. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/fit/syn.py +0 -0
  261. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/fit/tests/__init__.py +0 -0
  262. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/fit/tests/test_fit.py +0 -0
  263. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/fit/tests/test_pepolar.py +0 -0
  264. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/fit/tests/test_phdiff.py +0 -0
  265. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/tests/__init__.py +0 -0
  266. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/tests/test_ancillary.py +0 -0
  267. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/tests/test_base.py +0 -0
  268. {sdcflows-2.13.2 → sdcflows-2.14.0}/sdcflows/workflows/tests/test_integration.py +0 -0
  269. {sdcflows-2.13.2 → sdcflows-2.14.0}/tools/cache_templateflow.py +0 -0
@@ -0,0 +1,6 @@
1
+ """Get sdcflows version."""
2
+
3
+ import sdcflows
4
+
5
+ with open('/tmp/.docker-version.txt', 'w') as f:
6
+ f.write(sdcflows.__version__)
@@ -0,0 +1,12 @@
1
+ # Thu May 15 11:41:29 2025 -0400 - markiewicz@stanford.edu - chore: Manual ruff fixes [ignore-rev]
2
+ e5153dbc00b089144b9f4b415234b27c58b2388b
3
+ # Thu May 15 11:11:38 2025 -0400 - markiewicz@stanford.edu - run: ruff check --fix [ignore-rev]
4
+ 2bb216b0a12612e31713b34d8ab2ee98fa2cc703
5
+ # Thu May 15 09:34:34 2025 -0400 - markiewicz@stanford.edu - run: ruff check --fix [ignore-rev]
6
+ dc3706038661984718da079e24a863842407a837
7
+ # Thu May 15 09:29:29 2025 -0400 - markiewicz@stanford.edu - run: ruff format [ignore-rev]
8
+ d97ae316c0bdf71084a0732760ceed5221033fc2
9
+ # Thu May 15 09:26:57 2025 -0400 - markiewicz@stanford.edu - run: ruff check --fix [ignore-rev]
10
+ cacd409cce71f2e530ad1bd1e8b79f397cab81d4
11
+ # Thu May 15 09:22:00 2025 -0400 - markiewicz@stanford.edu - run: pre-commit run --all [ignore-rev]
12
+ 2b40bee0d6b2c88628760a8b1513851a439411e8
@@ -43,7 +43,7 @@ jobs:
43
43
  id-token: write
44
44
 
45
45
  steps:
46
- - uses: actions/checkout@v4
46
+ - uses: actions/checkout@v5
47
47
  with:
48
48
  fetch-depth: 0
49
49
  - uses: hynek/build-and-inspect-python-package@v2
@@ -65,27 +65,27 @@ jobs:
65
65
  strategy:
66
66
  fail-fast: false
67
67
  matrix:
68
- python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
68
+ python-version: ["3.10", "3.11", "3.12", "3.13"]
69
69
  dependencies: ["latest", "pre"]
70
70
  marks: ["fast"]
71
71
  include:
72
- - python-version: "3.9"
72
+ - python-version: "3.10"
73
73
  dependencies: "min"
74
74
  marks: "fast"
75
- - python-version: "3.9"
75
+ - python-version: "3.10"
76
76
  dependencies: "latest"
77
77
  marks: "slow"
78
- - python-version: "3.12"
78
+ - python-version: "3.13"
79
79
  dependencies: "latest"
80
80
  marks: "veryslow"
81
81
  exclude:
82
- - python-version: "3.9"
83
- dependencies: "pre"
84
82
  - python-version: "3.10"
85
83
  dependencies: "pre"
84
+ - python-version: "3.11"
85
+ dependencies: "pre"
86
86
 
87
87
  steps:
88
- - uses: actions/checkout@v4
88
+ - uses: actions/checkout@v5
89
89
  - uses: actions/cache@v4
90
90
  with:
91
91
  path: /var/lib/apt
@@ -245,7 +245,7 @@ jobs:
245
245
 
246
246
  steps:
247
247
  - name: Download packages built by build-and-inspect-python-package
248
- uses: actions/download-artifact@v4
248
+ uses: actions/download-artifact@v5
249
249
  with:
250
250
  name: Packages
251
251
  path: dist
@@ -18,7 +18,7 @@ jobs:
18
18
  runs-on: ubuntu-latest
19
19
 
20
20
  steps:
21
- - uses: actions/checkout@v4
21
+ - uses: actions/checkout@v5
22
22
  with:
23
23
  ssh-key: "${{ secrets.NIPREPS_DEPLOY }}"
24
24
  fetch-depth: 0
@@ -49,7 +49,7 @@ jobs:
49
49
  sudo apt-get install -y --no-install-recommends graphviz pandoc texlive
50
50
 
51
51
  - name: Set up Python 3
52
- uses: actions/setup-python@v5
52
+ uses: actions/setup-python@v6
53
53
  with:
54
54
  python-version: 3
55
55
 
@@ -20,12 +20,12 @@ jobs:
20
20
  style:
21
21
  runs-on: ubuntu-latest
22
22
  steps:
23
- - uses: actions/checkout@v4
23
+ - uses: actions/checkout@v5
24
24
  - run: pipx run ruff check sdcflows/
25
25
  - run: pipx run ruff format --diff sdcflows/
26
26
 
27
27
  # codespell:
28
28
  # runs-on: ubuntu-latest
29
29
  # steps:
30
- # - uses: actions/checkout@v4
30
+ # - uses: actions/checkout@v5
31
31
  # - uses: codespell-project/actions-codespell@v2
@@ -57,7 +57,7 @@ def read_md_table(md_text):
57
57
  break
58
58
 
59
59
  values = [v.strip() or None for v in line.split('|')][1:-1]
60
- retval.append({k: v for k, v in zip(keys, values) if v})
60
+ retval.append({k: v for k, v in zip(keys, values, strict=False) if v})
61
61
 
62
62
  return retval
63
63
 
@@ -130,10 +130,11 @@ def get_git_lines(fname='line-contributors.txt'):
130
130
  if not lines:
131
131
  raise RuntimeError(
132
132
  """\
133
- Could not find line-contributors from git repository.%s"""
134
- % """ \
133
+ Could not find line-contributors from git repository.{}""".format(
134
+ """ \
135
135
  git-line-summary not found, please install git-extras. """
136
- * (cmd[0] is None)
136
+ * (cmd[0] is None)
137
+ )
137
138
  )
138
139
  return [' '.join(line.strip().split()[1:-1]) for line in lines if '%' in line]
139
140
 
@@ -219,7 +220,7 @@ def zenodo(
219
220
  elif isinstance(creator['affiliation'], list):
220
221
  creator['affiliation'] = creator['affiliation'][0]
221
222
 
222
- Path(zenodo_file).write_text('%s\n' % json.dumps(zenodo, indent=2, ensure_ascii=False))
223
+ Path(zenodo_file).write_text(f'{json.dumps(zenodo, indent=2, ensure_ascii=False)}\n')
223
224
 
224
225
 
225
226
  @cli.command()
@@ -266,10 +267,8 @@ def publication(
266
267
 
267
268
  aff_indexes = [
268
269
  ', '.join(
269
- [
270
- '%d' % (affiliations.index(a) + 1)
271
- for a in _aslist(author.get('affiliation', 'Unaffiliated'))
272
- ]
270
+ str(affiliations.index(a) + 1)
271
+ for a in _aslist(author.get('affiliation', 'Unaffiliated'))
273
272
  )
274
273
  for author in hits
275
274
  ]
@@ -280,15 +279,18 @@ def publication(
280
279
  file=sys.stderr,
281
280
  )
282
281
 
283
- print('Authors (%d):' % len(hits))
282
+ print(f'Authors ({len(hits)}):')
284
283
  print(
285
- '%s.'
286
- % '; '.join(['%s \\ :sup:`%s`\\ ' % (i['name'], idx) for i, idx in zip(hits, aff_indexes)])
284
+ '; '.join(
285
+ [rf'{i["name"]} \ :sup:`{idx}`\ ' for i, idx in zip(hits, aff_indexes, strict=False)]
286
+ )
287
+ + '.'
287
288
  )
288
289
 
289
290
  print(
290
- '\n\nAffiliations:\n%s'
291
- % '\n'.join(['{0: >2}. {1}'.format(i + 1, a) for i, a in enumerate(affiliations)])
291
+ '\n\nAffiliations:\n{}'.format(
292
+ '\n'.join([f'{i + 1: >2}. {a}' for i, a in enumerate(affiliations)])
293
+ )
292
294
  )
293
295
 
294
296
 
@@ -12,12 +12,9 @@ repos:
12
12
  - id: end-of-file-fixer
13
13
  - id: fix-byte-order-marker
14
14
  - id: trailing-whitespace
15
- # Enable when no significant PRs are in progress
16
- # - repo: https://github.com/psf/black
17
- # rev: 23.1.0
18
- # hooks:
19
- # - id: black
20
- # - repo: https://github.com/pycqa/isort
21
- # rev: 5.12.0
22
- # hooks:
23
- # - id: isort
15
+ - repo: https://github.com/astral-sh/ruff-pre-commit
16
+ rev: v0.12.5
17
+ hooks:
18
+ - id: ruff
19
+ args: [ --fix ]
20
+ - id: ruff-format
@@ -1,3 +1,14 @@
1
+ 2.14.0 (September 22, 2025)
2
+ ===========================
3
+ Feature release in the 2.13.x series.
4
+
5
+ This release requires a recent nitransforms release that in turn requires NumPy 2.
6
+ Since this is a major dependency increment, a new feature release is justified.
7
+
8
+ * fix: Adapt to transposed ndindex in nitransforms (#501)
9
+ * fix: Adopt some more opinionated ruff rules, manual resolutions (#493)
10
+
11
+
1
12
  2.13.2 (July 28, 2025)
2
13
  ======================
3
14
  Patch release in the 2.13.x series.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sdcflows
3
- Version: 2.13.2
3
+ Version: 2.14.0
4
4
  Summary: Susceptibility Distortion Correction (SDC) workflows for EPI MR schemes.
5
5
  Project-URL: Documentation, https://www.nipreps.org/sdcflows
6
6
  Project-URL: Home, https://github.com/nipreps/sdcflows
@@ -11,31 +11,30 @@ License-File: LICENSE
11
11
  Classifier: Development Status :: 4 - Beta
12
12
  Classifier: Intended Audience :: Science/Research
13
13
  Classifier: License :: OSI Approved :: Apache Software License
14
- Classifier: Programming Language :: Python :: 3.9
15
14
  Classifier: Programming Language :: Python :: 3.10
16
15
  Classifier: Programming Language :: Python :: 3.11
17
16
  Classifier: Programming Language :: Python :: 3.12
18
17
  Classifier: Programming Language :: Python :: 3.13
19
18
  Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
20
19
  Classifier: Topic :: Scientific/Engineering :: Image Recognition
21
- Requires-Python: >=3.9
22
- Requires-Dist: acres>=0.2.0
20
+ Requires-Python: >=3.10
21
+ Requires-Dist: acres>=0.5.0
23
22
  Requires-Dist: attrs>=20.1.0
24
23
  Requires-Dist: migas>=0.4.0
25
- Requires-Dist: nibabel>=3.0
26
- Requires-Dist: nipype>=1.8.5
24
+ Requires-Dist: nibabel>=5.1.1
25
+ Requires-Dist: nipype>=1.9.0
27
26
  Requires-Dist: nireports>=25.0.1
28
- Requires-Dist: nitransforms>=24.1.0
27
+ Requires-Dist: nitransforms>=25.0.1
29
28
  Requires-Dist: niworkflows>=1.11.0
30
- Requires-Dist: numpy>=1.23
29
+ Requires-Dist: numpy>=2.0
31
30
  Requires-Dist: pybids>=0.16.4
32
- Requires-Dist: scikit-image>=0.18
33
- Requires-Dist: scipy>=1.8.1
31
+ Requires-Dist: scikit-image>=0.23
32
+ Requires-Dist: scipy>=1.10
34
33
  Requires-Dist: templateflow>=23.1
35
34
  Requires-Dist: toml>=0.10
36
35
  Provides-Extra: all
37
36
  Requires-Dist: attrs>=20.1.0; extra == 'all'
38
- Requires-Dist: coverage[toml]>=5.2.1; extra == 'all'
37
+ Requires-Dist: coverage[toml]>=7; extra == 'all'
39
38
  Requires-Dist: furo; extra == 'all'
40
39
  Requires-Dist: importlib-resources; extra == 'all'
41
40
  Requires-Dist: ipykernel; extra == 'all'
@@ -49,7 +48,7 @@ Requires-Dist: pydotplus; extra == 'all'
49
48
  Requires-Dist: pytest-cov>=2.11; extra == 'all'
50
49
  Requires-Dist: pytest-env; extra == 'all'
51
50
  Requires-Dist: pytest-xdist>=2.5; extra == 'all'
52
- Requires-Dist: pytest>=6; extra == 'all'
51
+ Requires-Dist: pytest>=8.1; extra == 'all'
53
52
  Requires-Dist: ruff; extra == 'all'
54
53
  Requires-Dist: sphinx-argparse; extra == 'all'
55
54
  Requires-Dist: sphinx>=7.2.2; extra == 'all'
@@ -86,17 +85,17 @@ Requires-Dist: sphinxcontrib-apidoc; extra == 'docs'
86
85
  Provides-Extra: mem
87
86
  Requires-Dist: psutil; extra == 'mem'
88
87
  Provides-Extra: test
89
- Requires-Dist: coverage[toml]>=5.2.1; extra == 'test'
88
+ Requires-Dist: coverage[toml]>=7; extra == 'test'
90
89
  Requires-Dist: pytest-cov>=2.11; extra == 'test'
91
90
  Requires-Dist: pytest-env; extra == 'test'
92
91
  Requires-Dist: pytest-xdist>=2.5; extra == 'test'
93
- Requires-Dist: pytest>=6; extra == 'test'
92
+ Requires-Dist: pytest>=8.1; extra == 'test'
94
93
  Provides-Extra: tests
95
- Requires-Dist: coverage[toml]>=5.2.1; extra == 'tests'
94
+ Requires-Dist: coverage[toml]>=7; extra == 'tests'
96
95
  Requires-Dist: pytest-cov>=2.11; extra == 'tests'
97
96
  Requires-Dist: pytest-env; extra == 'tests'
98
97
  Requires-Dist: pytest-xdist>=2.5; extra == 'tests'
99
- Requires-Dist: pytest>=6; extra == 'tests'
98
+ Requires-Dist: pytest>=8.1; extra == 'tests'
100
99
  Description-Content-Type: text/x-rst
101
100
 
102
101
  SDCFlows
@@ -71,7 +71,7 @@
71
71
  "def get_centers(brain_slice):\n",
72
72
  " samples_x = np.arange(6, brain_slice.shape[1] - 3, step=12).astype(int)\n",
73
73
  " samples_y = np.arange(6, brain_slice.shape[0] - 3, step=12).astype(int)\n",
74
- " return zip(*product(samples_x, samples_y))\n",
74
+ " return zip(*product(samples_x, samples_y), strict=False)\n",
75
75
  "\n",
76
76
  "\n",
77
77
  "def plot_brain(brain_slice, brain_cmap='RdPu_r', grid=False, voxel_centers_c=None):\n",
@@ -27,7 +27,7 @@ from types import BuiltinFunctionType, FunctionType
27
27
  DEBUG = True
28
28
 
29
29
 
30
- class ApiDocWriter(object):
30
+ class ApiDocWriter:
31
31
  """Class for automatic detection and parsing of API docs
32
32
  to Sphinx-parsable reST format"""
33
33
 
@@ -185,9 +185,8 @@ class ApiDocWriter(object):
185
185
  # nothing that we could handle here.
186
186
  return ([], [])
187
187
 
188
- f = open(filename, 'rt')
189
- functions, classes = self._parse_lines(f)
190
- f.close()
188
+ with open(filename) as f:
189
+ functions, classes = self._parse_lines(f)
191
190
  return functions, classes
192
191
 
193
192
  def _parse_module_with_import(self, uri):
@@ -217,14 +216,10 @@ class ApiDocWriter(object):
217
216
  continue
218
217
  obj = mod.__dict__[obj_str]
219
218
  # Check if function / class defined in module
220
- if not self.other_defines and not getmodule(obj) == mod:
219
+ if not self.other_defines and getmodule(obj) != mod:
221
220
  continue
222
221
  # figure out if obj is a function or class
223
- if (
224
- hasattr(obj, 'func_name')
225
- or isinstance(obj, BuiltinFunctionType)
226
- or isinstance(obj, FunctionType)
227
- ):
222
+ if hasattr(obj, 'func_name') or isinstance(obj, (BuiltinFunctionType, FunctionType)):
228
223
  functions.append(obj_str)
229
224
  else:
230
225
  try:
@@ -278,7 +273,7 @@ class ApiDocWriter(object):
278
273
 
279
274
  # Make a shorter version of the uri that omits the package name for
280
275
  # titles
281
- uri_short = re.sub(r'^%s\.' % self.package_name, '', uri)
276
+ uri_short = re.sub(rf'^{self.package_name}\.', '', uri)
282
277
 
283
278
  head = '.. AUTO-GENERATED FILE -- DO NOT EDIT!\n\n'
284
279
  body = ''
@@ -345,20 +340,12 @@ class ApiDocWriter(object):
345
340
  elif match_type == 'package':
346
341
  patterns = self.package_skip_patterns
347
342
  else:
348
- raise ValueError('Cannot interpret match type "%s"' % match_type)
343
+ raise ValueError(f'Cannot interpret match type "{match_type}"')
349
344
  # Match to URI without package name
350
345
  L = len(self.package_name)
351
346
  if matchstr[:L] == self.package_name:
352
347
  matchstr = matchstr[L:]
353
- for pat in patterns:
354
- try:
355
- pat.search
356
- except AttributeError:
357
- pat = re.compile(pat)
358
- if pat.search(matchstr):
359
- return False
360
-
361
- return True
348
+ return not any(re.search(pat, matchstr) for pat in patterns)
362
349
 
363
350
  def discover_modules(self):
364
351
  r"""Return module sequence discovered from ``self.package_name``
@@ -417,7 +404,7 @@ class ApiDocWriter(object):
417
404
 
418
405
  module_by_ulm = OrderedDict()
419
406
 
420
- for v, k in zip(modules, ulms):
407
+ for v, k in zip(modules, ulms, strict=False):
421
408
  if k in module_by_ulm:
422
409
  module_by_ulm[k].append(v)
423
410
  else:
@@ -426,7 +413,7 @@ class ApiDocWriter(object):
426
413
  written_modules = []
427
414
 
428
415
  for ulm, mods in module_by_ulm.items():
429
- print('Generating docs for %s:' % ulm)
416
+ print(f'Generating docs for {ulm}:')
430
417
  document_head = []
431
418
  document_body = []
432
419
 
@@ -438,11 +425,8 @@ class ApiDocWriter(object):
438
425
  document_body.append(body)
439
426
 
440
427
  out_module = ulm + self.rst_extension
441
- outfile = os.path.join(outdir, out_module)
442
- fileobj = open(outfile, 'wt')
443
-
444
- fileobj.writelines(document_head + document_body)
445
- fileobj.close()
428
+ with open(os.path.join(outdir, out_module), 'w') as fileobj:
429
+ fileobj.writelines(document_head + document_body)
446
430
  written_modules.append(out_module)
447
431
 
448
432
  self.written_modules = written_modules
@@ -497,14 +481,13 @@ class ApiDocWriter(object):
497
481
  relpath = (outdir + os.path.sep).replace(relative_to + os.path.sep, '')
498
482
  else:
499
483
  relpath = outdir
500
- idx = open(path, 'wt')
501
- w = idx.write
502
- w('.. AUTO-GENERATED FILE -- DO NOT EDIT!\n\n')
503
-
504
- title = 'API Reference'
505
- w(title + '\n')
506
- w('=' * len(title) + '\n\n')
507
- w('.. toctree::\n\n')
508
- for f in self.written_modules:
509
- w(' %s\n' % os.path.join(relpath, f))
510
- idx.close()
484
+ with open(path, 'w') as idx:
485
+ w = idx.write
486
+ w('.. AUTO-GENERATED FILE -- DO NOT EDIT!\n\n')
487
+
488
+ title = 'API Reference'
489
+ w(title + '\n')
490
+ w('=' * len(title) + '\n\n')
491
+ w('.. toctree::\n\n')
492
+ for f in self.written_modules:
493
+ w(f' {os.path.join(relpath, f)}\n')
@@ -1,8 +1,6 @@
1
1
  #!/usr/bin/env python
2
2
  """Script to auto-generate API docs."""
3
3
 
4
- from __future__ import division, print_function
5
-
6
4
  # stdlib imports
7
5
  import sys
8
6
 
@@ -16,7 +14,7 @@ from apigen import ApiDocWriter
16
14
 
17
15
 
18
16
  def abort(error):
19
- print('*WARNING* API documentation not generated: %s' % error)
17
+ print(f'*WARNING* API documentation not generated: {error}')
20
18
  exit()
21
19
 
22
20
 
@@ -43,13 +41,13 @@ def writeapi(package, outdir, source_version, other_defines=True):
43
41
  docwriter = ApiDocWriter(package, rst_extension='.rst', other_defines=other_defines)
44
42
 
45
43
  docwriter.package_skip_patterns += [
46
- r'\.%s$' % package,
44
+ rf'\.{package}$',
47
45
  r'.*test.*$',
48
46
  r'\.version.*$',
49
47
  ]
50
48
  docwriter.write_api_docs(outdir)
51
49
  docwriter.write_index(outdir, 'index', relative_to=outdir)
52
- print('%d files written' % len(docwriter.written_modules))
50
+ print(f'{len(docwriter.written_modules)} files written')
53
51
 
54
52
 
55
53
  if __name__ == '__main__':
@@ -9,13 +9,14 @@ dependencies:
9
9
  - mkl=2024.2.2
10
10
  - mkl-service=2.4.2
11
11
  # Base scientific python stack; required by FSL, so pinned here
12
- - numpy=1.26
13
- - scipy=1.15
14
- - matplotlib=3.9
15
- - pandas=2.2
16
- - h5py=3.13
12
+ - numpy=2.3
13
+ - scipy=1.16
14
+ - matplotlib=3.10
15
+ - pandas=2.3
16
+ - h5py=3.14
17
17
  # Dependencies compiled against numpy, best to stick with conda
18
18
  - scikit-image=0.25
19
+ - scikit-learn=1.7
19
20
  # Utilities
20
21
  - graphviz=11.0
21
22
  # Workflow dependencies: ANTs
@@ -13,27 +13,26 @@ classifiers = [
13
13
  "Topic :: Scientific/Engineering :: Image Recognition",
14
14
  "Topic :: Scientific/Engineering :: Bio-Informatics",
15
15
  "License :: OSI Approved :: Apache Software License",
16
- "Programming Language :: Python :: 3.9",
17
16
  "Programming Language :: Python :: 3.10",
18
17
  "Programming Language :: Python :: 3.11",
19
18
  "Programming Language :: Python :: 3.12",
20
19
  "Programming Language :: Python :: 3.13",
21
20
  ]
22
21
  license = "Apache-2.0"
23
- requires-python = ">=3.9"
22
+ requires-python = ">=3.10"
24
23
  dependencies = [
25
- "acres >= 0.2.0",
24
+ "acres >= 0.5.0",
26
25
  "attrs >= 20.1.0",
27
- "nibabel >= 3.0",
28
- "nipype >= 1.8.5",
26
+ "nibabel >= 5.1.1",
27
+ "nipype >= 1.9.0",
29
28
  "migas >= 0.4.0",
30
29
  "nireports >= 25.0.1",
31
30
  "niworkflows >= 1.11.0",
32
- "nitransforms >= 24.1.0",
33
- "numpy >= 1.23",
31
+ "nitransforms >= 25.0.1",
32
+ "numpy >= 2.0",
34
33
  "pybids >= 0.16.4",
35
- "scikit-image >= 0.18",
36
- "scipy >= 1.8.1",
34
+ "scikit-image >= 0.23",
35
+ "scipy >= 1.10",
37
36
  "templateflow >= 23.1",
38
37
  "toml >= 0.10",
39
38
  ]
@@ -70,8 +69,8 @@ dev = [
70
69
  ]
71
70
 
72
71
  test = [
73
- "coverage[toml] >=5.2.1",
74
- "pytest >= 6",
72
+ "coverage[toml] >=7",
73
+ "pytest >= 8.1",
75
74
  "pytest-cov >= 2.11",
76
75
  "pytest-env",
77
76
  "pytest-xdist >= 2.5",
@@ -179,17 +178,22 @@ ignore = [
179
178
  line-length = 99
180
179
 
181
180
  [tool.ruff.lint]
182
- select = [
181
+ extend-select = [
183
182
  "F",
184
183
  "E",
184
+ "C4",
185
185
  "W",
186
+ "B",
186
187
  "I",
188
+ "SIM",
189
+ "UP",
187
190
  ]
188
191
  ignore = [
189
192
  "E203",
190
193
  "B019",
191
194
  "SIM108",
192
195
  "C901",
196
+ "UP038",
193
197
  ]
194
198
 
195
199
  [tool.ruff.lint.flake8-quotes]
@@ -198,6 +202,9 @@ inline-quotes = "single"
198
202
  [tool.ruff.lint.extend-per-file-ignores]
199
203
  "*/__init__.py" = ["F401"]
200
204
  "docs/conf.py" = ["E265"]
205
+ "*/test_*.py" = [
206
+ "B018", # Unassigned expressions are fine
207
+ ]
201
208
 
202
209
  [tool.ruff.format]
203
210
  quote-style = "single"