reflex 0.8.15a0__tar.gz → 0.8.15a2__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.
Files changed (396) hide show
  1. {reflex-0.8.15a0 → reflex-0.8.15a2}/PKG-INFO +4 -3
  2. {reflex-0.8.15a0 → reflex-0.8.15a2}/pyproject.toml +5 -4
  3. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/utils/state.js +68 -8
  4. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/__init__.py +11 -6
  5. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/__init__.pyi +9 -2
  6. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/app.py +5 -5
  7. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/base.py +8 -11
  8. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/field.py +3 -1
  9. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/markdown/markdown.py +101 -27
  10. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/constants/base.py +5 -0
  11. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/constants/installer.py +2 -2
  12. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/event.py +3 -0
  13. reflex-0.8.15a2/reflex/istate/manager/__init__.py +120 -0
  14. reflex-0.8.15a2/reflex/istate/manager/disk.py +210 -0
  15. reflex-0.8.15a2/reflex/istate/manager/memory.py +76 -0
  16. reflex-0.8.15a0/reflex/istate/manager.py → reflex-0.8.15a2/reflex/istate/manager/redis.py +5 -372
  17. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/model.py +5 -1
  18. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/state.py +14 -9
  19. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/testing.py +4 -8
  20. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/codespaces.py +30 -1
  21. reflex-0.8.15a2/reflex/utils/compat.py +94 -0
  22. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/misc.py +2 -1
  23. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/monitoring.py +1 -2
  24. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/prerequisites.py +17 -3
  25. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/processes.py +3 -1
  26. reflex-0.8.15a2/reflex/utils/redir.py +43 -0
  27. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/types.py +9 -1
  28. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/vars/base.py +106 -25
  29. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/vars/color.py +28 -8
  30. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/vars/datetime.py +6 -2
  31. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/vars/dep_tracking.py +2 -2
  32. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/vars/number.py +26 -0
  33. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/vars/object.py +23 -6
  34. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/vars/sequence.py +32 -1
  35. reflex-0.8.15a0/reflex/utils/compat.py +0 -46
  36. reflex-0.8.15a0/reflex/utils/redir.py +0 -59
  37. {reflex-0.8.15a0 → reflex-0.8.15a2}/.gitignore +0 -0
  38. {reflex-0.8.15a0 → reflex-0.8.15a2}/LICENSE +0 -0
  39. {reflex-0.8.15a0 → reflex-0.8.15a2}/README.md +0 -0
  40. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
  41. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/apps/blank/code/__init__.py +0 -0
  42. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/apps/blank/code/blank.py +0 -0
  43. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/.gitignore +0 -0
  44. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/app/entry.client.js +0 -0
  45. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/app/routes.js +0 -0
  46. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
  47. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/components/shiki/code.js +0 -0
  48. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/jsconfig.json +0 -0
  49. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/postcss.config.js +0 -0
  50. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/react-router.config.js +0 -0
  51. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/styles/__reflex_style_reset.css +0 -0
  52. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
  53. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/utils/helpers/debounce.js +0 -0
  54. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/utils/helpers/paste.js +0 -0
  55. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/utils/helpers/range.js +0 -0
  56. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/utils/helpers/throttle.js +0 -0
  57. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/utils/helpers/upload.js +0 -0
  58. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/utils/react-theme.js +0 -0
  59. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/.templates/web/vite-plugin-safari-cachebust.js +0 -0
  60. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/__main__.py +0 -0
  61. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/admin.py +0 -0
  62. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/app_mixins/__init__.py +0 -0
  63. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/app_mixins/lifespan.py +0 -0
  64. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/app_mixins/middleware.py +0 -0
  65. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/app_mixins/mixin.py +0 -0
  66. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/assets.py +0 -0
  67. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/compiler/__init__.py +0 -0
  68. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/compiler/compiler.py +0 -0
  69. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/compiler/templates.py +0 -0
  70. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/compiler/utils.py +0 -0
  71. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/__init__.py +0 -0
  72. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/__init__.pyi +0 -0
  73. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/__init__.py +0 -0
  74. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/__init__.pyi +0 -0
  75. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/app_wrap.py +0 -0
  76. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/app_wrap.pyi +0 -0
  77. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/bare.py +0 -0
  78. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/body.py +0 -0
  79. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/body.pyi +0 -0
  80. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/document.py +0 -0
  81. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/document.pyi +0 -0
  82. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/error_boundary.py +0 -0
  83. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/error_boundary.pyi +0 -0
  84. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/fragment.py +0 -0
  85. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/fragment.pyi +0 -0
  86. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/link.py +0 -0
  87. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/link.pyi +0 -0
  88. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/meta.py +0 -0
  89. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/meta.pyi +0 -0
  90. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/script.py +0 -0
  91. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/script.pyi +0 -0
  92. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/strict_mode.py +0 -0
  93. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/base/strict_mode.pyi +0 -0
  94. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/component.py +0 -0
  95. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/__init__.py +0 -0
  96. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/__init__.pyi +0 -0
  97. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/auto_scroll.py +0 -0
  98. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/auto_scroll.pyi +0 -0
  99. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/banner.py +0 -0
  100. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/banner.pyi +0 -0
  101. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/breakpoints.py +0 -0
  102. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/clipboard.py +0 -0
  103. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/clipboard.pyi +0 -0
  104. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/colors.py +0 -0
  105. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/cond.py +0 -0
  106. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/debounce.py +0 -0
  107. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/debounce.pyi +0 -0
  108. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/foreach.py +0 -0
  109. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/helmet.py +0 -0
  110. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/helmet.pyi +0 -0
  111. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/html.py +0 -0
  112. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/html.pyi +0 -0
  113. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/layout/__init__.py +0 -0
  114. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/match.py +0 -0
  115. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/responsive.py +0 -0
  116. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/sticky.py +0 -0
  117. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/sticky.pyi +0 -0
  118. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/upload.py +0 -0
  119. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/upload.pyi +0 -0
  120. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/window_events.py +0 -0
  121. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/core/window_events.pyi +0 -0
  122. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/datadisplay/__init__.py +0 -0
  123. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/datadisplay/__init__.pyi +0 -0
  124. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/datadisplay/code.py +0 -0
  125. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/datadisplay/code.pyi +0 -0
  126. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/datadisplay/dataeditor.py +0 -0
  127. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/datadisplay/dataeditor.pyi +0 -0
  128. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/datadisplay/logo.py +0 -0
  129. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/datadisplay/shiki_code_block.py +0 -0
  130. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/datadisplay/shiki_code_block.pyi +0 -0
  131. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/dynamic.py +0 -0
  132. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/__init__.py +0 -0
  133. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/__init__.pyi +0 -0
  134. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/element.py +0 -0
  135. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/element.pyi +0 -0
  136. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/__init__.py +0 -0
  137. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/__init__.pyi +0 -0
  138. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/base.py +0 -0
  139. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/base.pyi +0 -0
  140. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/forms.py +0 -0
  141. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/forms.pyi +0 -0
  142. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/inline.py +0 -0
  143. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/inline.pyi +0 -0
  144. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/media.py +0 -0
  145. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/media.pyi +0 -0
  146. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/metadata.py +0 -0
  147. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/metadata.pyi +0 -0
  148. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/other.py +0 -0
  149. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/other.pyi +0 -0
  150. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/scripts.py +0 -0
  151. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/scripts.pyi +0 -0
  152. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/sectioning.py +0 -0
  153. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/sectioning.pyi +0 -0
  154. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/tables.py +0 -0
  155. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/tables.pyi +0 -0
  156. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/typography.py +0 -0
  157. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/el/elements/typography.pyi +0 -0
  158. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/gridjs/__init__.py +0 -0
  159. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/gridjs/datatable.py +0 -0
  160. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/gridjs/datatable.pyi +0 -0
  161. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/literals.py +0 -0
  162. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/lucide/__init__.py +0 -0
  163. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/lucide/icon.py +0 -0
  164. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/lucide/icon.pyi +0 -0
  165. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/markdown/__init__.py +0 -0
  166. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/markdown/markdown.pyi +0 -0
  167. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/moment/__init__.py +0 -0
  168. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/moment/moment.py +0 -0
  169. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/moment/moment.pyi +0 -0
  170. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/plotly/__init__.py +0 -0
  171. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/plotly/plotly.py +0 -0
  172. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/plotly/plotly.pyi +0 -0
  173. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/props.py +0 -0
  174. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/__init__.py +0 -0
  175. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/__init__.pyi +0 -0
  176. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/primitives/__init__.py +0 -0
  177. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/primitives/__init__.pyi +0 -0
  178. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/primitives/accordion.py +0 -0
  179. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/primitives/accordion.pyi +0 -0
  180. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/primitives/base.py +0 -0
  181. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/primitives/base.pyi +0 -0
  182. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/primitives/dialog.py +0 -0
  183. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/primitives/dialog.pyi +0 -0
  184. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/primitives/drawer.py +0 -0
  185. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/primitives/drawer.pyi +0 -0
  186. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/primitives/form.py +0 -0
  187. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/primitives/form.pyi +0 -0
  188. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/primitives/progress.py +0 -0
  189. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/primitives/progress.pyi +0 -0
  190. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/primitives/slider.py +0 -0
  191. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/primitives/slider.pyi +0 -0
  192. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/__init__.py +0 -0
  193. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/__init__.pyi +0 -0
  194. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/base.py +0 -0
  195. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/base.pyi +0 -0
  196. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/color_mode.py +0 -0
  197. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/color_mode.pyi +0 -0
  198. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/__init__.py +0 -0
  199. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/__init__.pyi +0 -0
  200. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
  201. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
  202. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
  203. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
  204. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/avatar.py +0 -0
  205. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/avatar.pyi +0 -0
  206. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/badge.py +0 -0
  207. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/badge.pyi +0 -0
  208. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/button.py +0 -0
  209. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/button.pyi +0 -0
  210. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/callout.py +0 -0
  211. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/callout.pyi +0 -0
  212. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/card.py +0 -0
  213. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/card.pyi +0 -0
  214. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/checkbox.py +0 -0
  215. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
  216. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/checkbox_cards.py +0 -0
  217. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/checkbox_cards.pyi +0 -0
  218. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/checkbox_group.py +0 -0
  219. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/checkbox_group.pyi +0 -0
  220. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/context_menu.py +0 -0
  221. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
  222. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/data_list.py +0 -0
  223. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/data_list.pyi +0 -0
  224. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/dialog.py +0 -0
  225. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/dialog.pyi +0 -0
  226. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
  227. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
  228. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/hover_card.py +0 -0
  229. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
  230. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/icon_button.py +0 -0
  231. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
  232. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/inset.py +0 -0
  233. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/inset.pyi +0 -0
  234. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/popover.py +0 -0
  235. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/popover.pyi +0 -0
  236. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/progress.py +0 -0
  237. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/progress.pyi +0 -0
  238. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/radio.py +0 -0
  239. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/radio.pyi +0 -0
  240. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/radio_cards.py +0 -0
  241. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/radio_cards.pyi +0 -0
  242. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/radio_group.py +0 -0
  243. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
  244. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/scroll_area.py +0 -0
  245. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
  246. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/segmented_control.py +0 -0
  247. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/segmented_control.pyi +0 -0
  248. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/select.py +0 -0
  249. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/select.pyi +0 -0
  250. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/separator.py +0 -0
  251. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/separator.pyi +0 -0
  252. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/skeleton.py +0 -0
  253. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/skeleton.pyi +0 -0
  254. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/slider.py +0 -0
  255. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/slider.pyi +0 -0
  256. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/spinner.py +0 -0
  257. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/spinner.pyi +0 -0
  258. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/switch.py +0 -0
  259. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/switch.pyi +0 -0
  260. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/table.py +0 -0
  261. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/table.pyi +0 -0
  262. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/tabs.py +0 -0
  263. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/tabs.pyi +0 -0
  264. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/text_area.py +0 -0
  265. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/text_area.pyi +0 -0
  266. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/text_field.py +0 -0
  267. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/text_field.pyi +0 -0
  268. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/tooltip.py +0 -0
  269. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
  270. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/__init__.py +0 -0
  271. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/__init__.pyi +0 -0
  272. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/base.py +0 -0
  273. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/base.pyi +0 -0
  274. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/box.py +0 -0
  275. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/box.pyi +0 -0
  276. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/center.py +0 -0
  277. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/center.pyi +0 -0
  278. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/container.py +0 -0
  279. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/container.pyi +0 -0
  280. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/flex.py +0 -0
  281. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/flex.pyi +0 -0
  282. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/grid.py +0 -0
  283. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/grid.pyi +0 -0
  284. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/list.py +0 -0
  285. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/list.pyi +0 -0
  286. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/section.py +0 -0
  287. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/section.pyi +0 -0
  288. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/spacer.py +0 -0
  289. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
  290. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/stack.py +0 -0
  291. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/layout/stack.pyi +0 -0
  292. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/typography/__init__.py +0 -0
  293. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/typography/__init__.pyi +0 -0
  294. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/typography/base.py +0 -0
  295. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/typography/blockquote.py +0 -0
  296. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
  297. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/typography/code.py +0 -0
  298. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/typography/code.pyi +0 -0
  299. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/typography/heading.py +0 -0
  300. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/typography/heading.pyi +0 -0
  301. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/typography/link.py +0 -0
  302. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/typography/link.pyi +0 -0
  303. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/typography/text.py +0 -0
  304. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/radix/themes/typography/text.pyi +0 -0
  305. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/react_player/__init__.py +0 -0
  306. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/react_player/audio.py +0 -0
  307. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/react_player/audio.pyi +0 -0
  308. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/react_player/react_player.py +0 -0
  309. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/react_player/react_player.pyi +0 -0
  310. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/react_player/video.py +0 -0
  311. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/react_player/video.pyi +0 -0
  312. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/react_router/__init__.py +0 -0
  313. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/react_router/dom.py +0 -0
  314. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/react_router/dom.pyi +0 -0
  315. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/recharts/__init__.py +0 -0
  316. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/recharts/__init__.pyi +0 -0
  317. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/recharts/cartesian.py +0 -0
  318. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/recharts/cartesian.pyi +0 -0
  319. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/recharts/charts.py +0 -0
  320. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/recharts/charts.pyi +0 -0
  321. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/recharts/general.py +0 -0
  322. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/recharts/general.pyi +0 -0
  323. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/recharts/polar.py +0 -0
  324. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/recharts/polar.pyi +0 -0
  325. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/recharts/recharts.py +0 -0
  326. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/recharts/recharts.pyi +0 -0
  327. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/sonner/__init__.py +0 -0
  328. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/sonner/toast.py +0 -0
  329. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/sonner/toast.pyi +0 -0
  330. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/tags/__init__.py +0 -0
  331. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/tags/cond_tag.py +0 -0
  332. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/tags/iter_tag.py +0 -0
  333. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/tags/match_tag.py +0 -0
  334. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/tags/tag.py +0 -0
  335. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/components/tags/tagless.py +0 -0
  336. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/config.py +0 -0
  337. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/constants/__init__.py +0 -0
  338. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/constants/colors.py +0 -0
  339. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/constants/compiler.py +0 -0
  340. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/constants/config.py +0 -0
  341. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/constants/custom_components.py +0 -0
  342. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/constants/event.py +0 -0
  343. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/constants/route.py +0 -0
  344. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/constants/state.py +0 -0
  345. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/constants/utils.py +0 -0
  346. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/custom_components/__init__.py +0 -0
  347. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/custom_components/custom_components.py +0 -0
  348. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/environment.py +0 -0
  349. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/experimental/__init__.py +0 -0
  350. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/experimental/client_state.py +0 -0
  351. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/experimental/hooks.py +0 -0
  352. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/istate/__init__.py +0 -0
  353. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/istate/data.py +0 -0
  354. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/istate/dynamic.py +0 -0
  355. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/istate/proxy.py +0 -0
  356. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/istate/storage.py +0 -0
  357. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/istate/wrappers.py +0 -0
  358. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/middleware/__init__.py +0 -0
  359. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/middleware/hydrate_middleware.py +0 -0
  360. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/middleware/middleware.py +0 -0
  361. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/page.py +0 -0
  362. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/plugins/__init__.py +0 -0
  363. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/plugins/_screenshot.py +0 -0
  364. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/plugins/base.py +0 -0
  365. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/plugins/shared_tailwind.py +0 -0
  366. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/plugins/sitemap.py +0 -0
  367. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/plugins/tailwind_v3.py +0 -0
  368. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/plugins/tailwind_v4.py +0 -0
  369. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/py.typed +0 -0
  370. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/reflex.py +0 -0
  371. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/route.py +0 -0
  372. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/style.py +0 -0
  373. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/__init__.py +0 -0
  374. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/build.py +0 -0
  375. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/console.py +0 -0
  376. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/decorator.py +0 -0
  377. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/exceptions.py +0 -0
  378. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/exec.py +0 -0
  379. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/export.py +0 -0
  380. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/format.py +0 -0
  381. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/frontend_skeleton.py +0 -0
  382. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/imports.py +0 -0
  383. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/js_runtimes.py +0 -0
  384. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/lazy_loader.py +0 -0
  385. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/net.py +0 -0
  386. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/path_ops.py +0 -0
  387. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/pyi_generator.py +0 -0
  388. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/registry.py +0 -0
  389. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/rename.py +0 -0
  390. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/serializers.py +0 -0
  391. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/telemetry.py +0 -0
  392. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/templates.py +4 -4
  393. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/utils/token_manager.py +0 -0
  394. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/vars/__init__.py +0 -0
  395. {reflex-0.8.15a0 → reflex-0.8.15a2}/reflex/vars/function.py +0 -0
  396. {reflex-0.8.15a0 → reflex-0.8.15a2}/scripts/hatch_build.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reflex
