figpack 0.2.14__tar.gz → 0.2.16__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.
Potentially problematic release.
This version of figpack might be problematic. Click here for more details.
- {figpack-0.2.14/figpack.egg-info → figpack-0.2.16}/PKG-INFO +21 -2
- {figpack-0.2.14 → figpack-0.2.16}/figpack/__init__.py +3 -1
- {figpack-0.2.14 → figpack-0.2.16}/figpack/core/_bundle_utils.py +24 -15
- {figpack-0.2.14 → figpack-0.2.16}/figpack/core/_view_figure.py +1 -1
- {figpack-0.2.14 → figpack-0.2.16}/figpack/core/extension_view.py +2 -2
- {figpack-0.2.14 → figpack-0.2.16}/figpack/core/figpack_view.py +2 -2
- figpack-0.2.16/figpack/core/zarr.py +61 -0
- figpack-0.2.14/figpack/figpack-figure-dist/assets/index-F6uGre7p.js → figpack-0.2.16/figpack/figpack-figure-dist/assets/index-DtOnN02w.js +64 -64
- {figpack-0.2.14 → figpack-0.2.16}/figpack/figpack-figure-dist/index.html +1 -1
- {figpack-0.2.14 → figpack-0.2.16}/figpack/franklab/views/TrackAnimation.py +2 -1
- {figpack-0.2.14 → figpack-0.2.16}/figpack/spike_sorting/views/Autocorrelograms.py +3 -5
- {figpack-0.2.14 → figpack-0.2.16}/figpack/spike_sorting/views/AverageWaveforms.py +2 -3
- {figpack-0.2.14 → figpack-0.2.16}/figpack/spike_sorting/views/CrossCorrelograms.py +2 -3
- {figpack-0.2.14 → figpack-0.2.16}/figpack/spike_sorting/views/RasterPlot.py +2 -6
- {figpack-0.2.14 → figpack-0.2.16}/figpack/spike_sorting/views/SpikeAmplitudes.py +2 -12
- {figpack-0.2.14 → figpack-0.2.16}/figpack/spike_sorting/views/UnitMetricsGraph.py +2 -4
- {figpack-0.2.14 → figpack-0.2.16}/figpack/spike_sorting/views/UnitsTable.py +2 -9
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/Box.py +2 -3
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/DataFrame.py +6 -12
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/Gallery.py +2 -3
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/Image.py +3 -9
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/Markdown.py +3 -4
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/MatplotlibFigure.py +2 -11
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/MultiChannelTimeseries.py +2 -6
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/PlotlyExtension/PlotlyExtension.py +7 -13
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/Spectrogram.py +2 -7
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/Splitter.py +2 -3
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/TabLayout.py +2 -3
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/TimeseriesGraph.py +6 -10
- {figpack-0.2.14 → figpack-0.2.16/figpack.egg-info}/PKG-INFO +21 -2
- {figpack-0.2.14 → figpack-0.2.16}/figpack.egg-info/SOURCES.txt +2 -2
- {figpack-0.2.14 → figpack-0.2.16}/figpack.egg-info/requires.txt +22 -1
- {figpack-0.2.14 → figpack-0.2.16}/pyproject.toml +25 -3
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_average_waveforms.py +9 -6
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_box.py +5 -2
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_cli.py +0 -1
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_core.py +4 -4
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_dataframe.py +19 -20
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_gallery.py +5 -5
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_image.py +7 -5
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_markdown.py +11 -9
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_matplotlib_figure.py +12 -20
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_multichannel_timeseries.py +6 -4
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_plotly_figure.py +8 -10
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_raster_plot.py +7 -2
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_server_manager.py +0 -6
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_spectrogram.py +4 -42
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_spike_amplitudes.py +7 -83
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_spike_sorting_correlograms.py +19 -10
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_splitter.py +6 -4
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_tablayout.py +8 -6
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_timeseries_graph.py +4 -2
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_track_animation.py +4 -3
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_units_table.py +15 -15
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_upload_bundle.py +0 -7
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_view_figure.py +1 -3
- figpack-0.2.14/tests/test_show_view.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/LICENSE +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/MANIFEST.in +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/README.md +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/cli.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/core/__init__.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/core/_save_figure.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/core/_server_manager.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/core/_show_view.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/core/_upload_bundle.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/core/config.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/core/figpack_extension.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/figpack-figure-dist/assets/index-D9a3K6eW.css +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/figpack-figure-dist/assets/neurosift-logo-CLsuwLMO.png +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/franklab/__init__.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/franklab/views/__init__.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/spike_sorting/__init__.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/spike_sorting/views/AutocorrelogramItem.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/spike_sorting/views/CrossCorrelogramItem.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/spike_sorting/views/RasterPlotItem.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/spike_sorting/views/SpikeAmplitudesItem.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/spike_sorting/views/UnitSimilarityScore.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/spike_sorting/views/UnitsTableColumn.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/spike_sorting/views/UnitsTableRow.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/spike_sorting/views/__init__.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/GalleryItem.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/LayoutItem.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/PlotlyExtension/__init__.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/PlotlyExtension/plotly_view.js +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/TabLayoutItem.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack/views/__init__.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack.egg-info/dependency_links.txt +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack.egg-info/entry_points.txt +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/figpack.egg-info/top_level.txt +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/setup.cfg +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_extension_system.py +0 -0
- {figpack-0.2.14 → figpack-0.2.16}/tests/test_figpack_view.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: figpack
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.16
|
|
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
|
|
@@ -25,7 +25,7 @@ Requires-Python: >=3.8
|
|
|
25
25
|
Description-Content-Type: text/markdown
|
|
26
26
|
License-File: LICENSE
|
|
27
27
|
Requires-Dist: numpy
|
|
28
|
-
Requires-Dist: zarr
|
|
28
|
+
Requires-Dist: zarr
|
|
29
29
|
Requires-Dist: requests
|
|
30
30
|
Requires-Dist: psutil
|
|
31
31
|
Provides-Extra: test
|
|
@@ -37,6 +37,25 @@ Requires-Dist: matplotlib; extra == "test"
|
|
|
37
37
|
Requires-Dist: plotly; extra == "test"
|
|
38
38
|
Requires-Dist: Pillow; extra == "test"
|
|
39
39
|
Requires-Dist: pandas; extra == "test"
|
|
40
|
+
Provides-Extra: test-zarr2
|
|
41
|
+
Requires-Dist: pytest>=7.0; extra == "test-zarr2"
|
|
42
|
+
Requires-Dist: pytest-cov>=4.0; extra == "test-zarr2"
|
|
43
|
+
Requires-Dist: pytest-mock>=3.10; extra == "test-zarr2"
|
|
44
|
+
Requires-Dist: spikeinterface; extra == "test-zarr2"
|
|
45
|
+
Requires-Dist: matplotlib; extra == "test-zarr2"
|
|
46
|
+
Requires-Dist: plotly; extra == "test-zarr2"
|
|
47
|
+
Requires-Dist: Pillow; extra == "test-zarr2"
|
|
48
|
+
Requires-Dist: pandas; extra == "test-zarr2"
|
|
49
|
+
Requires-Dist: zarr<3; extra == "test-zarr2"
|
|
50
|
+
Provides-Extra: test-zarr3
|
|
51
|
+
Requires-Dist: pytest>=7.0; extra == "test-zarr3"
|
|
52
|
+
Requires-Dist: pytest-cov>=4.0; extra == "test-zarr3"
|
|
53
|
+
Requires-Dist: pytest-mock>=3.10; extra == "test-zarr3"
|
|
54
|
+
Requires-Dist: matplotlib; extra == "test-zarr3"
|
|
55
|
+
Requires-Dist: plotly; extra == "test-zarr3"
|
|
56
|
+
Requires-Dist: Pillow; extra == "test-zarr3"
|
|
57
|
+
Requires-Dist: pandas; extra == "test-zarr3"
|
|
58
|
+
Requires-Dist: zarr>=3; extra == "test-zarr3"
|
|
40
59
|
Provides-Extra: dev
|
|
41
60
|
Requires-Dist: pytest>=7.0; extra == "dev"
|
|
42
61
|
Requires-Dist: pytest-cov>=4.0; extra == "dev"
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
figpack - A Python package for creating shareable, interactive visualizations in the browser
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
-
__version__ = "0.2.
|
|
5
|
+
__version__ = "0.2.16"
|
|
6
6
|
|
|
7
7
|
from .cli import view_figure
|
|
8
8
|
from .core import FigpackView, FigpackExtension, ExtensionRegistry, ExtensionView
|
|
9
|
+
from .core.zarr import Group
|
|
9
10
|
|
|
10
11
|
__all__ = [
|
|
11
12
|
"view_figure",
|
|
@@ -13,4 +14,5 @@ __all__ = [
|
|
|
13
14
|
"FigpackExtension",
|
|
14
15
|
"ExtensionRegistry",
|
|
15
16
|
"ExtensionView",
|
|
17
|
+
"Group",
|
|
16
18
|
]
|
|
@@ -7,6 +7,7 @@ import zarr
|
|
|
7
7
|
from .figpack_view import FigpackView
|
|
8
8
|
from .figpack_extension import ExtensionRegistry
|
|
9
9
|
from .extension_view import ExtensionView
|
|
10
|
+
from .zarr import Group, _check_zarr_version
|
|
10
11
|
|
|
11
12
|
thisdir = pathlib.Path(__file__).parent.resolve()
|
|
12
13
|
|
|
@@ -45,24 +46,32 @@ def prepare_figure_bundle(
|
|
|
45
46
|
target_sub = target / subitem.name
|
|
46
47
|
target_sub.write_bytes(subitem.read_bytes())
|
|
47
48
|
|
|
48
|
-
#
|
|
49
|
-
|
|
50
|
-
pathlib.Path(tmpdir) / "data.zarr",
|
|
51
|
-
mode="w",
|
|
52
|
-
synchronizer=zarr.ThreadSynchronizer(),
|
|
53
|
-
)
|
|
54
|
-
view._write_to_zarr_group(zarr_group)
|
|
49
|
+
# If we are using zarr 3, then we set the default zarr format to 2 temporarily
|
|
50
|
+
# because we only support version 2 on the frontend right now.
|
|
55
51
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
zarr_group.attrs["description"] = description
|
|
52
|
+
if _check_zarr_version() == 3:
|
|
53
|
+
old_default_zarr_format = zarr.config.get("default_zarr_format")
|
|
54
|
+
zarr.config.set({"default_zarr_format": 2})
|
|
60
55
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
56
|
+
try:
|
|
57
|
+
# Write the view data to the Zarr group
|
|
58
|
+
zarr_group = zarr.open_group(pathlib.Path(tmpdir) / "data.zarr", mode="w")
|
|
59
|
+
zarr_group = Group(zarr_group)
|
|
60
|
+
view._write_to_zarr_group(zarr_group)
|
|
64
61
|
|
|
65
|
-
|
|
62
|
+
# Add title and description as attributes on the top-level zarr group
|
|
63
|
+
zarr_group.attrs["title"] = title
|
|
64
|
+
if description is not None:
|
|
65
|
+
zarr_group.attrs["description"] = description
|
|
66
|
+
|
|
67
|
+
# Discover and write extension JavaScript files
|
|
68
|
+
required_extensions = _discover_required_extensions(view)
|
|
69
|
+
_write_extension_files(required_extensions, tmpdir)
|
|
70
|
+
|
|
71
|
+
zarr.consolidate_metadata(zarr_group._zarr_group.store)
|
|
72
|
+
finally:
|
|
73
|
+
if _check_zarr_version() == 3:
|
|
74
|
+
zarr.config.set({"default_zarr_format": old_default_zarr_format})
|
|
66
75
|
|
|
67
76
|
|
|
68
77
|
def _discover_required_extensions(view: FigpackView) -> Set[str]:
|
|
@@ -109,7 +109,7 @@ def view_figure(figure_path: str, port: Union[int, None] = None) -> None:
|
|
|
109
109
|
|
|
110
110
|
try:
|
|
111
111
|
with tarfile.open(figure_path, "r:gz") as tar:
|
|
112
|
-
tar.extractall(temp_path)
|
|
112
|
+
tar.extractall(temp_path, filter="data")
|
|
113
113
|
|
|
114
114
|
# Count extracted files
|
|
115
115
|
extracted_files = list(temp_path.rglob("*"))
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
Base class for views that use figpack extensions
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
|
-
import zarr
|
|
6
5
|
from .figpack_view import FigpackView
|
|
7
6
|
from .figpack_extension import ExtensionRegistry
|
|
7
|
+
from ..core.zarr import Group
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
class ExtensionView(FigpackView):
|
|
@@ -32,7 +32,7 @@ class ExtensionView(FigpackView):
|
|
|
32
32
|
)
|
|
33
33
|
self.extension = extension
|
|
34
34
|
|
|
35
|
-
def _write_to_zarr_group(self, group:
|
|
35
|
+
def _write_to_zarr_group(self, group: Group) -> None:
|
|
36
36
|
"""
|
|
37
37
|
Write the extension view metadata to a Zarr group.
|
|
38
38
|
Subclasses should call super()._write_to_zarr_group(group) first,
|
|
@@ -7,7 +7,7 @@ import random
|
|
|
7
7
|
import string
|
|
8
8
|
from typing import Union
|
|
9
9
|
|
|
10
|
-
import
|
|
10
|
+
from .zarr import Group
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
class FigpackView:
|
|
@@ -155,7 +155,7 @@ class FigpackView:
|
|
|
155
155
|
|
|
156
156
|
_save_figure(self, output_path, title=title)
|
|
157
157
|
|
|
158
|
-
def _write_to_zarr_group(self, group:
|
|
158
|
+
def _write_to_zarr_group(self, group: Group) -> None:
|
|
159
159
|
"""
|
|
160
160
|
Write the view data to a Zarr group. Must be implemented by subclasses.
|
|
161
161
|
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from typing import Any, Dict
|
|
2
|
+
import zarr
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
_UNSPECIFIED = object()
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Group:
|
|
9
|
+
def __init__(self, zarr_group: zarr.Group):
|
|
10
|
+
self._zarr_group = zarr_group
|
|
11
|
+
|
|
12
|
+
def create_group(self, name: str) -> "Group":
|
|
13
|
+
return Group(self._zarr_group.create_group(name))
|
|
14
|
+
|
|
15
|
+
def create_dataset(
|
|
16
|
+
self,
|
|
17
|
+
name: str,
|
|
18
|
+
*,
|
|
19
|
+
data=_UNSPECIFIED,
|
|
20
|
+
dtype=_UNSPECIFIED,
|
|
21
|
+
chunks=_UNSPECIFIED,
|
|
22
|
+
compressor=_UNSPECIFIED,
|
|
23
|
+
) -> None:
|
|
24
|
+
kwargs = {}
|
|
25
|
+
if data is not _UNSPECIFIED:
|
|
26
|
+
kwargs["data"] = data
|
|
27
|
+
if dtype is not _UNSPECIFIED:
|
|
28
|
+
kwargs["dtype"] = dtype
|
|
29
|
+
if chunks is not _UNSPECIFIED:
|
|
30
|
+
kwargs["chunks"] = chunks
|
|
31
|
+
if compressor is not _UNSPECIFIED:
|
|
32
|
+
kwargs["compressor"] = compressor
|
|
33
|
+
if _check_zarr_version() == 2:
|
|
34
|
+
self._zarr_group.create_dataset(name, **kwargs)
|
|
35
|
+
elif _check_zarr_version() == 3:
|
|
36
|
+
self._zarr_group.create_array(name, **kwargs)
|
|
37
|
+
else:
|
|
38
|
+
raise RuntimeError("Unsupported Zarr version")
|
|
39
|
+
|
|
40
|
+
@property
|
|
41
|
+
def attrs(self) -> Dict[str, Any]:
|
|
42
|
+
return self._zarr_group.attrs
|
|
43
|
+
|
|
44
|
+
def __getitem__(self, key: str) -> Any:
|
|
45
|
+
return self._zarr_group[key]
|
|
46
|
+
|
|
47
|
+
# implement in operator
|
|
48
|
+
def __contains__(self, key: str) -> bool:
|
|
49
|
+
return key in self._zarr_group
|
|
50
|
+
|
|
51
|
+
def __iter__(self):
|
|
52
|
+
return iter(self._zarr_group)
|
|
53
|
+
|
|
54
|
+
def __reversed__(self):
|
|
55
|
+
return reversed(self._zarr_group)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _check_zarr_version():
|
|
59
|
+
version = zarr.__version__
|
|
60
|
+
major_version = int(version.split(".")[0])
|
|
61
|
+
return major_version
|