reflex 0.6.8a1__py3-none-any.whl → 0.7.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of reflex might be problematic. Click here for more details.

Files changed (248) hide show
  1. reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +1 -1
  2. reflex/.templates/jinja/web/pages/_app.js.jinja2 +7 -7
  3. reflex/.templates/jinja/web/pages/utils.js.jinja2 +3 -3
  4. reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +1 -4
  5. reflex/.templates/web/utils/state.js +65 -36
  6. reflex/__init__.py +4 -17
  7. reflex/__init__.pyi +1 -2
  8. reflex/app.py +286 -135
  9. reflex/app_mixins/lifespan.py +9 -9
  10. reflex/app_mixins/middleware.py +6 -6
  11. reflex/app_module_for_backend.py +3 -7
  12. reflex/base.py +7 -7
  13. reflex/compiler/compiler.py +8 -0
  14. reflex/compiler/utils.py +57 -18
  15. reflex/components/base/app_wrap.pyi +16 -16
  16. reflex/components/base/bare.py +1 -1
  17. reflex/components/base/body.pyi +16 -16
  18. reflex/components/base/document.pyi +76 -76
  19. reflex/components/base/error_boundary.py +2 -1
  20. reflex/components/base/error_boundary.pyi +19 -22
  21. reflex/components/base/fragment.pyi +16 -16
  22. reflex/components/base/head.pyi +31 -31
  23. reflex/components/base/link.pyi +31 -31
  24. reflex/components/base/meta.py +2 -2
  25. reflex/components/base/meta.pyi +61 -61
  26. reflex/components/base/script.pyi +19 -19
  27. reflex/components/base/strict_mode.py +10 -0
  28. reflex/components/base/strict_mode.pyi +57 -0
  29. reflex/components/component.py +38 -77
  30. reflex/components/core/banner.py +159 -4
  31. reflex/components/core/banner.pyi +162 -76
  32. reflex/components/core/breakpoints.py +3 -1
  33. reflex/components/core/client_side_routing.py +1 -1
  34. reflex/components/core/client_side_routing.pyi +32 -32
  35. reflex/components/core/clipboard.pyi +17 -20
  36. reflex/components/core/cond.py +9 -10
  37. reflex/components/core/debounce.py +1 -1
  38. reflex/components/core/debounce.pyi +17 -17
  39. reflex/components/core/foreach.py +28 -3
  40. reflex/components/core/html.py +1 -1
  41. reflex/components/core/html.pyi +16 -16
  42. reflex/components/core/match.py +5 -5
  43. reflex/components/core/sticky.py +134 -0
  44. reflex/components/core/sticky.pyi +449 -0
  45. reflex/components/core/upload.py +2 -2
  46. reflex/components/core/upload.pyi +80 -88
  47. reflex/components/datadisplay/code.py +5 -14
  48. reflex/components/datadisplay/code.pyi +31 -31
  49. reflex/components/datadisplay/dataeditor.py +7 -4
  50. reflex/components/datadisplay/dataeditor.pyi +40 -54
  51. reflex/components/datadisplay/logo.py +13 -8
  52. reflex/components/datadisplay/shiki_code_block.py +14 -9
  53. reflex/components/datadisplay/shiki_code_block.pyi +46 -46
  54. reflex/components/dynamic.py +22 -3
  55. reflex/components/el/constants/reflex.py +1 -1
  56. reflex/components/el/element.py +1 -1
  57. reflex/components/el/element.pyi +16 -16
  58. reflex/components/el/elements/base.pyi +16 -16
  59. reflex/components/el/elements/forms.py +4 -4
  60. reflex/components/el/elements/forms.pyi +224 -258
  61. reflex/components/el/elements/inline.pyi +421 -421
  62. reflex/components/el/elements/media.pyi +376 -376
  63. reflex/components/el/elements/metadata.pyi +91 -91
  64. reflex/components/el/elements/other.pyi +106 -106
  65. reflex/components/el/elements/scripts.pyi +46 -46
  66. reflex/components/el/elements/sectioning.pyi +226 -226
  67. reflex/components/el/elements/tables.pyi +151 -151
  68. reflex/components/el/elements/typography.pyi +226 -226
  69. reflex/components/gridjs/datatable.pyi +31 -31
  70. reflex/components/lucide/icon.py +46 -8
  71. reflex/components/lucide/icon.pyi +85 -31
  72. reflex/components/markdown/markdown.py +10 -8
  73. reflex/components/markdown/markdown.pyi +16 -16
  74. reflex/components/moment/moment.py +2 -2
  75. reflex/components/moment/moment.pyi +17 -19
  76. reflex/components/next/base.pyi +16 -16
  77. reflex/components/next/image.py +16 -4
  78. reflex/components/next/image.pyi +22 -20
  79. reflex/components/next/link.py +1 -1
  80. reflex/components/next/link.pyi +16 -16
  81. reflex/components/next/video.pyi +16 -16
  82. reflex/components/plotly/__init__.py +29 -2
  83. reflex/components/plotly/plotly.py +240 -5
  84. reflex/components/plotly/plotly.pyi +799 -44
  85. reflex/components/props.py +3 -3
  86. reflex/components/radix/__init__.pyi +1 -1
  87. reflex/components/radix/primitives/accordion.py +9 -5
  88. reflex/components/radix/primitives/accordion.pyi +110 -108
  89. reflex/components/radix/primitives/base.pyi +31 -31
  90. reflex/components/radix/primitives/drawer.py +5 -2
  91. reflex/components/radix/primitives/drawer.pyi +179 -187
  92. reflex/components/radix/primitives/form.pyi +160 -172
  93. reflex/components/radix/primitives/progress.py +1 -1
  94. reflex/components/radix/primitives/progress.pyi +76 -76
  95. reflex/components/radix/primitives/slider.py +1 -1
  96. reflex/components/radix/primitives/slider.pyi +78 -82
  97. reflex/components/radix/themes/base.pyi +121 -121
  98. reflex/components/radix/themes/color_mode.py +11 -9
  99. reflex/components/radix/themes/color_mode.pyi +47 -49
  100. reflex/components/radix/themes/components/alert_dialog.py +3 -0
  101. reflex/components/radix/themes/components/alert_dialog.pyi +110 -112
  102. reflex/components/radix/themes/components/aspect_ratio.pyi +16 -16
  103. reflex/components/radix/themes/components/avatar.pyi +16 -16
  104. reflex/components/radix/themes/components/badge.pyi +16 -16
  105. reflex/components/radix/themes/components/button.pyi +16 -16
  106. reflex/components/radix/themes/components/callout.pyi +76 -76
  107. reflex/components/radix/themes/components/card.py +1 -1
  108. reflex/components/radix/themes/components/card.pyi +17 -17
  109. reflex/components/radix/themes/components/checkbox.pyi +49 -55
  110. reflex/components/radix/themes/components/checkbox_cards.pyi +31 -31
  111. reflex/components/radix/themes/components/checkbox_group.pyi +31 -31
  112. reflex/components/radix/themes/components/context_menu.py +5 -0
  113. reflex/components/radix/themes/components/context_menu.pyi +149 -155
  114. reflex/components/radix/themes/components/data_list.pyi +61 -61
  115. reflex/components/radix/themes/components/dialog.py +3 -0
  116. reflex/components/radix/themes/components/dialog.pyi +113 -117
  117. reflex/components/radix/themes/components/dropdown_menu.py +5 -0
  118. reflex/components/radix/themes/components/dropdown_menu.pyi +133 -137
  119. reflex/components/radix/themes/components/hover_card.py +3 -0
  120. reflex/components/radix/themes/components/hover_card.pyi +63 -67
  121. reflex/components/radix/themes/components/icon_button.py +2 -2
  122. reflex/components/radix/themes/components/icon_button.pyi +17 -16
  123. reflex/components/radix/themes/components/inset.pyi +16 -16
  124. reflex/components/radix/themes/components/popover.py +3 -0
  125. reflex/components/radix/themes/components/popover.pyi +68 -70
  126. reflex/components/radix/themes/components/progress.pyi +16 -16
  127. reflex/components/radix/themes/components/radio.pyi +16 -16
  128. reflex/components/radix/themes/components/radio_cards.py +2 -0
  129. reflex/components/radix/themes/components/radio_cards.pyi +32 -34
  130. reflex/components/radix/themes/components/radio_group.py +1 -1
  131. reflex/components/radix/themes/components/radio_group.pyi +62 -64
  132. reflex/components/radix/themes/components/scroll_area.pyi +16 -16
  133. reflex/components/radix/themes/components/segmented_control.pyi +32 -35
  134. reflex/components/radix/themes/components/select.py +4 -0
  135. reflex/components/radix/themes/components/select.pyi +145 -157
  136. reflex/components/radix/themes/components/separator.pyi +16 -16
  137. reflex/components/radix/themes/components/skeleton.py +3 -0
  138. reflex/components/radix/themes/components/skeleton.pyi +16 -16
  139. reflex/components/radix/themes/components/slider.pyi +22 -28
  140. reflex/components/radix/themes/components/spinner.pyi +16 -16
  141. reflex/components/radix/themes/components/switch.pyi +17 -19
  142. reflex/components/radix/themes/components/table.pyi +106 -106
  143. reflex/components/radix/themes/components/tabs.py +3 -0
  144. reflex/components/radix/themes/components/tabs.pyi +78 -82
  145. reflex/components/radix/themes/components/text_area.py +12 -0
  146. reflex/components/radix/themes/components/text_area.pyi +21 -33
  147. reflex/components/radix/themes/components/text_field.py +1 -1
  148. reflex/components/radix/themes/components/text_field.pyi +52 -80
  149. reflex/components/radix/themes/components/tooltip.py +6 -1
  150. reflex/components/radix/themes/components/tooltip.pyi +20 -21
  151. reflex/components/radix/themes/layout/__init__.pyi +1 -1
  152. reflex/components/radix/themes/layout/base.pyi +16 -16
  153. reflex/components/radix/themes/layout/box.pyi +16 -16
  154. reflex/components/radix/themes/layout/center.pyi +16 -16
  155. reflex/components/radix/themes/layout/container.pyi +16 -16
  156. reflex/components/radix/themes/layout/flex.pyi +16 -16
  157. reflex/components/radix/themes/layout/grid.pyi +16 -16
  158. reflex/components/radix/themes/layout/list.py +2 -2
  159. reflex/components/radix/themes/layout/list.pyi +76 -76
  160. reflex/components/radix/themes/layout/section.pyi +16 -16
  161. reflex/components/radix/themes/layout/spacer.pyi +16 -16
  162. reflex/components/radix/themes/layout/stack.py +2 -2
  163. reflex/components/radix/themes/layout/stack.pyi +46 -46
  164. reflex/components/radix/themes/typography/blockquote.pyi +16 -16
  165. reflex/components/radix/themes/typography/code.pyi +16 -16
  166. reflex/components/radix/themes/typography/heading.pyi +16 -16
  167. reflex/components/radix/themes/typography/link.py +1 -1
  168. reflex/components/radix/themes/typography/link.pyi +16 -16
  169. reflex/components/radix/themes/typography/text.py +2 -2
  170. reflex/components/radix/themes/typography/text.pyi +106 -106
  171. reflex/components/react_player/audio.pyi +33 -39
  172. reflex/components/react_player/react_player.py +1 -1
  173. reflex/components/react_player/react_player.pyi +32 -38
  174. reflex/components/react_player/video.pyi +33 -39
  175. reflex/components/recharts/__init__.py +2 -0
  176. reflex/components/recharts/__init__.pyi +2 -0
  177. reflex/components/recharts/cartesian.pyi +282 -282
  178. reflex/components/recharts/charts.py +15 -15
  179. reflex/components/recharts/charts.pyi +164 -164
  180. reflex/components/recharts/general.py +19 -4
  181. reflex/components/recharts/general.pyi +132 -81
  182. reflex/components/recharts/polar.py +2 -2
  183. reflex/components/recharts/polar.pyi +55 -55
  184. reflex/components/recharts/recharts.py +4 -4
  185. reflex/components/recharts/recharts.pyi +31 -31
  186. reflex/components/sonner/toast.py +15 -13
  187. reflex/components/sonner/toast.pyi +22 -22
  188. reflex/components/suneditor/editor.py +6 -4
  189. reflex/components/suneditor/editor.pyi +26 -40
  190. reflex/components/tags/iter_tag.py +3 -3
  191. reflex/components/tags/tag.py +25 -3
  192. reflex/config.py +48 -20
  193. reflex/constants/__init__.py +1 -0
  194. reflex/constants/base.py +4 -1
  195. reflex/constants/compiler.py +5 -2
  196. reflex/constants/config.py +8 -1
  197. reflex/constants/installer.py +9 -9
  198. reflex/constants/style.py +1 -1
  199. reflex/custom_components/custom_components.py +18 -10
  200. reflex/event.py +228 -233
  201. reflex/experimental/__init__.py +19 -11
  202. reflex/experimental/client_state.py +53 -28
  203. reflex/experimental/hooks.py +5 -5
  204. reflex/experimental/layout.py +8 -5
  205. reflex/experimental/layout.pyi +79 -83
  206. reflex/experimental/misc.py +3 -3
  207. reflex/istate/wrappers.py +1 -1
  208. reflex/middleware/hydrate_middleware.py +2 -2
  209. reflex/model.py +11 -6
  210. reflex/page.py +5 -5
  211. reflex/reflex.py +104 -26
  212. reflex/route.py +1 -1
  213. reflex/state.py +358 -401
  214. reflex/style.py +27 -3
  215. reflex/testing.py +34 -39
  216. reflex/utils/build.py +6 -2
  217. reflex/utils/codespaces.py +1 -4
  218. reflex/utils/compat.py +6 -5
  219. reflex/utils/console.py +71 -21
  220. reflex/utils/exceptions.py +89 -26
  221. reflex/utils/exec.py +69 -74
  222. reflex/utils/export.py +6 -1
  223. reflex/utils/format.py +8 -40
  224. reflex/utils/imports.py +5 -2
  225. reflex/utils/lazy_loader.py +7 -1
  226. reflex/utils/path_ops.py +74 -14
  227. reflex/utils/prerequisites.py +345 -68
  228. reflex/utils/processes.py +45 -32
  229. reflex/utils/pyi_generator.py +39 -33
  230. reflex/utils/registry.py +4 -4
  231. reflex/utils/serializers.py +1 -1
  232. reflex/utils/telemetry.py +5 -4
  233. reflex/utils/types.py +42 -18
  234. reflex/vars/base.py +695 -330
  235. reflex/vars/datetime.py +6 -7
  236. reflex/vars/dep_tracking.py +344 -0
  237. reflex/vars/function.py +11 -5
  238. reflex/vars/number.py +31 -43
  239. reflex/vars/object.py +74 -64
  240. reflex/vars/sequence.py +79 -67
  241. {reflex-0.6.8a1.dist-info → reflex-0.7.0.dist-info}/METADATA +7 -10
  242. reflex-0.7.0.dist-info/RECORD +401 -0
  243. {reflex-0.6.8a1.dist-info → reflex-0.7.0.dist-info}/WHEEL +1 -1
  244. reflex/experimental/assets.py +0 -37
  245. reflex/proxy.py +0 -119
  246. reflex-0.6.8a1.dist-info/RECORD +0 -398
  247. {reflex-0.6.8a1.dist-info → reflex-0.7.0.dist-info}/LICENSE +0 -0
  248. {reflex-0.6.8a1.dist-info → reflex-0.7.0.dist-info}/entry_points.txt +0 -0
