streamlit-nightly 1.37.2.dev20240815__py2.py3-none-any.whl → 1.37.2.dev20240817__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.
@@ -20,7 +20,7 @@ from __future__ import annotations
20
20
 
21
21
  from typing import TYPE_CHECKING, Any
22
22
 
23
- from streamlit import dataframe_util, type_util
23
+ from streamlit import dataframe_util
24
24
  from streamlit.elements.lib import pandas_styler_utils
25
25
 
26
26
  if TYPE_CHECKING:
@@ -122,7 +122,7 @@ def arrow_proto_to_dataframe(proto: ArrowTableProto) -> DataFrame:
122
122
 
123
123
  """
124
124
 
125
- if type_util.is_pyarrow_version_less_than("14.0.1"):
125
+ if dataframe_util.is_pyarrow_version_less_than("14.0.1"):
126
126
  raise RuntimeError(
127
127
  "The installed pyarrow version is not compatible with this component. "
128
128
  "Please upgrade to 14.0.1 or higher: pip install -U pyarrow"
@@ -22,16 +22,16 @@ import inspect
22
22
  import math
23
23
  import re
24
24
  from collections import ChainMap, UserDict, UserList, deque
25
- from collections.abc import ItemsView, Mapping
25
+ from collections.abc import ItemsView
26
26
  from enum import Enum, EnumMeta, auto
27
27
  from types import MappingProxyType
28
28
  from typing import (
29
29
  TYPE_CHECKING,
30
30
  Any,
31
- Dict,
32
31
  Final,
33
32
  Iterable,
34
33
  List,
34
+ Mapping,
35
35
  Protocol,
36
36
  Sequence,
37
37
  TypeVar,
@@ -44,13 +44,16 @@ from typing_extensions import TypeAlias, TypeGuard
44
44
 
45
45
  from streamlit import config, errors, logger, string_util
46
46
  from streamlit.type_util import (
47
+ CustomDict,
47
48
  NumpyShape,
48
49
  has_callable_attr,
49
50
  is_custom_dict,
50
51
  is_dataclass_instance,
51
52
  is_list_like,
52
53
  is_namedtuple,
54
+ is_pydantic_model,
53
55
  is_type,
56
+ is_version_less_than,
54
57
  )
55
58
 
56
59
  if TYPE_CHECKING:
@@ -144,9 +147,26 @@ class DataFrameGenericAlias(Protocol[V_co]):
144
147
  def iloc(self) -> _iLocIndexer: ...
145
148
 
146
149
 
150
+ class PandasCompatible(Protocol):
151
+ """Protocol for Pandas compatible objects that have a `to_pandas` method."""
152
+
153
+ def to_pandas(self) -> DataFrame | Series: ...
154
+
155
+
156
+ class DataframeInterchangeCompatible(Protocol):
157
+ """Protocol for objects support the dataframe-interchange protocol.
158
+
159
+ https://data-apis.org/dataframe-protocol/latest/index.html
160
+ """
161
+
162
+ def __dataframe__(self, allow_copy: bool) -> Any: ...
163
+
164
+
147
165
  OptionSequence: TypeAlias = Union[
148
166
  Iterable[V_co],
149
167
  DataFrameGenericAlias[V_co],
168
+ PandasCompatible,
169
+ DataframeInterchangeCompatible,
150
170
  ]
151
171
 
152
172
  # Various data types supported by our dataframe processing
@@ -158,10 +178,14 @@ Data: TypeAlias = Union[
158
178
  "Styler",
159
179
  "Index",
160
180
  "pa.Table",
181
+ "pa.Array",
161
182
  "np.ndarray[Any, np.dtype[Any]]",
162
183
  Iterable[Any],
163
- Dict[Any, Any],
184
+ "Mapping[Any, Any]",
164
185
  DBAPICursor,
186
+ PandasCompatible,
187
+ DataframeInterchangeCompatible,
188
+ CustomDict,
165
189
  None,
166
190
  ]
167
191
 
@@ -204,6 +228,53 @@ class DataFormat(Enum):
204
228
  DUCKDB_RELATION = auto() # DuckDB Relation
205
229
 
206
230
 
231
+ def is_pyarrow_version_less_than(v: str) -> bool:
232
+ """Return True if the current Pyarrow version is less than the input version.
233
+
234
+ Parameters
235
+ ----------
236
+ v : str
237
+ Version string, e.g. "0.25.0"
238
+
239
+ Returns
240
+ -------
241
+ bool
242
+
243
+
244
+ Raises
245
+ ------
246
+ InvalidVersion
247
+ If the version strings are not valid.
248
+
249
+ """
250
+ import pyarrow as pa
251
+
252
+ return is_version_less_than(pa.__version__, v)
253
+
254
+
255
+ def is_pandas_version_less_than(v: str) -> bool:
256
+ """Return True if the current Pandas version is less than the input version.
257
+
258
+ Parameters
259
+ ----------
260
+ v : str
261
+ Version string, e.g. "0.25.0"
262
+
263
+ Returns
264
+ -------
265
+ bool
266
+
267
+
268
+ Raises
269
+ ------
270
+ InvalidVersion
271
+ If the version strings are not valid.
272
+ """
273
+ import pandas as pd
274
+
275
+ return is_version_less_than(pd.__version__, v)
276
+
277
+
207
278
  def is_dataframe_like(obj: object) -> bool:
208
279
  """True if the object is a dataframe-like object.
