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.
- streamlit/components/v1/component_arrow.py +2 -2
- streamlit/dataframe_util.py +93 -25
- streamlit/elements/json.py +12 -5
- streamlit/elements/widgets/button_group.py +27 -8
- streamlit/elements/write.py +18 -3
- streamlit/type_util.py +17 -47
- {streamlit_nightly-1.37.2.dev20240815.dist-info → streamlit_nightly-1.37.2.dev20240817.dist-info}/METADATA +1 -1
- {streamlit_nightly-1.37.2.dev20240815.dist-info → streamlit_nightly-1.37.2.dev20240817.dist-info}/RECORD +12 -12
- {streamlit_nightly-1.37.2.dev20240815.data → streamlit_nightly-1.37.2.dev20240817.data}/scripts/streamlit.cmd +0 -0
- {streamlit_nightly-1.37.2.dev20240815.dist-info → streamlit_nightly-1.37.2.dev20240817.dist-info}/WHEEL +0 -0
- {streamlit_nightly-1.37.2.dev20240815.dist-info → streamlit_nightly-1.37.2.dev20240817.dist-info}/entry_points.txt +0 -0
- {streamlit_nightly-1.37.2.dev20240815.dist-info → streamlit_nightly-1.37.2.dev20240817.dist-info}/top_level.txt +0 -0
@@ -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
|
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
|
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"
|
streamlit/dataframe_util.py
CHANGED
@@ -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
|
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
|
-
|
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 :
|
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 :
|
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
|
-
|
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 :
|
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)):
|
streamlit/elements/json.py
CHANGED
@@ -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
|
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(
|
90
|
-
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
|
93
|
-
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
|
-
|
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:
|
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:
|
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
|
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']. "
|
streamlit/elements/write.py
CHANGED
@@ -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(
|
262
|
-
|
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
|
|
@@ -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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
545
|
-
streamlit_nightly-1.37.2.
|
546
|
-
streamlit_nightly-1.37.2.
|
547
|
-
streamlit_nightly-1.37.2.
|
548
|
-
streamlit_nightly-1.37.2.
|
549
|
-
streamlit_nightly-1.37.2.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|