reflex/reflex.py CHANGED
@@ -17,7 +17,7 @@ from reflex.state import reset_disk_state_manager
17
17
  from reflex.utils import console, telemetry
18
18
 
19
19
  # Disable typer+rich integration for help panels
20
- typer.core.rich = None # type: ignore
20
+ typer.core.rich = None # pyright: ignore [reportPrivateImportUsage]
21
21
 
22
22
  # Create the app.
23
23
  try:
@@ -26,6 +26,8 @@ except TypeError:
26
26
  # Fallback for older typer versions.
27
27
  cli = typer.Typer(add_completion=False)
28
28
 
29
+ SHOW_BUILT_WITH_REFLEX_INFO = "https://reflex.dev/docs/hosting/reflex-branding/"
30
+
29
31
  # Get the config.
30
32
  config = get_config()
31
33
 
@@ -125,8 +127,8 @@ def _run(
125
127
  env: constants.Env = constants.Env.DEV,
126
128
  frontend: bool = True,
127
129
  backend: bool = True,
128
- frontend_port: str = str(config.frontend_port),
129
- backend_port: str = str(config.backend_port),
130
+ frontend_port: int = config.frontend_port,
131
+ backend_port: int = config.backend_port,
130
132
  backend_host: str = config.backend_host,
131
133
  loglevel: constants.LogLevel = config.loglevel,
132
134
  ):
