brkraw 0.5.3__tar.gz → 0.5.6__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 (204) hide show
  1. {brkraw-0.5.3 → brkraw-0.5.6}/.github/workflows/ci.yml +10 -0
  2. {brkraw-0.5.3 → brkraw-0.5.6}/.github/workflows/publish.yml +10 -0
  3. {brkraw-0.5.3 → brkraw-0.5.6}/.github/workflows/release.yml +46 -0
  4. brkraw-0.5.6/.github/workflows/release_on_merge.yml +126 -0
  5. {brkraw-0.5.3 → brkraw-0.5.6}/.gitignore +0 -1
  6. brkraw-0.5.6/.vscode/settings.json +4 -0
  7. brkraw-0.5.6/.vscode/tasks.json +86 -0
  8. {brkraw-0.5.3 → brkraw-0.5.6}/CITATION.cff +1 -1
  9. {brkraw-0.5.3 → brkraw-0.5.6}/PKG-INFO +4 -4
  10. {brkraw-0.5.3 → brkraw-0.5.6}/README.md +3 -3
  11. brkraw-0.5.6/RELEASE_NOTES.md +14 -0
  12. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/__init__.py +1 -1
  13. brkraw-0.5.6/brkraw/api/__init__.py +122 -0
  14. brkraw-0.5.6/brkraw/api/types.py +39 -0
  15. brkraw-0.5.6/brkraw/apps/loader/__init__.py +7 -0
  16. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/loader/core.py +128 -124
  17. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/loader/formatter.py +0 -2
  18. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/loader/helper.py +181 -68
  19. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/loader/info/scan.py +2 -2
  20. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/loader/info/transform.py +0 -1
  21. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/loader/types.py +37 -17
  22. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/cli/commands/addon.py +1 -1
  23. brkraw-0.5.6/brkraw/cli/commands/cache.py +82 -0
  24. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/cli/commands/config.py +2 -2
  25. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/cli/commands/convert.py +56 -14
  26. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/cli/commands/hook.py +1 -1
  27. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/cli/commands/info.py +1 -1
  28. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/cli/commands/init.py +1 -1
  29. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/cli/commands/params.py +1 -1
  30. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/cli/commands/prune.py +2 -2
  31. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/cli/main.py +51 -1
  32. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/cli/utils.py +1 -1
  33. brkraw-0.5.6/brkraw/core/cache.py +87 -0
  34. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/core/config.py +18 -2
  35. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/core/fs.py +26 -9
  36. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/core/zip.py +46 -32
  37. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/dataclasses/__init__.py +3 -2
  38. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/dataclasses/study.py +73 -23
  39. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/resolver/affine.py +11 -4
  40. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/resolver/datatype.py +10 -2
  41. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/resolver/image.py +140 -21
  42. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/resolver/nifti.py +1 -1
  43. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/specs/meta/validator.py +0 -1
  44. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/specs/rules/logic.py +1 -3
  45. brkraw-0.5.6/docs/assets/zenodo_badge.svg +35 -0
  46. brkraw-0.5.6/docs/cli/cache.md +53 -0
  47. {brkraw-0.5.3 → brkraw-0.5.6}/docs/dev/contributors.md +1 -1
  48. {brkraw-0.5.3 → brkraw-0.5.6}/mkdocs.yml +1 -0
  49. {brkraw-0.5.3 → brkraw-0.5.6}/pyproject.toml +1 -0
  50. {brkraw-0.5.3 → brkraw-0.5.6}/scripts/release_pr.py +113 -21
  51. brkraw-0.5.3/scripts/cff_to_biblatex.py → brkraw-0.5.6/scripts/update_readme_bibtex.py +33 -43
  52. brkraw-0.5.6/scripts/update_zenodo_badge.py +122 -0
  53. brkraw-0.5.3/.github/workflows/release_on_merge.yml +0 -53
  54. brkraw-0.5.3/RELEASE_NOTES.md +0 -13
  55. brkraw-0.5.3/brkraw/apps/loader/__init__.py +0 -10
  56. brkraw-0.5.3/scripts/release_notes.py +0 -99
  57. brkraw-0.5.3/scripts/update_readme_bibtex.py +0 -61
  58. brkraw-0.5.3/scripts/verify_release_version.py +0 -48
  59. {brkraw-0.5.3 → brkraw-0.5.6}/.github/DISCUSSION_TEMPLATE/proposal.yml +0 -0
  60. {brkraw-0.5.3 → brkraw-0.5.6}/.github/DISCUSSION_TEMPLATE/question.yml +0 -0
  61. {brkraw-0.5.3 → brkraw-0.5.6}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  62. {brkraw-0.5.3 → brkraw-0.5.6}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  63. {brkraw-0.5.3 → brkraw-0.5.6}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  64. {brkraw-0.5.3 → brkraw-0.5.6}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  65. {brkraw-0.5.3 → brkraw-0.5.6}/.github/copilot-instructions.md +0 -0
  66. {brkraw-0.5.3 → brkraw-0.5.6}/.github/workflows/docs.yml +0 -0
  67. {brkraw-0.5.3 → brkraw-0.5.6}/.markdownlint.yaml +0 -0
  68. {brkraw-0.5.3 → brkraw-0.5.6}/AGENTS.md +0 -0
  69. {brkraw-0.5.3 → brkraw-0.5.6}/CODE_OF_CONDUCT.md +0 -0
  70. {brkraw-0.5.3 → brkraw-0.5.6}/CONTRIBUTING.md +0 -0
  71. {brkraw-0.5.3 → brkraw-0.5.6}/LICENSE +0 -0
  72. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/__init__.py +0 -0
  73. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/addon/__init__.py +0 -0
  74. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/addon/core.py +0 -0
  75. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/addon/dependencies.py +0 -0
  76. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/addon/installation.py +0 -0
  77. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/addon/io.py +0 -0
  78. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/hook/__init__.py +0 -0
  79. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/hook/core.py +0 -0
  80. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/loader/info/__init__.py +0 -0
  81. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/loader/info/scan.yaml +0 -0
  82. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/loader/info/study.py +0 -0
  83. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/apps/loader/info/study.yaml +0 -0
  84. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/cli/__init__.py +0 -0
  85. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/cli/commands/__init__.py +0 -0
  86. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/cli/commands/session.py +0 -0
  87. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/cli/hook_args.py +0 -0
  88. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/core/__init__.py +0 -0
  89. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/core/entrypoints.py +0 -0
  90. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/core/formatter.py +0 -0
  91. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/core/jcamp.py +0 -0
  92. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/core/layout.py +0 -0
  93. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/core/parameters.py +0 -0
  94. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/dataclasses/node.py +0 -0
  95. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/dataclasses/reco.py +0 -0
  96. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/dataclasses/scan.py +0 -0
  97. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/default/__init__.py +0 -0
  98. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/default/pruner_specs/deid4share.yaml +0 -0
  99. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/default/rules/00_default.yaml +0 -0
  100. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/default/specs/metadata_dicom.yaml +0 -0
  101. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/default/specs/metadata_transforms.py +0 -0
  102. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/resolver/__init__.py +0 -0
  103. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/resolver/fid.py +0 -0
  104. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/resolver/helpers.py +0 -0
  105. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/resolver/shape.py +0 -0
  106. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/schema/__init__.py +0 -0
  107. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/schema/context_map.yaml +0 -0
  108. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/schema/meta.yaml +0 -0
  109. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/schema/niftiheader.yaml +0 -0
  110. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/schema/pruner.yaml +0 -0
  111. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/schema/remapper.yaml +0 -0
  112. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/schema/rules.yaml +0 -0
  113. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/specs/__init__.py +0 -0
  114. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/specs/hook/__init__.py +0 -0
  115. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/specs/hook/logic.py +0 -0
  116. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/specs/hook/validator.py +0 -0
  117. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/specs/meta/__init__.py +0 -0
  118. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/specs/pruner/__init__.py +0 -0
  119. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/specs/pruner/logic.py +0 -0
  120. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/specs/pruner/validator.py +0 -0
  121. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/specs/remapper/__init__.py +0 -0
  122. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/specs/remapper/logic.py +0 -0
  123. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/specs/remapper/validator.py +0 -0
  124. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/specs/rules/__init__.py +0 -0
  125. {brkraw-0.5.3 → brkraw-0.5.6}/brkraw/specs/rules/validator.py +0 -0
  126. {brkraw-0.5.3 → brkraw-0.5.6}/docs/api/addon.md +0 -0
  127. {brkraw-0.5.3 → brkraw-0.5.6}/docs/api/convert.md +0 -0
  128. {brkraw-0.5.3 → brkraw-0.5.6}/docs/api/data-access.md +0 -0
  129. {brkraw-0.5.3 → brkraw-0.5.6}/docs/api/hook.md +0 -0
  130. {brkraw-0.5.3 → brkraw-0.5.6}/docs/api/info.md +0 -0
  131. {brkraw-0.5.3 → brkraw-0.5.6}/docs/api/layout.md +0 -0
  132. {brkraw-0.5.3 → brkraw-0.5.6}/docs/api/overview.md +0 -0
  133. {brkraw-0.5.3 → brkraw-0.5.6}/docs/api/prune.md +0 -0
  134. {brkraw-0.5.3 → brkraw-0.5.6}/docs/assets/brkraw-logo-dark.svg +0 -0
  135. {brkraw-0.5.3 → brkraw-0.5.6}/docs/assets/brkraw-logo-light.svg +0 -0
  136. {brkraw-0.5.3 → brkraw-0.5.6}/docs/assets/brkraw-logo.svg +0 -0
  137. {brkraw-0.5.3 → brkraw-0.5.6}/docs/assets/favicon-16.png +0 -0
  138. {brkraw-0.5.3 → brkraw-0.5.6}/docs/assets/favicon-192.png +0 -0
  139. {brkraw-0.5.3 → brkraw-0.5.6}/docs/assets/favicon-32.png +0 -0
  140. {brkraw-0.5.3 → brkraw-0.5.6}/docs/assets/favicon-512.png +0 -0
  141. {brkraw-0.5.3 → brkraw-0.5.6}/docs/assets/favicon-dark.svg +0 -0
  142. {brkraw-0.5.3 → brkraw-0.5.6}/docs/assets/favicon-light.svg +0 -0
  143. {brkraw-0.5.3 → brkraw-0.5.6}/docs/assets/favicon.ico +0 -0
  144. {brkraw-0.5.3 → brkraw-0.5.6}/docs/assets/favicon.svg +0 -0
  145. {brkraw-0.5.3 → brkraw-0.5.6}/docs/assets/site.webmanifest +0 -0
  146. {brkraw-0.5.3 → brkraw-0.5.6}/docs/cli/addon.md +0 -0
  147. {brkraw-0.5.3 → brkraw-0.5.6}/docs/cli/config.md +0 -0
  148. {brkraw-0.5.3 → brkraw-0.5.6}/docs/cli/convert.md +0 -0
  149. {brkraw-0.5.3 → brkraw-0.5.6}/docs/cli/hook.md +0 -0
  150. {brkraw-0.5.3 → brkraw-0.5.6}/docs/cli/index.md +0 -0
  151. {brkraw-0.5.3 → brkraw-0.5.6}/docs/cli/info.md +0 -0
  152. {brkraw-0.5.3 → brkraw-0.5.6}/docs/cli/prune.md +0 -0
  153. {brkraw-0.5.3 → brkraw-0.5.6}/docs/cli/session.md +0 -0
  154. {brkraw-0.5.3 → brkraw-0.5.6}/docs/dev/cli-extensions.md +0 -0
  155. {brkraw-0.5.3 → brkraw-0.5.6}/docs/dev/contributing.md +0 -0
  156. {brkraw-0.5.3 → brkraw-0.5.6}/docs/dev/core-vs-addon.md +0 -0
  157. {brkraw-0.5.3 → brkraw-0.5.6}/docs/dev/documentation.md +0 -0
  158. {brkraw-0.5.3 → brkraw-0.5.6}/docs/dev/hook-packages.md +0 -0
  159. {brkraw-0.5.3 → brkraw-0.5.6}/docs/dev/roadmap.md +0 -0
  160. {brkraw-0.5.3 → brkraw-0.5.6}/docs/getting-started/api.md +0 -0
  161. {brkraw-0.5.3 → brkraw-0.5.6}/docs/getting-started/backup.md +0 -0
  162. {brkraw-0.5.3 → brkraw-0.5.6}/docs/getting-started/bids.md +0 -0
  163. {brkraw-0.5.3 → brkraw-0.5.6}/docs/getting-started/cli.md +0 -0
  164. {brkraw-0.5.3 → brkraw-0.5.6}/docs/getting-started/configuration.md +0 -0
  165. {brkraw-0.5.3 → brkraw-0.5.6}/docs/getting-started/hooks.md +0 -0
  166. {brkraw-0.5.3 → brkraw-0.5.6}/docs/getting-started/index.md +0 -0
  167. {brkraw-0.5.3 → brkraw-0.5.6}/docs/getting-started/mrs.md +0 -0
  168. {brkraw-0.5.3 → brkraw-0.5.6}/docs/getting-started/viewer.md +0 -0
  169. {brkraw-0.5.3 → brkraw-0.5.6}/docs/index.md +0 -0
  170. {brkraw-0.5.3 → brkraw-0.5.6}/docs/overrides/404.html +0 -0
  171. {brkraw-0.5.3 → brkraw-0.5.6}/docs/overrides/partials/extrahead.html +0 -0
  172. {brkraw-0.5.3 → brkraw-0.5.6}/docs/reference/addons-and-plugins.md +0 -0
  173. {brkraw-0.5.3 → brkraw-0.5.6}/docs/reference/cli-extensions.md +0 -0
  174. {brkraw-0.5.3 → brkraw-0.5.6}/docs/reference/context-map.md +0 -0
  175. {brkraw-0.5.3 → brkraw-0.5.6}/docs/reference/extensibility.md +0 -0
  176. {brkraw-0.5.3 → brkraw-0.5.6}/docs/reference/hook-packages.md +0 -0
  177. {brkraw-0.5.3 → brkraw-0.5.6}/docs/reference/layout.md +0 -0
  178. {brkraw-0.5.3 → brkraw-0.5.6}/docs/reference/rules.md +0 -0
  179. {brkraw-0.5.3 → brkraw-0.5.6}/docs/reference/specs.md +0 -0
  180. {brkraw-0.5.3 → brkraw-0.5.6}/docs/stylesheets/extra.css +0 -0
  181. {brkraw-0.5.3 → brkraw-0.5.6}/scripts/release_prep.py +0 -0
  182. {brkraw-0.5.3 → brkraw-0.5.6}/scripts/tag_and_push.py +0 -0
  183. {brkraw-0.5.3 → brkraw-0.5.6}/scripts/update_contributors.py +0 -0
  184. {brkraw-0.5.3 → brkraw-0.5.6}/tests/conftest.py +0 -0
  185. {brkraw-0.5.3 → brkraw-0.5.6}/tests/helpers.py +0 -0
  186. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_01_core/__init__.py +0 -0
  187. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_01_core/fixtures/acqp_EPI_pv5_1.jdx +0 -0
  188. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_01_core/fixtures/method_EPI_pv5_1.jdx +0 -0
  189. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_01_core/fixtures/method_FLASH_pv360_3_1.jdx +0 -0
  190. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_01_core/test_formatter.py +0 -0
  191. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_01_core/test_fs.py +0 -0
  192. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_01_core/test_jcamp.py +0 -0
  193. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_01_core/test_parameters.py +0 -0
  194. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_01_core/test_resources.py +0 -0
  195. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_01_core/test_zip.py +0 -0
  196. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_02_dataclasses/test_dir-vs-zipped.py +0 -0
  197. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_03_resolver/test_affine.py +0 -0
  198. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_04_specs/test_context_map_cases.py +0 -0
  199. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_04_specs/test_remapper.py +0 -0
  200. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_apps/test_affine_post_transform.py +0 -0
  201. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_apps/test_loader_info_missing_visu_pars.py +0 -0
  202. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_cli/test_hook_args_yaml.py +0 -0
  203. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_cli/test_hook_preset.py +0 -0
  204. {brkraw-0.5.3 → brkraw-0.5.6}/tests/test_scripts/test_update_contributors.py +0 -0
