reflex 0.3.7a1__py3-none-any.whl → 0.3.8__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 (324) hide show
  1. reflex/.templates/apps/blank/code/blank.py +0 -1
  2. reflex/.templates/apps/demo/code/demo.py +0 -1
  3. reflex/.templates/apps/sidebar/code/sidebar.py +6 -2
  4. reflex/.templates/jinja/web/pages/_app.js.jinja2 +4 -1
  5. reflex/.templates/jinja/web/pages/base_page.js.jinja2 +4 -1
  6. reflex/.templates/jinja/web/pages/utils.js.jinja2 +24 -0
  7. reflex/.templates/jinja/web/tailwind.config.js.jinja2 +4 -1
  8. reflex/.templates/web/utils/helpers/dataeditor.js +56 -54
  9. reflex/__init__.py +4 -2
  10. reflex/__init__.pyi +6 -2
  11. reflex/app.py +43 -9
  12. reflex/app.pyi +2 -1
  13. reflex/app_module_for_backend.py +13 -0
  14. reflex/compiler/compiler.py +19 -0
  15. reflex/components/__init__.py +9 -232
  16. reflex/components/base/__init__.py +5 -1
  17. reflex/components/base/app_wrap.py +1 -1
  18. reflex/components/base/app_wrap.pyi +1 -1
  19. reflex/components/base/document.py +0 -8
  20. reflex/components/base/document.pyi +0 -80
  21. reflex/components/{layout → base}/fragment.pyi +1 -1
  22. reflex/components/chakra/__init__.py +202 -19
  23. reflex/components/{libs/chakra.pyi → chakra/base.pyi} +1 -1
  24. reflex/components/chakra/datadisplay/__init__.py +12 -0
  25. reflex/components/{datadisplay → chakra/datadisplay}/badge.py +1 -1
  26. reflex/components/{datadisplay → chakra/datadisplay}/badge.pyi +2 -2
  27. reflex/components/{datadisplay → chakra/datadisplay}/code.py +5 -5
  28. reflex/components/{datadisplay → chakra/datadisplay}/code.pyi +5 -5
  29. reflex/components/{datadisplay → chakra/datadisplay}/divider.py +4 -2
  30. reflex/components/{datadisplay → chakra/datadisplay}/divider.pyi +5 -3
  31. reflex/components/{datadisplay → chakra/datadisplay}/keyboard_key.py +1 -1
  32. reflex/components/{datadisplay → chakra/datadisplay}/keyboard_key.pyi +2 -2
  33. reflex/components/{datadisplay → chakra/datadisplay}/list.py +3 -3
  34. reflex/components/{datadisplay → chakra/datadisplay}/list.pyi +4 -4
  35. reflex/components/{datadisplay → chakra/datadisplay}/stat.py +1 -1
  36. reflex/components/{datadisplay → chakra/datadisplay}/stat.pyi +2 -2
  37. reflex/components/{datadisplay → chakra/datadisplay}/table.py +2 -2
  38. reflex/components/{datadisplay → chakra/datadisplay}/table.pyi +3 -3
  39. reflex/components/{datadisplay → chakra/datadisplay}/tag.py +2 -2
  40. reflex/components/{datadisplay → chakra/datadisplay}/tag.pyi +3 -3
  41. reflex/components/{disclosure → chakra/disclosure}/accordion.py +1 -1
  42. reflex/components/{disclosure → chakra/disclosure}/accordion.pyi +2 -2
  43. reflex/components/{disclosure → chakra/disclosure}/tabs.py +2 -2
  44. reflex/components/{disclosure → chakra/disclosure}/tabs.pyi +3 -3
  45. reflex/components/{disclosure → chakra/disclosure}/transition.py +1 -1
  46. reflex/components/{disclosure → chakra/disclosure}/transition.pyi +2 -2
  47. reflex/components/{disclosure → chakra/disclosure}/visuallyhidden.py +1 -1
  48. reflex/components/{disclosure → chakra/disclosure}/visuallyhidden.pyi +2 -2
  49. reflex/components/{feedback → chakra/feedback}/alert.py +2 -2
  50. reflex/components/{feedback → chakra/feedback}/alert.pyi +2 -6
  51. reflex/components/{feedback → chakra/feedback}/circularprogress.py +1 -1
  52. reflex/components/{feedback → chakra/feedback}/circularprogress.pyi +2 -2
  53. reflex/components/{feedback → chakra/feedback}/progress.py +1 -1
  54. reflex/components/{feedback → chakra/feedback}/progress.pyi +2 -2
  55. reflex/components/{feedback → chakra/feedback}/skeleton.py +1 -1
  56. reflex/components/{feedback → chakra/feedback}/skeleton.pyi +2 -2
  57. reflex/components/{feedback → chakra/feedback}/spinner.py +1 -1
  58. reflex/components/{feedback → chakra/feedback}/spinner.pyi +2 -2
  59. reflex/components/{forms → chakra/forms}/__init__.py +2 -11
  60. reflex/components/{forms → chakra/forms}/button.py +3 -1
  61. reflex/components/{forms → chakra/forms}/button.pyi +2 -2
  62. reflex/components/{forms → chakra/forms}/checkbox.py +1 -1
  63. reflex/components/{forms → chakra/forms}/checkbox.pyi +2 -6
  64. reflex/components/{forms → chakra/forms}/colormodeswitch.py +10 -2
  65. reflex/components/{forms → chakra/forms}/colormodeswitch.pyi +83 -3
  66. reflex/components/{forms → chakra/forms}/date_picker.py +1 -1
  67. reflex/components/{forms → chakra/forms}/date_picker.pyi +2 -2
  68. reflex/components/{forms → chakra/forms}/date_time_picker.py +1 -1
  69. reflex/components/{forms → chakra/forms}/date_time_picker.pyi +2 -2
  70. reflex/components/{forms → chakra/forms}/editable.py +1 -1
  71. reflex/components/{forms → chakra/forms}/editable.pyi +2 -2
  72. reflex/components/{forms → chakra/forms}/email.py +1 -1
  73. reflex/components/{forms → chakra/forms}/email.pyi +2 -2
  74. reflex/components/{forms → chakra/forms}/form.py +1 -1
  75. reflex/components/{forms → chakra/forms}/form.pyi +2 -2
  76. reflex/components/{forms → chakra/forms}/iconbutton.py +1 -1
  77. reflex/components/{forms → chakra/forms}/iconbutton.pyi +2 -2
  78. reflex/components/{forms → chakra/forms}/input.py +5 -4
  79. reflex/components/{forms → chakra/forms}/input.pyi +59 -5
  80. reflex/components/{forms → chakra/forms}/numberinput.py +6 -2
  81. reflex/components/{forms → chakra/forms}/numberinput.pyi +10 -2
  82. reflex/components/{forms → chakra/forms}/password.py +1 -1
  83. reflex/components/{forms → chakra/forms}/password.pyi +2 -2
  84. reflex/components/{forms → chakra/forms}/pininput.py +1 -1
  85. reflex/components/{forms → chakra/forms}/pininput.pyi +2 -2
  86. reflex/components/{forms → chakra/forms}/radio.py +3 -3
  87. reflex/components/{forms → chakra/forms}/radio.pyi +4 -4
  88. reflex/components/{forms → chakra/forms}/rangeslider.py +1 -1
  89. reflex/components/{forms → chakra/forms}/rangeslider.pyi +2 -2
  90. reflex/components/{forms → chakra/forms}/select.py +3 -3
  91. reflex/components/{forms → chakra/forms}/select.pyi +4 -4
  92. reflex/components/{forms → chakra/forms}/slider.py +4 -3
  93. reflex/components/{forms → chakra/forms}/slider.pyi +5 -4
  94. reflex/components/{forms → chakra/forms}/switch.py +1 -1
  95. reflex/components/{forms → chakra/forms}/switch.pyi +2 -2
  96. reflex/components/{forms → chakra/forms}/textarea.py +2 -2
  97. reflex/components/{forms → chakra/forms}/textarea.pyi +3 -3
  98. reflex/components/chakra/forms/time_picker.py +11 -0
  99. reflex/components/chakra/forms/time_picker.pyi +129 -0
  100. reflex/components/{layout → chakra/layout}/__init__.py +1 -20
  101. reflex/components/{layout → chakra/layout}/aspect_ratio.py +1 -1
  102. reflex/components/{layout → chakra/layout}/aspect_ratio.pyi +2 -2
  103. reflex/components/{layout → chakra/layout}/box.py +1 -1
  104. reflex/components/{layout → chakra/layout}/box.pyi +2 -2
  105. reflex/components/{layout → chakra/layout}/card.py +2 -2
  106. reflex/components/{layout → chakra/layout}/card.pyi +3 -3
  107. reflex/components/{layout → chakra/layout}/center.py +1 -1
  108. reflex/components/{layout → chakra/layout}/center.pyi +2 -2
  109. reflex/components/{layout → chakra/layout}/container.py +1 -1
  110. reflex/components/{layout → chakra/layout}/container.pyi +2 -2
  111. reflex/components/{layout → chakra/layout}/flex.py +1 -1
  112. reflex/components/{layout → chakra/layout}/flex.pyi +2 -2
  113. reflex/components/{layout → chakra/layout}/grid.py +1 -1
  114. reflex/components/{layout → chakra/layout}/grid.pyi +2 -2
  115. reflex/components/{layout → chakra/layout}/html.py +1 -1
  116. reflex/components/{layout → chakra/layout}/html.pyi +2 -2
  117. reflex/components/{layout → chakra/layout}/spacer.py +1 -1
  118. reflex/components/{layout → chakra/layout}/spacer.pyi +2 -2
  119. reflex/components/{layout → chakra/layout}/stack.py +1 -1
  120. reflex/components/{layout → chakra/layout}/stack.pyi +2 -2
  121. reflex/components/{layout → chakra/layout}/wrap.py +1 -1
  122. reflex/components/{layout → chakra/layout}/wrap.pyi +2 -2
  123. reflex/components/chakra/media/__init__.py +7 -0
  124. reflex/components/{media → chakra/media}/avatar.py +1 -1
  125. reflex/components/{media → chakra/media}/avatar.pyi +2 -2
  126. reflex/components/chakra/media/icon.py +110 -0
  127. reflex/components/{media → chakra/media}/icon.pyi +2 -2
  128. reflex/components/chakra/media/image.py +1 -1
  129. reflex/components/chakra/media/image.pyi +1 -1
  130. reflex/components/{navigation → chakra/navigation}/__init__.py +0 -1
  131. reflex/components/{navigation → chakra/navigation}/breadcrumb.py +3 -3
  132. reflex/components/{navigation → chakra/navigation}/breadcrumb.pyi +4 -4
  133. reflex/components/{navigation → chakra/navigation}/link.py +2 -2
  134. reflex/components/{navigation → chakra/navigation}/link.pyi +3 -3
  135. reflex/components/{navigation → chakra/navigation}/linkoverlay.py +1 -1
  136. reflex/components/{navigation → chakra/navigation}/linkoverlay.pyi +2 -2
  137. reflex/components/{navigation → chakra/navigation}/stepper.py +1 -1
  138. reflex/components/{navigation → chakra/navigation}/stepper.pyi +2 -2
  139. reflex/components/{overlay → chakra/overlay}/__init__.py +0 -1
  140. reflex/components/{overlay → chakra/overlay}/alertdialog.py +2 -2
  141. reflex/components/{overlay → chakra/overlay}/alertdialog.pyi +3 -3
  142. reflex/components/{overlay → chakra/overlay}/drawer.py +3 -3
  143. reflex/components/{overlay → chakra/overlay}/drawer.pyi +4 -4
  144. reflex/components/{overlay → chakra/overlay}/menu.py +4 -6
  145. reflex/components/{overlay → chakra/overlay}/menu.pyi +4 -4
  146. reflex/components/{overlay → chakra/overlay}/modal.py +2 -2
  147. reflex/components/{overlay → chakra/overlay}/modal.pyi +3 -3
  148. reflex/components/{overlay → chakra/overlay}/popover.py +2 -2
  149. reflex/components/{overlay → chakra/overlay}/popover.pyi +3 -3
  150. reflex/components/{overlay → chakra/overlay}/tooltip.py +1 -1
  151. reflex/components/{overlay → chakra/overlay}/tooltip.pyi +2 -2
  152. reflex/components/{typography → chakra/typography}/__init__.py +0 -1
  153. reflex/components/{typography → chakra/typography}/heading.py +1 -1
  154. reflex/components/{typography → chakra/typography}/heading.pyi +2 -2
  155. reflex/components/{typography → chakra/typography}/highlight.py +1 -1
  156. reflex/components/{typography → chakra/typography}/highlight.pyi +2 -2
  157. reflex/components/{typography → chakra/typography}/span.py +1 -1
  158. reflex/components/{typography → chakra/typography}/span.pyi +2 -2
  159. reflex/components/{typography → chakra/typography}/text.py +1 -1
  160. reflex/components/{typography → chakra/typography}/text.pyi +2 -2
  161. reflex/components/component.py +7 -8
  162. reflex/components/core/__init__.py +22 -0
  163. reflex/components/{overlay → core}/banner.py +4 -3
  164. reflex/components/{overlay → core}/banner.pyi +5 -4
  165. reflex/components/{navigation → core}/client_side_routing.py +1 -1
  166. reflex/components/{navigation → core}/client_side_routing.pyi +2 -2
  167. reflex/components/{layout → core}/cond.py +1 -1
  168. reflex/components/{forms → core}/debounce.py +1 -1
  169. reflex/components/{forms → core}/debounce.pyi +2 -2
  170. reflex/components/{layout → core}/foreach.py +18 -2
  171. reflex/components/core/match.py +257 -0
  172. reflex/components/{layout → core}/responsive.py +1 -1
  173. reflex/components/{forms → core}/upload.py +2 -2
  174. reflex/components/{forms → core}/upload.pyi +3 -3
  175. reflex/components/datadisplay/__init__.py +4 -13
  176. reflex/components/el/elements/inline.py +4 -0
  177. reflex/components/el/elements/inline.pyi +3 -0
  178. reflex/components/gridjs/__init__.py +5 -0
  179. reflex/components/{datadisplay → gridjs}/datatable.pyi +1 -1
  180. reflex/components/literals.py +27 -0
  181. reflex/components/markdown/__init__.py +5 -0
  182. reflex/components/{typography → markdown}/markdown.py +16 -6
  183. reflex/components/{typography → markdown}/markdown.pyi +10 -5
  184. reflex/components/media/__init__.py +1 -8
  185. reflex/components/media/icon.py +2 -110
  186. reflex/components/moment/__init__.py +5 -0
  187. reflex/components/{datadisplay → moment}/moment.pyi +1 -1
  188. reflex/components/next/__init__.py +2 -0
  189. reflex/components/{navigation/nextlink.pyi → next/link.pyi} +1 -1
  190. reflex/components/plotly/__init__.py +5 -0
  191. reflex/components/{graphing → plotly}/plotly.pyi +1 -1
  192. reflex/components/radix/primitives/__init__.py +12 -1
  193. reflex/components/radix/primitives/accordion.py +33 -68
  194. reflex/components/radix/primitives/accordion.pyi +6 -89
  195. reflex/components/radix/primitives/base.py +27 -0
  196. reflex/components/radix/primitives/base.pyi +95 -0
  197. reflex/components/radix/primitives/form.py +267 -0
  198. reflex/components/radix/primitives/form.pyi +740 -0
  199. reflex/components/radix/primitives/progress.py +84 -0
  200. reflex/components/radix/primitives/progress.pyi +268 -0
  201. reflex/components/radix/primitives/slider.py +179 -0
  202. reflex/components/radix/primitives/slider.pyi +452 -0
  203. reflex/components/radix/themes/base.py +43 -31
  204. reflex/components/radix/themes/base.pyi +223 -29
  205. reflex/components/radix/themes/components/__init__.py +18 -3
  206. reflex/components/radix/themes/components/alertdialog.py +27 -6
  207. reflex/components/radix/themes/components/alertdialog.pyi +713 -2
  208. reflex/components/radix/themes/components/aspectratio.py +1 -1
  209. reflex/components/radix/themes/components/aspectratio.pyi +67 -2
  210. reflex/components/radix/themes/components/avatar.py +0 -3
  211. reflex/components/radix/themes/components/avatar.pyi +13 -13
  212. reflex/components/radix/themes/components/badge.py +1 -4
  213. reflex/components/radix/themes/components/badge.pyi +11 -11
  214. reflex/components/radix/themes/components/button.py +1 -1
  215. reflex/components/radix/themes/components/button.pyi +15 -11
  216. reflex/components/radix/themes/components/callout.pyi +144 -12
  217. reflex/components/radix/themes/components/card.py +1 -1
  218. reflex/components/radix/themes/components/card.pyi +68 -1
  219. reflex/components/radix/themes/components/checkbox.pyi +14 -12
  220. reflex/components/radix/themes/components/contextmenu.pyi +402 -8
  221. reflex/components/radix/themes/components/dialog.py +6 -0
  222. reflex/components/radix/themes/components/dialog.pyi +518 -0
  223. reflex/components/radix/themes/components/dropdownmenu.pyi +337 -8
  224. reflex/components/radix/themes/components/hovercard.pyi +195 -0
  225. reflex/components/radix/themes/components/iconbutton.pyi +14 -12
  226. reflex/components/radix/themes/components/icons.py +2 -2
  227. reflex/components/radix/themes/components/inset.pyi +65 -0
  228. reflex/components/radix/themes/components/popover.pyi +260 -0
  229. reflex/components/radix/themes/components/radiogroup.py +1 -1
  230. reflex/components/radix/themes/components/radiogroup.pyi +78 -9
  231. reflex/components/radix/themes/components/scrollarea.pyi +65 -0
  232. reflex/components/radix/themes/components/select.pyi +342 -13
  233. reflex/components/radix/themes/components/separator.pyi +7 -5
  234. reflex/components/radix/themes/components/slider.py +4 -4
  235. reflex/components/radix/themes/components/slider.pyi +17 -13
  236. reflex/components/radix/themes/components/switch.pyi +20 -18
  237. reflex/components/radix/themes/components/table.py +1 -1
  238. reflex/components/radix/themes/components/table.pyi +458 -1
  239. reflex/components/radix/themes/components/tabs.py +4 -4
  240. reflex/components/radix/themes/components/tabs.pyi +263 -3
  241. reflex/components/radix/themes/components/textarea.py +1 -1
  242. reflex/components/radix/themes/components/textarea.pyi +1 -1
  243. reflex/components/radix/themes/components/textfield.py +1 -1
  244. reflex/components/radix/themes/components/textfield.pyi +18 -14
  245. reflex/components/radix/themes/components/tooltip.py +15 -0
  246. reflex/components/radix/themes/components/tooltip.pyi +205 -0
  247. reflex/components/radix/themes/layout/base.pyi +65 -0
  248. reflex/components/radix/themes/layout/box.pyi +65 -0
  249. reflex/components/radix/themes/layout/container.pyi +65 -0
  250. reflex/components/radix/themes/layout/flex.pyi +65 -0
  251. reflex/components/radix/themes/layout/grid.pyi +65 -0
  252. reflex/components/radix/themes/layout/section.pyi +65 -0
  253. reflex/components/radix/themes/typography/blockquote.pyi +16 -14
  254. reflex/components/radix/themes/typography/code.pyi +22 -20
  255. reflex/components/radix/themes/typography/em.pyi +65 -0
  256. reflex/components/radix/themes/typography/heading.pyi +30 -28
  257. reflex/components/radix/themes/typography/kbd.pyi +65 -0
  258. reflex/components/radix/themes/typography/link.py +2 -1
  259. reflex/components/radix/themes/typography/link.pyi +121 -28
  260. reflex/components/radix/themes/typography/quote.pyi +66 -0
  261. reflex/components/radix/themes/typography/strong.pyi +65 -0
  262. reflex/components/radix/themes/typography/text.pyi +30 -28
  263. reflex/components/react_player/__init__.py +7 -0
  264. reflex/components/react_player/audio.py +8 -0
  265. reflex/components/{media → react_player}/audio.pyi +3 -3
  266. reflex/components/{libs → react_player}/react_player.py +1 -1
  267. reflex/components/{libs → react_player}/react_player.pyi +3 -3
  268. reflex/components/react_player/video.py +8 -0
  269. reflex/components/{media → react_player}/video.pyi +3 -3
  270. reflex/components/{graphing/recharts → recharts}/cartesian.pyi +1 -1
  271. reflex/components/{graphing/recharts → recharts}/charts.py +1 -1
  272. reflex/components/{graphing/recharts → recharts}/charts.pyi +2 -2
  273. reflex/components/{graphing/recharts → recharts}/general.pyi +1 -1
  274. reflex/components/{graphing/recharts → recharts}/polar.pyi +1 -1
  275. reflex/components/{graphing/recharts → recharts}/recharts.pyi +1 -1
  276. reflex/components/suneditor/__init__.py +5 -0
  277. reflex/components/{forms → suneditor}/editor.pyi +1 -1
  278. reflex/components/tags/__init__.py +1 -0
  279. reflex/components/tags/iter_tag.py +3 -3
  280. reflex/components/tags/match_tag.py +19 -0
  281. reflex/constants/base.py +2 -0
  282. reflex/constants/config.py +1 -1
  283. reflex/constants/installer.py +1 -0
  284. reflex/constants/style.py +1 -1
  285. reflex/event.py +1 -1
  286. reflex/reflex.py +14 -12
  287. reflex/state.py +14 -0
  288. reflex/style.py +1 -1
  289. reflex/testing.py +59 -9
  290. reflex/utils/build.py +7 -1
  291. reflex/utils/exceptions.py +6 -0
  292. reflex/utils/exec.py +2 -2
  293. reflex/utils/export.py +1 -1
  294. reflex/utils/format.py +41 -4
  295. reflex/utils/prerequisites.py +56 -11
  296. reflex/utils/processes.py +8 -1
  297. reflex/utils/types.py +2 -2
  298. reflex/vars.py +25 -1
  299. {reflex-0.3.7a1.dist-info → reflex-0.3.8.dist-info}/METADATA +8 -2
  300. reflex-0.3.8.dist-info/RECORD +492 -0
  301. reflex/components/graphing/__init__.py +0 -5
  302. reflex/components/libs/__init__.py +0 -31
  303. reflex/components/media/audio.py +0 -8
  304. reflex/components/media/image.pyi +0 -123
  305. reflex/components/media/video.py +0 -8
  306. reflex-0.3.7a1.dist-info/RECORD +0 -470
  307. /reflex/components/{layout → base}/fragment.py +0 -0
  308. /reflex/components/{libs/chakra.py → chakra/base.py} +0 -0
  309. /reflex/components/{disclosure → chakra/disclosure}/__init__.py +0 -0
  310. /reflex/components/{feedback → chakra/feedback}/__init__.py +0 -0
  311. /reflex/components/{forms → chakra/forms}/multiselect.py +0 -0
  312. /reflex/components/{datadisplay → gridjs}/datatable.py +0 -0
  313. /reflex/components/{datadisplay → moment}/moment.py +0 -0
  314. /reflex/components/{navigation/nextlink.py → next/link.py} +0 -0
  315. /reflex/components/{graphing → plotly}/plotly.py +0 -0
  316. /reflex/components/{graphing/recharts → recharts}/__init__.py +0 -0
  317. /reflex/components/{graphing/recharts → recharts}/cartesian.py +0 -0
  318. /reflex/components/{graphing/recharts → recharts}/general.py +0 -0
  319. /reflex/components/{graphing/recharts → recharts}/polar.py +0 -0
  320. /reflex/components/{graphing/recharts → recharts}/recharts.py +0 -0
  321. /reflex/components/{forms → suneditor}/editor.py +0 -0
  322. {reflex-0.3.7a1.dist-info → reflex-0.3.8.dist-info}/LICENSE +0 -0
  323. {reflex-0.3.7a1.dist-info → reflex-0.3.8.dist-info}/WHEEL +0 -0
  324. {reflex-0.3.7a1.dist-info → reflex-0.3.8.dist-info}/entry_points.txt +0 -0
