figpack 0.2.35__py3-none-any.whl → 0.2.36__py3-none-any.whl

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.

Potentially problematic release.


This version of figpack might be problematic. Click here for more details.

@@ -9,7 +9,7 @@
9
9
  // Allow script injection from trusted domains (see src/main.tsx)
10
10
  window.script_injection_allowed_domains = ['https://manage.figpack.org', 'https://figpack.org'];
11
11
  </script>
12
- <script type="module" crossorigin src="./assets/index-DXkrNeMu.js"></script>
12
+ <script type="module" crossorigin src="./assets/index-Bt8OPETP.js"></script>
13
13
  <link rel="stylesheet" crossorigin href="./assets/index-V5m_wCvw.css">
14
14
  </head>
15
15
  <body>
figpack/views/Box.py CHANGED
@@ -2,7 +2,7 @@
2
2
  Box view for figpack - a layout container that handles other views
3
3
  """
4
4
 
5
- from typing import Any, Dict, List, Literal, Optional
5
+ from typing import List, Literal, Optional
6
6
 
7
7
  from ..core.figpack_view import FigpackView
8
8
  from ..core.zarr import Group
@@ -21,7 +21,7 @@ class Box(FigpackView):
21
21
  show_titles: bool = True,
22
22
  items: List[LayoutItem],
23
23
  title: Optional[str] = None,
24
- ):
24
+ ) -> None:
25
25
  """
26
26
  Initialize a Box layout view
27
27
 
figpack/views/Image.py CHANGED
@@ -5,7 +5,6 @@ Image view for figpack - displays PNG and JPG images
5
5
  from typing import Union
6
6
 
7
7
  import numpy as np
8
- import zarr
9
8
 
10
9
  from ..core.figpack_view import FigpackView
11
10
  from ..core.zarr import Group
@@ -16,7 +15,7 @@ class Image(FigpackView):
16
15
  An image visualization component for PNG and JPG files
17
16
  """
18
17
 
19
- def __init__(self, image_path_or_data: Union[str, bytes]):
18
+ def __init__(self, image_path_or_data: Union[str, bytes]) -> None:
20
19
  """
21
20
  Initialize an Image view
22
21
 
@@ -55,15 +55,15 @@ class PlotlyFigure(figpack.ExtensionView):
55
55
  class CustomJSONEncoder(json.JSONEncoder):
56
56
  """Custom JSON encoder that handles numpy arrays and datetime objects"""
57
57
 
58
- def default(self, obj):
59
- if isinstance(obj, np.ndarray):
60
- return obj.tolist()
61
- elif isinstance(obj, (np.integer, np.floating)):
62
- return obj.item()
63
- elif isinstance(obj, (datetime, date)):
64
- return obj.isoformat()
65
- elif isinstance(obj, np.datetime64):
66
- return str(obj)
67
- elif hasattr(obj, "isoformat"): # Handle other datetime-like objects
68
- return obj.isoformat()
69
- return super().default(obj)
58
+ def default(self, o):
59
+ if isinstance(o, np.ndarray):
60
+ return o.tolist()
61
+ elif isinstance(o, (np.integer, np.floating)):
62
+ return o.item()
63
+ elif isinstance(o, (datetime, date)):
64
+ return o.isoformat()
65
+ elif isinstance(o, np.datetime64):
66
+ return str(o)
67
+ elif hasattr(o, "isoformat"): # Handle other datetime-like objects
68
+ return o.isoformat()
69
+ return super().default(o)
@@ -62,12 +62,14 @@ class Spectrogram(FigpackView):
62
62
 
63
63
  # Store frequency information
64
64
  if uniform_specified:
65
+ assert frequency_delta_hz is not None, "Frequency delta must be provided"
65
66
  assert frequency_delta_hz > 0, "Frequency delta must be positive"
66
67
  self.uniform_frequencies = True
67
68
  self.frequency_min_hz = frequency_min_hz
68
69
  self.frequency_delta_hz = frequency_delta_hz
69
70
  self.frequencies = None
70
71
  else:
72
+ assert frequencies is not None, "Frequencies array must be provided"
71
73
  assert (
72
74
  len(frequencies) == data.shape[1]
73
75
  ), f"Number of frequencies ({len(frequencies)}) must match data frequency dimension ({data.shape[1]})"
@@ -3,7 +3,7 @@ Views module for figpack - contains visualization components
3
3
  """
4
4
 
5
5
  import math
6
- from typing import Any, Dict, List, Optional, Union
6
+ from typing import Any, Dict, List, Optional, Tuple, Union
7
7
 
8
8
  import numpy as np
9
9
 
@@ -26,7 +26,7 @@ class TimeseriesGraph(FigpackView):
26
26
  hide_nav_toolbar: bool = False,
27
27
  hide_time_axis_labels: bool = False,
28
28
  y_label: str = "",
29
- ):
29
+ ) -> None:
30
30
  """