@@ -2,7 +2,17 @@ name: CI
2
2
 
3
3
  on:
4
4
  push:
5
+ paths:
6
+ - "src/**"
7
+ - "tests/**"
8
+ - "pyproject.toml"
9
+ - ".github/workflows/ci.yml"
5
10
  pull_request:
11
+ paths:
12
+ - "src/**"
13
+ - "tests/**"
14
+ - "pyproject.toml"
15
+ - ".github/workflows/ci.yml"
6
16
 
7
17
  jobs:
8
18
  pytest:
@@ -12,6 +12,16 @@ on:
12
12
  description: "Tag to publish (optional, e.g. v1.2.3)"
13
13
  required: false
14
14
  type: string
15
+ workflow_call:
16
+ inputs:
17
+ target:
18
+ description: "Publish target"
19
+ type: string
20
+ default: testpypi
21
+ tag:
22
+ description: "Tag to publish (optional, e.g. v1.2.3)"
23
+ required: false
24
+ type: string
15
25
 
16
26
  permissions:
17
27
  contents: read
@@ -14,11 +14,17 @@ on:
14
14
  permissions:
15
15
  contents: write
16
16
  discussions: write
17
+ id-token: write
18
+ actions: write
17
19
 
18
20
  jobs:
19
21
  release:
