reflex 0.6.8a1__py3-none-any.whl → 0.7.0a1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of reflex might be problematic. Click here for more details.
- reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +1 -1
- reflex/.templates/jinja/web/pages/_app.js.jinja2 +7 -7
- reflex/.templates/jinja/web/pages/utils.js.jinja2 +2 -2
- reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +1 -4
- reflex/.templates/web/utils/state.js +65 -36
- reflex/__init__.py +4 -17
- reflex/__init__.pyi +1 -2
- reflex/app.py +244 -115
- reflex/app_mixins/lifespan.py +9 -9
- reflex/app_mixins/middleware.py +6 -6
- reflex/app_module_for_backend.py +3 -7
- reflex/base.py +7 -7
- reflex/compiler/compiler.py +8 -0
- reflex/compiler/utils.py +35 -6
- reflex/components/base/bare.py +1 -1
- reflex/components/base/error_boundary.py +2 -1
- reflex/components/base/error_boundary.pyi +2 -1
- reflex/components/base/meta.py +2 -2
- reflex/components/base/strict_mode.py +10 -0
- reflex/components/base/strict_mode.pyi +57 -0
- reflex/components/component.py +38 -77
- reflex/components/core/banner.py +83 -4
- reflex/components/core/banner.pyi +86 -0
- reflex/components/core/breakpoints.py +3 -1
- reflex/components/core/client_side_routing.py +1 -1
- reflex/components/core/client_side_routing.pyi +1 -1
- reflex/components/core/cond.py +9 -10
- reflex/components/core/debounce.py +1 -1
- reflex/components/core/foreach.py +23 -3
- reflex/components/core/html.py +1 -1
- reflex/components/core/match.py +5 -5
- reflex/components/core/sticky.py +160 -0
- reflex/components/core/sticky.pyi +449 -0
- reflex/components/core/upload.py +2 -2
- reflex/components/datadisplay/code.py +5 -14
- reflex/components/datadisplay/dataeditor.py +7 -4
- reflex/components/datadisplay/logo.py +13 -8
- reflex/components/datadisplay/shiki_code_block.py +14 -9
- reflex/components/dynamic.py +22 -3
- reflex/components/el/constants/reflex.py +1 -1
- reflex/components/el/element.py +1 -1
- reflex/components/el/elements/forms.py +4 -4
- reflex/components/el/elements/forms.pyi +4 -4
- reflex/components/lucide/icon.py +46 -8
- reflex/components/lucide/icon.pyi +54 -0
- reflex/components/markdown/markdown.py +10 -8
- reflex/components/moment/moment.py +2 -2
- reflex/components/next/image.py +16 -4
- reflex/components/next/image.pyi +4 -2
- reflex/components/next/link.py +1 -1
- reflex/components/plotly/plotly.py +5 -5
- reflex/components/props.py +3 -3
- reflex/components/radix/__init__.pyi +1 -1
- reflex/components/radix/primitives/accordion.py +9 -5
- reflex/components/radix/primitives/accordion.pyi +3 -1
- reflex/components/radix/primitives/drawer.py +5 -2
- reflex/components/radix/primitives/drawer.pyi +4 -4
- reflex/components/radix/primitives/form.pyi +6 -6
- reflex/components/radix/primitives/progress.py +1 -1
- reflex/components/radix/primitives/slider.py +1 -1
- reflex/components/radix/themes/color_mode.py +11 -9
- reflex/components/radix/themes/components/alert_dialog.py +3 -0
- reflex/components/radix/themes/components/card.py +1 -1
- reflex/components/radix/themes/components/card.pyi +1 -1
- reflex/components/radix/themes/components/context_menu.py +5 -0
- reflex/components/radix/themes/components/dialog.py +3 -0
- reflex/components/radix/themes/components/dropdown_menu.py +5 -0
- reflex/components/radix/themes/components/hover_card.py +3 -0
- reflex/components/radix/themes/components/icon_button.py +2 -2
- reflex/components/radix/themes/components/icon_button.pyi +1 -0
- reflex/components/radix/themes/components/popover.py +3 -0
- reflex/components/radix/themes/components/radio_cards.py +2 -0
- reflex/components/radix/themes/components/radio_group.py +1 -1
- reflex/components/radix/themes/components/select.py +3 -0
- reflex/components/radix/themes/components/tabs.py +3 -0
- reflex/components/radix/themes/components/text_area.py +12 -0
- reflex/components/radix/themes/components/text_area.pyi +2 -0
- reflex/components/radix/themes/components/text_field.py +1 -1
- reflex/components/radix/themes/components/tooltip.py +3 -1
- reflex/components/radix/themes/components/tooltip.pyi +1 -0
- reflex/components/radix/themes/layout/__init__.pyi +1 -1
- reflex/components/radix/themes/layout/list.py +2 -2
- reflex/components/radix/themes/layout/stack.py +2 -2
- reflex/components/radix/themes/typography/link.py +1 -1
- reflex/components/radix/themes/typography/text.py +2 -2
- reflex/components/react_player/react_player.py +1 -1
- reflex/components/recharts/__init__.py +2 -0
- reflex/components/recharts/__init__.pyi +2 -0
- reflex/components/recharts/charts.py +15 -15
- reflex/components/recharts/general.py +19 -4
- reflex/components/recharts/general.pyi +55 -4
- reflex/components/recharts/polar.py +2 -2
- reflex/components/recharts/recharts.py +4 -4
- reflex/components/sonner/toast.py +15 -13
- reflex/components/sonner/toast.pyi +6 -6
- reflex/components/suneditor/editor.py +6 -4
- reflex/components/suneditor/editor.pyi +2 -2
- reflex/components/tags/iter_tag.py +3 -3
- reflex/components/tags/tag.py +25 -3
- reflex/config.py +48 -20
- reflex/constants/__init__.py +1 -0
- reflex/constants/base.py +4 -1
- reflex/constants/compiler.py +5 -2
- reflex/constants/config.py +8 -1
- reflex/constants/installer.py +9 -9
- reflex/constants/style.py +1 -1
- reflex/custom_components/custom_components.py +9 -7
- reflex/event.py +137 -163
- reflex/experimental/__init__.py +19 -11
- reflex/experimental/client_state.py +53 -28
- reflex/experimental/hooks.py +5 -5
- reflex/experimental/layout.py +8 -5
- reflex/experimental/layout.pyi +1 -1
- reflex/experimental/misc.py +3 -3
- reflex/istate/wrappers.py +1 -1
- reflex/middleware/hydrate_middleware.py +2 -2
- reflex/model.py +11 -6
- reflex/page.py +3 -3
- reflex/reflex.py +90 -19
- reflex/route.py +1 -1
- reflex/state.py +358 -401
- reflex/style.py +27 -3
- reflex/testing.py +34 -39
- reflex/utils/build.py +6 -2
- reflex/utils/codespaces.py +1 -4
- reflex/utils/compat.py +6 -5
- reflex/utils/console.py +52 -21
- reflex/utils/exceptions.py +76 -26
- reflex/utils/exec.py +69 -74
- reflex/utils/export.py +6 -1
- reflex/utils/format.py +7 -39
- reflex/utils/imports.py +2 -2
- reflex/utils/lazy_loader.py +7 -1
- reflex/utils/path_ops.py +28 -14
- reflex/utils/prerequisites.py +324 -65
- reflex/utils/processes.py +45 -32
- reflex/utils/pyi_generator.py +30 -25
- reflex/utils/registry.py +4 -4
- reflex/utils/serializers.py +1 -1
- reflex/utils/telemetry.py +5 -4
- reflex/utils/types.py +42 -18
- reflex/vars/base.py +650 -333
- reflex/vars/datetime.py +6 -7
- reflex/vars/dep_tracking.py +344 -0
- reflex/vars/function.py +11 -5
- reflex/vars/number.py +31 -43
- reflex/vars/object.py +63 -62
- reflex/vars/sequence.py +79 -67
- {reflex-0.6.8a1.dist-info → reflex-0.7.0a1.dist-info}/METADATA +7 -10
- {reflex-0.6.8a1.dist-info → reflex-0.7.0a1.dist-info}/RECORD +153 -150
- {reflex-0.6.8a1.dist-info → reflex-0.7.0a1.dist-info}/WHEEL +1 -1
- reflex/experimental/assets.py +0 -37
- reflex/proxy.py +0 -119
- {reflex-0.6.8a1.dist-info → reflex-0.7.0a1.dist-info}/LICENSE +0 -0
- {reflex-0.6.8a1.dist-info → reflex-0.7.0a1.dist-info}/entry_points.txt +0 -0
reflex/proxy.py
DELETED
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
"""Handle proxying frontend requests from the backend server."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
import asyncio
|
|
6
|
-
from contextlib import asynccontextmanager
|
|
7
|
-
from typing import Any, AsyncGenerator
|
|
8
|
-
from urllib.parse import urlparse
|
|
9
|
-
|
|
10
|
-
from fastapi import FastAPI
|
|
11
|
-
from starlette.types import ASGIApp, Receive, Scope, Send
|
|
12
|
-
|
|
13
|
-
from .config import get_config
|
|
14
|
-
from .utils import console
|
|
15
|
-
|
|
16
|
-
try:
|
|
17
|
-
import aiohttp
|
|
18
|
-
from asgiproxy.config import BaseURLProxyConfigMixin, ProxyConfig
|
|
19
|
-
from asgiproxy.context import ProxyContext
|
|
20
|
-
from asgiproxy.proxies.http import proxy_http
|
|
21
|
-
from asgiproxy.simple_proxy import make_simple_proxy_app
|
|
22
|
-
except ImportError:
|
|
23
|
-
|
|
24
|
-
@asynccontextmanager
|
|
25
|
-
async def proxy_middleware(*args, **kwargs) -> AsyncGenerator[None, None]:
|
|
26
|
-
"""A no-op proxy middleware for when asgiproxy is not installed.
|
|
27
|
-
|
|
28
|
-
Args:
|
|
29
|
-
*args: The positional arguments.
|
|
30
|
-
**kwargs: The keyword arguments.
|
|
31
|
-
|
|
32
|
-
Yields:
|
|
33
|
-
None
|
|
34
|
-
"""
|
|
35
|
-
yield
|
|
36
|
-
else:
|
|
37
|
-
MAX_PROXY_RETRY = 25
|
|
38
|
-
|
|
39
|
-
async def proxy_http_with_retry(
|
|
40
|
-
*,
|
|
41
|
-
context: ProxyContext,
|
|
42
|
-
scope: Scope,
|
|
43
|
-
receive: Receive,
|
|
44
|
-
send: Send,
|
|
45
|
-
) -> Any:
|
|
46
|
-
"""Proxy an HTTP request with retries.
|
|
47
|
-
|
|
48
|
-
Args:
|
|
49
|
-
context: The proxy context.
|
|
50
|
-
scope: The request scope.
|
|
51
|
-
receive: The receive channel.
|
|
52
|
-
send: The send channel.
|
|
53
|
-
|
|
54
|
-
Returns:
|
|
55
|
-
The response from `proxy_http`.
|
|
56
|
-
"""
|
|
57
|
-
for _attempt in range(MAX_PROXY_RETRY):
|
|
58
|
-
try:
|
|
59
|
-
return await proxy_http(
|
|
60
|
-
context=context,
|
|
61
|
-
scope=scope,
|
|
62
|
-
receive=receive,
|
|
63
|
-
send=send,
|
|
64
|
-
)
|
|
65
|
-
except aiohttp.ClientError as err: # noqa: PERF203
|
|
66
|
-
console.debug(
|
|
67
|
-
f"Retrying request {scope['path']} due to client error {err!r}."
|
|
68
|
-
)
|
|
69
|
-
await asyncio.sleep(0.3)
|
|
70
|
-
except Exception as ex:
|
|
71
|
-
console.debug(
|
|
72
|
-
f"Retrying request {scope['path']} due to unhandled exception {ex!r}."
|
|
73
|
-
)
|
|
74
|
-
await asyncio.sleep(0.3)
|
|
75
|
-
|
|
76
|
-
def _get_proxy_app_with_context(frontend_host: str) -> tuple[ProxyContext, ASGIApp]:
|
|
77
|
-
"""Get the proxy app with the given frontend host.
|
|
78
|
-
|
|
79
|
-
Args:
|
|
80
|
-
frontend_host: The frontend host to proxy requests to.
|
|
81
|
-
|
|
82
|
-
Returns:
|
|
83
|
-
The proxy context and app.
|
|
84
|
-
"""
|
|
85
|
-
|
|
86
|
-
class LocalProxyConfig(BaseURLProxyConfigMixin, ProxyConfig):
|
|
87
|
-
upstream_base_url = frontend_host
|
|
88
|
-
rewrite_host_header = urlparse(upstream_base_url).netloc
|
|
89
|
-
|
|
90
|
-
proxy_context = ProxyContext(LocalProxyConfig())
|
|
91
|
-
proxy_app = make_simple_proxy_app(
|
|
92
|
-
proxy_context, proxy_http_handler=proxy_http_with_retry
|
|
93
|
-
)
|
|
94
|
-
return proxy_context, proxy_app
|
|
95
|
-
|
|
96
|
-
@asynccontextmanager
|
|
97
|
-
async def proxy_middleware( # pyright: ignore[reportGeneralTypeIssues]
|
|
98
|
-
app: FastAPI,
|
|
99
|
-
) -> AsyncGenerator[None, None]:
|
|
100
|
-
"""A middleware to proxy requests to the separate frontend server.
|
|
101
|
-
|
|
102
|
-
The proxy is installed on the / endpoint of the FastAPI instance.
|
|
103
|
-
|
|
104
|
-
Args:
|
|
105
|
-
app: The FastAPI instance.
|
|
106
|
-
|
|
107
|
-
Yields:
|
|
108
|
-
None
|
|
109
|
-
"""
|
|
110
|
-
config = get_config()
|
|
111
|
-
backend_port = config.backend_port
|
|
112
|
-
frontend_host = f"http://localhost:{config.frontend_port}"
|
|
113
|
-
proxy_context, proxy_app = _get_proxy_app_with_context(frontend_host)
|
|
114
|
-
app.mount("/", proxy_app)
|
|
115
|
-
console.debug(
|
|
116
|
-
f"Proxying '/' requests on port {backend_port} to {frontend_host}"
|
|
117
|
-
)
|
|
118
|
-
async with proxy_context:
|
|
119
|
-
yield
|
|
File without changes
|
|
File without changes
|