reflex 0.7.13a1__tar.gz → 0.7.14__tar.gz

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 (409) hide show
  1. {reflex-0.7.13a1 → reflex-0.7.14}/PKG-INFO +1 -1
  2. {reflex-0.7.13a1 → reflex-0.7.14}/pyproject.toml +45 -30
  3. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/apps/blank/code/blank.py +0 -2
  4. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/app.py +100 -92
  5. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/app_mixins/lifespan.py +2 -3
  6. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/app_mixins/middleware.py +1 -0
  7. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/app_mixins/mixin.py +0 -1
  8. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/assets.py +7 -4
  9. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/base.py +3 -2
  10. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/compiler/compiler.py +79 -65
  11. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/compiler/utils.py +8 -6
  12. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/app_wrap.pyi +0 -1
  13. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/bare.py +22 -12
  14. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/body.pyi +0 -1
  15. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/document.pyi +0 -5
  16. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/error_boundary.pyi +0 -1
  17. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/fragment.pyi +0 -1
  18. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/head.pyi +0 -2
  19. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/link.pyi +0 -2
  20. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/meta.py +2 -1
  21. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/meta.pyi +0 -4
  22. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/script.py +2 -1
  23. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/script.pyi +0 -1
  24. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/strict_mode.pyi +0 -1
  25. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/component.py +85 -45
  26. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/auto_scroll.pyi +0 -1
  27. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/banner.py +1 -1
  28. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/banner.pyi +0 -6
  29. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/breakpoints.py +9 -11
  30. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/client_side_routing.pyi +0 -2
  31. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/clipboard.pyi +0 -1
  32. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/colors.py +10 -7
  33. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/cond.py +4 -2
  34. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/debounce.py +5 -3
  35. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/debounce.pyi +0 -1
  36. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/foreach.py +8 -6
  37. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/html.py +3 -3
  38. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/html.pyi +0 -1
  39. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/match.py +19 -17
  40. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/sticky.pyi +0 -4
  41. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/upload.py +1 -1
  42. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/upload.pyi +0 -5
  43. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/datadisplay/code.py +1 -2
  44. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/datadisplay/code.pyi +0 -2
  45. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/datadisplay/dataeditor.py +7 -10
  46. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/datadisplay/dataeditor.pyi +0 -1
  47. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/datadisplay/logo.py +3 -4
  48. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/datadisplay/shiki_code_block.py +8 -11
  49. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/datadisplay/shiki_code_block.pyi +0 -3
  50. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/dynamic.py +2 -3
  51. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/__init__.pyi +2 -0
  52. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/element.pyi +0 -1
  53. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/__init__.py +1 -0
  54. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/__init__.pyi +3 -0
  55. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/base.pyi +0 -1
  56. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/forms.py +14 -15
  57. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/forms.pyi +15 -32
  58. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/inline.pyi +0 -28
  59. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/media.py +26 -0
  60. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/media.pyi +259 -25
  61. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/metadata.py +0 -1
  62. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/metadata.pyi +0 -6
  63. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/other.pyi +0 -7
  64. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/scripts.pyi +0 -3
  65. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/sectioning.pyi +0 -15
  66. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/tables.pyi +0 -10
  67. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/typography.pyi +0 -15
  68. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/gridjs/datatable.py +10 -13
  69. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/gridjs/datatable.pyi +0 -2
  70. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/lucide/icon.py +10 -9
  71. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/lucide/icon.pyi +0 -3
  72. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/markdown/markdown.py +6 -8
  73. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/markdown/markdown.pyi +0 -1
  74. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/moment/moment.pyi +0 -1
  75. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/next/base.py +0 -2
  76. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/next/base.pyi +0 -3
  77. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/next/image.pyi +0 -1
  78. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/next/link.pyi +0 -1
  79. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/next/video.pyi +0 -1
  80. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/plotly/plotly.pyi +0 -9
  81. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/props.py +4 -3
  82. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/primitives/accordion.py +1 -1
  83. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/primitives/accordion.pyi +0 -7
  84. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/primitives/base.py +1 -3
  85. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/primitives/base.pyi +0 -2
  86. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/primitives/drawer.py +1 -1
  87. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/primitives/drawer.pyi +0 -11
  88. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/primitives/form.py +5 -9
  89. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/primitives/form.pyi +0 -12
  90. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/primitives/progress.py +1 -1
  91. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/primitives/progress.pyi +0 -5
  92. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/primitives/slider.py +1 -1
  93. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/primitives/slider.pyi +0 -5
  94. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/base.pyi +0 -8
  95. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/color_mode.pyi +0 -3
  96. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/alert_dialog.py +4 -2
  97. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/alert_dialog.pyi +4 -9
  98. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/aspect_ratio.py +1 -2
  99. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/aspect_ratio.pyi +1 -3
  100. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/avatar.py +5 -2
  101. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/avatar.pyi +1 -3
  102. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/badge.py +5 -2
  103. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/badge.pyi +1 -3
  104. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/button.py +2 -3
  105. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/button.pyi +1 -3
  106. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/callout.py +1 -2
  107. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/callout.pyi +1 -7
  108. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/card.py +1 -2
  109. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/card.pyi +1 -3
  110. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/checkbox.py +7 -4
  111. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/checkbox.pyi +1 -5
  112. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/checkbox_cards.py +1 -2
  113. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/checkbox_cards.pyi +1 -4
  114. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/checkbox_group.py +1 -2
  115. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/checkbox_group.pyi +1 -4
  116. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/context_menu.py +1 -1
  117. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/context_menu.pyi +1 -14
  118. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/data_list.py +1 -2
  119. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/data_list.pyi +1 -6
  120. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/dialog.py +4 -2
  121. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/dialog.pyi +4 -9
  122. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/dropdown_menu.py +5 -2
  123. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/dropdown_menu.pyi +4 -10
  124. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/hover_card.py +4 -2
  125. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/hover_card.pyi +4 -6
  126. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/icon_button.py +7 -8
  127. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/icon_button.pyi +1 -3
  128. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/inset.py +1 -2
  129. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/inset.pyi +1 -3
  130. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/popover.py +4 -2
  131. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/popover.pyi +4 -6
  132. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/progress.py +1 -2
  133. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/progress.pyi +1 -3
  134. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/radio.py +1 -2
  135. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/radio.pyi +1 -3
  136. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/radio_cards.py +1 -2
  137. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/radio_cards.pyi +1 -4
  138. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/radio_group.py +7 -5
  139. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/radio_group.pyi +1 -6
  140. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/scroll_area.py +1 -2
  141. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/scroll_area.pyi +1 -3
  142. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/segmented_control.py +1 -2
  143. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/segmented_control.pyi +1 -4
  144. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/select.py +5 -2
  145. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/select.pyi +1 -11
  146. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/separator.py +1 -2
  147. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/separator.pyi +1 -3
  148. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/skeleton.py +1 -2
  149. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/skeleton.pyi +1 -3
  150. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/slider.py +1 -2
  151. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/slider.pyi +1 -3
  152. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/spinner.py +1 -2
  153. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/spinner.pyi +1 -3
  154. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/switch.py +1 -2
  155. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/switch.pyi +1 -3
  156. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/table.py +1 -2
  157. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/table.pyi +1 -9
  158. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/tabs.py +1 -2
  159. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/tabs.pyi +1 -7
  160. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/text_area.py +5 -2
  161. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/text_area.pyi +2 -4
  162. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/text_field.py +5 -2
  163. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/text_field.pyi +1 -5
  164. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/tooltip.py +1 -2
  165. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/tooltip.pyi +1 -3
  166. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/base.py +5 -2
  167. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/base.pyi +5 -3
  168. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/box.py +1 -2
  169. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/box.pyi +1 -3
  170. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/center.pyi +0 -1
  171. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/container.py +1 -2
  172. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/container.pyi +1 -3
  173. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/flex.py +6 -2
  174. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/flex.pyi +1 -3
  175. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/grid.py +6 -2
  176. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/grid.pyi +1 -3
  177. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/list.py +2 -1
  178. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/list.pyi +0 -5
  179. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/section.py +1 -2
  180. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/section.pyi +1 -3
  181. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/spacer.pyi +0 -1
  182. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/stack.py +1 -1
  183. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/stack.pyi +0 -3
  184. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/typography/blockquote.py +1 -1
  185. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/typography/blockquote.pyi +1 -3
  186. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/typography/code.py +5 -1
  187. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/typography/code.pyi +1 -3
  188. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/typography/heading.py +1 -1
  189. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/typography/heading.pyi +1 -3
  190. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/typography/link.py +3 -2
  191. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/typography/link.pyi +1 -3
  192. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/typography/text.py +1 -1
  193. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/typography/text.pyi +1 -9
  194. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/react_player/audio.py +0 -2
  195. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/react_player/audio.pyi +0 -3
  196. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/react_player/react_player.pyi +0 -1
  197. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/react_player/video.py +0 -2
  198. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/react_player/video.pyi +0 -3
  199. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/recharts/__init__.py +1 -1
  200. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/recharts/__init__.pyi +1 -1
  201. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/recharts/cartesian.py +20 -25
  202. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/recharts/cartesian.pyi +20 -37
  203. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/recharts/charts.py +2 -1
  204. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/recharts/charts.pyi +0 -12
  205. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/recharts/general.pyi +0 -6
  206. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/recharts/polar.py +5 -4
  207. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/recharts/polar.pyi +4 -10
  208. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/recharts/recharts.py +12 -10
  209. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/recharts/recharts.pyi +10 -11
  210. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/sonner/toast.py +2 -2
  211. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/sonner/toast.pyi +0 -2
  212. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/suneditor/editor.py +2 -1
  213. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/suneditor/editor.pyi +0 -1
  214. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/tags/iter_tag.py +4 -2
  215. reflex-0.7.14/reflex/config.py +580 -0
  216. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/constants/base.py +6 -6
  217. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/constants/compiler.py +8 -6
  218. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/constants/installer.py +25 -16
  219. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/custom_components/custom_components.py +1 -2
  220. reflex-0.7.14/reflex/environment.py +606 -0
  221. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/event.py +58 -60
  222. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/experimental/__init__.py +2 -2
  223. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/experimental/client_state.py +9 -4
  224. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/experimental/layout.pyi +0 -5
  225. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/istate/manager.py +17 -20
  226. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/istate/proxy.py +19 -12
  227. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/model.py +8 -5
  228. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/plugins/base.py +8 -0
  229. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/plugins/tailwind_v3.py +8 -0
  230. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/plugins/tailwind_v4.py +9 -0
  231. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/reflex.py +11 -12
  232. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/route.py +7 -9
  233. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/state.py +67 -71
  234. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/style.py +3 -1
  235. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/testing.py +49 -30
  236. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/build.py +2 -1
  237. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/console.py +70 -17
  238. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/exec.py +113 -39
  239. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/export.py +2 -1
  240. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/format.py +21 -24
  241. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/imports.py +4 -3
  242. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/lazy_loader.py +3 -3
  243. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/misc.py +2 -1
  244. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/net.py +2 -2
  245. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/path_ops.py +4 -2
  246. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/prerequisites.py +69 -39
  247. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/processes.py +5 -7
  248. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/pyi_generator.py +46 -41
  249. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/redir.py +1 -1
  250. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/registry.py +1 -1
  251. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/serializers.py +4 -4
  252. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/telemetry.py +36 -3
  253. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/types.py +16 -13
  254. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/vars/base.py +96 -109
  255. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/vars/datetime.py +2 -1
  256. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/vars/dep_tracking.py +19 -28
  257. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/vars/number.py +6 -7
  258. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/vars/object.py +5 -6
  259. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/vars/sequence.py +11 -11
  260. reflex-0.7.13a1/reflex/config.py +0 -1154
  261. {reflex-0.7.13a1 → reflex-0.7.14}/.gitignore +0 -0
  262. {reflex-0.7.13a1 → reflex-0.7.14}/LICENSE +0 -0
  263. {reflex-0.7.13a1 → reflex-0.7.14}/README.md +0 -0
  264. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
  265. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/apps/blank/code/__init__.py +0 -0
  266. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/app/rxconfig.py.jinja2 +0 -0
  267. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/custom_components/README.md.jinja2 +0 -0
  268. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/custom_components/__init__.py.jinja2 +0 -0
  269. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/custom_components/demo_app.py.jinja2 +0 -0
  270. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +0 -0
  271. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/custom_components/src.py.jinja2 +0 -0
  272. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/web/package.json.jinja2 +0 -0
  273. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/web/pages/_app.js.jinja2 +0 -0
  274. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/web/pages/_document.js.jinja2 +0 -0
  275. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/web/pages/base_page.js.jinja2 +0 -0
  276. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/web/pages/component.js.jinja2 +0 -0
  277. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/web/pages/custom_component.js.jinja2 +0 -0
  278. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/web/pages/index.js.jinja2 +0 -0
  279. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/web/pages/macros.js.jinja2 +0 -0
  280. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/web/pages/stateful_component.js.jinja2 +0 -0
  281. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/web/pages/stateful_components.js.jinja2 +0 -0
  282. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/web/pages/utils.js.jinja2 +0 -0
  283. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/web/styles/styles.css.jinja2 +0 -0
  284. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/web/utils/context.js.jinja2 +0 -0
  285. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/jinja/web/utils/theme.js.jinja2 +0 -0
  286. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/web/.gitignore +0 -0
  287. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
  288. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/web/components/shiki/code.js +0 -0
  289. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/web/jsconfig.json +0 -0
  290. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/web/next.config.js +0 -0
  291. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/web/postcss.config.js +0 -0
  292. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/web/utils/client_side_routing.js +0 -0
  293. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
  294. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/web/utils/helpers/debounce.js +0 -0
  295. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/web/utils/helpers/paste.js +0 -0
  296. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/web/utils/helpers/range.js +0 -0
  297. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/web/utils/helpers/throttle.js +0 -0
  298. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/.templates/web/utils/state.js +0 -0
  299. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/__init__.py +0 -0
  300. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/__init__.pyi +0 -0
  301. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/__main__.py +0 -0
  302. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/admin.py +0 -0
  303. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/app_mixins/__init__.py +0 -0
  304. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/compiler/__init__.py +0 -0
  305. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/compiler/templates.py +0 -0
  306. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/__init__.py +0 -0
  307. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/__init__.pyi +0 -0
  308. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/__init__.py +0 -0
  309. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/__init__.pyi +0 -0
  310. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/app_wrap.py +0 -0
  311. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/body.py +0 -0
  312. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/document.py +0 -0
  313. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/error_boundary.py +0 -0
  314. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/fragment.py +0 -0
  315. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/head.py +0 -0
  316. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/link.py +0 -0
  317. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/base/strict_mode.py +0 -0
  318. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/__init__.py +0 -0
  319. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/__init__.pyi +0 -0
  320. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/auto_scroll.py +0 -0
  321. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/client_side_routing.py +0 -0
  322. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/clipboard.py +0 -0
  323. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/layout/__init__.py +0 -0
  324. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/responsive.py +0 -0
  325. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/core/sticky.py +0 -0
  326. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/datadisplay/__init__.py +0 -0
  327. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/datadisplay/__init__.pyi +0 -0
  328. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/__init__.py +0 -0
  329. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/constants/__init__.py +0 -0
  330. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/constants/html.py +0 -0
  331. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/constants/react.py +0 -0
  332. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/constants/reflex.py +0 -0
  333. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/element.py +0 -0
  334. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/base.py +0 -0
  335. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/inline.py +0 -0
  336. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/other.py +0 -0
  337. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/scripts.py +0 -0
  338. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/sectioning.py +0 -0
  339. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/tables.py +0 -0
  340. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/el/elements/typography.py +0 -0
  341. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/gridjs/__init__.py +0 -0
  342. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/literals.py +0 -0
  343. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/lucide/__init__.py +0 -0
  344. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/markdown/__init__.py +0 -0
  345. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/moment/__init__.py +0 -0
  346. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/moment/moment.py +0 -0
  347. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/next/__init__.py +0 -0
  348. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/next/image.py +0 -0
  349. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/next/link.py +0 -0
  350. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/next/video.py +0 -0
  351. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/plotly/__init__.py +0 -0
  352. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/plotly/plotly.py +0 -0
  353. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/__init__.py +0 -0
  354. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/__init__.pyi +0 -0
  355. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/primitives/__init__.py +0 -0
  356. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/primitives/__init__.pyi +0 -0
  357. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/__init__.py +0 -0
  358. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/__init__.pyi +0 -0
  359. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/base.py +0 -0
  360. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/color_mode.py +0 -0
  361. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/__init__.py +0 -0
  362. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/components/__init__.pyi +0 -0
  363. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/__init__.py +0 -0
  364. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/__init__.pyi +0 -0
  365. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/center.py +0 -0
  366. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/layout/spacer.py +0 -0
  367. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/typography/__init__.py +0 -0
  368. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/typography/__init__.pyi +0 -0
  369. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/radix/themes/typography/base.py +0 -0
  370. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/react_player/__init__.py +0 -0
  371. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/react_player/react_player.py +0 -0
  372. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/recharts/general.py +0 -0
  373. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/sonner/__init__.py +0 -0
  374. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/suneditor/__init__.py +0 -0
  375. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/tags/__init__.py +0 -0
  376. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/tags/cond_tag.py +0 -0
  377. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/tags/match_tag.py +0 -0
  378. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/tags/tag.py +0 -0
  379. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/components/tags/tagless.py +0 -0
  380. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/constants/__init__.py +0 -0
  381. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/constants/colors.py +0 -0
  382. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/constants/config.py +0 -0
  383. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/constants/custom_components.py +0 -0
  384. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/constants/event.py +0 -0
  385. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/constants/route.py +0 -0
  386. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/constants/state.py +0 -0
  387. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/constants/utils.py +0 -0
  388. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/custom_components/__init__.py +0 -0
  389. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/experimental/hooks.py +0 -0
  390. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/experimental/layout.py +0 -0
  391. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/istate/__init__.py +0 -0
  392. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/istate/data.py +0 -0
  393. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/istate/dynamic.py +0 -0
  394. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/istate/storage.py +0 -0
  395. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/istate/wrappers.py +0 -0
  396. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/middleware/__init__.py +0 -0
  397. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/middleware/hydrate_middleware.py +0 -0
  398. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/middleware/middleware.py +0 -0
  399. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/page.py +0 -0
  400. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/plugins/__init__.py +0 -0
  401. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/py.typed +0 -0
  402. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/__init__.py +0 -0
  403. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/codespaces.py +0 -0
  404. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/compat.py +0 -0
  405. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/decorator.py +0 -0
  406. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/utils/exceptions.py +0 -0
  407. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/vars/__init__.py +0 -0
  408. {reflex-0.7.13a1 → reflex-0.7.14}/reflex/vars/function.py +0 -0
  409. {reflex-0.7.13a1 → reflex-0.7.14}/scripts/hatch_build.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reflex
