arrayview 0.32.0__tar.gz → 0.33.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 (250) hide show
  1. {arrayview-0.32.0 → arrayview-0.33.0}/PKG-INFO +4 -1
  2. {arrayview-0.32.0 → arrayview-0.33.0}/README.md +2 -0
  3. {arrayview-0.32.0 → arrayview-0.33.0}/pyproject.toml +5 -1
  4. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_app.py +0 -1
  5. arrayview-0.33.0/src/arrayview/_codex_open.py +137 -0
  6. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_config.py +1 -1
  7. arrayview-0.33.0/src/arrayview/_dicom.py +512 -0
  8. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_io.py +26 -1
  9. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_launch_plan.py +191 -13
  10. arrayview-0.33.0/src/arrayview/_launch_trace.py +122 -0
  11. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_launcher.py +1582 -518
  12. arrayview-0.33.0/src/arrayview/_lifecycle.py +125 -0
  13. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_platform.py +237 -39
  14. arrayview-0.33.0/src/arrayview/_routes_drop.py +342 -0
  15. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_routes_loading.py +221 -25
  16. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_routes_query.py +158 -2
  17. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_routes_state.py +12 -1
  18. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_routes_vectorfield.py +14 -2
  19. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_routes_websocket.py +223 -1
  20. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_server.py +19 -0
  21. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_session.py +6 -0
  22. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_shell.html +38 -4
  23. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_viewer.html +464 -88
  24. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_vscode.py +1 -2
  25. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_vscode_browser.py +227 -43
  26. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_vscode_extension.py +289 -59
  27. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_vscode_signal.py +108 -144
  28. arrayview-0.33.0/src/arrayview/arrayview-opener.vsix +0 -0
  29. {arrayview-0.32.0 → arrayview-0.33.0}/tests/lifecycle_matrix.py +16 -4
  30. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_api.py +1628 -118
  31. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_browser.py +49 -0
  32. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_cli.py +82 -7
  33. arrayview-0.33.0/tests/test_codex_open.py +160 -0
  34. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_config.py +5 -0
  35. arrayview-0.33.0/tests/test_dicom.py +184 -0
  36. arrayview-0.33.0/tests/test_display_opener_results.py +497 -0
  37. arrayview-0.33.0/tests/test_drop_import.py +336 -0
  38. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_invocation_contract_matrix.py +14 -4
  39. arrayview-0.33.0/tests/test_launch_blackbox.py +549 -0
  40. arrayview-0.33.0/tests/test_launch_execution_ownership.py +278 -0
  41. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_launch_plan.py +209 -5
  42. arrayview-0.33.0/tests/test_launch_trace.py +99 -0
  43. arrayview-0.33.0/tests/test_lifecycle_contract.py +1838 -0
  44. arrayview-0.33.0/tests/test_public_invocation_regressions.py +349 -0
  45. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_safe_server_stop.py +5 -1
  46. arrayview-0.33.0/tests/test_spawn_ownership.py +175 -0
  47. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_view_handle_lifecycle.py +23 -0
  48. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_view_launch_execution.py +109 -15
  49. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_vscode_ack_protocol.py +6 -6
  50. arrayview-0.32.0/.agents/skills/frontend-designer/SKILL.md +0 -56
  51. arrayview-0.32.0/.agents/skills/invocation-consistency/SKILL.md +0 -136
  52. arrayview-0.32.0/.agents/skills/modes-consistency/SKILL.md +0 -67
  53. arrayview-0.32.0/.agents/skills/playwright-cli/SKILL.md +0 -386
  54. arrayview-0.32.0/.agents/skills/playwright-cli/references/element-attributes.md +0 -23
  55. arrayview-0.32.0/.agents/skills/playwright-cli/references/playwright-tests.md +0 -39
  56. arrayview-0.32.0/.agents/skills/playwright-cli/references/request-mocking.md +0 -87
  57. arrayview-0.32.0/.agents/skills/playwright-cli/references/running-code.md +0 -241
  58. arrayview-0.32.0/.agents/skills/playwright-cli/references/session-management.md +0 -225
  59. arrayview-0.32.0/.agents/skills/playwright-cli/references/storage-state.md +0 -275
  60. arrayview-0.32.0/.agents/skills/playwright-cli/references/test-generation.md +0 -134
  61. arrayview-0.32.0/.agents/skills/playwright-cli/references/tracing.md +0 -139
  62. arrayview-0.32.0/.agents/skills/playwright-cli/references/video-recording.md +0 -143
  63. arrayview-0.32.0/.agents/skills/todo-workflow/SKILL.md +0 -37
  64. arrayview-0.32.0/.agents/skills/ui-consistency-audit/SKILL.md +0 -378
  65. arrayview-0.32.0/.agents/skills/viewer-ui-checklist/SKILL.md +0 -80
  66. arrayview-0.32.0/.agents/skills/visual-bug-fixing/SKILL.md +0 -80
  67. arrayview-0.32.0/.github/copilot-instructions.md +0 -33
  68. arrayview-0.32.0/.github/workflows/docs.yml +0 -20
  69. arrayview-0.32.0/.github/workflows/launch-contracts.yml +0 -62
  70. arrayview-0.32.0/.github/workflows/python-publish.yml +0 -70
  71. arrayview-0.32.0/.ignore +0 -1
  72. arrayview-0.32.0/.mex/AGENTS.md +0 -12
  73. arrayview-0.32.0/.mex/ROUTER.md +0 -62
  74. arrayview-0.32.0/.mex/SETUP.md +0 -232
  75. arrayview-0.32.0/.mex/SYNC.md +0 -67
  76. arrayview-0.32.0/.mex/context/architecture.md +0 -117
  77. arrayview-0.32.0/.mex/context/conventions.md +0 -97
  78. arrayview-0.32.0/.mex/context/decisions.md +0 -85
  79. arrayview-0.32.0/.mex/context/frontend.md +0 -83
  80. arrayview-0.32.0/.mex/context/lifecycle.md +0 -94
  81. arrayview-0.32.0/.mex/context/project-state.md +0 -100
  82. arrayview-0.32.0/.mex/context/render-pipeline.md +0 -116
  83. arrayview-0.32.0/.mex/context/setup.md +0 -69
  84. arrayview-0.32.0/.mex/context/stack.md +0 -59
  85. arrayview-0.32.0/.mex/patterns/INDEX.md +0 -35
  86. arrayview-0.32.0/.mex/patterns/README.md +0 -174
  87. arrayview-0.32.0/.mex/patterns/add-file-format.md +0 -110
  88. arrayview-0.32.0/.mex/patterns/add-server-endpoint.md +0 -81
  89. arrayview-0.32.0/.mex/patterns/animation-verify.md +0 -140
  90. arrayview-0.32.0/.mex/patterns/debug-render.md +0 -126
  91. arrayview-0.32.0/.mex/patterns/debug-vscode-extension-python.md +0 -75
  92. arrayview-0.32.0/.mex/patterns/extend-compare-mode.md +0 -60
  93. arrayview-0.32.0/.mex/patterns/extract-server-route-module.md +0 -48
  94. arrayview-0.32.0/.mex/patterns/frontend-change.md +0 -72
  95. arrayview-0.32.0/.mex/setup.sh +0 -21
  96. arrayview-0.32.0/.mex/sync.sh +0 -9
  97. arrayview-0.32.0/.opencode/opencode.json +0 -4
  98. arrayview-0.32.0/.playwright-cli/page-2026-05-06T18-46-49-737Z.yml +0 -30
  99. arrayview-0.32.0/.playwright-cli/page-2026-05-06T18-48-21-979Z.yml +0 -36
  100. arrayview-0.32.0/.playwright-cli/page-2026-05-06T18-51-35-665Z.yml +0 -36
  101. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-07-01-393Z.yml +0 -36
  102. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-14-37-969Z.yml +0 -36
  103. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-21-30-940Z.yml +0 -36
  104. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-23-08-126Z.yml +0 -36
  105. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-29-33-155Z.yml +0 -41
  106. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-31-25-336Z.yml +0 -41
  107. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-31-53-789Z.yml +0 -30
  108. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-39-12-257Z.yml +0 -31
  109. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-39-16-449Z.yml +0 -31
  110. arrayview-0.32.0/.playwright-cli/page-2026-05-06T20-15-25-513Z.yml +0 -31
  111. arrayview-0.32.0/.playwright-cli/page-2026-05-06T20-25-13-179Z.yml +0 -41
  112. arrayview-0.32.0/.playwright-cli/page-2026-05-06T20-39-01-435Z.yml +0 -41
  113. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-01-27-659Z.yml +0 -43
  114. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-01-41-283Z.yml +0 -40
  115. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-03-00-625Z.yml +0 -40
  116. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-04-12-887Z.yml +0 -43
  117. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-33-39-044Z.yml +0 -43
  118. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-38-01-530Z.yml +0 -43
  119. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-45-20-383Z.yml +0 -43
  120. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-55-11-545Z.yml +0 -43
  121. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-56-03-307Z.yml +0 -43
  122. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-56-35-733Z.yml +0 -40
  123. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-57-12-181Z.yml +0 -40
  124. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-57-37-748Z.yml +0 -40
  125. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-58-13-679Z.yml +0 -43
  126. arrayview-0.32.0/.playwright-cli/page-2026-05-06T22-37-23-895Z.yml +0 -39
  127. arrayview-0.32.0/.playwright-cli/page-2026-05-07T00-39-18-637Z.yml +0 -32
  128. arrayview-0.32.0/.playwright-cli/page-2026-05-07T01-41-46-243Z.yml +0 -32
  129. arrayview-0.32.0/.playwright-cli/page-2026-05-07T04-31-48-472Z.yml +0 -30
  130. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-14-15-632Z.yml +0 -29
  131. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-14-47-582Z.yml +0 -109
  132. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-16-23-471Z.yml +0 -29
  133. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-17-10-247Z.yml +0 -109
  134. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-18-24-707Z.yml +0 -43
  135. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-20-06-164Z.yml +0 -109
  136. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-20-28-342Z.yml +0 -29
  137. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-21-54-962Z.yml +0 -29
  138. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-22-34-666Z.yml +0 -36
  139. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-23-11-336Z.yml +0 -109
  140. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-23-36-260Z.yml +0 -29
  141. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-24-09-267Z.yml +0 -36
  142. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-24-35-434Z.yml +0 -109
  143. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-25-57-010Z.yml +0 -29
  144. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-34-48-823Z.yml +0 -36
  145. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-46-46-468Z.yml +0 -41
  146. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-48-17-930Z.yml +0 -41
  147. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-49-26-400Z.yml +0 -33
  148. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-50-31-563Z.yml +0 -33
  149. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-56-45-568Z.yml +0 -41
  150. arrayview-0.32.0/.playwright-cli/theme-dark.yml +0 -30
  151. arrayview-0.32.0/.python-version +0 -1
  152. arrayview-0.32.0/.vscode/settings.json +0 -226
  153. arrayview-0.32.0/AGENTS.md +0 -75
  154. arrayview-0.32.0/CONTRIBUTING.md +0 -94
  155. arrayview-0.32.0/DESIGN.md +0 -121
  156. arrayview-0.32.0/docs/comparing.md +0 -55
  157. arrayview-0.32.0/docs/configuration.md +0 -51
  158. arrayview-0.32.0/docs/display.md +0 -35
  159. arrayview-0.32.0/docs/foreign-hosts.md +0 -104
  160. arrayview-0.32.0/docs/index.md +0 -43
  161. arrayview-0.32.0/docs/launch-routing-refactor.md +0 -523
  162. arrayview-0.32.0/docs/lifecycle.md +0 -6
  163. arrayview-0.32.0/docs/loading.md +0 -194
  164. arrayview-0.32.0/docs/logo.png +0 -0
  165. arrayview-0.32.0/docs/measurement.md +0 -44
  166. arrayview-0.32.0/docs/remote.md +0 -93
  167. arrayview-0.32.0/docs/stack-overlays.md +0 -129
  168. arrayview-0.32.0/docs/stylesheets/extra.css +0 -25
  169. arrayview-0.32.0/docs/viewing.md +0 -51
  170. arrayview-0.32.0/docs/vscode-window-routing-plan.md +0 -37
  171. arrayview-0.32.0/experiments/ws_tunnel_diag/ws_tunnel_diag.py +0 -277
  172. arrayview-0.32.0/matlab/arrayview.m +0 -74
  173. arrayview-0.32.0/mkdocs.yml +0 -40
  174. arrayview-0.32.0/plans/2026-04-14-immersive-animation.md +0 -388
  175. arrayview-0.32.0/plans/2026-05-07-unified-colormap-picker.md +0 -48
  176. arrayview-0.32.0/plans/arrayview_tool_menu_fix_prompt.md +0 -361
  177. arrayview-0.32.0/plans/arrayview_tool_menu_implementation_plan.md +0 -548
  178. arrayview-0.32.0/plans/egg-placement-mockup.html +0 -680
  179. arrayview-0.32.0/plans/refactoring_plan.md +0 -197
  180. arrayview-0.32.0/plans/roi-analysis-requirements.md +0 -126
  181. arrayview-0.32.0/plans/webview/LOG.md +0 -134
  182. arrayview-0.32.0/scripts/demo.py +0 -61
  183. arrayview-0.32.0/scripts/release.sh +0 -174
  184. arrayview-0.32.0/src/arrayview/_codex_open.py +0 -122
  185. arrayview-0.32.0/src/arrayview/_lifecycle.py +0 -64
  186. arrayview-0.32.0/src/arrayview/arrayview-opener.vsix +0 -0
  187. arrayview-0.32.0/tests/test_display_opener_results.py +0 -146
  188. arrayview-0.32.0/tests/test_lifecycle_contract.py +0 -952
  189. arrayview-0.32.0/uv.lock +0 -3657
  190. arrayview-0.32.0/vscode-extension/AGENTS.md +0 -23
  191. arrayview-0.32.0/vscode-extension/LICENSE +0 -21
  192. arrayview-0.32.0/vscode-extension/extension.js +0 -1693
  193. arrayview-0.32.0/vscode-extension/lifecycle_helpers.js +0 -140
  194. arrayview-0.32.0/vscode-extension/package.json +0 -64
  195. arrayview-0.32.0/vscode-extension/test_lifecycle_helpers.js +0 -124
  196. arrayview-0.32.0/vscode-extension/test_tunnel_resolution.js +0 -55
  197. {arrayview-0.32.0 → arrayview-0.33.0}/.gitignore +0 -0
  198. {arrayview-0.32.0 → arrayview-0.33.0}/LICENSE +0 -0
  199. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/ARCHITECTURE.md +0 -0
  200. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/__init__.py +0 -0
  201. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/__main__.py +0 -0
  202. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_analysis.py +0 -0
  203. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_diff.py +0 -0
  204. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_icon.png +0 -0
  205. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_imaging.py +0 -0
  206. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_instance_registry.py +0 -0
  207. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_overlays.py +0 -0
  208. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_render.py +0 -0
  209. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_routes_analysis.py +0 -0
  210. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_routes_export.py +0 -0
  211. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_routes_persistence.py +0 -0
  212. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_routes_preload.py +0 -0
  213. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_routes_rendering.py +0 -0
  214. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_routes_segmentation.py +0 -0
  215. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_segmentation.py +0 -0
  216. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_session_spec.py +0 -0
  217. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_synthetic_mri.py +0 -0
  218. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_torch.py +0 -0
  219. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/_vectorfield.py +0 -0
  220. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/gsap.min.js +0 -0
  221. {arrayview-0.32.0 → arrayview-0.33.0}/src/arrayview/todo.md +0 -0
  222. {arrayview-0.32.0 → arrayview-0.33.0}/tests/capture_patient_loading.py +0 -0
  223. {arrayview-0.32.0 → arrayview-0.33.0}/tests/capture_v_animation.py +0 -0
  224. {arrayview-0.32.0 → arrayview-0.33.0}/tests/conftest.py +0 -0
  225. {arrayview-0.32.0 → arrayview-0.33.0}/tests/make_vectorfield_test_arrays.py +0 -0
  226. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_backend_shared.py +0 -0
  227. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_colorbar_hover_highlight.py +0 -0
  228. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_command_reachability.py +0 -0
  229. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_cross_mode_parametrized.py +0 -0
  230. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_doctor_commands.py +0 -0
  231. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_instance_registry.py +0 -0
  232. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_interactions.py +0 -0
  233. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_io.py +0 -0
  234. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_large_arrays.py +0 -0
  235. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_launch_diagnostics.py +0 -0
  236. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_loading_server.py +0 -0
  237. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_mode_consistency.py +0 -0
  238. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_mode_matrix.py +0 -0
  239. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_mode_roundtrip.py +0 -0
  240. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_nifti_meta.py +0 -0
  241. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_nifti_series.py +0 -0
  242. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_rgb_pixel_art.py +0 -0
  243. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_server_identity_status.py +0 -0
  244. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_session_spec.py +0 -0
  245. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_torch.py +0 -0
  246. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_view_component_integration.py +0 -0
  247. {arrayview-0.32.0 → arrayview-0.33.0}/tests/test_view_component_unit.py +0 -0
  248. {arrayview-0.32.0 → arrayview-0.33.0}/tests/ui_audit.py +0 -0
  249. {arrayview-0.32.0 → arrayview-0.33.0}/tests/v_anim_frames/.gitkeep +0 -0
  250. {arrayview-0.32.0 → arrayview-0.33.0}/tests/visual_smoke.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arrayview
