arrayview 0.10.0__tar.gz → 0.11.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 (69) hide show
  1. {arrayview-0.10.0 → arrayview-0.11.0}/PKG-INFO +3 -2
  2. {arrayview-0.10.0 → arrayview-0.11.0}/README.md +2 -1
  3. {arrayview-0.10.0 → arrayview-0.11.0}/pyproject.toml +1 -1
  4. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/_config.py +15 -0
  5. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/_io.py +7 -1
  6. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/_render.py +10 -2
  7. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/_server.py +142 -149
  8. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/_session.py +9 -1
  9. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/_stdio_server.py +1 -4
  10. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/_viewer.html +167 -85
  11. {arrayview-0.10.0 → arrayview-0.11.0}/tests/test_browser.py +32 -49
  12. {arrayview-0.10.0 → arrayview-0.11.0}/tests/test_interactions.py +34 -27
  13. {arrayview-0.10.0 → arrayview-0.11.0}/tests/test_mode_matrix.py +31 -33
  14. arrayview-0.11.0/tests/test_mode_roundtrip.py +347 -0
  15. {arrayview-0.10.0 → arrayview-0.11.0}/tests/visual_smoke.py +1 -1
  16. {arrayview-0.10.0 → arrayview-0.11.0}/uv.lock +1 -1
  17. {arrayview-0.10.0 → arrayview-0.11.0}/.claude/skills/invocation-consistency/SKILL.md +0 -0
  18. {arrayview-0.10.0 → arrayview-0.11.0}/.claude/skills/modes-consistency/SKILL.md +0 -0
  19. {arrayview-0.10.0 → arrayview-0.11.0}/.claude/skills/ui-consistency-audit/SKILL.md +0 -0
  20. {arrayview-0.10.0 → arrayview-0.11.0}/.claude/skills/viewer-ui-checklist/SKILL.md +0 -0
  21. {arrayview-0.10.0 → arrayview-0.11.0}/.claude/skills/visual-bug-fixing/SKILL.md +0 -0
  22. {arrayview-0.10.0 → arrayview-0.11.0}/.github/workflows/docs.yml +0 -0
  23. {arrayview-0.10.0 → arrayview-0.11.0}/.github/workflows/python-publish.yml +0 -0
  24. {arrayview-0.10.0 → arrayview-0.11.0}/.gitignore +0 -0
  25. {arrayview-0.10.0 → arrayview-0.11.0}/.python-version +0 -0
  26. {arrayview-0.10.0 → arrayview-0.11.0}/.tmp-vsix/extension/extension.js +0 -0
  27. {arrayview-0.10.0 → arrayview-0.11.0}/.tmp-vsix/extension/package.json +0 -0
  28. {arrayview-0.10.0 → arrayview-0.11.0}/AGENTS.md +0 -0
  29. {arrayview-0.10.0 → arrayview-0.11.0}/LICENSE +0 -0
  30. {arrayview-0.10.0 → arrayview-0.11.0}/docs/comparing.md +0 -0
  31. {arrayview-0.10.0 → arrayview-0.11.0}/docs/configuration.md +0 -0
  32. {arrayview-0.10.0 → arrayview-0.11.0}/docs/display.md +0 -0
  33. {arrayview-0.10.0 → arrayview-0.11.0}/docs/index.md +0 -0
  34. {arrayview-0.10.0 → arrayview-0.11.0}/docs/loading.md +0 -0
  35. {arrayview-0.10.0 → arrayview-0.11.0}/docs/logo.png +0 -0
  36. {arrayview-0.10.0 → arrayview-0.11.0}/docs/measurement.md +0 -0
  37. {arrayview-0.10.0 → arrayview-0.11.0}/docs/remote.md +0 -0
  38. {arrayview-0.10.0 → arrayview-0.11.0}/docs/stylesheets/extra.css +0 -0
  39. {arrayview-0.10.0 → arrayview-0.11.0}/docs/viewing.md +0 -0
  40. {arrayview-0.10.0 → arrayview-0.11.0}/matlab/arrayview.m +0 -0
  41. {arrayview-0.10.0 → arrayview-0.11.0}/mkdocs.yml +0 -0
  42. {arrayview-0.10.0 → arrayview-0.11.0}/plans/webview/LOG.md +0 -0
  43. {arrayview-0.10.0 → arrayview-0.11.0}/scripts/demo.py +0 -0
  44. {arrayview-0.10.0 → arrayview-0.11.0}/scripts/release.sh +0 -0
  45. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/ARCHITECTURE.md +0 -0
  46. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/__init__.py +0 -0
  47. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/__main__.py +0 -0
  48. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/_app.py +0 -0
  49. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/_icon.png +0 -0
  50. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/_launcher.py +0 -0
  51. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/_platform.py +0 -0
  52. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/_segmentation.py +0 -0
  53. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/_shell.html +0 -0
  54. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/_torch.py +0 -0
  55. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/_vscode.py +0 -0
  56. {arrayview-0.10.0 → arrayview-0.11.0}/src/arrayview/arrayview-opener.vsix +0 -0
  57. {arrayview-0.10.0 → arrayview-0.11.0}/tests/conftest.py +0 -0
  58. {arrayview-0.10.0 → arrayview-0.11.0}/tests/make_vectorfield_test_arrays.py +0 -0
  59. {arrayview-0.10.0 → arrayview-0.11.0}/tests/test_api.py +0 -0
  60. {arrayview-0.10.0 → arrayview-0.11.0}/tests/test_cli.py +0 -0
  61. {arrayview-0.10.0 → arrayview-0.11.0}/tests/test_config.py +0 -0
  62. {arrayview-0.10.0 → arrayview-0.11.0}/tests/test_large_arrays.py +0 -0
  63. {arrayview-0.10.0 → arrayview-0.11.0}/tests/test_mode_consistency.py +0 -0
  64. {arrayview-0.10.0 → arrayview-0.11.0}/tests/test_rgb_pixel_art.py +0 -0
  65. {arrayview-0.10.0 → arrayview-0.11.0}/tests/test_torch.py +0 -0
  66. {arrayview-0.10.0 → arrayview-0.11.0}/tests/ui_audit.py +0 -0
  67. {arrayview-0.10.0 → arrayview-0.11.0}/vscode-extension/LICENSE +0 -0
  68. {arrayview-0.10.0 → arrayview-0.11.0}/vscode-extension/extension.js +0 -0
  69. {arrayview-0.10.0 → arrayview-0.11.0}/vscode-extension/package.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arrayview
