streamlit-nightly 1.32.3.dev20240325__py2.py3-none-any.whl → 1.32.3.dev20240326__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.
@@ -16,6 +16,7 @@ from __future__ import annotations
16
16
 
17
17
  import io
18
18
  import re
19
+ from datetime import timedelta
19
20
  from pathlib import Path
20
21
  from typing import TYPE_CHECKING, Dict, Final, Union, cast
21
22
 
@@ -29,6 +30,7 @@ from streamlit.proto.Audio_pb2 import Audio as AudioProto
29
30
  from streamlit.proto.Video_pb2 import Video as VideoProto
30
31
  from streamlit.runtime import caching
31
32
  from streamlit.runtime.metrics_util import gather_metrics
33
+ from streamlit.runtime.runtime_util import duration_to_seconds
32
34
 
33
35
  if TYPE_CHECKING:
34
36
  from typing import Any
@@ -45,6 +47,16 @@ SubtitleData: TypeAlias = Union[
45
47
  str, Path, bytes, io.BytesIO, Dict[str, Union[str, Path, bytes, io.BytesIO]], None
46
48
  ]
47
49
 
50
+ MediaTime: TypeAlias = Union[int, float, timedelta, str]
51
+
52
+ TIMEDELTA_PARSE_ERROR_MESSAGE: Final = (
53
+ "Failed to convert '{param_name}' to a timedelta. "
54
+ "Please use a string in a format supported by "
55
+ "[Pandas Timedelta constructor]"
56
+ "(https://pandas.pydata.org/docs/reference/api/pandas.Timedelta.html), "
57
+ 'e.g. `"10s"`, `"15 seconds"`, or `"1h23s"`. Got: {param_value}'
58
+ )
59
+
48
60
 
49
61
  class MediaMixin:
50
62
  @gather_metrics("audio")
@@ -52,10 +64,10 @@ class MediaMixin:
52
64
  self,
53
65
  data: MediaData,
54
66
  format: str = "audio/wav",
55
- start_time: int = 0,
67
+ start_time: MediaTime = 0,
56
68
  *,
57
69
  sample_rate: int | None = None,
58
- end_time: int | None = None,
70
+ end_time: MediaTime | None = None,
59
71
  loop: bool = False,
60
72
  ) -> DeltaGenerator:
61
73
  """Display an audio player.
@@ -111,6 +123,8 @@ class MediaMixin:
111
123
  height: 865px
112
124
 
113
125
  """
126
+ start_time, end_time = _parse_start_time_end_time(start_time, end_time)
127
+
114
128
  audio_proto = AudioProto()
115
129
  coordinates = self.dg._get_delta_path_str()
116
130
 
@@ -143,10 +157,10 @@ class MediaMixin:
143
157
  self,
144
158
  data: MediaData,
145
159
  format: str = "video/mp4",
146
- start_time: int = 0,
160
+ start_time: MediaTime = 0,
147
161
  *, # keyword-only arguments:
148
162
  subtitles: SubtitleData = None,
149
- end_time: int | None = None,
163
+ end_time: MediaTime | None = None,
150
164
  loop: bool = False,
151
165
  ) -> DeltaGenerator:
152
166
  """Display a video player.
@@ -246,6 +260,9 @@ class MediaMixin:
246
260
  for more information.
247
261
 
248
262
  """
263
+
264
+ start_time, end_time = _parse_start_time_end_time(start_time, end_time)
265
+
249
266
  video_proto = VideoProto()
250
267
  coordinates = self.dg._get_delta_path_str()
