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