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/style.py
CHANGED
|
@@ -6,12 +6,13 @@ from typing import Any, Literal, Tuple, Type
|
|
|
6
6
|
|
|
7
7
|
from reflex import constants
|
|
8
8
|
from reflex.components.core.breakpoints import Breakpoints, breakpoints_values
|
|
9
|
-
from reflex.event import EventChain
|
|
9
|
+
from reflex.event import EventChain, EventHandler
|
|
10
|
+
from reflex.ivars.base import ImmutableCallableVar, ImmutableVar, LiteralVar
|
|
11
|
+
from reflex.ivars.function import FunctionVar
|
|
10
12
|
from reflex.utils import format
|
|
13
|
+
from reflex.utils.exceptions import ReflexError
|
|
11
14
|
from reflex.utils.imports import ImportVar
|
|
12
|
-
from reflex.vars import
|
|
13
|
-
|
|
14
|
-
VarData.update_forward_refs() # Ensure all type definitions are resolved
|
|
15
|
+
from reflex.vars import Var, VarData
|
|
15
16
|
|
|
16
17
|
SYSTEM_COLOR_MODE: str = "system"
|
|
17
18
|
LIGHT_COLOR_MODE: str = "light"
|
|
@@ -25,7 +26,7 @@ color_mode_imports = {
|
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
|
|
28
|
-
def _color_mode_var(_var_name: str, _var_type: Type = str) ->
|
|
29
|
+
def _color_mode_var(_var_name: str, _var_type: Type = str) -> ImmutableVar:
|
|
29
30
|
"""Create a Var that destructs the _var_name from ColorModeContext.
|
|
30
31
|
|
|
31
32
|
Args:
|
|
@@ -33,24 +34,22 @@ def _color_mode_var(_var_name: str, _var_type: Type = str) -> BaseVar:
|
|
|
33
34
|
_var_type: The type of the Var.
|
|
34
35
|
|
|
35
36
|
Returns:
|
|
36
|
-
The
|
|
37
|
+
The Var that resolves to the color mode.
|
|
37
38
|
"""
|
|
38
|
-
return
|
|
39
|
+
return ImmutableVar(
|
|
39
40
|
_var_name=_var_name,
|
|
40
41
|
_var_type=_var_type,
|
|
41
|
-
_var_is_local=False,
|
|
42
|
-
_var_is_string=False,
|
|
43
42
|
_var_data=VarData(
|
|
44
43
|
imports=color_mode_imports,
|
|
45
44
|
hooks={f"const {{ {_var_name} }} = useContext(ColorModeContext)": None},
|
|
46
45
|
),
|
|
47
|
-
)
|
|
46
|
+
).guess_type()
|
|
48
47
|
|
|
49
48
|
|
|
50
|
-
@
|
|
49
|
+
@ImmutableCallableVar
|
|
51
50
|
def set_color_mode(
|
|
52
51
|
new_color_mode: LiteralColorMode | Var[LiteralColorMode] | None = None,
|
|
53
|
-
) ->
|
|
52
|
+
) -> ImmutableVar[EventChain]:
|
|
54
53
|
"""Create an EventChain Var that sets the color mode to a specific value.
|
|
55
54
|
|
|
56
55
|
Note: `set_color_mode` is not a real event and cannot be triggered from a
|
|
@@ -69,12 +68,15 @@ def set_color_mode(
|
|
|
69
68
|
if new_color_mode is None:
|
|
70
69
|
return base_setter
|
|
71
70
|
|
|
72
|
-
if not isinstance(new_color_mode,
|
|
73
|
-
new_color_mode =
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
71
|
+
if not isinstance(new_color_mode, ImmutableVar):
|
|
72
|
+
new_color_mode = LiteralVar.create(new_color_mode)
|
|
73
|
+
|
|
74
|
+
return ImmutableVar(
|
|
75
|
+
f"() => {str(base_setter)}({str(new_color_mode)})",
|
|
76
|
+
_var_data=VarData.merge(
|
|
77
|
+
base_setter._get_all_var_data(), new_color_mode._get_all_var_data()
|
|
78
|
+
),
|
|
79
|
+
).to(FunctionVar, EventChain) # type: ignore
|
|
78
80
|
|
|
79
81
|
|
|
80
82
|
# Var resolves to the current color mode for the app ("light", "dark" or "system")
|
|
@@ -111,7 +113,9 @@ def media_query(breakpoint_expr: str):
|
|
|
111
113
|
return f"@media screen and (min-width: {breakpoint_expr})"
|
|
112
114
|
|
|
113
115
|
|
|
114
|
-
def convert_item(
|
|
116
|
+
def convert_item(
|
|
117
|
+
style_item: int | str | Var,
|
|
118
|
+
) -> tuple[str | Var, VarData | VarData | None]:
|
|
115
119
|
"""Format a single value in a style dictionary.
|
|
116
120
|
|
|
117
121
|
Args:
|
|
@@ -119,23 +123,31 @@ def convert_item(style_item: str | Var) -> tuple[str, VarData | None]:
|
|
|
119
123
|
|
|
120
124
|
Returns:
|
|
121
125
|
The formatted style item and any associated VarData.
|
|
126
|
+
|
|
127
|
+
Raises:
|
|
128
|
+
ReflexError: If an EventHandler is used as a style value
|
|
122
129
|
"""
|
|
123
|
-
if isinstance(style_item,
|
|
124
|
-
|
|
125
|
-
|
|
130
|
+
if isinstance(style_item, EventHandler):
|
|
131
|
+
raise ReflexError(
|
|
132
|
+
"EventHandlers cannot be used as style values. "
|
|
133
|
+
"Please use a Var or a literal value."
|
|
134
|
+
)
|
|
126
135
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
136
|
+
if isinstance(style_item, ImmutableVar):
|
|
137
|
+
return style_item, style_item._get_all_var_data()
|
|
138
|
+
|
|
139
|
+
# if isinstance(style_item, str) and REFLEX_VAR_OPENING_TAG not in style_item:
|
|
140
|
+
# return style_item, None
|
|
132
141
|
|
|
133
|
-
|
|
142
|
+
# Otherwise, convert to Var to collapse VarData encoded in f-string.
|
|
143
|
+
new_var = LiteralVar.create(style_item)
|
|
144
|
+
var_data = new_var._get_all_var_data() if new_var is not None else None
|
|
145
|
+
return new_var, var_data
|
|
134
146
|
|
|
135
147
|
|
|
136
148
|
def convert_list(
|
|
137
|
-
responsive_list: list[str | dict |
|
|
138
|
-
) -> tuple[list[str | dict], VarData | None]:
|
|
149
|
+
responsive_list: list[str | dict | ImmutableVar],
|
|
150
|
+
) -> tuple[list[str | dict[str, Var | list | dict]], VarData | None]:
|
|
139
151
|
"""Format a responsive value list.
|
|
140
152
|
|
|
141
153
|
Args:
|
|
@@ -157,7 +169,9 @@ def convert_list(
|
|
|
157
169
|
return converted_value, VarData.merge(*item_var_datas)
|
|
158
170
|
|
|
159
171
|
|
|
160
|
-
def convert(
|
|
172
|
+
def convert(
|
|
173
|
+
style_dict: dict[str, Var | dict | list | str],
|
|
174
|
+
) -> tuple[dict[str, str | list | dict], VarData | None]:
|
|
161
175
|
"""Format a style dictionary.
|
|
162
176
|
|
|
163
177
|
Args:
|
|
@@ -175,7 +189,11 @@ def convert(style_dict):
|
|
|
175
189
|
|
|
176
190
|
for key, value in style_dict.items():
|
|
177
191
|
keys = format_style_key(key)
|
|
178
|
-
if isinstance(value,
|
|
192
|
+
if isinstance(value, ImmutableVar):
|
|
193
|
+
return_val = value
|
|
194
|
+
new_var_data = value._get_all_var_data()
|
|
195
|
+
update_out_dict(return_val, keys)
|
|
196
|
+
elif isinstance(value, dict):
|
|
179
197
|
# Recursively format nested style dictionaries.
|
|
180
198
|
return_val, new_var_data = convert(value)
|
|
181
199
|
update_out_dict(return_val, keys)
|
|
@@ -254,10 +272,10 @@ class Style(dict):
|
|
|
254
272
|
value: The value to set.
|
|
255
273
|
"""
|
|
256
274
|
# Create a Var to collapse VarData encoded in f-string.
|
|
257
|
-
_var =
|
|
275
|
+
_var = LiteralVar.create(value)
|
|
258
276
|
if _var is not None:
|
|
259
277
|
# Carry the imports/hooks when setting a Var as a value.
|
|
260
|
-
self._var_data = VarData.merge(self._var_data, _var.
|
|
278
|
+
self._var_data = VarData.merge(self._var_data, _var._get_all_var_data())
|
|
261
279
|
super().__setitem__(key, value)
|
|
262
280
|
|
|
263
281
|
|
reflex/testing.py
CHANGED
|
@@ -45,6 +45,8 @@ import reflex.utils.prerequisites
|
|
|
45
45
|
import reflex.utils.processes
|
|
46
46
|
from reflex.state import (
|
|
47
47
|
BaseState,
|
|
48
|
+
StateManager,
|
|
49
|
+
StateManagerDisk,
|
|
48
50
|
StateManagerMemory,
|
|
49
51
|
StateManagerRedis,
|
|
50
52
|
reload_state_module,
|
|
@@ -126,7 +128,7 @@ class AppHarness:
|
|
|
126
128
|
frontend_output_thread: Optional[threading.Thread] = None
|
|
127
129
|
backend_thread: Optional[threading.Thread] = None
|
|
128
130
|
backend: Optional[uvicorn.Server] = None
|
|
129
|
-
state_manager: Optional[
|
|
131
|
+
state_manager: Optional[StateManager] = None
|
|
130
132
|
_frontends: list["WebDriver"] = dataclasses.field(default_factory=list)
|
|
131
133
|
_decorated_pages: list = dataclasses.field(default_factory=list)
|
|
132
134
|
|
|
@@ -290,6 +292,8 @@ class AppHarness:
|
|
|
290
292
|
if isinstance(self.app_instance._state_manager, StateManagerRedis):
|
|
291
293
|
# Create our own redis connection for testing.
|
|
292
294
|
self.state_manager = StateManagerRedis.create(self.app_instance.state)
|
|
295
|
+
elif isinstance(self.app_instance._state_manager, StateManagerDisk):
|
|
296
|
+
self.state_manager = StateManagerDisk.create(self.app_instance.state)
|
|
293
297
|
else:
|
|
294
298
|
self.state_manager = self.app_instance._state_manager
|
|
295
299
|
|
|
@@ -327,7 +331,8 @@ class AppHarness:
|
|
|
327
331
|
)
|
|
328
332
|
)
|
|
329
333
|
self.backend.shutdown = self._get_backend_shutdown_handler()
|
|
330
|
-
|
|
334
|
+
with chdir(self.app_path):
|
|
335
|
+
self.backend_thread = threading.Thread(target=self.backend.run)
|
|
331
336
|
self.backend_thread.start()
|
|
332
337
|
|
|
333
338
|
async def _reset_backend_state_manager(self):
|
|
@@ -787,7 +792,7 @@ class AppHarness:
|
|
|
787
792
|
raise RuntimeError("App is not running.")
|
|
788
793
|
state_manager = self.app_instance.state_manager
|
|
789
794
|
assert isinstance(
|
|
790
|
-
state_manager, StateManagerMemory
|
|
795
|
+
state_manager, (StateManagerMemory, StateManagerDisk)
|
|
791
796
|
), "Only works with memory state manager"
|
|
792
797
|
if not self._poll_for(
|
|
793
798
|
target=lambda: state_manager.states,
|
reflex/utils/exceptions.py
CHANGED
|
@@ -79,3 +79,15 @@ class LockExpiredError(ReflexError):
|
|
|
79
79
|
|
|
80
80
|
class MatchTypeError(ReflexError, TypeError):
|
|
81
81
|
"""Raised when the return types of match cases are different."""
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class EventHandlerArgMismatch(ReflexError, TypeError):
|
|
85
|
+
"""Raised when the number of args accepted by an EventHandler is differs from that provided by the event trigger."""
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class EventFnArgMismatch(ReflexError, TypeError):
|
|
89
|
+
"""Raised when the number of args accepted by a lambda differs from that provided by the event trigger."""
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class DynamicRouteArgShadowsStateVar(ReflexError, NameError):
|
|
93
|
+
"""Raised when a dynamic route arg shadows a state var."""
|
reflex/utils/exec.py
CHANGED
|
@@ -18,22 +18,11 @@ from reflex import constants
|
|
|
18
18
|
from reflex.config import get_config
|
|
19
19
|
from reflex.utils import console, path_ops
|
|
20
20
|
from reflex.utils.prerequisites import get_web_dir
|
|
21
|
-
from reflex.utils.watch import AssetFolderWatch
|
|
22
21
|
|
|
23
22
|
# For uvicorn windows bug fix (#2335)
|
|
24
23
|
frontend_process = None
|
|
25
24
|
|
|
26
25
|
|
|
27
|
-
def start_watching_assets_folder(root):
|
|
28
|
-
"""Start watching assets folder.
|
|
29
|
-
|
|
30
|
-
Args:
|
|
31
|
-
root: root path of the project.
|
|
32
|
-
"""
|
|
33
|
-
asset_watch = AssetFolderWatch(root)
|
|
34
|
-
asset_watch.start()
|
|
35
|
-
|
|
36
|
-
|
|
37
26
|
def detect_package_change(json_file_path: str) -> str:
|
|
38
27
|
"""Calculates the SHA-256 hash of a JSON file and returns it as a hexadecimal string.
|
|
39
28
|
|
|
@@ -149,8 +138,6 @@ def run_frontend(root: Path, port: str, backend_present=True):
|
|
|
149
138
|
"""
|
|
150
139
|
from reflex.utils import prerequisites
|
|
151
140
|
|
|
152
|
-
# Start watching asset folder.
|
|
153
|
-
start_watching_assets_folder(root)
|
|
154
141
|
# validate dependencies before run
|
|
155
142
|
prerequisites.validate_frontend_dependencies(init=False)
|
|
156
143
|
|
|
@@ -215,7 +202,6 @@ def run_backend(
|
|
|
215
202
|
log_level=loglevel.value,
|
|
216
203
|
reload=True,
|
|
217
204
|
reload_dirs=[config.app_name],
|
|
218
|
-
reload_excludes=[str(web_dir)],
|
|
219
205
|
)
|
|
220
206
|
|
|
221
207
|
|