@@ -159,11 +159,30 @@ def get_app(reload: bool = False) -> ModuleType:
159
159
  sys.path.insert(0, os.getcwd())
160
160
  app = __import__(module, fromlist=(constants.CompileVars.APP,))
161
161
  if reload:
162
+ from reflex.state import State
162
163
 
164
+ # Reset rx.State subclasses to avoid conflict when reloading.
165
+ State.class_subclasses.clear()
166
+ # Reload the app module.
163
167
  importlib.reload(app)
168
+
164
169
  return app
165
170
 
166
171
 
172
+ def get_compiled_app(reload: bool = False) -> ModuleType:
173
+ """Get the app module based on the default config after first compiling it.
174
+
175
+ Args:
176
+ reload: Re-import the app module from disk
177
+
178
+ Returns:
179
+ The compiled app based on the default config.
180
+ """
181
+ app_module = get_app(reload=reload)
182
+ getattr(app_module, constants.CompileVars.APP).compile_()
183
+ return app_module
184
+
185
+
167
186
  def get_redis() -> Redis | None:
168
187
  """Get the redis client.
169
188
 
@@ -201,19 +220,23 @@ def get_production_backend_url() -> str:
201
220
  )
202
221
 
203
222
 
204
- def get_default_app_name() -> str:
205
- """Get the default app name.
223
+ def validate_app_name(app_name: str | None = None) -> str:
224
+ """Validate the app name.
206
225
 
207
226
  The default app name is the name of the current directory.
208
227
 
228
+ Args:
229
+ app_name: the name passed by user during reflex init
230
+
209
231
  Returns:
210
- The default app name.
232
+ The app name after validation.
211
233
 
212
234
  Raises:
213
- Exit: if the app directory name is reflex.
235
+ Exit: if the app directory name is reflex or if the name is not standard for a python package name.
214
236
  """