3
- Version: 0.10.0
3
+ Version: 0.11.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
@@ -35,6 +35,8 @@ Description-Content-Type: text/markdown
35
35
 
36
36
  # arrayview
37
37
 
38
+ [![Documentation](https://img.shields.io/badge/docs-oscarvanderheide.github.io/arrayview-blue)](https://oscarvanderheide.github.io/arrayview/)
39
+
38
40
  A viewer for multi-dimensional arrays.
39
41
 
40
42
  - CLI and Python
@@ -133,4 +135,3 @@ colormaps = ["gray", "viridis", "plasma"] # colormaps cycled by 'c'
133
135
  default = "browser" # browser | native | vscode | inline
134
136
  ```
135
137
 
136
- [Full documentation →](https://oscarvanderheide.github.io/arrayview/)
@@ -1,5 +1,7 @@
1
1
  # arrayview
2
2
 
3
+ [![Documentation](https://img.shields.io/badge/docs-oscarvanderheide.github.io/arrayview-blue)](https://oscarvanderheide.github.io/arrayview/)
4
+
3
5
  A viewer for multi-dimensional arrays.
4
6
 
5
7
  - CLI and Python
@@ -98,4 +100,3 @@ colormaps = ["gray", "viridis", "plasma"] # colormaps cycled by 'c'
98
100
  default = "browser" # browser | native | vscode | inline
99
101
  ```
100
102
 
101
- [Full documentation →](https://oscarvanderheide.github.io/arrayview/)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "arrayview"
7
- version = "0.10.0"
7
+ version = "0.11.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"
@@ -41,6 +41,21 @@ def get_viewer_colormaps() -> list[str] | None:
41
41
  return None
42
42
 
43
43
 
44
+ _VALID_THEMES = {"dark", "light", "solarized", "nord"}
45
+
46
+
47
+ def get_viewer_theme() -> str | None:
48
+ """Return user-configured default theme name, or None if not configured."""
49
+ cfg = load_config()
50
+ viewer_cfg = cfg.get("viewer", {})
51
+ if not isinstance(viewer_cfg, dict):
52
+ return None
53
+ theme = viewer_cfg.get("theme")
54
+ if isinstance(theme, str) and theme.strip().lower() in _VALID_THEMES:
55
+ return theme.strip().lower()
56
+ return None
57
+
58
+
44
59
  def get_nninteractive_url() -> str | None:
45
60
  """Return configured nnInteractive server URL, or None.
46
61
 
@@ -133,7 +133,13 @@ def load_data(filepath):
133
133
  if len(keys) == 1:
134
134
  return npz[keys[0]]
135
135
  return _select_npz_array(npz, filepath)
136
- elif filepath.endswith(".nii") or filepath.endswith(".nii.gz"):
136
+ elif filepath.endswith(".nii.gz"):
137
+ # Gzip streams aren't seekable, so nibabel's lazy dataobj decompresses
138
+ # large portions of the file on every arbitrary slice access. Materialize
139
+ # the volume up front so subsequent slicing is cheap.
140
+ return np.asarray(_nib().load(filepath).dataobj)
141
+ elif filepath.endswith(".nii"):
142
+ # Uncompressed NIfTI is memory-mapped via dataobj — slicing is cheap.
137
143
  return _nib().load(filepath).dataobj
138
144
  elif filepath.endswith(".zarr") or filepath.endswith(".zarr.zip"):
139
145
  import zarr
@@ -111,7 +111,10 @@ def _compute_vmin_vmax(session, data, dr=0, complex_mode=0):
111
111
 
112
112
 
113
113
  def extract_slice(session, dim_x, dim_y, idx_list):
114
- key = (dim_x, dim_y, tuple(idx_list))
114
+ # Mask out indices along the displayed dims — they're slice(None) in the
115
+ # slicer below, so the extracted data doesn't depend on them.
116
+ key_idx = tuple(None if i in (dim_x, dim_y) else idx_list[i] for i in range(len(idx_list)))
117
+ key = (dim_x, dim_y, key_idx)
115
118
  if key in session.raw_cache:
116
119
  session.raw_cache.move_to_end(key)
117
120
  return session.raw_cache[key]
@@ -154,7 +157,12 @@ def extract_projection(session, dim_x, dim_y, idx_list, proj_dim, proj_mode):
154
157
 
155
158
  proj_mode: 1=max, 2=min, 3=mean, 4=std, 5=sos (sum of squares)
156
159
  """
157
- key = ("proj", dim_x, dim_y, tuple(idx_list), proj_dim, proj_mode)
160
+ # Mask out indices along the displayed/projected dims — they're slice(None).
161
+ key_idx = tuple(
162
+ None if i in (dim_x, dim_y, proj_dim) else idx_list[i]
163
+ for i in range(len(idx_list))
164
+ )
165
+ key = ("proj", dim_x, dim_y, key_idx, proj_dim, proj_mode)
158
166
  if key in session.raw_cache:
159
167
  session.raw_cache.move_to_end(key)
160
168
  return session.raw_cache[key]