20
22
  if: ${{ github.repository == 'BrkRaw/brkraw' }}
21
23
  runs-on: ubuntu-latest
24
+ outputs:
25
+ prerelease: ${{ steps.prerelease.outputs.value }}
26
+ tag: ${{ steps.tag.outputs.value }}
27
+ zenodo_success: ${{ steps.zenodo.outcome == 'success' }}
22
28
  steps:
23
29
  - name: Resolve tag
24
30
  id: tag
@@ -127,3 +133,43 @@ jobs:
127
133
  if url:
128
134
  print(f"Created discussion: {url}")
129
135
  PY
136
+ - name: Checkout main for Zenodo badge update
137
+ uses: actions/checkout@v4
138
+ with:
139
+ ref: main
140
+ - name: Set up git identity
141
+ run: |
142
+ git config user.name "github-actions[bot]"
143
+ git config user.email "github-actions[bot]@users.noreply.github.com"
144
+ - name: Update Zenodo badge
145
+ id: zenodo
146
+ if: ${{ steps.prerelease.outputs.value != 'true' }}
147
+ continue-on-error: true
148
+ run: |
149
+ for i in $(seq 1 10); do
150
+ echo "Zenodo badge update attempt $i/10"
151
+ python3 scripts/update_zenodo_badge.py --up-to-date-exit-code 2
152
+ exit_code=$?
153
+ set -e
154
+
155
+ if [ "$exit_code" -eq 0 ]; then
156
+ echo "Zenodo badge updated."
157
+ exit 0
158
+ fi
159
+
160
+ if [ "$exit_code" -ne 2 ]; then
161
+ exit "$exit_code"
162
+ fi
163
+
164
+ sleep 60
165
+ done
166
+
167
+ echo "Zenodo badge still up to date after 10 attempts; giving up."
168
+
169
+ - name: Trigger publish workflow
170
+ env:
171
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
172
+ run: |
173
+ target="${{ steps.prerelease.outputs.value == 'true' && 'testpypi' || 'pypi' }}"
174
+ tag="${{ steps.tag.outputs.value }}"
175
+ gh workflow run publish.yml -f target="$target" -f tag="$tag"
@@ -0,0 +1,126 @@
1
+ name: Release On Merge
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+
7
+ permissions:
8
+ contents: write
9
+ actions: write
10
+
11
+ jobs:
12
+ tag_release:
13
+ if: ${{ github.repository == 'BrkRaw/brkraw' }}
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ with:
18
+ fetch-depth: 0
19
+ - name: Detect version change
20
+ id: version
21
+ env:
22
+ GH_TOKEN: ${{ github.token }}
23
+ REPO: ${{ github.repository }}
24
+ SHA: ${{ github.sha }}
25
+ BEFORE: ${{ github.event.before }}
26
+ run: |
27
+ set -euo pipefail
28
+
29
+ # Default outputs
30
+ echo "changed=false" >> "$GITHUB_OUTPUT"
31
+
32
+ # Only proceed for merge commits ("Merge pull request ...")
33
+ if [[ "${{ github.event.head_commit.message }}" != Merge\ pull\ request* ]]; then
34
+ echo "Not a merge commit. Skipping."
35
+ exit 0
36
+ fi
37
+
38
+ # Find the PR associated with this merge commit and ensure it has the 'release' label.
39
+ api="https://api.github.com/repos/${REPO}/commits/${SHA}/pulls"
40
+ pr_json=$(curl -fsSL \
41
+ -H "Authorization: Bearer ${GH_TOKEN}" \
42
+ -H "Accept: application/vnd.github+json" \
43
+ -H "Accept: application/vnd.github.groot-preview+json" \
44
+ "$api" || true)
45
+ export PR_JSON="$pr_json"
46
+
47
+ pr_number=$(python3 - <<'PY'
48
+ import json, os
49
+ s = os.environ.get('PR_JSON','')
50
+ if not s.strip():
51
+ print('')
52
+ raise SystemExit(0)
53
+ data = json.loads(s)
54
+ if isinstance(data, list) and data:
55
+ print(data[0].get('number',''))
56
+ else:
57
+ print('')
58
+ PY
59
+ )
60
+
61
+ if [[ -z "${pr_number}" ]]; then
62
+ echo "No PR associated with ${SHA}. Skipping."
63
+ exit 0
64
+ fi
65
+
66
+ labels_api="https://api.github.com/repos/${REPO}/issues/${pr_number}/labels"
67
+ labels_json=$(curl -fsSL \
68
+ -H "Authorization: Bearer ${GH_TOKEN}" \
69
+ -H "Accept: application/vnd.github+json" \
70
+ "$labels_api")
71
+ export LABELS_JSON="$labels_json"
72
+
73
+ has_release=$(python3 - <<'PY'
74
+ import json, os
75
+ labels = json.loads(os.environ['LABELS_JSON'])
76
+ names = {l.get('name','') for l in labels if isinstance(l, dict)}
77
+ print('true' if 'release' in names else 'false')
78
+ PY
79
+ )
80
+
81
+ if [[ "${has_release}" != "true" ]]; then
82
+ echo "PR #${pr_number} does not have 'release' label. Skipping."
83
+ exit 0
84
+ fi
85
+
86
+ # Check whether version file changed in this push
87
+ if ! git diff --name-only "${BEFORE}" "${SHA}" | grep -q '^src/brkraw/__init__.py$'; then
88
+ echo "src/brkraw/__init__.py not changed. Skipping."
89
+ exit 0
90
+ fi
91
+
92
+ version=$(python3 - <<'PY'
93
+ import re
94
+ from pathlib import Path
95
+
96
+ text = Path("src/brkraw/__init__.py").read_text(encoding="utf-8").lstrip("\ufeff")
97
+ match = re.search(
98
+ r"__version__(?:\s*:\s*[^=]+)?\s*=\s*[\"']([^\"']+)[\"']",
99
+ text,
100
+ )
101
+ if not match:
102
+ raise SystemExit("No __version__ found in src/brkraw/__init__.py")
103
+ print(match.group(1))
104
+ PY
105
+ )
106
+
107
+ echo "changed=true" >> "$GITHUB_OUTPUT"
108
+ echo "value=$version" >> "$GITHUB_OUTPUT"
109
+ shell: bash
110
+ - name: Create and push tag
111
+ if: ${{ steps.version.outputs.changed == 'true' }}
112
+ run: |
113
+ tag="${{ steps.version.outputs.value }}"
114
+ if git rev-parse "$tag" >/dev/null 2>&1; then
115
+ echo "Tag $tag already exists. Skipping."
116
+ exit 0
117
+ fi
118
+ git tag "$tag" "${{ github.sha }}"
119
+ git push origin "$tag"
120
+ - name: Trigger release workflow
121
+ if: ${{ steps.version.outputs.changed == 'true' }}
122
+ env:
123
+ GH_TOKEN: ${{ github.token }}
124
+ run: |
125
+ tag="${{ steps.version.outputs.value }}"
126
+ gh workflow run release.yml -f tag="$tag"
@@ -21,6 +21,5 @@ site/
21
21
  .direnv/