215
- app_name = os.getcwd().split(os.path.sep)[-1].replace("-", "_")
216
-
237
+ app_name = (
238
+ app_name if app_name else os.getcwd().split(os.path.sep)[-1].replace("-", "_")
239
+ )
217
240
  # Make sure the app is not named "reflex".
218
241
  if app_name == constants.Reflex.MODULE_NAME:
219
242
  console.error(
@@ -221,6 +244,13 @@ def get_default_app_name() -> str:
221
244
  )
222
245
  raise typer.Exit(1)
223
246
 
247
+ # Make sure the app name is standard for a python package name.
248
+ if not re.match(r"^[a-zA-Z][a-zA-Z0-9_]*$", app_name):
249
+ console.error(
250
+ "The app directory name must start with a letter and can contain letters, numbers, and underscores."
251
+ )
252
+ raise typer.Exit(1)
253
+
224
254
  return app_name
225
255
 
226
256
 
@@ -263,18 +293,33 @@ def initialize_requirements_txt():
263
293
  the requirements.txt file.
264
294
  """
265
295
  fp = Path(constants.RequirementsTxt.FILE)
266
- fp.touch(exist_ok=True)
267
-
296
+ encoding = "utf-8"
297
+ if not fp.exists():
298
+ fp.touch()
299
+ else:
300
+ # Detect the encoding of the original file
301
+ import charset_normalizer
302
+
303
+ charset_matches = charset_normalizer.from_path(fp)
304
+ maybe_charset_match = charset_matches.best()
305
+ if maybe_charset_match is None:
306
+ console.debug(f"Unable to detect encoding for {fp}, exiting.")
307
+ return
308
+ encoding = maybe_charset_match.encoding
309
+ console.debug(f"Detected encoding for {fp} as {encoding}.")
268
310
  try:
269
- with open(fp, "r") as f:
311
+ other_requirements_exist = False
312
+ with open(fp, "r", encoding=encoding) as f:
270
313
  for req in f.readlines():
271
314
  # Check if we have a package name that is reflex
272
315
  if re.match(r"^reflex[^a-zA-Z0-9]", req):
273
316
  console.debug(f"{fp} already has reflex as dependency.")
274
317
  return
275
- with open(fp, "a") as f:
318
+ other_requirements_exist = True
319
+ with open(fp, "a", encoding=encoding) as f:
320
+ preceding_newline = "\n" if other_requirements_exist else ""
276
321
  f.write(
277
- f"\n{constants.RequirementsTxt.DEFAULTS_STUB}{constants.Reflex.VERSION}\n"
322
+ f"{preceding_newline}{constants.RequirementsTxt.DEFAULTS_STUB}{constants.Reflex.VERSION}\n"
278
323
  )
279
324
  except Exception:
280
325
  console.info(f"Unable to check {fp} for reflex dependency.")
reflex/utils/processes.py CHANGED
@@ -171,7 +171,9 @@ def run_concurrently_context(
171
171
  fns = [fn if isinstance(fn, tuple) else (fn,) for fn in fns] # type: ignore
172
172
 
173
173
  # Run the functions concurrently.
174
- with futures.ThreadPoolExecutor(max_workers=len(fns)) as executor:
174
+ executor = None
175
+ try:
176
+ executor = futures.ThreadPoolExecutor(max_workers=len(fns))
175
177
  # Submit the tasks.
176
178
  tasks = [executor.submit(*fn) for fn in fns] # type: ignore
177
179
 
@@ -180,7 +182,12 @@ def run_concurrently_context(
180
182
 
181
183
  # Get the results in the order completed to check any exceptions.
182
184
  for task in futures.as_completed(tasks):
185
+ # if task throws something, we let it bubble up immediately
183
186
  task.result()
187
+ finally:
188
+ # Shutdown the executor
189
+ if executor:
190
+ executor.shutdown(wait=False)
184
191
 
185
192
 
186
193
  def run_concurrently(*fns: Union[Callable, Tuple]) -> None:
reflex/utils/types.py CHANGED
@@ -19,7 +19,7 @@ from typing import (
19
19
  )
20
20
 
21
21
  from pydantic.fields import ModelField
22
- from sqlalchemy.orm import Mapped
22
+ from sqlalchemy.orm import DeclarativeBase, Mapped
23
23
 
24
24
  from reflex.base import Base
25
25
  from reflex.utils import serializers
@@ -128,7 +128,7 @@ def get_attribute_access_type(cls: GenericType, name: str) -> GenericType | None
128
128
  # Ensure frontend uses null coalescing when accessing.
129
129
  type_ = Optional[type_]
130
130
  return type_
131
- elif isinstance(cls, type) and issubclass(cls, Model):
131
+ elif isinstance(cls, type) and issubclass(cls, (Model, DeclarativeBase)):
132
132
  # Check in the annotations directly (for sqlmodel.Relationship)
133
133
  hints = get_type_hints(cls)
134
134
  if name in hints:
reflex/vars.py CHANGED
@@ -209,7 +209,11 @@ def _decode_var(value: str) -> tuple[VarData | None, str]:
209
209
  var_datas = []
210
210
  if isinstance(value, str):
211
211
  # Extract the state name from a formatted var
212
- while m := re.match(r"(.*)<reflex.Var>(.*)</reflex.Var>(.*)", value):
212
+ while m := re.match(
213
+ pattern=r"(.*)<reflex.Var>(.*)</reflex.Var>(.*)",
214
+ string=value,
215
+ flags=re.DOTALL, # Ensure . matches newline characters.
216
+ ):
213
217
  value = m.group(1) + m.group(3)
214
218
  try:
215
219
  var_datas.append(VarData.parse_raw(m.group(2)))
@@ -1530,6 +1534,26 @@ class Var:
1530
1534
  """