3
- Version: 0.32.0
3
+ Version: 0.33.0
4
4
  Summary: Fast multi-dimensional array viewer
5
5
  Project-URL: Home, https://github.com/oscarvanderheide/arrayview
6
6
  Project-URL: Source, https://github.com/oscarvanderheide/arrayview
@@ -21,6 +21,7 @@ Requires-Dist: matplotlib>=3.9.0
21
21
  Requires-Dist: nibabel>=5.3.3
22
22
  Requires-Dist: numpy>=2.4.2
23
23
  Requires-Dist: pillow>=12.1.1
24
+ Requires-Dist: pydicom>=3.0
24
25
  Requires-Dist: pyqt5>=5.15; sys_platform == 'linux'
25
26
  Requires-Dist: pyqtwebengine>=5.15; sys_platform == 'linux'
26
27
  Requires-Dist: python-multipart>=0.0.22
@@ -49,10 +50,12 @@ It is meant to feel simple but there's more to it than meets the eye.
49
50
  Curious? Give it a try with
50
51
  ```bash
51
52
  uvx arrayview your_array.npy
53
+ uvx arrayview path/to/dicom-series/
52
54
  ```
53
55
 
54
56
  Press `v` for the three-plane ortho view. `Shift+3` replaces the current slice,
55
57
  or all three ortho panes, with interactive 3D cutaway renders.
