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.
Files changed (27) hide show
  1. streamlit/__init__.py +27 -6
  2. streamlit/commands/execution_control.py +71 -10
  3. streamlit/components/v1/components.py +15 -2
  4. streamlit/delta_generator.py +3 -3
  5. streamlit/elements/dialog_decorator.py +59 -25
  6. streamlit/elements/json.py +11 -1
  7. streamlit/elements/widgets/chat.py +3 -2
  8. streamlit/elements/write.py +11 -2
  9. streamlit/errors.py +15 -0
  10. streamlit/runtime/app_session.py +15 -13
  11. streamlit/runtime/context.py +157 -0
  12. streamlit/runtime/forward_msg_queue.py +1 -0
  13. streamlit/runtime/fragment.py +129 -44
  14. streamlit/runtime/metrics_util.py +3 -1
  15. streamlit/runtime/scriptrunner/exec_code.py +16 -36
  16. streamlit/runtime/scriptrunner/script_requests.py +63 -22
  17. streamlit/runtime/scriptrunner/script_run_context.py +3 -3
  18. streamlit/runtime/scriptrunner/script_runner.py +27 -6
  19. streamlit/runtime/state/session_state.py +6 -2
  20. streamlit/runtime/state/widgets.py +20 -8
  21. streamlit/web/server/websocket_headers.py +9 -0
  22. {streamlit_nightly-1.36.1.dev20240714.dist-info → streamlit_nightly-1.36.1.dev20240716.dist-info}/METADATA +1 -1
  23. {streamlit_nightly-1.36.1.dev20240714.dist-info → streamlit_nightly-1.36.1.dev20240716.dist-info}/RECORD +27 -26
  24. {streamlit_nightly-1.36.1.dev20240714.data → streamlit_nightly-1.36.1.dev20240716.data}/scripts/streamlit.cmd +0 -0
  25. {streamlit_nightly-1.36.1.dev20240714.dist-info → streamlit_nightly-1.36.1.dev20240716.dist-info}/WHEEL +0 -0
  26. {streamlit_nightly-1.36.1.dev20240714.dist-info → streamlit_nightly-1.36.1.dev20240716.dist-info}/entry_points.txt +0 -0
  27. {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.fragment_id_queue:
125
- # This RERUN request corresponds to a fragment run. We append the
126
- # new fragment ID to the end of the current fragment_id_queue if it
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
- if (
130
- # new_data.fragment_id_queue is always a singleton
131
- (new_fragment_id := new_data.fragment_id_queue[0])
132
- not in fragment_id_queue
133
- ):
134
- fragment_id_queue.append(new_fragment_id)
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 and set our internal
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 self._rerun_data.fragment_id_queue
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 of having no request and
172
- # having a RERUN request corresponding to >=1 fragments. If a STOP or
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
- if self._rerun_data.fragment_id_queue:
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
- fragment_ids_this_run: set[str] | None = None
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 = 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 KeyError:
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
- ctx.fragment_ids_this_run,
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
- ctx.fragment_ids_this_run,
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 = [("trigger_value", False), ("string_trigger_value", None)]
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.trigger_value != unset_value
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
- if (
259
- new_trigger_val
260
- and new_trigger_val.WhichOneof("value") == trigger_value_type
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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: streamlit-nightly
3
- Version: 1.36.1.dev20240714
3
+ Version: 1.36.1.dev20240716
4
4
  Summary: A faster way to build and share data apps
5
5
  Home-page: https://streamlit.io
6
6
  Author: Snowflake Inc
@@ -1,4 +1,4 @@
1
- streamlit/__init__.py,sha256=4Qf4bjv3DC2Kkts_X1q3BgpDa9-Zal__TKexTB168v0,8354
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=SGh6pTYYN5zjrlXxkTAlN0Rbwdx4K_fZ6B9bvUj0BDo,28492
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=ks4wM1303LNLvviFL6fk5ziGjEsDWPsEc5tQFwIp-ms,3213
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=_ChWFk19P0uWhvAhJ-jfPevF7rwnFbNLCH0L6Kfcxsk,5607
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=xyJSWP81OPAybRY2G4oLgBLdqAzX-hoY-Ib6Wi90Jdw,1335
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=RhV5Nou1twyWmRRBbzasYkBCqY238BpFV8fbhRHh7po,8228
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=Fr3a2zcxWXH1aqV_SyJfdZWr48UQggELxtkO0Wr-K8Q,3431
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=x0IVoFA_V9jj1JZFTXzTM1gEuofO6MSD03BwCsWFrng,20875
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=vzuqbVJVBiwxdL6ZogMPgHsmiJGaH_iRE9VUqkenhEI,14225
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=KSPPLUWtKukTv_r7NLyN6VYKunkGPllF2eh87I2z81o,37082
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=xiH-ZRVOswiABLEyChJbfkIGBACy2l8nQKueL6bkrJc,6420
300
- streamlit/runtime/fragment.py,sha256=6g_-Ehn6lSrbfJhMPAokUJLB20J9qjTQ_O6LDZurMEU,14698
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=mpKjjwzls3rjgCmJqOjvO_UE5H9CWmX1N4aVajz5pc4,15176
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=8lZfvjDahKKqP0UrCdnL-co25bfyvQmR7DYX24UpEBM,5194
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=2QSboPtHbwm5erUiU-cjJ4DJGlTTkE0mpFLBr6cMjFQ,8065
337
- streamlit/runtime/scriptrunner/script_run_context.py,sha256=joIcYJilC5MSV6GKy_2mpQMk-3VG0amtxOYf5af54Dc,9313
338
- streamlit/runtime/scriptrunner/script_runner.py,sha256=uzd4-rZAbhHkjRHD1MSceqmV1EPJ8hcTWYX7701beVo,26910
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=BCZdr2Cv8HPU9L4JOPmMWY5rJShXzdPi0EnmXZamNXQ,27380
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=F_uEjGT-zpaCh8TGrhN5fT1J0LM8j54OUl1FCRXRoRQ,11461
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=07SkWLcOxbyldl7UcBzrMKY9ZojypCQACiKoh5FcH7Y,1870
538
- streamlit_nightly-1.36.1.dev20240714.data/scripts/streamlit.cmd,sha256=ZEYM3vBJSp-k7vwSJ3ba5NzEk9-qHdSeLvGYAAe1mMw,676
539
- streamlit_nightly-1.36.1.dev20240714.dist-info/METADATA,sha256=v8g-yXEzC4GPBp8JpRzpQ99uF29mDUnkxbG8iTjcdbs,8531
540
- streamlit_nightly-1.36.1.dev20240714.dist-info/WHEEL,sha256=pWvVuNuBTVmNV7Lp2jMAgt1NplTICeFdl1SW8U3MWN4,109
541
- streamlit_nightly-1.36.1.dev20240714.dist-info/entry_points.txt,sha256=uNJ4DwGNXEhOK0USwSNanjkYyR-Bk7eYQbJFDrWyOgY,53
542
- streamlit_nightly-1.36.1.dev20240714.dist-info/top_level.txt,sha256=V3FhKbm7G2LnR0s4SytavrjIPNIhvcsAGXfYHAwtQzw,10
543
- streamlit_nightly-1.36.1.dev20240714.dist-info/RECORD,,
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,,