3
- Version: 0.7.13a1
3
+ Version: 0.7.14
4
4
  Summary: Web apps in pure Python.
5
5
  Project-URL: homepage, https://reflex.dev
6
6
  Project-URL: repository, https://github.com/reflex-dev/reflex
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "reflex"
3
- version = "0.7.13a1"
3
+ version = "0.7.14"
4
4
  description = "Web apps in pure Python."
5
5
  license.text = "Apache-2.0"
6
6
  authors = [
@@ -83,44 +83,59 @@ reportIncompatibleMethodOverride = false
83
83
  target-version = "py310"
84
84
  output-format = "concise"
85
85
  lint.isort.split-on-trailing-comma = false
86
- lint.select = [
87
- "ANN001",
88
- "B",
89
- "C4",
90
- "D",
91
- "E",
92
- "ERA",
93
- "F",
94
- "FURB",
95
- "I",
96
- "N",
97
- "PERF",
98
- "PGH",
99
- "PTH",
100
- "RUF",
101
- "SIM",
102
- "T",
103
- "TRY",
104
- "UP",
105
- "W",
106
- ]
86
+ lint.select = ["ALL"]
107
87
  lint.ignore = [
108
- "B008",
88
+ "A",
89
+ "ANN002",
90
+ "ANN003",
91
+ "ANN2",
92
+ "ANN4",
93
+ "ARG",
94
+ "BLE",
95
+ "C901",
96
+ "COM",
109
97
  "D205",
98
+ "DTZ",
110
99
  "E501",
111
100
  "F403",
112
- "SIM115",
113
- "RUF006",
114
- "RUF008",
101
+ "FBT",
102
+ "FIX",
103
+ "G004",
104
+ "ISC003",
105
+ "PLC",
106
+ "PLR",
107
+ "PLW",
108
+ "PT011",
109
+ "PT012",
110
+ "PYI",
115
111
  "RUF012",
112
+ "S",
113
+ "SLF",
114
+ "SLOT",
115
+ "TC",
116
+ "TD",
116
117
  "TRY0",
117
118
  "UP038",
118
119
  ]
119
120
  lint.pydocstyle.convention = "google"
121
+ lint.flake8-bugbear.extend-immutable-calls = [
122
+ "reflex.utils.types.Unset",
123
+ "reflex.vars.base.Var.create",
124
+ ]
120
125
 
121
126
  [tool.ruff.lint.per-file-ignores]
122
127
  "__init__.py" = ["F401"]
123
- "tests/*.py" = ["ANN001", "D100", "D103", "D104", "B018", "PERF", "T", "N"]
128
+ "tests/*.py" = [
129
+ "ANN001",
130
+ "D100",
131
+ "D103",
132
+ "D104",
133
+ "INP",
134
+ "B018",
135
+ "PERF",
136
+ "T",
137
+ "N",
138
+ ]
124
139
  "benchmarks/*.py" = ["ANN001", "D100", "D103", "D104", "B018", "PERF", "T", "N"]
125
140
  "reflex/.templates/*.py" = ["D100", "D103", "D104"]
126
141
  "*.pyi" = ["D301", "D415", "D417", "D418", "E742", "N", "PGH"]
@@ -213,13 +228,13 @@ fail_fast = true
213
228
 
214
229
  [[tool.pre-commit.repos]]
215
230
  repo = "https://github.com/astral-sh/ruff-pre-commit"
216
- rev = "v0.11.8"
231
+ rev = "v0.11.12"
217
232
  hooks = [
218
233
  { id = "ruff-format", args = [
219
234
  "reflex",
220
235
  "tests",
221
236
  ] },
222
- { id = "ruff", args = [
237
+ { id = "ruff-check", args = [
223
238
  "--fix",
224
239
  "--exit-non-zero-on-fix",
225
240
  ], exclude = "^integration/benchmarks/" },
@@ -245,7 +260,7 @@ hooks = [
245
260
 
246
261
  [[tool.pre-commit.repos]]
247
262
  repo = "https://github.com/RobertCraigie/pyright-python"
248
- rev = "v1.1.400"
263
+ rev = "v1.1.401"
249
264
  hooks = [{ id = "pyright", args = ["reflex", "tests"], language = "system" }]
250
265
 
251
266
  [[tool.pre-commit.repos]]
@@ -8,8 +8,6 @@ from rxconfig import config
8
8
  class State(rx.State):
9
9
  """The app state."""
10
10
 
11
- ...
12
-
13
11
 
14
12
  def index() -> rx.Component:
15
13
  # Welcome Page (Index)
@@ -68,7 +68,8 @@ from reflex.components.core.sticky import sticky
68
68
  from reflex.components.core.upload import Upload, get_upload_dir
69
69
  from reflex.components.radix import themes
70
70
  from reflex.components.sonner.toast import toast
71
- from reflex.config import ExecutorType, environment, get_config
71
+ from reflex.config import get_config
72
+ from reflex.environment import ExecutorType, environment
72
73
  from reflex.event import (
73
74
  _EVENT_FIELDS,
74
75
  Event,
@@ -229,8 +230,6 @@ def default_error_boundary(*children: Component) -> Component:
229
230
  class OverlayFragment(Fragment):
230
231
  """Alias for Fragment, used to wrap the overlay_component."""
231
232
 
232
- pass
233
-
234
233
 
235
234
  @dataclasses.dataclass(frozen=True)
236
235
  class UploadFile(StarletteUploadFile):
@@ -262,6 +261,7 @@ class UploadFile(StarletteUploadFile):
262
261
  """
263
262
  if self.path:
264
263
  return self.path.name
264
+ return None
265
265
 
266
266
  @property
267
267
  def filename(self) -> str | None:
@@ -481,9 +481,8 @@ class App(MiddlewareMixin, LifespanMixin):
481
481
  # Special case to allow test cases have multiple subclasses of rx.BaseState.
482
482
  if not is_testing_env() and BaseState.__subclasses__() != [State]:
483
483
  # Only rx.State is allowed as Base State subclass.
484
- raise ValueError(
485
- "rx.BaseState cannot be subclassed directly. Use rx.State instead"
486
- )
484
+ msg = "rx.BaseState cannot be subclassed directly. Use rx.State instead"
485
+ raise ValueError(msg)
487
486
 
488
487
  get_config(reload=True)
489
488
 
@@ -552,9 +551,8 @@ class App(MiddlewareMixin, LifespanMixin):
552
551
  transports=["websocket"],
553
552
  )
554
553
  elif getattr(self.sio, "async_mode", "") != "asgi":
555
- raise RuntimeError(
556
- f"Custom `sio` must use `async_mode='asgi'`, not '{self.sio.async_mode}'."
557
- )
554
+ msg = f"Custom `sio` must use `async_mode='asgi'`, not '{self.sio.async_mode}'."
555
+ raise RuntimeError(msg)
558
556
 
559
557
  # Create the socket app. Note event endpoint constant replaces the default 'socket.io' path.
560
558
  socket_app = EngineIOApp(self.sio, socketio_path="")
@@ -633,7 +631,8 @@ class App(MiddlewareMixin, LifespanMixin):
633
631
  compile_future.result()
634
632
 
635
633
  if not self._api:
636
- raise ValueError("The app has not been initialized.")
634
+ msg = "The app has not been initialized."
635
+ raise ValueError(msg)
637
636
 
638
637
  if self._cached_fastapi_app is not None:
639
638
  asgi_app = self._cached_fastapi_app
@@ -741,7 +740,8 @@ class App(MiddlewareMixin, LifespanMixin):
741
740
  ValueError: if the state has not been initialized.
742
741
  """
743
742
  if self._state_manager is None:
744
- raise ValueError("The state manager has not been initialized.")
743
+ msg = "The state manager has not been initialized."
744
+ raise ValueError(msg)
745
745
  return self._state_manager
746
746
 
747
747
  @staticmethod
@@ -791,9 +791,8 @@ class App(MiddlewareMixin, LifespanMixin):
791
791
  # If the route is not set, get it from the callable.
792
792
  if route is None:
793
793
  if not isinstance(component, Callable):
794
- raise exceptions.RouteValueError(
795
- "Route must be set if component is not a callable."
796
- )
794
+ msg = "Route must be set if component is not a callable."
795
+ raise exceptions.RouteValueError(msg)
797
796
  # Format the route.
798
797
  route = format.format_route(component.__name__)
799
798
  else:
@@ -808,9 +807,8 @@ class App(MiddlewareMixin, LifespanMixin):
808
807
  image = image or constants.Page404.IMAGE
809
808
  else:
810
809
  if component is None:
811
- raise exceptions.PageValueError(
812
- "Component must be set for a non-404 page."
813
- )
810
+ msg = "Component must be set for a non-404 page."
811
+ raise exceptions.PageValueError(msg)
814
812
 
815
813
  # Check if the route given is valid
816
814
  verify_route_validity(route)
@@ -841,11 +839,12 @@ class App(MiddlewareMixin, LifespanMixin):
841
839
  else f"`{route}`"
842
840
  )
843
841
  existing_component = self._unevaluated_pages[route].component
844
- raise exceptions.RouteValueError(
842
+ msg = (
845
843
  f"Tried to add page {readable_name_from_component(component)} with route {route_name} but "
846
844
  f"page {readable_name_from_component(existing_component)} with the same route already exists. "
847
845
  "Make sure you do not have two pages with the same route."
848
846
  )
847
+ raise exceptions.RouteValueError(msg)
849
848
 
850
849
  # Setup dynamic args for the route.
851
850
  # this state assignment is only required for tests using the deprecated state kwarg for App
@@ -930,10 +929,9 @@ class App(MiddlewareMixin, LifespanMixin):
930
929
  ):
931
930
  if rw in segments and r != nr:
932
931
  # If the slugs in the segments of both routes are not the same, then the route is invalid
933
- raise RouteValueError(
934
- f"You cannot use different slug names for the same dynamic path in {route} and {new_route} ('{r}' != '{nr}')"
935
- )
936
- elif rw not in segments and r != nr:
932
+ msg = f"You cannot use different slug names for the same dynamic path in {route} and {new_route} ('{r}' != '{nr}')"
933
+ raise RouteValueError(msg)
934
+ if rw not in segments and r != nr:
937
935
  # if the section being compared in both routes is not a dynamic segment(i.e not wrapped in brackets)
938
936
  # then we are guaranteed that the route is valid and there's no need checking the rest.
939
937
  # eg. /posts/[id]/info/[slug1] and /posts/[id]/info1/[slug1] is always going to be valid since
@@ -1019,11 +1017,13 @@ class App(MiddlewareMixin, LifespanMixin):
1019
1017
  Example:
1020
1018
  >>> _get_frontend_packages({"react": "16.14.0", "react-dom": "16.14.0"})
1021
1019
  """
1020
+ dependencies = constants.PackageJson.DEPENDENCIES
1021
+ dev_dependencies = constants.PackageJson.DEV_DEPENDENCIES
1022
1022
  page_imports = {
1023
1023
  i
1024
1024
  for i, tags in imports.items()
1025
- if i not in constants.PackageJson.DEPENDENCIES
1026
- and i not in constants.PackageJson.DEV_DEPENDENCIES
1025
+ if i not in dependencies
1026
+ and i not in dev_dependencies
1027
1027
  and not any(i.startswith(prefix) for prefix in ["/", "$/", ".", "next/"])
1028
1028
  and i != ""
1029
1029
  and any(tag.install for tag in tags)
@@ -1086,9 +1086,7 @@ class App(MiddlewareMixin, LifespanMixin):
1086
1086
  return component
1087
1087
 
1088
1088
  # recreate OverlayFragment with overlay_component as first child
1089
- component = OverlayFragment.create(overlay_component, *children)
1090
-
1091
- return component
1089
+ return OverlayFragment.create(overlay_component, *children)
1092
1090
 
1093
1091
  def _setup_overlay_component(self):
1094
1092
  """If a State is not used and no overlay_component is specified, do not render the connection modal."""
@@ -1150,9 +1148,8 @@ class App(MiddlewareMixin, LifespanMixin):
1150
1148
  )
1151
1149
  for dep in dep_set:
1152
1150
  if dep not in state_cls.vars and dep not in state_cls.backend_vars:
1153
- raise exceptions.VarDependencyError(
1154
- f"ComputedVar {var._js_expr} on state {state.__name__} has an invalid dependency {state_name}.{dep}"
1155
- )
1151
+ msg = f"ComputedVar {var._js_expr} on state {state.__name__} has an invalid dependency {state_name}.{dep}"
1152
+ raise exceptions.VarDependencyError(msg)
1156
1153
 
1157
1154
  for substate in state.class_subclasses:
1158
1155
  self._validate_var_dependencies(substate)
@@ -1235,14 +1232,16 @@ class App(MiddlewareMixin, LifespanMixin):
1235
1232
 
1236
1233
  # try to be somewhat accurate - but still not 100%
1237
1234
  adhoc_steps_without_executor = 7
1238
- fixed_pages_within_executor = 5
1235
+ fixed_pages_within_executor = 4
1236
+ plugin_count = len(config.plugins)
1239
1237
  progress.start()
1240
1238
  task = progress.add_task(
1241
1239
  f"[{get_compilation_time()}] Compiling:",
1242
1240
  total=len(self._pages)
1243
1241
  + (len(self._unevaluated_pages) * 2)
1244
1242
  + fixed_pages_within_executor
1245
- + adhoc_steps_without_executor,
1243
+ + adhoc_steps_without_executor
1244
+ + plugin_count,
1246
1245
  )
1247
1246
 
1248
1247
  with console.timing("Evaluate Pages (Frontend)"):
@@ -1294,15 +1293,6 @@ class App(MiddlewareMixin, LifespanMixin):
1294
1293
  # Track imports found.
1295
1294
  all_imports = {}
1296
1295
 
1297
- # This has to happen before compiling stateful components as that
1298
- # prevents recursive functions from reaching all components.
1299
- for component in self._pages.values():
1300
- # Add component._get_all_imports() to all_imports.
1301
- all_imports.update(component._get_all_imports())
1302
-
1303
- # Add the app wrappers from this component.
1304
- app_wrappers.update(component._get_all_app_wrap_components())
1305
-
1306
1296
  if (toaster := self.toaster) is not None:
1307
1297
  from reflex.components.component import memo
1308
1298
 
@@ -1320,6 +1310,25 @@ class App(MiddlewareMixin, LifespanMixin):
1320
1310
  if component is not None:
1321
1311
  app_wrappers[key] = component
1322
1312
 
1313
+ # Compile custom components.
1314
+ (
1315
+ custom_components_output,
1316
+ custom_components_result,
1317
+ custom_components_imports,
1318
+ ) = compiler.compile_components(dict.fromkeys(CUSTOM_COMPONENTS.values()))
1319
+ compile_results.append((custom_components_output, custom_components_result))
1320
+ all_imports.update(custom_components_imports)
1321
+ progress.advance(task)
1322
+
1323
+ # This has to happen before compiling stateful components as that
1324
+ # prevents recursive functions from reaching all components.
1325
+ for component in self._pages.values():
1326
+ # Add component._get_all_imports() to all_imports.
1327
+ all_imports.update(component._get_all_imports())
1328
+
1329
+ # Add the app wrappers from this component.
1330
+ app_wrappers.update(component._get_all_app_wrap_components())
1331
+
1323
1332
  if self.error_boundary:
1324
1333
  from reflex.compiler.compiler import into_component
1325
1334
 
@@ -1342,10 +1351,11 @@ class App(MiddlewareMixin, LifespanMixin):
1342
1351
 
1343
1352
  # Catch "static" apps (that do not define a rx.State subclass) which are trying to access rx.State.
1344
1353
  if code_uses_state_contexts(stateful_components_code) and self._state is None:
1345
- raise ReflexRuntimeError(
1354
+ msg = (
1346
1355
  "To access rx.State in frontend components, at least one "
1347
1356
  "subclass of rx.State must be defined in the app."
1348
1357
  )
1358
+ raise ReflexRuntimeError(msg)
1349
1359
  compile_results.append((stateful_components_path, stateful_components_code))
1350
1360
 
1351
1361
  progress.advance(task)
@@ -1412,9 +1422,17 @@ class App(MiddlewareMixin, LifespanMixin):
1412
1422
  # Compile the theme.
1413
1423
  _submit_work(compile_theme, self.style)
1414
1424
 
1425
+ def _submit_work_without_advancing(
1426
+ fn: Callable[P, list[tuple[str, str]] | tuple[str, str] | None],
1427
+ *args: P.args,
1428
+ **kwargs: P.kwargs,
1429
+ ):
1430
+ f = executor.submit(fn, *args, **kwargs)
1431
+ result_futures.append(f)
1432
+
1415
1433
  for plugin in config.plugins:
1416
1434
  plugin.pre_compile(
1417
- add_save_task=_submit_work,
1435
+ add_save_task=_submit_work_without_advancing,
1418
1436
  add_modify_task=(
1419
1437
  lambda *args, plugin=plugin: modify_files_tasks.append(
1420
1438
  (
@@ -1433,6 +1451,8 @@ class App(MiddlewareMixin, LifespanMixin):
1433
1451
  else:
1434
1452
  compile_results.append(result)
1435
1453
 
1454
+ progress.advance(task, advance=len(config.plugins))
1455
+
1436
1456
  app_root = self._app_root(app_wrappers=app_wrappers)
1437
1457
 
1438
1458
  # Get imports from AppWrap components.
@@ -1455,16 +1475,6 @@ class App(MiddlewareMixin, LifespanMixin):
1455
1475
  )
1456
1476
  progress.advance(task)
1457
1477
 
1458
- # Compile custom components.
1459
- (
1460
- custom_components_output,
1461
- custom_components_result,
1462
- custom_components_imports,
1463
- ) = compiler.compile_components(dict.fromkeys(CUSTOM_COMPONENTS.values()))
1464
- compile_results.append((custom_components_output, custom_components_result))
1465
- all_imports.update(custom_components_imports)
1466
-
1467
- progress.advance(task)
1468
1478
  progress.stop()
1469
1479
 
1470
1480
  if dry_run:
@@ -1529,9 +1539,8 @@ class App(MiddlewareMixin, LifespanMixin):
1529
1539
  if path.exists():
1530
1540
  file_content = path.read_text()
1531
1541
  else:
1532
- raise FileNotFoundError(
1533
- f"Plugin {plugin_name} is trying to modify {path} but it does not exist."
1534
- )
1542
+ msg = f"Plugin {plugin_name} is trying to modify {path} but it does not exist."
1543
+ raise FileNotFoundError(msg)
1535
1544
  output_mapping[path] = modify_fn(file_content)
1536
1545
 
1537
1546
  with console.timing("Write to Disk"):
@@ -1574,7 +1583,8 @@ class App(MiddlewareMixin, LifespanMixin):
1574
1583
  RuntimeError: If the app has not been initialized yet.
1575
1584
  """
1576
1585
  if self.event_namespace is None:
1577
- raise RuntimeError("App has not been initialized yet.")
1586
+ msg = "App has not been initialized yet."
1587
+ raise RuntimeError(msg)
1578
1588
 
1579
1589
  # Get exclusive access to the state.
1580
1590
  async with self.state_manager.modify_state(token) as state:
@@ -1613,7 +1623,8 @@ class App(MiddlewareMixin, LifespanMixin):
1613
1623
  RuntimeError: If the app has not been initialized yet.
1614
1624
  """
1615
1625
  if self.event_namespace is None:
1616
- raise RuntimeError("App has not been initialized yet.")
1626
+ msg = "App has not been initialized yet."
1627
+ raise RuntimeError(msg)
1617
1628
 
1618
1629
  # Process the event.
1619
1630
  async for update in state._process_event(
@@ -1664,20 +1675,17 @@ class App(MiddlewareMixin, LifespanMixin):
1664
1675
  _fn_name = type(handler_fn).__name__
1665
1676
 
1666
1677
  if isinstance(handler_fn, functools.partial):
1667
- raise ValueError(
1668
- f"Provided custom {handler_domain} exception handler `{_fn_name}` is a partial function. Please provide a named function instead."
1669
- )
1678
+ msg = f"Provided custom {handler_domain} exception handler `{_fn_name}` is a partial function. Please provide a named function instead."
1679
+ raise ValueError(msg)
1670
1680
 
1671
1681
  if not callable(handler_fn):
1672
- raise ValueError(
1673
- f"Provided custom {handler_domain} exception handler `{_fn_name}` is not a function."
1674
- )
1682
+ msg = f"Provided custom {handler_domain} exception handler `{_fn_name}` is not a function."
1683
+ raise ValueError(msg)
1675
1684
 
1676
1685
  # Allow named functions only as lambda functions cannot be introspected
1677
1686
  if _fn_name == "<lambda>":
1678
- raise ValueError(
1679
- f"Provided custom {handler_domain} exception handler `{_fn_name}` is a lambda function. Please use a named function instead."
1680
- )
1687
+ msg = f"Provided custom {handler_domain} exception handler `{_fn_name}` is a lambda function. Please use a named function instead."
1688
+ raise ValueError(msg)
1681
1689
 
1682
1690
  # Check if the function has the necessary annotations and types in the right order
1683
1691
  argspec = inspect.getfullargspec(handler_fn)
@@ -1689,22 +1697,21 @@ class App(MiddlewareMixin, LifespanMixin):
1689
1697
 
1690
1698
  for required_arg_index, required_arg in enumerate(handler_spec):
1691
1699
  if required_arg not in arg_annotations:
1692
- raise ValueError(
1693
- f"Provided custom {handler_domain} exception handler `{_fn_name}` does not take the required argument `{required_arg}`"
1694
- )
1695
- elif (
1696
- not list(arg_annotations.keys())[required_arg_index] == required_arg
1697
- ):
1698
- raise ValueError(
1700
+ msg = f"Provided custom {handler_domain} exception handler `{_fn_name}` does not take the required argument `{required_arg}`"
1701
+ raise ValueError(msg)
1702
+ if list(arg_annotations.keys())[required_arg_index] != required_arg:
1703
+ msg = (
1699
1704
  f"Provided custom {handler_domain} exception handler `{_fn_name}` has the wrong argument order."
1700
1705
  f"Expected `{required_arg}` as the {required_arg_index + 1} argument but got `{list(arg_annotations.keys())[required_arg_index]}`"
1701
1706
  )
1707
+ raise ValueError(msg)
1702
1708
 
1703
1709
  if not issubclass(arg_annotations[required_arg], Exception):
1704
- raise ValueError(
1710
+ msg = (
1705
1711
  f"Provided custom {handler_domain} exception handler `{_fn_name}` has the wrong type for {required_arg} argument."
1706
1712
  f"Expected to be `Exception` but got `{arg_annotations[required_arg]}`"
1707
1713
  )
1714
+ raise ValueError(msg)
1708
1715
 
1709
1716
  # Check if the return type is valid for backend exception handler
1710
1717
  if handler_domain == "backend":
@@ -1724,10 +1731,11 @@ class App(MiddlewareMixin, LifespanMixin):
1724
1731
  )
1725
1732
 
1726
1733
  if not valid:
1727
- raise ValueError(
1734
+ msg = (
1728
1735
  f"Provided custom {handler_domain} exception handler `{_fn_name}` has the wrong return type."
1729
1736
  f"Expected `EventSpec | list[EventSpec] | None` but got `{return_type}`"
1730
1737
  )
1738
+ raise ValueError(msg)
1731
1739
 
1732
1740
 
1733
1741
  async def process(
@@ -1896,7 +1904,8 @@ def upload(app: App):
1896
1904
  return Response() # user cancelled
1897
1905
  files = files.getlist("files")
1898
1906
  if not files:
1899
- raise UploadValueError("No files were uploaded.")
1907
+ msg = "No files were uploaded."
1908
+ raise UploadValueError(msg)
1900
1909
 
1901
1910
  token = request.headers.get("reflex-client-token")
1902
1911
  handler = request.headers.get("reflex-event-handler")
@@ -1923,9 +1932,8 @@ def upload(app: App):
1923
1932
  # check if there exists any handler args with annotation, list[UploadFile]
1924
1933
  if isinstance(func, EventHandler):
1925
1934
  if func.is_background:
1926
- raise UploadTypeError(
1927
- f"@rx.event(background=True) is not supported for upload handler `{handler}`.",
1928
- )
1935
+ msg = f"@rx.event(background=True) is not supported for upload handler `{handler}`."
1936
+ raise UploadTypeError(msg)
1929
1937
  func = func.fn
1930
1938
  if isinstance(func, functools.partial):
1931
1939
  func = func.func
@@ -1938,10 +1946,11 @@ def upload(app: App):
1938
1946
  break
1939
1947
 
1940
1948
  if not handler_upload_param:
1941
- raise UploadValueError(
1949
+ msg = (
1942
1950
  f"`{handler}` handler should have a parameter annotated as "
1943
1951
  "list[rx.UploadFile]"
1944
1952
  )
1953
+ raise UploadValueError(msg)
1945
1954
 
1946
1955
  # Make a copy of the files as they are closed after the request.
1947
1956
  # This behaviour changed from fastapi 0.103.0 to 0.103.1 as the
@@ -2084,32 +2093,31 @@ class EventNamespace(AsyncNamespace):
2084
2093
  try:
2085
2094
  fields = json.loads(fields)
2086
2095
  except json.JSONDecodeError as ex:
2087
- raise exceptions.EventDeserializationError(
2088
- f"Failed to deserialize event data: {fields}."
2089
- ) from ex
2096
+ msg = f"Failed to deserialize event data: {fields}."
2097
+ raise exceptions.EventDeserializationError(msg) from ex
2090
2098
 
2091
2099
  if not isinstance(fields, dict):
2092
- raise exceptions.EventDeserializationError(
2093
- f"Event data must be a dictionary, but received {fields} of type {type(fields)}."
2094
- )
2100
+ msg = f"Event data must be a dictionary, but received {fields} of type {type(fields)}."
2101
+ raise exceptions.EventDeserializationError(msg)
2095
2102
 
2096
2103
  try:
2097
2104
  # Get the event.
2098
2105
  event = Event(**{k: v for k, v in fields.items() if k in _EVENT_FIELDS})
2099
2106
  except (TypeError, ValueError) as ex:
2100
- raise exceptions.EventDeserializationError(
2101
- f"Failed to deserialize event data: {fields}."
2102
- ) from ex
2107
+ msg = f"Failed to deserialize event data: {fields}."
2108
+ raise exceptions.EventDeserializationError(msg) from ex
2103
2109
 
2104
2110
  self.token_to_sid[event.token] = sid
2105
2111
  self.sid_to_token[sid] = event.token
2106
2112
 
2107
2113
  # Get the event environment.
2108
2114
  if self.app.sio is None:
2109
- raise RuntimeError("Socket.IO is not initialized.")
2115
+ msg = "Socket.IO is not initialized."
2116
+ raise RuntimeError(msg)
2110
2117
  environ = self.app.sio.get_environ(sid, self.namespace)
2111
2118
  if environ is None:
2112
- raise RuntimeError("Socket.IO environ is not initialized.")
2119
+ msg = "Socket.IO environ is not initialized."
2120
+ raise RuntimeError(msg)
2113
2121
 
2114
2122
  # Get the client headers.
2115
2123
  headers = {
@@ -67,9 +67,8 @@ class LifespanMixin(AppMixin):
67
67
  InvalidLifespanTaskTypeError: If the task is a generator function.
68
68
  """
69
69
  if inspect.isgeneratorfunction(task) or inspect.isasyncgenfunction(task):
70
- raise InvalidLifespanTaskTypeError(
71
- f"Task {task.__name__} of type generator must be decorated with contextlib.asynccontextmanager."
72
- )
70
+ msg = f"Task {task.__name__} of type generator must be decorated with contextlib.asynccontextmanager."
71
+ raise InvalidLifespanTaskTypeError(msg)
73
72
 
74
73
  if task_kwargs:
75
74
  original_task = task
@@ -56,6 +56,7 @@ class MiddlewareMixin(AppMixin):
56
56
  out = await out
57
57
  if out is not None:
58
58
  return out
59
+ return None
59
60
 
60
61
  async def _postprocess(
61
62
  self, state: BaseState, event: Event, update: StateUpdate
@@ -12,4 +12,3 @@ class AppMixin:
12
12
 
13
13
  Any App mixin can override this method to perform any initialization.
14
14
  """
15
- ...
@@ -4,7 +4,7 @@ import inspect
4
4
  from pathlib import Path
5
5
 
6
6
  from reflex import constants
7
- from reflex.config import EnvironmentVariables
7
+ from reflex.environment import EnvironmentVariables
8
8
 
9
9
 
10
10
  def asset(
@@ -58,9 +58,11 @@ def asset(
58
58
  cwd = Path.cwd()
59
59
  src_file_local = cwd / assets / path
60
60
  if subfolder is not None:
61
- raise ValueError("Subfolder is not supported for local assets.")
61
+ msg = "Subfolder is not supported for local assets."
62
+ raise ValueError(msg)
62
63
  if not backend_only and not src_file_local.exists():
63
- raise FileNotFoundError(f"File not found: {src_file_local}")
64
+ msg = f"File not found: {src_file_local}"
65
+ raise FileNotFoundError(msg)
64
66
  return f"/{path}"
65
67
 
66
68
  # Shared asset handling
@@ -73,7 +75,8 @@ def asset(
73
75
  external = constants.Dirs.EXTERNAL_APP_ASSETS
74
76
  src_file_shared = Path(calling_file).parent / path
75
77
  if not src_file_shared.exists():
76
- raise FileNotFoundError(f"File not found: {src_file_shared}")
78
+ msg = f"File not found: {src_file_shared}"
79
+ raise FileNotFoundError(msg)
77
80
 
78
81
  caller_module_path = module.__name__.replace(".", "/")
79
82
  subfolder = f"{caller_module_path}/{subfolder}" if subfolder else caller_module_path
@@ -30,10 +30,11 @@ def validate_field_name(bases: list[type[BaseModel]], field_name: str) -> None:
30
30
  if not reload and getattr(base, field_name, None):
31
31
  pass
32
32
  except TypeError as te:
33
- raise VarNameError(
33
+ msg = (
34
34
  f'State var "{field_name}" in {base} has been shadowed by a substate var; '
35
35
  f'use a different field name instead".'
36
- ) from te
36
+ )
37
+ raise VarNameError(msg) from te
37
38
 
38
39
 
39
40
  # monkeypatch pydantic validate_field_name method to skip validating