58
+ Drop another file onto an open viewer to compare, open separately, or overlay it.
56
59
 
57
60
 
58
61
  Check the [docs](https://oscarvanderheide.github.io/arrayview/) to learn more.
@@ -13,10 +13,12 @@ It is meant to feel simple but there's more to it than meets the eye.
13
13
  Curious? Give it a try with
14
14
  ```bash
15
15
  uvx arrayview your_array.npy
16
+ uvx arrayview path/to/dicom-series/
16
17
  ```
17
18
 
18
19
  Press `v` for the three-plane ortho view. `Shift+3` replaces the current slice,
19
20
  or all three ortho panes, with interactive 3D cutaway renders.
21
+ Drop another file onto an open viewer to compare, open separately, or overlay it.
20
22
 
21
23
 
22
24
  Check the [docs](https://oscarvanderheide.github.io/arrayview/) to learn more.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "arrayview"
7
- version = "0.32.0"
7
+ version = "0.33.0"
8
8
  description = "Fast multi-dimensional array viewer"
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  requires-python = ">=3.12"
@@ -27,6 +27,7 @@ dependencies = [
27
27
  "nibabel>=5.3.3",
28
28
  "numpy>=2.4.2",
29
29
  "pillow>=12.1.1",
30
+ "pydicom>=3.0",
30
31
  "pywebview>=6.1",
31
32
  "PyQt5>=5.15; sys_platform == 'linux'",
32
33
  "PyQtWebEngine>=5.15; sys_platform == 'linux'",
@@ -47,6 +48,9 @@ arrayview-codex = "arrayview._codex_open:main"
47
48
  [tool.hatch.build.targets.wheel]
48
49
  packages = ["src/arrayview"]
49
50
 
51
+ [tool.hatch.build.targets.sdist]
52
+ only-include = ["src/arrayview", "tests"]
53
+
50
54
  [tool.uv.sources]
51
55
  qmricolors = { git = "https://github.com/oscarvanderheide/qmricolors.git" }
52
56
 
@@ -128,7 +128,6 @@ from arrayview._vscode import ( # noqa: F401
128
128
  _ensure_vscode_extension,
129
129
  _configure_vscode_port_preview,
130
130
  _open_via_signal_file,
131
- _schedule_remote_open_retries,
132
131
  _write_vscode_signal,
133
132
  _print_viewer_location,
134
133
  _open_browser,
@@ -0,0 +1,137 @@
1
+ """Codex-app helper for safely loading one file into ArrayView.
2
+
3
+ Usage:
4
+ uv run arrayview-codex path/to/file.nii
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ import argparse
10
+ import os
11
+ import subprocess
12
+ import sys
13
+ import uuid
14
+
15
+ from arrayview._instance_registry import InstanceRegistry
16
+ from arrayview._launch_plan import (
17
+ Invocation,
18
+ LaunchIntent,
19
+ Registration,
20
+ create_launch_context,
21
+ )
22
+ from arrayview._launcher import (
23
+ _find_server_port,
24
+ _load_session_from_filepath,
25
+ _port_in_use,
26
+ _revalidate_launch_server,
27
+ _server_alive,
28
+ _server_pid,
29
+ _wait_for_port,
30
+ )
31
+
32
+
33
+ def _start_loaded_server(
34
+ filepath: str, port: int, sid: str, name: str
35
+ ) -> subprocess.Popen[bytes]:
36
+ script = (
37
+ "from arrayview._launcher import _serve_daemon; "
38
+ f"_serve_daemon({filepath!r}, {port}, {sid!r}, name={name!r}, persist=True)"
39
+ )
40
+ proc = subprocess.Popen(
41
+ [sys.executable, "-c", script],
42
+ stdin=subprocess.DEVNULL,
43
+ stdout=subprocess.DEVNULL,
44
+ stderr=subprocess.DEVNULL,
45
+ start_new_session=True,
46
+ )
47
+ if not _wait_for_port(port, timeout=15.0, tcp_only=True):
48
+ if proc.poll() is None:
49
+ proc.terminate()
50
+ raise RuntimeError(f"ArrayView server failed to start on port {port}")
51
+ if not _server_alive(port, timeout=2.0):
52
+ if proc.poll() is None:
53
+ proc.terminate()
54
+ raise RuntimeError(f"ArrayView server on port {port} did not become healthy")
55
+ actual_pid = _server_pid(port)
56
+ if actual_pid != proc.pid:
57
+ if proc.poll() is None:
58
+ proc.terminate()
59
+ raise RuntimeError(
60
+ f"Port {port} was claimed by another process while ArrayView was starting"
61
+ )
62
+ return proc
63
+
64
+
65
+ def _open_codex_file(filepath: str, requested_port: int) -> str:
66
+ context = create_launch_context(
67
+ LaunchIntent(
68
+ Invocation.CODEX,
69
+ requested_port,
70
+ requested_window="browser",
71
+ persistent=True,
72
+ )
73
+ )
74
+ if not context.plan.ok:
75
+ raise ValueError(f"Invalid launch request: {context.plan.failure.value}")
76
+
77
+ name = os.path.basename(filepath)
78
+ expected_server_id = None
79
+ with InstanceRegistry().startup_lock(timeout=20.0):
80
+ port = context.plan.effective_port
81
+ already_running = context.plan.registration is Registration.HTTP_LOAD
82
+ if already_running:
83
+ port = _revalidate_launch_server(context, port)
84
+ expected_server_id = context.evidence.server.server_instance_id
85
+ else:
86
+ if _port_in_use(port):
87
+ port, appeared_running = _find_server_port(port + 1)
88
+ if appeared_running or _port_in_use(port):
89
+ raise RuntimeError("Could not find a free port for ArrayView")
90
+ if not 1 <= port <= 65535 or _port_in_use(port):
91
+ raise RuntimeError("Could not find a free port for ArrayView")
92
+ sid = uuid.uuid4().hex
93
+ _start_loaded_server(filepath, port, sid, name)
94
+
95
+ if already_running:
96
+ result = _load_session_from_filepath(
97
+ port,
98
+ filepath,
99
+ name,
100
+ expected_server_id=expected_server_id,
101
+ release_on_disconnect=True,
102
+ )
103
+ if "error" in result:
104
+ raise RuntimeError(f"ArrayView server rejected the file: {result['error']}")
105
+ sid = str(result["sid"])
106
+
107
+ return f"http://localhost:{port}/?sid={sid}"
108
+
109
+
110
+ def main() -> int:
111
+ parser = argparse.ArgumentParser(
112
+ prog="arrayview-codex",
113
+ description=(
114
+ "Load one file into a compatible ArrayView server, starting one on "
115
+ "a free port when needed, and print the Codex app browser URL."
116
+ ),
117
+ )
118
+ parser.add_argument("file", help="Array file to load")
119
+ parser.add_argument("--port", type=int, default=8000, help="Preferred port")
120
+ args = parser.parse_args()
121
+
122
+ filepath = os.path.abspath(args.file)
123
+ if not os.path.isfile(filepath):
124
+ print(f"Error: file not found: {filepath}", file=sys.stderr)
125
+ return 1
126
+
127
+ try:
128
+ url = _open_codex_file(filepath, args.port)
129
+ except (OSError, RuntimeError, TimeoutError, ValueError) as exc:
130
+ print(f"Error: {exc}", file=sys.stderr)
131
+ return 1
132
+ print(url)
133
+ return 0
134
+
135
+
136
+ if __name__ == "__main__":
137
+ raise SystemExit(main())
@@ -6,7 +6,7 @@ import os
6
6
 
7
7
  CONFIG_PATH = os.path.expanduser("~/.arrayview/config.toml")
8
8
 
9
- _VALID_WINDOW_MODES = {"browser", "vscode", "native", "inline"}
9
+ _VALID_WINDOW_MODES = {"browser", "vscode", "native", "inline", "none"}
10
10
  _VALID_ENV_KEYS = {"default", "terminal", "vscode", "jupyter", "ssh", "julia"}
11
11
 
12
12