251
268
  marshall_video(
@@ -461,6 +478,37 @@ def marshall_video(
461
478
  ) from original_err
462
479
 
463
480
 
481
+ def _parse_start_time_end_time(
482
+ start_time: MediaTime, end_time: MediaTime | None
483
+ ) -> tuple[int, int | None]:
484
+ """Parse start_time and end_time and return them as int."""
485
+
486
+ try:
487
+ maybe_start_time = duration_to_seconds(start_time, coerce_none_to_inf=False)
488
+ if maybe_start_time is None:
489
+ raise ValueError
490
+ start_time = int(maybe_start_time)
491
+ except (StreamlitAPIException, ValueError):
492
+ error_msg = TIMEDELTA_PARSE_ERROR_MESSAGE.format(
493
+ param_name="start_time", param_value=start_time
494
+ )
495
+ raise StreamlitAPIException(error_msg) from None
496
+
497
+ try:
498
+ # TODO[kajarenc]: Replace `duration_to_seconds` with `time_to_seconds`
499
+ # when PR #8343 is merged.
500
+ end_time = duration_to_seconds(end_time, coerce_none_to_inf=False)
501
+ if end_time is not None:
502
+ end_time = int(end_time)
503
+ except StreamlitAPIException:
504
+ error_msg = TIMEDELTA_PARSE_ERROR_MESSAGE.format(
505
+ param_name="end_time", param_value=end_time
506
+ )
507
+ raise StreamlitAPIException(error_msg) from None
508
+
509
+ return start_time, end_time
510
+
511
+
464
512
  def _validate_and_normalize(data: npt.NDArray[Any]) -> tuple[bytes, int]:
465
513
  """Validates and normalizes numpy array data.
466
514
  We validate numpy array shape (should be 1d or 2d)
@@ -35,7 +35,6 @@ from streamlit.runtime.caching.cache_utils import (
35
35
  Cache,
36
36
  CachedFuncInfo,
37
37
  make_cached_func_wrapper,
38
- ttl_to_seconds,
39
38
  )
40
39
  from streamlit.runtime.caching.cached_message_replay import (
41
40
  CachedMessageReplayContext,
@@ -59,6 +58,7 @@ from streamlit.runtime.caching.storage.dummy_cache_storage import (
59
58
  MemoryCacheStorageManager,
60
59
  )
61
60
  from streamlit.runtime.metrics_util import gather_metrics
61
+ from streamlit.runtime.runtime_util import duration_to_seconds
62
62
  from streamlit.runtime.scriptrunner.script_run_context import get_script_run_ctx
63
63
  from streamlit.runtime.stats import CacheStat, CacheStatsProvider, group_stats
64
64
 
@@ -154,7 +154,7 @@ class DataCaches(CacheStatsProvider):
154
154
  If it doesn't exist, create a new one with the given params.
155
155
  """
156
156
 
157
- ttl_seconds = ttl_to_seconds(ttl, coerce_none_to_inf=False)
157
+ ttl_seconds = duration_to_seconds(ttl, coerce_none_to_inf=False)
158
158
 
159
159
  # Get the existing cache, if it exists, and validate that its params
160
160
  # haven't changed.
@@ -254,7 +254,7 @@ class DataCaches(CacheStatsProvider):
254
254
  CacheStorageContext.
255
255
  """
256
256
 
257
- ttl_seconds = ttl_to_seconds(ttl, coerce_none_to_inf=False)
257
+ ttl_seconds = duration_to_seconds(ttl, coerce_none_to_inf=False)
258
258
 
259
259
  cache_context = self.create_cache_storage_context(
260
260
  function_key="DUMMY_KEY",
@@ -176,14 +176,3 @@ class UnevaluatedDataFrameError(StreamlitAPIException):
176
176
  """Used to display a message about uncollected dataframe being used"""
177
177
 
178
178
  pass
179
-
180
-
181
- class BadTTLStringError(StreamlitAPIException):
182
- """Raised when a bad ttl= argument string is passed."""
183
-
184
- def __init__(self, ttl: str):
185
- MarkdownFormattedException.__init__(
186
- self,
187
- "TTL string doesn't look right. It should be formatted as"
188
- f"`'1d2h34m'` or `2 days`, for example. Got: {ttl}",
189
- )
@@ -35,7 +35,6 @@ from streamlit.runtime.caching.cache_utils import (
35
35
  Cache,
36
36
  CachedFuncInfo,
37
37
  make_cached_func_wrapper,
38
- ttl_to_seconds,
39
38
  )
40
39
  from streamlit.runtime.caching.cached_message_replay import (
41
40
  CachedMessageReplayContext,
@@ -46,6 +45,7 @@ from streamlit.runtime.caching.cached_message_replay import (
46
45
  )
47
46
  from streamlit.runtime.caching.hashing import HashFuncsDict
48
47
  from streamlit.runtime.metrics_util import gather_metrics
48
+ from streamlit.runtime.runtime_util import duration_to_seconds
49
49
  from streamlit.runtime.scriptrunner.script_run_context import get_script_run_ctx
50
50
  from streamlit.runtime.stats import CacheStat, CacheStatsProvider, group_stats
51
51
 
@@ -89,7 +89,7 @@ class ResourceCaches(CacheStatsProvider):
89
89
  if max_entries is None:
90
90
  max_entries = math.inf
91
91
 
92
- ttl_seconds = ttl_to_seconds(ttl)
92
+ ttl_seconds = duration_to_seconds(ttl)
93
93
 
94
94
  # Get the existing cache, if it exists, and validate that its params
95
95
  # haven't changed.
@@ -19,20 +19,17 @@ from __future__ import annotations
19
19
  import functools
20
20
  import hashlib
21
21
  import inspect
22
- import math
23
22
  import threading
24
23
  import time
25
24
  import types
26
25
  from abc import abstractmethod
27
26
  from collections import defaultdict
28
- from datetime import timedelta
29
- from typing import Any, Callable, Final, Literal, overload
27
+ from typing import Any, Callable, Final
30
28
 
31
29
  from streamlit import type_util
32
30
  from streamlit.elements.spinner import spinner
33
31
  from streamlit.logger import get_logger
34
32
  from streamlit.runtime.caching.cache_errors import (
35
- BadTTLStringError,
36
33
  CacheError,
37
34
  CacheKeyNotFoundError,
38
35
  UnevaluatedDataFrameError,
@@ -58,45 +55,6 @@ _LOGGER: Final = get_logger(__name__)
58
55
  TTLCACHE_TIMER = time.monotonic
59
56
 
60
57
 
61
- @overload
62
- def ttl_to_seconds(
63
- ttl: float | timedelta | str | None, *, coerce_none_to_inf: Literal[False]
64
- ) -> float | None:
65
- ...
66
-
67
-
68
- @overload
69
- def ttl_to_seconds(ttl: float | timedelta | str | None) -> float:
70
- ...
71
-
72
-
73
- def ttl_to_seconds(
74
- ttl: float | timedelta | str | None, *, coerce_none_to_inf: bool = True
75
- ) -> float | None:
76
- """
77
- Convert a ttl value to a float representing "number of seconds".
78
- """
79
- if coerce_none_to_inf and ttl is None:
80
- return math.inf
81
- if isinstance(ttl, timedelta):
82
- return ttl.total_seconds()
83
- if isinstance(ttl, str):
84
- import numpy as np
85
- import pandas as pd
86
-
87
- try:
88
- out: float = pd.Timedelta(ttl).total_seconds()
89
- except ValueError as ex:
90
- raise BadTTLStringError(ttl) from ex
91
-
92
- if np.isnan(out):
93
- raise BadTTLStringError(ttl)
94
-
95
- return out
96
-
97
- return ttl
98
-
99
-
100
58
  # We show a special "UnevaluatedDataFrame" warning for cached funcs
101
59
  # that attempt to return one of these unserializable types:
102
60
  UNEVALUATED_DATAFRAME_TYPES = (
@@ -16,10 +16,12 @@
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
- from typing import Any
19
+ import math
20
+ from datetime import timedelta
21
+ from typing import Any, Literal, overload
20
22
 
21
23
  from streamlit import config
22
- from streamlit.errors import MarkdownFormattedException
24
+ from streamlit.errors import MarkdownFormattedException, StreamlitAPIException
23
25
  from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
24
26
  from streamlit.runtime.forward_msg_cache import populate_hash_if_needed
25
27
 
@@ -54,6 +56,17 @@ of the client's browser and the Streamlit server._
54
56
  )
55
57
 
56
58
 
59
+ class BadDurationStringError(StreamlitAPIException):
60
+ """Raised when a bad duration argument string is passed."""
61
+
62
+ def __init__(self, duration: str):
63
+ MarkdownFormattedException.__init__(
64
+ self,
65
+ "TTL string doesn't look right. It should be formatted as"
66
+ f"`'1d2h34m'` or `2 days`, for example. Got: {duration}",
67
+ )
68
+
69
+
57
70
  def is_cacheable_msg(msg: ForwardMsg) -> bool:
58
71
  """True if the given message qualifies for caching."""
59
72
  if msg.WhichOneof("type") in {"ref_hash", "initialize"}:
@@ -62,6 +75,45 @@ def is_cacheable_msg(msg: ForwardMsg) -> bool:
62
75
  return msg.ByteSize() >= int(config.get_option("global.minCachedMessageSize"))
63
76
 
64
77
 
78
+ @overload
79
+ def duration_to_seconds(
80
+ ttl: float | timedelta | str | None, *, coerce_none_to_inf: Literal[False]
81
+ ) -> float | None:
82
+ ...
83
+
84
+
85
+ @overload
86
+ def duration_to_seconds(ttl: float | timedelta | str | None) -> float:
87
+ ...
88
+
89
+
90
+ def duration_to_seconds(
91
+ ttl: float | timedelta | str | None, *, coerce_none_to_inf: bool = True
92
+ ) -> float | None:
93
+ """
94
+ Convert a ttl value to a float representing "number of seconds".
95
+ """
96
+ if coerce_none_to_inf and ttl is None:
97
+ return math.inf
98
+ if isinstance(ttl, timedelta):
99
+ return ttl.total_seconds()
100
+ if isinstance(ttl, str):
101
+ import numpy as np
102
+ import pandas as pd
103
+
104
+ try:
105
+ out: float = pd.Timedelta(ttl).total_seconds()
106
+ except ValueError as ex:
107
+ raise BadDurationStringError(ttl) from ex
108
+
109
+ if np.isnan(out):
110
+ raise BadDurationStringError(ttl)
111
+
112
+ return out
113
+
114
+ return ttl
115
+
116
+
65
117
  def serialize_forward_msg(msg: ForwardMsg) -> bytes:
66
118
  """Serialize a ForwardMsg to send to a client.
67
119
 
@@ -18,6 +18,7 @@ import collections
18
18
  import os
19
19
  import sys
20
20
  import types
21
+ from pathlib import Path
21
22
  from typing import Callable, Final
22
23
 
23
24
  from streamlit import config, file_util
@@ -165,7 +166,7 @@ class LocalSourcesWatcher:
165
166
  for name, paths in module_paths.items():
166
167
  for path in paths:
167
168
  if self._file_should_be_watched(path):
168
- self._register_watcher(path, name)
169
+ self._register_watcher(str(Path(path).resolve()), name)
169
170
 
170
171
  def _exclude_blacklisted_paths(self, paths: set[str]) -> set[str]:
171
172
  return {p for p in paths if not self._folder_black_list.is_blacklisted(p)}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: streamlit-nightly
3
- Version: 1.32.3.dev20240325
3
+ Version: 1.32.3.dev20240326
4
4
  Summary: A faster way to build and share data apps
5
5
  Home-page: https://streamlit.io
6
6
  Author: Snowflake Inc
@@ -76,7 +76,7 @@ streamlit/elements/json.py,sha256=d1PHLaHDsrgQEv__KspWvwIvcufru_v5L871qEPStWM,33
76
76
  streamlit/elements/layouts.py,sha256=6lW-qzgABWn2uFCAR6mIlHht5xxdT6EkHN1uLcdaNHY,26685
77
77
  streamlit/elements/map.py,sha256=0zwVCZ9FjPUiCk5XfVe7vKg6UiLDbBLUkrHgnJz_Rr0,16299
78
78
  streamlit/elements/markdown.py,sha256=M21cweb9LTdT0XWdTrEibc2xc7qXSATP5BElthqgn1s,9913
79
- streamlit/elements/media.py,sha256=dJQepbbK7SpIeUyFeBb9tgam8wXBivV8e-ybrN2V5fs,21852
79
+ streamlit/elements/media.py,sha256=cPR8an8fSBzQedOLKVd4X-Ejj-0fNYLZpn6oxIdNkUc,23662
80
80
  streamlit/elements/metric.py,sha256=yYg-lAl2apRyBfN3kHNIL__P8jiGHJcF31RxX8wx3io,9897
81
81
  streamlit/elements/plotly_chart.py,sha256=qUr1oB7qD88HuswyPea2cJams-lD_0_E14J8Hw11dMM,8563
82
82
  streamlit/elements/progress.py,sha256=8ke3Q517tK5sLjBjrCs8HcG_ZdQco17NypyXGNxUKoM,5627
@@ -279,7 +279,7 @@ streamlit/runtime/memory_session_storage.py,sha256=Tx-_3oUg6i9UokpBUIWvqhpWE0Wmj
279
279
  streamlit/runtime/memory_uploaded_file_manager.py,sha256=rCLvdZv2nPlWeCiHnwV8phcVV43mUCgW7BaWkmEXgpM,4422
280
280
  streamlit/runtime/metrics_util.py,sha256=29DvzbI-c74P3jwrLGPgNXKbx3Hi1Zu2u-OJ5G8wCig,14039
281
281
  streamlit/runtime/runtime.py,sha256=aeO8Sksr2vAdkC0vHDkNhzZKGLJzU6qZxqEAMFPxP2M,29156
282
- streamlit/runtime/runtime_util.py,sha256=9Z04nAr8b3nQ7jZjcEYo0ExZGtXUYFGIyYhcZcqW_m0,3796
282
+ streamlit/runtime/runtime_util.py,sha256=sXXCUBTsyfTbyM6z9w4Mq1ZhmN_BWsXlXL1y6almV_I,5185
283
283
  streamlit/runtime/script_data.py,sha256=-sBITUF0U7DIDL5LE_nFpXAvjnEfiJ9J3HAnnqML9ds,1749
284
284
  streamlit/runtime/secrets.py,sha256=gc-_twZig0XSoXNvK_asGEPFj8UpnlZ0WWz1Ftkk3pU,12302
285
285
  streamlit/runtime/session_manager.py,sha256=u0grNXRzDoK6Z_4z4dEF1YsICG6D8qUdY5bBG6mr938,13017
@@ -287,11 +287,11 @@ streamlit/runtime/stats.py,sha256=2ldQwWI5DjobZZqXWwwsWgwaj4KWRqWjHmPzgGVXWL8,38
287
287
  streamlit/runtime/uploaded_file_manager.py,sha256=gkCGjX-d1eyrnHPNz4n-CC-fbFM-FGL1f9JK5ODJXME,4784
288
288
  streamlit/runtime/websocket_session_manager.py,sha256=BWxC1ycURgIH9b_f28_UTsBiVWDobMnCG213fW7wMik,6443
289
289
  streamlit/runtime/caching/__init__.py,sha256=EkSPYty4BxOFGFLdziY-IP6jtvOaF8o9SzNHQUwwZkg,5029
290
- streamlit/runtime/caching/cache_data_api.py,sha256=vnx7BHsApOTvjOjZz1ngG0gYJOO32SgsYgwxrVlT-UI,26128
291
- streamlit/runtime/caching/cache_errors.py,sha256=atgsEjxKPi1bIyExiAN3cojJKMf5z7wu3zcFhG5AaF0,6371
292
- streamlit/runtime/caching/cache_resource_api.py,sha256=1Y_A77Qm9fyry4E9wT7Nvt-BmtK-oce-EmqGp0YFeBU,21293
290
+ streamlit/runtime/caching/cache_data_api.py,sha256=TUhxUEwkN9qzYkKP0KDwWR5cr3dQTJwsoLxkTCFcY8A,26181
291
+ streamlit/runtime/caching/cache_errors.py,sha256=sIq3uKJ7Qcusqa6BfDhF6rENXARrgQW7OAlXPwObzg0,6017
292
+ streamlit/runtime/caching/cache_resource_api.py,sha256=0532vNBqbd34djyZ49PSMdmESzOvipQnXvuLYdruf3E,21341
293
293
  streamlit/runtime/caching/cache_type.py,sha256=P21JWouFWU0qXQyHbM3y3A1pLZud90ALGeO4bQ5Pvew,1131
294
- streamlit/runtime/caching/cache_utils.py,sha256=pdYb6SZDNJW0YYcwCqwM9khXfh9-L97AsDY7hlFC8GI,17710
294
+ streamlit/runtime/caching/cache_utils.py,sha256=aT7Q3y4pdRB7QfdEdYbpkDfwZ5E7rshVdIfbkmlMAm8,16719
295
295
  streamlit/runtime/caching/cached_message_replay.py,sha256=WsZJej5No7p_qXlohw1ej2IHzMc2Q6bMgohmMrBkEKI,18554
296
296
  streamlit/runtime/caching/hashing.py,sha256=jBITAKAWfWRJizaHB-7y_SgoF4DJnuqpwL-ETGRdPwY,18986
297
297
  streamlit/runtime/caching/storage/__init__.py,sha256=b3JyzTI6Nyc3htcNZAq_f-XP3jMqnW2UNEbK3bm8bVs,965
@@ -486,7 +486,7 @@ streamlit/vendor/pympler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
486
486
  streamlit/vendor/pympler/asizeof.py,sha256=noLIqizkYzTkYtA4k8fyvKeiIh8fW9ipW27YP56kQ6o,87925
487
487
  streamlit/watcher/__init__.py,sha256=Tn9E295dBAPIF38TAiWdfIoCsJWXU6rgY1FlxNmLqUU,915
488
488
  streamlit/watcher/event_based_path_watcher.py,sha256=B9vv6PAsWRscChXT7XugFvb6GBMc7qgjFVHNSMKsMXw,13980
489
- streamlit/watcher/local_sources_watcher.py,sha256=WpMCzDRyp9YItOcVeS5382GHvKntRT6IhRvcDdWCHEY,8192
489
+ streamlit/watcher/local_sources_watcher.py,sha256=ETv8G-5px8durCqZ3SLQp6ASwXJ_UktTgVCYAFVW6cw,8238
490
490
  streamlit/watcher/path_watcher.py,sha256=hFc_6FhLHsdbgVRFNJiyelJX3bX_rPvN-PQcgEZ7ZEc,5654
491
491
  streamlit/watcher/polling_path_watcher.py,sha256=VwQ06abbvHSIuvR66YpFDx9ANhrzTmoQylKqSjUosFE,3822
492
492
  streamlit/watcher/util.py,sha256=uDsWPxQ8WLNQ4U_MCqWm38H7BEjSrBpPsIZj1ySK8KM,5203
@@ -505,9 +505,9 @@ streamlit/web/server/server_util.py,sha256=FptUF-CjFh78VjeTQDi3R78m7E64MDe3wcklg
505
505
  streamlit/web/server/stats_request_handler.py,sha256=cL__KbJFIhdhf1Zt6skbLehUqT-jo56x1HARxogZDOI,3680
506
506
  streamlit/web/server/upload_file_request_handler.py,sha256=YPDmKWUnaGH9d4QNcMEsY5k1YIz_q-xW1K5fmgHaDzc,4966
507
507
  streamlit/web/server/websocket_headers.py,sha256=07SkWLcOxbyldl7UcBzrMKY9ZojypCQACiKoh5FcH7Y,1870
508
- streamlit_nightly-1.32.3.dev20240325.data/scripts/streamlit.cmd,sha256=ZEYM3vBJSp-k7vwSJ3ba5NzEk9-qHdSeLvGYAAe1mMw,676
509
- streamlit_nightly-1.32.3.dev20240325.dist-info/METADATA,sha256=eThhA0PpwVJpmHml8hKHvTg7zXRFqwwA4uYwgb-tQqI,8528
510
- streamlit_nightly-1.32.3.dev20240325.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110
511
- streamlit_nightly-1.32.3.dev20240325.dist-info/entry_points.txt,sha256=uNJ4DwGNXEhOK0USwSNanjkYyR-Bk7eYQbJFDrWyOgY,53
512
- streamlit_nightly-1.32.3.dev20240325.dist-info/top_level.txt,sha256=V3FhKbm7G2LnR0s4SytavrjIPNIhvcsAGXfYHAwtQzw,10
513
- streamlit_nightly-1.32.3.dev20240325.dist-info/RECORD,,
508
+ streamlit_nightly-1.32.3.dev20240326.data/scripts/streamlit.cmd,sha256=ZEYM3vBJSp-k7vwSJ3ba5NzEk9-qHdSeLvGYAAe1mMw,676
509
+ streamlit_nightly-1.32.3.dev20240326.dist-info/METADATA,sha256=hj2Luvg7vHa99swkxzUYcvy8aZ09Ys-gdqpoA67umyc,8528
510
+ streamlit_nightly-1.32.3.dev20240326.dist-info/WHEEL,sha256=DZajD4pwLWue70CAfc7YaxT1wLUciNBvN_TTcvXpltE,110
511
+ streamlit_nightly-1.32.3.dev20240326.dist-info/entry_points.txt,sha256=uNJ4DwGNXEhOK0USwSNanjkYyR-Bk7eYQbJFDrWyOgY,53
512
+ streamlit_nightly-1.32.3.dev20240326.dist-info/top_level.txt,sha256=V3FhKbm7G2LnR0s4SytavrjIPNIhvcsAGXfYHAwtQzw,10
513
+ streamlit_nightly-1.32.3.dev20240326.dist-info/RECORD,,