1531
1535
  return self._var_data.state if self._var_data else ""
1532
1536
 
1537
+ @property
1538
+ def _var_name_unwrapped(self) -> str:
1539
+ """Get the var str without wrapping in curly braces.
1540
+
1541
+ Returns:
1542
+ The str var without the wrapped curly braces
1543
+ """
1544
+ type_ = (
1545
+ get_origin(self._var_type)
1546
+ if types.is_generic_alias(self._var_type)
1547
+ else self._var_type
1548
+ )
1549
+
1550
+ wrapped_var = str(self)
1551
+ return (
1552
+ wrapped_var
1553
+ if not self._var_state and issubclass(type_, dict)
1554
+ else wrapped_var.strip("{}")
1555
+ )
1556
+
1533
1557
 
1534
1558
  # Allow automatic serialization of Var within JSON structures
1535
1559
  serializers.serializer(_encode_var)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: reflex
3
- Version: 0.3.7a1
3
+ Version: 0.3.8
4
4
  Summary: Web apps in pure Python.
5
5
  Home-page: https://reflex.dev
6
6
  License: Apache-2.0
@@ -16,6 +16,7 @@ Classifier: Programming Language :: Python :: 3.9
16
16
  Classifier: Programming Language :: Python :: 3.10
17
17
  Classifier: Programming Language :: Python :: 3.11
