streamlit-nightly 1.38.1.dev20240916__py2.py3-none-any.whl → 1.38.1.dev20240917__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/runtime/state/session_state.py +62 -17
- {streamlit_nightly-1.38.1.dev20240916.dist-info → streamlit_nightly-1.38.1.dev20240917.dist-info}/METADATA +1 -1
- {streamlit_nightly-1.38.1.dev20240916.dist-info → streamlit_nightly-1.38.1.dev20240917.dist-info}/RECORD +7 -7
- {streamlit_nightly-1.38.1.dev20240916.data → streamlit_nightly-1.38.1.dev20240917.data}/scripts/streamlit.cmd +0 -0
- {streamlit_nightly-1.38.1.dev20240916.dist-info → streamlit_nightly-1.38.1.dev20240917.dist-info}/WHEEL +0 -0
- {streamlit_nightly-1.38.1.dev20240916.dist-info → streamlit_nightly-1.38.1.dev20240917.dist-info}/entry_points.txt +0 -0
- {streamlit_nightly-1.38.1.dev20240916.dist-info → streamlit_nightly-1.38.1.dev20240917.dist-info}/top_level.txt +0 -0
@@ -280,6 +280,56 @@ def _missing_key_error_message(key: str) -> str:
|
|
280
280
|
)
|
281
281
|
|
282
282
|
|
283
|
+
@dataclass
|
284
|
+
class KeyIdMapper:
|
285
|
+
"""A mapping of user-provided keys to element IDs.
|
286
|
+
It also maps element IDs to user-provided keys so that this reverse mapping
|
287
|
+
does not have to be computed ad-hoc.
|
288
|
+
All built-in dict-operations such as setting and deleting expect the key as the
|
289
|
+
argument, not the element ID.
|
290
|
+
"""
|
291
|
+
|
292
|
+
_key_id_mapping: dict[str, str] = field(default_factory=dict)
|
293
|
+
_id_key_mapping: dict[str, str] = field(default_factory=dict)
|
294
|
+
|
295
|
+
def __contains__(self, key: str) -> bool:
|
296
|
+
return key in self._key_id_mapping
|
297
|
+
|
298
|
+
def __setitem__(self, key: str, widget_id: Any) -> None:
|
299
|
+
self._key_id_mapping[key] = widget_id
|
300
|
+
self._id_key_mapping[widget_id] = key
|
301
|
+
|
302
|
+
def __delitem__(self, key: str) -> None:
|
303
|
+
self.delete(key)
|
304
|
+
|
305
|
+
@property
|
306
|
+
def id_key_mapping(self) -> dict[str, str]:
|
307
|
+
return self._id_key_mapping
|
308
|
+
|
309
|
+
def set_key_id_mapping(self, key_id_mapping: dict[str, str]) -> None:
|
310
|
+
self._key_id_mapping = key_id_mapping
|
311
|
+
self._id_key_mapping = {v: k for k, v in key_id_mapping.items()}
|
312
|
+
|
313
|
+
def get_id_from_key(self, key: str, default: Any = None) -> str:
|
314
|
+
return self._key_id_mapping.get(key, default)
|
315
|
+
|
316
|
+
def get_key_from_id(self, widget_id: str) -> str:
|
317
|
+
return self._id_key_mapping[widget_id]
|
318
|
+
|
319
|
+
def update(self, other: KeyIdMapper) -> None:
|
320
|
+
self._key_id_mapping.update(other._key_id_mapping)
|
321
|
+
self._id_key_mapping.update(other._id_key_mapping)
|
322
|
+
|
323
|
+
def clear(self):
|
324
|
+
self._key_id_mapping.clear()
|
325
|
+
self._id_key_mapping.clear()
|
326
|
+
|
327
|
+
def delete(self, key: str):
|
328
|
+
widget_id = self._key_id_mapping[key]
|
329
|
+
del self._key_id_mapping[key]
|
330
|
+
del self._id_key_mapping[widget_id]
|
331
|
+
|
332
|
+
|
283
333
|
@dataclass
|
284
334
|
class SessionState:
|
285
335
|
"""SessionState allows users to store values that persist between app
|
@@ -308,10 +358,11 @@ class SessionState:
|
|
308
358
|
# Widget values from the frontend, usually one changing prompted the script rerun
|
309
359
|
_new_widget_state: WStates = field(default_factory=WStates)
|
310
360
|
|
311
|
-
# Keys used for widgets will be eagerly converted to the matching
|
312
|
-
|
361
|
+
# Keys used for widgets will be eagerly converted to the matching element id
|
362
|
+
_key_id_mapper: KeyIdMapper = field(default_factory=KeyIdMapper)
|
313
363
|
|
314
|
-
# query params are stored in session state because query params will be tied with
|
364
|
+
# query params are stored in session state because query params will be tied with
|
365
|
+
# widget state at one point.
|
315
366
|
query_params: QueryParams = field(default_factory=QueryParams)
|
316
367
|
|
317
368
|
def __repr__(self):
|
@@ -338,13 +389,13 @@ class SessionState:
|
|
338
389
|
self._old_state.clear()
|
339
390
|
self._new_session_state.clear()
|
340
391
|
self._new_widget_state.clear()
|
341
|
-
self.
|
392
|
+
self._key_id_mapper.clear()
|
342
393
|
|
343
394
|
@property
|
344
395
|
def filtered_state(self) -> dict[str, Any]:
|
345
396
|
"""The combined session and widget state, excluding keyless widgets."""
|
346
397
|
|
347
|
-
wid_key_map = self.
|
398
|
+
wid_key_map = self._key_id_mapper.id_key_mapping
|
348
399
|
|
349
400
|
state: dict[str, Any] = {}
|
350
401
|
|
@@ -366,12 +417,6 @@ class SessionState:
|
|
366
417
|
|
367
418
|
return state
|
368
419
|
|
369
|
-
@property
|
370
|
-
def _reverse_key_wid_map(self) -> dict[str, str]:
|
371
|
-
"""Return a mapping of widget_id : widget_key."""
|
372
|
-
wid_key_map = {v: k for k, v in self._key_id_mapping.items()}
|
373
|
-
return wid_key_map
|
374
|
-
|
375
420
|
def _keys(self) -> set[str]:
|
376
421
|
"""All keys active in Session State, with widget keys converted
|
377
422
|
to widget ids when one is known. (This includes autogenerated keys
|
@@ -400,7 +445,7 @@ class SessionState:
|
|
400
445
|
return len(self._keys())
|
401
446
|
|
402
447
|
def __getitem__(self, key: str) -> Any:
|
403
|
-
wid_key_map = self.
|
448
|
+
wid_key_map = self._key_id_mapper.id_key_mapping
|
404
449
|
widget_id = self._get_widget_id(key)
|
405
450
|
|
406
451
|
if widget_id in wid_key_map and widget_id == key:
|
@@ -463,7 +508,7 @@ class SessionState:
|
|
463
508
|
ctx = get_script_run_ctx()
|
464
509
|
|
465
510
|
if ctx is not None:
|
466
|
-
widget_id = self.
|
511
|
+
widget_id = self._key_id_mapper.get_id_from_key(user_key, None)
|
467
512
|
widget_ids = ctx.widget_ids_this_run
|
468
513
|
form_ids = ctx.form_ids_this_run
|
469
514
|
|
@@ -487,8 +532,8 @@ class SessionState:
|
|
487
532
|
if key in self._old_state:
|
488
533
|
del self._old_state[key]
|
489
534
|
|
490
|
-
if key in self.
|
491
|
-
|
535
|
+
if key in self._key_id_mapper:
|
536
|
+
self._key_id_mapper.delete(key)
|
492
537
|
|
493
538
|
if widget_id in self._new_widget_state:
|
494
539
|
del self._new_widget_state[widget_id]
|
@@ -608,10 +653,10 @@ class SessionState:
|
|
608
653
|
"""Turns a value that might be a widget id or a user provided key into
|
609
654
|
an appropriate widget id.
|
610
655
|
"""
|
611
|
-
return self.
|
656
|
+
return self._key_id_mapper.get_id_from_key(k, k)
|
612
657
|
|
613
658
|
def _set_key_widget_mapping(self, widget_id: str, user_key: str) -> None:
|
614
|
-
self.
|
659
|
+
self._key_id_mapper[user_key] = widget_id
|
615
660
|
|
616
661
|
def register_widget(
|
617
662
|
self, metadata: WidgetMetadata[T], user_key: str | None
|
@@ -341,7 +341,7 @@ streamlit/runtime/state/common.py,sha256=0yt_5A245enbYCLbWp5NO6inc5SrtISvaEyjoXz
|
|
341
341
|
streamlit/runtime/state/query_params.py,sha256=kCNQI99ctEGY7B2q49D9RM1vGGlZn9b4IqTxtMM9BJs,7507
|
342
342
|
streamlit/runtime/state/query_params_proxy.py,sha256=_DJnRsoZmIUpeNXP_9Ixa4GrU4xZ9E1t5ixDyDKJ0fM,7155
|
343
343
|
streamlit/runtime/state/safe_session_state.py,sha256=WLFFyMtP4F19TWWBarKtSP942IepI2eeSBhifwbuFgY,5222
|
344
|
-
streamlit/runtime/state/session_state.py,sha256=
|
344
|
+
streamlit/runtime/state/session_state.py,sha256=SMBWsSZY29jAgL3QfX4xvJr9aLCNrHHUz9AmosX7FlQ,28850
|
345
345
|
streamlit/runtime/state/session_state_proxy.py,sha256=IWF43f6UWL4KyxNWF3aTv1sbykNI2hI5UsPF2UIfpdE,5524
|
346
346
|
streamlit/runtime/state/widgets.py,sha256=BS7Xq0kFbu7N2tFEm5zlcDPCpDYhM09grH7Nf7DNvfg,6620
|
347
347
|
streamlit/static/asset-manifest.json,sha256=GJGkwGxH0qjB8lbYiz4EkisFpXk5sJL12zoti1ySVEo,14497
|
@@ -538,9 +538,9 @@ streamlit/web/server/server_util.py,sha256=C3M971XFoEXTMufQLwHbZdtZOE30nWx-2WiXm
|
|
538
538
|
streamlit/web/server/stats_request_handler.py,sha256=e144zIhzLTB1PN4CwTCxElCoWMuo9IsBEPex2exHCQ0,3641
|
539
539
|
streamlit/web/server/upload_file_request_handler.py,sha256=ftyKpARrUjOpRcFETIXuoTyOG_mo-ToOw5NI0y_W4lE,5003
|
540
540
|
streamlit/web/server/websocket_headers.py,sha256=uUxypj04ondEC4ocBiYCndX_N06Zwe1Mt690Vupe08Y,2232
|
541
|
-
streamlit_nightly-1.38.1.
|
542
|
-
streamlit_nightly-1.38.1.
|
543
|
-
streamlit_nightly-1.38.1.
|
544
|
-
streamlit_nightly-1.38.1.
|
545
|
-
streamlit_nightly-1.38.1.
|
546
|
-
streamlit_nightly-1.38.1.
|
541
|
+
streamlit_nightly-1.38.1.dev20240917.data/scripts/streamlit.cmd,sha256=ZEYM3vBJSp-k7vwSJ3ba5NzEk9-qHdSeLvGYAAe1mMw,676
|
542
|
+
streamlit_nightly-1.38.1.dev20240917.dist-info/METADATA,sha256=pHxJA_x2W9lCXO6NMUJ134DRYUOrekdrN77w_dTZwU4,8512
|
543
|
+
streamlit_nightly-1.38.1.dev20240917.dist-info/WHEEL,sha256=AHX6tWk3qWuce7vKLrj7lnulVHEdWoltgauo8bgCXgU,109
|
544
|
+
streamlit_nightly-1.38.1.dev20240917.dist-info/entry_points.txt,sha256=uNJ4DwGNXEhOK0USwSNanjkYyR-Bk7eYQbJFDrWyOgY,53
|
545
|
+
streamlit_nightly-1.38.1.dev20240917.dist-info/top_level.txt,sha256=V3FhKbm7G2LnR0s4SytavrjIPNIhvcsAGXfYHAwtQzw,10
|
546
|
+
streamlit_nightly-1.38.1.dev20240917.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|