reflex 0.5.10a3__py3-none-any.whl → 0.6.0a1__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.
Potentially problematic release.
This version of reflex might be problematic. Click here for more details.
- reflex/.templates/jinja/web/pages/utils.js.jinja2 +4 -4
- reflex/.templates/jinja/web/utils/context.js.jinja2 +1 -1
- reflex/.templates/jinja/web/utils/theme.js.jinja2 +1 -1
- reflex/__init__.py +3 -2
- reflex/__init__.pyi +2 -2
- reflex/app.py +43 -9
- reflex/base.py +3 -2
- reflex/compiler/compiler.py +6 -6
- reflex/compiler/utils.py +5 -3
- reflex/components/base/app_wrap.py +2 -4
- reflex/components/base/app_wrap.pyi +17 -17
- reflex/components/base/bare.py +7 -4
- reflex/components/base/body.pyi +17 -17
- reflex/components/base/document.pyi +81 -81
- reflex/components/base/error_boundary.py +10 -8
- reflex/components/base/error_boundary.pyi +20 -19
- reflex/components/base/fragment.pyi +17 -17
- reflex/components/base/head.pyi +33 -33
- reflex/components/base/link.pyi +34 -33
- reflex/components/base/meta.pyi +65 -65
- reflex/components/base/script.py +2 -1
- reflex/components/base/script.pyi +21 -20
- reflex/components/component.py +116 -145
- reflex/components/core/banner.py +59 -60
- reflex/components/core/banner.pyi +86 -150
- reflex/components/core/client_side_routing.py +2 -1
- reflex/components/core/client_side_routing.pyi +34 -33
- reflex/components/core/clipboard.py +2 -2
- reflex/components/core/clipboard.pyi +19 -18
- reflex/components/core/cond.py +21 -44
- reflex/components/core/debounce.py +6 -8
- reflex/components/core/debounce.pyi +19 -18
- reflex/components/core/foreach.py +5 -14
- reflex/components/core/html.pyi +18 -17
- reflex/components/core/match.py +36 -43
- reflex/components/core/upload.py +32 -25
- reflex/components/core/upload.pyi +84 -73
- reflex/components/datadisplay/code.py +55 -28
- reflex/components/datadisplay/code.pyi +20 -17
- reflex/components/datadisplay/dataeditor.py +17 -11
- reflex/components/datadisplay/dataeditor.pyi +34 -33
- reflex/components/el/__init__.py +0 -1
- reflex/components/el/__init__.pyi +0 -11
- reflex/components/el/element.pyi +17 -17
- reflex/components/el/elements/__init__.py +1 -7
- reflex/components/el/elements/__init__.pyi +1 -15
- reflex/components/el/elements/base.pyi +18 -17
- reflex/components/el/elements/forms.py +24 -31
- reflex/components/el/elements/forms.pyi +237 -236
- reflex/components/el/elements/inline.pyi +450 -449
- reflex/components/el/elements/media.py +0 -21
- reflex/components/el/elements/media.pyi +338 -337
- reflex/components/el/elements/metadata.py +3 -2
- reflex/components/el/elements/metadata.pyi +98 -97
- reflex/components/el/elements/other.pyi +114 -113
- reflex/components/el/elements/scripts.pyi +50 -49
- reflex/components/el/elements/sectioning.pyi +242 -241
- reflex/components/el/elements/tables.pyi +162 -161
- reflex/components/el/elements/typography.pyi +242 -241
- reflex/components/gridjs/datatable.py +13 -14
- reflex/components/gridjs/datatable.pyi +34 -33
- reflex/components/lucide/icon.py +2 -126
- reflex/components/lucide/icon.pyi +34 -142
- reflex/components/markdown/markdown.py +30 -35
- reflex/components/markdown/markdown.pyi +29 -32
- reflex/components/moment/moment.pyi +19 -18
- reflex/components/next/base.pyi +17 -17
- reflex/components/next/image.py +0 -4
- reflex/components/next/image.pyi +20 -19
- reflex/components/next/link.pyi +18 -17
- reflex/components/next/video.pyi +18 -17
- reflex/components/plotly/plotly.py +16 -28
- reflex/components/plotly/plotly.pyi +36 -35
- reflex/components/props.py +21 -10
- reflex/components/radix/__init__.pyi +1 -1
- reflex/components/radix/primitives/__init__.pyi +0 -1
- reflex/components/radix/primitives/accordion.py +7 -8
- reflex/components/radix/primitives/accordion.pyi +117 -116
- reflex/components/radix/primitives/base.pyi +34 -33
- reflex/components/radix/primitives/drawer.pyi +169 -168
- reflex/components/radix/primitives/form.pyi +168 -167
- reflex/components/radix/primitives/progress.pyi +82 -81
- reflex/components/radix/primitives/slider.pyi +84 -83
- reflex/components/radix/themes/base.py +8 -4
- reflex/components/radix/themes/base.pyi +114 -113
- reflex/components/radix/themes/color_mode.py +12 -21
- reflex/components/radix/themes/color_mode.pyi +67 -67
- reflex/components/radix/themes/components/__init__.pyi +1 -0
- reflex/components/radix/themes/components/alert_dialog.pyi +118 -117
- reflex/components/radix/themes/components/aspect_ratio.pyi +18 -17
- reflex/components/radix/themes/components/avatar.pyi +18 -17
- reflex/components/radix/themes/components/badge.pyi +18 -17
- reflex/components/radix/themes/components/button.pyi +18 -17
- reflex/components/radix/themes/components/callout.pyi +82 -81
- reflex/components/radix/themes/components/card.pyi +18 -17
- reflex/components/radix/themes/components/checkbox.py +2 -3
- reflex/components/radix/themes/components/checkbox.pyi +53 -52
- reflex/components/radix/themes/components/checkbox_cards.pyi +34 -33
- reflex/components/radix/themes/components/checkbox_group.pyi +34 -33
- reflex/components/radix/themes/components/context_menu.pyi +140 -139
- reflex/components/radix/themes/components/data_list.py +5 -0
- reflex/components/radix/themes/components/data_list.pyi +71 -65
- reflex/components/radix/themes/components/dialog.pyi +121 -120
- reflex/components/radix/themes/components/dropdown_menu.pyi +142 -141
- reflex/components/radix/themes/components/hover_card.pyi +68 -67
- reflex/components/radix/themes/components/icon_button.py +2 -1
- reflex/components/radix/themes/components/icon_button.pyi +18 -17
- reflex/components/radix/themes/components/inset.pyi +18 -17
- reflex/components/radix/themes/components/popover.pyi +73 -72
- reflex/components/radix/themes/components/progress.pyi +18 -17
- reflex/components/radix/themes/components/radio.pyi +18 -17
- reflex/components/radix/themes/components/radio_cards.pyi +35 -34
- reflex/components/radix/themes/components/radio_group.py +35 -31
- reflex/components/radix/themes/components/radio_group.pyi +73 -66
- reflex/components/radix/themes/components/scroll_area.pyi +18 -17
- reflex/components/radix/themes/components/segmented_control.pyi +35 -34
- reflex/components/radix/themes/components/select.py +2 -1
- reflex/components/radix/themes/components/select.pyi +155 -154
- reflex/components/radix/themes/components/separator.py +2 -3
- reflex/components/radix/themes/components/separator.pyi +18 -17
- reflex/components/radix/themes/components/skeleton.pyi +18 -17
- reflex/components/radix/themes/components/slider.py +2 -1
- reflex/components/radix/themes/components/slider.pyi +20 -19
- reflex/components/radix/themes/components/spinner.pyi +18 -17
- reflex/components/radix/themes/components/switch.pyi +19 -18
- reflex/components/radix/themes/components/table.pyi +114 -113
- reflex/components/radix/themes/components/tabs.pyi +84 -83
- reflex/components/radix/themes/components/text_area.pyi +21 -20
- reflex/components/radix/themes/components/text_field.py +0 -79
- reflex/components/radix/themes/components/text_field.pyi +57 -63
- reflex/components/radix/themes/components/tooltip.pyi +21 -20
- reflex/components/radix/themes/layout/base.pyi +18 -17
- reflex/components/radix/themes/layout/box.pyi +18 -17
- reflex/components/radix/themes/layout/center.pyi +18 -17
- reflex/components/radix/themes/layout/container.py +2 -3
- reflex/components/radix/themes/layout/container.pyi +18 -17
- reflex/components/radix/themes/layout/flex.pyi +18 -17
- reflex/components/radix/themes/layout/grid.pyi +18 -17
- reflex/components/radix/themes/layout/list.py +5 -4
- reflex/components/radix/themes/layout/list.pyi +86 -85
- reflex/components/radix/themes/layout/section.py +2 -3
- reflex/components/radix/themes/layout/section.pyi +18 -17
- reflex/components/radix/themes/layout/spacer.pyi +18 -17
- reflex/components/radix/themes/layout/stack.pyi +50 -49
- reflex/components/radix/themes/typography/blockquote.pyi +18 -17
- reflex/components/radix/themes/typography/code.pyi +18 -17
- reflex/components/radix/themes/typography/heading.pyi +18 -17
- reflex/components/radix/themes/typography/link.pyi +18 -17
- reflex/components/radix/themes/typography/text.pyi +114 -113
- reflex/components/react_player/audio.pyi +34 -33
- reflex/components/react_player/react_player.pyi +34 -33
- reflex/components/react_player/video.pyi +34 -33
- reflex/components/recharts/cartesian.py +23 -19
- reflex/components/recharts/cartesian.pyi +297 -296
- reflex/components/recharts/charts.py +6 -5
- reflex/components/recharts/charts.pyi +179 -178
- reflex/components/recharts/general.py +8 -7
- reflex/components/recharts/general.pyi +82 -81
- reflex/components/recharts/polar.py +14 -13
- reflex/components/recharts/polar.pyi +76 -75
- reflex/components/recharts/recharts.pyi +33 -33
- reflex/components/sonner/toast.py +30 -33
- reflex/components/sonner/toast.pyi +27 -25
- reflex/components/suneditor/editor.py +2 -1
- reflex/components/suneditor/editor.pyi +27 -26
- reflex/components/tags/iter_tag.py +16 -16
- reflex/components/tags/tag.py +8 -10
- reflex/constants/base.py +3 -1
- reflex/constants/event.py +1 -0
- reflex/event.py +89 -79
- reflex/experimental/__init__.py +25 -6
- reflex/experimental/client_state.py +34 -58
- reflex/experimental/hooks.py +13 -18
- reflex/experimental/layout.py +5 -5
- reflex/experimental/layout.pyi +84 -83
- reflex/{experimental/vars → ivars}/__init__.py +0 -1
- reflex/ivars/base.py +2180 -0
- reflex/ivars/function.py +200 -0
- reflex/ivars/number.py +1137 -0
- reflex/ivars/object.py +564 -0
- reflex/ivars/sequence.py +1601 -0
- reflex/model.py +22 -0
- reflex/reflex.py +4 -0
- reflex/state.py +388 -73
- reflex/style.py +52 -34
- reflex/testing.py +8 -3
- reflex/utils/exceptions.py +12 -0
- reflex/utils/exec.py +0 -14
- reflex/utils/format.py +74 -223
- reflex/utils/net.py +43 -0
- reflex/utils/path_ops.py +13 -1
- reflex/utils/prerequisites.py +46 -26
- reflex/utils/pyi_generator.py +5 -4
- reflex/utils/serializers.py +13 -31
- reflex/utils/types.py +44 -9
- reflex/vars.py +127 -2230
- {reflex-0.5.10a3.dist-info → reflex-0.6.0a1.dist-info}/METADATA +4 -6
- reflex-0.6.0a1.dist-info/RECORD +384 -0
- reflex/.templates/apps/demo/.gitignore +0 -4
- reflex/.templates/apps/demo/assets/favicon.ico +0 -0
- reflex/.templates/apps/demo/assets/github.svg +0 -10
- reflex/.templates/apps/demo/assets/icon.svg +0 -37
- reflex/.templates/apps/demo/assets/logo.svg +0 -68
- reflex/.templates/apps/demo/assets/paneleft.svg +0 -13
- reflex/.templates/apps/demo/code/__init__.py +0 -1
- reflex/.templates/apps/demo/code/demo.py +0 -127
- reflex/.templates/apps/demo/code/pages/__init__.py +0 -7
- reflex/.templates/apps/demo/code/pages/chatapp.py +0 -31
- reflex/.templates/apps/demo/code/pages/datatable.py +0 -360
- reflex/.templates/apps/demo/code/pages/forms.py +0 -257
- reflex/.templates/apps/demo/code/pages/graphing.py +0 -253
- reflex/.templates/apps/demo/code/pages/home.py +0 -56
- reflex/.templates/apps/demo/code/sidebar.py +0 -178
- reflex/.templates/apps/demo/code/state.py +0 -22
- reflex/.templates/apps/demo/code/states/form_state.py +0 -40
- reflex/.templates/apps/demo/code/states/pie_state.py +0 -47
- reflex/.templates/apps/demo/code/styles.py +0 -68
- reflex/.templates/apps/demo/code/webui/__init__.py +0 -0
- reflex/.templates/apps/demo/code/webui/components/__init__.py +0 -4
- reflex/.templates/apps/demo/code/webui/components/chat.py +0 -118
- reflex/.templates/apps/demo/code/webui/components/loading_icon.py +0 -19
- reflex/.templates/apps/demo/code/webui/components/modal.py +0 -56
- reflex/.templates/apps/demo/code/webui/components/navbar.py +0 -70
- reflex/.templates/apps/demo/code/webui/components/sidebar.py +0 -66
- reflex/.templates/apps/demo/code/webui/state.py +0 -146
- reflex/.templates/apps/demo/code/webui/styles.py +0 -88
- reflex/experimental/vars/base.py +0 -583
- reflex/experimental/vars/function.py +0 -290
- reflex/experimental/vars/number.py +0 -1458
- reflex/experimental/vars/object.py +0 -804
- reflex/experimental/vars/sequence.py +0 -1764
- reflex/utils/watch.py +0 -96
- reflex/vars.pyi +0 -218
- reflex-0.5.10a3.dist-info/RECORD +0 -413
- {reflex-0.5.10a3.dist-info → reflex-0.6.0a1.dist-info}/LICENSE +0 -0
- {reflex-0.5.10a3.dist-info → reflex-0.6.0a1.dist-info}/WHEEL +0 -0
- {reflex-0.5.10a3.dist-info → reflex-0.6.0a1.dist-info}/entry_points.txt +0 -0
reflex/utils/pyi_generator.py
CHANGED
|
@@ -19,8 +19,8 @@ from types import ModuleType, SimpleNamespace
|
|
|
19
19
|
from typing import Any, Callable, Iterable, Type, get_args
|
|
20
20
|
|
|
21
21
|
from reflex.components.component import Component
|
|
22
|
+
from reflex.ivars.base import ImmutableVar
|
|
22
23
|
from reflex.utils import types as rx_types
|
|
23
|
-
from reflex.vars import Var
|
|
24
24
|
|
|
25
25
|
logger = logging.getLogger("pyi_generator")
|
|
26
26
|
|
|
@@ -69,10 +69,11 @@ DEFAULT_TYPING_IMPORTS = {
|
|
|
69
69
|
# TODO: fix import ordering and unused imports with ruff later
|
|
70
70
|
DEFAULT_IMPORTS = {
|
|
71
71
|
"typing": sorted(DEFAULT_TYPING_IMPORTS),
|
|
72
|
-
"reflex.vars": ["Var"
|
|
72
|
+
"reflex.vars": ["Var"],
|
|
73
73
|
"reflex.components.core.breakpoints": ["Breakpoints"],
|
|
74
74
|
"reflex.event": ["EventChain", "EventHandler", "EventSpec"],
|
|
75
75
|
"reflex.style": ["Style"],
|
|
76
|
+
"reflex.ivars.base": ["ImmutableVar"],
|
|
76
77
|
}
|
|
77
78
|
|
|
78
79
|
|
|
@@ -355,7 +356,7 @@ def _extract_class_props_as_ast_nodes(
|
|
|
355
356
|
with contextlib.suppress(AttributeError, KeyError):
|
|
356
357
|
# Try to get default from pydantic field definition.
|
|
357
358
|
default = target_class.__fields__[name].default
|
|
358
|
-
if isinstance(default,
|
|
359
|
+
if isinstance(default, ImmutableVar):
|
|
359
360
|
default = default._decode() # type: ignore
|
|
360
361
|
|
|
361
362
|
kwargs.append(
|
|
@@ -433,7 +434,7 @@ def _generate_component_create_functiondef(
|
|
|
433
434
|
ast.arg(
|
|
434
435
|
arg=trigger,
|
|
435
436
|
annotation=ast.Name(
|
|
436
|
-
id="Optional[Union[EventHandler, EventSpec, list, Callable,
|
|
437
|
+
id="Optional[Union[EventHandler, EventSpec, list, Callable, ImmutableVar]]"
|
|
437
438
|
),
|
|
438
439
|
),
|
|
439
440
|
ast.Constant(value=None),
|
reflex/utils/serializers.py
CHANGED
|
@@ -4,7 +4,6 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import functools
|
|
6
6
|
import json
|
|
7
|
-
import types as builtin_types
|
|
8
7
|
import warnings
|
|
9
8
|
from datetime import date, datetime, time, timedelta
|
|
10
9
|
from enum import Enum
|
|
@@ -26,7 +25,7 @@ from typing import (
|
|
|
26
25
|
|
|
27
26
|
from reflex.base import Base
|
|
28
27
|
from reflex.constants.colors import Color, format_color
|
|
29
|
-
from reflex.utils import
|
|
28
|
+
from reflex.utils import types
|
|
30
29
|
|
|
31
30
|
# Mapping from type to a serializer.
|
|
32
31
|
# The serializer should convert the type to a JSON object.
|
|
@@ -250,7 +249,14 @@ def serialize_base(value: Base) -> str:
|
|
|
250
249
|
Returns:
|
|
251
250
|
The serialized Base.
|
|
252
251
|
"""
|
|
253
|
-
|
|
252
|
+
from reflex.ivars import LiteralObjectVar
|
|
253
|
+
|
|
254
|
+
return str(
|
|
255
|
+
LiteralObjectVar.create(
|
|
256
|
+
{k: (None if callable(v) else v) for k, v in value.dict().items()},
|
|
257
|
+
_var_type=type(value),
|
|
258
|
+
)
|
|
259
|
+
)
|
|
254
260
|
|
|
255
261
|
|
|
256
262
|
@serializer
|
|
@@ -263,13 +269,9 @@ def serialize_list(value: Union[List, Tuple, Set]) -> str:
|
|
|
263
269
|
Returns:
|
|
264
270
|
The serialized list.
|
|
265
271
|
"""
|
|
266
|
-
from reflex.
|
|
272
|
+
from reflex.ivars import LiteralArrayVar
|
|
267
273
|
|
|
268
|
-
|
|
269
|
-
fprop = format.json_dumps(list(value))
|
|
270
|
-
|
|
271
|
-
# Unwrap var values.
|
|
272
|
-
return format.unwrap_vars(fprop)
|
|
274
|
+
return str(LiteralArrayVar.create(value))
|
|
273
275
|
|
|
274
276
|
|
|
275
277
|
@serializer
|
|
@@ -281,30 +283,10 @@ def serialize_dict(prop: Dict[str, Any]) -> str:
|
|
|
281
283
|
|
|
282
284
|
Returns:
|
|
283
285
|
The serialized dictionary.
|
|
284
|
-
|
|
285
|
-
Raises:
|
|
286
|
-
InvalidStylePropError: If the style prop is invalid.
|
|
287
286
|
"""
|
|
288
|
-
|
|
289
|
-
from reflex.event import EventHandler
|
|
290
|
-
from reflex.utils import format
|
|
291
|
-
|
|
292
|
-
prop_dict = {}
|
|
293
|
-
|
|
294
|
-
for key, value in prop.items():
|
|
295
|
-
if types._issubclass(type(value), Callable):
|
|
296
|
-
raise exceptions.InvalidStylePropError(
|
|
297
|
-
f"The style prop `{format.to_snake_case(key)}` cannot have " # type: ignore
|
|
298
|
-
f"`{value.fn.__qualname__ if isinstance(value, EventHandler) else value.__qualname__ if isinstance(value, builtin_types.FunctionType) else value}`, "
|
|
299
|
-
f"an event handler or callable as its value"
|
|
300
|
-
)
|
|
301
|
-
prop_dict[key] = value
|
|
302
|
-
|
|
303
|
-
# Dump the dict to a string.
|
|
304
|
-
fprop = format.json_dumps(prop_dict)
|
|
287
|
+
from reflex.ivars import LiteralObjectVar
|
|
305
288
|
|
|
306
|
-
|
|
307
|
-
return format.unwrap_vars(fprop)
|
|
289
|
+
return str(LiteralObjectVar.create(prop))
|
|
308
290
|
|
|
309
291
|
|
|
310
292
|
@serializer(to=str)
|
reflex/utils/types.py
CHANGED
|
@@ -6,7 +6,7 @@ import contextlib
|
|
|
6
6
|
import inspect
|
|
7
7
|
import sys
|
|
8
8
|
import types
|
|
9
|
-
from functools import cached_property, wraps
|
|
9
|
+
from functools import cached_property, lru_cache, wraps
|
|
10
10
|
from typing import (
|
|
11
11
|
Any,
|
|
12
12
|
Callable,
|
|
@@ -21,9 +21,11 @@ from typing import (
|
|
|
21
21
|
Union,
|
|
22
22
|
_GenericAlias, # type: ignore
|
|
23
23
|
get_args,
|
|
24
|
-
get_origin,
|
|
25
24
|
get_type_hints,
|
|
26
25
|
)
|
|
26
|
+
from typing import (
|
|
27
|
+
get_origin as get_origin_og,
|
|
28
|
+
)
|
|
27
29
|
|
|
28
30
|
import sqlalchemy
|
|
29
31
|
|
|
@@ -93,7 +95,7 @@ PrimitiveType = Union[int, float, bool, str, list, dict, set, tuple]
|
|
|
93
95
|
StateVar = Union[PrimitiveType, Base, None]
|
|
94
96
|
StateIterVar = Union[list, set, tuple]
|
|
95
97
|
|
|
96
|
-
# ArgsSpec = Callable[[
|
|
98
|
+
# ArgsSpec = Callable[[ImmutableVar], list[ImmutableVar]]
|
|
97
99
|
ArgsSpec = Callable
|
|
98
100
|
|
|
99
101
|
|
|
@@ -109,6 +111,11 @@ RESERVED_BACKEND_VAR_NAMES = {
|
|
|
109
111
|
"_was_touched",
|
|
110
112
|
}
|
|
111
113
|
|
|
114
|
+
if sys.version_info >= (3, 11):
|
|
115
|
+
from typing import Self as Self
|
|
116
|
+
else:
|
|
117
|
+
from typing_extensions import Self as Self
|
|
118
|
+
|
|
112
119
|
|
|
113
120
|
class Unset:
|
|
114
121
|
"""A class to represent an unset value.
|
|
@@ -133,6 +140,20 @@ class Unset:
|
|
|
133
140
|
return False
|
|
134
141
|
|
|
135
142
|
|
|
143
|
+
@lru_cache()
|
|
144
|
+
def get_origin(tp):
|
|
145
|
+
"""Get the origin of a class.
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
tp: The class to get the origin of.
|
|
149
|
+
|
|
150
|
+
Returns:
|
|
151
|
+
The origin of the class.
|
|
152
|
+
"""
|
|
153
|
+
return get_origin_og(tp)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
@lru_cache()
|
|
136
157
|
def is_generic_alias(cls: GenericType) -> bool:
|
|
137
158
|
"""Check whether the class is a generic alias.
|
|
138
159
|
|
|
@@ -157,6 +178,7 @@ def is_none(cls: GenericType) -> bool:
|
|
|
157
178
|
return cls is type(None) or cls is None
|
|
158
179
|
|
|
159
180
|
|
|
181
|
+
@lru_cache()
|
|
160
182
|
def is_union(cls: GenericType) -> bool:
|
|
161
183
|
"""Check if a class is a Union.
|
|
162
184
|
|
|
@@ -169,6 +191,7 @@ def is_union(cls: GenericType) -> bool:
|
|
|
169
191
|
return get_origin(cls) in UnionTypes
|
|
170
192
|
|
|
171
193
|
|
|
194
|
+
@lru_cache()
|
|
172
195
|
def is_literal(cls: GenericType) -> bool:
|
|
173
196
|
"""Check if a class is a Literal.
|
|
174
197
|
|
|
@@ -222,9 +245,14 @@ def get_attribute_access_type(cls: GenericType, name: str) -> GenericType | None
|
|
|
222
245
|
"""
|
|
223
246
|
from reflex.model import Model
|
|
224
247
|
|
|
225
|
-
|
|
248
|
+
try:
|
|
249
|
+
attr = getattr(cls, name, None)
|
|
250
|
+
except NotImplementedError:
|
|
251
|
+
attr = None
|
|
252
|
+
|
|
226
253
|
if hint := get_property_hint(attr):
|
|
227
254
|
return hint
|
|
255
|
+
|
|
228
256
|
if (
|
|
229
257
|
hasattr(cls, "__fields__")
|
|
230
258
|
and name in cls.__fields__
|
|
@@ -314,6 +342,7 @@ def get_attribute_access_type(cls: GenericType, name: str) -> GenericType | None
|
|
|
314
342
|
return None # Attribute is not accessible.
|
|
315
343
|
|
|
316
344
|
|
|
345
|
+
@lru_cache()
|
|
317
346
|
def get_base_class(cls: GenericType) -> Type:
|
|
318
347
|
"""Get the base class of a class.
|
|
319
348
|
|
|
@@ -485,17 +514,23 @@ def is_backend_base_variable(name: str, cls: Type) -> bool:
|
|
|
485
514
|
if name in cls.inherited_backend_vars:
|
|
486
515
|
return False
|
|
487
516
|
|
|
517
|
+
from reflex.ivars.base import is_computed_var
|
|
518
|
+
|
|
488
519
|
if name in cls.__dict__:
|
|
489
520
|
value = cls.__dict__[name]
|
|
490
521
|
if type(value) == classmethod:
|
|
491
522
|
return False
|
|
492
523
|
if callable(value):
|
|
493
524
|
return False
|
|
494
|
-
from reflex.vars import ComputedVar
|
|
495
525
|
|
|
496
526
|
if isinstance(
|
|
497
|
-
value,
|
|
498
|
-
|
|
527
|
+
value,
|
|
528
|
+
(
|
|
529
|
+
types.FunctionType,
|
|
530
|
+
property,
|
|
531
|
+
cached_property,
|
|
532
|
+
),
|
|
533
|
+
) or is_computed_var(value):
|
|
499
534
|
return False
|
|
500
535
|
|
|
501
536
|
return True
|
|
@@ -555,11 +590,11 @@ def validate_literal(key: str, value: Any, expected_type: Type, comp_name: str):
|
|
|
555
590
|
Raises:
|
|
556
591
|
ValueError: When the value is not a valid literal.
|
|
557
592
|
"""
|
|
558
|
-
from reflex.
|
|
593
|
+
from reflex.ivars import ImmutableVar
|
|
559
594
|
|
|
560
595
|
if (
|
|
561
596
|
is_literal(expected_type)
|
|
562
|
-
and not isinstance(value,
|
|
597
|
+
and not isinstance(value, ImmutableVar) # validating vars is not supported yet.
|
|
563
598
|
and not is_encoded_fstring(value) # f-strings are not supported.
|
|
564
599
|
and value not in expected_type.__args__
|
|
565
600
|
):
|