solara-ui 1.34.1__py2.py3-none-any.whl → 1.35.1__py2.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.
- solara/__init__.py +1 -1
- solara/__main__.py +1 -1
- solara/autorouting.py +2 -4
- solara/components/applayout.py +1 -1
- solara/components/file_browser.py +13 -14
- solara/components/markdown.py +2 -5
- solara/components/style.py +2 -2
- solara/server/app.py +1 -1
- solara/server/cdn_helper.py +15 -1
- solara/server/esm.py +1 -1
- solara/server/flask.py +5 -2
- solara/server/starlette.py +6 -1
- solara/server/static/solara_bootstrap.py +1 -1
- solara/server/threaded.py +10 -1
- solara/server/utils.py +7 -0
- solara/test/pytest_plugin.py +2 -1
- solara/website/pages/changelog/changelog.md +6 -0
- solara/website/pages/documentation/advanced/content/10-howto/30-testing.md +4 -0
- {solara_ui-1.34.1.dist-info → solara_ui-1.35.1.dist-info}/METADATA +1 -1
- {solara_ui-1.34.1.dist-info → solara_ui-1.35.1.dist-info}/RECORD +24 -24
- {solara_ui-1.34.1.data → solara_ui-1.35.1.data}/data/etc/jupyter/jupyter_notebook_config.d/solara.json +0 -0
- {solara_ui-1.34.1.data → solara_ui-1.35.1.data}/data/etc/jupyter/jupyter_server_config.d/solara.json +0 -0
- {solara_ui-1.34.1.dist-info → solara_ui-1.35.1.dist-info}/WHEEL +0 -0
- {solara_ui-1.34.1.dist-info → solara_ui-1.35.1.dist-info}/licenses/LICENSE +0 -0
solara/__init__.py
CHANGED
solara/__main__.py
CHANGED
|
@@ -653,7 +653,7 @@ def markdown(target: typing.Optional[Path] = None):
|
|
|
653
653
|
|
|
654
654
|
|
|
655
655
|
def write_script(name: str, target: typing.Optional[Path]):
|
|
656
|
-
code = (HERE / "template" / f"{name}.py").read_text()
|
|
656
|
+
code = (HERE / "template" / f"{name}.py").read_text(encoding="utf-8")
|
|
657
657
|
if target is None:
|
|
658
658
|
target = Path("sol.py")
|
|
659
659
|
else:
|
solara/autorouting.py
CHANGED
|
@@ -215,11 +215,9 @@ def RenderPage(main_name: str = "Page"):
|
|
|
215
215
|
solara.Button(
|
|
216
216
|
icon_name="mdi-pencil", icon=True, href=url, target="_blank", style={"position": "absolute", "top": "0px", "right": "0px"}
|
|
217
217
|
)
|
|
218
|
-
|
|
219
|
-
component(path.read_text(), unsafe_solara_execute=True)
|
|
218
|
+
component(path.read_text(encoding="utf-8"), unsafe_solara_execute=True)
|
|
220
219
|
else:
|
|
221
|
-
|
|
222
|
-
content = component(path.read_text(), unsafe_solara_execute=True)
|
|
220
|
+
content = component(path.read_text(encoding="utf-8"), unsafe_solara_execute=True)
|
|
223
221
|
|
|
224
222
|
main = solara.Div(
|
|
225
223
|
classes=["solara-autorouter-content"],
|
solara/components/applayout.py
CHANGED
|
@@ -342,7 +342,7 @@ def AppLayout(
|
|
|
342
342
|
):
|
|
343
343
|
if not show_app_bar:
|
|
344
344
|
AppIcon(sidebar_open, on_click=lambda: set_sidebar_open(not sidebar_open))
|
|
345
|
-
v.Html(tag="div", children=children_sidebar, style_="padding: 12px;").meta(ref="sidebar-content")
|
|
345
|
+
v.Html(tag="div", children=children_sidebar, style_="padding: 12px; height: 100%").meta(ref="sidebar-content")
|
|
346
346
|
if show_app_bar:
|
|
347
347
|
# if hide_on_scroll is True, and we have a little bit of scrolling, vuetify seems to act strangely
|
|
348
348
|
# when scrolling (on @mariobuikhuizen/vuetify v2.2.26-rc.0
|
|
@@ -51,12 +51,12 @@ class FileListWidget(vy.VuetifyTemplate):
|
|
|
51
51
|
@solara.component
|
|
52
52
|
def FileBrowser(
|
|
53
53
|
directory: Union[None, str, Path, solara.Reactive[Path]] = None,
|
|
54
|
-
on_directory_change: Callable[[Path], None] = None,
|
|
55
|
-
on_path_select: Callable[[Optional[Path]], None] = None,
|
|
56
|
-
on_file_open: Callable[[Path], None] = None,
|
|
54
|
+
on_directory_change: Optional[Callable[[Path], None]] = None,
|
|
55
|
+
on_path_select: Optional[Callable[[Optional[Path]], None]] = None,
|
|
56
|
+
on_file_open: Optional[Callable[[Path], None]] = None,
|
|
57
57
|
filter: Callable[[Path], bool] = lambda x: True,
|
|
58
58
|
directory_first: bool = False,
|
|
59
|
-
on_file_name: Callable[[str], None] = None,
|
|
59
|
+
on_file_name: Optional[Callable[[str], None]] = None,
|
|
60
60
|
start_directory=None,
|
|
61
61
|
can_select=False,
|
|
62
62
|
):
|
|
@@ -98,11 +98,11 @@ def FileBrowser(
|
|
|
98
98
|
scroll_pos, set_scroll_pos = solara.use_state(0)
|
|
99
99
|
selected, set_selected = solara.use_state(None)
|
|
100
100
|
|
|
101
|
-
def change_dir(new_dir:
|
|
101
|
+
def change_dir(new_dir: Path):
|
|
102
102
|
if os.access(new_dir, os.R_OK):
|
|
103
|
-
current_dir.value =
|
|
103
|
+
current_dir.value = new_dir
|
|
104
104
|
if on_directory_change:
|
|
105
|
-
on_directory_change(
|
|
105
|
+
on_directory_change(new_dir)
|
|
106
106
|
set_warning(None)
|
|
107
107
|
return True
|
|
108
108
|
else:
|
|
@@ -114,8 +114,7 @@ def FileBrowser(
|
|
|
114
114
|
on_path_select(None)
|
|
115
115
|
return
|
|
116
116
|
if item["name"] == "..":
|
|
117
|
-
|
|
118
|
-
new_dir = current_dir_str[: current_dir_str.rfind(os.path.sep)]
|
|
117
|
+
new_dir = current_dir.value.parent
|
|
119
118
|
action_change_directory = (can_select and double_click) or (not can_select and not double_click)
|
|
120
119
|
if action_change_directory and change_dir(new_dir):
|
|
121
120
|
if scroll_pos_stack:
|
|
@@ -128,17 +127,17 @@ def FileBrowser(
|
|
|
128
127
|
on_path_select(None)
|
|
129
128
|
if can_select and not double_click:
|
|
130
129
|
if on_path_select:
|
|
131
|
-
on_path_select(
|
|
130
|
+
on_path_select(new_dir)
|
|
132
131
|
return
|
|
133
132
|
|
|
134
|
-
path =
|
|
133
|
+
path = current_dir.value / item["name"]
|
|
135
134
|
is_file = item["is_file"]
|
|
136
135
|
if (can_select and double_click) or (not can_select and not double_click):
|
|
137
136
|
if is_file:
|
|
138
137
|
if on_file_open:
|
|
139
|
-
on_file_open(
|
|
138
|
+
on_file_open(path)
|
|
140
139
|
if on_file_name is not None:
|
|
141
|
-
on_file_name(path)
|
|
140
|
+
on_file_name(str(path))
|
|
142
141
|
else:
|
|
143
142
|
if change_dir(path):
|
|
144
143
|
set_scroll_pos_stack(scroll_pos_stack + [scroll_pos])
|
|
@@ -149,7 +148,7 @@ def FileBrowser(
|
|
|
149
148
|
on_path_select(None)
|
|
150
149
|
elif can_select and not double_click:
|
|
151
150
|
if on_path_select:
|
|
152
|
-
on_path_select(
|
|
151
|
+
on_path_select(path)
|
|
153
152
|
else: # not can_select and double_click is ignored
|
|
154
153
|
raise RuntimeError("Combination should not happen") # pragma: no cover
|
|
155
154
|
|
solara/components/markdown.py
CHANGED
|
@@ -185,10 +185,7 @@ module.exports = {
|
|
|
185
185
|
document.head.appendChild(script);
|
|
186
186
|
});
|
|
187
187
|
},
|
|
188
|
-
|
|
189
|
-
if (window.solara && window.solara.rootPath !== undefined) {
|
|
190
|
-
return solara.rootPath + "/";
|
|
191
|
-
}
|
|
188
|
+
getJupyterBaseUrl() {
|
|
192
189
|
// if base url is set, we use ./ for relative paths compared to the base url
|
|
193
190
|
if (document.getElementsByTagName("base").length) {
|
|
194
191
|
return "./";
|
|
@@ -205,7 +202,7 @@ module.exports = {
|
|
|
205
202
|
return base
|
|
206
203
|
},
|
|
207
204
|
getCdn() {
|
|
208
|
-
return this.cdn || (
|
|
205
|
+
return this.cdn || (window.solara ? window.solara.cdn : `${this.getJupyterBaseUrl()}_solara/cdn`);
|
|
209
206
|
}
|
|
210
207
|
},
|
|
211
208
|
updated() {
|
solara/components/style.py
CHANGED
|
@@ -52,7 +52,7 @@ def Style(value: Union[str, Path] = ""):
|
|
|
52
52
|
try:
|
|
53
53
|
async for _ in watchfiles.awatch(value):
|
|
54
54
|
print(value, "changed, reloading css") # noqa
|
|
55
|
-
set_css_content_reloaded(cast(Path, value).read_text())
|
|
55
|
+
set_css_content_reloaded(cast(Path, value).read_text(encoding="utf-8"))
|
|
56
56
|
except RuntimeError:
|
|
57
57
|
pass # swallow the RuntimeError: Already borrowed errors from watchfiles
|
|
58
58
|
except Exception:
|
|
@@ -70,7 +70,7 @@ def Style(value: Union[str, Path] = ""):
|
|
|
70
70
|
if css_content_reloaded is not None:
|
|
71
71
|
css_content = css_content_reloaded
|
|
72
72
|
else:
|
|
73
|
-
css_content = value.read_text() if isinstance(value, Path) else value
|
|
73
|
+
css_content = value.read_text(encoding="utf-8") if isinstance(value, Path) else value
|
|
74
74
|
# del value
|
|
75
75
|
hash = hashlib.sha256(css_content.encode("utf-8")).hexdigest()
|
|
76
76
|
# the key is unique for this component + value
|
solara/server/app.py
CHANGED
|
@@ -229,7 +229,7 @@ class AppScript:
|
|
|
229
229
|
path = Path(name)
|
|
230
230
|
if path.suffix == ".vue":
|
|
231
231
|
logger.info("Vue file changed: %s", name)
|
|
232
|
-
template_content = path.read_text()
|
|
232
|
+
template_content = path.read_text(encoding="utf-8")
|
|
233
233
|
for context in list(kernel_context.contexts.values()):
|
|
234
234
|
with context:
|
|
235
235
|
for filepath, widget in context.templates.items():
|
solara/server/cdn_helper.py
CHANGED
|
@@ -3,6 +3,7 @@ import pathlib
|
|
|
3
3
|
import shutil
|
|
4
4
|
|
|
5
5
|
import requests
|
|
6
|
+
from solara.server.utils import path_is_child_of
|
|
6
7
|
|
|
7
8
|
import solara.settings
|
|
8
9
|
|
|
@@ -13,6 +14,9 @@ cdn_url_path = "_solara/cdn"
|
|
|
13
14
|
|
|
14
15
|
def put_in_cache(base_cache_dir: pathlib.Path, path, data: bytes):
|
|
15
16
|
cache_path = base_cache_dir / path
|
|
17
|
+
if not path_is_child_of(cache_path, base_cache_dir):
|
|
18
|
+
raise PermissionError("Trying to write outside of cache directory")
|
|
19
|
+
|
|
16
20
|
pathlib.Path(cache_path.parent).mkdir(parents=True, exist_ok=True)
|
|
17
21
|
try:
|
|
18
22
|
logger.info("Writing cache file: %s", cache_path)
|
|
@@ -22,7 +26,14 @@ def put_in_cache(base_cache_dir: pathlib.Path, path, data: bytes):
|
|
|
22
26
|
|
|
23
27
|
|
|
24
28
|
def get_from_cache(base_cache_dir: pathlib.Path, path):
|
|
25
|
-
cache_path = base_cache_dir / path
|
|
29
|
+
cache_path = pathlib.Path(base_cache_dir / path)
|
|
30
|
+
# Make sure cache_path is a subdirectory of base_cache_dir
|
|
31
|
+
# so we don't accidentally read files from the parent directory
|
|
32
|
+
# which is a security risk.
|
|
33
|
+
if not path_is_child_of(cache_path, base_cache_dir):
|
|
34
|
+
logger.warning("Trying to read from outside of cache directory: %s is not a subdir of %s", cache_path, base_cache_dir)
|
|
35
|
+
raise PermissionError("Trying to read from outside of cache directory")
|
|
36
|
+
|
|
26
37
|
try:
|
|
27
38
|
logger.info("Opening cache file: %s", cache_path)
|
|
28
39
|
return cache_path.read_bytes()
|
|
@@ -58,6 +69,9 @@ def get_path(base_cache_dir: pathlib.Path, path) -> pathlib.Path:
|
|
|
58
69
|
store_path = path if len(parts) != 1 else pathlib.Path(path) / "__main.js"
|
|
59
70
|
cache_path = base_cache_dir / store_path
|
|
60
71
|
|
|
72
|
+
if not path_is_child_of(cache_path, base_cache_dir):
|
|
73
|
+
raise PermissionError("Trying to read from outside of cache directory")
|
|
74
|
+
|
|
61
75
|
if cache_path.exists():
|
|
62
76
|
# before d7eba856f100d5c3c64f4eec22c62390f084cb40 on windows, we could
|
|
63
77
|
# accidentally write to the cache directory, so we need to check if we still
|
solara/server/esm.py
CHANGED
|
@@ -40,7 +40,7 @@ def get_module_names():
|
|
|
40
40
|
def create_modules():
|
|
41
41
|
kernel_id = kernel_context.get_current_context().id
|
|
42
42
|
_modules_added = _modules_added_per_kernel[kernel_id]
|
|
43
|
-
logger.info("
|
|
43
|
+
logger.info("create modules %s", _modules)
|
|
44
44
|
widgets = {}
|
|
45
45
|
with lock:
|
|
46
46
|
for name, (module, dependencies) in _modules.items():
|
solara/server/flask.py
CHANGED
|
@@ -199,7 +199,7 @@ def nbext(dir, filename):
|
|
|
199
199
|
for directory in server.nbextensions_directories:
|
|
200
200
|
file = directory / dir / filename
|
|
201
201
|
if file.exists():
|
|
202
|
-
return send_from_directory(directory
|
|
202
|
+
return send_from_directory(directory, dir + os.path.sep + filename)
|
|
203
203
|
return flask.Response("not found", status=404)
|
|
204
204
|
|
|
205
205
|
|
|
@@ -217,7 +217,10 @@ if solara.settings.assets.proxy:
|
|
|
217
217
|
if not allowed():
|
|
218
218
|
abort(401)
|
|
219
219
|
cache_directory = settings.assets.proxy_cache_dir
|
|
220
|
-
|
|
220
|
+
try:
|
|
221
|
+
content = cdn_helper.get_data(Path(cache_directory), path)
|
|
222
|
+
except PermissionError:
|
|
223
|
+
return flask.Response("not found", status=404)
|
|
221
224
|
mime = mimetypes.guess_type(path)
|
|
222
225
|
return flask.Response(content, mimetype=mime[0])
|
|
223
226
|
|
solara/server/starlette.py
CHANGED
|
@@ -3,6 +3,7 @@ import json
|
|
|
3
3
|
import logging
|
|
4
4
|
import math
|
|
5
5
|
import os
|
|
6
|
+
from pathlib import Path
|
|
6
7
|
import sys
|
|
7
8
|
import threading
|
|
8
9
|
import typing
|
|
@@ -14,6 +15,8 @@ import starlette.websockets
|
|
|
14
15
|
import uvicorn.server
|
|
15
16
|
import websockets.legacy.http
|
|
16
17
|
|
|
18
|
+
from solara.server.utils import path_is_child_of
|
|
19
|
+
|
|
17
20
|
try:
|
|
18
21
|
import solara_enterprise
|
|
19
22
|
|
|
@@ -405,6 +408,9 @@ class StaticNbFiles(StaticFilesOptionalAuth):
|
|
|
405
408
|
original_path = os.path.join(directory, path)
|
|
406
409
|
full_path = os.path.realpath(original_path)
|
|
407
410
|
directory = os.path.realpath(directory)
|
|
411
|
+
# return early if someone tries to access a file outside of the directory
|
|
412
|
+
if not path_is_child_of(Path(original_path), Path(directory)):
|
|
413
|
+
return "", None
|
|
408
414
|
try:
|
|
409
415
|
return full_path, os.stat(full_path)
|
|
410
416
|
except (FileNotFoundError, NotADirectoryError):
|
|
@@ -449,7 +455,6 @@ class StaticCdn(StaticFilesOptionalAuth):
|
|
|
449
455
|
full_path = str(get_path(settings.assets.proxy_cache_dir, path))
|
|
450
456
|
except Exception:
|
|
451
457
|
return "", None
|
|
452
|
-
|
|
453
458
|
return full_path, os.stat(full_path)
|
|
454
459
|
|
|
455
460
|
|
|
@@ -119,7 +119,7 @@ async def main():
|
|
|
119
119
|
]
|
|
120
120
|
for dep in requirements:
|
|
121
121
|
await micropip.install(dep, keep_going=True)
|
|
122
|
-
await micropip.install("/wheels/solara-1.
|
|
122
|
+
await micropip.install("/wheels/solara-1.35.1-py2.py3-none-any.whl", keep_going=True)
|
|
123
123
|
import solara
|
|
124
124
|
|
|
125
125
|
el = solara.Warning("lala")
|
solara/server/threaded.py
CHANGED
|
@@ -2,15 +2,24 @@ import logging
|
|
|
2
2
|
import threading
|
|
3
3
|
import time
|
|
4
4
|
from typing import Optional
|
|
5
|
+
import socket
|
|
5
6
|
|
|
6
7
|
logger = logging.getLogger("solara.server.threaded")
|
|
7
8
|
|
|
8
9
|
|
|
10
|
+
def get_free_port():
|
|
11
|
+
sock = socket.socket()
|
|
12
|
+
sock.bind(("", 0))
|
|
13
|
+
port = sock.getsockname()[1]
|
|
14
|
+
sock.close()
|
|
15
|
+
return port
|
|
16
|
+
|
|
17
|
+
|
|
9
18
|
class ServerBase(threading.Thread):
|
|
10
19
|
name = "not set"
|
|
11
20
|
|
|
12
21
|
def __init__(self, port: int, host: str = "localhost", **kwargs):
|
|
13
|
-
self.port = port
|
|
22
|
+
self.port = get_free_port() if port == 0 else port
|
|
14
23
|
self.host = host
|
|
15
24
|
self.base_url = f"http://{self.host}:{self.port}"
|
|
16
25
|
|
solara/server/utils.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import contextlib
|
|
2
2
|
import logging
|
|
3
3
|
import os
|
|
4
|
+
from pathlib import Path
|
|
4
5
|
import pdb
|
|
5
6
|
import traceback
|
|
6
7
|
|
|
@@ -16,6 +17,12 @@ def start_error(title, msg, exception: Exception = None):
|
|
|
16
17
|
os._exit(-1)
|
|
17
18
|
|
|
18
19
|
|
|
20
|
+
def path_is_child_of(path: Path, parent: Path) -> bool:
|
|
21
|
+
# We use os.path.normpath() because we do not want to follow symlinks
|
|
22
|
+
# in editable installs, since some packages are symlinked
|
|
23
|
+
return os.path.normpath(path).startswith(os.path.normpath(parent))
|
|
24
|
+
|
|
25
|
+
|
|
19
26
|
@contextlib.contextmanager
|
|
20
27
|
def pdb_guard():
|
|
21
28
|
from . import settings
|
solara/test/pytest_plugin.py
CHANGED
|
@@ -37,6 +37,7 @@ logger = logging.getLogger("solara.pytest_plugin")
|
|
|
37
37
|
TEST_PORT_START = int(os.environ.get("PORT", "18765")) + 100 # do not interfere with the solara integration tests
|
|
38
38
|
TEST_HOST = solara.server.settings.main.host
|
|
39
39
|
TIMEOUT = float(os.environ.get("SOLARA_PW_TIMEOUT", "18"))
|
|
40
|
+
PYTEST_IPYWIDGETS_SOLARA_APP_WAIT_TIMEOUT = int(os.environ.get("PYTEST_IPYWIDGETS_SOLARA_APP_WAIT_TIMEOUT", "10"))
|
|
40
41
|
|
|
41
42
|
|
|
42
43
|
@pytest.fixture(scope="session")
|
|
@@ -192,7 +193,7 @@ def _solara_test(solara_server, solara_app, page_session: "playwright.sync_api.P
|
|
|
192
193
|
run_events[id] = run_event = threading.Event()
|
|
193
194
|
page_session.goto(solara_server.base_url + f"?id={id}")
|
|
194
195
|
try:
|
|
195
|
-
assert run_event.wait(
|
|
196
|
+
assert run_event.wait(PYTEST_IPYWIDGETS_SOLARA_APP_WAIT_TIMEOUT)
|
|
196
197
|
context = used_contexts[id]
|
|
197
198
|
with context:
|
|
198
199
|
test_output_warmup = widgets.Output()
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Solara Changelog
|
|
2
2
|
|
|
3
|
+
## Version 1.34.1
|
|
4
|
+
|
|
5
|
+
* Bug Fix: Using `SOLARA_ASSETS_PROXY=False` (default on [py.cafe](https://py.cafe)) would break grid layout. [#705](https://github.com/widgetti/solara/pull/705)
|
|
6
|
+
* Bug Fix: Hot reload work in more situations on Linux. [#702](https://github.com/widgetti/solara/pull/702)
|
|
7
|
+
|
|
8
|
+
|
|
3
9
|
## Version 1.34.0
|
|
4
10
|
|
|
5
11
|
* Feature: Enhancements for Solara `InputDate` and `InputDateRange` components [#672](https://github.com/widgetti/solara/pull/672):
|
|
@@ -411,3 +411,7 @@ To configure the ports the socket is bound to when starting the test servers, us
|
|
|
411
411
|
#### Vuetify warmup
|
|
412
412
|
|
|
413
413
|
By default, we insert an ipyvuetify widget with an icon into the frontend to force loading all the vuetify assets, such as CSS and fonts. However, if you are using the solara test plugin to test pure ipywidgets or a 3rd ipywidget based party library you might not need this. Disable this vuetify warmup phase by passing the `--no-solara-vuetify-warmup` argument to pytest, or setting the environment variable `SOLARA_TEST_VUETIFY_WARMUP` to a falsey value (e.g. `SOLARA_TEST_VUETIFY_WARMUP=0`).
|
|
414
|
+
|
|
415
|
+
#### Changing the application wait timeout
|
|
416
|
+
|
|
417
|
+
By default, we wait for 10 seconds for the browser to connect to the server when the solara server is used for testing. On slower systems, this may be too short. To change this timeout, set the `PYTEST_IPYWIDGETS_SOLARA_APP_WAIT_TIMEOUT` environment variable to the desired value in seconds (e.g. `PYTEST_IPYWIDGETS_SOLARA_APP_WAIT_TIMEOUT=20`).
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
prefix/etc/jupyter/jupyter_notebook_config.d/solara.json,sha256=3UhTBQi6z7F7pPjmqXxfddv79c8VGR9H7zStDLp6AwY,115
|
|
2
2
|
prefix/etc/jupyter/jupyter_server_config.d/solara.json,sha256=D9J-rYxAzyD5GOqWvuPjacGUVFHsYtTfZ4FUbRzRvIA,113
|
|
3
|
-
solara/__init__.py,sha256=
|
|
4
|
-
solara/__main__.py,sha256=
|
|
3
|
+
solara/__init__.py,sha256=G6n9833GZNikEicJ0sIt4c5k7tAso-pCAx19zVYHHk4,3584
|
|
4
|
+
solara/__main__.py,sha256=hxMYlUg-t-KTOJSVfEHwvcTV51WHX6INpN0F_qaesUg,23672
|
|
5
5
|
solara/alias.py,sha256=9vfLzud77NP8in3OID9b5mmIO8NyrnFjN2_aE0lSb1k,216
|
|
6
|
-
solara/autorouting.py,sha256=
|
|
6
|
+
solara/autorouting.py,sha256=k0f5SpySGbhutF1KKCRQTCtkBKKCsYT8C6gB_pUXK10,22535
|
|
7
7
|
solara/cache.py,sha256=rZEW_xVIj3vvajntsQDnaglniTQ90izkX8vOqe1mMvE,10500
|
|
8
8
|
solara/checks.html,sha256=NZoefOKYpE6NHQJchi4WE5HkDG3xpJW0kY6TOAFHQtE,3304
|
|
9
9
|
solara/checks.py,sha256=WtMzUM1HN127juk5fFV2jdsJ1qT5Ghg21wEZfiVfIFc,7563
|
|
@@ -23,7 +23,7 @@ solara/toestand.py,sha256=cGVw1TAX_Kn9u2IN_GHhCPEOP8W3N0PwA-WHuvk8EgU,23570
|
|
|
23
23
|
solara/util.py,sha256=ex3Hggy-kTQa4DTEMDlhFTihzqnTfjxWCbHk0ihaZSM,8934
|
|
24
24
|
solara/components/__init__.py,sha256=kVFPHiqv0-G_jQoL5NJnYskB9l9_2Y9jxVP3fFY8cVg,2636
|
|
25
25
|
solara/components/alert.py,sha256=sNjlrCu2niR6LD9gZFXwvSBMszCKt6nRH58kE7RgsDw,5144
|
|
26
|
-
solara/components/applayout.py,sha256=
|
|
26
|
+
solara/components/applayout.py,sha256=Q1n8foPT1szjIKqjUum6QxFnUvNj_MheMmyc8r7FIsI,16753
|
|
27
27
|
solara/components/button.py,sha256=8Q4s3cD7mULDzASAmUlKGAOcOuXgDFHJMC1PJS5DHYc,3143
|
|
28
28
|
solara/components/card.py,sha256=2xNXrIRJ4jGJtRbirX1Xp8V2h3HtW9vnxhLGUCrPr9I,2797
|
|
29
29
|
solara/components/checkbox.py,sha256=MLQ9Hxvtv5aKLj4XO3ILWtGc6nKOUH560A2bBt0Z030,1445
|
|
@@ -40,7 +40,7 @@ solara/components/download.vue,sha256=xdh4olwVvGkQwGNRMU5eVUW1FGvcXrYrCyjddJbvH7
|
|
|
40
40
|
solara/components/echarts.py,sha256=yaj3dQ1OiPD2XqpL_iPa545NRhgnmjJlz4-BqSdvsEw,2625
|
|
41
41
|
solara/components/echarts.vue,sha256=ogs-9-aurH_VXXV4YBvi-pPX-ZEt1jZaU7M7kZaDpkA,3552
|
|
42
42
|
solara/components/figure_altair.py,sha256=t4EEwXrdoisrbV5j2MS-HBlPc5HSFCK5r4mRXvYRH9w,1150
|
|
43
|
-
solara/components/file_browser.py,sha256=
|
|
43
|
+
solara/components/file_browser.py,sha256=701vg4_c0au9va206sx3pQDX6NL1VFqs7ewQ0RAbn6k,7331
|
|
44
44
|
solara/components/file_download.py,sha256=Lil0qyiozU_Pxyb_HgnJXOumrxMeDwwavEmZZw6kAs8,7475
|
|
45
45
|
solara/components/file_drop.py,sha256=3j8TkhGZK21lqpjOAc9tNMsvKjmUNhr7YUKbGB99Y1Q,4711
|
|
46
46
|
solara/components/file_drop.vue,sha256=ywQvWjqLIRNMAL6ZrdLpHCK4ZprrVbh0n2AJFanVlR8,2243
|
|
@@ -51,7 +51,7 @@ solara/components/head_tag.vue,sha256=vw0PJzAajq1XbyKhrTakfzJGF_beXAjupkFXPKJbVD
|
|
|
51
51
|
solara/components/image.py,sha256=o44iu0_wv3cPKnKv47mw10d2f67vuBaW2Jhs775hNAM,4503
|
|
52
52
|
solara/components/input.py,sha256=wzpJXEH9MYVtZetqJQd4MTfRhsjg_juCpdiD4VHhZ0c,14593
|
|
53
53
|
solara/components/link.py,sha256=bYXVencL9hjBcrGniXdE0JlSzBE9bkUFFmd4apfYhjk,1842
|
|
54
|
-
solara/components/markdown.py,sha256=
|
|
54
|
+
solara/components/markdown.py,sha256=agHcpMxBLDn7JJeb42GHDUwF2mVP7KOZ4fcKBOuruWo,12959
|
|
55
55
|
solara/components/markdown_editor.py,sha256=Ii_IVzl99JBVqegRu1aHdOC-hTIzbHXzuNKlRVvAEx0,634
|
|
56
56
|
solara/components/markdown_editor.vue,sha256=_QXDv1EdyFNCZdXTZL5dPDm8kCHNl2xT1jioEnHgaMg,8748
|
|
57
57
|
solara/components/matplotlib.py,sha256=c7iQhOIG_8aKTOz_Xnw3wXa0sgfiBunIzOxRhljQlzw,2029
|
|
@@ -68,7 +68,7 @@ solara/components/spinner-solara.vue,sha256=fH8AtwXUZf_YZnUj-1OWspcbVWc-mSbY2T5s
|
|
|
68
68
|
solara/components/spinner.py,sha256=EGB9qL6WnNchaEc8RnjPk79jm5TV9v_7UoEoDZKikBM,586
|
|
69
69
|
solara/components/sql_code.py,sha256=XUx91w_E7q6QzOPpY1NZVuCNPh6hPP6gPJLM7cMDYs4,1190
|
|
70
70
|
solara/components/sql_code.vue,sha256=ogqWdIOm1OnTQJj_p2UhcFPO_biv1uMaYCOCXPBJ6AQ,3815
|
|
71
|
-
solara/components/style.py,sha256=
|
|
71
|
+
solara/components/style.py,sha256=8xv5xXkfiTyVP0oRRh1ONQn0oJ2k40yTomQFEgP0-3k,3144
|
|
72
72
|
solara/components/switch.py,sha256=Vq6LgroaY3jx4PO2n1_08lqPL9g0MUZNsMPA4uqKr7I,2309
|
|
73
73
|
solara/components/tab_navigation.py,sha256=xVlVx4GvLNNxeE53sGtRLkcQB3mzEWM_jTlXOnY3SEs,1047
|
|
74
74
|
solara/components/title.py,sha256=2B-PDlWOoY1fHYRRXnP7vUmRioqEHM9WJ2qjF6zVFGQ,2120
|
|
@@ -101,11 +101,11 @@ solara/lab/utils/headers.py,sha256=RMo8JUdztRePrdNfYCX1QEhrfyF6ktodr4v6tIREKbs,2
|
|
|
101
101
|
solara/scope/__init__.py,sha256=0sP3B6L4Aai0b6nadPtEETb8XqdGmSFKvQusNH0-yvY,2987
|
|
102
102
|
solara/scope/types.py,sha256=HTf_wnkpkhhtGaeFsB690KBP623CUuqiMssd72-u9yg,1540
|
|
103
103
|
solara/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
104
|
-
solara/server/app.py,sha256=
|
|
105
|
-
solara/server/cdn_helper.py,sha256=
|
|
106
|
-
solara/server/esm.py,sha256=
|
|
104
|
+
solara/server/app.py,sha256=JWWr2UZLxJVRCahFZUBeMwSpUn9dyswzywDuvCUfWQU,20352
|
|
105
|
+
solara/server/cdn_helper.py,sha256=mjdDWL1jVed40rEagP9L5CfZwFB77yUKqcFg--u2eds,3250
|
|
106
|
+
solara/server/esm.py,sha256=dX9pzTJQ6kd6qNHQgzC938O5LTowLhuATXO0Q1paz44,2951
|
|
107
107
|
solara/server/fastapi.py,sha256=qVIHn0_Kxr6zWqcBWySu5nnJ6pNTSDqb4EHIh-cqH_8,93
|
|
108
|
-
solara/server/flask.py,sha256=
|
|
108
|
+
solara/server/flask.py,sha256=v3TUqZMKzijnoB9fv3xipM-kPtLziyNAV6Wiw0DLh7w,9149
|
|
109
109
|
solara/server/jupytertools.py,sha256=cYFIUjLX7n0uuEXqWVWvmV6sV7R_MNg8ZZlabQgw8vk,1320
|
|
110
110
|
solara/server/kernel.py,sha256=3mwRRBw6BOcKLACL4fCUGgtI_RZ5KTSM1MlAtRlDbmA,11092
|
|
111
111
|
solara/server/kernel_context.py,sha256=RrNVAkoev6u6LZBvDfG86zyVs7eDVUsrp_4Au_FLlgY,16718
|
|
@@ -114,10 +114,10 @@ solara/server/reload.py,sha256=BBH7QhrV1-e9RVyNE3uz1oPj1DagC3t_XSqGPNz0nJE,9747
|
|
|
114
114
|
solara/server/server.py,sha256=fo-3o7L20kC6tb4_mLzoVI39dodRRuNIVuCCYBOF94k,16268
|
|
115
115
|
solara/server/settings.py,sha256=8QpVW_hYe4QvSVvDMeobpUEFa_jjCAGrSKgCGzjZ3As,7340
|
|
116
116
|
solara/server/shell.py,sha256=xKox0fvDxdcWleE8p2ffCkihvjLJsWn2FujMbgUjYn0,8677
|
|
117
|
-
solara/server/starlette.py,sha256=
|
|
117
|
+
solara/server/starlette.py,sha256=zOyE5cdsE-JVvXuoKWv2nnkWHeUBVV3b6i9-3sK0utI,23866
|
|
118
118
|
solara/server/telemetry.py,sha256=GPKGA5kCIqJb76wgxQ2_U2uV_s0r-1tKqv-GVxo5hs8,6038
|
|
119
|
-
solara/server/threaded.py,sha256=
|
|
120
|
-
solara/server/utils.py,sha256=
|
|
119
|
+
solara/server/threaded.py,sha256=k9k461md4MxEFX-RLit5RpVRPFlQNwr-qp5pprT8JB0,2347
|
|
120
|
+
solara/server/utils.py,sha256=qYoSi5adwNVdcUuGj6N7jQU9fpXYDuBpsPg7bAKOMUw,938
|
|
121
121
|
solara/server/websocket.py,sha256=hUYw9TeVf4vHKL8TGG4RAZGLL7rmkt1INVq5qSYRWOo,1076
|
|
122
122
|
solara/server/assets/custom.css,sha256=4p04-uxHTobfr6Xkvf1iOrYiks8NciWLT_EwHZSy6jw,15
|
|
123
123
|
solara/server/assets/custom.js,sha256=YT-UUYzA5uI5-enmbIsrRhofY_IJAO-HanaMwiNUEos,16
|
|
@@ -135,7 +135,7 @@ solara/server/static/highlight-dark.css,sha256=gmC3pr3x2BqJgTswNoN6AkqfEhBk24hPF
|
|
|
135
135
|
solara/server/static/highlight.css,sha256=k8ZdT5iwrGQ5tXTQHAXuxvZrSUq3kwCdEpy3mlFoZjs,2637
|
|
136
136
|
solara/server/static/main-vuetify.js,sha256=-FLlUqclZdVhCXsqawzpxtQ9vpaDA6KQdwoDKJCr_AI,8926
|
|
137
137
|
solara/server/static/main.js,sha256=mcx4JNQ4Lg4pNdUIqMoZos1mZyYFS48yd_JNFFJUqIE,5679
|
|
138
|
-
solara/server/static/solara_bootstrap.py,sha256=
|
|
138
|
+
solara/server/static/solara_bootstrap.py,sha256=ajBPF2o78wx3hGHt4gPU-qBE0Zpo9cyo86xjocUbyAs,3195
|
|
139
139
|
solara/server/static/sun.svg,sha256=jEKBAGCr7b9zNYv0VUb7lMWKjnU2dX69_Ye_DZWGXJI,6855
|
|
140
140
|
solara/server/static/webworker.js,sha256=cjAFz7-SygStHJnYlJUlJs-gE_7YQeQ-WBDcmKYyjvo,1372
|
|
141
141
|
solara/server/templates/index.html.j2,sha256=JXQo1M-STFHLBOFetgG7509cAq8xUP0VAEtYDzz35fY,31
|
|
@@ -168,7 +168,7 @@ solara/template/portal/solara_portal/pages/article/__init__.py,sha256=6PgHyyeK1_
|
|
|
168
168
|
solara/template/portal/solara_portal/pages/viz/__init__.py,sha256=l65uqBpFJ6Uh5XytXhLMnR-8G4FBnjqJg86OJX7_LO0,2858
|
|
169
169
|
solara/template/portal/solara_portal/pages/viz/overview.py,sha256=GPlzFxUR0LRQhR96a_CVWquGTjHhDehL1PR03Tcm3gs,365
|
|
170
170
|
solara/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
171
|
-
solara/test/pytest_plugin.py,sha256=
|
|
171
|
+
solara/test/pytest_plugin.py,sha256=n0iXaY1hPXu4qeEbXvc68I4pBZrVn9dspWXw0hv5L1s,26438
|
|
172
172
|
solara/website/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
173
173
|
solara/website/utils.py,sha256=TfoExocZ8ko2hTcA7XDKI5FfKZ4gi3JTc_f9Oi5L7Fs,855
|
|
174
174
|
solara/website/assets/custom.css,sha256=yBAhh-21ycWwDC2HLDKuMbNAR9ROj3gmF1wOdoq5olM,9888
|
|
@@ -204,7 +204,7 @@ solara/website/pages/apps/multipage/__init__.py,sha256=zljTAXbsV8hqb67dwmx_PhzN-
|
|
|
204
204
|
solara/website/pages/apps/multipage/page1.py,sha256=5hK0RZ8UBBOaZcPKaplbLeb0VvaerhB6m3Jn5C0afRM,872
|
|
205
205
|
solara/website/pages/apps/multipage/page2.py,sha256=uRJ8YPFyKy7GR_Ii8DJSx3akb3H15rQAJZETMt9jVEk,1422
|
|
206
206
|
solara/website/pages/changelog/__init__.py,sha256=iBCpD5LVrFxQtEHX116u_6vqNBktZD3AXR65eTZblFo,227
|
|
207
|
-
solara/website/pages/changelog/changelog.md,sha256=
|
|
207
|
+
solara/website/pages/changelog/changelog.md,sha256=Qo0G88hN0lhmf9e666WOmBIBJj9aiA-ZMiREYSHMJXM,16144
|
|
208
208
|
solara/website/pages/contact/__init__.py,sha256=L6o45fHAMClqyWdHWxI6JuiwUTP-U-yXCgd3lxMUcxA,223
|
|
209
209
|
solara/website/pages/contact/contact.md,sha256=zp66RGhOE_tdkRaWKZqGbuk-PnOqBWhDVvX5zSLXoHw,798
|
|
210
210
|
solara/website/pages/documentation/__init__.py,sha256=zJh3kmr6OhFPbax8Igp-LN-m9cZNrs9sq9ifFuC8Kic,6003
|
|
@@ -213,7 +213,7 @@ solara/website/pages/documentation/advanced/content/00-overview.md,sha256=GY7d74
|
|
|
213
213
|
solara/website/pages/documentation/advanced/content/10-howto/00-overview.md,sha256=mG2UzdSn7ReVNIYFGYv7ODxPI5s_ux8j-J8HlWxE6Wo,324
|
|
214
214
|
solara/website/pages/documentation/advanced/content/10-howto/10-multipage.md,sha256=V52UWqYUnC7AaqbfpnM9-rOUEONZxczt-3k6FIjO77E,7417
|
|
215
215
|
solara/website/pages/documentation/advanced/content/10-howto/20-layout.md,sha256=0STmZU16cfcgi7mGdGvDdCOfV7RUPMl160RUG2rHM64,5792
|
|
216
|
-
solara/website/pages/documentation/advanced/content/10-howto/30-testing.md,sha256=
|
|
216
|
+
solara/website/pages/documentation/advanced/content/10-howto/30-testing.md,sha256=_tD7fwDdesaGS6eJvvnkOHPjEEyPKUPbDQq4VPYsygk,19588
|
|
217
217
|
solara/website/pages/documentation/advanced/content/10-howto/31-debugging.md,sha256=KUmLAJj2iiEL6im3lkOI8gRjaX4JM6uH565mTZNjV3I,1791
|
|
218
218
|
solara/website/pages/documentation/advanced/content/10-howto/40-embed.md,sha256=tufVLEUJ_nqpow5iwD_1Huw9Sa-4n-alNrvrY50A4WA,2119
|
|
219
219
|
solara/website/pages/documentation/advanced/content/10-howto/50-ipywidget_libraries.md,sha256=nIrx3eHDUAQpP-JxeE6DqhkAiHBHfT3pX_k_VqgLGno,5091
|
|
@@ -434,9 +434,9 @@ solara/widgets/vue/gridlayout.vue,sha256=nFZJotdznqI9tUYZ1Elv9OLA0adazxvVZAggMHH
|
|
|
434
434
|
solara/widgets/vue/html.vue,sha256=48K5rjp0AdJDeRV6F3nOHW3J0WXPeHn55r5pGClK2fU,112
|
|
435
435
|
solara/widgets/vue/navigator.vue,sha256=SLrzBI0Eiys-7maXA4e8yyD13-O5b4AnCGE9wKuJDHE,3646
|
|
436
436
|
solara/widgets/vue/vegalite.vue,sha256=E3dlfhR-Ol7nqQZN6wCZC_3Tz98CJW0i_EU39mj0XHw,3986
|
|
437
|
-
solara_ui-1.
|
|
438
|
-
solara_ui-1.
|
|
439
|
-
solara_ui-1.
|
|
440
|
-
solara_ui-1.
|
|
441
|
-
solara_ui-1.
|
|
442
|
-
solara_ui-1.
|
|
437
|
+
solara_ui-1.35.1.data/data/etc/jupyter/jupyter_notebook_config.d/solara.json,sha256=3UhTBQi6z7F7pPjmqXxfddv79c8VGR9H7zStDLp6AwY,115
|
|
438
|
+
solara_ui-1.35.1.data/data/etc/jupyter/jupyter_server_config.d/solara.json,sha256=D9J-rYxAzyD5GOqWvuPjacGUVFHsYtTfZ4FUbRzRvIA,113
|
|
439
|
+
solara_ui-1.35.1.dist-info/METADATA,sha256=xmBLIN83y97Vi8K9zWbz4TWbMoT9tWcIAD6y8QGN9kc,7284
|
|
440
|
+
solara_ui-1.35.1.dist-info/WHEEL,sha256=L5_n4Kc1NmrSdVgbp6hdnwwVwBnoYOCnbHBRMD-qNJ4,105
|
|
441
|
+
solara_ui-1.35.1.dist-info/licenses/LICENSE,sha256=fFJUz-CWzZ9nEc4QZKu44jMEoDr5fEW-SiqljKpD82E,1086
|
|
442
|
+
solara_ui-1.35.1.dist-info/RECORD,,
|
|
File without changes
|
{solara_ui-1.34.1.data → solara_ui-1.35.1.data}/data/etc/jupyter/jupyter_server_config.d/solara.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|