209
280
 
@@ -298,11 +369,7 @@ def is_snowpark_row_list(obj: object) -> bool:
298
369
 
299
370
  def is_pyspark_data_object(obj: object) -> bool:
300
371
  """True if obj is of type pyspark.sql.dataframe.DataFrame"""
301
- return (
302
- is_type(obj, _PYSPARK_DF_TYPE_STR)
303
- and hasattr(obj, "toPandas")
304
- and callable(obj.toPandas)
305
- )
372
+ return is_type(obj, _PYSPARK_DF_TYPE_STR) and has_callable_attr(obj, "toPandas")
306
373
 
307
374
 
308
375
  def is_dask_object(obj: object) -> bool:
@@ -461,7 +528,7 @@ def convert_anything_to_pandas_df(
461
528
 
462
529
  Parameters
463
530
  ----------
464
- data : any
531
+ data : dataframe-, array-, or collections-like object
465
532
  The data to convert to a Pandas DataFrame.
466
533
 
467
534
  max_unevaluated_rows: int
@@ -623,6 +690,16 @@ def convert_anything_to_pandas_df(
623
690
  if has_callable_attr(data, "to_pandas"):
624
691
  return pd.DataFrame(data.to_pandas())
625
692
 
693
+ # Check for dataframe interchange protocol
694
+ # Only available in pandas >= 1.5.0
695
+ # https://pandas.pydata.org/docs/whatsnew/v1.5.0.html#dataframe-interchange-protocol-implementation
696
+ if (
697
+ has_callable_attr(data, "__dataframe__")
698
+ and is_pandas_version_less_than("1.5.0") is False
699
+ ):
700
+ data_df = pd.api.interchange.from_dataframe(data)
701
+ return data_df.copy() if ensure_copy else data_df
702
+
626
703
  # Support for generator functions
627
704
  if inspect.isgeneratorfunction(data):
628
705
  data = _fix_column_naming(
@@ -657,7 +734,9 @@ def convert_anything_to_pandas_df(
657
734
  return _dict_to_pandas_df(dataclasses.asdict(data))
658
735
 
659
736
  # Support for dict-like objects
660
- if isinstance(data, (ChainMap, MappingProxyType, UserDict)):
737
+ if isinstance(data, (ChainMap, MappingProxyType, UserDict)) or is_pydantic_model(
738
+ data
739
+ ):
661
740
  return _dict_to_pandas_df(dict(data))
662
741
 
663
742
  # Try to convert to pandas.DataFrame. This will raise an error is df is not
@@ -787,7 +866,7 @@ def convert_anything_to_arrow_bytes(
787
866
 
788
867
  Parameters
789
868
  ----------
790
- data : any
869
+ data : dataframe-, array-, or collections-like object
791
870
  The data to convert to Arrow bytes.
792
871
 
793
872
  max_unevaluated_rows: int
@@ -805,19 +884,7 @@ def convert_anything_to_arrow_bytes(
805
884
  if isinstance(data, pa.Table):
806
885
  return convert_arrow_table_to_arrow_bytes(data)
807
886
 
808
- if is_pandas_data_object(data):
809
- # All pandas data objects should be handled via our pandas
810
- # conversion logic. We are already calling it here
811
- # to ensure that its not handled via the interchange
812
- # protocol support below.
813
- df = convert_anything_to_pandas_df(data, max_unevaluated_rows)
814
- return convert_pandas_df_to_arrow_bytes(df)
815
-
816
- if is_polars_dataframe(data):
817
- return convert_arrow_table_to_arrow_bytes(data.to_arrow())
818
-
819
- if is_polars_series(data):
820
- return convert_arrow_table_to_arrow_bytes(data.to_frame().to_arrow())
887
+ # TODO(lukasmasuch): Add direct conversion to Arrow for supported formats here
821
888
 
822
889
  # Fallback: try to convert to pandas DataFrame
823
890
  # and then to Arrow bytes.
@@ -835,7 +902,7 @@ def convert_anything_to_sequence(obj: OptionSequence[V_co]) -> list[V_co]:
835
902
  Parameters
836
903
  ----------
837
904
 
838
- obj : OptionSequence
905
+ obj : dataframe-, array-, or collections-like object
839
906
  The object to convert to a list.
840
907
 
841
908
  Returns
@@ -1141,6 +1208,7 @@ def determine_data_format(input_data: Any) -> DataFormat:
1141
1208
  or is_dataclass_instance(input_data)
1142
1209
  or is_namedtuple(input_data)
1143
1210
  or is_custom_dict(input_data)
1211
+ or is_pydantic_model(input_data)
1144
1212
  ):
1145
1213
  return DataFormat.KEY_VALUE_DICT
1146
1214
  elif isinstance(input_data, (ItemsView, enumerate)):
@@ -21,7 +21,12 @@ from typing import TYPE_CHECKING, Any, cast
21
21
 
22
22
  from streamlit.proto.Json_pb2 import Json as JsonProto
23
23
  from streamlit.runtime.metrics_util import gather_metrics
24
- from streamlit.type_util import is_custom_dict, is_namedtuple
24
+ from streamlit.type_util import (
25
+ is_custom_dict,
26
+ is_list_like,
27
+ is_namedtuple,
28
+ is_pydantic_model,
29
+ )
25
30
 
26
31
  if TYPE_CHECKING:
27
32
  from streamlit.delta_generator import DeltaGenerator
@@ -86,11 +91,13 @@ class JsonMixin:
86
91
  if is_namedtuple(body):
87
92
  body = body._asdict()
88
93
 
89
- if isinstance(body, (map, enumerate)):
90
- body = list(body)
94
+ if isinstance(
95
+ body, (ChainMap, types.MappingProxyType, UserDict)
96
+ ) or is_pydantic_model(body):
97
+ body = dict(body) # type: ignore
91
98
 
92
- if isinstance(body, (ChainMap, types.MappingProxyType, UserDict)):
93
- body = dict(body)
99
+ if is_list_like(body):
100
+ body = list(body)
94
101
 
95
102
  if not isinstance(body, str):
96
103
  try:
@@ -23,11 +23,9 @@ from typing import (
23
23
  Sequence,
24
24
  TypeVar,
25
25
  cast,
26
- get_args,
26
+ overload,
27
27
  )
28
28
 
29
- from typing_extensions import TypeAlias
30
-
31
29
  from streamlit.elements.form_utils import current_form_id
32
30
  from streamlit.elements.lib.options_selector_utils import (
33
31
  convert_to_sequence_and_check_comparable,
@@ -80,8 +78,6 @@ _STAR_ICON: Final = ":material/star:"
80
78
  # in base64 format and send it over the wire as an image.
81
79
  _SELECTED_STAR_ICON: Final = ":material/star_filled:"
82
80
 
83
- _FeedbackOptions: TypeAlias = Literal["thumbs", "faces", "stars"]
84
-
85
81
 
86
82
  class FeedbackSerde:
87
83
  """Uses the MultiSelectSerde under-the-hood, but accepts a single index value
@@ -114,7 +110,7 @@ class FeedbackSerde:
114
110
 
115
111
 
116
112
  def get_mapped_options(
117
- feedback_option: _FeedbackOptions,
113
+ feedback_option: Literal["thumbs", "faces", "stars"],
118
114
  ) -> tuple[list[ButtonGroupProto.Option], list[int]]:
119
115
  # options object understandable by the web app
120
116
  options: list[ButtonGroupProto.Option] = []
@@ -168,10 +164,33 @@ def _build_proto(
168
164
 
169
165
 
170
166
  class ButtonGroupMixin:
167
+ @overload # These overloads are not documented in the docstring, at least not at this time, on the theory that most people won't know what it means. And the Literals here are a subclass of int anyway.
168
+ # Usually, we would make a type alias for Literal["thumbs", "faces", "stars"]; but, in this case, we don't use it in too many other places, and it's a more helpful autocomplete if we just enumerate the values explicitly, so a decision has been made to keep it as not an alias.
169
+ def feedback(
170
+ self,
171
+ options: Literal["thumbs"] = ...,
172
+ *,
173
+ key: str | None = None,
174
+ disabled: bool = False,
175
+ on_change: WidgetCallback | None = None,
176
+ args: Any | None = None,
177
+ kwargs: Any | None = None,
178
+ ) -> Literal[0, 1] | None: ...
179
+ @overload
180
+ def feedback(
181
+ self,
182
+ options: Literal["faces", "stars"] = ...,
183
+ *,
184
+ key: str | None = None,
185
+ disabled: bool = False,
186
+ on_change: WidgetCallback | None = None,
187
+ args: Any | None = None,
188
+ kwargs: Any | None = None,
189
+ ) -> Literal[0, 1, 2, 3, 4] | None: ...
171
190
  @gather_metrics("feedback")
172
191
  def feedback(
173
192
  self,
174
- options: _FeedbackOptions = "thumbs",
193
+ options: Literal["thumbs", "faces", "stars"] = "thumbs",
175
194
  *,
176
195
  key: str | None = None,
177
196
  disabled: bool = False,
@@ -262,7 +281,7 @@ class ButtonGroupMixin:
262
281
 
263
282
  """
264
283
 
265
- if not isinstance(options, list) and options not in get_args(_FeedbackOptions):
284
+ if options not in ["thumbs", "faces", "stars"]:
266
285
  raise StreamlitAPIException(
267
286
  "The options argument to st.feedback must be one of "
268
287
  "['thumbs', 'faces', 'stars']. "
@@ -18,6 +18,7 @@ import dataclasses
18
18
  import inspect
19
19
  import types
20
20
  from collections import ChainMap, UserDict, UserList
21
+ from collections.abc import ItemsView, KeysView, ValuesView
21
22
  from io import StringIO
22
23
  from typing import (
23
24
  TYPE_CHECKING,
@@ -258,13 +259,13 @@ class WriteMixin:
258
259
  - write(string) : Prints the formatted Markdown string, with
259
260
  support for LaTeX expression, emoji shortcodes, and colored text.
260
261
  See docs for st.markdown for more.
261
- - write(data_frame) : Displays any dataframe-compatible value
262
- as read-only table.
262
+ - write(dataframe) : Displays any dataframe-like object in a table.
263
+ - write(dict) : Displays dict-like in an interactive viewer.
264
+ - write(list) : Displays list-like in an interactive viewer.
263
265
  - write(error) : Prints an exception specially.
264
266
  - write(func) : Displays information about a function.
265
267
  - write(module) : Displays information about the module.
266
268
  - write(class) : Displays information about a class.
267
- - write(dict) : Displays dict in an interactive widget.
268
269
  - write(mpl_fig) : Displays a Matplotlib figure.
269
270
  - write(generator) : Streams the output of a generator.
270
271
  - write(openai.Stream) : Streams the output of an OpenAI stream.
@@ -276,8 +277,10 @@ class WriteMixin:
276
277
  - write(bokeh_fig) : Displays a Bokeh figure.
277
278
  - write(sympy_expr) : Prints SymPy expression using LaTeX.
278
279
  - write(htmlable) : Prints _repr_html_() for the object if available.
280
+ - write(db_cursor) : Displays DB API 2.0 cursor results in a table.
279
281
  - write(obj) : Prints str(obj) if otherwise unknown.
280
282
 
283
+
281
284
  unsafe_allow_html : bool
282
285
  Whether to render HTML within ``*args``. This only applies to
283
286
  strings or objects falling back on ``_repr_html_()``. If this is
@@ -457,10 +460,14 @@ class WriteMixin:
457
460
  UserDict,
458
461
  ChainMap,
459
462
  UserList,
463
+ ItemsView,
464
+ KeysView,
465
+ ValuesView,
460
466
  ),
461
467
  )
462
468
  or type_util.is_custom_dict(arg)
463
469
  or type_util.is_namedtuple(arg)
470
+ or type_util.is_pydantic_model(arg)
464
471
  ):
465
472
  flush_buffer()
466
473
  self.dg.json(arg)
@@ -495,6 +502,14 @@ class WriteMixin:
495
502
  ):
496
503
  # We either explicitly allow HTML or infer it's not HTML
497
504
  self.dg.markdown(repr_html, unsafe_allow_html=unsafe_allow_html)
505
+ elif type_util.has_callable_attr(
506
+ arg, "to_pandas"
507
+ ) or type_util.has_callable_attr(arg, "__dataframe__"):
508
+ # This object can very likely be converted to a DataFrame
509
+ # using the to_pandas, to_arrow, or the dataframe interchange
510
+ # protocol.
511
+ flush_buffer()
512
+ self.dg.dataframe(arg)
498
513
  else:
499
514
  stringified_arg = str(arg)
500
515
 
streamlit/type_util.py CHANGED
@@ -112,6 +112,11 @@ def is_type(obj: object, fqn_type_pattern: str | re.Pattern[str]) -> bool:
112
112
  return fqn_type_pattern.match(fqn_type) is not None
113
113
 
114
114
 
115
+ def _is_type_instance(obj: object, type_to_check: str) -> bool:
116
+ """Check if instance of type without importing expensive modules."""
117
+ return type_to_check in [get_fqn(t) for t in type(obj).__mro__]
118
+
119
+
115
120
  def get_fqn(the_type: type) -> str:
116
121
  """Get module.type_name for a given type."""
117
122
  return f"{the_type.__module__}.{the_type.__qualname__}"
@@ -287,6 +292,18 @@ def is_pydeck(obj: object) -> TypeGuard[Deck]:
287
292
  return is_type(obj, "pydeck.bindings.deck.Deck")
288
293
 
289
294
 
295
+ def is_pydantic_model(obj) -> bool:
296
+ """True if input looks like a Pydantic model instance."""
297
+
298
+ if isinstance(obj, type):
299
+ # The obj is a class, but we
300
+ # only want to check for instances
301
+ # of Pydantic models, so we return False.
302
+ return False
303
+
304
+ return _is_type_instance(obj, "pydantic.main.BaseModel")
305
+
306
+
290
307
  def is_custom_dict(obj: object) -> TypeGuard[CustomDict]:
291
308
  """True if input looks like one of the Streamlit custom dictionaries."""
292
309
  from streamlit.runtime.context import StreamlitCookies, StreamlitHeaders
@@ -364,53 +381,6 @@ def check_python_comparable(seq: Sequence[Any]) -> None:
364
381
  )
365
382
 
366
383
 
367
- def is_pandas_version_less_than(v: str) -> bool:
368
- """Return True if the current Pandas version is less than the input version.
369
-
370
- Parameters
371
- ----------
372
- v : str
373
- Version string, e.g. "0.25.0"
374
-
375
- Returns
376
- -------
377
- bool
378
-
379
-
380
- Raises
381
- ------
382
- InvalidVersion
383
- If the version strings are not valid.
384
- """
385
- import pandas as pd
386
-
387
- return is_version_less_than(pd.__version__, v)
388
-
389
-
390
- def is_pyarrow_version_less_than(v: str) -> bool:
391
- """Return True if the current Pyarrow version is less than the input version.
392
-
393
- Parameters
394
- ----------
395
- v : str
396
- Version string, e.g. "0.25.0"
397
-
398
- Returns
399
- -------
400
- bool
401
-
402
-
403
- Raises
404
- ------
405
- InvalidVersion
406
- If the version strings are not valid.
407
-
408
- """
409
- import pyarrow as pa
410
-
411
- return is_version_less_than(pa.__version__, v)
412
-
413
-
414
384
  def is_altair_version_less_than(v: str) -> bool:
415
385
  """Return True if the current Altair version is less than the input version.
416
386
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: streamlit-nightly
3
- Version: 1.37.2.dev20240815
3
+ Version: 1.37.2.dev20240817
4
4
  Summary: A faster way to build and share data apps
5
5
  Home-page: https://streamlit.io
6
6
  Author: Snowflake Inc
@@ -10,7 +10,7 @@ streamlit/config_option.py,sha256=7kfzt-xhJs3awfyIHsyRaTBSxLpz1RioobDl5uXV37g,11
10
10
  streamlit/config_util.py,sha256=-MGb5eBrsZvNmqywmiBmo27ll1F9OmCDX4toGWglv2c,6015
11
11
  streamlit/constants.py,sha256=KhNjCeooky2bbW7QMX3ijOA5enHIOgj6Xo4TBhtTJNE,798
12
12
  streamlit/cursor.py,sha256=SXJcot8mc1htkXx1jnIWmvYRaFPlPpTOhPoYH-LPmos,6026
13
- streamlit/dataframe_util.py,sha256=3w5r3E6IAd7INh9d9uMcLtCf13rmNSrgUR9K9Tl-Ahk,46310
13
+ streamlit/dataframe_util.py,sha256=8s9MTpB173-JUSQD-JeC7nAvGNxwyDP-mHgzEZWoABE,47861
14
14
  streamlit/delta_generator.py,sha256=8FJhA4RG8nM3bWAvVEkA83_6GC2aDE2bV6LnlO8BQWc,21563
15
15
  streamlit/delta_generator_singletons.py,sha256=auM2-dFoY0oBk74OfMEcgX6EBLi4cuGmVxcEM-N37Q0,7555
16
16
  streamlit/deprecation_util.py,sha256=3JxWWS424v1kQ-qOq-9sQNYPQ8_UERH3QpYtkWxLP74,6516
@@ -33,7 +33,7 @@ streamlit/source_util.py,sha256=UiGRJsbtd5XapIFEIUEw6_0l3-XBFRD0BY3qwcKj43U,5882
33
33
  streamlit/string_util.py,sha256=7cJbv9tgdrayuaFzky43kZwG9-99O7zzQBXHAq8y55A,6716
34
34
  streamlit/temporary_directory.py,sha256=eBv5q0CR9GApa-itZBaGtqQKMl248H0HojEVKzkS9cc,1627
35
35
  streamlit/time_util.py,sha256=zPDirzZDAOPzGogHy-4wOalfBb7zCNCvFEfkZf03otc,2836
36
- streamlit/type_util.py,sha256=EOwtKaNHca7sRpdW49fjjazHrQ1lfmlBNXVkQEQYrUI,12021
36
+ streamlit/type_util.py,sha256=PPtaxoohNi3Ozsttzxh5Lpt8V1617XOX-N3cFhcCUQ0,11728
37
37
  streamlit/url_util.py,sha256=iU1lpZhzW4ZjhjBhSdw39OzixnThIsxhXpDP-ZIgUT8,3019
38
38
  streamlit/user_info.py,sha256=uagYpNPoNM1IG-WGjHveHOmwVxEBHukAevpZPpwoj_U,3423
39
39
  streamlit/util.py,sha256=0Phev7Lytvcy_eqIjpoGl2-7mOODwAwArY2zJpavEh8,6375
@@ -51,7 +51,7 @@ streamlit/components/types/__init__.py,sha256=Vrf1yVMOcTyhUPnYvsfyeL96Vpd5z8KoSV
51
51
  streamlit/components/types/base_component_registry.py,sha256=Zw8uO9qTKcpYJokkML_80phRPCi2jL6UHZfh5y0yHoQ,3137
52
52
  streamlit/components/types/base_custom_component.py,sha256=a8fvmmf8DN18fhezsdgkr9Bzi4ue7G_TUG66sBSbsp0,4262
53
53
  streamlit/components/v1/__init__.py,sha256=I7xa1wfGQY84U_nWWsq1i_HO5kCQ7f0BE5_dEQUiWRw,1027
54
- streamlit/components/v1/component_arrow.py,sha256=sG9hKzRCMWHW18ZkpaAkhTI_yGYhzxy1xjylb_mt5FY,4428
54
+ streamlit/components/v1/component_arrow.py,sha256=1Pm-n6gFn_vRXsT053AWFqYxLfcf2QVQYKWFg3yIpeI,4422
55
55
  streamlit/components/v1/component_registry.py,sha256=kgRL7HyD_vCVV-QlPba8CTmsrsd_4Fla1gssB8Xs7GM,4816
56
56
  streamlit/components/v1/components.py,sha256=-fyYz9yOIILGHUFqICLipl7HAK-2NUWGcBFcQa4L3Sk,1585
57
57
  streamlit/components/v1/custom_component.py,sha256=7h9tNro5bQGjY6hSW-zZuV0ToGARcA97nBsrPZ5jsqU,9495
@@ -79,7 +79,7 @@ streamlit/elements/heading.py,sha256=xzsf5QFUhlNW1VXjxmsyUHsHDCDzvo4Q6bgVoEBkMec
79
79
  streamlit/elements/html.py,sha256=PN9iw2jaRObDlqGzH2RwuzQr8rr3EInKnI4RelXVYfg,2717
80
80
  streamlit/elements/iframe.py,sha256=HwfwNQmlN9kmylqLbXEkUb_44ei36UxyZB7hWiSLNDY,5780
81
81
  streamlit/elements/image.py,sha256=TEe-_0fpVcUlupTq2y1haKbHrBRLcHJUGmbOTfGbmWs,20577
82
- streamlit/elements/json.py,sha256=LoVT_V0dVCKaATFOcV0AR5U7OgwmfiMJmOTaQoodu5o,4123
82
+ streamlit/elements/json.py,sha256=UV5cRRFu00bS3swpB8n_9zqGL1r1PTa4I7wLtVVa4tQ,4226
83
83
  streamlit/elements/layouts.py,sha256=IsgJzxVe0YiG5NhjQ64HTK8Vk4S1yStJm7N9ZM_b7yQ,29415
84
84
  streamlit/elements/map.py,sha256=8ftqFn2MZntMyfsIsu5AIXgEv7XKr6EbyJpAQZwew1M,16491
85
85
  streamlit/elements/markdown.py,sha256=iWxq9Ssj7o_hnKhf3-W3IKj3HM7XM-eA8aXVwtab8so,10249
@@ -93,7 +93,7 @@ streamlit/elements/spinner.py,sha256=qhA0DZo3ZEYQswFYuNdaXltenvmJR_18mqDQA64bK_Q
93
93
  streamlit/elements/text.py,sha256=_OePOPcWymPrYoey6BFeB6IvjTmnUszFS9W0veUu3LA,1856
94
94
  streamlit/elements/toast.py,sha256=UFh4Is6a9-aWG43SZadknKOEC16_KIvg6AR9QR1tnxk,3711
95
95
  streamlit/elements/vega_charts.py,sha256=dF2ftCF6bMm74jfD5jXqQBH82IPpblbPtZVca9rVCZs,77905
96
- streamlit/elements/write.py,sha256=V61gXtoEYGryJVijobBGNd8Qa8hAnJPju7M0d-PQ4z4,20931
96
+ streamlit/elements/write.py,sha256=HbuEimkPB7K6croqQdrKAix9OR55oL7UootnriH2ivg,21690
97
97
  streamlit/elements/lib/__init__.py,sha256=Vrf1yVMOcTyhUPnYvsfyeL96Vpd5z8KoSV5ZzTcTQgU,616
98
98
  streamlit/elements/lib/built_in_chart_utils.py,sha256=J9YiPmS9uWIeIEUEgC_FmcXxQAmc1m2p9zcHm_KII2g,37621
99
99
  streamlit/elements/lib/column_config_utils.py,sha256=QA_jiyqYFB9mGSVu31C5jxFfAyZRDxGgwqA-0MspVJc,16176
@@ -110,7 +110,7 @@ streamlit/elements/lib/subtitle_utils.py,sha256=ciPgQ6Yi3NS7OdFgDH6lGFwDZpv022fl
110
110
  streamlit/elements/lib/utils.py,sha256=ko1uhpuIX21vSCZfDf7cqtcI6_6_3eKk_aro5X0WVvY,7976
111
111
  streamlit/elements/widgets/__init__.py,sha256=Vrf1yVMOcTyhUPnYvsfyeL96Vpd5z8KoSV5ZzTcTQgU,616
112
112
  streamlit/elements/widgets/button.py,sha256=GQgrt7ZPF-TKq19YYbyl9h-oUJHqHXaUDtBSIi95z0I,31932
113
- streamlit/elements/widgets/button_group.py,sha256=cDPpSqLhCMxzjbefa3smx41RtT--VX1FWKq-hlskah4,15205
113
+ streamlit/elements/widgets/button_group.py,sha256=doPrg_cjOMA3JXtH7gFLDyUuT7Z1C27BFgPfau0Xr_4,16223
114
114
  streamlit/elements/widgets/camera_input.py,sha256=qODQgcKPCxA3DmepYG8ZEH-GGMne3TXqiHNhhMKlqN0,8525
115
115
  streamlit/elements/widgets/chat.py,sha256=eY-1ePzy-oIlN9s6zRR9vEtzUqKs0l5QsFzuO47I334,14308
116
116
  streamlit/elements/widgets/checkbox.py,sha256=vMYLq7PqL5-zphsTLnBNPD7Di3aCM2T-Jgc-RULg0qI,11339
@@ -541,9 +541,9 @@ streamlit/web/server/server_util.py,sha256=C3M971XFoEXTMufQLwHbZdtZOE30nWx-2WiXm
541
541
  streamlit/web/server/stats_request_handler.py,sha256=e144zIhzLTB1PN4CwTCxElCoWMuo9IsBEPex2exHCQ0,3641
542
542
  streamlit/web/server/upload_file_request_handler.py,sha256=ftyKpARrUjOpRcFETIXuoTyOG_mo-ToOw5NI0y_W4lE,5003
543
543
  streamlit/web/server/websocket_headers.py,sha256=uUxypj04ondEC4ocBiYCndX_N06Zwe1Mt690Vupe08Y,2232
544
- streamlit_nightly-1.37.2.dev20240815.data/scripts/streamlit.cmd,sha256=ZEYM3vBJSp-k7vwSJ3ba5NzEk9-qHdSeLvGYAAe1mMw,676
545
- streamlit_nightly-1.37.2.dev20240815.dist-info/METADATA,sha256=3qIXC53E-goMgzFXT08Gr0ayvpoShoAypqdv8n2SO1g,8511
546
- streamlit_nightly-1.37.2.dev20240815.dist-info/WHEEL,sha256=M4n4zmFKzQZk4mLCcycNIzIXO7YPKE_b5Cw4PnhHEg8,109
547
- streamlit_nightly-1.37.2.dev20240815.dist-info/entry_points.txt,sha256=uNJ4DwGNXEhOK0USwSNanjkYyR-Bk7eYQbJFDrWyOgY,53
548
- streamlit_nightly-1.37.2.dev20240815.dist-info/top_level.txt,sha256=V3FhKbm7G2LnR0s4SytavrjIPNIhvcsAGXfYHAwtQzw,10
549
- streamlit_nightly-1.37.2.dev20240815.dist-info/RECORD,,
544
+ streamlit_nightly-1.37.2.dev20240817.data/scripts/streamlit.cmd,sha256=ZEYM3vBJSp-k7vwSJ3ba5NzEk9-qHdSeLvGYAAe1mMw,676
545
+ streamlit_nightly-1.37.2.dev20240817.dist-info/METADATA,sha256=lUlTFOtcg4TuOZb_bgh2KKKz7G8-5Qb9czPJOcw2_NY,8511
546
+ streamlit_nightly-1.37.2.dev20240817.dist-info/WHEEL,sha256=M4n4zmFKzQZk4mLCcycNIzIXO7YPKE_b5Cw4PnhHEg8,109
547
+ streamlit_nightly-1.37.2.dev20240817.dist-info/entry_points.txt,sha256=uNJ4DwGNXEhOK0USwSNanjkYyR-Bk7eYQbJFDrWyOgY,53
548
+ streamlit_nightly-1.37.2.dev20240817.dist-info/top_level.txt,sha256=V3FhKbm7G2LnR0s4SytavrjIPNIhvcsAGXfYHAwtQzw,10
549
+ streamlit_nightly-1.37.2.dev20240817.dist-info/RECORD,,