perspective-python 5.6.0__cp311-abi3-pyemscripten_2026_0_wasm32.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.
- perspective/__init__.py +403 -0
- perspective/extension/finos-perspective-nbextension.json +5 -0
- perspective/handlers/__init__.py +11 -0
- perspective/handlers/aiohttp.py +69 -0
- perspective/handlers/starlette.py +63 -0
- perspective/handlers/tornado.py +192 -0
- perspective/perspective.abi3.so +0 -0
- perspective/templates/exported_widget.html.template +39 -0
- perspective/tests/__init__.py +11 -0
- perspective/tests/async/test_async_client.py +83 -0
- perspective/tests/async/test_websocket_client.py +124 -0
- perspective/tests/column_paths.py +33 -0
- perspective/tests/conftest.py +276 -0
- perspective/tests/core/__init__.py +11 -0
- perspective/tests/core/test_async.py +351 -0
- perspective/tests/multi_threaded/__init__.py +11 -0
- perspective/tests/multi_threaded/test_derived_threaded.py +103 -0
- perspective/tests/multi_threaded/test_multi_threaded.py +293 -0
- perspective/tests/server/__init__.py +11 -0
- perspective/tests/server/test_server.py +1016 -0
- perspective/tests/server/test_session.py +110 -0
- perspective/tests/table/__init__.py +11 -0
- perspective/tests/table/arrow/date32.arrow +0 -0
- perspective/tests/table/arrow/date64.arrow +0 -0
- perspective/tests/table/arrow/dict.arrow +0 -0
- perspective/tests/table/arrow/dict_update.arrow +0 -0
- perspective/tests/table/arrow/int_float_str.arrow +0 -0
- perspective/tests/table/arrow/int_float_str_file.arrow +0 -0
- perspective/tests/table/arrow/int_float_str_update.arrow +0 -0
- perspective/tests/table/object_sequence.py +402 -0
- perspective/tests/table/test_column_paths.py +88 -0
- perspective/tests/table/test_delete.py +124 -0
- perspective/tests/table/test_derived.py +145 -0
- perspective/tests/table/test_exception.py +73 -0
- perspective/tests/table/test_join.py +115 -0
- perspective/tests/table/test_leaks.py +105 -0
- perspective/tests/table/test_on_remove.py +140 -0
- perspective/tests/table/test_ports.py +178 -0
- perspective/tests/table/test_remove.py +102 -0
- perspective/tests/table/test_table.py +641 -0
- perspective/tests/table/test_table_arrow.py +500 -0
- perspective/tests/table/test_table_arrow_nested.py +535 -0
- perspective/tests/table/test_table_datetime.py +2544 -0
- perspective/tests/table/test_table_infer.py +201 -0
- perspective/tests/table/test_table_limit.py +45 -0
- perspective/tests/table/test_table_numpy.py +1022 -0
- perspective/tests/table/test_table_page_to_disk.py +304 -0
- perspective/tests/table/test_table_pandas.py +1018 -0
- perspective/tests/table/test_table_polars.py +251 -0
- perspective/tests/table/test_table_view_table.py +130 -0
- perspective/tests/table/test_to_arrow.py +416 -0
- perspective/tests/table/test_to_arrow_lz4.py +32 -0
- perspective/tests/table/test_to_arrow_zstd.py +41 -0
- perspective/tests/table/test_to_format.py +1030 -0
- perspective/tests/table/test_to_polars.py +26 -0
- perspective/tests/table/test_update.py +561 -0
- perspective/tests/table/test_update_arrow.py +980 -0
- perspective/tests/table/test_update_pandas.py +211 -0
- perspective/tests/table/test_view.py +2503 -0
- perspective/tests/table/test_view_expression.py +2256 -0
- perspective/tests/test_dependencies.py +53 -0
- perspective/tests/viewer/__init__.py +11 -0
- perspective/tests/viewer/test_viewer.py +246 -0
- perspective/tests/virtual_servers/__init__.py +12 -0
- perspective/tests/virtual_servers/test_coerce_types.py +464 -0
- perspective/tests/virtual_servers/test_duckdb.py +1280 -0
- perspective/tests/virtual_servers/test_polars.py +1075 -0
- perspective/tests/virtual_servers/test_postgres.py +964 -0
- perspective/tests/widget/__init__.py +11 -0
- perspective/tests/widget/test_anywidget_smoke.py +109 -0
- perspective/tests/widget/test_widget.py +278 -0
- perspective/tests/widget/test_widget_html_export.py +113 -0
- perspective/tests/widget/test_widget_pandas.py +453 -0
- perspective/virtual_servers/__init__.py +206 -0
- perspective/virtual_servers/clickhouse.py +296 -0
- perspective/virtual_servers/duckdb.py +367 -0
- perspective/virtual_servers/polars.py +750 -0
- perspective/virtual_servers/postgres.py +448 -0
- perspective/widget/__init__.py +351 -0
- perspective/widget/static/perspective-anywidget.css +1 -0
- perspective/widget/static/perspective-anywidget.js +31 -0
- perspective/widget/viewer/__init__.py +15 -0
- perspective/widget/viewer/viewer.py +355 -0
- perspective/widget/viewer/viewer_traitlets.py +98 -0
- perspective_python-5.6.0.dist-info/METADATA +127 -0
- perspective_python-5.6.0.dist-info/RECORD +90 -0
- perspective_python-5.6.0.dist-info/WHEEL +4 -0
- perspective_python-5.6.0.dist-info/licenses/LICENSE.md +193 -0
- perspective_python-5.6.0.dist-info/licenses/LICENSE_THIRDPARTY_cargo.yml +16075 -0
- perspective_python-5.6.0.dist-info/sboms/perspective-python.cyclonedx.json +5334 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
# ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
# ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
# ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
# ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
# ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
# ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
# ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
# ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
# ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
# ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
import pytest
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# test that loading perspective and calling a common constructor code path does
|
|
17
|
+
# not load various "expensive" modules. "Expensive" is in quotes because this is
|
|
18
|
+
# utter nonsense.
|
|
19
|
+
@pytest.mark.skip(reason="https://github.com/pyca/bcrypt/issues/694")
|
|
20
|
+
def test_lazy_modules():
|
|
21
|
+
import sys
|
|
22
|
+
|
|
23
|
+
cache = {}
|
|
24
|
+
for key in list(sys.modules.keys()):
|
|
25
|
+
if (
|
|
26
|
+
key.startswith("perspective")
|
|
27
|
+
or key.startswith("test")
|
|
28
|
+
or key.startswith("pandas")
|
|
29
|
+
or key.startswith("pyarrow")
|
|
30
|
+
or key.startswith("tornado")
|
|
31
|
+
):
|
|
32
|
+
cache[key] = sys.modules[key]
|
|
33
|
+
del sys.modules[key]
|
|
34
|
+
|
|
35
|
+
import perspective
|
|
36
|
+
|
|
37
|
+
t1 = perspective.table("x\n1")
|
|
38
|
+
t1.delete()
|
|
39
|
+
|
|
40
|
+
assert "perspective" in sys.modules
|
|
41
|
+
assert "pandas" not in sys.modules
|
|
42
|
+
assert "pyarrow" not in sys.modules
|
|
43
|
+
assert "tornado" not in sys.modules
|
|
44
|
+
|
|
45
|
+
for k, v in cache.items():
|
|
46
|
+
sys.modules[k] = v
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def test_all():
|
|
50
|
+
import perspective
|
|
51
|
+
|
|
52
|
+
for key in perspective.__all__:
|
|
53
|
+
assert hasattr(perspective, key)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
# ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
# ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
# ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
# ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
# ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
# ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
# ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
# ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
# ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
# ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
# ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
# ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
# ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
# ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
# ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
# ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
# ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
# ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
# ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
# ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
import numpy as np
|
|
14
|
+
import pandas as pd
|
|
15
|
+
import pytest
|
|
16
|
+
from perspective.widget.viewer import PerspectiveViewer
|
|
17
|
+
import perspective as psp
|
|
18
|
+
|
|
19
|
+
client = psp.Server().new_local_client()
|
|
20
|
+
Table = client.table
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TestViewer:
|
|
24
|
+
def test_viewer_get_table(self):
|
|
25
|
+
table = Table({"a": [1, 2, 3]})
|
|
26
|
+
viewer = PerspectiveViewer()
|
|
27
|
+
viewer.load(table)
|
|
28
|
+
assert viewer.table == table
|
|
29
|
+
|
|
30
|
+
# loading
|
|
31
|
+
|
|
32
|
+
def test_viewer_load_table(self):
|
|
33
|
+
table = Table({"a": [1, 2, 3]})
|
|
34
|
+
viewer = PerspectiveViewer()
|
|
35
|
+
viewer.load(table)
|
|
36
|
+
assert viewer.columns == ["a"]
|
|
37
|
+
|
|
38
|
+
def test_viewer_load_named_table(self):
|
|
39
|
+
table = Table({"a": [1, 2, 3]}, name="data_1")
|
|
40
|
+
viewer = PerspectiveViewer()
|
|
41
|
+
viewer.load(table)
|
|
42
|
+
assert viewer.columns == ["a"]
|
|
43
|
+
assert viewer.table_name == "data_1"
|
|
44
|
+
assert viewer.table == table
|
|
45
|
+
|
|
46
|
+
def test_viewer_load_data(self):
|
|
47
|
+
viewer = PerspectiveViewer()
|
|
48
|
+
viewer.load({"a": [1, 2, 3]})
|
|
49
|
+
assert viewer.columns == ["a"]
|
|
50
|
+
|
|
51
|
+
def test_viewer_load_named_data(self):
|
|
52
|
+
viewer = PerspectiveViewer()
|
|
53
|
+
viewer.load({"a": [1, 2, 3]}, name="data_1")
|
|
54
|
+
assert viewer.columns == ["a"]
|
|
55
|
+
assert viewer.table_name == "data_1"
|
|
56
|
+
|
|
57
|
+
def test_viewer_load_schema(self):
|
|
58
|
+
viewer = PerspectiveViewer()
|
|
59
|
+
viewer.load({"a": "string", "b": "integer", "c": "boolean", "d": "string"})
|
|
60
|
+
for col in viewer.columns:
|
|
61
|
+
assert col in ["a", "b", "c", "d"]
|
|
62
|
+
|
|
63
|
+
def test_viewer_load_table_with_options(self):
|
|
64
|
+
table = Table({"a": [1, 2, 3]})
|
|
65
|
+
viewer = PerspectiveViewer()
|
|
66
|
+
# options should be disregarded when loading Table
|
|
67
|
+
viewer.load(table, limit=1)
|
|
68
|
+
assert viewer.columns == ["a"]
|
|
69
|
+
assert viewer.table.size() == 3
|
|
70
|
+
|
|
71
|
+
def test_viewer_load_data_with_options(self):
|
|
72
|
+
viewer = PerspectiveViewer()
|
|
73
|
+
# options should be forwarded to the Table constructor
|
|
74
|
+
viewer.load({"a": [1, 2, 3]}, limit=1)
|
|
75
|
+
assert viewer.columns == ["a"]
|
|
76
|
+
assert viewer.table.size() == 1
|
|
77
|
+
|
|
78
|
+
def test_viewer_load_clears_state(self):
|
|
79
|
+
table = Table({"a": [1, 2, 3]})
|
|
80
|
+
viewer = PerspectiveViewer(theme="Pro Dark", group_by=["a"])
|
|
81
|
+
viewer.load(table)
|
|
82
|
+
assert viewer.group_by == ["a"]
|
|
83
|
+
viewer.load({"b": [1, 2, 3]})
|
|
84
|
+
assert viewer.group_by == []
|
|
85
|
+
assert viewer.theme == "Pro Dark" # should not break UI
|
|
86
|
+
|
|
87
|
+
@pytest.mark.skip
|
|
88
|
+
def test_viewer_load_np(self):
|
|
89
|
+
table = Table({"a": np.arange(1, 100)})
|
|
90
|
+
viewer = PerspectiveViewer()
|
|
91
|
+
viewer.load(table)
|
|
92
|
+
assert viewer.columns == ["a"]
|
|
93
|
+
|
|
94
|
+
@pytest.mark.skip
|
|
95
|
+
def test_viewer_load_np_data(self):
|
|
96
|
+
viewer = PerspectiveViewer()
|
|
97
|
+
viewer.load({"a": np.arange(1, 100)})
|
|
98
|
+
assert viewer.columns == ["a"]
|
|
99
|
+
assert viewer.table.size() == 99
|
|
100
|
+
|
|
101
|
+
@pytest.mark.skip
|
|
102
|
+
def test_viewer_load_df(self):
|
|
103
|
+
table = Table(pd.DataFrame({"a": np.arange(1, 100)}))
|
|
104
|
+
viewer = PerspectiveViewer()
|
|
105
|
+
viewer.load(table)
|
|
106
|
+
for col in viewer.columns:
|
|
107
|
+
assert col in ["index", "a"]
|
|
108
|
+
assert viewer.table.size() == 99
|
|
109
|
+
|
|
110
|
+
def test_viewer_load_df_data(self):
|
|
111
|
+
viewer = PerspectiveViewer()
|
|
112
|
+
viewer.load(pd.DataFrame({"a": np.arange(1, 100)}))
|
|
113
|
+
for col in viewer.columns:
|
|
114
|
+
assert col in ["index", "a"]
|
|
115
|
+
|
|
116
|
+
# update
|
|
117
|
+
|
|
118
|
+
def test_viewer_update_dict(self):
|
|
119
|
+
table = Table({"a": [1, 2, 3]})
|
|
120
|
+
viewer = PerspectiveViewer()
|
|
121
|
+
viewer.load(table)
|
|
122
|
+
viewer.update({"a": [4, 5, 6]})
|
|
123
|
+
assert table.size() == 6
|
|
124
|
+
assert viewer.table.size() == 6
|
|
125
|
+
assert viewer.table.view().to_columns() == {"a": [1, 2, 3, 4, 5, 6]}
|
|
126
|
+
|
|
127
|
+
def test_viewer_update_list(self):
|
|
128
|
+
table = Table({"a": [1, 2, 3]})
|
|
129
|
+
viewer = PerspectiveViewer()
|
|
130
|
+
viewer.load(table)
|
|
131
|
+
viewer.update([{"a": 4}, {"a": 5}, {"a": 6}])
|
|
132
|
+
assert table.size() == 6
|
|
133
|
+
assert viewer.table.size() == 6
|
|
134
|
+
assert viewer.table.view().to_columns() == {"a": [1, 2, 3, 4, 5, 6]}
|
|
135
|
+
|
|
136
|
+
def test_viewer_update_df(self):
|
|
137
|
+
table = Table({"a": [1, 2, 3]})
|
|
138
|
+
viewer = PerspectiveViewer()
|
|
139
|
+
viewer.load(table)
|
|
140
|
+
viewer.update(pd.DataFrame({"a": [4, 5, 6]}))
|
|
141
|
+
assert table.size() == 6
|
|
142
|
+
assert viewer.table.size() == 6
|
|
143
|
+
assert viewer.table.view().to_columns() == {"a": [1, 2, 3, 4, 5, 6]}
|
|
144
|
+
|
|
145
|
+
def test_viewer_update_dict_partial(self):
|
|
146
|
+
table = Table({"a": [1, 2, 3], "b": [5, 6, 7]}, index="a")
|
|
147
|
+
viewer = PerspectiveViewer()
|
|
148
|
+
viewer.load(table)
|
|
149
|
+
viewer.update({"a": [1, 2, 3], "b": [8, 9, 10]})
|
|
150
|
+
assert table.size() == 3
|
|
151
|
+
assert viewer.table.size() == 3
|
|
152
|
+
assert viewer.table.view().to_columns() == {"a": [1, 2, 3], "b": [8, 9, 10]}
|
|
153
|
+
|
|
154
|
+
# clear
|
|
155
|
+
|
|
156
|
+
def test_viewer_clear(self):
|
|
157
|
+
table = Table({"a": [1, 2, 3]})
|
|
158
|
+
viewer = PerspectiveViewer()
|
|
159
|
+
viewer.load(table)
|
|
160
|
+
viewer.clear()
|
|
161
|
+
assert viewer.table.size() == 0
|
|
162
|
+
assert viewer.table.schema() == {"a": "integer"}
|
|
163
|
+
|
|
164
|
+
# replace
|
|
165
|
+
|
|
166
|
+
def test_viewer_replace(self):
|
|
167
|
+
table = Table({"a": [1, 2, 3]})
|
|
168
|
+
viewer = PerspectiveViewer()
|
|
169
|
+
viewer.load(table)
|
|
170
|
+
viewer.replace({"a": [4, 5, 6]})
|
|
171
|
+
assert viewer.table.size() == 3
|
|
172
|
+
assert viewer.table.schema() == {"a": "integer"}
|
|
173
|
+
assert viewer.table.view().to_columns() == {"a": [4, 5, 6]}
|
|
174
|
+
|
|
175
|
+
# reset
|
|
176
|
+
|
|
177
|
+
def test_viewer_reset(self):
|
|
178
|
+
table = Table({"a": [1, 2, 3]})
|
|
179
|
+
viewer = PerspectiveViewer(plugin="X Bar", filter=[["a", "==", 2]])
|
|
180
|
+
viewer.load(table)
|
|
181
|
+
assert viewer.filter == [["a", "==", 2]]
|
|
182
|
+
viewer.reset()
|
|
183
|
+
assert viewer.plugin == "Datagrid"
|
|
184
|
+
assert viewer.filter == []
|
|
185
|
+
|
|
186
|
+
# delete
|
|
187
|
+
|
|
188
|
+
def test_viewer_delete(self):
|
|
189
|
+
table = Table({"a": [1, 2, 3]})
|
|
190
|
+
viewer = PerspectiveViewer(plugin="X Bar", filter=[["a", "==", 2]])
|
|
191
|
+
viewer.load(table)
|
|
192
|
+
assert viewer.filter == [["a", "==", 2]]
|
|
193
|
+
viewer.delete()
|
|
194
|
+
assert viewer.table_name is None
|
|
195
|
+
assert viewer.table is None
|
|
196
|
+
|
|
197
|
+
def test_viewer_delete_without_table(self):
|
|
198
|
+
table = Table({"a": [1, 2, 3]})
|
|
199
|
+
viewer = PerspectiveViewer(plugin="X Bar", filter=[["a", "==", 2]])
|
|
200
|
+
viewer.load(table)
|
|
201
|
+
assert viewer.filter == [["a", "==", 2]]
|
|
202
|
+
viewer.delete(delete_table=False)
|
|
203
|
+
assert viewer.table_name is not None
|
|
204
|
+
assert viewer.table is not None
|
|
205
|
+
assert viewer.filter == []
|
|
206
|
+
|
|
207
|
+
def test_save_restore(self):
|
|
208
|
+
table = Table({"a": [1, 2, 3]})
|
|
209
|
+
viewer = PerspectiveViewer(
|
|
210
|
+
plugin="X Bar", filter=[["a", "==", 2]], expressions={'"a" * 2': '"a" * 2'}
|
|
211
|
+
)
|
|
212
|
+
viewer.load(table)
|
|
213
|
+
|
|
214
|
+
# Save config
|
|
215
|
+
config = viewer.save()
|
|
216
|
+
assert viewer.filter == [["a", "==", 2]]
|
|
217
|
+
assert config["filter"] == [["a", "==", 2]]
|
|
218
|
+
assert viewer.plugin == "X Bar"
|
|
219
|
+
assert config["plugin"] == "X Bar"
|
|
220
|
+
assert config["expressions"] == {'"a" * 2': '"a" * 2'}
|
|
221
|
+
|
|
222
|
+
# reset configuration
|
|
223
|
+
viewer.reset()
|
|
224
|
+
assert viewer.plugin == "Datagrid"
|
|
225
|
+
assert viewer.filter == []
|
|
226
|
+
assert viewer.expressions == {}
|
|
227
|
+
|
|
228
|
+
# restore configuration
|
|
229
|
+
viewer.restore(**config)
|
|
230
|
+
assert viewer.filter == [["a", "==", 2]]
|
|
231
|
+
assert viewer.plugin == "X Bar"
|
|
232
|
+
assert viewer.expressions == {'"a" * 2': '"a" * 2'}
|
|
233
|
+
|
|
234
|
+
def test_save_restore_plugin_config(self):
|
|
235
|
+
viewer = PerspectiveViewer(
|
|
236
|
+
plugin="Datagrid", plugin_config={"columns": {"a": {"fixed": 4}}}
|
|
237
|
+
)
|
|
238
|
+
config = viewer.save()
|
|
239
|
+
|
|
240
|
+
assert config["plugin_config"] == {"columns": {"a": {"fixed": 4}}}
|
|
241
|
+
|
|
242
|
+
viewer.reset()
|
|
243
|
+
assert viewer.plugin_config == {}
|
|
244
|
+
|
|
245
|
+
viewer.restore(**config)
|
|
246
|
+
assert viewer.plugin_config == config["plugin_config"]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
# ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
# ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
# ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
# ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
# ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
# ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
# ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
# ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
# ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
# ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|