streamlit-nightly 1.36.1.dev20240714__py2.py3-none-any.whl → 1.36.1.dev20240716__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.
- streamlit/__init__.py +27 -6
- streamlit/commands/execution_control.py +71 -10
- streamlit/components/v1/components.py +15 -2
- streamlit/delta_generator.py +3 -3
- streamlit/elements/dialog_decorator.py +59 -25
- streamlit/elements/json.py +11 -1
- streamlit/elements/widgets/chat.py +3 -2
- streamlit/elements/write.py +11 -2
- streamlit/errors.py +15 -0
- streamlit/runtime/app_session.py +15 -13
- streamlit/runtime/context.py +157 -0
- streamlit/runtime/forward_msg_queue.py +1 -0
- streamlit/runtime/fragment.py +129 -44
- streamlit/runtime/metrics_util.py +3 -1
- streamlit/runtime/scriptrunner/exec_code.py +16 -36
- streamlit/runtime/scriptrunner/script_requests.py +63 -22
- streamlit/runtime/scriptrunner/script_run_context.py +3 -3
- streamlit/runtime/scriptrunner/script_runner.py +27 -6
- streamlit/runtime/state/session_state.py +6 -2
- streamlit/runtime/state/widgets.py +20 -8
- streamlit/web/server/websocket_headers.py +9 -0
- {streamlit_nightly-1.36.1.dev20240714.dist-info → streamlit_nightly-1.36.1.dev20240716.dist-info}/METADATA +1 -1
- {streamlit_nightly-1.36.1.dev20240714.dist-info → streamlit_nightly-1.36.1.dev20240716.dist-info}/RECORD +27 -26
- {streamlit_nightly-1.36.1.dev20240714.data → streamlit_nightly-1.36.1.dev20240716.data}/scripts/streamlit.cmd +0 -0
- {streamlit_nightly-1.36.1.dev20240714.dist-info → streamlit_nightly-1.36.1.dev20240716.dist-info}/WHEEL +0 -0
- {streamlit_nightly-1.36.1.dev20240714.dist-info → streamlit_nightly-1.36.1.dev20240716.dist-info}/entry_points.txt +0 -0
- {streamlit_nightly-1.36.1.dev20240714.dist-info → streamlit_nightly-1.36.1.dev20240716.dist-info}/top_level.txt +0 -0
@@ -15,7 +15,7 @@
|
|
15
15
|
from __future__ import annotations
|
16
16
|
|
17
17
|
import threading
|
18
|
-
from dataclasses import dataclass, field
|
18
|
+
from dataclasses import dataclass, field, replace
|
19
19
|
from enum import Enum
|
20
20
|
from typing import TYPE_CHECKING, cast
|
21
21
|
|
@@ -48,7 +48,12 @@ class RerunData:
|
|
48
48
|
widget_states: WidgetStates | None = None
|
49
49
|
page_script_hash: str = ""
|
50
50
|
page_name: str = ""
|
51
|
+
|
52
|
+
# A single fragment_id to append to fragment_id_queue.
|
53
|
+
fragment_id: str | None = None
|
54
|
+
# The queue of fragment_ids waiting to be run.
|
51
55
|
fragment_id_queue: list[str] = field(default_factory=list)
|
56
|
+
is_fragment_scoped_rerun: bool = False
|
52
57
|
|
53
58
|
def __repr__(self) -> str:
|
54
59
|
return util.repr_(self)
|
@@ -71,6 +76,20 @@ class ScriptRequest:
|
|
71
76
|
return util.repr_(self)
|
72
77
|
|
73
78
|
|
79
|
+
def _fragment_run_should_not_preempt_script(
|
80
|
+
fragment_id_queue: list[str],
|
81
|
+
is_fragment_scoped_rerun: bool,
|
82
|
+
) -> bool:
|
83
|
+
"""Returns whether the currently running script should be preempted due to a
|
84
|
+
fragment rerun.
|
85
|
+
|
86
|
+
Reruns corresponding to fragment runs that weren't caused by calls to
|
87
|
+
`st.rerun(scope="fragment")` should *not* cancel the current script run
|
88
|
+
as doing so will affect elements outside of the fragment.
|
89
|
+
"""
|
90
|
+
return bool(fragment_id_queue) and not is_fragment_scoped_rerun
|
91
|
+
|
92
|
+
|
74
93
|
class ScriptRequests:
|
75
94
|
"""An interface for communicating with a ScriptRunner. Thread-safe.
|
76
95
|
|
@@ -83,6 +102,13 @@ class ScriptRequests:
|
|
83
102
|
self._state = ScriptRequestType.CONTINUE
|
84
103
|
self._rerun_data = RerunData()
|
85
104
|
|
105
|
+
@property
|
106
|
+
def fragment_id_queue(self) -> list[str]:
|
107
|
+
if not self._rerun_data:
|
108
|
+
return []
|
109
|
+
|
110
|
+
return self._rerun_data.fragment_id_queue
|
111
|
+
|
86
112
|
def request_stop(self) -> None:
|
87
113
|
"""Request that the ScriptRunner stop running. A stopped ScriptRunner
|
88
114
|
can't be used anymore. STOP requests succeed unconditionally.
|
@@ -110,6 +136,15 @@ class ScriptRequests:
|
|
110
136
|
# rerun it as of yet. We can handle a rerun request unconditionally so
|
111
137
|
# just change self._state and set self._rerun_data.
|
112
138
|
self._state = ScriptRequestType.RERUN
|
139
|
+
|
140
|
+
# Convert from a single fragment_id into fragment_id_queue.
|
141
|
+
if new_data.fragment_id:
|
142
|
+
new_data = replace(
|
143
|
+
new_data,
|
144
|
+
fragment_id=None,
|
145
|
+
fragment_id_queue=[new_data.fragment_id],
|
146
|
+
)
|
147
|
+
|
113
148
|
self._rerun_data = new_data
|
114
149
|
return True
|
115
150
|
|
@@ -121,17 +156,17 @@ class ScriptRequests:
|
|
121
156
|
self._rerun_data.widget_states, new_data.widget_states
|
122
157
|
)
|
123
158
|
|
124
|
-
if new_data.
|
125
|
-
# This RERUN request corresponds to a fragment run. We append
|
126
|
-
# new fragment ID to the end of the current fragment_id_queue if
|
127
|
-
# isn't already contained in it.
|
159
|
+
if new_data.fragment_id:
|
160
|
+
# This RERUN request corresponds to a new fragment run. We append
|
161
|
+
# the new fragment ID to the end of the current fragment_id_queue if
|
162
|
+
# it isn't already contained in it.
|
128
163
|
fragment_id_queue = [*self._rerun_data.fragment_id_queue]
|
129
|
-
|
130
|
-
|
131
|
-
(
|
132
|
-
|
133
|
-
|
134
|
-
|
164
|
+
|
165
|
+
if new_data.fragment_id not in fragment_id_queue:
|
166
|
+
fragment_id_queue.append(new_data.fragment_id)
|
167
|
+
elif new_data.fragment_id_queue:
|
168
|
+
# new_data contains a new fragment_id_queue, so we just use it.
|
169
|
+
fragment_id_queue = new_data.fragment_id_queue
|
135
170
|
else:
|
136
171
|
# Otherwise, this is a request to rerun the full script, so we want
|
137
172
|
# to clear out any fragments we have queued to run since they'll all
|
@@ -144,6 +179,7 @@ class ScriptRequests:
|
|
144
179
|
page_script_hash=new_data.page_script_hash,
|
145
180
|
page_name=new_data.page_name,
|
146
181
|
fragment_id_queue=fragment_id_queue,
|
182
|
+
is_fragment_scoped_rerun=new_data.is_fragment_scoped_rerun,
|
147
183
|
)
|
148
184
|
|
149
185
|
return True
|
@@ -154,30 +190,35 @@ class ScriptRequests:
|
|
154
190
|
def on_scriptrunner_yield(self) -> ScriptRequest | None:
|
155
191
|
"""Called by the ScriptRunner when it's at a yield point.
|
156
192
|
|
157
|
-
If we have no request or a RERUN request corresponding to one or more fragments
|
158
|
-
return None.
|
193
|
+
If we have no request or a RERUN request corresponding to one or more fragments
|
194
|
+
(that is not a fragment-scoped rerun), return None.
|
159
195
|
|
160
|
-
If we have a (full script) RERUN request, return the request
|
161
|
-
state to CONTINUE.
|
196
|
+
If we have a (full script or fragment-scoped) RERUN request, return the request
|
197
|
+
and set our internal state to CONTINUE.
|
162
198
|
|
163
199
|
If we have a STOP request, return the request and remain stopped.
|
164
200
|
"""
|
165
201
|
if self._state == ScriptRequestType.CONTINUE or (
|
166
|
-
# Reruns corresponding to fragments should *not* cancel the current script
|
167
|
-
# run as doing so will affect elements outside of the fragment.
|
168
202
|
self._state == ScriptRequestType.RERUN
|
169
|
-
and
|
203
|
+
and _fragment_run_should_not_preempt_script(
|
204
|
+
self._rerun_data.fragment_id_queue,
|
205
|
+
self._rerun_data.is_fragment_scoped_rerun,
|
206
|
+
)
|
170
207
|
):
|
171
|
-
# We avoid taking the lock in the common cases
|
172
|
-
#
|
173
|
-
# (full script) RERUN request is received between the `if` and `return`, it
|
208
|
+
# We avoid taking the lock in the common cases described above. If a STOP or
|
209
|
+
# preempting RERUN request is received after we've taken this code path, it
|
174
210
|
# will be handled at the next `on_scriptrunner_yield`, or when
|
175
211
|
# `on_scriptrunner_ready` is called.
|
176
212
|
return None
|
177
213
|
|
178
214
|
with self._lock:
|
179
215
|
if self._state == ScriptRequestType.RERUN:
|
180
|
-
|
216
|
+
# We already made this check in the fast-path above but need to do so
|
217
|
+
# again in case our state changed while we were waiting on the lock.
|
218
|
+
if _fragment_run_should_not_preempt_script(
|
219
|
+
self._rerun_data.fragment_id_queue,
|
220
|
+
self._rerun_data.is_fragment_scoped_rerun,
|
221
|
+
):
|
181
222
|
return None
|
182
223
|
|
183
224
|
self._state = ScriptRequestType.CONTINUE
|
@@ -77,7 +77,7 @@ class ScriptRunContext:
|
|
77
77
|
cursors: dict[int, RunningCursor] = field(default_factory=dict)
|
78
78
|
script_requests: ScriptRequests | None = None
|
79
79
|
current_fragment_id: str | None = None
|
80
|
-
|
80
|
+
new_fragment_ids: set[str] = field(default_factory=set)
|
81
81
|
# we allow only one dialog to be open at the same time
|
82
82
|
has_dialog_opened: bool = False
|
83
83
|
# If true, it indicates that we are in a cached function that disallows
|
@@ -100,7 +100,6 @@ class ScriptRunContext:
|
|
100
100
|
self,
|
101
101
|
query_string: str = "",
|
102
102
|
page_script_hash: str = "",
|
103
|
-
fragment_ids_this_run: set[str] | None = None,
|
104
103
|
) -> None:
|
105
104
|
self.cursors = {}
|
106
105
|
self.widget_ids_this_run = set()
|
@@ -116,7 +115,8 @@ class ScriptRunContext:
|
|
116
115
|
self.tracked_commands_counter = collections.Counter()
|
117
116
|
self.current_fragment_id = None
|
118
117
|
self.current_fragment_delta_path: list[int] = []
|
119
|
-
self.fragment_ids_this_run =
|
118
|
+
self.fragment_ids_this_run = None
|
119
|
+
self.new_fragment_ids = set()
|
120
120
|
self.has_dialog_opened = False
|
121
121
|
self.disallow_cached_widget_usage = False
|
122
122
|
|
@@ -26,6 +26,7 @@ from typing import TYPE_CHECKING, Callable, Final
|
|
26
26
|
from blinker import Signal
|
27
27
|
|
28
28
|
from streamlit import config, runtime, util
|
29
|
+
from streamlit.errors import FragmentStorageKeyError
|
29
30
|
from streamlit.logger import get_logger
|
30
31
|
from streamlit.proto.ClientState_pb2 import ClientState
|
31
32
|
from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
|
@@ -432,8 +433,6 @@ class ScriptRunner:
|
|
432
433
|
else main_page_info["page_script_hash"]
|
433
434
|
)
|
434
435
|
|
435
|
-
fragment_ids_this_run = set(rerun_data.fragment_id_queue)
|
436
|
-
|
437
436
|
ctx = self._get_script_run_ctx()
|
438
437
|
# Clear widget state on page change. This normally happens implicitly
|
439
438
|
# in the script run cleanup steps, but doing it explicitly ensures
|
@@ -458,16 +457,25 @@ class ScriptRunner:
|
|
458
457
|
ctx.reset(
|
459
458
|
query_string=rerun_data.query_string,
|
460
459
|
page_script_hash=page_script_hash,
|
461
|
-
fragment_ids_this_run=fragment_ids_this_run,
|
462
460
|
)
|
463
461
|
self._pages_manager.reset_active_script_hash()
|
464
462
|
|
463
|
+
# We want to clear the forward_msg_queue during full script runs and
|
464
|
+
# fragment-scoped fragment reruns. For normal fragment runs, clearing the
|
465
|
+
# forward_msg_queue may cause us to drop messages either corresponding to
|
466
|
+
# other, unrelated fragments or that this fragment run depends on.
|
467
|
+
fragment_ids_this_run = rerun_data.fragment_id_queue
|
468
|
+
clear_forward_msg_queue = (
|
469
|
+
not fragment_ids_this_run or rerun_data.is_fragment_scoped_rerun
|
470
|
+
)
|
471
|
+
|
465
472
|
self.on_event.send(
|
466
473
|
self,
|
467
474
|
event=ScriptRunnerEvent.SCRIPT_STARTED,
|
468
475
|
page_script_hash=page_script_hash,
|
469
476
|
fragment_ids_this_run=fragment_ids_this_run,
|
470
477
|
pages=self._pages_manager.get_pages(),
|
478
|
+
clear_forward_msg_queue=clear_forward_msg_queue,
|
471
479
|
)
|
472
480
|
|
473
481
|
# Compile the script. Any errors thrown here will be surfaced
|
@@ -544,16 +552,29 @@ class ScriptRunner:
|
|
544
552
|
wrapped_fragment = self._fragment_storage.get(
|
545
553
|
fragment_id
|
546
554
|
)
|
547
|
-
ctx.current_fragment_id = fragment_id
|
548
555
|
wrapped_fragment()
|
549
556
|
|
550
|
-
except
|
557
|
+
except FragmentStorageKeyError:
|
551
558
|
raise RuntimeError(
|
552
559
|
f"Could not find fragment with id {fragment_id}"
|
553
560
|
)
|
561
|
+
except (RerunException, StopException) as e:
|
562
|
+
# The wrapped_fragment function is executed
|
563
|
+
# inside of a exec_func_with_error_handling call, so
|
564
|
+
# there is a correct handler for these exceptions.
|
565
|
+
raise e
|
566
|
+
except Exception:
|
567
|
+
# Ignore exceptions raised by fragments here as we don't
|
568
|
+
# want to stop the execution of other fragments. The
|
569
|
+
# error itself is already rendered within the wrapped
|
570
|
+
# fragment.
|
571
|
+
pass
|
572
|
+
|
554
573
|
else:
|
555
|
-
self._fragment_storage.clear()
|
556
574
|
exec(code, module.__dict__)
|
575
|
+
self._fragment_storage.clear(
|
576
|
+
new_fragment_ids=ctx.new_fragment_ids
|
577
|
+
)
|
557
578
|
|
558
579
|
self._session_state.maybe_check_serializable()
|
559
580
|
# check for control requests, e.g. rerun requests have arrived
|
@@ -579,9 +579,13 @@ class SessionState:
|
|
579
579
|
if ctx is None:
|
580
580
|
return
|
581
581
|
|
582
|
+
fragment_ids_this_run = (
|
583
|
+
set(ctx.script_requests.fragment_id_queue) if ctx.script_requests else set()
|
584
|
+
)
|
585
|
+
|
582
586
|
self._new_widget_state.remove_stale_widgets(
|
583
587
|
active_widget_ids,
|
584
|
-
|
588
|
+
fragment_ids_this_run,
|
585
589
|
)
|
586
590
|
|
587
591
|
# Remove entries from _old_state corresponding to
|
@@ -594,7 +598,7 @@ class SessionState:
|
|
594
598
|
or not _is_stale_widget(
|
595
599
|
self._new_widget_state.widget_metadata.get(k),
|
596
600
|
active_widget_ids,
|
597
|
-
|
601
|
+
fragment_ids_this_run,
|
598
602
|
)
|
599
603
|
)
|
600
604
|
}
|
@@ -21,6 +21,7 @@ from typing import TYPE_CHECKING, Final, Mapping
|
|
21
21
|
from typing_extensions import TypeAlias
|
22
22
|
|
23
23
|
from streamlit.errors import DuplicateWidgetID
|
24
|
+
from streamlit.proto.Common_pb2 import StringTriggerValue as StringTriggerValueProto
|
24
25
|
from streamlit.proto.WidgetStates_pb2 import WidgetState, WidgetStates
|
25
26
|
from streamlit.runtime.state.common import (
|
26
27
|
RegisterWidgetResult,
|
@@ -244,20 +245,31 @@ def coalesce_widget_states(
|
|
244
245
|
wstate.id: wstate for wstate in new_states.widgets
|
245
246
|
}
|
246
247
|
|
247
|
-
trigger_value_types = [
|
248
|
+
trigger_value_types = [
|
249
|
+
("trigger_value", False),
|
250
|
+
("string_trigger_value", StringTriggerValueProto(data=None)),
|
251
|
+
]
|
248
252
|
for old_state in old_states.widgets:
|
249
253
|
for trigger_value_type, unset_value in trigger_value_types:
|
250
254
|
if (
|
251
255
|
old_state.WhichOneof("value") == trigger_value_type
|
252
|
-
and old_state
|
256
|
+
and getattr(old_state, trigger_value_type) != unset_value
|
253
257
|
):
|
254
|
-
# Ensure the corresponding new_state is also a trigger;
|
255
|
-
# otherwise, a widget that was previously a button but no longer is
|
256
|
-
# could get a bad value.
|
257
258
|
new_trigger_val = states_by_id.get(old_state.id)
|
258
|
-
|
259
|
-
|
260
|
-
|
259
|
+
# It should nearly always be the case that new_trigger_val is None
|
260
|
+
# here as trigger values are deleted from the client's WidgetStateManager
|
261
|
+
# as soon as a rerun_script BackMsg is sent to the server. Since it's
|
262
|
+
# impossible to test that the client sends us state in the expected
|
263
|
+
# format in a unit test, we test for this behavior in
|
264
|
+
# e2e_playwright/test_fragment_queue_test.py
|
265
|
+
if not new_trigger_val or (
|
266
|
+
# Ensure the corresponding new_state is also a trigger;
|
267
|
+
# otherwise, a widget that was previously a button/chat_input but no
|
268
|
+
# longer is could get a bad value.
|
269
|
+
new_trigger_val.WhichOneof("value") == trigger_value_type
|
270
|
+
# We only want to take the value of old_state if new_trigger_val is
|
271
|
+
# unset as the old value may be stale if a newer one was entered.
|
272
|
+
and getattr(new_trigger_val, trigger_value_type) == unset_value
|
261
273
|
):
|
262
274
|
states_by_id[old_state.id] = old_state
|
263
275
|
|
@@ -15,10 +15,16 @@
|
|
15
15
|
from __future__ import annotations
|
16
16
|
|
17
17
|
from streamlit import runtime
|
18
|
+
from streamlit.deprecation_util import show_deprecation_warning
|
18
19
|
from streamlit.runtime.metrics_util import gather_metrics
|
19
20
|
from streamlit.runtime.scriptrunner import get_script_run_ctx
|
20
21
|
from streamlit.web.server.browser_websocket_handler import BrowserWebSocketHandler
|
21
22
|
|
23
|
+
_GET_WEBSOCKET_HEADERS_DEPRECATE_MSG = (
|
24
|
+
"The `_get_websocket_headers` function is deprecated and will be removed "
|
25
|
+
"in a future version of Streamlit. Please use `st.context.headers` instead."
|
26
|
+
)
|
27
|
+
|
22
28
|
|
23
29
|
@gather_metrics("_get_websocket_headers")
|
24
30
|
def _get_websocket_headers() -> dict[str, str] | None:
|
@@ -31,6 +37,9 @@ def _get_websocket_headers() -> dict[str, str] | None:
|
|
31
37
|
to remove it without a replacement, but we don't consider this a production-ready
|
32
38
|
function, and its signature may change without a deprecation warning.)
|
33
39
|
"""
|
40
|
+
|
41
|
+
show_deprecation_warning(_GET_WEBSOCKET_HEADERS_DEPRECATE_MSG)
|
42
|
+
|
34
43
|
ctx = get_script_run_ctx()
|
35
44
|
if ctx is None:
|
36
45
|
return None
|
@@ -1,4 +1,4 @@
|
|
1
|
-
streamlit/__init__.py,sha256=
|
1
|
+
streamlit/__init__.py,sha256=3F5QdTn_r2M_DYtJT7hz8ondxeLUmNCHvNS3Z6dh2IQ,8892
|
2
2
|
streamlit/__main__.py,sha256=8vHowjccJfFMwrA22IEe3ynE9F670mkspbo9rYdM0ks,868
|
3
3
|
streamlit/case_converters.py,sha256=SprbXtdNr0syzbUPeClp7KE5dSKOiAo-5FWENCW08Do,2468
|
4
4
|
streamlit/cli_util.py,sha256=P7A6R9D8whD9mytXHAfIax18hrxweUk5Ma8Klb99SeY,1420
|
@@ -11,14 +11,14 @@ streamlit/config_util.py,sha256=-MGb5eBrsZvNmqywmiBmo27ll1F9OmCDX4toGWglv2c,6015
|
|
11
11
|
streamlit/constants.py,sha256=KhNjCeooky2bbW7QMX3ijOA5enHIOgj6Xo4TBhtTJNE,798
|
12
12
|
streamlit/cursor.py,sha256=LUDB6o7xyGb1it_8rl5QU_N3MRhFCdtnd9tuTx78abU,6001
|
13
13
|
streamlit/dataframe_util.py,sha256=OOYUEOO9xPpjOa3-04eWKEgO8GryCAHzpDvidfS8H-E,30932
|
14
|
-
streamlit/delta_generator.py,sha256=
|
14
|
+
streamlit/delta_generator.py,sha256=AlsPVFUBcMhNpIz_Gu-C55XGvWRm5vqAq9wL2Ea5d6I,28479
|
15
15
|
streamlit/deprecation_util.py,sha256=3JxWWS424v1kQ-qOq-9sQNYPQ8_UERH3QpYtkWxLP74,6516
|
16
16
|
streamlit/development.py,sha256=iO-KQc62Do9uSwoa5vV2tfImqz3QPhJ1Md6DETcnHkc,813
|
17
17
|
streamlit/echo.py,sha256=s0tT_IXxh7BLHOapRS8syE5Tnm4Djm3-oKO0J0MY1wI,4077
|
18
18
|
streamlit/emojis.py,sha256=G1ZHg5TQYCorAZR7ZAlyiapaxYAY6NeY2OdP6F0yVMM,81235
|
19
19
|
streamlit/env_util.py,sha256=fqea8xmj4ifsuqmLv3Pvlq4t5y6WVTBua4qRpVTbs5Y,1791
|
20
20
|
streamlit/error_util.py,sha256=Xx19JaBKF-MKHleuPY6TX3Xo_1fSd3ZqZuhvSz-B3LM,3598
|
21
|
-
streamlit/errors.py,sha256=
|
21
|
+
streamlit/errors.py,sha256=PdGQ8hyZaMrxHawYz3G8u1Gzzci4lLpLTifGo20fnes,3532
|
22
22
|
streamlit/file_util.py,sha256=WbYWuARKjNi8QWcaRtfSto0j6HWKL1xi1dcFaF_M3M8,7144
|
23
23
|
streamlit/folder_black_list.py,sha256=Ji9UZ4PtrilLxmvb8W57SIEK7AkeLGEqqtqr4y2oscI,2342
|
24
24
|
streamlit/git_util.py,sha256=tVRinRwVqJDtJAJOr9d_PuFNbGJKPpo34xpxJTUnfZ0,5261
|
@@ -38,7 +38,7 @@ streamlit/user_info.py,sha256=tvv__45d7cA6tNrGw1vHtWwc6QLtmXTM5xZoYeTs1cw,3383
|
|
38
38
|
streamlit/util.py,sha256=0Phev7Lytvcy_eqIjpoGl2-7mOODwAwArY2zJpavEh8,6375
|
39
39
|
streamlit/version.py,sha256=dAqFbNh-ln7p47GRRDVHuqag-JZUYpMe47uqFxVb7Tw,763
|
40
40
|
streamlit/commands/__init__.py,sha256=Vrf1yVMOcTyhUPnYvsfyeL96Vpd5z8KoSV5ZzTcTQgU,616
|
41
|
-
streamlit/commands/execution_control.py,sha256=
|
41
|
+
streamlit/commands/execution_control.py,sha256=yyIw-OUDUhasKIWmGwjBctUVpU3CLP8Qopsg0-U9EeY,8246
|
42
42
|
streamlit/commands/experimental_query_params.py,sha256=axNJrNpOICoUCVXORo8rvq0l7EBoCGKd10s-wAopxMY,4980
|
43
43
|
streamlit/commands/logo.py,sha256=auNFZnqyXyodElNu0ByCIVDlkCbbqsiVLC9kYUs-YGE,5729
|
44
44
|
streamlit/commands/navigation.py,sha256=3Sd4cHWLT6MyQzR8H_YbQ0wdOXL3s1czxXPL97fxN98,9534
|
@@ -52,7 +52,7 @@ streamlit/components/types/base_custom_component.py,sha256=a8fvmmf8DN18fhezsdgkr
|
|
52
52
|
streamlit/components/v1/__init__.py,sha256=I7xa1wfGQY84U_nWWsq1i_HO5kCQ7f0BE5_dEQUiWRw,1027
|
53
53
|
streamlit/components/v1/component_arrow.py,sha256=sG9hKzRCMWHW18ZkpaAkhTI_yGYhzxy1xjylb_mt5FY,4428
|
54
54
|
streamlit/components/v1/component_registry.py,sha256=OfrYqNhRYy0gVD22k5QhEne8mYcq1kWGmb71TjW5ZeQ,4791
|
55
|
-
streamlit/components/v1/components.py,sha256
|
55
|
+
streamlit/components/v1/components.py,sha256=-fyYz9yOIILGHUFqICLipl7HAK-2NUWGcBFcQa4L3Sk,1585
|
56
56
|
streamlit/components/v1/custom_component.py,sha256=-JaDuFjEBX98dL74IDWSx1k4x_a0YdO0XdnEb1O-W8U,9397
|
57
57
|
streamlit/connections/__init__.py,sha256=WSOEtrwhiNYti89iCk3O7I83rurZl8gXoM8tA2d_E-U,1083
|
58
58
|
streamlit/connections/base_connection.py,sha256=0BRLiQFe1H5j1CqVPgIlbtpXpeEgRLsoZhCIDUtB1P4,7465
|
@@ -67,7 +67,7 @@ streamlit/elements/balloons.py,sha256=QnORgG96Opga1SVg8tUBOm-l3nMpKWmjvy1crcS2Xa
|
|
67
67
|
streamlit/elements/bokeh_chart.py,sha256=OdeJgmyiWH08QninHYQerxSOCyS1TcEwAqfgTuR0xzo,4196
|
68
68
|
streamlit/elements/code.py,sha256=f1Zgzr9K2oRqKzry7BIhQsCuuKsZoPllMbBksXgLu68,2480
|
69
69
|
streamlit/elements/deck_gl_json_chart.py,sha256=BDDnDCap8cXh8De9obzyUCNyUuIr9Gpe4X6urdfe9fM,7067
|
70
|
-
streamlit/elements/dialog_decorator.py,sha256=
|
70
|
+
streamlit/elements/dialog_decorator.py,sha256=iRjF4VPlZ5E7uePQlNTdMul7g5TxVj6fspZrdB1uOTk,8884
|
71
71
|
streamlit/elements/doc_string.py,sha256=hJToDyDVMB6AmAUd8tEjpRXzRUptDXXRHiw2V_mYjBg,16172
|
72
72
|
streamlit/elements/empty.py,sha256=SN94_NJJxW0nMZ-w0XDbpN5h0urdAZi8pQFTslgmSAA,3853
|
73
73
|
streamlit/elements/exception.py,sha256=KcaQP2pvpkKzbXRYTb6lNetY8KDpD-74Aqh_1uP3SGM,8948
|
@@ -77,7 +77,7 @@ streamlit/elements/heading.py,sha256=CEsHuPds-vMWBlai8g_kpuqm0ecc1zEWwHiNol9YyYs
|
|
77
77
|
streamlit/elements/html.py,sha256=PN9iw2jaRObDlqGzH2RwuzQr8rr3EInKnI4RelXVYfg,2717
|
78
78
|
streamlit/elements/iframe.py,sha256=HwfwNQmlN9kmylqLbXEkUb_44ei36UxyZB7hWiSLNDY,5780
|
79
79
|
streamlit/elements/image.py,sha256=SJHJwRdT_fleqLTVDkIshG5tHz9fBl8Oht4wwHBN064,20450
|
80
|
-
streamlit/elements/json.py,sha256=
|
80
|
+
streamlit/elements/json.py,sha256=k9W0gzkqh4Y4RUPb6_z-m8EOekwpXpX4GceCl6tDet8,3670
|
81
81
|
streamlit/elements/layouts.py,sha256=HlSgU72g354eB7LI6jblllsFknkuuMJdpgIwfN-Me5k,31990
|
82
82
|
streamlit/elements/map.py,sha256=8ftqFn2MZntMyfsIsu5AIXgEv7XKr6EbyJpAQZwew1M,16491
|
83
83
|
streamlit/elements/markdown.py,sha256=stnmlEXKr4jMGkzMDvSgUhFSvd2--AWznPTlZu2YqK0,10513
|
@@ -91,7 +91,7 @@ streamlit/elements/spinner.py,sha256=qhA0DZo3ZEYQswFYuNdaXltenvmJR_18mqDQA64bK_Q
|
|
91
91
|
streamlit/elements/text.py,sha256=_OePOPcWymPrYoey6BFeB6IvjTmnUszFS9W0veUu3LA,1856
|
92
92
|
streamlit/elements/toast.py,sha256=Or7FvYir6slVm27R36AUvpDEfz9nSg_8p0OMBRaSVIM,4341
|
93
93
|
streamlit/elements/vega_charts.py,sha256=1q26hmDsvkW25wFrun1xls5Ub3OMuKjPNYpP9Mfg478,76738
|
94
|
-
streamlit/elements/write.py,sha256=
|
94
|
+
streamlit/elements/write.py,sha256=XIGk9MKY7LzqvYLSYXhH3zsjZRSPPo41qdTDVFZx--k,21159
|
95
95
|
streamlit/elements/lib/__init__.py,sha256=Vrf1yVMOcTyhUPnYvsfyeL96Vpd5z8KoSV5ZzTcTQgU,616
|
96
96
|
streamlit/elements/lib/built_in_chart_utils.py,sha256=XC-uI9OI7DMtTzvV3uw1l9f55nBkp3ovpnQJ3OHxQ8Q,37473
|
97
97
|
streamlit/elements/lib/column_config_utils.py,sha256=9VHWZyy5wygizR1H_LXHmVWfhNn-DwxBTbQgZMBhF8c,17384
|
@@ -110,7 +110,7 @@ streamlit/elements/widgets/__init__.py,sha256=Vrf1yVMOcTyhUPnYvsfyeL96Vpd5z8KoSV
|
|
110
110
|
streamlit/elements/widgets/button.py,sha256=0aFDKQW6hFMAOQm3iE_OD5102JNjKPflvUUPfevKavQ,34178
|
111
111
|
streamlit/elements/widgets/button_group.py,sha256=pNOihaGKQV7WnxSdU2SYGYzWDYJ0isMA4qhZzy0SZOI,15018
|
112
112
|
streamlit/elements/widgets/camera_input.py,sha256=LZp8sqM9TlmLC654M2wpvOLCM9TnEIK3X-UfXMjl444,9119
|
113
|
-
streamlit/elements/widgets/chat.py,sha256=
|
113
|
+
streamlit/elements/widgets/chat.py,sha256=ZmtrDtTHK3P2JeRQ7B4AnrAZMwG1sDria3NdEwKO2Zc,14244
|
114
114
|
streamlit/elements/widgets/checkbox.py,sha256=5ev_uRBIvoWgIpj9jjGjvIweem1oIXYr_VOk6IUGJn0,12517
|
115
115
|
streamlit/elements/widgets/color_picker.py,sha256=IUN_YnQvR9Xd3CdhgReKISMBa2TJVzGx02XPfr9wECU,9130
|
116
116
|
streamlit/elements/widgets/data_editor.py,sha256=BCbmXKUaNdMYeZdU0Kg4qdqZKpQy4HOftMJ2yjFlfEA,35109
|
@@ -292,18 +292,19 @@ streamlit/proto/__init__.py,sha256=tM42Nl1HAphMoWU8F7noymVPJLj3dEnqqIitEQCr2XE,6
|
|
292
292
|
streamlit/proto/openmetrics_data_model_pb2.py,sha256=dWlhXENjgvIGCMnAumDVQkLA4TQQzP77G5pncI6oP9I,6424
|
293
293
|
streamlit/proto/openmetrics_data_model_pb2.pyi,sha256=dmABrepaNR5S9kA1UPfQGXqY_ARAUuLmQBqG1Xn_HUY,20319
|
294
294
|
streamlit/runtime/__init__.py,sha256=Xx5OVY9Nv8Z6ndbYtJBm3lgR2pn83omEOlDaSl9V2dE,1523
|
295
|
-
streamlit/runtime/app_session.py,sha256=
|
295
|
+
streamlit/runtime/app_session.py,sha256=KpTGYTLLp-0k6G74Hig5On3axisITgRGQsFauFKPgOE,36944
|
296
296
|
streamlit/runtime/connection_factory.py,sha256=20-GrwBjmPz2CnOhWbq3MYHc-Ouyce9EuXBqCHEqsls,12503
|
297
|
+
streamlit/runtime/context.py,sha256=S0b3zhQTOWuQiemaI6GHrtgHi5Efuj5jRB-RjIItnx0,5428
|
297
298
|
streamlit/runtime/credentials.py,sha256=oMUw4SWHMbk-b4Z7tGWWLQIZBsFF-4xDBjbxzNNJ8x8,11333
|
298
299
|
streamlit/runtime/forward_msg_cache.py,sha256=Oj-c3BhTRLrXhGBzX21ioq8gTsN4nqjyRL0jr4TqlZk,9750
|
299
|
-
streamlit/runtime/forward_msg_queue.py,sha256=
|
300
|
-
streamlit/runtime/fragment.py,sha256=
|
300
|
+
streamlit/runtime/forward_msg_queue.py,sha256=_mt7blw9COMr4fbxUng1rGhMixDj8c0SNz5SmTf9-R4,6455
|
301
|
+
streamlit/runtime/fragment.py,sha256=_3a3VQjWVvFlnoU7x_9t5pl2Oo9l-mnhlnPHzt5YjEY,18300
|
301
302
|
streamlit/runtime/media_file_manager.py,sha256=3oHbB6Hs9wMa6z6tuF1NkyQkUaBOm8V6ogWxj56IcS8,8508
|
302
303
|
streamlit/runtime/media_file_storage.py,sha256=hQkMC__XRjshEUD73QCSrX3vrfOOO0U7Vf1Uc6qiP90,4375
|
303
304
|
streamlit/runtime/memory_media_file_storage.py,sha256=9jzWImu9qCUGbJ61c4UhkxRSAPvHLFxNdaPiICPKQtU,6277
|
304
305
|
streamlit/runtime/memory_session_storage.py,sha256=Tx-_3oUg6i9UokpBUIWvqhpWE0WmjtX764KdOzNvDMs,2940
|
305
306
|
streamlit/runtime/memory_uploaded_file_manager.py,sha256=rCLvdZv2nPlWeCiHnwV8phcVV43mUCgW7BaWkmEXgpM,4422
|
306
|
-
streamlit/runtime/metrics_util.py,sha256=
|
307
|
+
streamlit/runtime/metrics_util.py,sha256=DHKsHskBVpWxCr-tZI6eGbJrs6SLjN1AwKm4fO1DBPs,15234
|
307
308
|
streamlit/runtime/pages_manager.py,sha256=86GpkkRCNxRsgH-Kq10GLmjsTPgKX-ua42YfL8CsLq8,14123
|
308
309
|
streamlit/runtime/runtime.py,sha256=gUDK50PLzY3xdX1KpHeXM1nVTmtSmNtDPNYsccU7g-0,29334
|
309
310
|
streamlit/runtime/runtime_util.py,sha256=pPgc524cnmjVffZp_QuH3Yql8TFxuSs23gjnv7gIhqk,4021
|
@@ -329,21 +330,21 @@ streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py,sha256=VT5D
|
|
329
330
|
streamlit/runtime/caching/storage/local_disk_cache_storage.py,sha256=twJksa2WB274njsSP2vJM0JgfUC5OGm_4-hvtGVpePE,9311
|
330
331
|
streamlit/runtime/scriptrunner/__init__.py,sha256=HAmTKizs3IUFHbhNP2N6dzD12LL3wmueBj5ybRJenBE,1191
|
331
332
|
streamlit/runtime/scriptrunner/exceptions.py,sha256=X2kyp8MUnF6hPkYp54cM6Cerumqw6PdcZhafycqa71E,1363
|
332
|
-
streamlit/runtime/scriptrunner/exec_code.py,sha256=
|
333
|
+
streamlit/runtime/scriptrunner/exec_code.py,sha256=LR0dGRd0IYgtj1l3pFMExWnb9JULW8ioUm-MgU3rjfo,4247
|
333
334
|
streamlit/runtime/scriptrunner/magic.py,sha256=p1H8UiSoTSryirl8jf1-jpba8a1NvmlKngyZo_QNbPE,9080
|
334
335
|
streamlit/runtime/scriptrunner/magic_funcs.py,sha256=_npS_w-0riPNr1-dPyOSjqrwTXoeSR-gXWFkChQ5Yjc,1056
|
335
336
|
streamlit/runtime/scriptrunner/script_cache.py,sha256=ZpaB4T50_GYfhMc2dajSMXWCmS3kaUJ_tPHNVt_flBg,2856
|
336
|
-
streamlit/runtime/scriptrunner/script_requests.py,sha256=
|
337
|
-
streamlit/runtime/scriptrunner/script_run_context.py,sha256=
|
338
|
-
streamlit/runtime/scriptrunner/script_runner.py,sha256=
|
337
|
+
streamlit/runtime/scriptrunner/script_requests.py,sha256=2l3LEMZcdMlXjIHhflnl0IzK_cOfCuRnnIBHcaxt87Q,9640
|
338
|
+
streamlit/runtime/scriptrunner/script_run_context.py,sha256=xLdG3yjF8YxYYD_mnLeLSMDUFz8MRCCH9pwy02RbtwQ,9289
|
339
|
+
streamlit/runtime/scriptrunner/script_runner.py,sha256=jKRFr51Q90ydXD7QFOqttJE-3R1uV2ym9J-QABaOUWQ,28210
|
339
340
|
streamlit/runtime/state/__init__.py,sha256=UpfNfPrWJ6rVdD-qc0IP_bwZ4MrcNUjyU9wEKDK-eWM,1528
|
340
341
|
streamlit/runtime/state/common.py,sha256=1JvRTK7O-QRcsyRztyHaCZjix0WAi4wz0KlpXaldeEE,9963
|
341
342
|
streamlit/runtime/state/query_params.py,sha256=cESFE1Jq4oN6YpgocUsX0f1sSHMyGRoupbxm9X6v3NM,7477
|
342
343
|
streamlit/runtime/state/query_params_proxy.py,sha256=gxaCF6-jmoM8HWXwQOdC6XgVjVdIYtqiicG3I2hQsLk,7152
|
343
344
|
streamlit/runtime/state/safe_session_state.py,sha256=WLFFyMtP4F19TWWBarKtSP942IepI2eeSBhifwbuFgY,5222
|
344
|
-
streamlit/runtime/state/session_state.py,sha256=
|
345
|
+
streamlit/runtime/state/session_state.py,sha256=n3LCo_S6l5R_e9ZcWBH8O_Tpovd3lM70DRHPtN5iAfA,27506
|
345
346
|
streamlit/runtime/state/session_state_proxy.py,sha256=7_GtKF6niHIxzynZyUtYgBg4FG-pDyasixu--1vP1Y0,5482
|
346
|
-
streamlit/runtime/state/widgets.py,sha256=
|
347
|
+
streamlit/runtime/state/widgets.py,sha256=Gdw5ui1MbtkExLvn-TOO2H2nXgLsoqjBbXdC-HV89rU,12352
|
347
348
|
streamlit/static/asset-manifest.json,sha256=yUYOF0VFywwHftzjYL6AlHyTgVD8j63QEsz7jN6FMC4,14429
|
348
349
|
streamlit/static/favicon.png,sha256=if5cVgw7azxKOvV5FpGixga7JLn23rfnHcy1CdWI1-E,1019
|
349
350
|
streamlit/static/index.html,sha256=v365Goc4UyU8d-PsZIT1u60z5QQ5F3mf4illeS5Wl1U,891
|
@@ -534,10 +535,10 @@ streamlit/web/server/server.py,sha256=KuwMMQ_9HEbYE6_T_9G18mdCJSlAbr7zg4ZYLQPzVs
|
|
534
535
|
streamlit/web/server/server_util.py,sha256=C3M971XFoEXTMufQLwHbZdtZOE30nWx-2WiXmvX_6fE,4197
|
535
536
|
streamlit/web/server/stats_request_handler.py,sha256=47nQHe4ETsO9QS9FAEUF8rZigU_k5eACJZw4-jc8U6c,3684
|
536
537
|
streamlit/web/server/upload_file_request_handler.py,sha256=ftyKpARrUjOpRcFETIXuoTyOG_mo-ToOw5NI0y_W4lE,5003
|
537
|
-
streamlit/web/server/websocket_headers.py,sha256=
|
538
|
-
streamlit_nightly-1.36.1.
|
539
|
-
streamlit_nightly-1.36.1.
|
540
|
-
streamlit_nightly-1.36.1.
|
541
|
-
streamlit_nightly-1.36.1.
|
542
|
-
streamlit_nightly-1.36.1.
|
543
|
-
streamlit_nightly-1.36.1.
|
538
|
+
streamlit/web/server/websocket_headers.py,sha256=xkmLm7-WyXyQM8fW-NuURBnD_rmQaiO3oBlu6woF71w,2207
|
539
|
+
streamlit_nightly-1.36.1.dev20240716.data/scripts/streamlit.cmd,sha256=ZEYM3vBJSp-k7vwSJ3ba5NzEk9-qHdSeLvGYAAe1mMw,676
|
540
|
+
streamlit_nightly-1.36.1.dev20240716.dist-info/METADATA,sha256=CTEzUqJbkwGIvqctYHU13VeQUj9cZm96Tn9Zvvgj_ho,8531
|
541
|
+
streamlit_nightly-1.36.1.dev20240716.dist-info/WHEEL,sha256=pWvVuNuBTVmNV7Lp2jMAgt1NplTICeFdl1SW8U3MWN4,109
|
542
|
+
streamlit_nightly-1.36.1.dev20240716.dist-info/entry_points.txt,sha256=uNJ4DwGNXEhOK0USwSNanjkYyR-Bk7eYQbJFDrWyOgY,53
|
543
|
+
streamlit_nightly-1.36.1.dev20240716.dist-info/top_level.txt,sha256=V3FhKbm7G2LnR0s4SytavrjIPNIhvcsAGXfYHAwtQzw,10
|
544
|
+
streamlit_nightly-1.36.1.dev20240716.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|