@@ -143,10 +145,7 @@ def _run(
143
145
  exec.output_system_info()
144
146
 
145
147
  # If no --frontend-only and no --backend-only, then turn on frontend and backend both
146
- if not frontend and not backend:
147
- frontend = True
148
- backend = True
149
-
148
+ frontend, backend = prerequisites.check_running_mode(frontend, backend)
150
149
  if not frontend and backend:
151
150
  _skip_compile()
152
151
 
@@ -160,18 +159,22 @@ def _run(
160
159
  # Find the next available open port if applicable.
161
160
  if frontend:
162
161
  frontend_port = processes.handle_port(
163
- "frontend", frontend_port, str(constants.DefaultPorts.FRONTEND_PORT)
162
+ "frontend",
163
+ frontend_port,
164
+ constants.DefaultPorts.FRONTEND_PORT,
164
165
  )
165
166
 
166
167
  if backend:
167
168
  backend_port = processes.handle_port(
168
- "backend", backend_port, str(constants.DefaultPorts.BACKEND_PORT)
169
+ "backend",
170
+ backend_port,
171
+ constants.DefaultPorts.BACKEND_PORT,
169
172
  )
170
173
 
171
174
  # Apply the new ports to the config.
172
- if frontend_port != str(config.frontend_port):
175
+ if frontend_port != config.frontend_port:
173
176
  config._set_persistent(frontend_port=frontend_port)
174
- if backend_port != str(config.backend_port):
177
+ if backend_port != config.backend_port:
175
178
  config._set_persistent(backend_port=backend_port)
176
179
 
177
180
  # Reload the config to make sure the env vars are persistent.
@@ -182,6 +185,15 @@ def _run(
182
185
  prerequisites.check_latest_package_version(constants.Reflex.MODULE_NAME)
183
186
 
184
187
  if frontend:
188
+ if not config.show_built_with_reflex:
189
+ # The sticky badge may be disabled at runtime for team/enterprise tiers.
190
+ prerequisites.check_config_option_in_tier(
191
+ option_name="show_built_with_reflex",
192
+ allowed_tiers=["team", "enterprise"],
193
+ fallback_value=True,
194
+ help_link=SHOW_BUILT_WITH_REFLEX_INFO,
195
+ )
196
+
185
197
  # Get the app module.
186
198
  prerequisites.get_compiled_app()
187
199
 
@@ -262,10 +274,10 @@ def run(
262
274
  help="Execute only backend.",
263
275
  envvar=environment.REFLEX_BACKEND_ONLY.name,
264
276
  ),
265
- frontend_port: str = typer.Option(
277
+ frontend_port: int = typer.Option(
266
278
  config.frontend_port, help="Specify a different frontend port."
267
279
  ),
268
- backend_port: str = typer.Option(
280
+ backend_port: int = typer.Option(
269
281
  config.backend_port, help="Specify a different backend port."
270
282
  ),
271
283
  backend_host: str = typer.Option(
@@ -291,10 +303,18 @@ def export(
291
303
  True, "--no-zip", help="Disable zip for backend and frontend exports."
292
304
  ),
293
305
  frontend: bool = typer.Option(
294
- True, "--backend-only", help="Export only backend.", show_default=False
306
+ False,
307
+ "--frontend-only",
308
+ help="Export only frontend.",
309
+ show_default=False,
310
+ envvar=environment.REFLEX_FRONTEND_ONLY.name,
295
311
  ),
296
312
  backend: bool = typer.Option(
297
- True, "--frontend-only", help="Export only frontend.", show_default=False
313
+ False,
314
+ "--backend-only",
315
+ help="Export only backend.",
316
+ show_default=False,
317
+ envvar=environment.REFLEX_BACKEND_ONLY.name,
298
318
  ),
299
319
  zip_dest_dir: str = typer.Option(
300
320
  str(Path.cwd()),
@@ -306,6 +326,9 @@ def export(
306
326
  help="Whether to exclude sqlite db files when exporting backend.",
307
327
  hidden=True,
308
328
  ),
329
+ env: constants.Env = typer.Option(
330
+ constants.Env.PROD, help="The environment to export the app in."
331
+ ),
309
332
  loglevel: constants.LogLevel = typer.Option(
310
333
  config.loglevel, help="The log level to use."
311
334
  ),
@@ -314,15 +337,27 @@ def export(
314
337
  from reflex.utils import export as export_utils
315
338
  from reflex.utils import prerequisites
316
339
 
317
- if prerequisites.needs_reinit(frontend=True):
340
+ frontend, backend = prerequisites.check_running_mode(frontend, backend)
341
+
342
+ if prerequisites.needs_reinit(frontend=frontend or not backend):
318
343
  _init(name=config.app_name, loglevel=loglevel)
319
344
 
345
+ if frontend and not config.show_built_with_reflex:
346
+ # The sticky badge may be disabled on export for team/enterprise tiers.
347
+ prerequisites.check_config_option_in_tier(
348
+ option_name="show_built_with_reflex",
349
+ allowed_tiers=["team", "enterprise"],
350
+ fallback_value=False,
351
+ help_link=SHOW_BUILT_WITH_REFLEX_INFO,
352
+ )
353
+
320
354
  export_utils.export(
321
355
  zipping=zipping,
322
356
  frontend=frontend,
323
357
  backend=backend,
324
358
  zip_dest_dir=zip_dest_dir,
325
359
  upload_db_file=upload_db_file,
360
+ env=env,
326
361
  loglevel=loglevel.subprocess_level(),
327
362
  )
328
363
 
@@ -351,7 +386,7 @@ def logout(
351
386
 
352
387
  check_version()
353
388
 
354
- logout(loglevel) # type: ignore
389
+ logout(loglevel) # pyright: ignore [reportArgumentType]
355
390
 
356
391
 
357
392
  db_cli = typer.Typer()
@@ -440,7 +475,11 @@ def deploy(
440
475
  config.app_name,
441
476
  "--app-name",
442
477
  help="The name of the App to deploy under.",
443
- hidden=True,
478
+ ),
479
+ app_id: str = typer.Option(
480
+ None,
481
+ "--app-id",
482
+ help="The ID of the App to deploy over.",
444
483
  ),
445
484
  regions: List[str] = typer.Option(
446
485
  [],
@@ -480,6 +519,11 @@ def deploy(
480
519
  "--project",
481
520
  help="project id to deploy to",
482
521
  ),
522
+ project_name: Optional[str] = typer.Option(
523
+ None,
524
+ "--project-name",
525
+ help="The name of the project to deploy to.",
526
+ ),
483
527
  token: Optional[str] = typer.Option(
484
528
  None,
485
529
  "--token",
@@ -492,6 +536,7 @@ def deploy(
492
536
  ),
493
537
  ):
494
538
  """Deploy the app to the Reflex hosting service."""
539
+ from reflex_cli.constants.base import LogLevel as HostingLogLevel
495
540
  from reflex_cli.utils import dependency
496
541
  from reflex_cli.v2 import cli as hosting_cli
497
542
 
@@ -500,15 +545,32 @@ def deploy(
500
545
 
501
546
  check_version()
502
547
 
548
+ if not config.show_built_with_reflex:
549
+ # The sticky badge may be disabled on deploy for pro/team/enterprise tiers.
550
+ prerequisites.check_config_option_in_tier(
551
+ option_name="show_built_with_reflex",
552
+ allowed_tiers=["pro", "team", "enterprise"],
553
+ fallback_value=True,
554
+ help_link=SHOW_BUILT_WITH_REFLEX_INFO,
555
+ )
556
+
503
557
  # Set the log level.
504
558
  console.set_log_level(loglevel)
505
559
 
506
- if not token:
507
- # make sure user is logged in.
508
- if interactive:
509
- hosting_cli.login()
510
- else:
511
- raise SystemExit("Token is required for non-interactive mode.")
560
+ def convert_reflex_loglevel_to_reflex_cli_loglevel(
561
+ loglevel: constants.LogLevel,
562
+ ) -> HostingLogLevel:
563
+ if loglevel == constants.LogLevel.DEBUG:
564
+ return HostingLogLevel.DEBUG
565
+ if loglevel == constants.LogLevel.INFO:
566
+ return HostingLogLevel.INFO
567
+ if loglevel == constants.LogLevel.WARNING:
568
+ return HostingLogLevel.WARNING
569
+ if loglevel == constants.LogLevel.ERROR:
570
+ return HostingLogLevel.ERROR
571
+ if loglevel == constants.LogLevel.CRITICAL:
572
+ return HostingLogLevel.CRITICAL
573
+ return HostingLogLevel.INFO
512
574
 
513
575
  # Only check requirements if interactive.
514
576
  # There is user interaction for requirements update.
@@ -522,6 +584,7 @@ def deploy(
522
584
 
523
585
  hosting_cli.deploy(
524
586
  app_name=app_name,
587
+ app_id=app_id,
525
588
  export_fn=lambda zip_dest_dir,
526
589
  api_url,
527
590
  deploy_url,
@@ -542,13 +605,28 @@ def deploy(
542
605
  envfile=envfile,
543
606
  hostname=hostname,
544
607
  interactive=interactive,
545
- loglevel=type(loglevel).INFO, # type: ignore
608
+ loglevel=convert_reflex_loglevel_to_reflex_cli_loglevel(loglevel),
546
609
  token=token,
547
610
  project=project,
548
- config_path=config_path,
611
+ project_name=project_name,
612
+ **({"config_path": config_path} if config_path is not None else {}),
549
613
  )
550
614
 
551
615
 
616
+ @cli.command()
617
+ def rename(
618
+ new_name: str = typer.Argument(..., help="The new name for the app."),
619
+ loglevel: constants.LogLevel = typer.Option(
620
+ config.loglevel, help="The log level to use."
621
+ ),
622
+ ):
623
+ """Rename the app in the current directory."""
624
+ from reflex.utils import prerequisites
625
+
626
+ prerequisites.validate_app_name(new_name)
627
+ prerequisites.rename_app(new_name, loglevel)
628
+
629
+
552
630
  cli.add_typer(db_cli, name="db", help="Subcommands for managing the database schema.")
553
631
  cli.add_typer(script_cli, name="script", help="Subcommands running helper scripts.")
554
632
  cli.add_typer(
reflex/route.py CHANGED
@@ -103,7 +103,7 @@ def catchall_prefix(route: str) -> str:
103
103
  return route.replace(pattern, "") if pattern else ""
104
104
 
105
105
 
106
- def replace_brackets_with_keywords(input_string):
106
+ def replace_brackets_with_keywords(input_string: str) -> str:
107
107
  """Replace brackets and everything inside it in a string with a keyword.
108
108
 
109
109
  Args: