reflex 0.7.14a3__tar.gz → 0.7.14a4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of reflex might be problematic. Click here for more details.
- {reflex-0.7.14a3 → reflex-0.7.14a4}/PKG-INFO +1 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/pyproject.toml +1 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/app.py +2 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/assets.py +1 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/compiler/compiler.py +2 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/bare.py +1 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/banner.py +1 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/upload.py +1 -1
- reflex-0.7.14a4/reflex/config.py +580 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/constants/base.py +3 -3
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/constants/installer.py +1 -1
- reflex-0.7.14a3/reflex/config.py → reflex-0.7.14a4/reflex/environment.py +5 -571
- reflex-0.7.14a4/reflex/experimental/layout.pyi +814 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/istate/manager.py +2 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/model.py +2 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/reflex.py +2 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/state.py +1 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/testing.py +3 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/console.py +2 -2
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/exec.py +2 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/export.py +2 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/net.py +2 -2
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/path_ops.py +2 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/prerequisites.py +2 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/processes.py +1 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/registry.py +1 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/telemetry.py +1 -1
- {reflex-0.7.14a3 → reflex-0.7.14a4}/.gitignore +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/LICENSE +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/README.md +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/apps/blank/code/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/apps/blank/code/blank.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/app/rxconfig.py.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/custom_components/README.md.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/custom_components/__init__.py.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/custom_components/demo_app.py.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/custom_components/src.py.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/web/package.json.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/web/pages/_app.js.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/web/pages/_document.js.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/web/pages/base_page.js.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/web/pages/component.js.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/web/pages/custom_component.js.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/web/pages/index.js.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/web/pages/macros.js.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/web/pages/stateful_component.js.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/web/pages/stateful_components.js.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/web/pages/utils.js.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/web/styles/styles.css.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/web/utils/context.js.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/jinja/web/utils/theme.js.jinja2 +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/web/.gitignore +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/web/components/shiki/code.js +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/web/jsconfig.json +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/web/next.config.js +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/web/postcss.config.js +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/web/utils/client_side_routing.js +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/web/utils/helpers/debounce.js +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/web/utils/helpers/paste.js +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/web/utils/helpers/range.js +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/web/utils/helpers/throttle.js +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/.templates/web/utils/state.js +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/__init__.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/__main__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/admin.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/app_mixins/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/app_mixins/lifespan.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/app_mixins/middleware.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/app_mixins/mixin.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/base.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/compiler/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/compiler/templates.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/compiler/utils.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/__init__.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/__init__.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/app_wrap.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/app_wrap.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/body.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/body.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/document.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/document.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/error_boundary.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/error_boundary.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/fragment.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/fragment.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/head.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/head.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/link.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/link.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/meta.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/meta.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/script.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/script.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/strict_mode.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/base/strict_mode.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/component.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/__init__.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/auto_scroll.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/auto_scroll.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/banner.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/breakpoints.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/client_side_routing.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/client_side_routing.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/clipboard.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/clipboard.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/colors.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/cond.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/debounce.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/debounce.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/foreach.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/html.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/html.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/layout/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/match.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/responsive.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/sticky.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/sticky.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/core/upload.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/datadisplay/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/datadisplay/__init__.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/datadisplay/code.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/datadisplay/code.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/datadisplay/dataeditor.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/datadisplay/dataeditor.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/datadisplay/logo.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/datadisplay/shiki_code_block.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/datadisplay/shiki_code_block.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/dynamic.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/__init__.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/constants/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/constants/html.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/constants/react.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/constants/reflex.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/element.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/element.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/__init__.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/base.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/base.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/forms.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/forms.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/inline.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/inline.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/media.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/media.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/metadata.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/metadata.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/other.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/other.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/scripts.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/scripts.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/sectioning.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/sectioning.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/tables.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/tables.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/typography.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/el/elements/typography.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/gridjs/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/gridjs/datatable.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/gridjs/datatable.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/literals.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/lucide/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/lucide/icon.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/lucide/icon.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/markdown/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/markdown/markdown.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/markdown/markdown.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/moment/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/moment/moment.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/moment/moment.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/next/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/next/base.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/next/base.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/next/image.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/next/image.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/next/link.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/next/link.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/next/video.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/next/video.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/plotly/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/plotly/plotly.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/plotly/plotly.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/props.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/__init__.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/primitives/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/primitives/__init__.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/primitives/accordion.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/primitives/accordion.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/primitives/base.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/primitives/base.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/primitives/drawer.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/primitives/drawer.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/primitives/form.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/primitives/form.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/primitives/progress.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/primitives/progress.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/primitives/slider.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/primitives/slider.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/__init__.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/base.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/base.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/color_mode.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/color_mode.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/__init__.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/avatar.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/avatar.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/badge.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/badge.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/button.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/button.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/callout.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/callout.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/card.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/card.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/checkbox.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/checkbox_cards.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/checkbox_cards.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/checkbox_group.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/checkbox_group.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/context_menu.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/data_list.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/data_list.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/dialog.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/dialog.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/hover_card.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/icon_button.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/inset.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/inset.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/popover.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/popover.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/progress.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/progress.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/radio.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/radio.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/radio_cards.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/radio_cards.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/radio_group.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/scroll_area.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/segmented_control.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/segmented_control.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/select.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/select.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/separator.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/separator.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/skeleton.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/skeleton.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/slider.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/slider.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/spinner.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/spinner.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/switch.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/switch.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/table.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/table.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/tabs.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/tabs.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/text_area.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/text_area.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/text_field.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/text_field.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/tooltip.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/__init__.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/base.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/base.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/box.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/box.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/center.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/center.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/container.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/container.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/flex.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/flex.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/grid.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/grid.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/list.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/list.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/section.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/section.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/spacer.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/stack.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/layout/stack.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/typography/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/typography/__init__.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/typography/base.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/typography/blockquote.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/typography/code.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/typography/code.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/typography/heading.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/typography/heading.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/typography/link.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/typography/link.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/typography/text.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/radix/themes/typography/text.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/react_player/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/react_player/audio.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/react_player/audio.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/react_player/react_player.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/react_player/react_player.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/react_player/video.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/react_player/video.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/recharts/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/recharts/__init__.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/recharts/cartesian.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/recharts/cartesian.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/recharts/charts.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/recharts/charts.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/recharts/general.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/recharts/general.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/recharts/polar.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/recharts/polar.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/recharts/recharts.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/recharts/recharts.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/sonner/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/sonner/toast.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/sonner/toast.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/suneditor/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/suneditor/editor.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/suneditor/editor.pyi +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/tags/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/tags/cond_tag.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/tags/iter_tag.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/tags/match_tag.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/tags/tag.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/components/tags/tagless.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/constants/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/constants/colors.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/constants/compiler.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/constants/config.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/constants/custom_components.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/constants/event.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/constants/route.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/constants/state.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/constants/utils.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/custom_components/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/custom_components/custom_components.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/event.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/experimental/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/experimental/client_state.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/experimental/hooks.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/experimental/layout.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/istate/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/istate/data.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/istate/dynamic.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/istate/proxy.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/istate/storage.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/istate/wrappers.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/middleware/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/middleware/hydrate_middleware.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/middleware/middleware.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/page.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/plugins/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/plugins/base.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/plugins/tailwind_v3.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/plugins/tailwind_v4.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/py.typed +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/route.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/style.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/build.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/codespaces.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/compat.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/decorator.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/exceptions.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/format.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/imports.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/lazy_loader.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/misc.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/pyi_generator.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/redir.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/serializers.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/utils/types.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/vars/__init__.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/vars/base.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/vars/datetime.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/vars/dep_tracking.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/vars/function.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/vars/number.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/vars/object.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/reflex/vars/sequence.py +0 -0
- {reflex-0.7.14a3 → reflex-0.7.14a4}/scripts/hatch_build.py +0 -0
|
@@ -68,7 +68,8 @@ from reflex.components.core.sticky import sticky
|
|
|
68
68
|
from reflex.components.core.upload import Upload, get_upload_dir
|
|
69
69
|
from reflex.components.radix import themes
|
|
70
70
|
from reflex.components.sonner.toast import toast
|
|
71
|
-
from reflex.config import
|
|
71
|
+
from reflex.config import get_config
|
|
72
|
+
from reflex.environment import ExecutorType, environment
|
|
72
73
|
from reflex.event import (
|
|
73
74
|
_EVENT_FIELDS,
|
|
74
75
|
Event,
|
|
@@ -19,8 +19,9 @@ from reflex.components.component import (
|
|
|
19
19
|
CustomComponent,
|
|
20
20
|
StatefulComponent,
|
|
21
21
|
)
|
|
22
|
-
from reflex.config import
|
|
22
|
+
from reflex.config import get_config
|
|
23
23
|
from reflex.constants.compiler import PageNames
|
|
24
|
+
from reflex.environment import environment
|
|
24
25
|
from reflex.state import BaseState
|
|
25
26
|
from reflex.style import SYSTEM_COLOR_MODE
|
|
26
27
|
from reflex.utils import console, path_ops
|
|
@@ -8,7 +8,7 @@ from typing import Any
|
|
|
8
8
|
from reflex.components.component import BaseComponent, Component, ComponentStyle
|
|
9
9
|
from reflex.components.tags import Tag
|
|
10
10
|
from reflex.components.tags.tagless import Tagless
|
|
11
|
-
from reflex.
|
|
11
|
+
from reflex.environment import PerformanceMode, environment
|
|
12
12
|
from reflex.utils import console
|
|
13
13
|
from reflex.utils.decorator import once
|
|
14
14
|
from reflex.utils.imports import ParsedImportDict
|
|
@@ -16,9 +16,9 @@ from reflex.components.radix.themes.components.dialog import (
|
|
|
16
16
|
from reflex.components.radix.themes.layout.flex import Flex
|
|
17
17
|
from reflex.components.radix.themes.typography.text import Text
|
|
18
18
|
from reflex.components.sonner.toast import ToastProps, toast_ref
|
|
19
|
-
from reflex.config import environment
|
|
20
19
|
from reflex.constants import Dirs, Hooks, Imports
|
|
21
20
|
from reflex.constants.compiler import CompileVars
|
|
21
|
+
from reflex.environment import environment
|
|
22
22
|
from reflex.utils.imports import ImportVar
|
|
23
23
|
from reflex.vars import VarData
|
|
24
24
|
from reflex.vars.base import LiteralVar, Var
|
|
@@ -16,9 +16,9 @@ from reflex.components.component import (
|
|
|
16
16
|
from reflex.components.core.cond import cond
|
|
17
17
|
from reflex.components.el.elements.forms import Input
|
|
18
18
|
from reflex.components.radix.themes.layout.box import Box
|
|
19
|
-
from reflex.config import environment
|
|
20
19
|
from reflex.constants import Dirs
|
|
21
20
|
from reflex.constants.compiler import Hooks, Imports
|
|
21
|
+
from reflex.environment import environment
|
|
22
22
|
from reflex.event import (
|
|
23
23
|
CallableEventSpec,
|
|
24
24
|
EventChain,
|
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
"""The Reflex config."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import importlib
|
|
6
|
+
import os
|
|
7
|
+
import sys
|
|
8
|
+
import threading
|
|
9
|
+
import urllib.parse
|
|
10
|
+
from importlib.util import find_spec
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from types import ModuleType
|
|
13
|
+
from typing import Any, ClassVar
|
|
14
|
+
|
|
15
|
+
import pydantic.v1 as pydantic
|
|
16
|
+
|
|
17
|
+
from reflex import constants
|
|
18
|
+
from reflex.base import Base
|
|
19
|
+
from reflex.constants.base import LogLevel
|
|
20
|
+
from reflex.environment import EnvironmentVariables as EnvironmentVariables
|
|
21
|
+
from reflex.environment import EnvVar as EnvVar
|
|
22
|
+
from reflex.environment import ExistingPath, interpret_env_var_value
|
|
23
|
+
from reflex.environment import env_var as env_var
|
|
24
|
+
from reflex.environment import environment as environment
|
|
25
|
+
from reflex.plugins import Plugin, TailwindV3Plugin, TailwindV4Plugin
|
|
26
|
+
from reflex.utils import console
|
|
27
|
+
from reflex.utils.exceptions import ConfigError
|
|
28
|
+
from reflex.utils.types import true_type_for_pydantic_field
|
|
29
|
+
|
|
30
|
+
try:
|
|
31
|
+
from dotenv import load_dotenv
|
|
32
|
+
except ImportError:
|
|
33
|
+
load_dotenv = None
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _load_dotenv_from_str(env_files: str) -> None:
|
|
37
|
+
if not env_files:
|
|
38
|
+
return
|
|
39
|
+
|
|
40
|
+
if load_dotenv is None:
|
|
41
|
+
console.error(
|
|
42
|
+
"""The `python-dotenv` package is required to load environment variables from a file. Run `pip install "python-dotenv>=1.1.0"`."""
|
|
43
|
+
)
|
|
44
|
+
return
|
|
45
|
+
|
|
46
|
+
# load env files in reverse order if they exist
|
|
47
|
+
for env_file_path in [
|
|
48
|
+
Path(p) for s in reversed(env_files.split(os.pathsep)) if (p := s.strip())
|
|
49
|
+
]:
|
|
50
|
+
if env_file_path.exists():
|
|
51
|
+
load_dotenv(env_file_path, override=True)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _load_dotenv_from_env():
|
|
55
|
+
"""Load environment variables from paths specified in REFLEX_ENV_FILE."""
|
|
56
|
+
show_deprecation = False
|
|
57
|
+
env_env_file = os.environ.get("REFLEX_ENV_FILE")
|
|
58
|
+
if not env_env_file:
|
|
59
|
+
env_env_file = os.environ.get("ENV_FILE")
|
|
60
|
+
if env_env_file:
|
|
61
|
+
show_deprecation = True
|
|
62
|
+
if show_deprecation:
|
|
63
|
+
console.deprecate(
|
|
64
|
+
"Usage of deprecated ENV_FILE env var detected.",
|
|
65
|
+
reason="Prefer `REFLEX_` prefix when setting env vars.",
|
|
66
|
+
deprecation_version="0.7.13",
|
|
67
|
+
removal_version="0.8.0",
|
|
68
|
+
)
|
|
69
|
+
if env_env_file:
|
|
70
|
+
_load_dotenv_from_str(env_env_file)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# Load the env files at import time if they are set in the ENV_FILE environment variable.
|
|
74
|
+
_load_dotenv_from_env()
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class DBConfig(Base):
|
|
78
|
+
"""Database config."""
|
|
79
|
+
|
|
80
|
+
engine: str
|
|
81
|
+
username: str | None = ""
|
|
82
|
+
password: str | None = ""
|
|
83
|
+
host: str | None = ""
|
|
84
|
+
port: int | None = None
|
|
85
|
+
database: str
|
|
86
|
+
|
|
87
|
+
@classmethod
|
|
88
|
+
def postgresql(
|
|
89
|
+
cls,
|
|
90
|
+
database: str,
|
|
91
|
+
username: str,
|
|
92
|
+
password: str | None = None,
|
|
93
|
+
host: str | None = None,
|
|
94
|
+
port: int | None = 5432,
|
|
95
|
+
) -> DBConfig:
|
|
96
|
+
"""Create an instance with postgresql engine.
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
database: Database name.
|
|
100
|
+
username: Database username.
|
|
101
|
+
password: Database password.
|
|
102
|
+
host: Database host.
|
|
103
|
+
port: Database port.
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
DBConfig instance.
|
|
107
|
+
"""
|
|
108
|
+
return cls(
|
|
109
|
+
engine="postgresql",
|
|
110
|
+
username=username,
|
|
111
|
+
password=password,
|
|
112
|
+
host=host,
|
|
113
|
+
port=port,
|
|
114
|
+
database=database,
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
@classmethod
|
|
118
|
+
def postgresql_psycopg(
|
|
119
|
+
cls,
|
|
120
|
+
database: str,
|
|
121
|
+
username: str,
|
|
122
|
+
password: str | None = None,
|
|
123
|
+
host: str | None = None,
|
|
124
|
+
port: int | None = 5432,
|
|
125
|
+
) -> DBConfig:
|
|
126
|
+
"""Create an instance with postgresql+psycopg engine.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
database: Database name.
|
|
130
|
+
username: Database username.
|
|
131
|
+
password: Database password.
|
|
132
|
+
host: Database host.
|
|
133
|
+
port: Database port.
|
|
134
|
+
|
|
135
|
+
Returns:
|
|
136
|
+
DBConfig instance.
|
|
137
|
+
"""
|
|
138
|
+
return cls(
|
|
139
|
+
engine="postgresql+psycopg",
|
|
140
|
+
username=username,
|
|
141
|
+
password=password,
|
|
142
|
+
host=host,
|
|
143
|
+
port=port,
|
|
144
|
+
database=database,
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
@classmethod
|
|
148
|
+
def sqlite(
|
|
149
|
+
cls,
|
|
150
|
+
database: str,
|
|
151
|
+
) -> DBConfig:
|
|
152
|
+
"""Create an instance with sqlite engine.
|
|
153
|
+
|
|
154
|
+
Args:
|
|
155
|
+
database: Database name.
|
|
156
|
+
|
|
157
|
+
Returns:
|
|
158
|
+
DBConfig instance.
|
|
159
|
+
"""
|
|
160
|
+
return cls(
|
|
161
|
+
engine="sqlite",
|
|
162
|
+
database=database,
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
def get_url(self) -> str:
|
|
166
|
+
"""Get database URL.
|
|
167
|
+
|
|
168
|
+
Returns:
|
|
169
|
+
The database URL.
|
|
170
|
+
"""
|
|
171
|
+
host = (
|
|
172
|
+
f"{self.host}:{self.port}" if self.host and self.port else self.host or ""
|
|
173
|
+
)
|
|
174
|
+
username = urllib.parse.quote_plus(self.username) if self.username else ""
|
|
175
|
+
password = urllib.parse.quote_plus(self.password) if self.password else ""
|
|
176
|
+
|
|
177
|
+
if username:
|
|
178
|
+
path = f"{username}:{password}@{host}" if password else f"{username}@{host}"
|
|
179
|
+
else:
|
|
180
|
+
path = f"{host}"
|
|
181
|
+
|
|
182
|
+
return f"{self.engine}://{path}/{self.database}"
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
# These vars are not logged because they may contain sensitive information.
|
|
186
|
+
_sensitive_env_vars = {"DB_URL", "ASYNC_DB_URL", "REDIS_URL"}
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
class Config(Base):
|
|
190
|
+
"""The config defines runtime settings for the app.
|
|
191
|
+
|
|
192
|
+
By default, the config is defined in an `rxconfig.py` file in the root of the app.
|
|
193
|
+
|
|
194
|
+
```python
|
|
195
|
+
# rxconfig.py
|
|
196
|
+
import reflex as rx
|
|
197
|
+
|
|
198
|
+
config = rx.Config(
|
|
199
|
+
app_name="myapp",
|
|
200
|
+
api_url="http://localhost:8000",
|
|
201
|
+
)
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Every config value can be overridden by an environment variable with the same name in uppercase.
|
|
205
|
+
For example, `db_url` can be overridden by setting the `DB_URL` environment variable.
|
|
206
|
+
|
|
207
|
+
See the [configuration](https://reflex.dev/docs/getting-started/configuration/) docs for more info.
|
|
208
|
+
"""
|
|
209
|
+
|
|
210
|
+
class Config: # pyright: ignore [reportIncompatibleVariableOverride]
|
|
211
|
+
"""Pydantic config for the config."""
|
|
212
|
+
|
|
213
|
+
validate_assignment = True
|
|
214
|
+
use_enum_values = False
|
|
215
|
+
|
|
216
|
+
# The name of the app (should match the name of the app directory).
|
|
217
|
+
app_name: str
|
|
218
|
+
|
|
219
|
+
# The path to the app module.
|
|
220
|
+
app_module_import: str | None = None
|
|
221
|
+
|
|
222
|
+
# The log level to use.
|
|
223
|
+
loglevel: constants.LogLevel = constants.LogLevel.DEFAULT
|
|
224
|
+
|
|
225
|
+
# The port to run the frontend on. NOTE: When running in dev mode, the next available port will be used if this is taken.
|
|
226
|
+
frontend_port: int | None = None
|
|
227
|
+
|
|
228
|
+
# The path to run the frontend on. For example, "/app" will run the frontend on http://localhost:3000/app
|
|
229
|
+
frontend_path: str = ""
|
|
230
|
+
|
|
231
|
+
# The port to run the backend on. NOTE: When running in dev mode, the next available port will be used if this is taken.
|
|
232
|
+
backend_port: int | None = None
|
|
233
|
+
|
|
234
|
+
# The backend url the frontend will connect to. This must be updated if the backend is hosted elsewhere, or in production.
|
|
235
|
+
api_url: str = f"http://localhost:{constants.DefaultPorts.BACKEND_PORT}"
|
|
236
|
+
|
|
237
|
+
# The url the frontend will be hosted on.
|
|
238
|
+
deploy_url: str | None = f"http://localhost:{constants.DefaultPorts.FRONTEND_PORT}"
|
|
239
|
+
|
|
240
|
+
# The url the backend will be hosted on.
|
|
241
|
+
backend_host: str = "0.0.0.0"
|
|
242
|
+
|
|
243
|
+
# The database url used by rx.Model.
|
|
244
|
+
db_url: str | None = "sqlite:///reflex.db"
|
|
245
|
+
|
|
246
|
+
# The async database url used by rx.Model.
|
|
247
|
+
async_db_url: str | None = None
|
|
248
|
+
|
|
249
|
+
# The redis url
|
|
250
|
+
redis_url: str | None = None
|
|
251
|
+
|
|
252
|
+
# Telemetry opt-in.
|
|
253
|
+
telemetry_enabled: bool = True
|
|
254
|
+
|
|
255
|
+
# The bun path
|
|
256
|
+
bun_path: ExistingPath = constants.Bun.DEFAULT_PATH
|
|
257
|
+
|
|
258
|
+
# Timeout to do a production build of a frontend page.
|
|
259
|
+
static_page_generation_timeout: int = 60
|
|
260
|
+
|
|
261
|
+
# List of origins that are allowed to connect to the backend API.
|
|
262
|
+
cors_allowed_origins: list[str] = ["*"]
|
|
263
|
+
|
|
264
|
+
# Tailwind config.
|
|
265
|
+
tailwind: dict[str, Any] | None = {"plugins": ["@tailwindcss/typography"]}
|
|
266
|
+
|
|
267
|
+
# DEPRECATED. Timeout when launching the gunicorn server.
|
|
268
|
+
timeout: int | None = None
|
|
269
|
+
|
|
270
|
+
# Whether to enable or disable nextJS gzip compression.
|
|
271
|
+
next_compression: bool = True
|
|
272
|
+
|
|
273
|
+
# Whether to enable or disable NextJS dev indicator.
|
|
274
|
+
next_dev_indicators: bool = False
|
|
275
|
+
|
|
276
|
+
# Whether to use React strict mode in nextJS
|
|
277
|
+
react_strict_mode: bool = True
|
|
278
|
+
|
|
279
|
+
# Additional frontend packages to install.
|
|
280
|
+
frontend_packages: list[str] = []
|
|
281
|
+
|
|
282
|
+
# DEPRECATED. The worker class used in production mode
|
|
283
|
+
gunicorn_worker_class: str = "uvicorn.workers.UvicornH11Worker"
|
|
284
|
+
|
|
285
|
+
# DEPRECATED. Number of gunicorn workers from user
|
|
286
|
+
gunicorn_workers: int | None = None
|
|
287
|
+
|
|
288
|
+
# DEPRECATED. Number of requests before a worker is restarted; set to 0 to disable
|
|
289
|
+
gunicorn_max_requests: int | None = None
|
|
290
|
+
|
|
291
|
+
# DEPRECATED. Variance limit for max requests; gunicorn only
|
|
292
|
+
gunicorn_max_requests_jitter: int | None = None
|
|
293
|
+
|
|
294
|
+
# Indicate which type of state manager to use
|
|
295
|
+
state_manager_mode: constants.StateManagerMode = constants.StateManagerMode.DISK
|
|
296
|
+
|
|
297
|
+
# Maximum expiration lock time for redis state manager
|
|
298
|
+
redis_lock_expiration: int = constants.Expiration.LOCK
|
|
299
|
+
|
|
300
|
+
# Maximum lock time before warning for redis state manager.
|
|
301
|
+
redis_lock_warning_threshold: int = constants.Expiration.LOCK_WARNING_THRESHOLD
|
|
302
|
+
|
|
303
|
+
# Token expiration time for redis state manager
|
|
304
|
+
redis_token_expiration: int = constants.Expiration.TOKEN
|
|
305
|
+
|
|
306
|
+
# Attributes that were explicitly set by the user.
|
|
307
|
+
_non_default_attributes: set[str] = pydantic.PrivateAttr(set())
|
|
308
|
+
|
|
309
|
+
# Path to file containing key-values pairs to override in the environment; Dotenv format.
|
|
310
|
+
env_file: str | None = None
|
|
311
|
+
|
|
312
|
+
# Whether to automatically create setters for state base vars
|
|
313
|
+
state_auto_setters: bool = True
|
|
314
|
+
|
|
315
|
+
# Whether to display the sticky "Built with Reflex" badge on all pages.
|
|
316
|
+
show_built_with_reflex: bool | None = None
|
|
317
|
+
|
|
318
|
+
# Whether the app is running in the reflex cloud environment.
|
|
319
|
+
is_reflex_cloud: bool = False
|
|
320
|
+
|
|
321
|
+
# Extra overlay function to run after the app is built. Formatted such that `from path_0.path_1... import path[-1]`, and calling it with no arguments would work. For example, "reflex.components.moment.moment".
|
|
322
|
+
extra_overlay_function: str | None = None
|
|
323
|
+
|
|
324
|
+
# List of plugins to use in the app.
|
|
325
|
+
plugins: list[Plugin] = []
|
|
326
|
+
|
|
327
|
+
_prefixes: ClassVar[list[str]] = ["REFLEX_"]
|
|
328
|
+
|
|
329
|
+
def __init__(self, *args, **kwargs):
|
|
330
|
+
"""Initialize the config values.
|
|
331
|
+
|
|
332
|
+
Args:
|
|
333
|
+
*args: The args to pass to the Pydantic init method.
|
|
334
|
+
**kwargs: The kwargs to pass to the Pydantic init method.
|
|
335
|
+
|
|
336
|
+
Raises:
|
|
337
|
+
ConfigError: If some values in the config are invalid.
|
|
338
|
+
"""
|
|
339
|
+
super().__init__(*args, **kwargs)
|
|
340
|
+
|
|
341
|
+
# Clean up this code when we remove plain envvar in 0.8.0
|
|
342
|
+
show_deprecation = False
|
|
343
|
+
env_loglevel = os.environ.get("REFLEX_LOGLEVEL")
|
|
344
|
+
if not env_loglevel:
|
|
345
|
+
env_loglevel = os.environ.get("LOGLEVEL")
|
|
346
|
+
if env_loglevel:
|
|
347
|
+
show_deprecation = True
|
|
348
|
+
if env_loglevel is not None:
|
|
349
|
+
env_loglevel = LogLevel(env_loglevel.lower())
|
|
350
|
+
if env_loglevel or self.loglevel != LogLevel.DEFAULT:
|
|
351
|
+
console.set_log_level(env_loglevel or self.loglevel)
|
|
352
|
+
|
|
353
|
+
if show_deprecation:
|
|
354
|
+
console.deprecate(
|
|
355
|
+
"Usage of deprecated LOGLEVEL env var detected.",
|
|
356
|
+
reason="Prefer `REFLEX_` prefix when setting env vars.",
|
|
357
|
+
deprecation_version="0.7.13",
|
|
358
|
+
removal_version="0.8.0",
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
# Update the config from environment variables.
|
|
362
|
+
env_kwargs = self.update_from_env()
|
|
363
|
+
for key, env_value in env_kwargs.items():
|
|
364
|
+
setattr(self, key, env_value)
|
|
365
|
+
|
|
366
|
+
# Update default URLs if ports were set
|
|
367
|
+
kwargs.update(env_kwargs)
|
|
368
|
+
self._non_default_attributes.update(kwargs)
|
|
369
|
+
self._replace_defaults(**kwargs)
|
|
370
|
+
|
|
371
|
+
if self.tailwind is not None and not any(
|
|
372
|
+
isinstance(plugin, (TailwindV3Plugin, TailwindV4Plugin))
|
|
373
|
+
for plugin in self.plugins
|
|
374
|
+
):
|
|
375
|
+
console.deprecate(
|
|
376
|
+
"Inferring tailwind usage",
|
|
377
|
+
reason="""
|
|
378
|
+
|
|
379
|
+
If you are using tailwind, add `rx.plugins.TailwindV3Plugin()` to the `plugins=[]` in rxconfig.py.
|
|
380
|
+
|
|
381
|
+
If you are not using tailwind, set `tailwind` to `None` in rxconfig.py.""",
|
|
382
|
+
deprecation_version="0.7.13",
|
|
383
|
+
removal_version="0.8.0",
|
|
384
|
+
dedupe=True,
|
|
385
|
+
)
|
|
386
|
+
self.plugins.append(TailwindV3Plugin())
|
|
387
|
+
|
|
388
|
+
if (
|
|
389
|
+
self.state_manager_mode == constants.StateManagerMode.REDIS
|
|
390
|
+
and not self.redis_url
|
|
391
|
+
):
|
|
392
|
+
msg = f"{self._prefixes[0]}REDIS_URL is required when using the redis state manager."
|
|
393
|
+
raise ConfigError(msg)
|
|
394
|
+
|
|
395
|
+
@property
|
|
396
|
+
def app_module(self) -> ModuleType | None:
|
|
397
|
+
"""Return the app module if `app_module_import` is set.
|
|
398
|
+
|
|
399
|
+
Returns:
|
|
400
|
+
The app module.
|
|
401
|
+
"""
|
|
402
|
+
return (
|
|
403
|
+
importlib.import_module(self.app_module_import)
|
|
404
|
+
if self.app_module_import
|
|
405
|
+
else None
|
|
406
|
+
)
|
|
407
|
+
|
|
408
|
+
@property
|
|
409
|
+
def module(self) -> str:
|
|
410
|
+
"""Get the module name of the app.
|
|
411
|
+
|
|
412
|
+
Returns:
|
|
413
|
+
The module name.
|
|
414
|
+
"""
|
|
415
|
+
if self.app_module_import is not None:
|
|
416
|
+
return self.app_module_import
|
|
417
|
+
return self.app_name + "." + self.app_name
|
|
418
|
+
|
|
419
|
+
def update_from_env(self) -> dict[str, Any]:
|
|
420
|
+
"""Update the config values based on set environment variables.
|
|
421
|
+
If there is a set env_file, it is loaded first.
|
|
422
|
+
|
|
423
|
+
Returns:
|
|
424
|
+
The updated config values.
|
|
425
|
+
"""
|
|
426
|
+
if self.env_file:
|
|
427
|
+
_load_dotenv_from_str(self.env_file)
|
|
428
|
+
|
|
429
|
+
updated_values = {}
|
|
430
|
+
# Iterate over the fields.
|
|
431
|
+
for key, field in self.__fields__.items():
|
|
432
|
+
# The env var name is the key in uppercase.
|
|
433
|
+
for prefix in self._prefixes:
|
|
434
|
+
if environment_variable := os.environ.get(f"{prefix}{key.upper()}"):
|
|
435
|
+
break
|
|
436
|
+
else:
|
|
437
|
+
# Default to non-prefixed env var if other are not found.
|
|
438
|
+
if environment_variable := os.environ.get(key.upper()):
|
|
439
|
+
console.deprecate(
|
|
440
|
+
f"Usage of deprecated {key.upper()} env var detected.",
|
|
441
|
+
reason=f"Prefer `{self._prefixes[0]}` prefix when setting env vars.",
|
|
442
|
+
deprecation_version="0.7.13",
|
|
443
|
+
removal_version="0.8.0",
|
|
444
|
+
)
|
|
445
|
+
|
|
446
|
+
# If the env var is set, override the config value.
|
|
447
|
+
if environment_variable and environment_variable.strip():
|
|
448
|
+
# Interpret the value.
|
|
449
|
+
value = interpret_env_var_value(
|
|
450
|
+
environment_variable,
|
|
451
|
+
true_type_for_pydantic_field(field),
|
|
452
|
+
field.name,
|
|
453
|
+
)
|
|
454
|
+
|
|
455
|
+
# Set the value.
|
|
456
|
+
updated_values[key] = value
|
|
457
|
+
|
|
458
|
+
if key.upper() in _sensitive_env_vars:
|
|
459
|
+
environment_variable = "***"
|
|
460
|
+
|
|
461
|
+
if value != getattr(self, key):
|
|
462
|
+
console.debug(
|
|
463
|
+
f"Overriding config value {key} with env var {key.upper()}={environment_variable}",
|
|
464
|
+
dedupe=True,
|
|
465
|
+
)
|
|
466
|
+
return updated_values
|
|
467
|
+
|
|
468
|
+
def get_event_namespace(self) -> str:
|
|
469
|
+
"""Get the path that the backend Websocket server lists on.
|
|
470
|
+
|
|
471
|
+
Returns:
|
|
472
|
+
The namespace for websocket.
|
|
473
|
+
"""
|
|
474
|
+
event_url = constants.Endpoint.EVENT.get_url()
|
|
475
|
+
return urllib.parse.urlsplit(event_url).path
|
|
476
|
+
|
|
477
|
+
def _replace_defaults(self, **kwargs):
|
|
478
|
+
"""Replace formatted defaults when the caller provides updates.
|
|
479
|
+
|
|
480
|
+
Args:
|
|
481
|
+
**kwargs: The kwargs passed to the config or from the env.
|
|
482
|
+
"""
|
|
483
|
+
if "api_url" not in self._non_default_attributes and "backend_port" in kwargs:
|
|
484
|
+
self.api_url = f"http://localhost:{kwargs['backend_port']}"
|
|
485
|
+
|
|
486
|
+
if (
|
|
487
|
+
"deploy_url" not in self._non_default_attributes
|
|
488
|
+
and "frontend_port" in kwargs
|
|
489
|
+
):
|
|
490
|
+
self.deploy_url = f"http://localhost:{kwargs['frontend_port']}"
|
|
491
|
+
|
|
492
|
+
if "api_url" not in self._non_default_attributes:
|
|
493
|
+
# If running in Github Codespaces, override API_URL
|
|
494
|
+
codespace_name = os.getenv("CODESPACE_NAME")
|
|
495
|
+
github_codespaces_port_forwarding_domain = os.getenv(
|
|
496
|
+
"GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN"
|
|
497
|
+
)
|
|
498
|
+
# If running on Replit.com interactively, override API_URL to ensure we maintain the backend_port
|
|
499
|
+
replit_dev_domain = os.getenv("REPLIT_DEV_DOMAIN")
|
|
500
|
+
backend_port = kwargs.get("backend_port", self.backend_port)
|
|
501
|
+
if codespace_name and github_codespaces_port_forwarding_domain:
|
|
502
|
+
self.api_url = (
|
|
503
|
+
f"https://{codespace_name}-{kwargs.get('backend_port', self.backend_port)}"
|
|
504
|
+
f".{github_codespaces_port_forwarding_domain}"
|
|
505
|
+
)
|
|
506
|
+
elif replit_dev_domain and backend_port:
|
|
507
|
+
self.api_url = f"https://{replit_dev_domain}:{backend_port}"
|
|
508
|
+
|
|
509
|
+
def _set_persistent(self, **kwargs):
|
|
510
|
+
"""Set values in this config and in the environment so they persist into subprocess.
|
|
511
|
+
|
|
512
|
+
Args:
|
|
513
|
+
**kwargs: The kwargs passed to the config.
|
|
514
|
+
"""
|
|
515
|
+
for key, value in kwargs.items():
|
|
516
|
+
if value is not None:
|
|
517
|
+
os.environ[self._prefixes[0] + key.upper()] = str(value)
|
|
518
|
+
setattr(self, key, value)
|
|
519
|
+
self._non_default_attributes.update(kwargs)
|
|
520
|
+
self._replace_defaults(**kwargs)
|
|
521
|
+
|
|
522
|
+
|
|
523
|
+
def _get_config() -> Config:
|
|
524
|
+
"""Get the app config.
|
|
525
|
+
|
|
526
|
+
Returns:
|
|
527
|
+
The app config.
|
|
528
|
+
"""
|
|
529
|
+
# only import the module if it exists. If a module spec exists then
|
|
530
|
+
# the module exists.
|
|
531
|
+
spec = find_spec(constants.Config.MODULE)
|
|
532
|
+
if not spec:
|
|
533
|
+
# we need this condition to ensure that a ModuleNotFound error is not thrown when
|
|
534
|
+
# running unit/integration tests or during `reflex init`.
|
|
535
|
+
return Config(app_name="")
|
|
536
|
+
rxconfig = importlib.import_module(constants.Config.MODULE)
|
|
537
|
+
return rxconfig.config
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
# Protect sys.path from concurrent modification
|
|
541
|
+
_config_lock = threading.RLock()
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
def get_config(reload: bool = False) -> Config:
|
|
545
|
+
"""Get the app config.
|
|
546
|
+
|
|
547
|
+
Args:
|
|
548
|
+
reload: Re-import the rxconfig module from disk
|
|
549
|
+
|
|
550
|
+
Returns:
|
|
551
|
+
The app config.
|
|
552
|
+
"""
|
|
553
|
+
cached_rxconfig = sys.modules.get(constants.Config.MODULE, None)
|
|
554
|
+
if cached_rxconfig is not None:
|
|
555
|
+
if reload:
|
|
556
|
+
# Remove any cached module when `reload` is requested.
|
|
557
|
+
del sys.modules[constants.Config.MODULE]
|
|
558
|
+
else:
|
|
559
|
+
return cached_rxconfig.config
|
|
560
|
+
|
|
561
|
+
with _config_lock:
|
|
562
|
+
orig_sys_path = sys.path.copy()
|
|
563
|
+
sys.path.clear()
|
|
564
|
+
sys.path.append(str(Path.cwd()))
|
|
565
|
+
try:
|
|
566
|
+
# Try to import the module with only the current directory in the path.
|
|
567
|
+
return _get_config()
|
|
568
|
+
except Exception:
|
|
569
|
+
# If the module import fails, try to import with the original sys.path.
|
|
570
|
+
sys.path.extend(orig_sys_path)
|
|
571
|
+
return _get_config()
|
|
572
|
+
finally:
|
|
573
|
+
# Find any entries added to sys.path by rxconfig.py itself.
|
|
574
|
+
extra_paths = [
|
|
575
|
+
p for p in sys.path if p not in orig_sys_path and p != str(Path.cwd())
|
|
576
|
+
]
|
|
577
|
+
# Restore the original sys.path.
|
|
578
|
+
sys.path.clear()
|
|
579
|
+
sys.path.extend(extra_paths)
|
|
580
|
+
sys.path.extend(orig_sys_path)
|
|
@@ -147,7 +147,7 @@ class Templates(SimpleNamespace):
|
|
|
147
147
|
Returns:
|
|
148
148
|
The URL to redirect to reflex.build.
|
|
149
149
|
"""
|
|
150
|
-
from reflex.
|
|
150
|
+
from reflex.environment import environment
|
|
151
151
|
|
|
152
152
|
return (
|
|
153
153
|
environment.REFLEX_BUILD_FRONTEND.get()
|
|
@@ -162,7 +162,7 @@ class Templates(SimpleNamespace):
|
|
|
162
162
|
Returns:
|
|
163
163
|
The URL to poll waiting for the user to select a generation.
|
|
164
164
|
"""
|
|
165
|
-
from reflex.
|
|
165
|
+
from reflex.environment import environment
|
|
166
166
|
|
|
167
167
|
return environment.REFLEX_BUILD_BACKEND.get() + "/api/init/{reflex_init_token}"
|
|
168
168
|
|
|
@@ -174,7 +174,7 @@ class Templates(SimpleNamespace):
|
|
|
174
174
|
Returns:
|
|
175
175
|
The URL to fetch the generation's reflex code.
|
|
176
176
|
"""
|
|
177
|
-
from reflex.
|
|
177
|
+
from reflex.environment import environment
|
|
178
178
|
|
|
179
179
|
return (
|
|
180
180
|
environment.REFLEX_BUILD_BACKEND.get()
|