31
31
  Initialize a TimeseriesGraph
32
32
 
@@ -54,8 +54,8 @@ class TimeseriesGraph(FigpackView):
54
54
  self,
55
55
  *,
56
56
  name: str,
57
- t: np.ndarray,
58
- y: np.ndarray,
57
+ t: Union[np.ndarray, List[float]],
58
+ y: Union[np.ndarray, List[float]],
59
59
  color: str = "blue",
60
60
  width: float = 1.0,
61
61
  dash: Optional[List[float]] = None,
@@ -241,7 +241,7 @@ class TGLineSeries:
241
241
  color: str,
242
242
  width: float,
243
243
  dash: Optional[List[float]],
244
- ):
244
+ ) -> None:
245
245
  assert t.ndim == 1, "Time array must be 1-dimensional"
246
246
  assert y.ndim == 1, "Y array must be 1-dimensional"
247
247
  assert len(t) == len(y), "Time and Y arrays must have the same length"
@@ -274,7 +274,7 @@ class TGMarkerSeries:
274
274
  color: str,
275
275
  radius: float,
276
276
  shape: str,
277
- ):
277
+ ) -> None:
278
278
  assert t.ndim == 1, "Time array must be 1-dimensional"
279
279
  assert y.ndim == 1, "Y array must be 1-dimensional"
280
280
  assert len(t) == len(y), "Time and Y arrays must have the same length"
@@ -309,7 +309,7 @@ class TGIntervalSeries:
309
309
  t_end: np.ndarray,
310
310
  color: str,
311
311
  alpha: float,
312
- ):
312
+ ) -> None:
313
313
  assert t_start.ndim == 1, "Start time array must be 1-dimensional"
314
314
  assert t_end.ndim == 1, "End time array must be 1-dimensional"
315
315
  assert len(t_start) == len(
@@ -352,7 +352,7 @@ class TGUniformSeries:
352
352
  channel_spacing: Optional[float] = None,
353
353
  auto_channel_spacing: Optional[float] = None,
354
354
  timestamps_for_inserting_nans: Optional[np.ndarray] = None,
355
- ):
355
+ ) -> None:
356
356
  assert sampling_frequency_hz > 0, "Sampling frequency must be positive"
357
357
 
358
358
  # Handle both 1D and 2D data
@@ -392,7 +392,11 @@ class TGUniformSeries:
392
392
  )
393
393
  rms_estimate = mad / 0.6745 # Convert MAD to RMS estimate
394
394
  channel_spacing = auto_channel_spacing * np.nanmedian(rms_estimate)
395
- if channel_spacing <= 0 or np.isnan(channel_spacing):
395
+ if (
396
+ channel_spacing is None
397
+ or (channel_spacing <= 0)
398
+ or np.isnan(channel_spacing)
399
+ ):
396
400
  channel_spacing = 1.0 # Fallback to default spacing if estimate fails
397
401
  self.channel_spacing = channel_spacing
398
402
 
@@ -437,7 +441,7 @@ class TGUniformSeries:
437
441
  # Prepare downsampled arrays for efficient rendering
438
442
  self.downsampled_data = self._compute_downsampled_data()
439
443
 
440
- def _compute_downsampled_data(self) -> dict:
444
+ def _compute_downsampled_data(self) -> Dict[int, np.ndarray]:
441
445
  """
442
446
  Compute downsampled arrays at power-of-4 factors using a vectorized
443
447
  min/max pyramid with NaN padding for partial bins.
@@ -512,8 +516,8 @@ class TGUniformSeries:
512
516
  return downsampled
513
517
 
514
518
  def _calculate_optimal_chunk_size(
515
- self, shape: tuple, target_size_mb: float = 5.0
516
- ) -> tuple:
519
+ self, shape: Tuple[int, ...], target_size_mb: float = 5.0
520
+ ) -> Tuple[int, ...]:
517
521
  """
518
522
  Calculate optimal chunk size for Zarr storage targeting ~5MB per chunk
519
523
 
@@ -610,7 +614,7 @@ def insert_nans_based_on_timestamps(
610
614
  start_time_sec: float,
611
615
  sampling_frequency_hz: float,
612
616
  timestamps: np.ndarray,
613
- ):
617
+ ) -> np.ndarray:
614
618
  end_timestamps = timestamps[-1]
