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.
- {arrayview-0.31.3 → arrayview-0.33.0}/PKG-INFO +8 -2
- {arrayview-0.31.3 → arrayview-0.33.0}/README.md +6 -1
- {arrayview-0.31.3 → arrayview-0.33.0}/pyproject.toml +5 -1
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/__init__.py +1 -3
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_app.py +0 -1
- arrayview-0.33.0/src/arrayview/_codex_open.py +137 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_config.py +1 -1
- arrayview-0.33.0/src/arrayview/_dicom.py +512 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_io.py +401 -110
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_launch_plan.py +191 -13
- arrayview-0.33.0/src/arrayview/_launch_trace.py +122 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_launcher.py +1872 -675
- arrayview-0.33.0/src/arrayview/_lifecycle.py +125 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_platform.py +237 -39
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_routes_analysis.py +17 -0
- arrayview-0.33.0/src/arrayview/_routes_drop.py +342 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_routes_loading.py +305 -27
- arrayview-0.33.0/src/arrayview/_routes_query.py +355 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_routes_state.py +12 -1
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_routes_vectorfield.py +14 -2
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_routes_websocket.py +223 -1
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_server.py +19 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_session.py +15 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_session_spec.py +0 -4
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_shell.html +38 -4
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_viewer.html +1480 -216
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_vscode.py +1 -2
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_vscode_browser.py +230 -43
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_vscode_extension.py +310 -63
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_vscode_signal.py +135 -145
- arrayview-0.33.0/src/arrayview/arrayview-opener.vsix +0 -0
- arrayview-0.33.0/src/arrayview/todo.md +12 -0
- arrayview-0.33.0/tests/capture_patient_loading.py +120 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/lifecycle_matrix.py +16 -4
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_api.py +1900 -101
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_browser.py +335 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_cli.py +251 -6
- arrayview-0.33.0/tests/test_codex_open.py +160 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_command_reachability.py +1 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_config.py +5 -0
- arrayview-0.33.0/tests/test_dicom.py +184 -0
- arrayview-0.33.0/tests/test_display_opener_results.py +497 -0
- arrayview-0.33.0/tests/test_drop_import.py +336 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_invocation_contract_matrix.py +14 -4
- arrayview-0.33.0/tests/test_launch_blackbox.py +549 -0
- arrayview-0.33.0/tests/test_launch_execution_ownership.py +278 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_launch_plan.py +209 -5
- arrayview-0.33.0/tests/test_launch_trace.py +99 -0
- arrayview-0.33.0/tests/test_lifecycle_contract.py +1838 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_mode_roundtrip.py +183 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_nifti_series.py +235 -70
- arrayview-0.33.0/tests/test_public_invocation_regressions.py +349 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_safe_server_stop.py +5 -1
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_session_spec.py +0 -2
- arrayview-0.33.0/tests/test_spawn_ownership.py +175 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_view_handle_lifecycle.py +23 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_view_launch_execution.py +109 -15
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_vscode_ack_protocol.py +24 -6
- arrayview-0.31.3/.agents/skills/frontend-designer/SKILL.md +0 -56
- arrayview-0.31.3/.agents/skills/invocation-consistency/SKILL.md +0 -136
- arrayview-0.31.3/.agents/skills/modes-consistency/SKILL.md +0 -67
- arrayview-0.31.3/.agents/skills/playwright-cli/SKILL.md +0 -386
- arrayview-0.31.3/.agents/skills/playwright-cli/references/element-attributes.md +0 -23
- arrayview-0.31.3/.agents/skills/playwright-cli/references/playwright-tests.md +0 -39
- arrayview-0.31.3/.agents/skills/playwright-cli/references/request-mocking.md +0 -87
- arrayview-0.31.3/.agents/skills/playwright-cli/references/running-code.md +0 -241
- arrayview-0.31.3/.agents/skills/playwright-cli/references/session-management.md +0 -225
- arrayview-0.31.3/.agents/skills/playwright-cli/references/storage-state.md +0 -275
- arrayview-0.31.3/.agents/skills/playwright-cli/references/test-generation.md +0 -134
- arrayview-0.31.3/.agents/skills/playwright-cli/references/tracing.md +0 -139
- arrayview-0.31.3/.agents/skills/playwright-cli/references/video-recording.md +0 -143
- arrayview-0.31.3/.agents/skills/todo-workflow/SKILL.md +0 -37
- arrayview-0.31.3/.agents/skills/ui-consistency-audit/SKILL.md +0 -378
- arrayview-0.31.3/.agents/skills/viewer-ui-checklist/SKILL.md +0 -80
- arrayview-0.31.3/.agents/skills/visual-bug-fixing/SKILL.md +0 -80
- arrayview-0.31.3/.github/copilot-instructions.md +0 -33
- arrayview-0.31.3/.github/workflows/docs.yml +0 -20
- arrayview-0.31.3/.github/workflows/launch-contracts.yml +0 -62
- arrayview-0.31.3/.github/workflows/python-publish.yml +0 -70
- arrayview-0.31.3/.ignore +0 -1
- arrayview-0.31.3/.mex/AGENTS.md +0 -12
- arrayview-0.31.3/.mex/ROUTER.md +0 -62
- arrayview-0.31.3/.mex/SETUP.md +0 -232
- arrayview-0.31.3/.mex/SYNC.md +0 -67
- arrayview-0.31.3/.mex/context/architecture.md +0 -117
- arrayview-0.31.3/.mex/context/conventions.md +0 -97
- arrayview-0.31.3/.mex/context/decisions.md +0 -85
- arrayview-0.31.3/.mex/context/frontend.md +0 -83
- arrayview-0.31.3/.mex/context/lifecycle.md +0 -91
- arrayview-0.31.3/.mex/context/project-state.md +0 -95
- arrayview-0.31.3/.mex/context/render-pipeline.md +0 -116
- arrayview-0.31.3/.mex/context/setup.md +0 -69
- arrayview-0.31.3/.mex/context/stack.md +0 -59
- arrayview-0.31.3/.mex/patterns/INDEX.md +0 -35
- arrayview-0.31.3/.mex/patterns/README.md +0 -174
- arrayview-0.31.3/.mex/patterns/add-file-format.md +0 -110
- arrayview-0.31.3/.mex/patterns/add-server-endpoint.md +0 -81
- arrayview-0.31.3/.mex/patterns/animation-verify.md +0 -140
- arrayview-0.31.3/.mex/patterns/debug-render.md +0 -126
- arrayview-0.31.3/.mex/patterns/debug-vscode-extension-python.md +0 -75
- arrayview-0.31.3/.mex/patterns/extend-compare-mode.md +0 -60
- arrayview-0.31.3/.mex/patterns/extract-server-route-module.md +0 -48
- arrayview-0.31.3/.mex/patterns/frontend-change.md +0 -72
- arrayview-0.31.3/.mex/setup.sh +0 -21
- arrayview-0.31.3/.mex/sync.sh +0 -9
- arrayview-0.31.3/.opencode/opencode.json +0 -4
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T18-46-49-737Z.yml +0 -30
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T18-48-21-979Z.yml +0 -36
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T18-51-35-665Z.yml +0 -36
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T19-07-01-393Z.yml +0 -36
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T19-14-37-969Z.yml +0 -36
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T19-21-30-940Z.yml +0 -36
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T19-23-08-126Z.yml +0 -36
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T19-29-33-155Z.yml +0 -41
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T19-31-25-336Z.yml +0 -41
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T19-31-53-789Z.yml +0 -30
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T19-39-12-257Z.yml +0 -31
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T19-39-16-449Z.yml +0 -31
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T20-15-25-513Z.yml +0 -31
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T20-25-13-179Z.yml +0 -41
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T20-39-01-435Z.yml +0 -41
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T21-01-27-659Z.yml +0 -43
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T21-01-41-283Z.yml +0 -40
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T21-03-00-625Z.yml +0 -40
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T21-04-12-887Z.yml +0 -43
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T21-33-39-044Z.yml +0 -43
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T21-38-01-530Z.yml +0 -43
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T21-45-20-383Z.yml +0 -43
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T21-55-11-545Z.yml +0 -43
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T21-56-03-307Z.yml +0 -43
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T21-56-35-733Z.yml +0 -40
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T21-57-12-181Z.yml +0 -40
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T21-57-37-748Z.yml +0 -40
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T21-58-13-679Z.yml +0 -43
- arrayview-0.31.3/.playwright-cli/page-2026-05-06T22-37-23-895Z.yml +0 -39
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T00-39-18-637Z.yml +0 -32
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T01-41-46-243Z.yml +0 -32
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T04-31-48-472Z.yml +0 -30
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-14-15-632Z.yml +0 -29
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-14-47-582Z.yml +0 -109
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-16-23-471Z.yml +0 -29
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-17-10-247Z.yml +0 -109
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-18-24-707Z.yml +0 -43
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-20-06-164Z.yml +0 -109
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-20-28-342Z.yml +0 -29
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-21-54-962Z.yml +0 -29
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-22-34-666Z.yml +0 -36
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-23-11-336Z.yml +0 -109
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-23-36-260Z.yml +0 -29
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-24-09-267Z.yml +0 -36
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-24-35-434Z.yml +0 -109
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-25-57-010Z.yml +0 -29
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-34-48-823Z.yml +0 -36
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-46-46-468Z.yml +0 -41
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-48-17-930Z.yml +0 -41
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-49-26-400Z.yml +0 -33
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-50-31-563Z.yml +0 -33
- arrayview-0.31.3/.playwright-cli/page-2026-05-07T12-56-45-568Z.yml +0 -41
- arrayview-0.31.3/.playwright-cli/theme-dark.yml +0 -30
- arrayview-0.31.3/.python-version +0 -1
- arrayview-0.31.3/.vscode/settings.json +0 -226
- arrayview-0.31.3/AGENTS.md +0 -75
- arrayview-0.31.3/CONTRIBUTING.md +0 -94
- arrayview-0.31.3/DESIGN.md +0 -121
- arrayview-0.31.3/docs/comparing.md +0 -55
- arrayview-0.31.3/docs/configuration.md +0 -51
- arrayview-0.31.3/docs/display.md +0 -35
- arrayview-0.31.3/docs/foreign-hosts.md +0 -104
- arrayview-0.31.3/docs/index.md +0 -43
- arrayview-0.31.3/docs/launch-routing-refactor.md +0 -523
- arrayview-0.31.3/docs/lifecycle.md +0 -6
- arrayview-0.31.3/docs/loading.md +0 -183
- arrayview-0.31.3/docs/logo.png +0 -0
- arrayview-0.31.3/docs/measurement.md +0 -44
- arrayview-0.31.3/docs/remote.md +0 -93
- arrayview-0.31.3/docs/stack-overlays.md +0 -129
- arrayview-0.31.3/docs/stylesheets/extra.css +0 -25
- arrayview-0.31.3/docs/viewing.md +0 -51
- arrayview-0.31.3/docs/vscode-window-routing-plan.md +0 -37
- arrayview-0.31.3/experiments/ws_tunnel_diag/ws_tunnel_diag.py +0 -277
- arrayview-0.31.3/matlab/arrayview.m +0 -74
- arrayview-0.31.3/mkdocs.yml +0 -40
- arrayview-0.31.3/plans/2026-04-14-immersive-animation.md +0 -388
- arrayview-0.31.3/plans/2026-05-07-unified-colormap-picker.md +0 -48
- arrayview-0.31.3/plans/arrayview_tool_menu_fix_prompt.md +0 -361
- arrayview-0.31.3/plans/arrayview_tool_menu_implementation_plan.md +0 -548
- arrayview-0.31.3/plans/egg-placement-mockup.html +0 -680
- arrayview-0.31.3/plans/refactoring_plan.md +0 -197
- arrayview-0.31.3/plans/roi-analysis-requirements.md +0 -126
- arrayview-0.31.3/plans/webview/LOG.md +0 -134
- arrayview-0.31.3/scripts/demo.py +0 -61
- arrayview-0.31.3/scripts/release.sh +0 -174
- arrayview-0.31.3/src/arrayview/_codex_open.py +0 -122
- arrayview-0.31.3/src/arrayview/_lifecycle.py +0 -64
- arrayview-0.31.3/src/arrayview/_routes_query.py +0 -140
- arrayview-0.31.3/src/arrayview/arrayview-opener.vsix +0 -0
- arrayview-0.31.3/tests/test_display_opener_results.py +0 -146
- arrayview-0.31.3/tests/test_lifecycle_contract.py +0 -801
- arrayview-0.31.3/uv.lock +0 -3657
- arrayview-0.31.3/vscode-extension/AGENTS.md +0 -23
- arrayview-0.31.3/vscode-extension/LICENSE +0 -21
- arrayview-0.31.3/vscode-extension/extension.js +0 -1404
- arrayview-0.31.3/vscode-extension/lifecycle_helpers.js +0 -127
- arrayview-0.31.3/vscode-extension/package.json +0 -64
- arrayview-0.31.3/vscode-extension/test_lifecycle_helpers.js +0 -118
- {arrayview-0.31.3 → arrayview-0.33.0}/.gitignore +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/LICENSE +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/ARCHITECTURE.md +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/__main__.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_analysis.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_diff.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_icon.png +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_imaging.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_instance_registry.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_overlays.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_render.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_routes_export.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_routes_persistence.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_routes_preload.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_routes_rendering.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_routes_segmentation.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_segmentation.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_synthetic_mri.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_torch.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/_vectorfield.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/src/arrayview/gsap.min.js +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/capture_v_animation.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/conftest.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/make_vectorfield_test_arrays.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_backend_shared.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_colorbar_hover_highlight.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_cross_mode_parametrized.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_doctor_commands.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_instance_registry.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_interactions.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_io.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_large_arrays.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_launch_diagnostics.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_loading_server.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_mode_consistency.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_mode_matrix.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_nifti_meta.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_rgb_pixel_art.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_server_identity_status.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_torch.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_view_component_integration.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/test_view_component_unit.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/ui_audit.py +0 -0
- {arrayview-0.31.3 → arrayview-0.33.0}/tests/v_anim_frames/.gitkeep +0 -0
- {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.
|
|
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.
|
|
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", "
|
|
15
|
+
if name in {"arrayview", "view", "ViewHandle"}:
|
|
18
16
|
from arrayview import _launcher
|
|
19
17
|
|
|
20
18
|
return getattr(_launcher, name)
|
|
@@ -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
|
|