22
22
  .envrc
23
23
  .idea/
24
- .vscode/
25
24
  *.lock
26
25
  .tmp
@@ -0,0 +1,4 @@
1
+ {
2
+ "python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python",
3
+ "python.terminal.activateEnvironment": true
4
+ }
@@ -0,0 +1,86 @@
1
+ {
2
+ "version": "2.0.0",
3
+ "inputs": [
4
+ {
5
+ "id": "releaseVersion",
6
+ "type": "promptString",
7
+ "description": "Release version (e.g., 1.0.0)"
8
+ }
9
+ ],
10
+ "tasks": [
11
+ {
12
+ "label": "Standard: Setup venv + deps",
13
+ "type": "shell",
14
+ "command": "\"${command:python.interpreterPath}\" -m venv .venv && .venv/bin/python -m pip install -U pip && .venv/bin/python -m pip install -e \".[dev]\"",
15
+ "windows": {
16
+ "command": "\"${command:python.interpreterPath}\" -m venv .venv; .venv\\Scripts\\python -m pip install -U pip; .venv\\Scripts\\python -m pip install -e \".[dev]\"",
17
+ "options": {
18
+ "shell": {
19
+ "executable": "pwsh"
20
+ }
21
+ }
22
+ },
23
+ "group": "build",
24
+ "problemMatcher": []
25
+ },
26
+ {
27
+ "label": "Standard: Release Prep PR (2-step)",
28
+ "type": "shell",
29
+ "command": "\"${command:python.interpreterPath}\" scripts/release_pr.py --version ${input:releaseVersion} --base upstream/main --remote-upstream upstream --remote-origin origin",
30
+ "group": "build",
31
+ "problemMatcher": []
32
+ },
33
+ {
34
+ "label": "DryRun: Release Prep PR (2-step)",
35
+ "type": "shell",
36
+ "command": "\"${command:python.interpreterPath}\" scripts/release_pr.py --dry-run --version ${input:releaseVersion} --base upstream/main --remote-upstream upstream --remote-origin origin",
37
+ "group": "build",
38
+ "problemMatcher": []
39
+ },
40
+ {
41
+ "label": "Standard: MkDocs Serve",
42
+ "type": "shell",
43
+ "command": "\"${command:python.interpreterPath}\" -m mkdocs serve",
44
+ "group": "build",
45
+ "problemMatcher": []
46
+ },
47
+ {
48
+ "label": "Optional: Release Prep (bump + notes)",
49
+ "type": "shell",
50
+ "command": "\"${command:python.interpreterPath}\" scripts/update_contributors.py --source github --repo brkraw/brkraw --output docs/dev/contributors.md && \"${command:python.interpreterPath}\" scripts/release_prep.py --version ${input:releaseVersion} --fetch-tags --remote upstream",
51
+ "windows": {
52
+ "command": "pwsh -NoProfile -Command \"& \\\"${command:python.interpreterPath}\\\" scripts/update_contributors.py --source github --repo brkraw/brkraw --output docs/dev/contributors.md; if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE }; & \\\"${command:python.interpreterPath}\\\" scripts/release_prep.py --version ${input:releaseVersion} --fetch-tags --remote upstream\""
53
+ },
54
+ "group": "build",
55
+ "problemMatcher": []
56
+ },
57
+ {
58
+ "label": "Optional: Release Notes Only",
59
+ "type": "shell",
60
+ "command": "\"${command:python.interpreterPath}\" scripts/release_notes.py --fetch-tags --remote upstream",
61
+ "group": "build",
62
+ "problemMatcher": []
63
+ },
64
+ {
65
+ "label": "Optional: Release Tag + Push (upstream)",
66
+ "type": "shell",
67
+ "command": "\"${command:python.interpreterPath}\" scripts/tag_and_push.py",
68
+ "group": "build",
69
+ "problemMatcher": []
70
+ },
71
+ {
72
+ "label": "Optional: Docs Update Contributors (git)",
73
+ "type": "shell",
74
+ "command": "\"${command:python.interpreterPath}\" scripts/update_contributors.py --source git --output docs/dev/contributors.md",
75
+ "group": "build",
76
+ "problemMatcher": []
77
+ },
78
+ {
79
+ "label": "Optional: Docs Update Contributors (GitHub API)",
80
+ "type": "shell",
81
+ "command": "\"${command:python.interpreterPath}\" scripts/update_contributors.py --source github --repo brkraw/brkraw --output docs/dev/contributors.md",
82
+ "group": "build",
83
+ "problemMatcher": []
84
+ }
85
+ ]
86
+ }
@@ -34,4 +34,4 @@ keywords:
34
34
  - BIDS
