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