18
18
  Requires-Dist: alembic (>=1.11.1,<2.0.0)
19
+ Requires-Dist: charset-normalizer (>=3.3.2,<4.0.0)
19
20
  Requires-Dist: cloudpickle (>=2.2.1,<3.0.0)
20
21
  Requires-Dist: distro (>=1.8.0,<2.0.0) ; sys_platform == "linux"
21
22
  Requires-Dist: fastapi (>=0.96.0,<0.97.0)
@@ -171,7 +172,6 @@ def index():
171
172
  # Add state and page to the app.
172
173
  app = rx.App()
173
174
  app.add_page(index, title="reflex:DALL·E")
174
- app.compile()
175
175
  ```
176
176
 
177
177
  ## Let's break this down.
@@ -282,6 +282,12 @@ We welcome contributions of any size! Below are some good ways to get started in
282
282
 
283
283
  We are actively looking for contributors, no matter your skill level or experience. To contribute check out [CONTIBUTING.md](https://github.com/reflex-dev/reflex/blob/main/CONTRIBUTING.md)
284
284
 
285
+
286
+ ## All Thanks To Our Contributors:
287
+ <a href="https://github.com/reflex-dev/reflex/graphs/contributors">
288
+ <img src="https://contrib.rocks/image?repo=reflex-dev/reflex" />
289
+ </a>
290
+
285
291
  ## License
286
292
 
287
293
  Reflex is open-source and licensed under the [Apache License 2.0](LICENSE).