35
35
  - neuroimaging
36
36
 
37
- version: "0.5.3"
37
+ version: "0.5.6"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brkraw
3
- Version: 0.5.3
3
+ Version: 0.5.6
4
4
  Summary: Toolkit for loading Bruker Paravision datasets, mapping metadata, and exporting NIfTI
5
5
  Project-URL: Homepage, https://brkraw.github.io
6
6
  Maintainer-email: SungHo Lee <shlee@unc.edu>
@@ -45,11 +45,11 @@ Description-Content-Type: text/markdown
45
45
  </picture>
46
46
  <!-- markdownlint-enable MD041 MD033 MD013 -->
47
47
 
48
- [![DOI](https://zenodo.org/badge/245546149.svg)](https://doi.org/10.5281/zenodo.3818614)
48
+ [![DOI](docs/assets/zenodo_badge.svg)](https://doi.org/10.5281/zenodo.3818614)
49
49
 
50
50
  A modular toolkit for Bruker MRI raw-data handling.
51
51
 
52
- BrkRaw (v0.5.3) converts raw data into standardized, neuroimaging-ready
52
+ BrkRaw (v0.5.6) converts raw data into standardized, neuroimaging-ready
53
53
  datasets, with extensible rules/specs and plugin hooks.
54
54
 
55
55
  - Documentation: [brkraw.github.io](https://brkraw.github.io/)
@@ -70,7 +70,7 @@ If you use BrkRaw in your research, please cite it.
70
70
  @software{brkraw,
71
71
  author = {Lee, Sung-Ho and Devenyi, Gabriel A. and Ban, Woomi and Shih, Yen-Yu Ian},
72
72
  title = {BrkRaw: A modular toolkit for Bruker MRI raw-data handling},
73
- version = {0.5.2},
73
+ version = {0.5.6},
74
74
  doi = {10.5281/zenodo.3818614},
75
75
  url = {https://github.com/BrkRaw/brkraw},
76
76
  note = {Documentation: https://brkraw.github.io},
@@ -6,11 +6,11 @@
6
6
  </picture>
7
7
  <!-- markdownlint-enable MD041 MD033 MD013 -->
8
8
 
9
- [![DOI](https://zenodo.org/badge/245546149.svg)](https://doi.org/10.5281/zenodo.3818614)
9
+ [![DOI](docs/assets/zenodo_badge.svg)](https://doi.org/10.5281/zenodo.3818614)
10
10
 
11
11
  A modular toolkit for Bruker MRI raw-data handling.
12
12
 
13
- BrkRaw (v0.5.3) converts raw data into standardized, neuroimaging-ready
13
+ BrkRaw (v0.5.6) converts raw data into standardized, neuroimaging-ready
14
14
  datasets, with extensible rules/specs and plugin hooks.
15
15
 
16
16
  - Documentation: [brkraw.github.io](https://brkraw.github.io/)
@@ -31,7 +31,7 @@ If you use BrkRaw in your research, please cite it.
31
31
  @software{brkraw,
32
32
  author = {Lee, Sung-Ho and Devenyi, Gabriel A. and Ban, Woomi and Shih, Yen-Yu Ian},
33
33
  title = {BrkRaw: A modular toolkit for Bruker MRI raw-data handling},
34
- version = {0.5.2},
34
+ version = {0.5.6},
35
35
  doi = {10.5281/zenodo.3818614},
36
36
  url = {https://github.com/BrkRaw/brkraw},
37
37
  note = {Documentation: https://brkraw.github.io},
@@ -0,0 +1,14 @@
1
+ # Release v0.5.6
2
+
3
+ Date: 2026-01-29
4
+ Changes since 0.5.5
5
+
6
+ - chore: prepare release v0.5.6 (3a23f42)
7
+ - docs: update contributors (b36012b)
8
+ - ci: replace the locaiton of gh command to get pr number (e522e6b)
9
+ - fix: cast NIfTI dataobj shape (f0bae05)
10
+ - fix: make type aliases explicit (ad1d065)
11
+ - ci: add actions:write permission to trigger other workflow. (2a4a71d)
12
+ - ci: fix Zenodo badge update retry logic (ff66a7d)
13
+ - Update Zenodo DOI badge (a6d453e)
14
+ - ci(release): allow OIDC by granting id-token permission (db29a36)
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = '0.5.3'
3
+ __version__ = '0.5.6'
4
4
  from .apps.loader import BrukerLoader
5
5
 
6
6
 
@@ -0,0 +1,122 @@
1
+ """Public API surface for BrkRaw.
2
+
3
+ This module intentionally re-exports a curated set of symbols for external use.
4
+ To keep import-time fast and reduce side effects, most symbols are lazily
5
+ imported on first access (PEP 562: module `__getattr__`).
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from importlib import import_module
11
+ from typing import TYPE_CHECKING, Any, Dict, Tuple
12
+
13
+ # Public API -----------------------------------------------------------------
14
+
15
+ __all__ = [
16
+ "formatter",
17
+ "BrukerLoader",
18
+ "loader",
19
+ "hook",
20
+ "hook_manager",
21
+ "hook_resolver",
22
+ "pruner",
23
+ "rules",
24
+ "addon",
25
+ "addon_manager",
26
+ "validate_meta",
27
+ "transform",
28
+ "info_resolver",
29
+ "affine_resolver",
30
+ "shape_resolver",
31
+ "image_resolver",
32
+ "fid_resolver",
33
+ "nifti_resolver",
34
+ "types",
35
+ "config",
36
+ ]
37
+
38
+ # Lazy import map: name -> (module_path, attribute_name or None)
39
+ # If attribute_name is None, the module itself is returned.
40
+ _LAZY: Dict[str, Tuple[str, str | None]] = {
41
+ # core
42
+ "formatter": ("brkraw.core", "formatter"),
43
+
44
+ # apps
45
+ "BrukerLoader": ("brkraw.apps.loader", "BrukerLoader"),
46
+ "loader": ("brkraw.apps", "loader"),
47
+ "hook_manager": ("brkraw.apps", "hook"),
48
+ "addon_manager": ("brkraw.apps", "addon"),
49
+ "hook_resolver": ("brkraw.apps.loader.helper", "resolve_converter_hook"),
50
+ "config": ("brkraw.core", "config"),
51
+
52
+ # apps.loader.info resolvers
53
+ "info_resolver": ("brkraw.apps.loader", "info"),
54
+ "transform": ("brkraw.apps.loader.info", "transform"),
55
+
56
+ # resolvers
57
+ "affine_resolver": ("brkraw.resolver", "affine"),
58
+ "shape_resolver": ("brkraw.resolver", "shape"),
59
+ "image_resolver": ("brkraw.resolver", "image"),
60
+ "fid_resolver": ("brkraw.resolver", "fid"),
61
+ "nifti_resolver": ("brkraw.resolver", "nifti"),
62
+
63
+ # specs
64
+ "hook": ("brkraw.specs", "hook"),
65
+ "pruner": ("brkraw.specs", "pruner"),
66
+ "rules": ("brkraw.specs", "rules"),
67
+ "addon": ("brkraw.specs", "remapper"),
68
+
69
+ # meta
70
+ "validate_meta": ("brkraw.specs.meta", "validate_meta"),
71
+
72
+ # local
73
+ "types": ("brkraw.api", "types"),
74
+ }
75
+
76
+
77
+ def __getattr__(name: str) -> Any:
78
+ """Lazily import and return public symbols.
79
+
80
+ This keeps import-time minimal while preserving the convenient
81
+ `brkraw.api.<symbol>` access pattern.
82
+ """
83
+
84
+ try:
85
+ mod_path, attr = _LAZY[name]
86
+ except KeyError as e:
87
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}") from e
88
+
89
+ mod = import_module(mod_path)
90
+ obj = mod if attr is None else getattr(mod, attr)
91
+
92
+ # Cache the resolved object on the module for fast subsequent access.
93
+ globals()[name] = obj
94
+ return obj
95
+
96
+
97
+ def __dir__() -> list[str]:
98
+ # Expose the curated public surface in interactive environments.
99
+ return sorted(set(__all__))
100
+
101
+
102
+ # Type-checking / IDE support -------------------------------------------------
103
+ # Importing these only for type-checking keeps runtime imports lazy.
104
+ if TYPE_CHECKING:
105
+ from brkraw.core import formatter as formatter
106
+ from brkraw.core import config as config
107
+ from brkraw.apps.loader import BrukerLoader as BrukerLoader
108
+ from brkraw.apps.loader import info as info_resolver
109
+ from brkraw.apps.loader.info import transform as transform
110
+ from brkraw.apps.loader.helper import resolve_converter_hook as hook_resolver
111
+ from brkraw.apps import addon as addon_manager, hook as hook_manager, loader as loader
112
+ from brkraw.resolver import (
113
+ affine as affine_resolver,
114
+ fid as fid_resolver,
115
+ image as image_resolver,
116
+ nifti as nifti_resolver,
117
+ shape as shape_resolver,
118
+ )
119
+ from brkraw.specs import hook as hook, pruner as pruner, rules as rules
120
+ from brkraw.specs import remapper as addon
121
+ from brkraw.specs.meta import validate_meta as validate_meta
122
+ from brkraw.api import types as types
@@ -0,0 +1,39 @@
1
+ from ..apps.loader.types import (
2
+ StudyLoader,
3
+ ScanLoader,
4
+ RecoLoader
5
+ )
6
+ from ..apps.loader.types import (
7
+ GetAffineType,
8
+ GetDataobjType,
9
+ ConvertType,
10
+ ConverterHook,
11
+ SubjectType,
12
+ SubjectPose,
13
+ AffineSpace,
14
+ Affines,
15
+ Dataobjs,
16
+ Metadata,
17
+ ConvertedObj,
18
+ HookArgs
19
+ )
20
+ from ..core.parameters import Parameters
21
+
22
+ __all__ = [
23
+ "GetAffineType",
24
+ "GetDataobjType",
25
+ "ConvertType",
26
+ "ConverterHook",
27
+ "StudyLoader",
28
+ "ScanLoader",
29
+ "RecoLoader",
30
+ "SubjectType",
31
+ "SubjectPose",
32
+ "AffineSpace",
33
+ "Affines",
34
+ "Dataobjs",
35
+ "Metadata",
36
+ "ConvertedObj",
37
+ "HookArgs",
38
+ "Parameters"
39
+ ]
@@ -0,0 +1,7 @@
1
+ from __future__ import annotations
2
+
3
+ from .core import BrukerLoader
4
+
5
+ __all__ = [
6
+ "BrukerLoader"
7
+ ]