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