فهرست منبع

Lazy import modules in reflex (#2144)

Nikhil Rao 1 سال پیش
والد
کامیت
33e4816950

+ 310 - 40
reflex/__init__.py

@@ -4,44 +4,314 @@ Anything imported here will be available in the default Reflex import as `rx.*`.
 To signal to typecheckers that something should be reexported,
 we use the Flask "import name as name" syntax.
 """
+import importlib
+from typing import Type
 
-from . import el as el
-from .admin import AdminDash as AdminDash
-from .app import App as App
-from .app import UploadFile as UploadFile
-from .base import Base as Base
-from .compiler.utils import get_asset_path
-from .components import *
-from .components.component import custom_component as memo
-from .components.graphing import recharts as recharts
-from .config import Config as Config
-from .config import DBConfig as DBConfig
-from .constants import Env as Env
-from .event import EventChain as EventChain
-from .event import FileUpload as upload_files
-from .event import background as background
-from .event import call_script as call_script
-from .event import clear_local_storage as clear_local_storage
-from .event import console_log as console_log
-from .event import download as download
-from .event import prevent_default as prevent_default
-from .event import redirect as redirect
-from .event import remove_cookie as remove_cookie
-from .event import remove_local_storage as remove_local_storage
-from .event import set_clipboard as set_clipboard
-from .event import set_focus as set_focus
-from .event import set_value as set_value
-from .event import stop_propagation as stop_propagation
-from .event import window_alert as window_alert
-from .middleware import Middleware as Middleware
-from .model import Model as Model
-from .model import session as session
-from .page import page as page
-from .state import ComputedVar as var
-from .state import Cookie as Cookie
-from .state import LocalStorage as LocalStorage
-from .state import State as State
-from .style import color_mode as color_mode
-from .style import toggle_color_mode as toggle_color_mode
-from .vars import Var as Var
-from .vars import cached_var as cached_var
+from reflex.page import page as page
+from reflex.utils.format import to_snake_case
+
+_ALL_COMPONENTS = [
+    "Accordion",
+    "AccordionButton",
+    "AccordionIcon",
+    "AccordionItem",
+    "AccordionPanel",
+    "Alert",
+    "AlertDescription",
+    "AlertDialog",
+    "AlertDialogBody",
+    "AlertDialogContent",
+    "AlertDialogFooter",
+    "AlertDialogHeader",
+    "AlertDialogOverlay",
+    "AlertIcon",
+    "AlertTitle",
+    "AspectRatio",
+    "Audio",
+    "Avatar",
+    "AvatarBadge",
+    "AvatarGroup",
+    "Badge",
+    "Box",
+    "Breadcrumb",
+    "BreadcrumbItem",
+    "BreadcrumbLink",
+    "BreadcrumbSeparator",
+    "Button",
+    "ButtonGroup",
+    "Card",
+    "CardBody",
+    "CardFooter",
+    "CardHeader",
+    "Center",
+    "Checkbox",
+    "CheckboxGroup",
+    "CircularProgress",
+    "CircularProgressLabel",
+    "Circle",
+    "Code",
+    "CodeBlock",
+    "Collapse",
+    "ColorModeButton",
+    "ColorModeIcon",
+    "ColorModeSwitch",
+    "Component",
+    "Cond",
+    "Container",
+    "DataTable",
+    "DataEditor",
+    "DebounceInput",
+    "Divider",
+    "Drawer",
+    "DrawerBody",
+    "DrawerCloseButton",
+    "DrawerContent",
+    "DrawerFooter",
+    "DrawerHeader",
+    "DrawerOverlay",
+    "Editable",
+    "EditableInput",
+    "EditablePreview",
+    "EditableTextarea",
+    "Editor",
+    "Email",
+    "Fade",
+    "Flex",
+    "Foreach",
+    "Form",
+    "FormControl",
+    "FormErrorMessage",
+    "FormHelperText",
+    "FormLabel",
+    "Fragment",
+    "Grid",
+    "GridItem",
+    "Heading",
+    "Highlight",
+    "Hstack",
+    "Html",
+    "Icon",
+    "IconButton",
+    "Image",
+    "Input",
+    "InputGroup",
+    "InputLeftAddon",
+    "InputLeftElement",
+    "InputRightAddon",
+    "InputRightElement",
+    "Kbd",
+    "Link",
+    "LinkBox",
+    "LinkOverlay",
+    "List",
+    "ListItem",
+    "Markdown",
+    "Menu",
+    "MenuButton",
+    "MenuDivider",
+    "MenuGroup",
+    "MenuItem",
+    "MenuItemOption",
+    "MenuList",
+    "MenuOptionGroup",
+    "Modal",
+    "ModalBody",
+    "ModalCloseButton",
+    "ModalContent",
+    "ModalFooter",
+    "ModalHeader",
+    "ModalOverlay",
+    "Moment",
+    "MultiSelect",
+    "MultiSelectOption",
+    "NextLink",
+    "NumberDecrementStepper",
+    "NumberIncrementStepper",
+    "NumberInput",
+    "NumberInputField",
+    "NumberInputStepper",
+    "Option",
+    "OrderedList",
+    "Password",
+    "PinInput",
+    "PinInputField",
+    "Plotly",
+    "Popover",
+    "PopoverAnchor",
+    "PopoverArrow",
+    "PopoverBody",
+    "PopoverCloseButton",
+    "PopoverContent",
+    "PopoverFooter",
+    "PopoverHeader",
+    "PopoverTrigger",
+    "Progress",
+    "Radio",
+    "RadioGroup",
+    "RangeSlider",
+    "RangeSliderFilledTrack",
+    "RangeSliderThumb",
+    "RangeSliderTrack",
+    "ResponsiveGrid",
+    "ScaleFade",
+    "Script",
+    "Select",
+    "Skeleton",
+    "SkeletonCircle",
+    "SkeletonText",
+    "Slide",
+    "SlideFade",
+    "Slider",
+    "SliderFilledTrack",
+    "SliderMark",
+    "SliderThumb",
+    "SliderTrack",
+    "Spacer",
+    "Span",
+    "Spinner",
+    "Square",
+    "Stack",
+    "Stat",
+    "StatArrow",
+    "StatGroup",
+    "StatHelpText",
+    "StatLabel",
+    "StatArrow",
+    "StatGroup",
+    "StatHelpText",
+    "StatLabel",
+    "StatNumber",
+    "Step",
+    "StepDescription",
+    "StepIcon",
+    "StepIndicator",
+    "StepNumber",
+    "StepSeparator",
+    "StepStatus",
+    "StepTitle",
+    "Stepper",
+    "Switch",
+    "Tab",
+    "TabList",
+    "TabPanel",
+    "TabPanels",
+    "Table",
+    "TableCaption",
+    "TableContainer",
+    "Tabs",
+    "Tag",
+    "TagCloseButton",
+    "TagLabel",
+    "TagLeftIcon",
+    "TagRightIcon",
+    "Tbody",
+    "Td",
+    "Text",
+    "TextArea",
+    "Tfoot",
+    "Th",
+    "Thead",
+    "Tooltip",
+    "Tr",
+    "UnorderedList",
+    "Upload",
+    "Video",
+    "VisuallyHidden",
+    "Vstack",
+    "Wrap",
+    "WrapItem",
+]
+
+_ALL_COMPONENTS += [to_snake_case(component) for component in _ALL_COMPONENTS]
+_ALL_COMPONENTS += [
+    "components",
+    "desktop_only",
+    "mobile_only",
+    "tablet_only",
+    "mobile_and_tablet",
+    "tablet_and_desktop",
+    "selected_files",
+    "clear_selected_files",
+    "EditorOptions",
+]
+
+_MAPPING = {
+    "reflex.admin": ["admin", "AdminDash"],
+    "reflex.app": ["app", "App", "UploadFile"],
+    "reflex.base": ["base", "Base"],
+    "reflex.compiler": ["compiler"],
+    "reflex.compiler.utils": ["get_asset_path"],
+    "reflex.components": _ALL_COMPONENTS,
+    "reflex.components.component": ["memo"],
+    "reflex.components.graphing": ["recharts"],
+    "reflex.config": ["config", "Config", "DBConfig"],
+    "reflex.constants": ["constants", "Env"],
+    "reflex.el": ["el"],
+    "reflex.event": [
+        "event",
+        "EventChain",
+        "background",
+        "call_script",
+        "clear_local_storage",
+        "console_log",
+        "download",
+        "prevent_default",
+        "redirect",
+        "remove_cookie",
+        "remove_local_storage",
+        "set_clipboard",
+        "set_focus",
+        "set_value",
+        "stop_propagation",
+        "upload_files",
+        "window_alert",
+    ],
+    "reflex.middleware": ["middleware", "Middleware"],
+    "reflex.model": ["model", "session", "Model"],
+    "reflex.page": ["page"],
+    "reflex.route": ["route"],
+    "reflex.state": ["state", "var", "Cookie", "LocalStorage", "State"],
+    "reflex.style": ["style", "color_mode", "toggle_color_mode"],
+    "reflex.testing": ["testing"],
+    "reflex.utils": ["utils"],
+    "reflex.vars": ["vars", "cached_var", "Var"],
+}
+_MAPPING = {value: key for key, values in _MAPPING.items() for value in values}
+
+
+def _removeprefix(text, prefix):
+    return text[text.startswith(prefix) and len(prefix) :]
+
+
+__all__ = [_removeprefix(mod, "reflex.") for mod in _MAPPING]
+
+
+def __getattr__(name: str) -> Type:
+    """Lazy load all modules.
+
+    Args:
+        name: name of the module to load.
+
+    Returns:
+        The module or the attribute of the module.
+
+    Raises:
+        AttributeError: If the module or the attribute does not exist.
+    """
+    try:
+        # Check for import of a module that is not in the mapping.
+        if name not in _MAPPING:
+            # If the name does not start with reflex, add it.
+            if not name.startswith("reflex") and name != "__all__":
+                name = f"reflex.{name}"
+            return importlib.import_module(name)
+
+        # Import the module.
+        module = importlib.import_module(_MAPPING[name])
+
+        # Get the attribute from the module if the name is not the module itself.
+        return (
+            getattr(module, name) if name != _MAPPING[name].rsplit(".")[-1] else module
+        )
+    except ModuleNotFoundError:
+        raise AttributeError(f"module 'reflex' has no attribute {name}") from None

+ 473 - 0
reflex/__init__.pyi

@@ -0,0 +1,473 @@
+from reflex import admin as admin
+from reflex.admin import AdminDash as AdminDash
+from reflex import app as app
+from reflex.app import App as App
+from reflex.app import UploadFile as UploadFile
+from reflex import base as base
+from reflex.base import Base as Base
+from reflex import compiler as compiler
+from reflex.compiler.utils import get_asset_path as get_asset_path
+from reflex.components import Accordion as Accordion
+from reflex.components import AccordionButton as AccordionButton
+from reflex.components import AccordionIcon as AccordionIcon
+from reflex.components import AccordionItem as AccordionItem
+from reflex.components import AccordionPanel as AccordionPanel
+from reflex.components import Alert as Alert
+from reflex.components import AlertDescription as AlertDescription
+from reflex.components import AlertDialog as AlertDialog
+from reflex.components import AlertDialogBody as AlertDialogBody
+from reflex.components import AlertDialogContent as AlertDialogContent
+from reflex.components import AlertDialogFooter as AlertDialogFooter
+from reflex.components import AlertDialogHeader as AlertDialogHeader
+from reflex.components import AlertDialogOverlay as AlertDialogOverlay
+from reflex.components import AlertIcon as AlertIcon
+from reflex.components import AlertTitle as AlertTitle
+from reflex.components import AspectRatio as AspectRatio
+from reflex.components import Audio as Audio
+from reflex.components import Avatar as Avatar
+from reflex.components import AvatarBadge as AvatarBadge
+from reflex.components import AvatarGroup as AvatarGroup
+from reflex.components import Badge as Badge
+from reflex.components import Box as Box
+from reflex.components import Breadcrumb as Breadcrumb
+from reflex.components import BreadcrumbItem as BreadcrumbItem
+from reflex.components import BreadcrumbLink as BreadcrumbLink
+from reflex.components import BreadcrumbSeparator as BreadcrumbSeparator
+from reflex.components import Button as Button
+from reflex.components import ButtonGroup as ButtonGroup
+from reflex.components import Card as Card
+from reflex.components import CardBody as CardBody
+from reflex.components import CardFooter as CardFooter
+from reflex.components import CardHeader as CardHeader
+from reflex.components import Center as Center
+from reflex.components import Checkbox as Checkbox
+from reflex.components import CheckboxGroup as CheckboxGroup
+from reflex.components import CircularProgress as CircularProgress
+from reflex.components import CircularProgressLabel as CircularProgressLabel
+from reflex.components import Circle as Circle
+from reflex.components import Code as Code
+from reflex.components import CodeBlock as CodeBlock
+from reflex.components import Collapse as Collapse
+from reflex.components import ColorModeButton as ColorModeButton
+from reflex.components import ColorModeIcon as ColorModeIcon
+from reflex.components import ColorModeSwitch as ColorModeSwitch
+from reflex.components import Component as Component
+from reflex.components import Cond as Cond
+from reflex.components import Container as Container
+from reflex.components import DataTable as DataTable
+from reflex.components import DataEditor as DataEditor
+from reflex.components import DebounceInput as DebounceInput
+from reflex.components import Divider as Divider
+from reflex.components import Drawer as Drawer
+from reflex.components import DrawerBody as DrawerBody
+from reflex.components import DrawerCloseButton as DrawerCloseButton
+from reflex.components import DrawerContent as DrawerContent
+from reflex.components import DrawerFooter as DrawerFooter
+from reflex.components import DrawerHeader as DrawerHeader
+from reflex.components import DrawerOverlay as DrawerOverlay
+from reflex.components import Editable as Editable
+from reflex.components import EditableInput as EditableInput
+from reflex.components import EditablePreview as EditablePreview
+from reflex.components import EditableTextarea as EditableTextarea
+from reflex.components import Editor as Editor
+from reflex.components import Email as Email
+from reflex.components import Fade as Fade
+from reflex.components import Flex as Flex
+from reflex.components import Foreach as Foreach
+from reflex.components import Form as Form
+from reflex.components import FormControl as FormControl
+from reflex.components import FormErrorMessage as FormErrorMessage
+from reflex.components import FormHelperText as FormHelperText
+from reflex.components import FormLabel as FormLabel
+from reflex.components import Fragment as Fragment
+from reflex.components import Grid as Grid
+from reflex.components import GridItem as GridItem
+from reflex.components import Heading as Heading
+from reflex.components import Highlight as Highlight
+from reflex.components import Hstack as Hstack
+from reflex.components import Html as Html
+from reflex.components import Icon as Icon
+from reflex.components import IconButton as IconButton
+from reflex.components import Image as Image
+from reflex.components import Input as Input
+from reflex.components import InputGroup as InputGroup
+from reflex.components import InputLeftAddon as InputLeftAddon
+from reflex.components import InputLeftElement as InputLeftElement
+from reflex.components import InputRightAddon as InputRightAddon
+from reflex.components import InputRightElement as InputRightElement
+from reflex.components import Kbd as Kbd
+from reflex.components import Link as Link
+from reflex.components import LinkBox as LinkBox
+from reflex.components import LinkOverlay as LinkOverlay
+from reflex.components import List as List
+from reflex.components import ListItem as ListItem
+from reflex.components import Markdown as Markdown
+from reflex.components import Menu as Menu
+from reflex.components import MenuButton as MenuButton
+from reflex.components import MenuDivider as MenuDivider
+from reflex.components import MenuGroup as MenuGroup
+from reflex.components import MenuItem as MenuItem
+from reflex.components import MenuItemOption as MenuItemOption
+from reflex.components import MenuList as MenuList
+from reflex.components import MenuOptionGroup as MenuOptionGroup
+from reflex.components import Modal as Modal
+from reflex.components import ModalBody as ModalBody
+from reflex.components import ModalCloseButton as ModalCloseButton
+from reflex.components import ModalContent as ModalContent
+from reflex.components import ModalFooter as ModalFooter
+from reflex.components import ModalHeader as ModalHeader
+from reflex.components import ModalOverlay as ModalOverlay
+from reflex.components import Moment as Moment
+from reflex.components import MultiSelect as MultiSelect
+from reflex.components import MultiSelectOption as MultiSelectOption
+from reflex.components import NextLink as NextLink
+from reflex.components import NumberDecrementStepper as NumberDecrementStepper
+from reflex.components import NumberIncrementStepper as NumberIncrementStepper
+from reflex.components import NumberInput as NumberInput
+from reflex.components import NumberInputField as NumberInputField
+from reflex.components import NumberInputStepper as NumberInputStepper
+from reflex.components import Option as Option
+from reflex.components import OrderedList as OrderedList
+from reflex.components import Password as Password
+from reflex.components import PinInput as PinInput
+from reflex.components import PinInputField as PinInputField
+from reflex.components import Plotly as Plotly
+from reflex.components import Popover as Popover
+from reflex.components import PopoverAnchor as PopoverAnchor
+from reflex.components import PopoverArrow as PopoverArrow
+from reflex.components import PopoverBody as PopoverBody
+from reflex.components import PopoverCloseButton as PopoverCloseButton
+from reflex.components import PopoverContent as PopoverContent
+from reflex.components import PopoverFooter as PopoverFooter
+from reflex.components import PopoverHeader as PopoverHeader
+from reflex.components import PopoverTrigger as PopoverTrigger
+from reflex.components import Progress as Progress
+from reflex.components import Radio as Radio
+from reflex.components import RadioGroup as RadioGroup
+from reflex.components import RangeSlider as RangeSlider
+from reflex.components import RangeSliderFilledTrack as RangeSliderFilledTrack
+from reflex.components import RangeSliderThumb as RangeSliderThumb
+from reflex.components import RangeSliderTrack as RangeSliderTrack
+from reflex.components import ResponsiveGrid as ResponsiveGrid
+from reflex.components import ScaleFade as ScaleFade
+from reflex.components import Script as Script
+from reflex.components import Select as Select
+from reflex.components import Skeleton as Skeleton
+from reflex.components import SkeletonCircle as SkeletonCircle
+from reflex.components import SkeletonText as SkeletonText
+from reflex.components import Slide as Slide
+from reflex.components import SlideFade as SlideFade
+from reflex.components import Slider as Slider
+from reflex.components import SliderFilledTrack as SliderFilledTrack
+from reflex.components import SliderMark as SliderMark
+from reflex.components import SliderThumb as SliderThumb
+from reflex.components import SliderTrack as SliderTrack
+from reflex.components import Spacer as Spacer
+from reflex.components import Span as Span
+from reflex.components import Spinner as Spinner
+from reflex.components import Square as Square
+from reflex.components import Stack as Stack
+from reflex.components import Stat as Stat
+from reflex.components import StatArrow as StatArrow
+from reflex.components import StatGroup as StatGroup
+from reflex.components import StatHelpText as StatHelpText
+from reflex.components import StatLabel as StatLabel
+from reflex.components import StatNumber as StatNumber
+from reflex.components import Step as Step
+from reflex.components import StepDescription as StepDescription
+from reflex.components import StepIcon as StepIcon
+from reflex.components import StepIndicator as StepIndicator
+from reflex.components import StepNumber as StepNumber
+from reflex.components import StepSeparator as StepSeparator
+from reflex.components import StepStatus as StepStatus
+from reflex.components import StepTitle as StepTitle
+from reflex.components import Stepper as Stepper
+from reflex.components import Switch as Switch
+from reflex.components import Tab as Tab
+from reflex.components import TabList as TabList
+from reflex.components import TabPanel as TabPanel
+from reflex.components import TabPanels as TabPanels
+from reflex.components import Table as Table
+from reflex.components import TableCaption as TableCaption
+from reflex.components import TableContainer as TableContainer
+from reflex.components import Tabs as Tabs
+from reflex.components import Tag as Tag
+from reflex.components import TagCloseButton as TagCloseButton
+from reflex.components import TagLabel as TagLabel
+from reflex.components import TagLeftIcon as TagLeftIcon
+from reflex.components import TagRightIcon as TagRightIcon
+from reflex.components import Tbody as Tbody
+from reflex.components import Td as Td
+from reflex.components import Text as Text
+from reflex.components import TextArea as TextArea
+from reflex.components import Tfoot as Tfoot
+from reflex.components import Th as Th
+from reflex.components import Thead as Thead
+from reflex.components import Tooltip as Tooltip
+from reflex.components import Tr as Tr
+from reflex.components import UnorderedList as UnorderedList
+from reflex.components import Upload as Upload
+from reflex.components import Video as Video
+from reflex.components import VisuallyHidden as VisuallyHidden
+from reflex.components import Vstack as Vstack
+from reflex.components import Wrap as Wrap
+from reflex.components import WrapItem as WrapItem
+from reflex.components import accordion as accordion
+from reflex.components import accordion_button as accordion_button
+from reflex.components import accordion_icon as accordion_icon
+from reflex.components import accordion_item as accordion_item
+from reflex.components import accordion_panel as accordion_panel
+from reflex.components import alert as alert
+from reflex.components import alert_description as alert_description
+from reflex.components import alert_dialog as alert_dialog
+from reflex.components import alert_dialog_body as alert_dialog_body
+from reflex.components import alert_dialog_content as alert_dialog_content
+from reflex.components import alert_dialog_footer as alert_dialog_footer
+from reflex.components import alert_dialog_header as alert_dialog_header
+from reflex.components import alert_dialog_overlay as alert_dialog_overlay
+from reflex.components import alert_icon as alert_icon
+from reflex.components import alert_title as alert_title
+from reflex.components import aspect_ratio as aspect_ratio
+from reflex.components import audio as audio
+from reflex.components import avatar as avatar
+from reflex.components import avatar_badge as avatar_badge
+from reflex.components import avatar_group as avatar_group
+from reflex.components import badge as badge
+from reflex.components import box as box
+from reflex.components import breadcrumb as breadcrumb
+from reflex.components import breadcrumb_item as breadcrumb_item
+from reflex.components import breadcrumb_link as breadcrumb_link
+from reflex.components import breadcrumb_separator as breadcrumb_separator
+from reflex.components import button as button
+from reflex.components import button_group as button_group
+from reflex.components import card as card
+from reflex.components import card_body as card_body
+from reflex.components import card_footer as card_footer
+from reflex.components import card_header as card_header
+from reflex.components import center as center
+from reflex.components import checkbox as checkbox
+from reflex.components import checkbox_group as checkbox_group
+from reflex.components import circular_progress as circular_progress
+from reflex.components import circular_progress_label as circular_progress_label
+from reflex.components import circle as circle
+from reflex.components import code as code
+from reflex.components import code_block as code_block
+from reflex.components import collapse as collapse
+from reflex.components import color_mode_button as color_mode_button
+from reflex.components import color_mode_icon as color_mode_icon
+from reflex.components import color_mode_switch as color_mode_switch
+from reflex.components import component as component
+from reflex.components import cond as cond
+from reflex.components import container as container
+from reflex.components import data_table as data_table
+from reflex.components import data_editor as data_editor
+from reflex.components import debounce_input as debounce_input
+from reflex.components import divider as divider
+from reflex.components import drawer as drawer
+from reflex.components import drawer_body as drawer_body
+from reflex.components import drawer_close_button as drawer_close_button
+from reflex.components import drawer_content as drawer_content
+from reflex.components import drawer_footer as drawer_footer
+from reflex.components import drawer_header as drawer_header
+from reflex.components import drawer_overlay as drawer_overlay
+from reflex.components import editable as editable
+from reflex.components import editable_input as editable_input
+from reflex.components import editable_preview as editable_preview
+from reflex.components import editable_textarea as editable_textarea
+from reflex.components import editor as editor
+from reflex.components import email as email
+from reflex.components import fade as fade
+from reflex.components import flex as flex
+from reflex.components import foreach as foreach
+from reflex.components import form as form
+from reflex.components import form_control as form_control
+from reflex.components import form_error_message as form_error_message
+from reflex.components import form_helper_text as form_helper_text
+from reflex.components import form_label as form_label
+from reflex.components import fragment as fragment
+from reflex.components import grid as grid
+from reflex.components import grid_item as grid_item
+from reflex.components import heading as heading
+from reflex.components import highlight as highlight
+from reflex.components import hstack as hstack
+from reflex.components import html as html
+from reflex.components import icon as icon
+from reflex.components import icon_button as icon_button
+from reflex.components import image as image
+from reflex.components import input as input
+from reflex.components import input_group as input_group
+from reflex.components import input_left_addon as input_left_addon
+from reflex.components import input_left_element as input_left_element
+from reflex.components import input_right_addon as input_right_addon
+from reflex.components import input_right_element as input_right_element
+from reflex.components import kbd as kbd
+from reflex.components import link as link
+from reflex.components import link_box as link_box
+from reflex.components import link_overlay as link_overlay
+from reflex.components import list as list
+from reflex.components import list_item as list_item
+from reflex.components import markdown as markdown
+from reflex.components import menu as menu
+from reflex.components import menu_button as menu_button
+from reflex.components import menu_divider as menu_divider
+from reflex.components import menu_group as menu_group
+from reflex.components import menu_item as menu_item
+from reflex.components import menu_item_option as menu_item_option
+from reflex.components import menu_list as menu_list
+from reflex.components import menu_option_group as menu_option_group
+from reflex.components import modal as modal
+from reflex.components import modal_body as modal_body
+from reflex.components import modal_close_button as modal_close_button
+from reflex.components import modal_content as modal_content
+from reflex.components import modal_footer as modal_footer
+from reflex.components import modal_header as modal_header
+from reflex.components import modal_overlay as modal_overlay
+from reflex.components import moment as moment
+from reflex.components import multi_select as multi_select
+from reflex.components import multi_select_option as multi_select_option
+from reflex.components import next_link as next_link
+from reflex.components import number_decrement_stepper as number_decrement_stepper
+from reflex.components import number_increment_stepper as number_increment_stepper
+from reflex.components import number_input as number_input
+from reflex.components import number_input_field as number_input_field
+from reflex.components import number_input_stepper as number_input_stepper
+from reflex.components import option as option
+from reflex.components import ordered_list as ordered_list
+from reflex.components import password as password
+from reflex.components import pin_input as pin_input
+from reflex.components import pin_input_field as pin_input_field
+from reflex.components import plotly as plotly
+from reflex.components import popover as popover
+from reflex.components import popover_anchor as popover_anchor
+from reflex.components import popover_arrow as popover_arrow
+from reflex.components import popover_body as popover_body
+from reflex.components import popover_close_button as popover_close_button
+from reflex.components import popover_content as popover_content
+from reflex.components import popover_footer as popover_footer
+from reflex.components import popover_header as popover_header
+from reflex.components import popover_trigger as popover_trigger
+from reflex.components import progress as progress
+from reflex.components import radio as radio
+from reflex.components import radio_group as radio_group
+from reflex.components import range_slider as range_slider
+from reflex.components import range_slider_filled_track as range_slider_filled_track
+from reflex.components import range_slider_thumb as range_slider_thumb
+from reflex.components import range_slider_track as range_slider_track
+from reflex.components import responsive_grid as responsive_grid
+from reflex.components import scale_fade as scale_fade
+from reflex.components import script as script
+from reflex.components import select as select
+from reflex.components import skeleton as skeleton
+from reflex.components import skeleton_circle as skeleton_circle
+from reflex.components import skeleton_text as skeleton_text
+from reflex.components import slide as slide
+from reflex.components import slide_fade as slide_fade
+from reflex.components import slider as slider
+from reflex.components import slider_filled_track as slider_filled_track
+from reflex.components import slider_mark as slider_mark
+from reflex.components import slider_thumb as slider_thumb
+from reflex.components import slider_track as slider_track
+from reflex.components import spacer as spacer
+from reflex.components import span as span
+from reflex.components import spinner as spinner
+from reflex.components import square as square
+from reflex.components import stack as stack
+from reflex.components import stat as stat
+from reflex.components import stat_arrow as stat_arrow
+from reflex.components import stat_group as stat_group
+from reflex.components import stat_help_text as stat_help_text
+from reflex.components import stat_label as stat_label
+from reflex.components import stat_number as stat_number
+from reflex.components import step as step
+from reflex.components import step_description as step_description
+from reflex.components import step_icon as step_icon
+from reflex.components import step_indicator as step_indicator
+from reflex.components import step_number as step_number
+from reflex.components import step_separator as step_separator
+from reflex.components import step_status as step_status
+from reflex.components import step_title as step_title
+from reflex.components import stepper as stepper
+from reflex.components import switch as switch
+from reflex.components import tab as tab
+from reflex.components import tab_list as tab_list
+from reflex.components import tab_panel as tab_panel
+from reflex.components import tab_panels as tab_panels
+from reflex.components import table as table
+from reflex.components import table_caption as table_caption
+from reflex.components import table_container as table_container
+from reflex.components import tabs as tabs
+from reflex.components import tag as tag
+from reflex.components import tag_close_button as tag_close_button
+from reflex.components import tag_label as tag_label
+from reflex.components import tag_left_icon as tag_left_icon
+from reflex.components import tag_right_icon as tag_right_icon
+from reflex.components import tbody as tbody
+from reflex.components import td as td
+from reflex.components import text as text
+from reflex.components import text_area as text_area
+from reflex.components import tfoot as tfoot
+from reflex.components import th as th
+from reflex.components import thead as thead
+from reflex.components import tooltip as tooltip
+from reflex.components import tr as tr
+from reflex.components import unordered_list as unordered_list
+from reflex.components import upload as upload
+from reflex.components import video as video
+from reflex.components import visually_hidden as visually_hidden
+from reflex.components import vstack as vstack
+from reflex.components import wrap as wrap
+from reflex.components import wrap_item as wrap_item
+from reflex import components as components
+from reflex.components import desktop_only as desktop_only
+from reflex.components import mobile_only as mobile_only
+from reflex.components import tablet_only as tablet_only
+from reflex.components import mobile_and_tablet as mobile_and_tablet
+from reflex.components import tablet_and_desktop as tablet_and_desktop
+from reflex.components import selected_files as selected_files
+from reflex.components import clear_selected_files as clear_selected_files
+from reflex.components import EditorOptions as EditorOptions
+from reflex.components.component import memo as memo
+from reflex.components.graphing import recharts as recharts
+from reflex import config as config
+from reflex.config import Config as Config
+from reflex.config import DBConfig as DBConfig
+from reflex import constants as constants
+from reflex.constants import Env as Env
+from reflex import el as el
+from reflex import event as event
+from reflex.event import EventChain as EventChain
+from reflex.event import background as background
+from reflex.event import call_script as call_script
+from reflex.event import clear_local_storage as clear_local_storage
+from reflex.event import console_log as console_log
+from reflex.event import download as download
+from reflex.event import prevent_default as prevent_default
+from reflex.event import redirect as redirect
+from reflex.event import remove_cookie as remove_cookie
+from reflex.event import remove_local_storage as remove_local_storage
+from reflex.event import set_clipboard as set_clipboard
+from reflex.event import set_focus as set_focus
+from reflex.event import set_value as set_value
+from reflex.event import stop_propagation as stop_propagation
+from reflex.event import upload_files as upload_files
+from reflex.event import window_alert as window_alert
+from reflex import middleware as middleware
+from reflex.middleware import Middleware as Middleware
+from reflex import model as model
+from reflex.model import session as session
+from reflex.model import Model as Model
+from reflex.page import page as page
+from reflex import route as route
+from reflex import state as state
+from reflex.state import var as var
+from reflex.state import Cookie as Cookie
+from reflex.state import LocalStorage as LocalStorage
+from reflex.state import State as State
+from reflex import style as style
+from reflex.style import color_mode as color_mode
+from reflex.style import toggle_color_mode as toggle_color_mode
+from reflex import testing as testing
+from reflex import utils as utils
+from reflex import vars as vars
+from reflex.vars import cached_var as cached_var
+from reflex.vars import Var as Var

+ 138 - 138
reflex/components/__init__.py

@@ -26,157 +26,176 @@ from .typography import *
 
 # Add the convenience methods for all the components manually.
 # This is necessary for static type checking to work.
-component = Component.create
-badge = Badge.create
-code = Code.create
-code_block = CodeBlock.create
-connection_banner = ConnectionBanner.create
-connection_modal = ConnectionModal.create
-data_editor = DataEditor.create
-data_editor_theme = DataEditorTheme
-data_table = DataTable.create
-divider = Divider.create
-list = List.create
-list_item = ListItem.create
-ordered_list = OrderedList.create
-unordered_list = UnorderedList.create
-stat = Stat.create
-stat_arrow = StatArrow.create
-stat_group = StatGroup.create
-stat_help_text = StatHelpText.create
-stat_label = StatLabel.create
-stat_number = StatNumber.create
-tag = Tag.create
-tag_label = TagLabel.create
-tag_left_icon = TagLeftIcon.create
-tag_right_icon = TagRightIcon.create
-tag_close_button = TagCloseButton.create
-table = Table.create
-table_caption = TableCaption.create
-table_container = TableContainer.create
-tbody = Tbody.create
-td = Td.create
-tfoot = Tfoot.create
-th = Th.create
-thead = Thead.create
-tr = Tr.create
 accordion = Accordion.create
 accordion_button = AccordionButton.create
 accordion_icon = AccordionIcon.create
 accordion_item = AccordionItem.create
 accordion_panel = AccordionPanel.create
-tab = Tab.create
-tab_list = TabList.create
-tab_panel = TabPanel.create
-tab_panels = TabPanels.create
-tabs = Tabs.create
-visually_hidden = VisuallyHidden.create
-fade = Fade.create
-scale_fade = ScaleFade.create
-slide = Slide.create
-slide_fade = SlideFade.create
-collapse = Collapse.create
 alert = Alert.create
 alert_description = AlertDescription.create
+alert_dialog = AlertDialog.create
+alert_dialog_body = AlertDialogBody.create
+alert_dialog_content = AlertDialogContent.create
+alert_dialog_footer = AlertDialogFooter.create
+alert_dialog_header = AlertDialogHeader.create
+alert_dialog_overlay = AlertDialogOverlay.create
 alert_icon = AlertIcon.create
 alert_title = AlertTitle.create
+aspect_ratio = AspectRatio.create
+audio = Audio.create
+avatar = Avatar.create
+avatar_badge = AvatarBadge.create
+avatar_group = AvatarGroup.create
+badge = Badge.create
+box = Box.create
+breadcrumb = Breadcrumb.create
+breadcrumb_item = BreadcrumbItem.create
+breadcrumb_link = BreadcrumbLink.create
+breadcrumb_separator = BreadcrumbSeparator.create
+button = Button.create
+button_group = ButtonGroup.create
 card = Card.create
 card_body = CardBody.create
 card_footer = CardFooter.create
 card_header = CardHeader.create
-circular_progress = CircularProgress.create
-circular_progress_label = CircularProgressLabel.create
-progress = Progress.create
-skeleton = Skeleton.create
-skeleton_circle = SkeletonCircle.create
-skeleton_text = SkeletonText.create
-spinner = Spinner.create
-button = Button.create
-button_group = ButtonGroup.create
+center = Center.create
 checkbox = Checkbox.create
 checkbox_group = CheckboxGroup.create
+circle = Circle.create
+circular_progress = CircularProgress.create
+circular_progress_label = CircularProgressLabel.create
+code = Code.create
+code_block = CodeBlock.create
+collapse = Collapse.create
+color_mode_button = ColorModeButton.create
+color_mode_icon = ColorModeIcon.create
+color_mode_switch = ColorModeSwitch.create
+component = Component.create
+connection_banner = ConnectionBanner.create
+connection_modal = ConnectionModal.create
+container = Container.create
+data_editor = DataEditor.create
+data_editor_theme = DataEditorTheme
+data_table = DataTable.create
 date_picker = DatePicker.create
 date_time_picker = DateTimePicker.create
 debounce_input = DebounceInput.create
+divider = Divider.create
+drawer = Drawer.create
+drawer_body = DrawerBody.create
+drawer_close_button = DrawerCloseButton.create
+drawer_content = DrawerContent.create
+drawer_footer = DrawerFooter.create
+drawer_header = DrawerHeader.create
+drawer_overlay = DrawerOverlay.create
 editable = Editable.create
 editable_input = EditableInput.create
 editable_preview = EditablePreview.create
 editable_textarea = EditableTextarea.create
 editor = Editor.create
+email = Email.create
+fade = Fade.create
+flex = Flex.create
+foreach = Foreach.create
 form = Form.create
 form_control = FormControl.create
 form_error_message = FormErrorMessage.create
 form_helper_text = FormHelperText.create
 form_label = FormLabel.create
+fragment = Fragment.create
+grid = Grid.create
+grid_item = GridItem.create
+heading = Heading.create
+highlight = Highlight.create
+hstack = Hstack.create
+html = Html.create
+icon = Icon.create
 icon_button = IconButton.create
+image = Image.create
 input = Input.create
 input_group = InputGroup.create
 input_left_addon = InputLeftAddon.create
-input_right_addon = InputRightAddon.create
 input_left_element = InputLeftElement.create
+input_right_addon = InputRightAddon.create
 input_right_element = InputRightElement.create
+kbd = Kbd.create
+link = Link.create
+link_box = LinkBox.create
+link_overlay = LinkOverlay.create
+list = List.create
+list_item = ListItem.create
+markdown = Markdown.create
+menu = Menu.create
+menu_button = MenuButton.create
+menu_divider = MenuDivider.create
+menu_group = MenuGroup.create
+menu_item = MenuItem.create
+menu_item_option = MenuItemOption.create
+menu_list = MenuList.create
+menu_option_group = MenuOptionGroup.create
+modal = Modal.create
+modal_body = ModalBody.create
+modal_close_button = ModalCloseButton.create
+modal_content = ModalContent.create
+modal_footer = ModalFooter.create
+modal_header = ModalHeader.create
+modal_overlay = ModalOverlay.create
 moment = Moment.create
 multi_select = MultiSelect.create
 multi_select_option = MultiSelectOption
+next_link = NextLink.create
 number_decrement_stepper = NumberDecrementStepper.create
 number_increment_stepper = NumberIncrementStepper.create
 number_input = NumberInput.create
 number_input_field = NumberInputField.create
 number_input_stepper = NumberInputStepper.create
 option = Option.create
+ordered_list = OrderedList.create
 password = Password.create
-email = Email.create
 pin_input = PinInput.create
 pin_input_field = PinInputField.create
+plotly = Plotly.create
+popover = Popover.create
+popover_anchor = PopoverAnchor.create
+popover_arrow = PopoverArrow.create
+popover_body = PopoverBody.create
+popover_close_button = PopoverCloseButton.create
+popover_content = PopoverContent.create
+popover_footer = PopoverFooter.create
+popover_header = PopoverHeader.create
+popover_trigger = PopoverTrigger.create
+progress = Progress.create
 radio = Radio.create
 radio_group = RadioGroup.create
 range_slider = RangeSlider.create
 range_slider_filled_track = RangeSliderFilledTrack.create
 range_slider_thumb = RangeSliderThumb.create
 range_slider_track = RangeSliderTrack.create
+responsive_grid = ResponsiveGrid.create
+scale_fade = ScaleFade.create
+script = Script.create
 select = Select.create
+skeleton = Skeleton.create
+skeleton_circle = SkeletonCircle.create
+skeleton_text = SkeletonText.create
+slide = Slide.create
+slide_fade = SlideFade.create
 slider = Slider.create
 slider_filled_track = SliderFilledTrack.create
 slider_mark = SliderMark.create
 slider_thumb = SliderThumb.create
 slider_track = SliderTrack.create
-switch = Switch.create
-text_area = TextArea.create
-upload = Upload.create
-plotly = Plotly.create
-box = Box.create
-center = Center.create
-circle = Circle.create
-container = Container.create
-flex = Flex.create
-foreach = Foreach.create
-fragment = Fragment.create
-grid = Grid.create
-grid_item = GridItem.create
-hstack = Hstack.create
-html = Html.create
-responsive_grid = ResponsiveGrid.create
 spacer = Spacer.create
+span = Span.create
+spinner = Spinner.create
 square = Square.create
 stack = Stack.create
-vstack = Vstack.create
-wrap = Wrap.create
-wrap_item = WrapItem.create
-avatar = Avatar.create
-avatar_badge = AvatarBadge.create
-avatar_group = AvatarGroup.create
-icon = Icon.create
-image = Image.create
-video = Video.create
-audio = Audio.create
-breadcrumb = Breadcrumb.create
-breadcrumb_item = BreadcrumbItem.create
-breadcrumb_link = BreadcrumbLink.create
-breadcrumb_separator = BreadcrumbSeparator.create
-link = Link.create
-link_box = LinkBox.create
-link_overlay = LinkOverlay.create
-next_link = NextLink.create
+stat = Stat.create
+stat_arrow = StatArrow.create
+stat_group = StatGroup.create
+stat_help_text = StatHelpText.create
+stat_label = StatLabel.create
+stat_number = StatNumber.create
 step = Step.create
 step_description = StepDescription.create
 step_icon = StepIcon.create
@@ -186,52 +205,33 @@ step_separator = StepSeparator.create
 step_status = StepStatus.create
 step_title = StepTitle.create
 stepper = Stepper.create
-alert_dialog = AlertDialog.create
-alert_dialog_body = AlertDialogBody.create
-alert_dialog_content = AlertDialogContent.create
-alert_dialog_footer = AlertDialogFooter.create
-alert_dialog_header = AlertDialogHeader.create
-alert_dialog_overlay = AlertDialogOverlay.create
-drawer = Drawer.create
-drawer_body = DrawerBody.create
-drawer_close_button = DrawerCloseButton.create
-drawer_content = DrawerContent.create
-drawer_footer = DrawerFooter.create
-drawer_header = DrawerHeader.create
-drawer_overlay = DrawerOverlay.create
-menu = Menu.create
-menu_button = MenuButton.create
-menu_divider = MenuDivider.create
-menu_group = MenuGroup.create
-menu_item = MenuItem.create
-menu_item_option = MenuItemOption.create
-menu_list = MenuList.create
-menu_option_group = MenuOptionGroup.create
-modal = Modal.create
-modal_body = ModalBody.create
-modal_close_button = ModalCloseButton.create
-modal_content = ModalContent.create
-modal_footer = ModalFooter.create
-modal_header = ModalHeader.create
-modal_overlay = ModalOverlay.create
-popover = Popover.create
-popover_anchor = PopoverAnchor.create
-popover_arrow = PopoverArrow.create
-popover_body = PopoverBody.create
-popover_close_button = PopoverCloseButton.create
-popover_content = PopoverContent.create
-popover_footer = PopoverFooter.create
-popover_header = PopoverHeader.create
-popover_trigger = PopoverTrigger.create
-tooltip = Tooltip.create
-heading = Heading.create
-highlight = Highlight.create
-markdown = Markdown.create
-span = Span.create
+switch = Switch.create
+tab = Tab.create
+tab_list = TabList.create
+tab_panel = TabPanel.create
+tab_panels = TabPanels.create
+table = Table.create
+table_caption = TableCaption.create
+table_container = TableContainer.create
+tabs = Tabs.create
+tag = Tag.create
+tag_close_button = TagCloseButton.create
+tag_label = TagLabel.create
+tag_left_icon = TagLeftIcon.create
+tag_right_icon = TagRightIcon.create
+tbody = Tbody.create
+td = Td.create
 text = Text.create
-script = Script.create
-aspect_ratio = AspectRatio.create
-kbd = KeyboardKey.create
-color_mode_button = ColorModeButton.create
-color_mode_icon = ColorModeIcon.create
-color_mode_switch = ColorModeSwitch.create
+text_area = TextArea.create
+tfoot = Tfoot.create
+th = Th.create
+thead = Thead.create
+tooltip = Tooltip.create
+tr = Tr.create
+unordered_list = UnorderedList.create
+upload = Upload.create
+video = Video.create
+visually_hidden = VisuallyHidden.create
+vstack = Vstack.create
+wrap = Wrap.create
+wrap_item = WrapItem.create

+ 4 - 0
reflex/components/component.py

@@ -1000,6 +1000,10 @@ def custom_component(
     return wrapper
 
 
+# Alias memo to custom_component.
+memo = custom_component
+
+
 class NoSSRComponent(Component):
     """A dynamic component that is not rendered on the server."""
 

+ 1 - 1
reflex/components/datadisplay/__init__.py

@@ -7,7 +7,7 @@ from .code import LiteralCodeLanguage as LiteralCodeLanguage
 from .dataeditor import DataEditor, DataEditorTheme
 from .datatable import DataTable
 from .divider import Divider
-from .keyboard_key import KeyboardKey
+from .keyboard_key import KeyboardKey as Kbd
 from .list import List, ListItem, OrderedList, UnorderedList
 from .moment import Moment
 from .stat import Stat, StatArrow, StatGroup, StatHelpText, StatLabel, StatNumber

+ 4 - 0
reflex/event.py

@@ -270,6 +270,10 @@ class FileUpload(Base):
     pass
 
 
+# Alias for rx.upload_files
+upload_files = FileUpload
+
+
 # Special server-side events.
 def server_side(name: str, sig: inspect.Signature, **kwargs) -> EventSpec:
     """A server-side event.

+ 3 - 4
reflex/page.py

@@ -2,8 +2,7 @@
 
 from __future__ import annotations
 
-from reflex.components.component import Component
-from reflex.event import EventHandler
+from typing import Any
 
 DECORATED_PAGES = []
 
@@ -14,8 +13,8 @@ def page(
     image: str | None = None,
     description: str | None = None,
     meta: str | None = None,
-    script_tags: list[Component] | None = None,
-    on_load: EventHandler | list[EventHandler] | None = None,
+    script_tags: list[Any] | None = None,
+    on_load: Any | list[Any] | None = None,
 ):
     """Decorate a function as a page.
 

+ 17 - 0
reflex/page.pyi

@@ -0,0 +1,17 @@
+"""The page decorator and associated variables and functions."""
+
+from reflex.components.component import Component
+from reflex.event import EventHandler
+
+DECORATED_PAGES: list
+
+def page(
+    route: str | None = None,
+    title: str | None = None,
+    image: str | None = None,
+    description: str | None = None,
+    meta: str | None = None,
+    script_tags: list[Component] | None = None,
+    on_load: EventHandler | list[EventHandler] | None = None,
+): ...
+def get_decorated_pages() -> list[dict]: ...

+ 1 - 0
reflex/state.py

@@ -47,6 +47,7 @@ from reflex.utils.serializers import SerializedType, serialize, serializer
 from reflex.vars import BaseVar, ComputedVar, Var
 
 Delta = Dict[str, Any]
+var = ComputedVar
 
 
 class HeaderData(Base):

+ 14 - 0
scripts/pyi_generator.py

@@ -609,6 +609,19 @@ class PyiGenerator:
                 self._scan_folder(target)
 
 
+def generate_init():
+    """Generate a pyi file for the main __init__.py."""
+    from reflex import _MAPPING  # type: ignore
+
+    imports = [
+        f"from {path if mod != path.rsplit('.')[-1] or mod == 'page' else '.'.join(path.rsplit('.')[:-1])} import {mod} as {mod}"
+        for mod, path in _MAPPING.items()
+    ]
+
+    with open("reflex/__init__.pyi", "w") as pyi_file:
+        pyi_file.writelines("\n".join(imports))
+
+
 if __name__ == "__main__":
     logging.basicConfig(level=logging.DEBUG)
     logging.getLogger("blib2to3.pgen2.driver").setLevel(logging.INFO)
@@ -617,3 +630,4 @@ if __name__ == "__main__":
     logger.info(f"Running .pyi generator for {targets}")
     gen = PyiGenerator()
     gen.scan_all(targets)
+    generate_init()

+ 3 - 3
tests/test_state.py

@@ -905,7 +905,7 @@ class InterdependentState(State):
         Returns:
             ComputedVar v1x2 multiplied by 2
         """
-        return self.v1x2 * 2
+        return self.v1x2 * 2  # type: ignore
 
 
 @pytest.fixture
@@ -1105,7 +1105,7 @@ def test_computed_var_cached_depends_on_non_cached():
 
         @rx.cached_var
         def dep_v(self) -> int:
-            return self.no_cache_v
+            return self.no_cache_v  # type: ignore
 
         @rx.cached_var
         def comp_v(self) -> int:
@@ -1148,7 +1148,7 @@ def test_computed_var_depends_on_parent_non_cached():
     class ChildState(ParentState):
         @rx.cached_var
         def dep_v(self) -> int:
-            return self.no_cache_v
+            return self.no_cache_v  # type: ignore
 
     ps = ParentState()
     cs = ps.substates[ChildState.get_name()]