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
@@ -64,11 +64,11 @@
64
64
  {# Args: #}
65
65
  {# component: component dictionary #}
66
66
  {% macro render_iterable_tag(component) %}
67
- { {%- if component.iterable_type == 'dict' -%}Object.entries({{- component.iterable_state }}){%- else -%}{{- component.iterable_state }}{%- endif -%}.map(({{ component.arg_name }}, {{ component.arg_index }}) => (
67
+ <>{ {%- if component.iterable_type == 'dict' -%}Object.entries({{- component.iterable_state }}){%- else -%}{{- component.iterable_state }}{%- endif -%}.map(({{ component.arg_name }}, {{ component.arg_index }}) => (
68
68
  {% for child in component.children %}
69
69
  {{ render(child) }}
70
70
  {% endfor %}
71
- ))}
71
+ ))}</>
72
72
  {%- endmacro %}
73
73
 
74
74
 
@@ -85,10 +85,10 @@
85
85
  {% macro render_match_tag(component) %}
86
86
  {
87
87
  (() => {
88
- switch (JSON.stringify({{ component.cond._var_name_unwrapped }})) {
88
+ switch (JSON.stringify({{ component.cond._var_name }})) {
89
89
  {% for case in component.match_cases %}
90
90
  {% for condition in case[:-1] %}
91
- case JSON.stringify({{ condition._var_name_unwrapped }}):
91
+ case JSON.stringify({{ condition._var_name }}):
92
92
  {% endfor %}
93
93
  return {{ case[-1] }};
94
94
  break;
@@ -7,7 +7,7 @@ export const initialState = {{ initial_state|json_dumps }}
7
7
  export const initialState = {}
8
8
  {% endif %}
9
9
 
10
- export const defaultColorMode = "{{ default_color_mode }}"
10
+ export const defaultColorMode = {{ default_color_mode }}
11
11
  export const ColorModeContext = createContext(null);
12
12
  export const UploadFilesContext = createContext(null);
13
13
  export const DispatchContext = createContext(null);
@@ -1 +1 @@
1
- export default {{ theme|json_dumps }}
1
+ export default {{ theme }}
reflex/__init__.py CHANGED
@@ -140,6 +140,7 @@ RADIX_THEMES_COMPONENTS_MAPPING: dict = {
140
140
  "components.radix.themes.components.radio_group": ["radio", "radio_group"],
141
141
  "components.radix.themes.components.dropdown_menu": ["menu", "dropdown_menu"],
142
142
  "components.radix.themes.components.separator": ["divider", "separator"],
143
+ "components.radix.themes.components.progress": ["progress"],
143
144
  }
144
145
 
145
146
  RADIX_THEMES_LAYOUT_MAPPING: dict = {
@@ -205,7 +206,6 @@ RADIX_PRIMITIVES_MAPPING: dict = {
205
206
  "components.radix.primitives.form": [
206
207
  "form",
207
208
  ],
208
- "components.radix.primitives.progress": ["progress"],
209
209
  }
210
210
 
211
211
  COMPONENTS_CORE_MAPPING: dict = {
@@ -324,7 +324,7 @@ _MAPPING: dict = {
324
324
  "style": ["Style", "toggle_color_mode"],
325
325
  "utils.imports": ["ImportVar"],
326
326
  "utils.serializers": ["serializer"],
327
- "vars": ["cached_var", "Var"],
327
+ "vars": ["Var"],
328
328
  }
329
329
 
330
330
  _SUBMODULES: set[str] = {
@@ -338,6 +338,7 @@ _SUBMODULES: set[str] = {
338
338
  "testing",
339
339
  "utils",
340
340
  "vars",
341
+ "ivars",
341
342
  "config",
342
343
  "compiler",
343
344
  }
reflex/__init__.pyi CHANGED
@@ -12,6 +12,7 @@ from . import compiler as compiler
12
12
  from . import components as components
13
13
  from . import config as config
14
14
  from . import event as event
15
+ from . import ivars as ivars
15
16
  from . import model as model
16
17
  from . import style as style
17
18
  from . import testing as testing
@@ -70,7 +71,6 @@ from .components.plotly import plotly as plotly
70
71
  from .components.radix.primitives.accordion import accordion as accordion
71
72
  from .components.radix.primitives.drawer import drawer as drawer
72
73
  from .components.radix.primitives.form import form as form
73
- from .components.radix.primitives.progress import progress as progress
74
74
  from .components.radix.themes.base import theme as theme
75
75
  from .components.radix.themes.base import theme_panel as theme_panel
76
76
  from .components.radix.themes.color_mode import color_mode as color_mode
@@ -105,6 +105,7 @@ from .components.radix.themes.components.hover_card import hover_card as hover_c
105
105
  from .components.radix.themes.components.icon_button import icon_button as icon_button
106
106
  from .components.radix.themes.components.inset import inset as inset
107
107
  from .components.radix.themes.components.popover import popover as popover
108
+ from .components.radix.themes.components.progress import progress as progress
108
109
  from .components.radix.themes.components.radio_cards import radio_cards as radio_cards
109
110
  from .components.radix.themes.components.radio_group import radio as radio
110
111
  from .components.radix.themes.components.radio_group import radio_group as radio_group
@@ -189,7 +190,6 @@ from .style import toggle_color_mode as toggle_color_mode
189
190
  from .utils.imports import ImportVar as ImportVar
190
191
  from .utils.serializers import serializer as serializer
191
192
  from .vars import Var as Var
192
- from .vars import cached_var as cached_var
193
193
 
194
194
  del compat
195
195
  RADIX_THEMES_MAPPING: dict
reflex/app.py CHANGED
@@ -33,7 +33,7 @@ from typing import (
33
33
 
34
34
  from fastapi import FastAPI, HTTPException, Request, UploadFile
35
35
  from fastapi.middleware import cors
36
- from fastapi.responses import StreamingResponse
36
+ from fastapi.responses import JSONResponse, StreamingResponse
37
37
  from fastapi.staticfiles import StaticFiles
38
38
  from rich.progress import MofNCompleteColumn, Progress, TimeElapsedColumn
39
39
  from socketio import ASGIApp, AsyncNamespace, AsyncServer
@@ -65,7 +65,7 @@ from reflex.components.core.upload import Upload, get_upload_dir
65
65
  from reflex.components.radix import themes
66
66
  from reflex.config import get_config
67
67
  from reflex.event import Event, EventHandler, EventSpec, window_alert
68
- from reflex.model import Model
68
+ from reflex.model import Model, get_db_status
69
69
  from reflex.page import (
70
70
  DECORATED_PAGES,
71
71
  )
@@ -269,13 +269,12 @@ class App(MiddlewareMixin, LifespanMixin, Base):
269
269
  "`connect_error_component` is deprecated, use `overlay_component` instead"
270
270
  )
271
271
  super().__init__(**kwargs)
272
- base_state_subclasses = BaseState.__subclasses__()
273
272
 
274
273
  # Special case to allow test cases have multiple subclasses of rx.BaseState.
275
- if not is_testing_env() and len(base_state_subclasses) > 1:
276
- # Only one Base State class is allowed.
274
+ if not is_testing_env() and BaseState.__subclasses__() != [State]:
275
+ # Only rx.State is allowed as Base State subclass.
277
276
  raise ValueError(
278
- "rx.BaseState cannot be subclassed multiple times. use rx.State instead"
277
+ "rx.BaseState cannot be subclassed directly. Use rx.State instead"
279
278
  )
280
279
 
281
280
  if "breakpoints" in self.style:
@@ -377,6 +376,7 @@ class App(MiddlewareMixin, LifespanMixin, Base):
377
376
  """Add default api endpoints (ping)."""
378
377
  # To test the server.
379
378
  self.api.get(str(constants.Endpoint.PING))(ping)
379
+ self.api.get(str(constants.Endpoint.HEALTH))(health)
380
380
 
381
381
  def _add_optional_endpoints(self):
382
382
  """Add optional api endpoints (_upload)."""
@@ -442,7 +442,7 @@ class App(MiddlewareMixin, LifespanMixin, Base):
442
442
  raise
443
443
  except TypeError as e:
444
444
  message = str(e)
445
- if "BaseVar" in message or "ComputedVar" in message:
445
+ if "Var" in message:
446
446
  raise VarOperationTypeError(
447
447
  "You may be trying to use an invalid Python function on a state var. "
448
448
  "When referencing a var inside your render code, only limited var operations are supported. "
@@ -527,9 +527,10 @@ class App(MiddlewareMixin, LifespanMixin, Base):
527
527
  self._enable_state()
528
528
  else:
529
529
  for var in component._get_vars(include_children=True):
530
- if not var._var_data:
530
+ var_data = var._get_all_var_data()
531
+ if not var_data:
531
532
  continue
532
- if not var._var_data.state:
533
+ if not var_data.state:
533
534
  continue
534
535
  self._enable_state()
535
536
  break
@@ -1113,6 +1114,7 @@ class App(MiddlewareMixin, LifespanMixin, Base):
1113
1114
  Task if the event was backgroundable, otherwise None
1114
1115
  """
1115
1116
  substate, handler = state._get_event_handler(event)
1117
+
1116
1118
  if not handler.is_background:
1117
1119
  return None
1118
1120
 
@@ -1317,6 +1319,38 @@ async def ping() -> str:
1317
1319
  return "pong"
1318
1320
 
1319
1321
 
1322
+ async def health() -> JSONResponse:
1323
+ """Health check endpoint to assess the status of the database and Redis services.
1324
+
1325
+ Returns:
1326
+ JSONResponse: A JSON object with the health status:
1327
+ - "status" (bool): Overall health, True if all checks pass.
1328
+ - "db" (bool or str): Database status - True, False, or "NA".
1329
+ - "redis" (bool or str): Redis status - True, False, or "NA".
1330
+ """
1331
+ health_status = {"status": True}
1332
+ status_code = 200
1333
+
1334
+ db_status, redis_status = await asyncio.gather(
1335
+ get_db_status(), prerequisites.get_redis_status()
1336
+ )
1337
+
1338
+ health_status["db"] = db_status
1339
+
1340
+ if redis_status is None:
1341
+ health_status["redis"] = False
1342
+ else:
1343
+ health_status["redis"] = redis_status
1344
+
1345
+ if not health_status["db"] or (
1346
+ not health_status["redis"] and redis_status is not None
1347
+ ):
1348
+ health_status["status"] = False
1349
+ status_code = 503
1350
+
1351
+ return JSONResponse(content=health_status, status_code=status_code)
1352
+
1353
+
1320
1354
  def upload(app: App):
1321
1355
  """Upload a file.
1322
1356
 
reflex/base.py CHANGED
@@ -110,14 +110,15 @@ class Base(BaseModel): # pyright: ignore [reportUnboundVariable]
110
110
  var: The variable to add a pydantic field for.
111
111
  default_value: The default value of the field
112
112
  """
113
+ var_name = var._var_name.split(".")[-1]
113
114
  new_field = ModelField.infer(
114
- name=var._var_name,
115
+ name=var_name,
115
116
  value=default_value,
116
117
  annotation=var._var_type,
117
118
  class_validators=None,
118
119
  config=cls.__config__, # type: ignore
119
120
  )
120
- cls.__fields__.update({var._var_name: new_field})
121
+ cls.__fields__.update({var_name: new_field})
121
122
 
122
123
  def get_value(self, key: str) -> Any:
123
124
  """Get the value of a field.
@@ -17,12 +17,12 @@ from reflex.components.component import (
17
17
  StatefulComponent,
18
18
  )
19
19
  from reflex.config import get_config
20
+ from reflex.ivars.base import ImmutableVar, LiteralVar
20
21
  from reflex.state import BaseState
21
22
  from reflex.style import SYSTEM_COLOR_MODE
22
23
  from reflex.utils.exec import is_prod_mode
23
24
  from reflex.utils.imports import ImportVar
24
25
  from reflex.utils.prerequisites import get_web_dir
25
- from reflex.vars import Var
26
26
 
27
27
 
28
28
  def _compile_document_root(root: Component) -> str:
@@ -57,7 +57,7 @@ def _compile_app(app_root: Component) -> str:
57
57
  )
58
58
 
59
59
 
60
- def _compile_theme(theme: dict) -> str:
60
+ def _compile_theme(theme: str) -> str:
61
61
  """Compile the theme.
62
62
 
63
63
  Args:
@@ -80,8 +80,8 @@ def _compile_contexts(state: Optional[Type[BaseState]], theme: Component | None)
80
80
  The compiled context file.
81
81
  """
82
82
  appearance = getattr(theme, "appearance", None)
83
- if appearance is None or Var.create_safe(appearance)._var_name == "inherit":
84
- appearance = SYSTEM_COLOR_MODE
83
+ if appearance is None or str(LiteralVar.create(appearance)) == '"inherit"':
84
+ appearance = LiteralVar.create(SYSTEM_COLOR_MODE)
85
85
 
86
86
  last_compiled_time = str(datetime.now())
87
87
  return (
@@ -320,7 +320,7 @@ def _compile_tailwind(
320
320
  def compile_document_root(
321
321
  head_components: list[Component],
322
322
  html_lang: Optional[str] = None,
323
- html_custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
323
+ html_custom_attrs: Optional[Dict[str, Union[ImmutableVar, str]]] = None,
324
324
  ) -> tuple[str, str]:
325
325
  """Compile the document root.
326
326
 
@@ -377,7 +377,7 @@ def compile_theme(style: ComponentStyle) -> tuple[str, str]:
377
377
  theme = utils.create_theme(style)
378
378
 
379
379
  # Compile the theme.
380
- code = _compile_theme(theme)
380
+ code = _compile_theme(str(LiteralVar.create(theme)))
381
381
  return output_path, code
382
382
 
383
383
 
reflex/compiler/utils.py CHANGED
@@ -7,6 +7,7 @@ from pathlib import Path
7
7
  from typing import Any, Callable, Dict, Optional, Type, Union
8
8
  from urllib.parse import urlparse
9
9
 
10
+ from reflex.ivars.base import ImmutableVar
10
11
  from reflex.utils.prerequisites import get_web_dir
11
12
 
12
13
  try:
@@ -32,7 +33,6 @@ from reflex.state import BaseState, Cookie, LocalStorage, SessionStorage
32
33
  from reflex.style import Style
33
34
  from reflex.utils import console, format, imports, path_ops
34
35
  from reflex.utils.imports import ImportVar, ParsedImportDict
35
- from reflex.vars import Var
36
36
 
37
37
  # To re-export this function.
38
38
  merge_imports = imports.merge_imports
@@ -152,7 +152,9 @@ def compile_state(state: Type[BaseState]) -> dict:
152
152
  console.warn(
153
153
  f"Failed to compile initial state with computed vars, excluding them: {e}"
154
154
  )
155
- initial_state = state(_reflex_internal_init=True).dict(include_computed=False)
155
+ initial_state = state(_reflex_internal_init=True).dict(
156
+ initial=True, include_computed=False
157
+ )
156
158
  return format.format_state(initial_state)
157
159
 
158
160
 
@@ -284,7 +286,7 @@ def compile_custom_component(
284
286
  def create_document_root(
285
287
  head_components: list[Component] | None = None,
286
288
  html_lang: Optional[str] = None,
287
- html_custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
289
+ html_custom_attrs: Optional[Dict[str, Union[ImmutableVar, str]]] = None,
288
290
  ) -> Component:
289
291
  """Create the document root.
290
292
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  from reflex.components.base.fragment import Fragment
4
4
  from reflex.components.component import Component
5
- from reflex.vars import Var
5
+ from reflex.ivars.base import ImmutableVar
6
6
 
7
7
 
8
8
  class AppWrap(Fragment):
@@ -15,6 +15,4 @@ class AppWrap(Fragment):
15
15
  Returns:
16
16
  A new AppWrap component containing {children}.
17
17
  """
18
- return super().create(
19
- Var.create("{children}", _var_is_local=False, _var_is_string=False)
20
- )
18
+ return super().create(ImmutableVar.create("children"))
@@ -7,8 +7,8 @@ from typing import Any, Callable, Dict, Optional, Union, overload
7
7
 
8
8
  from reflex.components.base.fragment import Fragment
9
9
  from reflex.event import EventHandler, EventSpec
10
+ from reflex.ivars.base import ImmutableVar
10
11
  from reflex.style import Style
11
- from reflex.vars import BaseVar, Var
12
12
 
13
13
  class AppWrap(Fragment):
14
14
  @overload
@@ -21,51 +21,51 @@ class AppWrap(Fragment):
21
21
  id: Optional[Any] = None,
22
22
  class_name: Optional[Any] = None,
23
23
  autofocus: Optional[bool] = None,
24
- custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
24
+ custom_attrs: Optional[Dict[str, Union[ImmutableVar, str]]] = None,
25
25
  on_blur: Optional[
26
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
26
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
27
27
  ] = None,
28
28
  on_click: Optional[
29
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
29
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
30
30
  ] = None,
31
31
  on_context_menu: Optional[
32
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
32
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
33
33
  ] = None,
34
34
  on_double_click: Optional[
35
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
35
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
36
36
  ] = None,
37
37
  on_focus: Optional[
38
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
38
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
39
39
  ] = None,
40
40
  on_mount: Optional[
41
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
41
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
42
42
  ] = None,
43
43
  on_mouse_down: Optional[
44
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
44
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
45
45
  ] = None,
46
46
  on_mouse_enter: Optional[
47
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
47
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
48
48
  ] = None,
49
49
  on_mouse_leave: Optional[
50
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
50
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
51
51
  ] = None,
52
52
  on_mouse_move: Optional[
53
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
53
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
54
54
  ] = None,
55
55
  on_mouse_out: Optional[
56
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
56
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
57
57
  ] = None,
58
58
  on_mouse_over: Optional[
59
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
59
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
60
60
  ] = None,
61
61
  on_mouse_up: Optional[
62
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
62
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
63
63
  ] = None,
64
64
  on_scroll: Optional[
65
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
65
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
66
66
  ] = None,
67
67
  on_unmount: Optional[
68
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
68
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
69
69
  ] = None,
70
70
  **props,
71
71
  ) -> "AppWrap":
@@ -7,13 +7,14 @@ from typing import Any, Iterator
7
7
  from reflex.components.component import Component
8
8
  from reflex.components.tags import Tag
9
9
  from reflex.components.tags.tagless import Tagless
10
+ from reflex.ivars.base import ImmutableVar
10
11
  from reflex.vars import Var
11
12
 
12
13
 
13
14
  class Bare(Component):
14
15
  """A component with no tag."""
15
16
 
16
- contents: Var[str]
17
+ contents: Var[Any]
17
18
 
18
19
  @classmethod
19
20
  def create(cls, contents: Any) -> Component:
@@ -25,16 +26,18 @@ class Bare(Component):
25
26
  Returns:
26
27
  The component.
27
28
  """
28
- if isinstance(contents, Var) and contents._var_data:
29
- contents = contents.to(str)
29
+ if isinstance(contents, ImmutableVar):
30
+ return cls(contents=contents)
30
31
  else:
31
32
  contents = str(contents) if contents is not None else ""
32
33
  return cls(contents=contents) # type: ignore
33
34
 
34
35
  def _render(self) -> Tag:
36
+ if isinstance(self.contents, ImmutableVar):
37
+ return Tagless(contents=f"{{{str(self.contents)}}}")
35
38
  return Tagless(contents=str(self.contents))
36
39
 
37
- def _get_vars(self, include_children: bool = False) -> Iterator[Var]:
40
+ def _get_vars(self, include_children: bool = False) -> Iterator[ImmutableVar]:
38
41
  """Walk all Vars used in this component.
39
42
 
40
43
  Args:
@@ -7,8 +7,8 @@ from typing import Any, Callable, Dict, Optional, Union, overload
7
7
 
8
8
  from reflex.components.component import Component
9
9
  from reflex.event import EventHandler, EventSpec
10
+ from reflex.ivars.base import ImmutableVar
10
11
  from reflex.style import Style
11
- from reflex.vars import BaseVar, Var
12
12
 
13
13
  class Body(Component):
14
14
  @overload
@@ -21,51 +21,51 @@ class Body(Component):
21
21
  id: Optional[Any] = None,
22
22
  class_name: Optional[Any] = None,
23
23
  autofocus: Optional[bool] = None,
24
- custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
24
+ custom_attrs: Optional[Dict[str, Union[ImmutableVar, str]]] = None,
25
25
  on_blur: Optional[
26
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
26
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
27
27
  ] = None,
28
28
  on_click: Optional[
29
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
29
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
30
30
  ] = None,
31
31
  on_context_menu: Optional[
32
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
32
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
33
33
  ] = None,
34
34
  on_double_click: Optional[
35
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
35
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
36
36
  ] = None,
37
37
  on_focus: Optional[
38
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
38
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
39
39
  ] = None,
40
40
  on_mount: Optional[
41
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
41
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
42
42
  ] = None,
43
43
  on_mouse_down: Optional[
44
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
44
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
45
45
  ] = None,
46
46
  on_mouse_enter: Optional[
47
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
47
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
48
48
  ] = None,
49
49
  on_mouse_leave: Optional[
50
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
50
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
51
51
  ] = None,
52
52
  on_mouse_move: Optional[
53
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
53
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
54
54
  ] = None,
55
55
  on_mouse_out: Optional[
56
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
56
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
57
57
  ] = None,
58
58
  on_mouse_over: Optional[
59
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
59
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
60
60
  ] = None,
61
61
  on_mouse_up: Optional[
62
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
62
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
63
63
  ] = None,
64
64
  on_scroll: Optional[
65
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
65
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
66
66
  ] = None,
67
67
  on_unmount: Optional[
68
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
68
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
69
69
  ] = None,
70
70
  **props,
71
71
  ) -> "Body":