brkraw 0.5.3__tar.gz → 0.5.5__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.5}/.github/workflows/ci.yml +10 -0
  2. {brkraw-0.5.3 → brkraw-0.5.5}/.github/workflows/publish.yml +10 -0
  3. {brkraw-0.5.3 → brkraw-0.5.5}/.github/workflows/release.yml +39 -0
  4. brkraw-0.5.5/.github/workflows/release_on_merge.yml +118 -0
  5. {brkraw-0.5.3 → brkraw-0.5.5}/.gitignore +0 -1
  6. brkraw-0.5.5/.vscode/settings.json +4 -0
  7. brkraw-0.5.5/.vscode/tasks.json +86 -0
  8. {brkraw-0.5.3 → brkraw-0.5.5}/CITATION.cff +1 -1
  9. {brkraw-0.5.3 → brkraw-0.5.5}/PKG-INFO +4 -4
  10. {brkraw-0.5.3 → brkraw-0.5.5}/README.md +3 -3
  11. brkraw-0.5.5/RELEASE_NOTES.md +17 -0
  12. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/__init__.py +1 -1
  13. brkraw-0.5.5/brkraw/api/__init__.py +122 -0
  14. brkraw-0.5.5/brkraw/api/types.py +39 -0
  15. brkraw-0.5.5/brkraw/apps/loader/__init__.py +7 -0
  16. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/loader/core.py +128 -124
  17. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/loader/formatter.py +0 -2
  18. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/loader/helper.py +181 -68
  19. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/loader/info/scan.py +2 -2
  20. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/loader/info/transform.py +0 -1
  21. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/loader/types.py +35 -15
  22. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/cli/commands/addon.py +1 -1
  23. brkraw-0.5.5/brkraw/cli/commands/cache.py +82 -0
  24. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/cli/commands/config.py +2 -2
  25. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/cli/commands/convert.py +56 -14
  26. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/cli/commands/hook.py +1 -1
  27. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/cli/commands/info.py +1 -1
  28. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/cli/commands/init.py +1 -1
  29. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/cli/commands/params.py +1 -1
  30. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/cli/commands/prune.py +2 -2
  31. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/cli/main.py +51 -1
  32. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/cli/utils.py +1 -1
  33. brkraw-0.5.5/brkraw/core/cache.py +87 -0
  34. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/core/config.py +18 -2
  35. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/core/fs.py +26 -9
  36. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/core/zip.py +46 -32
  37. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/dataclasses/__init__.py +3 -2
  38. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/dataclasses/study.py +73 -23
  39. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/resolver/datatype.py +10 -2
  40. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/resolver/image.py +140 -21
  41. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/specs/meta/validator.py +0 -1
  42. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/specs/rules/logic.py +1 -3
  43. brkraw-0.5.5/docs/assets/zenodo_badge.svg +35 -0
  44. brkraw-0.5.5/docs/cli/cache.md +53 -0
  45. {brkraw-0.5.3 → brkraw-0.5.5}/docs/dev/contributors.md +1 -1
  46. {brkraw-0.5.3 → brkraw-0.5.5}/mkdocs.yml +1 -0
  47. {brkraw-0.5.3 → brkraw-0.5.5}/pyproject.toml +1 -0
  48. {brkraw-0.5.3 → brkraw-0.5.5}/scripts/release_pr.py +103 -11
  49. brkraw-0.5.3/scripts/cff_to_biblatex.py → brkraw-0.5.5/scripts/update_readme_bibtex.py +33 -43
  50. brkraw-0.5.5/scripts/update_zenodo_badge.py +122 -0
  51. brkraw-0.5.3/.github/workflows/release_on_merge.yml +0 -53
  52. brkraw-0.5.3/RELEASE_NOTES.md +0 -13
  53. brkraw-0.5.3/brkraw/apps/loader/__init__.py +0 -10
  54. brkraw-0.5.3/scripts/release_notes.py +0 -99
  55. brkraw-0.5.3/scripts/update_readme_bibtex.py +0 -61
  56. brkraw-0.5.3/scripts/verify_release_version.py +0 -48
  57. {brkraw-0.5.3 → brkraw-0.5.5}/.github/DISCUSSION_TEMPLATE/proposal.yml +0 -0
  58. {brkraw-0.5.3 → brkraw-0.5.5}/.github/DISCUSSION_TEMPLATE/question.yml +0 -0
  59. {brkraw-0.5.3 → brkraw-0.5.5}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  60. {brkraw-0.5.3 → brkraw-0.5.5}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  61. {brkraw-0.5.3 → brkraw-0.5.5}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  62. {brkraw-0.5.3 → brkraw-0.5.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  63. {brkraw-0.5.3 → brkraw-0.5.5}/.github/copilot-instructions.md +0 -0
  64. {brkraw-0.5.3 → brkraw-0.5.5}/.github/workflows/docs.yml +0 -0
  65. {brkraw-0.5.3 → brkraw-0.5.5}/.markdownlint.yaml +0 -0
  66. {brkraw-0.5.3 → brkraw-0.5.5}/AGENTS.md +0 -0
  67. {brkraw-0.5.3 → brkraw-0.5.5}/CODE_OF_CONDUCT.md +0 -0
  68. {brkraw-0.5.3 → brkraw-0.5.5}/CONTRIBUTING.md +0 -0
  69. {brkraw-0.5.3 → brkraw-0.5.5}/LICENSE +0 -0
  70. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/__init__.py +0 -0
  71. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/addon/__init__.py +0 -0
  72. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/addon/core.py +0 -0
  73. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/addon/dependencies.py +0 -0
  74. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/addon/installation.py +0 -0
  75. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/addon/io.py +0 -0
  76. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/hook/__init__.py +0 -0
  77. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/hook/core.py +0 -0
  78. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/loader/info/__init__.py +0 -0
  79. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/loader/info/scan.yaml +0 -0
  80. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/loader/info/study.py +0 -0
  81. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/apps/loader/info/study.yaml +0 -0
  82. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/cli/__init__.py +0 -0
  83. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/cli/commands/__init__.py +0 -0
  84. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/cli/commands/session.py +0 -0
  85. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/cli/hook_args.py +0 -0
  86. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/core/__init__.py +0 -0
  87. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/core/entrypoints.py +0 -0
  88. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/core/formatter.py +0 -0
  89. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/core/jcamp.py +0 -0
  90. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/core/layout.py +0 -0
  91. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/core/parameters.py +0 -0
  92. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/dataclasses/node.py +0 -0
  93. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/dataclasses/reco.py +0 -0
  94. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/dataclasses/scan.py +0 -0
  95. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/default/__init__.py +0 -0
  96. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/default/pruner_specs/deid4share.yaml +0 -0
  97. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/default/rules/00_default.yaml +0 -0
  98. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/default/specs/metadata_dicom.yaml +0 -0
  99. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/default/specs/metadata_transforms.py +0 -0
  100. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/resolver/__init__.py +0 -0
  101. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/resolver/affine.py +0 -0
  102. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/resolver/fid.py +0 -0
  103. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/resolver/helpers.py +0 -0
  104. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/resolver/nifti.py +0 -0
  105. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/resolver/shape.py +0 -0
  106. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/schema/__init__.py +0 -0
  107. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/schema/context_map.yaml +0 -0
  108. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/schema/meta.yaml +0 -0
  109. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/schema/niftiheader.yaml +0 -0
  110. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/schema/pruner.yaml +0 -0
  111. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/schema/remapper.yaml +0 -0
  112. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/schema/rules.yaml +0 -0
  113. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/specs/__init__.py +0 -0
  114. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/specs/hook/__init__.py +0 -0
  115. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/specs/hook/logic.py +0 -0
  116. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/specs/hook/validator.py +0 -0
  117. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/specs/meta/__init__.py +0 -0
  118. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/specs/pruner/__init__.py +0 -0
  119. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/specs/pruner/logic.py +0 -0
  120. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/specs/pruner/validator.py +0 -0
  121. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/specs/remapper/__init__.py +0 -0
  122. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/specs/remapper/logic.py +0 -0
  123. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/specs/remapper/validator.py +0 -0
  124. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/specs/rules/__init__.py +0 -0
  125. {brkraw-0.5.3 → brkraw-0.5.5}/brkraw/specs/rules/validator.py +0 -0
  126. {brkraw-0.5.3 → brkraw-0.5.5}/docs/api/addon.md +0 -0
  127. {brkraw-0.5.3 → brkraw-0.5.5}/docs/api/convert.md +0 -0
  128. {brkraw-0.5.3 → brkraw-0.5.5}/docs/api/data-access.md +0 -0
  129. {brkraw-0.5.3 → brkraw-0.5.5}/docs/api/hook.md +0 -0
  130. {brkraw-0.5.3 → brkraw-0.5.5}/docs/api/info.md +0 -0
  131. {brkraw-0.5.3 → brkraw-0.5.5}/docs/api/layout.md +0 -0
  132. {brkraw-0.5.3 → brkraw-0.5.5}/docs/api/overview.md +0 -0
  133. {brkraw-0.5.3 → brkraw-0.5.5}/docs/api/prune.md +0 -0
  134. {brkraw-0.5.3 → brkraw-0.5.5}/docs/assets/brkraw-logo-dark.svg +0 -0
  135. {brkraw-0.5.3 → brkraw-0.5.5}/docs/assets/brkraw-logo-light.svg +0 -0
  136. {brkraw-0.5.3 → brkraw-0.5.5}/docs/assets/brkraw-logo.svg +0 -0
  137. {brkraw-0.5.3 → brkraw-0.5.5}/docs/assets/favicon-16.png +0 -0
  138. {brkraw-0.5.3 → brkraw-0.5.5}/docs/assets/favicon-192.png +0 -0
  139. {brkraw-0.5.3 → brkraw-0.5.5}/docs/assets/favicon-32.png +0 -0
  140. {brkraw-0.5.3 → brkraw-0.5.5}/docs/assets/favicon-512.png +0 -0
  141. {brkraw-0.5.3 → brkraw-0.5.5}/docs/assets/favicon-dark.svg +0 -0
  142. {brkraw-0.5.3 → brkraw-0.5.5}/docs/assets/favicon-light.svg +0 -0
  143. {brkraw-0.5.3 → brkraw-0.5.5}/docs/assets/favicon.ico +0 -0
  144. {brkraw-0.5.3 → brkraw-0.5.5}/docs/assets/favicon.svg +0 -0
  145. {brkraw-0.5.3 → brkraw-0.5.5}/docs/assets/site.webmanifest +0 -0
  146. {brkraw-0.5.3 → brkraw-0.5.5}/docs/cli/addon.md +0 -0
  147. {brkraw-0.5.3 → brkraw-0.5.5}/docs/cli/config.md +0 -0
  148. {brkraw-0.5.3 → brkraw-0.5.5}/docs/cli/convert.md +0 -0
  149. {brkraw-0.5.3 → brkraw-0.5.5}/docs/cli/hook.md +0 -0
  150. {brkraw-0.5.3 → brkraw-0.5.5}/docs/cli/index.md +0 -0
  151. {brkraw-0.5.3 → brkraw-0.5.5}/docs/cli/info.md +0 -0
  152. {brkraw-0.5.3 → brkraw-0.5.5}/docs/cli/prune.md +0 -0
  153. {brkraw-0.5.3 → brkraw-0.5.5}/docs/cli/session.md +0 -0
  154. {brkraw-0.5.3 → brkraw-0.5.5}/docs/dev/cli-extensions.md +0 -0
  155. {brkraw-0.5.3 → brkraw-0.5.5}/docs/dev/contributing.md +0 -0
  156. {brkraw-0.5.3 → brkraw-0.5.5}/docs/dev/core-vs-addon.md +0 -0
  157. {brkraw-0.5.3 → brkraw-0.5.5}/docs/dev/documentation.md +0 -0
  158. {brkraw-0.5.3 → brkraw-0.5.5}/docs/dev/hook-packages.md +0 -0
  159. {brkraw-0.5.3 → brkraw-0.5.5}/docs/dev/roadmap.md +0 -0
  160. {brkraw-0.5.3 → brkraw-0.5.5}/docs/getting-started/api.md +0 -0
  161. {brkraw-0.5.3 → brkraw-0.5.5}/docs/getting-started/backup.md +0 -0
  162. {brkraw-0.5.3 → brkraw-0.5.5}/docs/getting-started/bids.md +0 -0
  163. {brkraw-0.5.3 → brkraw-0.5.5}/docs/getting-started/cli.md +0 -0
  164. {brkraw-0.5.3 → brkraw-0.5.5}/docs/getting-started/configuration.md +0 -0
  165. {brkraw-0.5.3 → brkraw-0.5.5}/docs/getting-started/hooks.md +0 -0
  166. {brkraw-0.5.3 → brkraw-0.5.5}/docs/getting-started/index.md +0 -0
  167. {brkraw-0.5.3 → brkraw-0.5.5}/docs/getting-started/mrs.md +0 -0
  168. {brkraw-0.5.3 → brkraw-0.5.5}/docs/getting-started/viewer.md +0 -0
  169. {brkraw-0.5.3 → brkraw-0.5.5}/docs/index.md +0 -0
  170. {brkraw-0.5.3 → brkraw-0.5.5}/docs/overrides/404.html +0 -0
  171. {brkraw-0.5.3 → brkraw-0.5.5}/docs/overrides/partials/extrahead.html +0 -0
  172. {brkraw-0.5.3 → brkraw-0.5.5}/docs/reference/addons-and-plugins.md +0 -0
  173. {brkraw-0.5.3 → brkraw-0.5.5}/docs/reference/cli-extensions.md +0 -0
  174. {brkraw-0.5.3 → brkraw-0.5.5}/docs/reference/context-map.md +0 -0
  175. {brkraw-0.5.3 → brkraw-0.5.5}/docs/reference/extensibility.md +0 -0
  176. {brkraw-0.5.3 → brkraw-0.5.5}/docs/reference/hook-packages.md +0 -0
  177. {brkraw-0.5.3 → brkraw-0.5.5}/docs/reference/layout.md +0 -0
  178. {brkraw-0.5.3 → brkraw-0.5.5}/docs/reference/rules.md +0 -0
  179. {brkraw-0.5.3 → brkraw-0.5.5}/docs/reference/specs.md +0 -0
  180. {brkraw-0.5.3 → brkraw-0.5.5}/docs/stylesheets/extra.css +0 -0
  181. {brkraw-0.5.3 → brkraw-0.5.5}/scripts/release_prep.py +0 -0
  182. {brkraw-0.5.3 → brkraw-0.5.5}/scripts/tag_and_push.py +0 -0
  183. {brkraw-0.5.3 → brkraw-0.5.5}/scripts/update_contributors.py +0 -0
  184. {brkraw-0.5.3 → brkraw-0.5.5}/tests/conftest.py +0 -0
  185. {brkraw-0.5.3 → brkraw-0.5.5}/tests/helpers.py +0 -0
  186. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_01_core/__init__.py +0 -0
  187. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_01_core/fixtures/acqp_EPI_pv5_1.jdx +0 -0
  188. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_01_core/fixtures/method_EPI_pv5_1.jdx +0 -0
  189. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_01_core/fixtures/method_FLASH_pv360_3_1.jdx +0 -0
  190. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_01_core/test_formatter.py +0 -0
  191. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_01_core/test_fs.py +0 -0
  192. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_01_core/test_jcamp.py +0 -0
  193. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_01_core/test_parameters.py +0 -0
  194. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_01_core/test_resources.py +0 -0
  195. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_01_core/test_zip.py +0 -0
  196. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_02_dataclasses/test_dir-vs-zipped.py +0 -0
  197. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_03_resolver/test_affine.py +0 -0
  198. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_04_specs/test_context_map_cases.py +0 -0
  199. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_04_specs/test_remapper.py +0 -0
  200. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_apps/test_affine_post_transform.py +0 -0
  201. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_apps/test_loader_info_missing_visu_pars.py +0 -0
  202. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_cli/test_hook_args_yaml.py +0 -0
  203. {brkraw-0.5.3 → brkraw-0.5.5}/tests/test_cli/test_hook_preset.py +0 -0
  204. {brkraw-0.5.3 → brkraw-0.5.5}/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
@@ -19,6 +19,10 @@ jobs:
19
19
  release:
20
20
  if: ${{ github.repository == 'BrkRaw/brkraw' }}
21
21
  runs-on: ubuntu-latest
22
+ outputs:
23
+ prerelease: ${{ steps.prerelease.outputs.value }}
24
+ tag: ${{ steps.tag.outputs.value }}
25
+ zenodo_success: ${{ steps.zenodo.outcome == 'success' }}
22
26
  steps:
23
27
  - name: Resolve tag
24
28
  id: tag
@@ -127,3 +131,38 @@ jobs:
127
131
  if url:
128
132
  print(f"Created discussion: {url}")
129
133
  PY
134
+ - name: Checkout main for Zenodo badge update
135
+ uses: actions/checkout@v4
136
+ with:
137
+ ref: main
138
+ - name: Set up git identity
139
+ run: |
140
+ git config user.name "github-actions[bot]"
141
+ git config user.email "github-actions[bot]@users.noreply.github.com"
142
+ - name: Update Zenodo badge
143
+ id: zenodo
144
+ if: ${{ steps.prerelease.outputs.value != 'true' }}
145
+ continue-on-error: true
146
+ run: |
147
+ for i in $(seq 1 10); do
148
+ echo "Zenodo badge update attempt $i/10"
149
+ python3 scripts/update_zenodo_badge.py --up-to-date-exit-code 2
150
+ exit_code=$?
151
+ if [ "$exit_code" -eq 0 ]; then
152
+ echo "Zenodo badge updated."
153
+ exit 0
154
+ fi
155
+ if [ "$exit_code" -ne 2 ]; then
156
+ exit "$exit_code"
157
+ fi
158
+ sleep 60
159
+ done
160
+ echo "Zenodo badge still up to date after 10 attempts; giving up."
161
+
162
+ publish:
163
+ if: ${{ github.repository == 'BrkRaw/brkraw' && (needs.release.outputs.prerelease == 'true' || needs.release.outputs.zenodo_success == 'true') }}
164
+ needs: [release]
165
+ uses: ./.github/workflows/publish.yml
166
+ with:
167
+ target: ${{ needs.release.outputs.prerelease == 'true' && 'testpypi' || 'pypi' }}
168
+ tag: ${{ needs.release.outputs.tag }}
@@ -0,0 +1,118 @@
1
+ name: Release On Merge
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+
7
+ permissions:
8
+ contents: write
9
+
10
+ jobs:
11
+ tag_release:
12
+ if: ${{ github.repository == 'BrkRaw/brkraw' }}
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ with:
17
+ fetch-depth: 0
18
+ - name: Detect version change
19
+ id: version
20
+ env:
21
+ GH_TOKEN: ${{ github.token }}
22
+ REPO: ${{ github.repository }}
23
+ SHA: ${{ github.sha }}
24
+ BEFORE: ${{ github.event.before }}
25
+ run: |
26
+ set -euo pipefail
27
+
28
+ # Default outputs
29
+ echo "changed=false" >> "$GITHUB_OUTPUT"
30
+
31
+ # Only proceed for merge commits ("Merge pull request ...")
32
+ if [[ "${{ github.event.head_commit.message }}" != Merge\ pull\ request* ]]; then
33
+ echo "Not a merge commit. Skipping."
34
+ exit 0
35
+ fi
36
+
37
+ # Find the PR associated with this merge commit and ensure it has the 'release' label.
38
+ api="https://api.github.com/repos/${REPO}/commits/${SHA}/pulls"
39
+ pr_json=$(curl -fsSL \
40
+ -H "Authorization: Bearer ${GH_TOKEN}" \
41
+ -H "Accept: application/vnd.github+json" \
42
+ -H "Accept: application/vnd.github.groot-preview+json" \
43
+ "$api" || true)
44
+ export PR_JSON="$pr_json"
45
+
46
+ pr_number=$(python3 - <<'PY'
47
+ import json, os
48
+ s = os.environ.get('PR_JSON','')
49
+ if not s.strip():
50
+ print('')
51
+ raise SystemExit(0)
52
+ data = json.loads(s)
53
+ if isinstance(data, list) and data:
54
+ print(data[0].get('number',''))
55
+ else:
56
+ print('')
57
+ PY
58
+ )
59
+
60
+ if [[ -z "${pr_number}" ]]; then
61
+ echo "No PR associated with ${SHA}. Skipping."
62
+ exit 0
63
+ fi
64
+
65
+ labels_api="https://api.github.com/repos/${REPO}/issues/${pr_number}/labels"
66
+ labels_json=$(curl -fsSL \
67
+ -H "Authorization: Bearer ${GH_TOKEN}" \
68
+ -H "Accept: application/vnd.github+json" \
69
+ "$labels_api")
70
+ export LABELS_JSON="$labels_json"
71
+
72
+ has_release=$(python3 - <<'PY'
73
+ import json, os
74
+ labels = json.loads(os.environ['LABELS_JSON'])
75
+ names = {l.get('name','') for l in labels if isinstance(l, dict)}
76
+ print('true' if 'release' in names else 'false')
77
+ PY
78
+ )
79
+
80
+ if [[ "${has_release}" != "true" ]]; then
81
+ echo "PR #${pr_number} does not have 'release' label. Skipping."
82
+ exit 0
83
+ fi
84
+
85
+ # Check whether version file changed in this push
86
+ if ! git diff --name-only "${BEFORE}" "${SHA}" | grep -q '^src/brkraw/__init__.py$'; then
87
+ echo "src/brkraw/__init__.py not changed. Skipping."
88
+ exit 0
89
+ fi
90
+
91
+ version=$(python3 - <<'PY'
92
+ import re
93
+ from pathlib import Path
94
+
95
+ text = Path("src/brkraw/__init__.py").read_text(encoding="utf-8").lstrip("\ufeff")
96
+ match = re.search(
97
+ r"__version__(?:\s*:\s*[^=]+)?\s*=\s*[\"']([^\"']+)[\"']",
98
+ text,
99
+ )
100
+ if not match:
101
+ raise SystemExit("No __version__ found in src/brkraw/__init__.py")
102
+ print(match.group(1))
103
+ PY
104
+ )
105
+
106
+ echo "changed=true" >> "$GITHUB_OUTPUT"
107
+ echo "value=$version" >> "$GITHUB_OUTPUT"
108
+ shell: bash
109
+ - name: Create and push tag
110
+ if: ${{ steps.version.outputs.changed == 'true' }}
111
+ run: |
112
+ tag="${{ steps.version.outputs.value }}"
113
+ if git rev-parse "$tag" >/dev/null 2>&1; then
114
+ echo "Tag $tag already exists. Skipping."
115
+ exit 0
116
+ fi
117
+ git tag "$tag" "${{ github.sha }}"
118
+ git push origin "$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.5"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brkraw
3
- Version: 0.5.3
3
+ Version: 0.5.5
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.5) 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.5},
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.5) 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.5},
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,17 @@
1
+ # Release v0.5.5
2
+
3
+ Date: 2026-01-27
4
+ Changes since 0.5.4
5
+
6
+ - chore: prepare release v0.5.5 (c3260df)
7
+ - docs: update contributors (a7bf3ef)
8
+ - update: vscode, auto activate environment setting. (95e6868)
9
+ - Chore: wire release → publish workflow (3419d97)
10
+ - Use VS Code interpreter for venv setup task (5aed156)
11
+ - Update release workflow and scripts for Zenodo badge + bibtex generation (e63e007)
12
+ - Patch for brkraw-viewer lazy loading (avoid eager data resolution) (c916625)
13
+ - chore(api): config module (2fa90fc)
14
+ - chore(api): hook resolver (9c36e95)
15
+ - chore(api): minor remapping (f2ef87e)
16
+ - chore(api): ensure naming consistency (9010542)
17
+ - refactor(loader): improve hook handling logic (5c5a0e7)
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = '0.5.3'
3
+ __version__ = '0.5.5'
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
+ ]