3
- Version: 0.8.15a0
3
+ Version: 0.8.15a2
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
@@ -18,10 +18,11 @@ Classifier: Programming Language :: Python :: 3.10
18
18
  Classifier: Programming Language :: Python :: 3.11
19
19
  Classifier: Programming Language :: Python :: 3.12
20
20
  Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
21
22
  Requires-Python: <4.0,>=3.10
22
23
  Requires-Dist: alembic<2.0,>=1.15.2
23
24
  Requires-Dist: click>=8.2
24
- Requires-Dist: granian[reload]>=2.4.0
25
+ Requires-Dist: granian[reload]>=2.5.5
25
26
  Requires-Dist: httpx<1.0,>=0.23.3
26
27
  Requires-Dist: packaging<26,>=24.2
27
28
  Requires-Dist: platformdirs<5.0,>=4.3.7
@@ -32,7 +33,7 @@ Requires-Dist: python-socketio<6.0,>=5.12.0
32
33
  Requires-Dist: redis<7.0,>=5.2.1
33
34
  Requires-Dist: reflex-hosting-cli>=0.1.55
34
35
  Requires-Dist: rich<15,>=13
35
- Requires-Dist: sqlmodel<0.1,>=0.0.24
36
+ Requires-Dist: sqlmodel<0.1,>=0.0.27
36
37
  Requires-Dist: starlette>=0.47.0
