arrayview 0.32.0__tar.gz → 0.33.1__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.1}/PKG-INFO +4 -1
  2. {arrayview-0.32.0 → arrayview-0.33.1}/README.md +2 -0
  3. {arrayview-0.32.0 → arrayview-0.33.1}/pyproject.toml +5 -1
  4. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_app.py +0 -1
  5. arrayview-0.33.1/src/arrayview/_codex_open.py +137 -0
  6. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_config.py +1 -1
  7. arrayview-0.33.1/src/arrayview/_dicom.py +512 -0
  8. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_instance_registry.py +3 -5
  9. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_io.py +26 -1
  10. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_launch_plan.py +199 -13
  11. arrayview-0.33.1/src/arrayview/_launch_trace.py +122 -0
  12. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_launcher.py +1588 -519
  13. arrayview-0.33.1/src/arrayview/_lifecycle.py +125 -0
  14. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_platform.py +237 -39
  15. arrayview-0.33.1/src/arrayview/_routes_drop.py +342 -0
  16. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_routes_loading.py +221 -25
  17. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_routes_query.py +158 -2
  18. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_routes_state.py +12 -1
  19. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_routes_vectorfield.py +14 -2
  20. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_routes_websocket.py +223 -1
  21. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_server.py +20 -0
  22. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_session.py +6 -0
  23. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_shell.html +38 -4
  24. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_viewer.html +464 -88
  25. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_vscode.py +1 -2
  26. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_vscode_browser.py +227 -43
  27. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_vscode_extension.py +289 -59
  28. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_vscode_signal.py +108 -144
  29. arrayview-0.33.1/src/arrayview/arrayview-opener.vsix +0 -0
  30. {arrayview-0.32.0 → arrayview-0.33.1}/tests/lifecycle_matrix.py +16 -4
  31. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_api.py +1629 -118
  32. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_browser.py +49 -0
  33. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_cli.py +83 -7
  34. arrayview-0.33.1/tests/test_codex_open.py +160 -0
  35. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_config.py +5 -0
  36. arrayview-0.33.1/tests/test_dicom.py +184 -0
  37. arrayview-0.33.1/tests/test_display_opener_results.py +497 -0
  38. arrayview-0.33.1/tests/test_drop_import.py +336 -0
  39. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_instance_registry.py +4 -2
  40. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_invocation_contract_matrix.py +14 -4
  41. arrayview-0.33.1/tests/test_launch_blackbox.py +549 -0
  42. arrayview-0.33.1/tests/test_launch_execution_ownership.py +281 -0
  43. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_launch_plan.py +247 -5
  44. arrayview-0.33.1/tests/test_launch_trace.py +99 -0
  45. arrayview-0.33.1/tests/test_lifecycle_contract.py +1838 -0
  46. arrayview-0.33.1/tests/test_public_invocation_regressions.py +349 -0
  47. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_safe_server_stop.py +5 -1
  48. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_server_identity_status.py +1 -0
  49. arrayview-0.33.1/tests/test_spawn_ownership.py +175 -0
  50. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_view_handle_lifecycle.py +23 -0
  51. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_view_launch_execution.py +109 -15
  52. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_vscode_ack_protocol.py +6 -6
  53. arrayview-0.32.0/.agents/skills/frontend-designer/SKILL.md +0 -56
  54. arrayview-0.32.0/.agents/skills/invocation-consistency/SKILL.md +0 -136
  55. arrayview-0.32.0/.agents/skills/modes-consistency/SKILL.md +0 -67
  56. arrayview-0.32.0/.agents/skills/playwright-cli/SKILL.md +0 -386
  57. arrayview-0.32.0/.agents/skills/playwright-cli/references/element-attributes.md +0 -23
  58. arrayview-0.32.0/.agents/skills/playwright-cli/references/playwright-tests.md +0 -39
  59. arrayview-0.32.0/.agents/skills/playwright-cli/references/request-mocking.md +0 -87
  60. arrayview-0.32.0/.agents/skills/playwright-cli/references/running-code.md +0 -241
  61. arrayview-0.32.0/.agents/skills/playwright-cli/references/session-management.md +0 -225
  62. arrayview-0.32.0/.agents/skills/playwright-cli/references/storage-state.md +0 -275
  63. arrayview-0.32.0/.agents/skills/playwright-cli/references/test-generation.md +0 -134
  64. arrayview-0.32.0/.agents/skills/playwright-cli/references/tracing.md +0 -139
  65. arrayview-0.32.0/.agents/skills/playwright-cli/references/video-recording.md +0 -143
  66. arrayview-0.32.0/.agents/skills/todo-workflow/SKILL.md +0 -37
  67. arrayview-0.32.0/.agents/skills/ui-consistency-audit/SKILL.md +0 -378
  68. arrayview-0.32.0/.agents/skills/viewer-ui-checklist/SKILL.md +0 -80
  69. arrayview-0.32.0/.agents/skills/visual-bug-fixing/SKILL.md +0 -80
  70. arrayview-0.32.0/.github/copilot-instructions.md +0 -33
  71. arrayview-0.32.0/.github/workflows/docs.yml +0 -20
  72. arrayview-0.32.0/.github/workflows/launch-contracts.yml +0 -62
  73. arrayview-0.32.0/.github/workflows/python-publish.yml +0 -70
  74. arrayview-0.32.0/.ignore +0 -1
  75. arrayview-0.32.0/.mex/AGENTS.md +0 -12
  76. arrayview-0.32.0/.mex/ROUTER.md +0 -62
  77. arrayview-0.32.0/.mex/SETUP.md +0 -232
  78. arrayview-0.32.0/.mex/SYNC.md +0 -67
  79. arrayview-0.32.0/.mex/context/architecture.md +0 -117
  80. arrayview-0.32.0/.mex/context/conventions.md +0 -97
  81. arrayview-0.32.0/.mex/context/decisions.md +0 -85
  82. arrayview-0.32.0/.mex/context/frontend.md +0 -83
  83. arrayview-0.32.0/.mex/context/lifecycle.md +0 -94
  84. arrayview-0.32.0/.mex/context/project-state.md +0 -100
  85. arrayview-0.32.0/.mex/context/render-pipeline.md +0 -116
  86. arrayview-0.32.0/.mex/context/setup.md +0 -69
  87. arrayview-0.32.0/.mex/context/stack.md +0 -59
  88. arrayview-0.32.0/.mex/patterns/INDEX.md +0 -35
  89. arrayview-0.32.0/.mex/patterns/README.md +0 -174
  90. arrayview-0.32.0/.mex/patterns/add-file-format.md +0 -110
  91. arrayview-0.32.0/.mex/patterns/add-server-endpoint.md +0 -81
  92. arrayview-0.32.0/.mex/patterns/animation-verify.md +0 -140
  93. arrayview-0.32.0/.mex/patterns/debug-render.md +0 -126
  94. arrayview-0.32.0/.mex/patterns/debug-vscode-extension-python.md +0 -75
  95. arrayview-0.32.0/.mex/patterns/extend-compare-mode.md +0 -60
  96. arrayview-0.32.0/.mex/patterns/extract-server-route-module.md +0 -48
  97. arrayview-0.32.0/.mex/patterns/frontend-change.md +0 -72
  98. arrayview-0.32.0/.mex/setup.sh +0 -21
  99. arrayview-0.32.0/.mex/sync.sh +0 -9
  100. arrayview-0.32.0/.opencode/opencode.json +0 -4
  101. arrayview-0.32.0/.playwright-cli/page-2026-05-06T18-46-49-737Z.yml +0 -30
  102. arrayview-0.32.0/.playwright-cli/page-2026-05-06T18-48-21-979Z.yml +0 -36
  103. arrayview-0.32.0/.playwright-cli/page-2026-05-06T18-51-35-665Z.yml +0 -36
  104. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-07-01-393Z.yml +0 -36
  105. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-14-37-969Z.yml +0 -36
  106. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-21-30-940Z.yml +0 -36
  107. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-23-08-126Z.yml +0 -36
  108. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-29-33-155Z.yml +0 -41
  109. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-31-25-336Z.yml +0 -41
  110. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-31-53-789Z.yml +0 -30
  111. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-39-12-257Z.yml +0 -31
  112. arrayview-0.32.0/.playwright-cli/page-2026-05-06T19-39-16-449Z.yml +0 -31
  113. arrayview-0.32.0/.playwright-cli/page-2026-05-06T20-15-25-513Z.yml +0 -31
  114. arrayview-0.32.0/.playwright-cli/page-2026-05-06T20-25-13-179Z.yml +0 -41
  115. arrayview-0.32.0/.playwright-cli/page-2026-05-06T20-39-01-435Z.yml +0 -41
  116. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-01-27-659Z.yml +0 -43
  117. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-01-41-283Z.yml +0 -40
  118. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-03-00-625Z.yml +0 -40
  119. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-04-12-887Z.yml +0 -43
  120. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-33-39-044Z.yml +0 -43
  121. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-38-01-530Z.yml +0 -43
  122. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-45-20-383Z.yml +0 -43
  123. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-55-11-545Z.yml +0 -43
  124. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-56-03-307Z.yml +0 -43
  125. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-56-35-733Z.yml +0 -40
  126. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-57-12-181Z.yml +0 -40
  127. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-57-37-748Z.yml +0 -40
  128. arrayview-0.32.0/.playwright-cli/page-2026-05-06T21-58-13-679Z.yml +0 -43
  129. arrayview-0.32.0/.playwright-cli/page-2026-05-06T22-37-23-895Z.yml +0 -39
  130. arrayview-0.32.0/.playwright-cli/page-2026-05-07T00-39-18-637Z.yml +0 -32
  131. arrayview-0.32.0/.playwright-cli/page-2026-05-07T01-41-46-243Z.yml +0 -32
  132. arrayview-0.32.0/.playwright-cli/page-2026-05-07T04-31-48-472Z.yml +0 -30
  133. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-14-15-632Z.yml +0 -29
  134. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-14-47-582Z.yml +0 -109
  135. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-16-23-471Z.yml +0 -29
  136. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-17-10-247Z.yml +0 -109
  137. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-18-24-707Z.yml +0 -43
  138. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-20-06-164Z.yml +0 -109
  139. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-20-28-342Z.yml +0 -29
  140. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-21-54-962Z.yml +0 -29
  141. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-22-34-666Z.yml +0 -36
  142. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-23-11-336Z.yml +0 -109
  143. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-23-36-260Z.yml +0 -29
  144. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-24-09-267Z.yml +0 -36
  145. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-24-35-434Z.yml +0 -109
  146. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-25-57-010Z.yml +0 -29
  147. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-34-48-823Z.yml +0 -36
  148. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-46-46-468Z.yml +0 -41
  149. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-48-17-930Z.yml +0 -41
  150. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-49-26-400Z.yml +0 -33
  151. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-50-31-563Z.yml +0 -33
  152. arrayview-0.32.0/.playwright-cli/page-2026-05-07T12-56-45-568Z.yml +0 -41
  153. arrayview-0.32.0/.playwright-cli/theme-dark.yml +0 -30
  154. arrayview-0.32.0/.python-version +0 -1
  155. arrayview-0.32.0/.vscode/settings.json +0 -226
  156. arrayview-0.32.0/AGENTS.md +0 -75
  157. arrayview-0.32.0/CONTRIBUTING.md +0 -94
  158. arrayview-0.32.0/DESIGN.md +0 -121
  159. arrayview-0.32.0/docs/comparing.md +0 -55
  160. arrayview-0.32.0/docs/configuration.md +0 -51
  161. arrayview-0.32.0/docs/display.md +0 -35
  162. arrayview-0.32.0/docs/foreign-hosts.md +0 -104
  163. arrayview-0.32.0/docs/index.md +0 -43
  164. arrayview-0.32.0/docs/launch-routing-refactor.md +0 -523
  165. arrayview-0.32.0/docs/lifecycle.md +0 -6
  166. arrayview-0.32.0/docs/loading.md +0 -194
  167. arrayview-0.32.0/docs/logo.png +0 -0
  168. arrayview-0.32.0/docs/measurement.md +0 -44
  169. arrayview-0.32.0/docs/remote.md +0 -93
  170. arrayview-0.32.0/docs/stack-overlays.md +0 -129
  171. arrayview-0.32.0/docs/stylesheets/extra.css +0 -25
  172. arrayview-0.32.0/docs/viewing.md +0 -51
  173. arrayview-0.32.0/docs/vscode-window-routing-plan.md +0 -37
  174. arrayview-0.32.0/experiments/ws_tunnel_diag/ws_tunnel_diag.py +0 -277
  175. arrayview-0.32.0/matlab/arrayview.m +0 -74
  176. arrayview-0.32.0/mkdocs.yml +0 -40
  177. arrayview-0.32.0/plans/2026-04-14-immersive-animation.md +0 -388
  178. arrayview-0.32.0/plans/2026-05-07-unified-colormap-picker.md +0 -48
  179. arrayview-0.32.0/plans/arrayview_tool_menu_fix_prompt.md +0 -361
  180. arrayview-0.32.0/plans/arrayview_tool_menu_implementation_plan.md +0 -548
  181. arrayview-0.32.0/plans/egg-placement-mockup.html +0 -680
  182. arrayview-0.32.0/plans/refactoring_plan.md +0 -197
  183. arrayview-0.32.0/plans/roi-analysis-requirements.md +0 -126
  184. arrayview-0.32.0/plans/webview/LOG.md +0 -134
  185. arrayview-0.32.0/scripts/demo.py +0 -61
  186. arrayview-0.32.0/scripts/release.sh +0 -174
  187. arrayview-0.32.0/src/arrayview/_codex_open.py +0 -122
  188. arrayview-0.32.0/src/arrayview/_lifecycle.py +0 -64
  189. arrayview-0.32.0/src/arrayview/arrayview-opener.vsix +0 -0
  190. arrayview-0.32.0/tests/test_display_opener_results.py +0 -146
  191. arrayview-0.32.0/tests/test_lifecycle_contract.py +0 -952
  192. arrayview-0.32.0/uv.lock +0 -3657
  193. arrayview-0.32.0/vscode-extension/AGENTS.md +0 -23
  194. arrayview-0.32.0/vscode-extension/LICENSE +0 -21
  195. arrayview-0.32.0/vscode-extension/extension.js +0 -1693
  196. arrayview-0.32.0/vscode-extension/lifecycle_helpers.js +0 -140
  197. arrayview-0.32.0/vscode-extension/package.json +0 -64
  198. arrayview-0.32.0/vscode-extension/test_lifecycle_helpers.js +0 -124
  199. arrayview-0.32.0/vscode-extension/test_tunnel_resolution.js +0 -55
  200. {arrayview-0.32.0 → arrayview-0.33.1}/.gitignore +0 -0
  201. {arrayview-0.32.0 → arrayview-0.33.1}/LICENSE +0 -0
  202. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/ARCHITECTURE.md +0 -0
  203. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/__init__.py +0 -0
  204. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/__main__.py +0 -0
  205. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_analysis.py +0 -0
  206. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_diff.py +0 -0
  207. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_icon.png +0 -0
  208. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_imaging.py +0 -0
  209. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_overlays.py +0 -0
  210. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_render.py +0 -0
  211. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_routes_analysis.py +0 -0
  212. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_routes_export.py +0 -0
  213. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_routes_persistence.py +0 -0
  214. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_routes_preload.py +0 -0
  215. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_routes_rendering.py +0 -0
  216. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_routes_segmentation.py +0 -0
  217. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_segmentation.py +0 -0
  218. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_session_spec.py +0 -0
  219. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_synthetic_mri.py +0 -0
  220. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_torch.py +0 -0
  221. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/_vectorfield.py +0 -0
  222. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/gsap.min.js +0 -0
  223. {arrayview-0.32.0 → arrayview-0.33.1}/src/arrayview/todo.md +0 -0
  224. {arrayview-0.32.0 → arrayview-0.33.1}/tests/capture_patient_loading.py +0 -0
  225. {arrayview-0.32.0 → arrayview-0.33.1}/tests/capture_v_animation.py +0 -0
  226. {arrayview-0.32.0 → arrayview-0.33.1}/tests/conftest.py +0 -0
  227. {arrayview-0.32.0 → arrayview-0.33.1}/tests/make_vectorfield_test_arrays.py +0 -0
  228. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_backend_shared.py +0 -0
  229. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_colorbar_hover_highlight.py +0 -0
  230. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_command_reachability.py +0 -0
  231. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_cross_mode_parametrized.py +0 -0
  232. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_doctor_commands.py +0 -0
  233. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_interactions.py +0 -0
  234. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_io.py +0 -0
  235. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_large_arrays.py +0 -0
  236. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_launch_diagnostics.py +0 -0
  237. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_loading_server.py +0 -0
  238. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_mode_consistency.py +0 -0
  239. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_mode_matrix.py +0 -0
  240. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_mode_roundtrip.py +0 -0
  241. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_nifti_meta.py +0 -0
  242. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_nifti_series.py +0 -0
  243. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_rgb_pixel_art.py +0 -0
  244. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_session_spec.py +0 -0
  245. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_torch.py +0 -0
  246. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_view_component_integration.py +0 -0
  247. {arrayview-0.32.0 → arrayview-0.33.1}/tests/test_view_component_unit.py +0 -0
  248. {arrayview-0.32.0 → arrayview-0.33.1}/tests/ui_audit.py +0 -0
  249. {arrayview-0.32.0 → arrayview-0.33.1}/tests/v_anim_frames/.gitkeep +0 -0
  250. {arrayview-0.32.0 → arrayview-0.33.1}/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.1
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.1"
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