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.

Files changed (237) hide show
  1. reflex/.templates/jinja/web/pages/utils.js.jinja2 +4 -4
  2. reflex/.templates/jinja/web/utils/context.js.jinja2 +1 -1
  3. reflex/.templates/jinja/web/utils/theme.js.jinja2 +1 -1
  4. reflex/__init__.py +3 -2
  5. reflex/__init__.pyi +2 -2
  6. reflex/app.py +43 -9
  7. reflex/base.py +3 -2
  8. reflex/compiler/compiler.py +6 -6
  9. reflex/compiler/utils.py +5 -3
  10. reflex/components/base/app_wrap.py +2 -4
  11. reflex/components/base/app_wrap.pyi +17 -17
  12. reflex/components/base/bare.py +7 -4
  13. reflex/components/base/body.pyi +17 -17
  14. reflex/components/base/document.pyi +81 -81
  15. reflex/components/base/error_boundary.py +10 -8
  16. reflex/components/base/error_boundary.pyi +20 -19
  17. reflex/components/base/fragment.pyi +17 -17
  18. reflex/components/base/head.pyi +33 -33
  19. reflex/components/base/link.pyi +34 -33
  20. reflex/components/base/meta.pyi +65 -65
  21. reflex/components/base/script.py +2 -1
  22. reflex/components/base/script.pyi +21 -20
  23. reflex/components/component.py +116 -145
  24. reflex/components/core/banner.py +59 -60
  25. reflex/components/core/banner.pyi +86 -150
  26. reflex/components/core/client_side_routing.py +2 -1
  27. reflex/components/core/client_side_routing.pyi +34 -33
  28. reflex/components/core/clipboard.py +2 -2
  29. reflex/components/core/clipboard.pyi +19 -18
  30. reflex/components/core/cond.py +21 -44
  31. reflex/components/core/debounce.py +6 -8
  32. reflex/components/core/debounce.pyi +19 -18
  33. reflex/components/core/foreach.py +5 -14
  34. reflex/components/core/html.pyi +18 -17
  35. reflex/components/core/match.py +36 -43
  36. reflex/components/core/upload.py +32 -25
  37. reflex/components/core/upload.pyi +84 -73
  38. reflex/components/datadisplay/code.py +55 -28
  39. reflex/components/datadisplay/code.pyi +20 -17
  40. reflex/components/datadisplay/dataeditor.py +17 -11
  41. reflex/components/datadisplay/dataeditor.pyi +34 -33
  42. reflex/components/el/__init__.py +0 -1
  43. reflex/components/el/__init__.pyi +0 -11
  44. reflex/components/el/element.pyi +17 -17
  45. reflex/components/el/elements/__init__.py +1 -7
  46. reflex/components/el/elements/__init__.pyi +1 -15
  47. reflex/components/el/elements/base.pyi +18 -17
  48. reflex/components/el/elements/forms.py +24 -31
  49. reflex/components/el/elements/forms.pyi +237 -236
  50. reflex/components/el/elements/inline.pyi +450 -449
  51. reflex/components/el/elements/media.py +0 -21
  52. reflex/components/el/elements/media.pyi +338 -337
  53. reflex/components/el/elements/metadata.py +3 -2
  54. reflex/components/el/elements/metadata.pyi +98 -97
  55. reflex/components/el/elements/other.pyi +114 -113
  56. reflex/components/el/elements/scripts.pyi +50 -49
  57. reflex/components/el/elements/sectioning.pyi +242 -241
  58. reflex/components/el/elements/tables.pyi +162 -161
  59. reflex/components/el/elements/typography.pyi +242 -241
  60. reflex/components/gridjs/datatable.py +13 -14
  61. reflex/components/gridjs/datatable.pyi +34 -33
  62. reflex/components/lucide/icon.py +2 -126
  63. reflex/components/lucide/icon.pyi +34 -142
  64. reflex/components/markdown/markdown.py +30 -35
  65. reflex/components/markdown/markdown.pyi +29 -32
  66. reflex/components/moment/moment.pyi +19 -18
  67. reflex/components/next/base.pyi +17 -17
  68. reflex/components/next/image.py +0 -4
  69. reflex/components/next/image.pyi +20 -19
  70. reflex/components/next/link.pyi +18 -17
  71. reflex/components/next/video.pyi +18 -17
  72. reflex/components/plotly/plotly.py +16 -28
  73. reflex/components/plotly/plotly.pyi +36 -35
  74. reflex/components/props.py +21 -10
  75. reflex/components/radix/__init__.pyi +1 -1
  76. reflex/components/radix/primitives/__init__.pyi +0 -1
  77. reflex/components/radix/primitives/accordion.py +7 -8
  78. reflex/components/radix/primitives/accordion.pyi +117 -116
  79. reflex/components/radix/primitives/base.pyi +34 -33
  80. reflex/components/radix/primitives/drawer.pyi +169 -168
  81. reflex/components/radix/primitives/form.pyi +168 -167
  82. reflex/components/radix/primitives/progress.pyi +82 -81
  83. reflex/components/radix/primitives/slider.pyi +84 -83
  84. reflex/components/radix/themes/base.py +8 -4
  85. reflex/components/radix/themes/base.pyi +114 -113
  86. reflex/components/radix/themes/color_mode.py +12 -21
  87. reflex/components/radix/themes/color_mode.pyi +67 -67
  88. reflex/components/radix/themes/components/__init__.pyi +1 -0
  89. reflex/components/radix/themes/components/alert_dialog.pyi +118 -117
  90. reflex/components/radix/themes/components/aspect_ratio.pyi +18 -17
  91. reflex/components/radix/themes/components/avatar.pyi +18 -17
  92. reflex/components/radix/themes/components/badge.pyi +18 -17
  93. reflex/components/radix/themes/components/button.pyi +18 -17
  94. reflex/components/radix/themes/components/callout.pyi +82 -81
  95. reflex/components/radix/themes/components/card.pyi +18 -17
  96. reflex/components/radix/themes/components/checkbox.py +2 -3
  97. reflex/components/radix/themes/components/checkbox.pyi +53 -52
  98. reflex/components/radix/themes/components/checkbox_cards.pyi +34 -33
  99. reflex/components/radix/themes/components/checkbox_group.pyi +34 -33
  100. reflex/components/radix/themes/components/context_menu.pyi +140 -139
  101. reflex/components/radix/themes/components/data_list.py +5 -0
  102. reflex/components/radix/themes/components/data_list.pyi +71 -65
  103. reflex/components/radix/themes/components/dialog.pyi +121 -120
  104. reflex/components/radix/themes/components/dropdown_menu.pyi +142 -141
  105. reflex/components/radix/themes/components/hover_card.pyi +68 -67
  106. reflex/components/radix/themes/components/icon_button.py +2 -1
  107. reflex/components/radix/themes/components/icon_button.pyi +18 -17
  108. reflex/components/radix/themes/components/inset.pyi +18 -17
  109. reflex/components/radix/themes/components/popover.pyi +73 -72
  110. reflex/components/radix/themes/components/progress.pyi +18 -17
  111. reflex/components/radix/themes/components/radio.pyi +18 -17
  112. reflex/components/radix/themes/components/radio_cards.pyi +35 -34
  113. reflex/components/radix/themes/components/radio_group.py +35 -31
  114. reflex/components/radix/themes/components/radio_group.pyi +73 -66
  115. reflex/components/radix/themes/components/scroll_area.pyi +18 -17
  116. reflex/components/radix/themes/components/segmented_control.pyi +35 -34
  117. reflex/components/radix/themes/components/select.py +2 -1
  118. reflex/components/radix/themes/components/select.pyi +155 -154
  119. reflex/components/radix/themes/components/separator.py +2 -3
  120. reflex/components/radix/themes/components/separator.pyi +18 -17
  121. reflex/components/radix/themes/components/skeleton.pyi +18 -17
  122. reflex/components/radix/themes/components/slider.py +2 -1
  123. reflex/components/radix/themes/components/slider.pyi +20 -19
  124. reflex/components/radix/themes/components/spinner.pyi +18 -17
  125. reflex/components/radix/themes/components/switch.pyi +19 -18
  126. reflex/components/radix/themes/components/table.pyi +114 -113
  127. reflex/components/radix/themes/components/tabs.pyi +84 -83
  128. reflex/components/radix/themes/components/text_area.pyi +21 -20
  129. reflex/components/radix/themes/components/text_field.py +0 -79
  130. reflex/components/radix/themes/components/text_field.pyi +57 -63
  131. reflex/components/radix/themes/components/tooltip.pyi +21 -20
  132. reflex/components/radix/themes/layout/base.pyi +18 -17
  133. reflex/components/radix/themes/layout/box.pyi +18 -17
  134. reflex/components/radix/themes/layout/center.pyi +18 -17
  135. reflex/components/radix/themes/layout/container.py +2 -3
  136. reflex/components/radix/themes/layout/container.pyi +18 -17
  137. reflex/components/radix/themes/layout/flex.pyi +18 -17
  138. reflex/components/radix/themes/layout/grid.pyi +18 -17
  139. reflex/components/radix/themes/layout/list.py +5 -4
  140. reflex/components/radix/themes/layout/list.pyi +86 -85
  141. reflex/components/radix/themes/layout/section.py +2 -3
  142. reflex/components/radix/themes/layout/section.pyi +18 -17
  143. reflex/components/radix/themes/layout/spacer.pyi +18 -17
  144. reflex/components/radix/themes/layout/stack.pyi +50 -49
  145. reflex/components/radix/themes/typography/blockquote.pyi +18 -17
  146. reflex/components/radix/themes/typography/code.pyi +18 -17
  147. reflex/components/radix/themes/typography/heading.pyi +18 -17
  148. reflex/components/radix/themes/typography/link.pyi +18 -17
  149. reflex/components/radix/themes/typography/text.pyi +114 -113
  150. reflex/components/react_player/audio.pyi +34 -33
  151. reflex/components/react_player/react_player.pyi +34 -33
  152. reflex/components/react_player/video.pyi +34 -33
  153. reflex/components/recharts/cartesian.py +23 -19
  154. reflex/components/recharts/cartesian.pyi +297 -296
  155. reflex/components/recharts/charts.py +6 -5
  156. reflex/components/recharts/charts.pyi +179 -178
  157. reflex/components/recharts/general.py +8 -7
  158. reflex/components/recharts/general.pyi +82 -81
  159. reflex/components/recharts/polar.py +14 -13
  160. reflex/components/recharts/polar.pyi +76 -75
  161. reflex/components/recharts/recharts.pyi +33 -33
  162. reflex/components/sonner/toast.py +30 -33
  163. reflex/components/sonner/toast.pyi +27 -25
  164. reflex/components/suneditor/editor.py +2 -1
  165. reflex/components/suneditor/editor.pyi +27 -26
  166. reflex/components/tags/iter_tag.py +16 -16
  167. reflex/components/tags/tag.py +8 -10
  168. reflex/constants/base.py +3 -1
  169. reflex/constants/event.py +1 -0
  170. reflex/event.py +89 -79
  171. reflex/experimental/__init__.py +25 -6
  172. reflex/experimental/client_state.py +34 -58
  173. reflex/experimental/hooks.py +13 -18
  174. reflex/experimental/layout.py +5 -5
  175. reflex/experimental/layout.pyi +84 -83
  176. reflex/{experimental/vars → ivars}/__init__.py +0 -1
  177. reflex/ivars/base.py +2180 -0
  178. reflex/ivars/function.py +200 -0
  179. reflex/ivars/number.py +1137 -0
  180. reflex/ivars/object.py +564 -0
  181. reflex/ivars/sequence.py +1601 -0
  182. reflex/model.py +22 -0
  183. reflex/reflex.py +4 -0
  184. reflex/state.py +388 -73
  185. reflex/style.py +52 -34
  186. reflex/testing.py +8 -3
  187. reflex/utils/exceptions.py +12 -0
  188. reflex/utils/exec.py +0 -14
  189. reflex/utils/format.py +74 -223
  190. reflex/utils/net.py +43 -0
  191. reflex/utils/path_ops.py +13 -1
  192. reflex/utils/prerequisites.py +46 -26
  193. reflex/utils/pyi_generator.py +5 -4
  194. reflex/utils/serializers.py +13 -31
  195. reflex/utils/types.py +44 -9
  196. reflex/vars.py +127 -2230
  197. {reflex-0.5.10a3.dist-info → reflex-0.6.0a1.dist-info}/METADATA +4 -6
  198. reflex-0.6.0a1.dist-info/RECORD +384 -0
  199. reflex/.templates/apps/demo/.gitignore +0 -4
  200. reflex/.templates/apps/demo/assets/favicon.ico +0 -0
  201. reflex/.templates/apps/demo/assets/github.svg +0 -10
  202. reflex/.templates/apps/demo/assets/icon.svg +0 -37
  203. reflex/.templates/apps/demo/assets/logo.svg +0 -68
  204. reflex/.templates/apps/demo/assets/paneleft.svg +0 -13
  205. reflex/.templates/apps/demo/code/__init__.py +0 -1
  206. reflex/.templates/apps/demo/code/demo.py +0 -127
  207. reflex/.templates/apps/demo/code/pages/__init__.py +0 -7
  208. reflex/.templates/apps/demo/code/pages/chatapp.py +0 -31
  209. reflex/.templates/apps/demo/code/pages/datatable.py +0 -360
  210. reflex/.templates/apps/demo/code/pages/forms.py +0 -257
  211. reflex/.templates/apps/demo/code/pages/graphing.py +0 -253
  212. reflex/.templates/apps/demo/code/pages/home.py +0 -56
  213. reflex/.templates/apps/demo/code/sidebar.py +0 -178
  214. reflex/.templates/apps/demo/code/state.py +0 -22
  215. reflex/.templates/apps/demo/code/states/form_state.py +0 -40
  216. reflex/.templates/apps/demo/code/states/pie_state.py +0 -47
  217. reflex/.templates/apps/demo/code/styles.py +0 -68
  218. reflex/.templates/apps/demo/code/webui/__init__.py +0 -0
  219. reflex/.templates/apps/demo/code/webui/components/__init__.py +0 -4
  220. reflex/.templates/apps/demo/code/webui/components/chat.py +0 -118
  221. reflex/.templates/apps/demo/code/webui/components/loading_icon.py +0 -19
  222. reflex/.templates/apps/demo/code/webui/components/modal.py +0 -56
  223. reflex/.templates/apps/demo/code/webui/components/navbar.py +0 -70
  224. reflex/.templates/apps/demo/code/webui/components/sidebar.py +0 -66
  225. reflex/.templates/apps/demo/code/webui/state.py +0 -146
  226. reflex/.templates/apps/demo/code/webui/styles.py +0 -88
  227. reflex/experimental/vars/base.py +0 -583
  228. reflex/experimental/vars/function.py +0 -290
  229. reflex/experimental/vars/number.py +0 -1458
  230. reflex/experimental/vars/object.py +0 -804
  231. reflex/experimental/vars/sequence.py +0 -1764
  232. reflex/utils/watch.py +0 -96
  233. reflex/vars.pyi +0 -218
  234. reflex-0.5.10a3.dist-info/RECORD +0 -413
  235. {reflex-0.5.10a3.dist-info → reflex-0.6.0a1.dist-info}/LICENSE +0 -0
  236. {reflex-0.5.10a3.dist-info → reflex-0.6.0a1.dist-info}/WHEEL +0 -0
  237. {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 BaseVar, CallableVar, Var, VarData
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) -> BaseVar:
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 BaseVar for accessing _var_name from ColorModeContext.
37
+ The Var that resolves to the color mode.
37
38
  """
38
- return BaseVar(
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
- @CallableVar
49
+ @ImmutableCallableVar
51
50
  def set_color_mode(
52
51
  new_color_mode: LiteralColorMode | Var[LiteralColorMode] | None = None,
53
- ) -> BaseVar[EventChain]:
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, Var):
73
- new_color_mode = Var.create_safe(new_color_mode, _var_is_string=True)
74
- return base_setter._replace(
75
- _var_name=f"() => {base_setter._var_name}({new_color_mode._var_name_unwrapped})",
76
- merge_var_data=new_color_mode._var_data,
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(style_item: str | Var) -> tuple[str, VarData | None]:
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, Var):
124
- # If the value is a Var, extract the var_data and cast as str.
125
- return str(style_item), style_item._var_data
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
- # Otherwise, convert to Var to collapse VarData encoded in f-string.
128
- new_var = Var.create(style_item, _var_is_string=False)
129
- if new_var is not None and new_var._var_data:
130
- # The wrapped backtick is used to identify the Var for interpolation.
131
- return f"`{str(new_var)}`", new_var._var_data
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
- return style_item, None
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 | Var],
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(style_dict):
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, dict):
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 = Var.create(value, _var_is_string=False)
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._var_data)
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[StateManagerMemory | StateManagerRedis] = None
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
- self.backend_thread = threading.Thread(target=self.backend.run)
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,
@@ -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