37
38
  Requires-Dist: typing-extensions>=4.13.0
38
39
  Requires-Dist: wrapt<2.0,>=1.17.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "reflex"
3
- version = "0.8.15a0"
3
+ version = "0.8.15a2"
4
4
  description = "Web apps in pure Python."
5
5
  license.text = "Apache-2.0"
6
6
  authors = [
@@ -22,7 +22,7 @@ requires-python = ">=3.10,<4.0"
22
22
  dependencies = [
23
23
  "alembic >=1.15.2,<2.0",
24
24
  "click >=8.2",
25
- "granian[reload] >=2.4.0",
25
+ "granian[reload] >=2.5.5",
26
26
  "httpx >=0.23.3,<1.0",
27
27
  "packaging >=24.2,<26",
28
28
  "platformdirs >=4.3.7,<5.0",
@@ -33,7 +33,7 @@ dependencies = [
33
33
  "redis >=5.2.1,<7.0",
34
34
  "reflex-hosting-cli >=0.1.55",
35
35
  "rich >=13,<15",
36
- "sqlmodel >=0.0.24,<0.1",
36
+ "sqlmodel >=0.0.27,<0.1",
37
37
  "starlette >=0.47.0",
38
38
  "typing_extensions >=4.13.0",
39
39
  "wrapt >=1.17.0,<2.0",
@@ -47,6 +47,7 @@ classifiers = [
47
47
  "Programming Language :: Python :: 3.11",
48
48
  "Programming Language :: Python :: 3.12",
49
49
  "Programming Language :: Python :: 3.13",
50
+ "Programming Language :: Python :: 3.14",
50
51
  ]
51
52
 
52
53
  [project.optional-dependencies]
@@ -89,7 +90,7 @@ dev = [
89
90
  "pytest-cov",
90
91
  "pytest-mock",
91
92
  "pytest-playwright",
92
- "pytest-retry",
93
+ "pytest-rerunfailures",
93
94
  "pytest-split",
94
95
  "pytest",
95
96
  "python-dotenv",
@@ -529,6 +529,14 @@ export const connect = async (
529
529
  navigate,
530
530
  params,
531
531
  ) => {
532
+ // Socket already allocated, just reconnect it if needed.
533
+ if (socket.current) {
534
+ if (!socket.current.connected) {
535
+ socket.current.reconnect();
536
+ }
537
+ return;
538
+ }
539
+
532
540
  // Get backend URL object from the endpoint.
533
541
  const endpoint = getBackendURL(EVENTURL);
534
542
  const on_hydrated_queue = [];
@@ -540,7 +548,9 @@ export const connect = async (
540
548
  protocols: [reflexEnvironment.version],
541
549
  autoUnref: false,
542
550
  query: { token: getToken() },
551
+ reconnection: false, // Reconnection will be handled manually.
543
552
  });
553
+ socket.current.wait_connect = !socket.current.connected;
544
554
  // Ensure undefined fields in events are sent as null instead of removed
545
555
  socket.current.io.encoder.replacer = (k, v) => (v === undefined ? null : v);
546
556
  socket.current.io.decoder.tryParse = (str) => {
@@ -550,6 +560,18 @@ export const connect = async (
550
560
  return false;
551
561
  }
552
562
  };
563
+ // Set up a reconnect helper function
564
+ socket.current.reconnect = () => {
565
+ if (
566
+ socket.current &&
567
+ !socket.current.connected &&
568
+ !socket.current.wait_connect
569
+ ) {
570
+ socket.current.wait_connect = true;
571
+ socket.current.io.opts.query = { token: getToken() }; // Update token for reconnect.
572
+ socket.current.connect();
573
+ }
574
+ };
553
575
 
554
576
  function checkVisibility() {
555
577
  if (document.visibilityState === "visible") {
@@ -565,7 +587,7 @@ export const connect = async (
565
587
  );
566
588
  } else if (!socket.current.connected) {
567
589
  console.log("Socket is disconnected, attempting to reconnect ");
568
- socket.current.connect();
590
+ socket.current.reconnect();
569
591
  } else {
570
592
  console.log("Socket is reconnected ");
571
593
  }
@@ -588,6 +610,7 @@ export const connect = async (
588
610
 
589
611
  // Once the socket is open, hydrate the page.
590
612
  socket.current.on("connect", async () => {
613
+ socket.current.wait_connect = false;
591
614
  setConnectErrors([]);
592
615
  window.addEventListener("pagehide", pagehideHandler);
593
616
  window.addEventListener("beforeunload", disconnectTrigger);
@@ -599,16 +622,33 @@ export const connect = async (
599
622
  });
600
623
 
601
624
  socket.current.on("connect_error", (error) => {
602
- setConnectErrors((connectErrors) => [connectErrors.slice(-9), error]);
625
+ socket.current.wait_connect = false;
626
+ let n_connect_errors = 0;
627
+ setConnectErrors((connectErrors) => {
628
+ const new_errors = [...connectErrors.slice(-9), error];
629
+ n_connect_errors = new_errors.length;
630
+ return new_errors;
631
+ });
632
+ window.setTimeout(() => {
633
+ if (socket.current && !socket.current.connected) {
634
+ socket.current.reconnect();
635
+ }
636
+ }, 200 * n_connect_errors); // Incremental backoff
603
637
  });
604
638
 
605
639
  // When the socket disconnects reset the event_processing flag
606
- socket.current.on("disconnect", () => {
607
- socket.current = null; // allow reconnect to occur automatically
640
+ socket.current.on("disconnect", (reason, details) => {
641
+ socket.current.wait_connect = false;
642
+ const try_reconnect =
643
+ reason !== "io server disconnect" && reason !== "io client disconnect";
608
644
  event_processing = false;
609
645
  window.removeEventListener("unload", disconnectTrigger);
610
646
  window.removeEventListener("beforeunload", disconnectTrigger);
611
647
  window.removeEventListener("pagehide", pagehideHandler);
648
+ if (try_reconnect) {
649
+ // Attempt to reconnect transient non-intentional disconnects.
650
+ socket.current.reconnect();
651
+ }
612
652
  });
613
653
 
614
654
  // On each received message, queue the updates and events.
@@ -785,6 +825,7 @@ export const useEventLoop = (
785
825
  const [searchParams] = useSearchParams();
786
826
  const [connectErrors, setConnectErrors] = useState([]);
787
827
  const params = useRef(paramsR);
828
+ const mounted = useRef(false);
788
829
 
789
830
  useEffect(() => {
790
831
  const { "*": splat, ...remainingParams } = paramsR;
@@ -796,11 +837,16 @@ export const useEventLoop = (
796
837
  }, [paramsR]);
797
838
 
798
839
  const ensureSocketConnected = useCallback(async () => {
840
+ if (!mounted.current) {
841
+ // During hot reload, some components may still have a reference to
842
+ // addEvents, so avoid reconnecting the socket of an unmounted event loop.
843
+ return;
844
+ }
799
845
  // only use websockets if state is present and backend is not disabled (reflex cloud).
800
846
  if (
801
847
  Object.keys(initialState).length > 1 &&
802
848
  !isBackendDisabled() &&
803
- !socket.current
849
+ !socket.current?.connected
804
850
  ) {
805
851
  // Initialize the websocket connection.
806
852
  await connect(
@@ -813,13 +859,23 @@ export const useEventLoop = (
813
859
  () => params.current,
814
860
  );
815
861
  }
816
- }, [socket, dispatch, setConnectErrors, client_storage, navigate, params]);
862
+ }, [
863
+ socket,
864
+ dispatch,
865
+ setConnectErrors,
866
+ client_storage,
867
+ navigate,
868
+ params,
869
+ mounted,
870
+ ]);
817
871
 
818
872
  // Function to add new events to the event queue.
819
873
  const addEvents = useCallback((events, args, event_actions) => {
820
874
  const _events = events.filter((e) => e !== undefined && e !== null);
821
-
822
- ensureSocketConnected();
875
+ if (!event_actions?.temporal) {
876
+ // Reconnect socket if needed for non-temporal events.
877
+ ensureSocketConnected();
878
+ }
823
879
 
824
880
  if (!(args instanceof Array)) {
825
881
  args = [args];
@@ -914,12 +970,16 @@ export const useEventLoop = (
914
970
  // Handle socket connect/disconnect.
915
971
  useEffect(() => {
916
972
  // Initialize the websocket connection.
973
+ mounted.current = true;
917
974
  ensureSocketConnected();
918
975
 
919
976
  // Cleanup function.
920
977
  return () => {
978
+ mounted.current = false;
921
979
  if (socket.current) {
922
980
  socket.current.disconnect();
981
+ socket.current.off();
982
+ socket.current = null;
923
983
  }
924
984
  };
925
985
  }, []);
@@ -84,13 +84,18 @@ In the example above, you will be able to do `rx.list`
84
84
 
85
85
  from __future__ import annotations
86
86
 
87
- from reflex.utils import (
88
- compat, # for side-effects
89
- lazy_loader,
90
- )
87
+ import sys
88
+
89
+ from reflex.utils import lazy_loader
90
+
91
+ if sys.version_info < (3, 11):
92
+ from reflex.utils import console
91
93
 
92
- # Remove the `compat` name from the namespace, it was imported for side-effects only.
93
- del compat
94
+ console.warn(
95
+ "Reflex support for Python 3.10 is deprecated and will be removed in a future release. Please upgrade to Python 3.11 or higher for continued support."
96
+ )
97
+ del console
98
+ del sys
94
99
 
95
100
  RADIX_THEMES_MAPPING: dict = {
96
101
  "components.radix.themes.base": ["color_mode", "theme", "theme_panel"],
@@ -3,7 +3,7 @@
3
3
  # This file was generated by `reflex/utils/pyi_generator.py`!
4
4
  # ------------------------------------------------------
5
5
 
6
- from reflex.utils import compat
6
+ import sys
7
7
 
8
8
  from . import (
9
9
  admin,
@@ -160,7 +160,14 @@ from .utils.misc import run_in_thread
160
160
  from .utils.serializers import serializer
161
161
  from .vars import Field, Var, field
162
162
 
163
- del compat
163
+ if sys.version_info < (3, 11):
164
+ from reflex.utils import console
165
+
166
+ console.warn(
167
+ "Reflex support for Python 3.10 is deprecated and will be removed in a future release. Please upgrade to Python 3.11 or higher for continued support."
168
+ )
169
+ del console
170
+ del sys
164
171
  RADIX_THEMES_MAPPING: dict
165
172
  RADIX_THEMES_COMPONENTS_MAPPING: dict
166
173
  RADIX_THEMES_LAYOUT_MAPPING: dict
@@ -1781,16 +1781,16 @@ async def process(
1781
1781
  name=f"reflex_emit_reload|{event.name}|{time.time()}|{event.token}",
1782
1782
  )
1783
1783
  return
1784
+ router_data[constants.RouteVar.PATH] = "/" + (
1785
+ app.router(path) or "404"
1786
+ if (path := router_data.get(constants.RouteVar.PATH))
1787
+ else "404"
1788
+ ).removeprefix("/")
1784
1789
  # re-assign only when the value is different
1785
1790
  if state.router_data != router_data:
1786
1791
  # assignment will recurse into substates and force recalculation of
1787
1792
  # dependent ComputedVar (dynamic route variables)
1788
1793
  state.router_data = router_data
1789
- router_data[constants.RouteVar.PATH] = "/" + (
1790
- app.router(path) or "404"
1791
- if (path := router_data.get(constants.RouteVar.PATH))
1792
- else "404"
1793
- ).removeprefix("/")
1794
1794
  state.router = RouterData.from_router_data(router_data)
1795
1795
 
1796
1796
  # Preprocess the event.
@@ -5,7 +5,9 @@ from importlib.util import find_spec
5
5
  if find_spec("pydantic") and find_spec("pydantic.v1"):
6
6
  from pydantic.v1 import BaseModel
7
7
 
8
- class Base(BaseModel):
8
+ from reflex.utils.compat import ModelMetaclassLazyAnnotations
9
+
10
+ class Base(BaseModel, metaclass=ModelMetaclassLazyAnnotations):
9
11
  """The base class subclassed by all Reflex classes.
10
12
 
11
13
  This class wraps Pydantic and provides common methods such as
@@ -22,22 +24,17 @@ if find_spec("pydantic") and find_spec("pydantic.v1"):
22
24
  use_enum_values = True
23
25
  extra = "allow"
24
26
 
25
- def __init__(self, *args, **kwargs):
26
- """Initialize the base class.
27
-
28
- Args:
29
- *args: Positional arguments.
30
- **kwargs: Keyword arguments.
31
- """
27
+ def __init_subclass__(cls):
28
+ """Warn that rx.Base is deprecated."""
32
29
  from reflex.utils import console
33
30
 
34
31
  console.deprecate(
35
32
  feature_name="rx.Base",
36
- reason="You can subclass from `pydantic.BaseModel` directly instead or use dataclasses if possible.",
37
- deprecation_version="0.8.2",
33
+ reason=f"{cls!r} is subclassing rx.Base. You can subclass from `pydantic.BaseModel` directly instead or use dataclasses if possible.",
34
+ deprecation_version="0.8.15",
38
35
  removal_version="0.9.0",
39
36
  )
40
- super().__init__(*args, **kwargs)
37
+ super().__init_subclass__()
41
38
 
42
39
  def json(self) -> str:
43
40
  """Convert the object to a json string.
@@ -7,6 +7,7 @@ from dataclasses import _MISSING_TYPE, MISSING
7
7
  from typing import Annotated, Any, Generic, TypeVar, get_origin
8
8
 
9
9
  from reflex.utils import types
10
+ from reflex.utils.compat import annotations_from_namespace
10
11
 
11
12
  FIELD_TYPE = TypeVar("FIELD_TYPE")
12
13
 
@@ -117,7 +118,8 @@ class FieldBasedMeta(type):
117
118
  cls, namespace: dict[str, Any], name: str
118
119
  ) -> dict[str, Any]:
119
120
  return types.resolve_annotations(
120
- namespace.get("__annotations__", {}), namespace["__module__"]
121
+ annotations_from_namespace(namespace),
122
+ namespace["__module__"],
121
123
  )
122
124
 
123
125
  @classmethod
@@ -38,6 +38,84 @@ _REHYPE_PLUGINS = LiteralVar.create([_REHYPE_KATEX, _REHYPE_RAW])
38
38
  NO_PROPS_TAGS = ("ul", "ol", "li")
39
39
 
40
40
 
41
+ def _h1(value: object):
42
+ from reflex.components.radix.themes.typography.heading import Heading
43
+
44
+ return Heading.create(value, as_="h1", size="6", margin_y="0.5em")
45
+
46
+
47
+ def _h2(value: object):
48
+ from reflex.components.radix.themes.typography.heading import Heading
49
+
50
+ return Heading.create(value, as_="h2", size="5", margin_y="0.5em")
51
+
52
+
53
+ def _h3(value: object):
54
+ from reflex.components.radix.themes.typography.heading import Heading
55
+
56
+ return Heading.create(value, as_="h3", size="4", margin_y="0.5em")
57
+
58
+
59
+ def _h4(value: object):
60
+ from reflex.components.radix.themes.typography.heading import Heading
61
+
62
+ return Heading.create(value, as_="h4", size="3", margin_y="0.5em")
63
+
64
+
65
+ def _h5(value: object):
66
+ from reflex.components.radix.themes.typography.heading import Heading
67
+
68
+ return Heading.create(value, as_="h5", size="2", margin_y="0.5em")
69
+
70
+
71
+ def _h6(value: object):
72
+ from reflex.components.radix.themes.typography.heading import Heading
73
+
74
+ return Heading.create(value, as_="h6", size="1", margin_y="0.5em")
75
+
76
+
77
+ def _p(value: object):
78
+ from reflex.components.radix.themes.typography.text import Text
79
+
80
+ return Text.create(value, margin_y="1em")
81
+
82
+
83
+ def _ul(value: object):
84
+ from reflex.components.radix.themes.layout.list import UnorderedList
85
+
86
+ return UnorderedList.create(value, margin_y="1em")
87
+
88
+
89
+ def _ol(value: object):
90
+ from reflex.components.radix.themes.layout.list import OrderedList
91
+
92
+ return OrderedList.create(value, margin_y="1em")
93
+
94
+
95
+ def _li(value: object):
96
+ from reflex.components.radix.themes.layout.list import ListItem
97
+
98
+ return ListItem.create(value, margin_y="0.5em")
99
+
100
+
101
+ def _a(value: object):
102
+ from reflex.components.radix.themes.typography.link import Link
103
+
104
+ return Link.create(value)
105
+
106
+
107
+ def _code(value: object):
108
+ from reflex.components.radix.themes.typography.code import Code
109
+
110
+ return Code.create(value)
111
+
112
+
113
+ def _codeblock(value: object, **props):
114
+ from reflex.components.datadisplay.code import CodeBlock
115
+
116
+ return CodeBlock.create(value, margin_y="1em", wrap_long_lines=True, **props)
117
+
118
+
41
119
  # Component Mapping
42
120
  @lru_cache
43
121
  def get_base_component_map() -> dict[str, Callable]:
@@ -46,33 +124,20 @@ def get_base_component_map() -> dict[str, Callable]:
46
124
  Returns:
47
125
  The base component map.
48
126
  """
49
- from reflex.components.datadisplay.code import CodeBlock
50
- from reflex.components.radix.themes.layout.list import (
51
- ListItem,
52
- OrderedList,
53
- UnorderedList,
54
- )
55
- from reflex.components.radix.themes.typography.code import Code
56
- from reflex.components.radix.themes.typography.heading import Heading
57
- from reflex.components.radix.themes.typography.link import Link
58
- from reflex.components.radix.themes.typography.text import Text
59
-
60
127
  return {
61
- "h1": lambda value: Heading.create(value, as_="h1", size="6", margin_y="0.5em"),
62
- "h2": lambda value: Heading.create(value, as_="h2", size="5", margin_y="0.5em"),
63
- "h3": lambda value: Heading.create(value, as_="h3", size="4", margin_y="0.5em"),
64
- "h4": lambda value: Heading.create(value, as_="h4", size="3", margin_y="0.5em"),
65
- "h5": lambda value: Heading.create(value, as_="h5", size="2", margin_y="0.5em"),
66
- "h6": lambda value: Heading.create(value, as_="h6", size="1", margin_y="0.5em"),
67
- "p": lambda value: Text.create(value, margin_y="1em"),
68
- "ul": lambda value: UnorderedList.create(value, margin_y="1em"),
69
- "ol": lambda value: OrderedList.create(value, margin_y="1em"),
70
- "li": lambda value: ListItem.create(value, margin_y="0.5em"),
71
- "a": lambda value: Link.create(value),
72
- "code": lambda value: Code.create(value),
73
- "codeblock": lambda value, **props: CodeBlock.create(
74
- value, margin_y="1em", wrap_long_lines=True, **props
75
- ),
128
+ "h1": _h1,
129
+ "h2": _h2,
130
+ "h3": _h3,
131
+ "h4": _h4,
132
+ "h5": _h5,
133
+ "h6": _h6,
134
+ "p": _p,
135
+ "ul": _ul,
136
+ "ol": _ol,
137
+ "li": _li,
138
+ "a": _a,
139
+ "code": _code,
140
+ "codeblock": _codeblock,
76
141
  }
77
142
 
78
143
 
@@ -413,7 +478,16 @@ let {_LANGUAGE!s} = match ? match[1] : '';
413
478
  @staticmethod
414
479
  def _component_map_hash(component_map: dict) -> str:
415
480
  inp = str(
416
- {tag: component(_MOCK_ARG) for tag, component in component_map.items()}
481
+ {
482
+ tag: (
483
+ f"{component.__module__}.{component.__qualname__}"
484
+ if (
485
+ "<" not in component.__name__
486
+ ) # simple way to check against lambdas
487
+ else component(_MOCK_ARG)
488
+ )
489
+ for tag, component in component_map.items()
490
+ }
417
491
  ).encode()
418
492
  return md5(inp).hexdigest()
419
493
 
@@ -134,6 +134,11 @@ class Templates(SimpleNamespace):
134
134
  # The reflex.build frontend host
135
135
  REFLEX_BUILD_FRONTEND = "https://build.reflex.dev"
136
136
 
137
+ # The reflex.build frontend with referrer
138
+ REFLEX_BUILD_FRONTEND_WITH_REFERRER = (
139
+ f"{REFLEX_BUILD_FRONTEND}/?utm_source=reflex_cli"
140
+ )
141
+
137
142
  class Dirs(SimpleNamespace):
138
143
  """Folders used by the template system of Reflex."""
139
144
 
@@ -143,11 +143,11 @@ class PackageJson(SimpleNamespace):
143
143
  "postcss-import": "16.1.1",
144
144
  "@react-router/dev": _react_router_version,
145
145
  "@react-router/fs-routes": _react_router_version,
146
- "vite": "npm:rolldown-vite@7.1.14",
146
+ "vite": "npm:rolldown-vite@7.1.16",
147
147
  }
148
148
  OVERRIDES = {
149
149
  # This should always match the `react` version in DEPENDENCIES for recharts compatibility.
150
150
  "react-is": _react_version,
151
151
  "cookie": "1.0.2",
152
- "vite": "npm:rolldown-vite@7.1.14",
152
+ "vite": "npm:rolldown-vite@7.1.16",
153
153
  }
@@ -1866,6 +1866,9 @@ def fix_events(
1866
1866
  # Fix the events created by the handler.
1867
1867
  out = []
1868
1868
  for e in events:
1869
+ if callable(e) and getattr(e, "__name__", "") == "<lambda>":
1870
+ # A lambda was returned, assume the user wants to call it with no args.
1871
+ e = e()
1869
1872
  if isinstance(e, Event):
1870
1873
  # If the event is already an event, append it to the list.
1871
1874
  out.append(e)
@@ -0,0 +1,120 @@
1
+ """State manager for managing client states."""
2
+
3
+ import contextlib
4
+ import dataclasses
5
+ from abc import ABC, abstractmethod
6
+ from collections.abc import AsyncIterator
7
+
8
+ from reflex import constants
9
+ from reflex.config import get_config
10
+ from reflex.state import BaseState
11
+ from reflex.utils import console, prerequisites
12
+ from reflex.utils.exceptions import InvalidStateManagerModeError
13
+
14
+
15
+ @dataclasses.dataclass
16
+ class StateManager(ABC):
17
+ """A class to manage many client states."""
18
+
19
+ # The state class to use.
20
+ state: type[BaseState]
21
+
22
+ @classmethod
23
+ def create(cls, state: type[BaseState]):
24
+ """Create a new state manager.
25
+
26
+ Args:
27
+ state: The state class to use.
28
+
29
+ Raises:
30
+ InvalidStateManagerModeError: If the state manager mode is invalid.
31
+
32
+ Returns:
33
+ The state manager (either disk, memory or redis).
34
+ """
35
+ config = get_config()
36
+ if prerequisites.parse_redis_url() is not None:
37
+ config.state_manager_mode = constants.StateManagerMode.REDIS
38
+ if config.state_manager_mode == constants.StateManagerMode.MEMORY:
39
+ from reflex.istate.manager.memory import StateManagerMemory
40
+
41
+ return StateManagerMemory(state=state)
42
+ if config.state_manager_mode == constants.StateManagerMode.DISK:
43
+ from reflex.istate.manager.disk import StateManagerDisk
44
+
45
+ return StateManagerDisk(state=state)
46
+ if config.state_manager_mode == constants.StateManagerMode.REDIS:
47
+ redis = prerequisites.get_redis()
48
+ if redis is not None:
49
+ from reflex.istate.manager.redis import StateManagerRedis
50
+
51
+ # make sure expiration values are obtained only from the config object on creation
52
+ return StateManagerRedis(
53
+ state=state,
54
+ redis=redis,
55
+ token_expiration=config.redis_token_expiration,
56
+ lock_expiration=config.redis_lock_expiration,
57
+ lock_warning_threshold=config.redis_lock_warning_threshold,
58
+ )
59
+ msg = f"Expected one of: DISK, MEMORY, REDIS, got {config.state_manager_mode}"
60
+ raise InvalidStateManagerModeError(msg)
61
+
62
+ @abstractmethod
63
+ async def get_state(self, token: str) -> BaseState:
64
+ """Get the state for a token.
65
+
66
+ Args:
67
+ token: The token to get the state for.
68
+
69
+ Returns:
70
+ The state for the token.
71
+ """
72
+
73
+ @abstractmethod
74
+ async def set_state(self, token: str, state: BaseState):
75
+ """Set the state for a token.
76
+
77
+ Args:
78
+ token: The token to set the state for.
79
+ state: The state to set.
80
+ """
81
+
82
+ @abstractmethod
83
+ @contextlib.asynccontextmanager
84
+ async def modify_state(self, token: str) -> AsyncIterator[BaseState]:
85
+ """Modify the state for a token while holding exclusive lock.
86
+
87
+ Args:
88
+ token: The token to modify the state for.
89
+
90
+ Yields:
91
+ The state for the token.
92
+ """
93
+ yield self.state()
94
+
95
+
96
+ def _default_token_expiration() -> int:
97
+ """Get the default token expiration time.
98
+
99
+ Returns:
100
+ The default token expiration time.
101
+ """
102
+ return get_config().redis_token_expiration
103
+
104
+
105
+ def reset_disk_state_manager():
106
+ """Reset the disk state manager."""
107
+ console.debug("Resetting disk state manager.")
108
+ states_directory = prerequisites.get_states_dir()
109
+ if states_directory.exists():
110
+ for path in states_directory.iterdir():
111
+ path.unlink()
112
+
113
+
114
+ def get_state_manager() -> StateManager:
115
+ """Get the state manager for the app that is currently running.
116
+
117
+ Returns:
118
+ The state manager.
119
+ """
120
+ return prerequisites.get_and_validate_app().app.state_manager