615
619
  ret_length = int((end_timestamps - start_time_sec) * sampling_frequency_hz) + 1
616
620
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: figpack
3
- Version: 0.2.35
3
+ Version: 0.2.36
4
4
  Summary: A Python package for creating shareable, interactive visualizations in the browser
5
5
  Author-email: Jeremy Magland <jmagland@flatironinstitute.org>
6
6
  License: Apache-2.0
@@ -114,6 +114,27 @@ graph.show(open_in_browser=True, title="Quick Start Example")
114
114
 
115
115
  Apache-2.0
116
116
 
117
+ ## Citation
118
+
119
+ If you use figpack in your research, please cite it:
120
+
121
+ [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.17419621.svg)](https://doi.org/10.5281/zenodo.17419621)
122
+
123
+ ```bibtex
124
+ @software{magland_figpack_2025,
125
+ author = {Magland, Jeremy},
126
+ title = {figpack},
127
+ year = 2025,
128
+ publisher = {Zenodo},
129
+ doi = {10.5281/zenodo.17419621},
130
+ url = {https://doi.org/10.5281/zenodo.17419621}
131
+ }
132
+ ```
133
+
134
+ Or in APA format:
135
+
136
+ > Magland, J. (2025). figpack (Version 0.2.36) [Computer software]. Zenodo. https://doi.org/10.5281/zenodo.17419621
137
+
117
138
  ## Contributing
118
139
 
119
140
  Visit the [GitHub repository](https://github.com/flatironinstitute/figpack) for issues, contributions, and the latest updates.
@@ -1,49 +1,49 @@
1
- figpack/__init__.py,sha256=7Q_sLtYRKyTVLtkTc5VZ21KUBsu3u5OBIihRytwY73s,358
2
- figpack/cli.py,sha256=s1mGQuFSntxiIvU6OWwHVlM9Cj-l1zMQ3OzFFe1-5ZE,11089
1
+ figpack/__init__.py,sha256=8eZgm8Wp8nuRXUKviVwSP1Lackqcld64neeZJHF-q0E,358
2
+ figpack/cli.py,sha256=A3mlfVUmZTzbDiDCyZ0OAR_D4wCgTaasATh1Ukr0sto,13310
3
3
  figpack/extensions.py,sha256=mILB4_F1RHkca4I7t88zh74IX8VCmfT7XFZZT4XYdNw,13009
4
4
  figpack/core/__init__.py,sha256=7zU6O1piTk07aeCfbU81QqTgSHIO2n5MZ4LFNmsrtfs,192
5
- figpack/core/_bundle_utils.py,sha256=LXPbINsm01jkbQeikgx-CauPZYj9uGFFApWwuzDlJPg,9063
6
- figpack/core/_file_handler.py,sha256=TC4Z23Xy4dKky8BEwyp3Gj4K9-gpnKRiF1u6KkxWprc,6984
7
- figpack/core/_save_figure.py,sha256=m6JOuASYeyycroBpJfTFN3azqsKtcWkeak9_Uh1HYaQ,1152
8
- figpack/core/_server_manager.py,sha256=I8PQImUa4C0L6LfIiCnpRnfQT7B-XVseCs80qnUvIlI,12374
9
- figpack/core/_show_view.py,sha256=noADkomP1ovH-Jb7Bj0unmkPXvS_uOkkCILJSWag1RI,5171
10
- figpack/core/_upload_bundle.py,sha256=yGngZfa6yzxh3-YDJrLuN5JaMd-egSxv6DWry67iuZY,14831
11
- figpack/core/_view_figure.py,sha256=GYTgSCWBxi1pR16aBgAYRcEuFcgj0vjsrLIVfy1HYzM,5374
5
+ figpack/core/_bundle_utils.py,sha256=acr1ZnHLgyBuUQt3uEvJP5l_lH1EGP6D5WWR9tJDsdQ,9133
6
+ figpack/core/_file_handler.py,sha256=UF4-mQmsj4XuutrO7qPAVFEZb-RRp9I17P75qQ3se80,6987
7
+ figpack/core/_save_figure.py,sha256=ZboTlu5N609GmBlQ7rni5p7AP1mvCelEjHBHWeLWGOM,1166
8
+ figpack/core/_server_manager.py,sha256=5Rez_8ku4DjMpeX7uJ1QN7DtZM_AgOjMqaY7PDWaFNU,12637
9
+ figpack/core/_show_view.py,sha256=nLsVOuuy5-NLSAK8qMjxmRart3TAL1wH1duTcIH_mGA,5187
10
+ figpack/core/_upload_bundle.py,sha256=glOnl6LC-m3vslU4hT7AoMLpUPjzd4hrvYJNpnqBcTY,15109
11
+ figpack/core/_view_figure.py,sha256=FVPvSOa1hW2Th-X778VwKytfNpudoFNb1LK7eY43p44,5568
12
12
  figpack/core/config.py,sha256=oOR7SlP192vuFhYlS-h14HnG-kd_3gaz0vshXch2RNc,173
13
- figpack/core/extension_view.py,sha256=FSBXdhFEWicLi0jhkuRdS-a8CNsULrEqqIKtYfV3tmI,1255
14
- figpack/core/figpack_extension.py,sha256=KSJKlnLYueFnGa8QFMpbIF3CDMwnIZJOqsI0smz6cUc,2252
15
- figpack/core/figpack_view.py,sha256=SMc5mZztmzbFriWu4N5YVqRdl3TvhkDVPGjZlk1uWBE,7089
16
- figpack/core/zarr.py,sha256=LTWOIX6vuH25STYTQS9_apfnfYXmATAEQkil3z9eYKE,1634
17
- figpack/figpack-figure-dist/index.html,sha256=D_jEKFrFKWBi-hFvMhSzQm9HmSvNUBZA2zJLIZXc7KA,688
18
- figpack/figpack-figure-dist/assets/index-DXkrNeMu.js,sha256=1bIKjBQ2IndmHFu_MYi6JLqO9JQi6cgIeogu7_zrPBg,1114402
13
+ figpack/core/extension_view.py,sha256=qh1g7H_YfOF0eLAl-c7uZlv7A8Ssm8VbrhRfGsjtHto,1322
14
+ figpack/core/figpack_extension.py,sha256=F4q6poPihwVnjWQtasZjvzB0IkqFfgJuv8Xb9N4eNOA,2260
15
+ figpack/core/figpack_view.py,sha256=LCwydF_M03gvlAGjU9CMWFMyXGlV0EkfhzgAU9gxPWc,7292
16
+ figpack/core/zarr.py,sha256=wKi8G2MksdTbZUA3Yc-huhIplrOWCgkmYnn8NMftA7k,1666
17
+ figpack/figpack-figure-dist/index.html,sha256=mQLmYOP3kaMGSy2bNnSLFRcOfuDX37UMLPPyLXXwT50,688
18
+ figpack/figpack-figure-dist/assets/index-Bt8OPETP.js,sha256=dHJfsfbd3_M91vmWdwz3YggVU0BrTbElV6QZB0vlEBo,1114580
19
19
  figpack/figpack-figure-dist/assets/index-V5m_wCvw.css,sha256=WRtQLW6SNlTlLtepSOt89t1z41SD7XzYUyRldqowjMM,7286
20
20
  figpack/figpack-figure-dist/assets/neurosift-logo-CLsuwLMO.png,sha256=g5m-TwrGh5f6-9rXtWV-znH4B0nHgc__0GWclRDLUHs,9307
21
- figpack/views/Box.py,sha256=oN_OJH2pK_hH26k0eFCFjlfuJssVqKvw20GxYK1HX7g,2419
21
+ figpack/views/Box.py,sha256=WTp69JiytmcocdkKR4k-qLKMB9soiu_8uOKHeO6mtUQ,2416
22
22
  figpack/views/CaptionedView.py,sha256=Lgv4ZMs0LqHuzLIjEGVZhq2zzv-Ufa9pqUCyky8DuCY,1908
23
23
  figpack/views/DataFrame.py,sha256=VGspmfWtnZ4Gvea5zd-ODpiJPQEp8gVv-ScDhVVCeyA,3400
24
24
  figpack/views/Gallery.py,sha256=15ukt9CmgkbT8q_okEYYDESW1E7vOJkVPombSlrEWKw,3324
25
25
  figpack/views/GalleryItem.py,sha256=b_upJno5P3ANSulbG-h3t6Xj56tPGJ7iVxqyiZu3zaQ,1244
26
26
  figpack/views/Iframe.py,sha256=F7q46W2UO1oDcG0IpAWgIxbMtRo9dPORJY8Msu3Tm6Y,1050
27
- figpack/views/Image.py,sha256=Nc8XNKQBm79iN6omZIsYEU6daNa_X3_IIbmt4q1Zb8k,3741
27
+ figpack/views/Image.py,sha256=z9PEnaGk470Zy5q06e2hIoHV53XSGpouMGT4bZf4ixA,3737
28
28
  figpack/views/LayoutItem.py,sha256=wy8DggkIzZpU0F1zFIBceS7HpBb6lu-A3hpYINQzedk,1595
29
29
  figpack/views/Markdown.py,sha256=yKMnWpxT0o9tRsPHjbcdZCgXpE67WNV-R66EAHdE2nA,1301
30
30
  figpack/views/MatplotlibFigure.py,sha256=697xTOkNxcwYZrLoYOzh4CuME4NDUpIYzX-ckLE5aWU,2422
31
31
  figpack/views/MountainLayout.py,sha256=JGvrhzqLR2im5d-m0TsZNy06KOR5iGfDlinrRqHpQsQ,2680
32
32
  figpack/views/MountainLayoutItem.py,sha256=arYO1pD9RpXfHQKxtFagl66bjqSzEdafIf8ldDEMTD0,1451
33
33
  figpack/views/MultiChannelTimeseries.py,sha256=6AkEbAsdM6fvZVsa3jakIjEcx6LNWhF0fbS00e33heM,8291
34
- figpack/views/Spectrogram.py,sha256=jcm26ucHedKDnBA5xnAUu9tW-g-ZutT-kw1EIhYm66E,9335
34
+ figpack/views/Spectrogram.py,sha256=YuxEbqDJhhD6R4z6aIR8zzPtk6Wcszjq5V5NtY_1s8w,9502
35
35
  figpack/views/Splitter.py,sha256=BR2L-8aqicTubS1rSzsQ3XnhoJcX5GcfEnVWtEWEs0w,2016
36
36
  figpack/views/TabLayout.py,sha256=AqdHPLcP2-caWjxbkC8r8m60z8n_eyZrIBGOOPSVNCs,1908
37
37
  figpack/views/TabLayoutItem.py,sha256=xmHA0JsW_6naJze4_mQuP_Fy0Nm17p2N7w_AsmVRp8k,880
38
- figpack/views/TimeseriesGraph.py,sha256=y3tl0-95dGw01GdVwNlEzO5xg9WPLNGvvfgF3VxsusY,21700
38
+ figpack/views/TimeseriesGraph.py,sha256=0s0Uc-4iuvnoosAh5-yJDYe0UyvWDMIJOqlNqb_dZdA,21931
39
39
  figpack/views/__init__.py,sha256=eZVhNCRRUIYtXou__k2tfNjPKyrc576whfZsVFagofY,709
40
- figpack/views/PlotlyExtension/PlotlyExtension.py,sha256=LOFSqbm46UZ7HsHTDxUPnNB33ydYQvEkRVK-TSKkzK4,2149
40
+ figpack/views/PlotlyExtension/PlotlyExtension.py,sha256=MehIrw3ZMjHc4LjKd6ZYKnMi0828bX2ehi68KcW4_P8,2125
41
41
  figpack/views/PlotlyExtension/__init__.py,sha256=80Wy1mDMWyagjuR99ECxJePIYpRQ6TSyHkB0uZoBZ_0,70
42
42
  figpack/views/PlotlyExtension/_plotly_extension.py,sha256=yZjG1NMGlQedeeLdV6TQWpi_NTm5Wfk5eWbXEdZbbFE,1455
43
43
  figpack/views/PlotlyExtension/plotly_view.js,sha256=9BjgOPkqGl87SSonnb48nFeQV3UTIi1trpSPxd9qlKo,3055
44
- figpack-0.2.35.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
45
- figpack-0.2.35.dist-info/METADATA,sha256=KWYwiIEERtODLFj9Q_lFFvjEQMvUplHQehQ2dQKs4FM,4618
46
- figpack-0.2.35.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
47
- figpack-0.2.35.dist-info/entry_points.txt,sha256=l6d3siH2LxXa8qJGbjAqpIZtI5AkMSyDeoRDCzdrUto,45
48
- figpack-0.2.35.dist-info/top_level.txt,sha256=lMKGaC5xWmAYBx9Ac1iMokm42KFnJFjmkP2ldyvOo-c,8
49
- figpack-0.2.35.dist-info/RECORD,,
44
+ figpack-0.2.36.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
45
+ figpack-0.2.36.dist-info/METADATA,sha256=myVzC4qQnV8TzUjx9gEwQwNdyUuagW14ckkkjAzmwKc,5196
46
+ figpack-0.2.36.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
47
+ figpack-0.2.36.dist-info/entry_points.txt,sha256=l6d3siH2LxXa8qJGbjAqpIZtI5AkMSyDeoRDCzdrUto,45
48
+ figpack-0.2.36.dist-info/top_level.txt,sha256=lMKGaC5xWmAYBx9Ac1iMokm42KFnJFjmkP2ldyvOo-c,8
49
+ figpack-0.2.36.dist-info/RECORD,,