From 4c0b49135bd551c1d72d7830e69a77e42901b825 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Brand=C3=A9ho?= Date: Wed, 6 Nov 2024 13:32:31 -0800 Subject: [PATCH 1/6] stop ignoring some lint rules (#4311) * bump python packages version * stop ignoring some lint rules that pass ruff check * stop ignoring rule F541 * remove sneaky test file --- benchmarks/test_benchmark_compile_pages.py | 10 ++--- pyproject.toml | 2 +- reflex/components/component.py | 1 - reflex/components/core/banner.py | 2 +- .../datadisplay/shiki_code_block.py | 37 +++++++++---------- reflex/components/lucide/icon.py | 2 +- .../components/radix/primitives/accordion.py | 6 +-- reflex/components/radix/themes/base.py | 2 +- reflex/constants/base.py | 2 +- reflex/custom_components/custom_components.py | 8 ++-- reflex/reflex.py | 2 +- reflex/utils/console.py | 1 - reflex/utils/exec.py | 2 +- tests/integration/test_background_task.py | 2 +- tests/integration/test_computed_vars.py | 2 +- tests/integration/test_dynamic_routes.py | 2 +- tests/integration/test_event_actions.py | 2 +- tests/integration/test_large_state.py | 2 +- tests/integration/test_navigation.py | 2 +- tests/integration/test_server_side_event.py | 1 - tests/integration/test_state_inheritance.py | 2 +- tests/integration/test_upload.py | 4 +- tests/units/compiler/test_compiler.py | 10 ++--- tests/units/components/core/test_debounce.py | 1 - tests/units/components/test_component.py | 2 +- tests/units/test_app.py | 4 +- tests/units/test_state.py | 2 +- tests/units/test_var.py | 2 +- tests/units/utils/test_serializers.py | 3 -- 29 files changed, 56 insertions(+), 64 deletions(-) diff --git a/benchmarks/test_benchmark_compile_pages.py b/benchmarks/test_benchmark_compile_pages.py index 4448bca45..f232eb627 100644 --- a/benchmarks/test_benchmark_compile_pages.py +++ b/benchmarks/test_benchmark_compile_pages.py @@ -210,7 +210,7 @@ def app_with_one_page( Yields: an AppHarness instance """ - root = tmp_path_factory.mktemp(f"app1") + root = tmp_path_factory.mktemp("app1") yield AppHarness.create(root=root, app_source=AppWithOnePage) # type: ignore @@ -227,7 +227,7 @@ def app_with_ten_pages( Yields: an AppHarness instance """ - root = tmp_path_factory.mktemp(f"app10") + root = tmp_path_factory.mktemp("app10") yield AppHarness.create( root=root, app_source=functools.partial( @@ -249,7 +249,7 @@ def app_with_hundred_pages( Yields: an AppHarness instance """ - root = tmp_path_factory.mktemp(f"app100") + root = tmp_path_factory.mktemp("app100") yield AppHarness.create( root=root, @@ -272,7 +272,7 @@ def app_with_thousand_pages( Yields: an AppHarness instance """ - root = tmp_path_factory.mktemp(f"app1000") + root = tmp_path_factory.mktemp("app1000") yield AppHarness.create( root=root, @@ -295,7 +295,7 @@ def app_with_ten_thousand_pages( Yields: running AppHarness instance """ - root = tmp_path_factory.mktemp(f"app10000") + root = tmp_path_factory.mktemp("app10000") yield AppHarness.create( root=root, diff --git a/pyproject.toml b/pyproject.toml index a3e3a17f6..585d4703f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -92,7 +92,7 @@ build-backend = "poetry.core.masonry.api" [tool.ruff] target-version = "py39" lint.select = ["B", "D", "E", "F", "I", "SIM", "W"] -lint.ignore = ["B008", "D203", "D205", "D213", "D401", "D406", "D407", "E501", "F403", "F405", "F541", "SIM115"] +lint.ignore = ["B008", "D205", "E501", "F403", "SIM115"] lint.pydocstyle.convention = "google" [tool.ruff.lint.per-file-ignores] diff --git a/reflex/components/component.py b/reflex/components/component.py index 9a9e49a9d..2b934277b 100644 --- a/reflex/components/component.py +++ b/reflex/components/component.py @@ -158,7 +158,6 @@ class ComponentNamespace(SimpleNamespace): def __hash__(self) -> int: """Get the hash of the namespace. - Returns: The hash of the namespace. """ diff --git a/reflex/components/core/banner.py b/reflex/components/core/banner.py index 8a37b0bf7..f6abbab90 100644 --- a/reflex/components/core/banner.py +++ b/reflex/components/core/banner.py @@ -110,7 +110,7 @@ class ConnectionToaster(Toaster): individual_hooks = [ f"const toast_props = {str(LiteralVar.create(props))};", - f"const [userDismissed, setUserDismissed] = useState(false);", + "const [userDismissed, setUserDismissed] = useState(false);", FunctionStringVar( "useEffect", _var_data=VarData( diff --git a/reflex/components/datadisplay/shiki_code_block.py b/reflex/components/datadisplay/shiki_code_block.py index 21f22424d..4a3e05d0e 100644 --- a/reflex/components/datadisplay/shiki_code_block.py +++ b/reflex/components/datadisplay/shiki_code_block.py @@ -26,49 +26,48 @@ from reflex.vars.sequence import StringVar, string_replace_operation def copy_script() -> Any: """Copy script for the code block and modify the child SVG element. - Returns: Any: The result of calling the script. """ return run_script( - f""" + """ // Event listener for the parent click -document.addEventListener('click', function(event) {{ +document.addEventListener('click', function(event) { // Find the closest button (parent element) const parent = event.target.closest('button'); // If the parent is found - if (parent) {{ + if (parent) { // Find the SVG element within the parent const svgIcon = parent.querySelector('svg'); // If the SVG exists, proceed with the script - if (svgIcon) {{ + if (svgIcon) { const originalPath = svgIcon.innerHTML; const checkmarkPath = ''; // Checkmark SVG path - function transition(element, scale, opacity) {{ - element.style.transform = `scale(${{scale}})`; + function transition(element, scale, opacity) { + element.style.transform = `scale(${scale})`; element.style.opacity = opacity; - }} + } // Animate the SVG transition(svgIcon, 0, '0'); - setTimeout(() => {{ + setTimeout(() => { svgIcon.innerHTML = checkmarkPath; // Replace content with checkmark svgIcon.setAttribute('viewBox', '0 0 24 24'); // Adjust viewBox if necessary transition(svgIcon, 1, '1'); - setTimeout(() => {{ + setTimeout(() => { transition(svgIcon, 0, '0'); - setTimeout(() => {{ + setTimeout(() => { svgIcon.innerHTML = originalPath; // Restore original SVG content transition(svgIcon, 1, '1'); - }}, 125); - }}, 600); - }}, 125); - }} else {{ + }, 125); + }, 600); + }, 125); + } else { // console.error('SVG element not found within the parent.'); - }} - }} else {{ + } + } else { // console.error('Parent element not found.'); - }} -}}) + } +}) """ ) diff --git a/reflex/components/lucide/icon.py b/reflex/components/lucide/icon.py index 1ee68aaa3..b32fb8de3 100644 --- a/reflex/components/lucide/icon.py +++ b/reflex/components/lucide/icon.py @@ -58,7 +58,7 @@ class Icon(LucideIconComponent): props["tag"] = format.to_title_case(format.to_snake_case(props["tag"])) + "Icon" props["alias"] = f"Lucide{props['tag']}" - props.setdefault("color", f"var(--current-color)") + props.setdefault("color", "var(--current-color)") return super().create(*children, **props) diff --git a/reflex/components/radix/primitives/accordion.py b/reflex/components/radix/primitives/accordion.py index 272274723..608fee69d 100644 --- a/reflex/components/radix/primitives/accordion.py +++ b/reflex/components/radix/primitives/accordion.py @@ -382,7 +382,7 @@ class AccordionTrigger(AccordionComponent): "background_color": color("accent", 4), }, "& > .AccordionChevron": { - "transition": f"transform var(--animation-duration) var(--animation-easing)", + "transition": "transform var(--animation-duration) var(--animation-easing)", }, _inherited_variant_selector("classic"): { "color": "var(--accent-contrast)", @@ -485,11 +485,11 @@ to { The style of the component. """ slideDown = LiteralVar.create( - f"${{slideDown}} var(--animation-duration) var(--animation-easing)", + "${slideDown} var(--animation-duration) var(--animation-easing)", ) slideUp = LiteralVar.create( - f"${{slideUp}} var(--animation-duration) var(--animation-easing)", + "${slideUp} var(--animation-duration) var(--animation-easing)", ) return { diff --git a/reflex/components/radix/themes/base.py b/reflex/components/radix/themes/base.py index acca1dce8..20ebdc5a6 100644 --- a/reflex/components/radix/themes/base.py +++ b/reflex/components/radix/themes/base.py @@ -236,7 +236,7 @@ class Theme(RadixThemesComponent): tag = super()._render(props) tag.add_props( css=Var( - _js_expr=f"{{...theme.styles.global[':root'], ...theme.styles.global.body}}" + _js_expr="{...theme.styles.global[':root'], ...theme.styles.global.body}" ), ) return tag diff --git a/reflex/constants/base.py b/reflex/constants/base.py index 5042b453e..798ac7dc6 100644 --- a/reflex/constants/base.py +++ b/reflex/constants/base.py @@ -78,7 +78,7 @@ class Reflex(SimpleNamespace): # The root directory of the reflex library. ROOT_DIR = Path(__file__).parents[2] - RELEASES_URL = f"https://api.github.com/repos/reflex-dev/templates/releases" + RELEASES_URL = "https://api.github.com/repos/reflex-dev/templates/releases" class ReflexHostingCLI(SimpleNamespace): diff --git a/reflex/custom_components/custom_components.py b/reflex/custom_components/custom_components.py index 7681caebc..6be64ae2d 100644 --- a/reflex/custom_components/custom_components.py +++ b/reflex/custom_components/custom_components.py @@ -779,8 +779,8 @@ def _validate_project_info(): ) # PyPI only shows the first author. author = project.get("authors", [{}])[0] - author["name"] = console.ask(f"Author Name", default=author.get("name", "")) - author["email"] = console.ask(f"Author Email", default=author.get("email", "")) + author["name"] = console.ask("Author Name", default=author.get("name", "")) + author["email"] = console.ask("Author Email", default=author.get("email", "")) console.print(f'Current keywords are: {project.get("keywords") or []}') keyword_action = console.ask( @@ -923,7 +923,7 @@ def _get_file_from_prompt_in_loop() -> Tuple[bytes, str] | None: image_file = file_extension = None while image_file is None: image_filepath = console.ask( - f"Upload a preview image of your demo app (enter to skip)" + "Upload a preview image of your demo app (enter to skip)" ) if not image_filepath: break @@ -973,6 +973,6 @@ def install( console.set_log_level(loglevel) if _pip_install_on_demand(package_name=".", install_args=["-e"]): - console.info(f"Package installed successfully!") + console.info("Package installed successfully!") else: raise typer.Exit(code=1) diff --git a/reflex/reflex.py b/reflex/reflex.py index 6ccba01d3..8c5f0fc6f 100644 --- a/reflex/reflex.py +++ b/reflex/reflex.py @@ -363,7 +363,7 @@ def _login() -> str: access_token = hosting.authenticate_on_browser(invitation_code) if not access_token: - console.error(f"Unable to authenticate. Please try again or contact support.") + console.error("Unable to authenticate. Please try again or contact support.") raise typer.Exit(1) console.print("Successfully logged in.") diff --git a/reflex/utils/console.py b/reflex/utils/console.py index 20c699e20..04e590910 100644 --- a/reflex/utils/console.py +++ b/reflex/utils/console.py @@ -191,7 +191,6 @@ def ask( def progress(): """Create a new progress bar. - Returns: A new progress bar. """ diff --git a/reflex/utils/exec.py b/reflex/utils/exec.py index fb613810a..5291de095 100644 --- a/reflex/utils/exec.py +++ b/reflex/utils/exec.py @@ -429,7 +429,7 @@ def output_system_info(): except Exception: config_file = None - console.rule(f"System Info") + console.rule("System Info") console.debug(f"Config file: {config_file!r}") console.debug(f"Config: {config}") diff --git a/tests/integration/test_background_task.py b/tests/integration/test_background_task.py index 87aa1459b..00cf83ea0 100644 --- a/tests/integration/test_background_task.py +++ b/tests/integration/test_background_task.py @@ -189,7 +189,7 @@ def background_task( running AppHarness instance """ with AppHarness.create( - root=tmp_path_factory.mktemp(f"background_task"), + root=tmp_path_factory.mktemp("background_task"), app_source=BackgroundTask, # type: ignore ) as harness: yield harness diff --git a/tests/integration/test_computed_vars.py b/tests/integration/test_computed_vars.py index 1f585cd8b..a39cb9e65 100644 --- a/tests/integration/test_computed_vars.py +++ b/tests/integration/test_computed_vars.py @@ -124,7 +124,7 @@ def computed_vars( running AppHarness instance """ with AppHarness.create( - root=tmp_path_factory.mktemp(f"computed_vars"), + root=tmp_path_factory.mktemp("computed_vars"), app_source=ComputedVars, # type: ignore ) as harness: yield harness diff --git a/tests/integration/test_dynamic_routes.py b/tests/integration/test_dynamic_routes.py index 31b7fa419..ffb4b1c3c 100644 --- a/tests/integration/test_dynamic_routes.py +++ b/tests/integration/test_dynamic_routes.py @@ -153,7 +153,7 @@ def dynamic_route( running AppHarness instance """ with app_harness_env.create( - root=tmp_path_factory.mktemp(f"dynamic_route"), + root=tmp_path_factory.mktemp("dynamic_route"), app_name=f"dynamicroute_{app_harness_env.__name__.lower()}", app_source=DynamicRoute, # type: ignore ) as harness: diff --git a/tests/integration/test_event_actions.py b/tests/integration/test_event_actions.py index 5d278835e..58e26bf09 100644 --- a/tests/integration/test_event_actions.py +++ b/tests/integration/test_event_actions.py @@ -171,7 +171,7 @@ def event_action(tmp_path_factory) -> Generator[AppHarness, None, None]: running AppHarness instance """ with AppHarness.create( - root=tmp_path_factory.mktemp(f"event_action"), + root=tmp_path_factory.mktemp("event_action"), app_source=TestEventAction, # type: ignore ) as harness: yield harness diff --git a/tests/integration/test_large_state.py b/tests/integration/test_large_state.py index 23a534a2b..a9a8ff2ec 100644 --- a/tests/integration/test_large_state.py +++ b/tests/integration/test_large_state.py @@ -58,7 +58,7 @@ def test_large_state(var_count: int, tmp_path_factory, benchmark): large_state_rendered = template.render(var_count=var_count) with AppHarness.create( - root=tmp_path_factory.mktemp(f"large_state"), + root=tmp_path_factory.mktemp("large_state"), app_source=large_state_rendered, app_name="large_state", ) as large_state: diff --git a/tests/integration/test_navigation.py b/tests/integration/test_navigation.py index 492ae4510..b4505ed1c 100644 --- a/tests/integration/test_navigation.py +++ b/tests/integration/test_navigation.py @@ -74,7 +74,7 @@ async def test_navigation_app(navigation_app: AppHarness): with poll_for_navigation(driver): internal_link.click() - assert urlsplit(driver.current_url).path == f"/internal/" + assert urlsplit(driver.current_url).path == "/internal/" with poll_for_navigation(driver): driver.back() diff --git a/tests/integration/test_server_side_event.py b/tests/integration/test_server_side_event.py index cacf6e1c5..7fd592d10 100644 --- a/tests/integration/test_server_side_event.py +++ b/tests/integration/test_server_side_event.py @@ -102,7 +102,6 @@ def server_side_event(tmp_path_factory) -> Generator[AppHarness, None, None]: def driver(server_side_event: AppHarness): """Get an instance of the browser open to the server_side_event app. - Args: server_side_event: harness for ServerSideEvent app diff --git a/tests/integration/test_state_inheritance.py b/tests/integration/test_state_inheritance.py index 86ab625e1..a9f55d9a9 100644 --- a/tests/integration/test_state_inheritance.py +++ b/tests/integration/test_state_inheritance.py @@ -216,7 +216,7 @@ def state_inheritance( running AppHarness instance """ with AppHarness.create( - root=tmp_path_factory.mktemp(f"state_inheritance"), + root=tmp_path_factory.mktemp("state_inheritance"), app_source=StateInheritance, # type: ignore ) as harness: yield harness diff --git a/tests/integration/test_upload.py b/tests/integration/test_upload.py index 7eaabf6a1..602905b3e 100644 --- a/tests/integration/test_upload.py +++ b/tests/integration/test_upload.py @@ -359,8 +359,8 @@ async def test_cancel_upload(tmp_path, upload_file: AppHarness, driver: WebDrive substate_token = f"{token}_{state_full_name}" upload_box = driver.find_elements(By.XPATH, "//input[@type='file']")[1] - upload_button = driver.find_element(By.ID, f"upload_button_secondary") - cancel_button = driver.find_element(By.ID, f"cancel_button_secondary") + upload_button = driver.find_element(By.ID, "upload_button_secondary") + cancel_button = driver.find_element(By.ID, "cancel_button_secondary") exp_name = "large.txt" target_file = tmp_path / exp_name diff --git a/tests/units/compiler/test_compiler.py b/tests/units/compiler/test_compiler.py index afacf43c5..22f5c8483 100644 --- a/tests/units/compiler/test_compiler.py +++ b/tests/units/compiler/test_compiler.py @@ -131,11 +131,11 @@ def test_compile_stylesheets(tmp_path, mocker): assert compiler.compile_root_stylesheet(stylesheets) == ( str(Path(".web") / "styles" / "styles.css"), - f"@import url('./tailwind.css'); \n" - f"@import url('https://fonts.googleapis.com/css?family=Sofia&effect=neon|outline|emboss|shadow-multiple'); \n" - f"@import url('https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css'); \n" - f"@import url('../public/styles.css'); \n" - f"@import url('https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap-theme.min.css'); \n", + "@import url('./tailwind.css'); \n" + "@import url('https://fonts.googleapis.com/css?family=Sofia&effect=neon|outline|emboss|shadow-multiple'); \n" + "@import url('https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css'); \n" + "@import url('../public/styles.css'); \n" + "@import url('https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap-theme.min.css'); \n", ) diff --git a/tests/units/components/core/test_debounce.py b/tests/units/components/core/test_debounce.py index 7856ee090..2fad9c925 100644 --- a/tests/units/components/core/test_debounce.py +++ b/tests/units/components/core/test_debounce.py @@ -41,7 +41,6 @@ class S(BaseState): def on_change(self, v: str): """Dummy on_change handler. - Args: v: The changed value. """ diff --git a/tests/units/components/test_component.py b/tests/units/components/test_component.py index f2c0d50e9..111431ab3 100644 --- a/tests/units/components/test_component.py +++ b/tests/units/components/test_component.py @@ -1208,7 +1208,7 @@ TEST_VAR_DICT_OF_DICT = LiteralVar.create({"a": {"b": "test"}})._replace( merge_var_data=TEST_VAR._var_data ) FORMATTED_TEST_VAR_DICT_OF_DICT = LiteralVar.create( - {"a": {"b": f"footestbar"}} + {"a": {"b": "footestbar"}} )._replace(merge_var_data=TEST_VAR._var_data) TEST_VAR_LIST_OF_LIST = LiteralVar.create([["test"]])._replace( diff --git a/tests/units/test_app.py b/tests/units/test_app.py index 1e34a67c3..5d3aee6c7 100644 --- a/tests/units/test_app.py +++ b/tests/units/test_app.py @@ -787,11 +787,11 @@ async def test_upload_file(tmp_path, state, delta, token: str, mocker): } file1 = UploadFile( - filename=f"image1.jpg", + filename="image1.jpg", file=bio, ) file2 = UploadFile( - filename=f"image2.jpg", + filename="image2.jpg", file=bio, ) upload_fn = upload(app) diff --git a/tests/units/test_state.py b/tests/units/test_state.py index 83e348cd2..2ce0b7bd5 100644 --- a/tests/units/test_state.py +++ b/tests/units/test_state.py @@ -1558,7 +1558,7 @@ def test_error_on_state_method_shadow(): assert ( err.value.args[0] - == f"The event handler name `reset` shadows a builtin State method; use a different name instead" + == "The event handler name `reset` shadows a builtin State method; use a different name instead" ) diff --git a/tests/units/test_var.py b/tests/units/test_var.py index a8b4b759d..2f3f81e2c 100644 --- a/tests/units/test_var.py +++ b/tests/units/test_var.py @@ -1318,7 +1318,7 @@ def test_unsupported_types_for_reverse(var): """ with pytest.raises(TypeError) as err: var.reverse() - assert err.value.args[0] == f"Cannot reverse non-list var." + assert err.value.args[0] == "Cannot reverse non-list var." @pytest.mark.parametrize( diff --git a/tests/units/utils/test_serializers.py b/tests/units/utils/test_serializers.py index 8050470c6..355f40d3f 100644 --- a/tests/units/utils/test_serializers.py +++ b/tests/units/utils/test_serializers.py @@ -20,7 +20,6 @@ from reflex.vars.base import LiteralVar def test_has_serializer(type_: Type, expected: bool): """Test that has_serializer returns the correct value. - Args: type_: The type to check. expected: The expected result. @@ -41,7 +40,6 @@ def test_has_serializer(type_: Type, expected: bool): def test_get_serializer(type_: Type, expected: serializers.Serializer): """Test that get_serializer returns the correct value. - Args: type_: The type to check. expected: The expected result. @@ -195,7 +193,6 @@ class BaseSubclass(Base): def test_serialize(value: Any, expected: str): """Test that serialize returns the correct value. - Args: value: The value to serialize. expected: The expected result. From b9d73edd6605797642fd67171d574fdfae98b30b Mon Sep 17 00:00:00 2001 From: Khaleel Al-Adhami Date: Wed, 6 Nov 2024 15:10:02 -0800 Subject: [PATCH 2/6] add metainfo to keyevent (#4287) * allow for event handlers to ignore args * use a constant * dang it darglint * forgor * keep the tests but move them to valid place * add metainfo to keyevent * format code * fix pyi files * generate all prefixes of event types * change format rule --- pyproject.toml | 1 + reflex/app.py | 9 +-- reflex/components/base/error_boundary.pyi | 8 +- reflex/components/core/clipboard.pyi | 12 +-- reflex/components/core/upload.pyi | 25 +++---- reflex/components/datadisplay/dataeditor.pyi | 74 +++++++++++++++---- reflex/components/el/elements/forms.pyi | 70 ++++++++++++++---- reflex/components/moment/moment.pyi | 4 +- .../components/radix/primitives/accordion.pyi | 4 +- reflex/components/radix/primitives/drawer.pyi | 16 +++- reflex/components/radix/primitives/form.pyi | 24 ++++-- reflex/components/radix/primitives/slider.pyi | 8 +- reflex/components/radix/themes/color_mode.pyi | 9 +-- .../radix/themes/components/alert_dialog.pyi | 4 +- .../radix/themes/components/avatar.py | 6 +- .../radix/themes/components/badge.py | 6 +- .../radix/themes/components/button.pyi | 5 +- .../radix/themes/components/callout.py | 5 +- .../radix/themes/components/card.py | 4 +- .../radix/themes/components/checkbox.py | 6 +- .../radix/themes/components/checkbox.pyi | 12 ++- .../radix/themes/components/context_menu.py | 5 +- .../radix/themes/components/context_menu.pyi | 8 +- .../radix/themes/components/dialog.py | 5 +- .../radix/themes/components/dialog.pyi | 8 +- .../radix/themes/components/dropdown_menu.py | 6 +- .../radix/themes/components/dropdown_menu.pyi | 8 +- .../radix/themes/components/hover_card.py | 5 +- .../radix/themes/components/hover_card.pyi | 8 +- .../radix/themes/components/icon_button.pyi | 5 +- .../radix/themes/components/inset.py | 4 +- .../radix/themes/components/popover.py | 5 +- .../radix/themes/components/popover.pyi | 4 +- .../radix/themes/components/radio_cards.pyi | 4 +- .../radix/themes/components/radio_group.py | 6 +- .../radix/themes/components/radio_group.pyi | 4 +- .../radix/themes/components/scroll_area.py | 4 +- .../themes/components/segmented_control.pyi | 4 +- .../radix/themes/components/select.py | 6 +- .../radix/themes/components/select.pyi | 24 ++++-- .../radix/themes/components/separator.py | 5 +- .../radix/themes/components/slider.py | 5 +- .../radix/themes/components/slider.pyi | 18 +++-- .../radix/themes/components/spinner.py | 5 +- .../radix/themes/components/switch.py | 5 +- .../radix/themes/components/switch.pyi | 4 +- .../radix/themes/components/table.py | 4 +- .../radix/themes/components/tabs.py | 5 +- .../radix/themes/components/tabs.pyi | 8 +- .../radix/themes/components/text_area.py | 6 +- .../radix/themes/components/text_area.pyi | 30 ++++++-- .../radix/themes/components/text_field.py | 6 +- .../radix/themes/components/text_field.pyi | 58 ++++++++++++--- .../radix/themes/components/tooltip.py | 4 +- .../radix/themes/components/tooltip.pyi | 9 +-- reflex/components/radix/themes/layout/base.py | 6 +- reflex/components/radix/themes/layout/flex.py | 7 +- reflex/components/radix/themes/layout/grid.py | 7 +- .../radix/themes/typography/blockquote.py | 10 +-- .../radix/themes/typography/code.py | 11 +-- .../radix/themes/typography/heading.py | 12 +-- .../radix/themes/typography/link.py | 11 +-- .../radix/themes/typography/text.py | 12 +-- reflex/components/react_player/audio.pyi | 15 +++- .../components/react_player/react_player.pyi | 12 ++- reflex/components/react_player/video.pyi | 15 +++- reflex/components/recharts/cartesian.pyi | 4 +- reflex/components/recharts/charts.pyi | 4 +- reflex/components/recharts/general.pyi | 4 +- reflex/components/recharts/polar.pyi | 4 +- reflex/components/suneditor/editor.pyi | 28 +++++-- reflex/components/tags/iter_tag.py | 11 +-- reflex/constants/__init__.py | 11 +-- reflex/event.py | 38 +++++++--- reflex/experimental/client_state.py | 5 +- reflex/experimental/layout.pyi | 8 +- reflex/istate/wrappers.py | 6 +- reflex/state.py | 4 +- reflex/utils/pyi_generator.py | 23 +++++- reflex/utils/types.py | 11 +-- reflex/vars/base.py | 13 +--- reflex/vars/function.py | 8 +- tests/units/components/test_component.py | 4 +- tests/units/test_var.py | 6 +- tests/units/utils/test_utils.py | 6 +- 85 files changed, 514 insertions(+), 409 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 585d4703f..828c3d989 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -91,6 +91,7 @@ build-backend = "poetry.core.masonry.api" [tool.ruff] target-version = "py39" +lint.isort.split-on-trailing-comma = false lint.select = ["B", "D", "E", "F", "I", "SIM", "W"] lint.ignore = ["B008", "D205", "E501", "F403", "SIM115"] lint.pydocstyle.convention = "google" diff --git a/reflex/app.py b/reflex/app.py index 83ee3b840..a8a6e69c6 100644 --- a/reflex/app.py +++ b/reflex/app.py @@ -48,10 +48,7 @@ from reflex.admin import AdminDash from reflex.app_mixins import AppMixin, LifespanMixin, MiddlewareMixin from reflex.compiler import compiler from reflex.compiler import utils as compiler_utils -from reflex.compiler.compiler import ( - ExecutorSafeFunctions, - compile_theme, -) +from reflex.compiler.compiler import ExecutorSafeFunctions, compile_theme from reflex.components.base.app_wrap import AppWrap from reflex.components.base.error_boundary import ErrorBoundary from reflex.components.base.fragment import Fragment @@ -79,9 +76,7 @@ from reflex.event import ( window_alert, ) from reflex.model import Model, get_db_status -from reflex.page import ( - DECORATED_PAGES, -) +from reflex.page import DECORATED_PAGES from reflex.route import ( get_route_args, replace_brackets_with_keywords, diff --git a/reflex/components/base/error_boundary.pyi b/reflex/components/base/error_boundary.pyi index 97acad1bb..92221c97d 100644 --- a/reflex/components/base/error_boundary.pyi +++ b/reflex/components/base/error_boundary.pyi @@ -32,7 +32,13 @@ class ErrorBoundary(Component): on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, - on_error: Optional[EventType[[str, str], BASE_STATE]] = None, + on_error: Optional[ + Union[ + EventType[[], BASE_STATE], + EventType[[str], BASE_STATE], + EventType[[str, str], BASE_STATE], + ] + ] = None, on_focus: Optional[EventType[[], BASE_STATE]] = None, on_mount: Optional[EventType[[], BASE_STATE]] = None, on_mouse_down: Optional[EventType[[], BASE_STATE]] = None, diff --git a/reflex/components/core/clipboard.pyi b/reflex/components/core/clipboard.pyi index e3233d86c..fc49cf64b 100644 --- a/reflex/components/core/clipboard.pyi +++ b/reflex/components/core/clipboard.pyi @@ -6,10 +6,7 @@ from typing import Any, Dict, List, Optional, Union, overload from reflex.components.base.fragment import Fragment -from reflex.event import ( - BASE_STATE, - EventType, -) +from reflex.event import BASE_STATE, EventType from reflex.style import Style from reflex.utils.imports import ImportVar from reflex.vars.base import Var @@ -43,7 +40,12 @@ class Clipboard(Fragment): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_paste: Optional[EventType[[list[tuple[str, str]]], BASE_STATE]] = None, + on_paste: Optional[ + Union[ + EventType[[], BASE_STATE], + EventType[[list[tuple[str, str]]], BASE_STATE], + ] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, diff --git a/reflex/components/core/upload.pyi b/reflex/components/core/upload.pyi index c6cb329cb..3c7b5b160 100644 --- a/reflex/components/core/upload.pyi +++ b/reflex/components/core/upload.pyi @@ -6,18 +6,9 @@ from pathlib import Path from typing import Any, ClassVar, Dict, List, Optional, Union, overload -from reflex.components.component import ( - Component, - ComponentNamespace, - MemoizationLeaf, -) +from reflex.components.component import Component, ComponentNamespace, MemoizationLeaf from reflex.constants import Dirs -from reflex.event import ( - BASE_STATE, - CallableEventSpec, - EventSpec, - EventType, -) +from reflex.event import BASE_STATE, CallableEventSpec, EventSpec, EventType from reflex.style import Style from reflex.utils.imports import ImportVar from reflex.vars import VarData @@ -120,7 +111,9 @@ class Upload(MemoizationLeaf): on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, - on_drop: Optional[EventType[[Any], BASE_STATE]] = None, + on_drop: Optional[ + Union[EventType[[], BASE_STATE], EventType[[Any], BASE_STATE]] + ] = None, on_focus: Optional[EventType[[], BASE_STATE]] = None, on_mount: Optional[EventType[[], BASE_STATE]] = None, on_mouse_down: Optional[EventType[[], BASE_STATE]] = None, @@ -186,7 +179,9 @@ class StyledUpload(Upload): on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, - on_drop: Optional[EventType[[Any], BASE_STATE]] = None, + on_drop: Optional[ + Union[EventType[[], BASE_STATE], EventType[[Any], BASE_STATE]] + ] = None, on_focus: Optional[EventType[[], BASE_STATE]] = None, on_mount: Optional[EventType[[], BASE_STATE]] = None, on_mouse_down: Optional[EventType[[], BASE_STATE]] = None, @@ -252,7 +247,9 @@ class UploadNamespace(ComponentNamespace): on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, - on_drop: Optional[EventType[[Any], BASE_STATE]] = None, + on_drop: Optional[ + Union[EventType[[], BASE_STATE], EventType[[Any], BASE_STATE]] + ] = None, on_focus: Optional[EventType[[], BASE_STATE]] = None, on_mount: Optional[EventType[[], BASE_STATE]] = None, on_mouse_down: Optional[EventType[[], BASE_STATE]] = None, diff --git a/reflex/components/datadisplay/dataeditor.pyi b/reflex/components/datadisplay/dataeditor.pyi index 43785e5e8..dbf79ef7b 100644 --- a/reflex/components/datadisplay/dataeditor.pyi +++ b/reflex/components/datadisplay/dataeditor.pyi @@ -184,34 +184,80 @@ class DataEditor(NoSSRComponent): autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, - on_cell_activated: Optional[EventType[[tuple[int, int]], BASE_STATE]] = None, - on_cell_clicked: Optional[EventType[[tuple[int, int]], BASE_STATE]] = None, - on_cell_context_menu: Optional[EventType[[tuple[int, int]], BASE_STATE]] = None, + on_cell_activated: Optional[ + Union[EventType[[], BASE_STATE], EventType[[tuple[int, int]], BASE_STATE]] + ] = None, + on_cell_clicked: Optional[ + Union[EventType[[], BASE_STATE], EventType[[tuple[int, int]], BASE_STATE]] + ] = None, + on_cell_context_menu: Optional[ + Union[EventType[[], BASE_STATE], EventType[[tuple[int, int]], BASE_STATE]] + ] = None, on_cell_edited: Optional[ - EventType[[tuple[int, int], GridCell], BASE_STATE] + Union[ + EventType[[], BASE_STATE], + EventType[[tuple[int, int]], BASE_STATE], + EventType[[tuple[int, int], GridCell], BASE_STATE], + ] ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, - on_column_resize: Optional[EventType[[GridColumn, int], BASE_STATE]] = None, + on_column_resize: Optional[ + Union[ + EventType[[], BASE_STATE], + EventType[[GridColumn], BASE_STATE], + EventType[[GridColumn, int], BASE_STATE], + ] + ] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, - on_delete: Optional[EventType[[GridSelection], BASE_STATE]] = None, + on_delete: Optional[ + Union[EventType[[], BASE_STATE], EventType[[GridSelection], BASE_STATE]] + ] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, on_finished_editing: Optional[ - EventType[[Union[GridCell, None], tuple[int, int]], BASE_STATE] + Union[ + EventType[[], BASE_STATE], + EventType[[Union[GridCell, None]], BASE_STATE], + EventType[[Union[GridCell, None], tuple[int, int]], BASE_STATE], + ] ] = None, on_focus: Optional[EventType[[], BASE_STATE]] = None, on_group_header_clicked: Optional[ - EventType[[tuple[int, int], GridCell], BASE_STATE] + Union[ + EventType[[], BASE_STATE], + EventType[[tuple[int, int]], BASE_STATE], + EventType[[tuple[int, int], GridCell], BASE_STATE], + ] ] = None, on_group_header_context_menu: Optional[ - EventType[[int, GroupHeaderClickedEventArgs], BASE_STATE] + Union[ + EventType[[], BASE_STATE], + EventType[[int], BASE_STATE], + EventType[[int, GroupHeaderClickedEventArgs], BASE_STATE], + ] + ] = None, + on_group_header_renamed: Optional[ + Union[ + EventType[[], BASE_STATE], + EventType[[str], BASE_STATE], + EventType[[str, str], BASE_STATE], + ] + ] = None, + on_header_clicked: Optional[ + Union[EventType[[], BASE_STATE], EventType[[tuple[int, int]], BASE_STATE]] ] = None, - on_group_header_renamed: Optional[EventType[[str, str], BASE_STATE]] = None, - on_header_clicked: Optional[EventType[[tuple[int, int]], BASE_STATE]] = None, on_header_context_menu: Optional[ - EventType[[tuple[int, int]], BASE_STATE] + Union[EventType[[], BASE_STATE], EventType[[tuple[int, int]], BASE_STATE]] + ] = None, + on_header_menu_click: Optional[ + Union[ + EventType[[], BASE_STATE], + EventType[[int], BASE_STATE], + EventType[[int, Rectangle], BASE_STATE], + ] + ] = None, + on_item_hovered: Optional[ + Union[EventType[[], BASE_STATE], EventType[[tuple[int, int]], BASE_STATE]] ] = None, - on_header_menu_click: Optional[EventType[[int, Rectangle], BASE_STATE]] = None, - on_item_hovered: Optional[EventType[[tuple[int, int]], BASE_STATE]] = None, on_mount: Optional[EventType[[], BASE_STATE]] = None, on_mouse_down: Optional[EventType[[], BASE_STATE]] = None, on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None, diff --git a/reflex/components/el/elements/forms.pyi b/reflex/components/el/elements/forms.pyi index 2f9924247..fca2ffaa1 100644 --- a/reflex/components/el/elements/forms.pyi +++ b/reflex/components/el/elements/forms.pyi @@ -8,7 +8,7 @@ from typing import Any, Dict, Optional, Tuple, Union, overload from jinja2 import Environment from reflex.components.el.element import Element -from reflex.event import BASE_STATE, EventType +from reflex.event import BASE_STATE, EventType, KeyInputInfo from reflex.style import Style from reflex.utils.imports import ImportDict from reflex.vars.base import Var @@ -340,8 +340,12 @@ class Form(BaseHTML): on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_submit: Optional[ Union[ - EventType[[Dict[str, Any]], BASE_STATE], - EventType[[Dict[str, str]], BASE_STATE], + Union[ + EventType[[], BASE_STATE], EventType[[Dict[str, Any]], BASE_STATE] + ], + Union[ + EventType[[], BASE_STATE], EventType[[Dict[str, str]], BASE_STATE] + ], ] ] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, @@ -470,14 +474,32 @@ class Input(BaseHTML): class_name: Optional[Any] = None, autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, - on_blur: Optional[EventType[[str], BASE_STATE]] = None, - on_change: Optional[EventType[[str], BASE_STATE]] = None, + on_blur: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, - on_focus: Optional[EventType[[str], BASE_STATE]] = None, - on_key_down: Optional[EventType[[str], BASE_STATE]] = None, - on_key_up: Optional[EventType[[str], BASE_STATE]] = None, + on_focus: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, + on_key_down: Optional[ + Union[ + EventType[[], BASE_STATE], + EventType[[str], BASE_STATE], + EventType[[str, KeyInputInfo], BASE_STATE], + ] + ] = None, + on_key_up: Optional[ + Union[ + EventType[[], BASE_STATE], + EventType[[str], BASE_STATE], + EventType[[str, KeyInputInfo], BASE_STATE], + ] + ] = None, on_mount: Optional[EventType[[], BASE_STATE]] = None, on_mouse_down: Optional[EventType[[], BASE_STATE]] = None, on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None, @@ -1252,7 +1274,9 @@ class Select(BaseHTML): autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, - on_change: Optional[EventType[[str], BASE_STATE]] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, @@ -1369,14 +1393,32 @@ class Textarea(BaseHTML): class_name: Optional[Any] = None, autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, - on_blur: Optional[EventType[[str], BASE_STATE]] = None, - on_change: Optional[EventType[[str], BASE_STATE]] = None, + on_blur: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, - on_focus: Optional[EventType[[str], BASE_STATE]] = None, - on_key_down: Optional[EventType[[str], BASE_STATE]] = None, - on_key_up: Optional[EventType[[str], BASE_STATE]] = None, + on_focus: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, + on_key_down: Optional[ + Union[ + EventType[[], BASE_STATE], + EventType[[str], BASE_STATE], + EventType[[str, KeyInputInfo], BASE_STATE], + ] + ] = None, + on_key_up: Optional[ + Union[ + EventType[[], BASE_STATE], + EventType[[str], BASE_STATE], + EventType[[str, KeyInputInfo], BASE_STATE], + ] + ] = None, on_mount: Optional[EventType[[], BASE_STATE]] = None, on_mouse_down: Optional[EventType[[], BASE_STATE]] = None, on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None, diff --git a/reflex/components/moment/moment.pyi b/reflex/components/moment/moment.pyi index 58738d833..641435bde 100644 --- a/reflex/components/moment/moment.pyi +++ b/reflex/components/moment/moment.pyi @@ -59,7 +59,9 @@ class Moment(NoSSRComponent): autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, - on_change: Optional[EventType[[str], BASE_STATE]] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, diff --git a/reflex/components/radix/primitives/accordion.pyi b/reflex/components/radix/primitives/accordion.pyi index 39dd84de7..4f4a9243f 100644 --- a/reflex/components/radix/primitives/accordion.pyi +++ b/reflex/components/radix/primitives/accordion.pyi @@ -262,7 +262,9 @@ class AccordionRoot(AccordionComponent): on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, - on_value_change: Optional[EventType[[str | List[str]], BASE_STATE]] = None, + on_value_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str | List[str]], BASE_STATE]] + ] = None, **props, ) -> "AccordionRoot": """Create the component. diff --git a/reflex/components/radix/primitives/drawer.pyi b/reflex/components/radix/primitives/drawer.pyi index d29ae2ba4..650967e3f 100644 --- a/reflex/components/radix/primitives/drawer.pyi +++ b/reflex/components/radix/primitives/drawer.pyi @@ -91,7 +91,9 @@ class DrawerRoot(DrawerComponent): class_name: Optional[Any] = None, autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, - on_animation_end: Optional[EventType[[bool], BASE_STATE]] = None, + on_animation_end: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, @@ -105,7 +107,9 @@ class DrawerRoot(DrawerComponent): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_open_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_open_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, @@ -573,7 +577,9 @@ class Drawer(ComponentNamespace): class_name: Optional[Any] = None, autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, - on_animation_end: Optional[EventType[[bool], BASE_STATE]] = None, + on_animation_end: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, @@ -587,7 +593,9 @@ class Drawer(ComponentNamespace): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_open_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_open_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, diff --git a/reflex/components/radix/primitives/form.pyi b/reflex/components/radix/primitives/form.pyi index b336116ca..bfeb60ac9 100644 --- a/reflex/components/radix/primitives/form.pyi +++ b/reflex/components/radix/primitives/form.pyi @@ -131,8 +131,12 @@ class FormRoot(FormComponent, HTMLForm): on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_submit: Optional[ Union[ - EventType[[Dict[str, Any]], BASE_STATE], - EventType[[Dict[str, str]], BASE_STATE], + Union[ + EventType[[], BASE_STATE], EventType[[Dict[str, Any]], BASE_STATE] + ], + Union[ + EventType[[], BASE_STATE], EventType[[Dict[str, str]], BASE_STATE] + ], ] ] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, @@ -603,8 +607,12 @@ class Form(FormRoot): on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_submit: Optional[ Union[ - EventType[[Dict[str, Any]], BASE_STATE], - EventType[[Dict[str, str]], BASE_STATE], + Union[ + EventType[[], BASE_STATE], EventType[[Dict[str, Any]], BASE_STATE] + ], + Union[ + EventType[[], BASE_STATE], EventType[[Dict[str, str]], BASE_STATE] + ], ] ] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, @@ -732,8 +740,12 @@ class FormNamespace(ComponentNamespace): on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_submit: Optional[ Union[ - EventType[[Dict[str, Any]], BASE_STATE], - EventType[[Dict[str, str]], BASE_STATE], + Union[ + EventType[[], BASE_STATE], EventType[[Dict[str, Any]], BASE_STATE] + ], + Union[ + EventType[[], BASE_STATE], EventType[[Dict[str, str]], BASE_STATE] + ], ] ] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, diff --git a/reflex/components/radix/primitives/slider.pyi b/reflex/components/radix/primitives/slider.pyi index b37ec7b07..161d76199 100644 --- a/reflex/components/radix/primitives/slider.pyi +++ b/reflex/components/radix/primitives/slider.pyi @@ -109,8 +109,12 @@ class SliderRoot(SliderComponent): on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, - on_value_change: Optional[EventType[[List[int]], BASE_STATE]] = None, - on_value_commit: Optional[EventType[[List[int]], BASE_STATE]] = None, + on_value_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[List[int]], BASE_STATE]] + ] = None, + on_value_commit: Optional[ + Union[EventType[[], BASE_STATE], EventType[[List[int]], BASE_STATE]] + ] = None, **props, ) -> "SliderRoot": """Create the component. diff --git a/reflex/components/radix/themes/color_mode.pyi b/reflex/components/radix/themes/color_mode.pyi index a508730b7..43a9dd31a 100644 --- a/reflex/components/radix/themes/color_mode.pyi +++ b/reflex/components/radix/themes/color_mode.pyi @@ -11,10 +11,7 @@ from reflex.components.core.cond import Cond from reflex.components.lucide.icon import Icon from reflex.components.radix.themes.components.switch import Switch from reflex.event import BASE_STATE, EventType -from reflex.style import ( - Style, - color_mode, -) +from reflex.style import Style, color_mode from reflex.vars.base import Var from .components.icon_button import IconButton @@ -395,7 +392,9 @@ class ColorModeSwitch(Switch): autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, - on_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, diff --git a/reflex/components/radix/themes/components/alert_dialog.pyi b/reflex/components/radix/themes/components/alert_dialog.pyi index d219e2abf..3cd806b1c 100644 --- a/reflex/components/radix/themes/components/alert_dialog.pyi +++ b/reflex/components/radix/themes/components/alert_dialog.pyi @@ -43,7 +43,9 @@ class AlertDialogRoot(RadixThemesComponent): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_open_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_open_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, diff --git a/reflex/components/radix/themes/components/avatar.py b/reflex/components/radix/themes/components/avatar.py index 4f3956e76..77a305e29 100644 --- a/reflex/components/radix/themes/components/avatar.py +++ b/reflex/components/radix/themes/components/avatar.py @@ -5,11 +5,7 @@ from typing import Literal from reflex.components.core.breakpoints import Responsive from reflex.vars.base import Var -from ..base import ( - LiteralAccentColor, - LiteralRadius, - RadixThemesComponent, -) +from ..base import LiteralAccentColor, LiteralRadius, RadixThemesComponent LiteralSize = Literal["1", "2", "3", "4", "5", "6", "7", "8", "9"] diff --git a/reflex/components/radix/themes/components/badge.py b/reflex/components/radix/themes/components/badge.py index 9391e53c3..389012bf0 100644 --- a/reflex/components/radix/themes/components/badge.py +++ b/reflex/components/radix/themes/components/badge.py @@ -6,11 +6,7 @@ from reflex.components.core.breakpoints import Responsive from reflex.components.el import elements from reflex.vars.base import Var -from ..base import ( - LiteralAccentColor, - LiteralRadius, - RadixThemesComponent, -) +from ..base import LiteralAccentColor, LiteralRadius, RadixThemesComponent class Badge(elements.Span, RadixThemesComponent): diff --git a/reflex/components/radix/themes/components/button.pyi b/reflex/components/radix/themes/components/button.pyi index b72233922..f01c94fc2 100644 --- a/reflex/components/radix/themes/components/button.pyi +++ b/reflex/components/radix/themes/components/button.pyi @@ -11,10 +11,7 @@ from reflex.event import BASE_STATE, EventType from reflex.style import Style from reflex.vars.base import Var -from ..base import ( - RadixLoadingProp, - RadixThemesComponent, -) +from ..base import RadixLoadingProp, RadixThemesComponent LiteralButtonSize = Literal["1", "2", "3", "4"] diff --git a/reflex/components/radix/themes/components/callout.py b/reflex/components/radix/themes/components/callout.py index 926e0ad54..6b0a1d399 100644 --- a/reflex/components/radix/themes/components/callout.py +++ b/reflex/components/radix/themes/components/callout.py @@ -9,10 +9,7 @@ from reflex.components.el import elements from reflex.components.lucide.icon import Icon from reflex.vars.base import Var -from ..base import ( - LiteralAccentColor, - RadixThemesComponent, -) +from ..base import LiteralAccentColor, RadixThemesComponent CalloutVariant = Literal["soft", "surface", "outline"] diff --git a/reflex/components/radix/themes/components/card.py b/reflex/components/radix/themes/components/card.py index 4983cdd41..30823de56 100644 --- a/reflex/components/radix/themes/components/card.py +++ b/reflex/components/radix/themes/components/card.py @@ -6,9 +6,7 @@ from reflex.components.core.breakpoints import Responsive from reflex.components.el import elements from reflex.vars.base import Var -from ..base import ( - RadixThemesComponent, -) +from ..base import RadixThemesComponent class Card(elements.Div, RadixThemesComponent): diff --git a/reflex/components/radix/themes/components/checkbox.py b/reflex/components/radix/themes/components/checkbox.py index 1460382f5..42277bfea 100644 --- a/reflex/components/radix/themes/components/checkbox.py +++ b/reflex/components/radix/themes/components/checkbox.py @@ -9,11 +9,7 @@ from reflex.components.radix.themes.typography.text import Text from reflex.event import EventHandler, passthrough_event_spec from reflex.vars.base import LiteralVar, Var -from ..base import ( - LiteralAccentColor, - LiteralSpacing, - RadixThemesComponent, -) +from ..base import LiteralAccentColor, LiteralSpacing, RadixThemesComponent LiteralCheckboxSize = Literal["1", "2", "3"] LiteralCheckboxVariant = Literal["classic", "surface", "soft"] diff --git a/reflex/components/radix/themes/components/checkbox.pyi b/reflex/components/radix/themes/components/checkbox.pyi index 43d707c8f..f7a1e85d2 100644 --- a/reflex/components/radix/themes/components/checkbox.pyi +++ b/reflex/components/radix/themes/components/checkbox.pyi @@ -116,7 +116,9 @@ class Checkbox(RadixThemesComponent): autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, - on_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, @@ -264,7 +266,9 @@ class HighLevelCheckbox(RadixThemesComponent): autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, - on_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, @@ -409,7 +413,9 @@ class CheckboxNamespace(ComponentNamespace): autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, - on_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, diff --git a/reflex/components/radix/themes/components/context_menu.py b/reflex/components/radix/themes/components/context_menu.py index 7b2032a42..ea4902233 100644 --- a/reflex/components/radix/themes/components/context_menu.py +++ b/reflex/components/radix/themes/components/context_menu.py @@ -7,10 +7,7 @@ from reflex.components.core.breakpoints import Responsive from reflex.event import EventHandler, no_args_event_spec, passthrough_event_spec from reflex.vars.base import Var -from ..base import ( - LiteralAccentColor, - RadixThemesComponent, -) +from ..base import LiteralAccentColor, RadixThemesComponent LiteralDirType = Literal["ltr", "rtl"] diff --git a/reflex/components/radix/themes/components/context_menu.pyi b/reflex/components/radix/themes/components/context_menu.pyi index ffc058d14..97d0448a3 100644 --- a/reflex/components/radix/themes/components/context_menu.pyi +++ b/reflex/components/radix/themes/components/context_menu.pyi @@ -47,7 +47,9 @@ class ContextMenuRoot(RadixThemesComponent): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_open_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_open_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, @@ -330,7 +332,9 @@ class ContextMenuSub(RadixThemesComponent): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_open_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_open_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, diff --git a/reflex/components/radix/themes/components/dialog.py b/reflex/components/radix/themes/components/dialog.py index 5d33cbc5f..1b7c3b532 100644 --- a/reflex/components/radix/themes/components/dialog.py +++ b/reflex/components/radix/themes/components/dialog.py @@ -8,10 +8,7 @@ from reflex.components.el import elements from reflex.event import EventHandler, no_args_event_spec, passthrough_event_spec from reflex.vars.base import Var -from ..base import ( - RadixThemesComponent, - RadixThemesTriggerComponent, -) +from ..base import RadixThemesComponent, RadixThemesTriggerComponent class DialogRoot(RadixThemesComponent): diff --git a/reflex/components/radix/themes/components/dialog.pyi b/reflex/components/radix/themes/components/dialog.pyi index 8f465efdf..77302bc82 100644 --- a/reflex/components/radix/themes/components/dialog.pyi +++ b/reflex/components/radix/themes/components/dialog.pyi @@ -41,7 +41,9 @@ class DialogRoot(RadixThemesComponent): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_open_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_open_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, @@ -391,7 +393,9 @@ class Dialog(ComponentNamespace): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_open_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_open_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, diff --git a/reflex/components/radix/themes/components/dropdown_menu.py b/reflex/components/radix/themes/components/dropdown_menu.py index 0d2ac38e2..abce3e3bb 100644 --- a/reflex/components/radix/themes/components/dropdown_menu.py +++ b/reflex/components/radix/themes/components/dropdown_menu.py @@ -7,11 +7,7 @@ from reflex.components.core.breakpoints import Responsive from reflex.event import EventHandler, no_args_event_spec, passthrough_event_spec from reflex.vars.base import Var -from ..base import ( - LiteralAccentColor, - RadixThemesComponent, - RadixThemesTriggerComponent, -) +from ..base import LiteralAccentColor, RadixThemesComponent, RadixThemesTriggerComponent LiteralDirType = Literal["ltr", "rtl"] diff --git a/reflex/components/radix/themes/components/dropdown_menu.pyi b/reflex/components/radix/themes/components/dropdown_menu.pyi index 0cc83640f..1a2ce66b8 100644 --- a/reflex/components/radix/themes/components/dropdown_menu.pyi +++ b/reflex/components/radix/themes/components/dropdown_menu.pyi @@ -49,7 +49,9 @@ class DropdownMenuRoot(RadixThemesComponent): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_open_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_open_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, @@ -367,7 +369,9 @@ class DropdownMenuSub(RadixThemesComponent): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_open_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_open_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, diff --git a/reflex/components/radix/themes/components/hover_card.py b/reflex/components/radix/themes/components/hover_card.py index 6babb10d2..bd5489ce6 100644 --- a/reflex/components/radix/themes/components/hover_card.py +++ b/reflex/components/radix/themes/components/hover_card.py @@ -8,10 +8,7 @@ from reflex.components.el import elements from reflex.event import EventHandler, passthrough_event_spec from reflex.vars.base import Var -from ..base import ( - RadixThemesComponent, - RadixThemesTriggerComponent, -) +from ..base import RadixThemesComponent, RadixThemesTriggerComponent class HoverCardRoot(RadixThemesComponent): diff --git a/reflex/components/radix/themes/components/hover_card.pyi b/reflex/components/radix/themes/components/hover_card.pyi index 730bd48a3..7044bc3ca 100644 --- a/reflex/components/radix/themes/components/hover_card.pyi +++ b/reflex/components/radix/themes/components/hover_card.pyi @@ -43,7 +43,9 @@ class HoverCardRoot(RadixThemesComponent): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_open_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_open_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, @@ -286,7 +288,9 @@ class HoverCard(ComponentNamespace): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_open_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_open_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, diff --git a/reflex/components/radix/themes/components/icon_button.pyi b/reflex/components/radix/themes/components/icon_button.pyi index 75825a033..81090e2e2 100644 --- a/reflex/components/radix/themes/components/icon_button.pyi +++ b/reflex/components/radix/themes/components/icon_button.pyi @@ -11,10 +11,7 @@ from reflex.event import BASE_STATE, EventType from reflex.style import Style from reflex.vars.base import Var -from ..base import ( - RadixLoadingProp, - RadixThemesComponent, -) +from ..base import RadixLoadingProp, RadixThemesComponent LiteralButtonSize = Literal["1", "2", "3", "4"] diff --git a/reflex/components/radix/themes/components/inset.py b/reflex/components/radix/themes/components/inset.py index 347b9f6b0..059858272 100644 --- a/reflex/components/radix/themes/components/inset.py +++ b/reflex/components/radix/themes/components/inset.py @@ -6,9 +6,7 @@ from reflex.components.core.breakpoints import Responsive from reflex.components.el import elements from reflex.vars.base import Var -from ..base import ( - RadixThemesComponent, -) +from ..base import RadixThemesComponent LiteralButtonSize = Literal["1", "2", "3", "4"] diff --git a/reflex/components/radix/themes/components/popover.py b/reflex/components/radix/themes/components/popover.py index bcafe6d38..bdf5f4af3 100644 --- a/reflex/components/radix/themes/components/popover.py +++ b/reflex/components/radix/themes/components/popover.py @@ -8,10 +8,7 @@ from reflex.components.el import elements from reflex.event import EventHandler, no_args_event_spec, passthrough_event_spec from reflex.vars.base import Var -from ..base import ( - RadixThemesComponent, - RadixThemesTriggerComponent, -) +from ..base import RadixThemesComponent, RadixThemesTriggerComponent class PopoverRoot(RadixThemesComponent): diff --git a/reflex/components/radix/themes/components/popover.pyi b/reflex/components/radix/themes/components/popover.pyi index 666995b17..d4be01e94 100644 --- a/reflex/components/radix/themes/components/popover.pyi +++ b/reflex/components/radix/themes/components/popover.pyi @@ -42,7 +42,9 @@ class PopoverRoot(RadixThemesComponent): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_open_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_open_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, diff --git a/reflex/components/radix/themes/components/radio_cards.pyi b/reflex/components/radix/themes/components/radio_cards.pyi index 505453e9f..a9fc8075e 100644 --- a/reflex/components/radix/themes/components/radio_cards.pyi +++ b/reflex/components/radix/themes/components/radio_cards.pyi @@ -177,7 +177,9 @@ class RadioCardsRoot(RadixThemesComponent): on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, - on_value_change: Optional[EventType[[str], BASE_STATE]] = None, + on_value_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, **props, ) -> "RadioCardsRoot": """Create a new component instance. diff --git a/reflex/components/radix/themes/components/radio_group.py b/reflex/components/radix/themes/components/radio_group.py index df3843cf9..dc9c11f5a 100644 --- a/reflex/components/radix/themes/components/radio_group.py +++ b/reflex/components/radix/themes/components/radio_group.py @@ -14,11 +14,7 @@ from reflex.utils import types from reflex.vars.base import LiteralVar, Var from reflex.vars.sequence import StringVar -from ..base import ( - LiteralAccentColor, - LiteralSpacing, - RadixThemesComponent, -) +from ..base import LiteralAccentColor, LiteralSpacing, RadixThemesComponent LiteralFlexDirection = Literal["row", "column", "row-reverse", "column-reverse"] diff --git a/reflex/components/radix/themes/components/radio_group.pyi b/reflex/components/radix/themes/components/radio_group.pyi index 3851ca6f6..72ff5ecdb 100644 --- a/reflex/components/radix/themes/components/radio_group.pyi +++ b/reflex/components/radix/themes/components/radio_group.pyi @@ -113,7 +113,9 @@ class RadioGroupRoot(RadixThemesComponent): autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, - on_change: Optional[EventType[[str], BASE_STATE]] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, diff --git a/reflex/components/radix/themes/components/scroll_area.py b/reflex/components/radix/themes/components/scroll_area.py index bd58118dd..516649e12 100644 --- a/reflex/components/radix/themes/components/scroll_area.py +++ b/reflex/components/radix/themes/components/scroll_area.py @@ -4,9 +4,7 @@ from typing import Literal from reflex.vars.base import Var -from ..base import ( - RadixThemesComponent, -) +from ..base import RadixThemesComponent class ScrollArea(RadixThemesComponent): diff --git a/reflex/components/radix/themes/components/segmented_control.pyi b/reflex/components/radix/themes/components/segmented_control.pyi index 6a28961ba..896be5dd6 100644 --- a/reflex/components/radix/themes/components/segmented_control.pyi +++ b/reflex/components/radix/themes/components/segmented_control.pyi @@ -117,7 +117,9 @@ class SegmentedControlRoot(RadixThemesComponent): autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, - on_change: Optional[EventType[[str | List[str]], BASE_STATE]] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str | List[str]], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, diff --git a/reflex/components/radix/themes/components/select.py b/reflex/components/radix/themes/components/select.py index f71276c8b..45e5712bc 100644 --- a/reflex/components/radix/themes/components/select.py +++ b/reflex/components/radix/themes/components/select.py @@ -8,11 +8,7 @@ from reflex.components.core.breakpoints import Responsive from reflex.event import no_args_event_spec, passthrough_event_spec from reflex.vars.base import Var -from ..base import ( - LiteralAccentColor, - LiteralRadius, - RadixThemesComponent, -) +from ..base import LiteralAccentColor, LiteralRadius, RadixThemesComponent class SelectRoot(RadixThemesComponent): diff --git a/reflex/components/radix/themes/components/select.pyi b/reflex/components/radix/themes/components/select.pyi index bcedb00f5..de35cf0a4 100644 --- a/reflex/components/radix/themes/components/select.pyi +++ b/reflex/components/radix/themes/components/select.pyi @@ -44,7 +44,9 @@ class SelectRoot(RadixThemesComponent): autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, - on_change: Optional[EventType[[str], BASE_STATE]] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, @@ -57,7 +59,9 @@ class SelectRoot(RadixThemesComponent): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_open_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_open_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, @@ -685,7 +689,9 @@ class HighLevelSelect(SelectRoot): autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, - on_change: Optional[EventType[[str], BASE_STATE]] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, @@ -698,7 +704,9 @@ class HighLevelSelect(SelectRoot): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_open_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_open_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, @@ -861,7 +869,9 @@ class Select(ComponentNamespace): autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, - on_change: Optional[EventType[[str], BASE_STATE]] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, @@ -874,7 +884,9 @@ class Select(ComponentNamespace): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_open_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_open_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, diff --git a/reflex/components/radix/themes/components/separator.py b/reflex/components/radix/themes/components/separator.py index 1689717d2..9fc06807a 100644 --- a/reflex/components/radix/themes/components/separator.py +++ b/reflex/components/radix/themes/components/separator.py @@ -5,10 +5,7 @@ from typing import Literal from reflex.components.core.breakpoints import Responsive from reflex.vars.base import LiteralVar, Var -from ..base import ( - LiteralAccentColor, - RadixThemesComponent, -) +from ..base import LiteralAccentColor, RadixThemesComponent LiteralSeperatorSize = Literal["1", "2", "3", "4"] diff --git a/reflex/components/radix/themes/components/slider.py b/reflex/components/radix/themes/components/slider.py index d833ef782..6acc21497 100644 --- a/reflex/components/radix/themes/components/slider.py +++ b/reflex/components/radix/themes/components/slider.py @@ -9,10 +9,7 @@ from reflex.components.core.breakpoints import Responsive from reflex.event import EventHandler, passthrough_event_spec from reflex.vars.base import Var -from ..base import ( - LiteralAccentColor, - RadixThemesComponent, -) +from ..base import LiteralAccentColor, RadixThemesComponent on_value_event_spec = ( passthrough_event_spec(list[Union[int, float]]), diff --git a/reflex/components/radix/themes/components/slider.pyi b/reflex/components/radix/themes/components/slider.pyi index 18894d950..d29570536 100644 --- a/reflex/components/radix/themes/components/slider.pyi +++ b/reflex/components/radix/themes/components/slider.pyi @@ -142,9 +142,12 @@ class Slider(RadixThemesComponent): on_blur: Optional[EventType[[], BASE_STATE]] = None, on_change: Optional[ Union[ - EventType[[list[Union[int, float]]], BASE_STATE], - EventType[[list[int]], BASE_STATE], - EventType[[list[float]], BASE_STATE], + Union[ + EventType[[], BASE_STATE], + EventType[[list[Union[int, float]]], BASE_STATE], + ], + Union[EventType[[], BASE_STATE], EventType[[list[int]], BASE_STATE]], + Union[EventType[[], BASE_STATE], EventType[[list[float]], BASE_STATE]], ] ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, @@ -163,9 +166,12 @@ class Slider(RadixThemesComponent): on_unmount: Optional[EventType[[], BASE_STATE]] = None, on_value_commit: Optional[ Union[ - EventType[[list[Union[int, float]]], BASE_STATE], - EventType[[list[int]], BASE_STATE], - EventType[[list[float]], BASE_STATE], + Union[ + EventType[[], BASE_STATE], + EventType[[list[Union[int, float]]], BASE_STATE], + ], + Union[EventType[[], BASE_STATE], EventType[[list[int]], BASE_STATE]], + Union[EventType[[], BASE_STATE], EventType[[list[float]], BASE_STATE]], ] ] = None, **props, diff --git a/reflex/components/radix/themes/components/spinner.py b/reflex/components/radix/themes/components/spinner.py index cc29d6091..620d248c4 100644 --- a/reflex/components/radix/themes/components/spinner.py +++ b/reflex/components/radix/themes/components/spinner.py @@ -5,10 +5,7 @@ from typing import Literal from reflex.components.core.breakpoints import Responsive from reflex.vars.base import Var -from ..base import ( - RadixLoadingProp, - RadixThemesComponent, -) +from ..base import RadixLoadingProp, RadixThemesComponent LiteralSpinnerSize = Literal["1", "2", "3"] diff --git a/reflex/components/radix/themes/components/switch.py b/reflex/components/radix/themes/components/switch.py index dea4913aa..2af4f55bb 100644 --- a/reflex/components/radix/themes/components/switch.py +++ b/reflex/components/radix/themes/components/switch.py @@ -6,10 +6,7 @@ from reflex.components.core.breakpoints import Responsive from reflex.event import EventHandler, passthrough_event_spec from reflex.vars.base import Var -from ..base import ( - LiteralAccentColor, - RadixThemesComponent, -) +from ..base import LiteralAccentColor, RadixThemesComponent LiteralSwitchSize = Literal["1", "2", "3"] diff --git a/reflex/components/radix/themes/components/switch.pyi b/reflex/components/radix/themes/components/switch.pyi index f338cd38f..f0377904b 100644 --- a/reflex/components/radix/themes/components/switch.pyi +++ b/reflex/components/radix/themes/components/switch.pyi @@ -119,7 +119,9 @@ class Switch(RadixThemesComponent): autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, - on_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, diff --git a/reflex/components/radix/themes/components/table.py b/reflex/components/radix/themes/components/table.py index e1f03d4e2..ce1058db5 100644 --- a/reflex/components/radix/themes/components/table.py +++ b/reflex/components/radix/themes/components/table.py @@ -7,9 +7,7 @@ from reflex.components.core.breakpoints import Responsive from reflex.components.el import elements from reflex.vars.base import Var -from ..base import ( - RadixThemesComponent, -) +from ..base import RadixThemesComponent class TableRoot(elements.Table, RadixThemesComponent): diff --git a/reflex/components/radix/themes/components/tabs.py b/reflex/components/radix/themes/components/tabs.py index ac04c1a3d..adfb32fab 100644 --- a/reflex/components/radix/themes/components/tabs.py +++ b/reflex/components/radix/themes/components/tabs.py @@ -10,10 +10,7 @@ from reflex.components.core.colors import color from reflex.event import EventHandler, passthrough_event_spec from reflex.vars.base import Var -from ..base import ( - LiteralAccentColor, - RadixThemesComponent, -) +from ..base import LiteralAccentColor, RadixThemesComponent vertical_orientation_css = "&[data-orientation='vertical']" diff --git a/reflex/components/radix/themes/components/tabs.pyi b/reflex/components/radix/themes/components/tabs.pyi index ef043e984..286c6130b 100644 --- a/reflex/components/radix/themes/components/tabs.pyi +++ b/reflex/components/radix/themes/components/tabs.pyi @@ -41,7 +41,9 @@ class TabsRoot(RadixThemesComponent): autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, - on_change: Optional[EventType[[str], BASE_STATE]] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, @@ -341,7 +343,9 @@ class Tabs(ComponentNamespace): autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, - on_change: Optional[EventType[[str], BASE_STATE]] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, diff --git a/reflex/components/radix/themes/components/text_area.py b/reflex/components/radix/themes/components/text_area.py index 9f006c2e3..87f56e911 100644 --- a/reflex/components/radix/themes/components/text_area.py +++ b/reflex/components/radix/themes/components/text_area.py @@ -8,11 +8,7 @@ from reflex.components.core.debounce import DebounceInput from reflex.components.el import elements from reflex.vars.base import Var -from ..base import ( - LiteralAccentColor, - LiteralRadius, - RadixThemesComponent, -) +from ..base import LiteralAccentColor, LiteralRadius, RadixThemesComponent LiteralTextAreaSize = Literal["1", "2", "3"] diff --git a/reflex/components/radix/themes/components/text_area.pyi b/reflex/components/radix/themes/components/text_area.pyi index f38ef1b00..bf650c10d 100644 --- a/reflex/components/radix/themes/components/text_area.pyi +++ b/reflex/components/radix/themes/components/text_area.pyi @@ -7,7 +7,7 @@ from typing import Any, Dict, Literal, Optional, Union, overload from reflex.components.core.breakpoints import Breakpoints from reflex.components.el import elements -from reflex.event import BASE_STATE, EventType +from reflex.event import BASE_STATE, EventType, KeyInputInfo from reflex.style import Style from reflex.vars.base import Var @@ -168,14 +168,32 @@ class TextArea(RadixThemesComponent, elements.Textarea): class_name: Optional[Any] = None, autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, - on_blur: Optional[EventType[[str], BASE_STATE]] = None, - on_change: Optional[EventType[[str], BASE_STATE]] = None, + on_blur: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, - on_focus: Optional[EventType[[str], BASE_STATE]] = None, - on_key_down: Optional[EventType[[str], BASE_STATE]] = None, - on_key_up: Optional[EventType[[str], BASE_STATE]] = None, + on_focus: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, + on_key_down: Optional[ + Union[ + EventType[[], BASE_STATE], + EventType[[str], BASE_STATE], + EventType[[str, KeyInputInfo], BASE_STATE], + ] + ] = None, + on_key_up: Optional[ + Union[ + EventType[[], BASE_STATE], + EventType[[str], BASE_STATE], + EventType[[str, KeyInputInfo], BASE_STATE], + ] + ] = None, on_mount: Optional[EventType[[], BASE_STATE]] = None, on_mouse_down: Optional[EventType[[], BASE_STATE]] = None, on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None, diff --git a/reflex/components/radix/themes/components/text_field.py b/reflex/components/radix/themes/components/text_field.py index 4277e93e0..d5d851839 100644 --- a/reflex/components/radix/themes/components/text_field.py +++ b/reflex/components/radix/themes/components/text_field.py @@ -11,11 +11,7 @@ from reflex.components.el import elements from reflex.event import EventHandler, input_event, key_event from reflex.vars.base import Var -from ..base import ( - LiteralAccentColor, - LiteralRadius, - RadixThemesComponent, -) +from ..base import LiteralAccentColor, LiteralRadius, RadixThemesComponent LiteralTextFieldSize = Literal["1", "2", "3"] LiteralTextFieldVariant = Literal["classic", "surface", "soft"] diff --git a/reflex/components/radix/themes/components/text_field.pyi b/reflex/components/radix/themes/components/text_field.pyi index 9d949e299..455e47fcf 100644 --- a/reflex/components/radix/themes/components/text_field.pyi +++ b/reflex/components/radix/themes/components/text_field.pyi @@ -8,7 +8,7 @@ from typing import Any, Dict, Literal, Optional, Union, overload from reflex.components.component import ComponentNamespace from reflex.components.core.breakpoints import Breakpoints from reflex.components.el import elements -from reflex.event import BASE_STATE, EventType +from reflex.event import BASE_STATE, EventType, KeyInputInfo from reflex.style import Style from reflex.vars.base import Var @@ -149,14 +149,32 @@ class TextFieldRoot(elements.Div, RadixThemesComponent): class_name: Optional[Any] = None, autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, - on_blur: Optional[EventType[[str], BASE_STATE]] = None, - on_change: Optional[EventType[[str], BASE_STATE]] = None, + on_blur: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, - on_focus: Optional[EventType[[str], BASE_STATE]] = None, - on_key_down: Optional[EventType[[str], BASE_STATE]] = None, - on_key_up: Optional[EventType[[str], BASE_STATE]] = None, + on_focus: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, + on_key_down: Optional[ + Union[ + EventType[[], BASE_STATE], + EventType[[str], BASE_STATE], + EventType[[str, KeyInputInfo], BASE_STATE], + ] + ] = None, + on_key_up: Optional[ + Union[ + EventType[[], BASE_STATE], + EventType[[str], BASE_STATE], + EventType[[str, KeyInputInfo], BASE_STATE], + ] + ] = None, on_mount: Optional[EventType[[], BASE_STATE]] = None, on_mouse_down: Optional[EventType[[], BASE_STATE]] = None, on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None, @@ -466,14 +484,32 @@ class TextField(ComponentNamespace): class_name: Optional[Any] = None, autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, - on_blur: Optional[EventType[[str], BASE_STATE]] = None, - on_change: Optional[EventType[[str], BASE_STATE]] = None, + on_blur: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, - on_focus: Optional[EventType[[str], BASE_STATE]] = None, - on_key_down: Optional[EventType[[str], BASE_STATE]] = None, - on_key_up: Optional[EventType[[str], BASE_STATE]] = None, + on_focus: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, + on_key_down: Optional[ + Union[ + EventType[[], BASE_STATE], + EventType[[str], BASE_STATE], + EventType[[str, KeyInputInfo], BASE_STATE], + ] + ] = None, + on_key_up: Optional[ + Union[ + EventType[[], BASE_STATE], + EventType[[str], BASE_STATE], + EventType[[str, KeyInputInfo], BASE_STATE], + ] + ] = None, on_mount: Optional[EventType[[], BASE_STATE]] = None, on_mouse_down: Optional[EventType[[], BASE_STATE]] = None, on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None, diff --git a/reflex/components/radix/themes/components/tooltip.py b/reflex/components/radix/themes/components/tooltip.py index 3bc61f545..07bab1a4a 100644 --- a/reflex/components/radix/themes/components/tooltip.py +++ b/reflex/components/radix/themes/components/tooltip.py @@ -7,9 +7,7 @@ from reflex.event import EventHandler, no_args_event_spec, passthrough_event_spe from reflex.utils import format from reflex.vars.base import Var -from ..base import ( - RadixThemesComponent, -) +from ..base import RadixThemesComponent LiteralSideType = Literal[ "top", diff --git a/reflex/components/radix/themes/components/tooltip.pyi b/reflex/components/radix/themes/components/tooltip.pyi index ba59287eb..a46897e32 100644 --- a/reflex/components/radix/themes/components/tooltip.pyi +++ b/reflex/components/radix/themes/components/tooltip.pyi @@ -5,10 +5,7 @@ # ------------------------------------------------------ from typing import Any, Dict, Literal, Optional, Union, overload -from reflex.event import ( - BASE_STATE, - EventType, -) +from reflex.event import BASE_STATE, EventType from reflex.style import Style from reflex.vars.base import Var @@ -79,7 +76,9 @@ class Tooltip(RadixThemesComponent): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_open_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_open_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_pointer_down_outside: Optional[EventType[[], BASE_STATE]] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, diff --git a/reflex/components/radix/themes/layout/base.py b/reflex/components/radix/themes/layout/base.py index 3ee78d209..61ba19710 100644 --- a/reflex/components/radix/themes/layout/base.py +++ b/reflex/components/radix/themes/layout/base.py @@ -7,11 +7,7 @@ from typing import Literal from reflex.components.core.breakpoints import Responsive from reflex.vars.base import Var -from ..base import ( - CommonMarginProps, - LiteralSpacing, - RadixThemesComponent, -) +from ..base import CommonMarginProps, LiteralSpacing, RadixThemesComponent LiteralBoolNumber = Literal["0", "1"] diff --git a/reflex/components/radix/themes/layout/flex.py b/reflex/components/radix/themes/layout/flex.py index 8be16973d..4403a9542 100644 --- a/reflex/components/radix/themes/layout/flex.py +++ b/reflex/components/radix/themes/layout/flex.py @@ -8,12 +8,7 @@ from reflex.components.core.breakpoints import Responsive from reflex.components.el import elements from reflex.vars.base import Var -from ..base import ( - LiteralAlign, - LiteralJustify, - LiteralSpacing, - RadixThemesComponent, -) +from ..base import LiteralAlign, LiteralJustify, LiteralSpacing, RadixThemesComponent LiteralFlexDirection = Literal["row", "column", "row-reverse", "column-reverse"] LiteralFlexWrap = Literal["nowrap", "wrap", "wrap-reverse"] diff --git a/reflex/components/radix/themes/layout/grid.py b/reflex/components/radix/themes/layout/grid.py index b9ac28d41..3601e213a 100644 --- a/reflex/components/radix/themes/layout/grid.py +++ b/reflex/components/radix/themes/layout/grid.py @@ -8,12 +8,7 @@ from reflex.components.core.breakpoints import Responsive from reflex.components.el import elements from reflex.vars.base import Var -from ..base import ( - LiteralAlign, - LiteralJustify, - LiteralSpacing, - RadixThemesComponent, -) +from ..base import LiteralAlign, LiteralJustify, LiteralSpacing, RadixThemesComponent LiteralGridFlow = Literal["row", "column", "dense", "row-dense", "column-dense"] diff --git a/reflex/components/radix/themes/typography/blockquote.py b/reflex/components/radix/themes/typography/blockquote.py index a60c05471..e32172e00 100644 --- a/reflex/components/radix/themes/typography/blockquote.py +++ b/reflex/components/radix/themes/typography/blockquote.py @@ -9,14 +9,8 @@ from reflex.components.core.breakpoints import Responsive from reflex.components.el import elements from reflex.vars.base import Var -from ..base import ( - LiteralAccentColor, - RadixThemesComponent, -) -from .base import ( - LiteralTextSize, - LiteralTextWeight, -) +from ..base import LiteralAccentColor, RadixThemesComponent +from .base import LiteralTextSize, LiteralTextWeight class Blockquote(elements.Blockquote, RadixThemesComponent): diff --git a/reflex/components/radix/themes/typography/code.py b/reflex/components/radix/themes/typography/code.py index 663f260da..ca19859d3 100644 --- a/reflex/components/radix/themes/typography/code.py +++ b/reflex/components/radix/themes/typography/code.py @@ -9,15 +9,8 @@ from reflex.components.core.breakpoints import Responsive from reflex.components.el import elements from reflex.vars.base import Var -from ..base import ( - LiteralAccentColor, - LiteralVariant, - RadixThemesComponent, -) -from .base import ( - LiteralTextSize, - LiteralTextWeight, -) +from ..base import LiteralAccentColor, LiteralVariant, RadixThemesComponent +from .base import LiteralTextSize, LiteralTextWeight class Code(elements.Code, RadixThemesComponent): diff --git a/reflex/components/radix/themes/typography/heading.py b/reflex/components/radix/themes/typography/heading.py index f5fec8bb1..03e109717 100644 --- a/reflex/components/radix/themes/typography/heading.py +++ b/reflex/components/radix/themes/typography/heading.py @@ -9,16 +9,8 @@ from reflex.components.core.breakpoints import Responsive from reflex.components.el import elements from reflex.vars.base import Var -from ..base import ( - LiteralAccentColor, - RadixThemesComponent, -) -from .base import ( - LiteralTextAlign, - LiteralTextSize, - LiteralTextTrim, - LiteralTextWeight, -) +from ..base import LiteralAccentColor, RadixThemesComponent +from .base import LiteralTextAlign, LiteralTextSize, LiteralTextTrim, LiteralTextWeight class Heading(elements.H1, RadixThemesComponent): diff --git a/reflex/components/radix/themes/typography/link.py b/reflex/components/radix/themes/typography/link.py index e51209dce..6e3d2f983 100644 --- a/reflex/components/radix/themes/typography/link.py +++ b/reflex/components/radix/themes/typography/link.py @@ -16,15 +16,8 @@ from reflex.components.next.link import NextLink from reflex.utils.imports import ImportDict from reflex.vars.base import Var -from ..base import ( - LiteralAccentColor, - RadixThemesComponent, -) -from .base import ( - LiteralTextSize, - LiteralTextTrim, - LiteralTextWeight, -) +from ..base import LiteralAccentColor, RadixThemesComponent +from .base import LiteralTextSize, LiteralTextTrim, LiteralTextWeight LiteralLinkUnderline = Literal["auto", "hover", "always", "none"] diff --git a/reflex/components/radix/themes/typography/text.py b/reflex/components/radix/themes/typography/text.py index 24b09c753..e3576360a 100644 --- a/reflex/components/radix/themes/typography/text.py +++ b/reflex/components/radix/themes/typography/text.py @@ -12,16 +12,8 @@ from reflex.components.core.breakpoints import Responsive from reflex.components.el import elements from reflex.vars.base import Var -from ..base import ( - LiteralAccentColor, - RadixThemesComponent, -) -from .base import ( - LiteralTextAlign, - LiteralTextSize, - LiteralTextTrim, - LiteralTextWeight, -) +from ..base import LiteralAccentColor, RadixThemesComponent +from .base import LiteralTextAlign, LiteralTextSize, LiteralTextTrim, LiteralTextWeight LiteralType = Literal[ "p", diff --git a/reflex/components/react_player/audio.pyi b/reflex/components/react_player/audio.pyi index 9f52cebf6..a092251fe 100644 --- a/reflex/components/react_player/audio.pyi +++ b/reflex/components/react_player/audio.pyi @@ -42,7 +42,9 @@ class Audio(ReactPlayer): on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_disable_pip: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, - on_duration: Optional[EventType[[float], BASE_STATE]] = None, + on_duration: Optional[ + Union[EventType[[], BASE_STATE], EventType[[float], BASE_STATE]] + ] = None, on_enable_pip: Optional[EventType[[], BASE_STATE]] = None, on_ended: Optional[EventType[[], BASE_STATE]] = None, on_error: Optional[EventType[[], BASE_STATE]] = None, @@ -60,13 +62,18 @@ class Audio(ReactPlayer): on_playback_quality_change: Optional[EventType[[], BASE_STATE]] = None, on_playback_rate_change: Optional[EventType[[], BASE_STATE]] = None, on_progress: Optional[ - EventType[ - [reflex.components.react_player.react_player.Progress], BASE_STATE + Union[ + EventType[[], BASE_STATE], + EventType[ + [reflex.components.react_player.react_player.Progress], BASE_STATE + ], ] ] = None, on_ready: Optional[EventType[[], BASE_STATE]] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, - on_seek: Optional[EventType[[float], BASE_STATE]] = None, + on_seek: Optional[ + Union[EventType[[], BASE_STATE], EventType[[float], BASE_STATE]] + ] = None, on_start: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, diff --git a/reflex/components/react_player/react_player.pyi b/reflex/components/react_player/react_player.pyi index 64e8d05b7..06ec95aab 100644 --- a/reflex/components/react_player/react_player.pyi +++ b/reflex/components/react_player/react_player.pyi @@ -47,7 +47,9 @@ class ReactPlayer(NoSSRComponent): on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_disable_pip: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, - on_duration: Optional[EventType[[float], BASE_STATE]] = None, + on_duration: Optional[ + Union[EventType[[], BASE_STATE], EventType[[float], BASE_STATE]] + ] = None, on_enable_pip: Optional[EventType[[], BASE_STATE]] = None, on_ended: Optional[EventType[[], BASE_STATE]] = None, on_error: Optional[EventType[[], BASE_STATE]] = None, @@ -64,10 +66,14 @@ class ReactPlayer(NoSSRComponent): on_play: Optional[EventType[[], BASE_STATE]] = None, on_playback_quality_change: Optional[EventType[[], BASE_STATE]] = None, on_playback_rate_change: Optional[EventType[[], BASE_STATE]] = None, - on_progress: Optional[EventType[[Progress], BASE_STATE]] = None, + on_progress: Optional[ + Union[EventType[[], BASE_STATE], EventType[[Progress], BASE_STATE]] + ] = None, on_ready: Optional[EventType[[], BASE_STATE]] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, - on_seek: Optional[EventType[[float], BASE_STATE]] = None, + on_seek: Optional[ + Union[EventType[[], BASE_STATE], EventType[[float], BASE_STATE]] + ] = None, on_start: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, diff --git a/reflex/components/react_player/video.pyi b/reflex/components/react_player/video.pyi index 28f3e169b..a8f881ceb 100644 --- a/reflex/components/react_player/video.pyi +++ b/reflex/components/react_player/video.pyi @@ -42,7 +42,9 @@ class Video(ReactPlayer): on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_disable_pip: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, - on_duration: Optional[EventType[[float], BASE_STATE]] = None, + on_duration: Optional[ + Union[EventType[[], BASE_STATE], EventType[[float], BASE_STATE]] + ] = None, on_enable_pip: Optional[EventType[[], BASE_STATE]] = None, on_ended: Optional[EventType[[], BASE_STATE]] = None, on_error: Optional[EventType[[], BASE_STATE]] = None, @@ -60,13 +62,18 @@ class Video(ReactPlayer): on_playback_quality_change: Optional[EventType[[], BASE_STATE]] = None, on_playback_rate_change: Optional[EventType[[], BASE_STATE]] = None, on_progress: Optional[ - EventType[ - [reflex.components.react_player.react_player.Progress], BASE_STATE + Union[ + EventType[[], BASE_STATE], + EventType[ + [reflex.components.react_player.react_player.Progress], BASE_STATE + ], ] ] = None, on_ready: Optional[EventType[[], BASE_STATE]] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, - on_seek: Optional[EventType[[float], BASE_STATE]] = None, + on_seek: Optional[ + Union[EventType[[], BASE_STATE], EventType[[float], BASE_STATE]] + ] = None, on_start: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, diff --git a/reflex/components/recharts/cartesian.pyi b/reflex/components/recharts/cartesian.pyi index f143d411b..24d85f013 100644 --- a/reflex/components/recharts/cartesian.pyi +++ b/reflex/components/recharts/cartesian.pyi @@ -10,9 +10,7 @@ from reflex.event import BASE_STATE, EventType from reflex.style import Style from reflex.vars.base import Var -from .recharts import ( - Recharts, -) +from .recharts import Recharts class Axis(Recharts): @overload diff --git a/reflex/components/recharts/charts.pyi b/reflex/components/recharts/charts.pyi index 4a2a9e332..94cabdf00 100644 --- a/reflex/components/recharts/charts.pyi +++ b/reflex/components/recharts/charts.pyi @@ -10,9 +10,7 @@ from reflex.event import BASE_STATE, EventType from reflex.style import Style from reflex.vars.base import Var -from .recharts import ( - RechartsCharts, -) +from .recharts import RechartsCharts class ChartBase(RechartsCharts): @overload diff --git a/reflex/components/recharts/general.pyi b/reflex/components/recharts/general.pyi index 996eb90ce..fa3362500 100644 --- a/reflex/components/recharts/general.pyi +++ b/reflex/components/recharts/general.pyi @@ -11,9 +11,7 @@ from reflex.event import BASE_STATE, EventType from reflex.style import Style from reflex.vars.base import Var -from .recharts import ( - Recharts, -) +from .recharts import Recharts class ResponsiveContainer(Recharts, MemoizationLeaf): @overload diff --git a/reflex/components/recharts/polar.pyi b/reflex/components/recharts/polar.pyi index 1c8d7316e..308c796cf 100644 --- a/reflex/components/recharts/polar.pyi +++ b/reflex/components/recharts/polar.pyi @@ -10,9 +10,7 @@ from reflex.event import BASE_STATE, EventType from reflex.style import Style from reflex.vars.base import Var -from .recharts import ( - Recharts, -) +from .recharts import Recharts class Pie(Recharts): def get_event_triggers(self) -> dict[str, Union[Var, Any]]: ... diff --git a/reflex/components/suneditor/editor.pyi b/reflex/components/suneditor/editor.pyi index e89d708ed..8ada33aba 100644 --- a/reflex/components/suneditor/editor.pyi +++ b/reflex/components/suneditor/editor.pyi @@ -127,8 +127,12 @@ class Editor(NoSSRComponent): class_name: Optional[Any] = None, autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, - on_blur: Optional[EventType[[str], BASE_STATE]] = None, - on_change: Optional[EventType[[str], BASE_STATE]] = None, + on_blur: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, + on_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[str], BASE_STATE]] + ] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_copy: Optional[EventType[[], BASE_STATE]] = None, @@ -136,7 +140,9 @@ class Editor(NoSSRComponent): on_double_click: Optional[EventType[[], BASE_STATE]] = None, on_focus: Optional[EventType[[], BASE_STATE]] = None, on_input: Optional[EventType[[], BASE_STATE]] = None, - on_load: Optional[EventType[[bool], BASE_STATE]] = None, + on_load: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_mount: Optional[EventType[[], BASE_STATE]] = None, on_mouse_down: Optional[EventType[[], BASE_STATE]] = None, on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None, @@ -145,11 +151,21 @@ class Editor(NoSSRComponent): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_paste: Optional[EventType[[str, bool], BASE_STATE]] = None, + on_paste: Optional[ + Union[ + EventType[[], BASE_STATE], + EventType[[str], BASE_STATE], + EventType[[str, bool], BASE_STATE], + ] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, - toggle_code_view: Optional[EventType[[bool], BASE_STATE]] = None, - toggle_full_screen: Optional[EventType[[bool], BASE_STATE]] = None, + toggle_code_view: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, + toggle_full_screen: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, **props, ) -> "Editor": """Create an instance of Editor. No children allowed. diff --git a/reflex/components/tags/iter_tag.py b/reflex/components/tags/iter_tag.py index fec27f3d9..38ecaf81c 100644 --- a/reflex/components/tags/iter_tag.py +++ b/reflex/components/tags/iter_tag.py @@ -4,16 +4,7 @@ from __future__ import annotations import dataclasses import inspect -from typing import ( - TYPE_CHECKING, - Any, - Callable, - Iterable, - Tuple, - Type, - Union, - get_args, -) +from typing import TYPE_CHECKING, Any, Callable, Iterable, Tuple, Type, Union, get_args from reflex.components.tags.tag import Tag from reflex.vars import LiteralArrayVar, Var, get_unique_variable_name diff --git a/reflex/constants/__init__.py b/reflex/constants/__init__.py index a939cf273..e816da0f7 100644 --- a/reflex/constants/__init__.py +++ b/reflex/constants/__init__.py @@ -41,16 +41,9 @@ from .config import ( GitIgnore, RequirementsTxt, ) -from .custom_components import ( - CustomComponents, -) +from .custom_components import CustomComponents from .event import Endpoint, EventTriggers, SocketEvent -from .installer import ( - Bun, - Fnm, - Node, - PackageJson, -) +from .installer import Bun, Fnm, Node, PackageJson from .route import ( ROUTE_NOT_FOUND, ROUTER, diff --git a/reflex/event.py b/reflex/event.py index ddcf389ea..e51d1cc07 100644 --- a/reflex/event.py +++ b/reflex/event.py @@ -30,6 +30,7 @@ from typing_extensions import ( ParamSpec, Protocol, TypeAliasType, + TypedDict, TypeVar, get_args, get_origin, @@ -38,16 +39,10 @@ from typing_extensions import ( from reflex import constants from reflex.constants.state import FRONTEND_EVENT_STATE from reflex.utils import console, format -from reflex.utils.exceptions import ( - EventFnArgMismatch, - EventHandlerArgTypeMismatch, -) +from reflex.utils.exceptions import EventFnArgMismatch, EventHandlerArgTypeMismatch from reflex.utils.types import ArgsSpec, GenericType, typehint_issubclass from reflex.vars import VarData -from reflex.vars.base import ( - LiteralVar, - Var, -) +from reflex.vars.base import LiteralVar, Var from reflex.vars.function import ( ArgsFunctionOperation, FunctionStringVar, @@ -448,6 +443,10 @@ class JavasciptKeyboardEvent: """Interface for a Javascript KeyboardEvent https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent.""" key: str = "" + altKey: bool = False + ctrlKey: bool = False + metaKey: bool = False + shiftKey: bool = False def input_event(e: Var[JavascriptInputEvent]) -> Tuple[Var[str]]: @@ -462,7 +461,16 @@ def input_event(e: Var[JavascriptInputEvent]) -> Tuple[Var[str]]: return (e.target.value,) -def key_event(e: Var[JavasciptKeyboardEvent]) -> Tuple[Var[str]]: +class KeyInputInfo(TypedDict): + """Information about a key input event.""" + + alt_key: bool + ctrl_key: bool + meta_key: bool + shift_key: bool + + +def key_event(e: Var[JavasciptKeyboardEvent]) -> Tuple[Var[str], Var[KeyInputInfo]]: """Get the key from a keyboard event. Args: @@ -471,7 +479,17 @@ def key_event(e: Var[JavasciptKeyboardEvent]) -> Tuple[Var[str]]: Returns: The key from the keyboard event. """ - return (e.key,) + return ( + e.key, + Var.create( + { + "alt_key": e.altKey, + "ctrl_key": e.ctrlKey, + "meta_key": e.metaKey, + "shift_key": e.shiftKey, + }, + ), + ) def no_args_event_spec() -> Tuple[()]: diff --git a/reflex/experimental/client_state.py b/reflex/experimental/client_state.py index ca14b8d2a..a1abce3ea 100644 --- a/reflex/experimental/client_state.py +++ b/reflex/experimental/client_state.py @@ -10,10 +10,7 @@ from typing import Any, Callable, Union from reflex import constants from reflex.event import EventChain, EventHandler, EventSpec, run_script from reflex.utils.imports import ImportVar -from reflex.vars import ( - VarData, - get_unique_variable_name, -) +from reflex.vars import VarData, get_unique_variable_name from reflex.vars.base import LiteralVar, Var from reflex.vars.function import FunctionVar diff --git a/reflex/experimental/layout.pyi b/reflex/experimental/layout.pyi index bfac49161..a334e8de7 100644 --- a/reflex/experimental/layout.pyi +++ b/reflex/experimental/layout.pyi @@ -119,7 +119,9 @@ class DrawerSidebar(DrawerRoot): class_name: Optional[Any] = None, autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, - on_animation_end: Optional[EventType[[bool], BASE_STATE]] = None, + on_animation_end: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, on_click: Optional[EventType[[], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, @@ -133,7 +135,9 @@ class DrawerSidebar(DrawerRoot): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_open_change: Optional[EventType[[bool], BASE_STATE]] = None, + on_open_change: Optional[ + Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]] + ] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, diff --git a/reflex/istate/wrappers.py b/reflex/istate/wrappers.py index 7f010eb9e..d4e74cf8a 100644 --- a/reflex/istate/wrappers.py +++ b/reflex/istate/wrappers.py @@ -3,11 +3,7 @@ from typing import Any from reflex.istate.proxy import ReadOnlyStateProxy -from reflex.state import ( - _split_substate_key, - _substate_key, - get_state_manager, -) +from reflex.state import _split_substate_key, _substate_key, get_state_manager async def get_state(token, state_cls: Any | None = None) -> ReadOnlyStateProxy: diff --git a/reflex/state.py b/reflex/state.py index a53df7b6f..94ff35a88 100644 --- a/reflex/state.py +++ b/reflex/state.py @@ -44,9 +44,7 @@ from typing_extensions import Self from reflex import event from reflex.config import get_config from reflex.istate.data import RouterData -from reflex.istate.storage import ( - ClientStorageBase, -) +from reflex.istate.storage import ClientStorageBase from reflex.vars.base import ( ComputedVar, DynamicRouteVar, diff --git a/reflex/utils/pyi_generator.py b/reflex/utils/pyi_generator.py index 8fe46fe9e..fb0a8f8c5 100644 --- a/reflex/utils/pyi_generator.py +++ b/reflex/utils/pyi_generator.py @@ -76,6 +76,7 @@ DEFAULT_IMPORTS = { "EventSpec", "EventType", "BASE_STATE", + "KeyInputInfo", ], "reflex.style": ["Style"], "reflex.vars.base": ["Var"], @@ -509,11 +510,18 @@ def _generate_component_create_functiondef( # Convert each argument type to its AST representation type_args = [type_to_ast(arg, cls=clz) for arg in arguments_without_var] - # Join the type arguments with commas for EventType - args_str = ", ".join(ast.unparse(arg) for arg in type_args) + # Get all prefixes of the type arguments + all_count_args_type = [ + ast.Name( + f"EventType[[{', '.join([ast.unparse(arg) for arg in type_args[:i]])}], BASE_STATE]" + ) + for i in range(len(type_args) + 1) + ] # Create EventType using the joined string - return ast.Name(id=f"EventType[[{args_str}], BASE_STATE]") + return ast.Name( + id=f"Union[{', '.join(map(ast.unparse, all_count_args_type))}]" + ) if isinstance(annotation, str) and annotation.startswith("Tuple["): inside_of_tuple = annotation.removeprefix("Tuple[").removesuffix("]") @@ -545,8 +553,15 @@ def _generate_component_create_functiondef( for argument in arguments ] + all_count_args_type = [ + ast.Name( + f"EventType[[{', '.join(arguments_without_var[:i])}], BASE_STATE]" + ) + for i in range(len(arguments) + 1) + ] + return ast.Name( - id=f"EventType[[{', '.join(arguments_without_var)}], BASE_STATE]" + id=f"Union[{', '.join(map(ast.unparse, all_count_args_type))}]" ) return ast.Name(id="EventType[..., BASE_STATE]") diff --git a/reflex/utils/types.py b/reflex/utils/types.py index bcb52464a..27b6e7ce7 100644 --- a/reflex/utils/types.py +++ b/reflex/utils/types.py @@ -26,9 +26,7 @@ from typing import ( get_args, get_type_hints, ) -from typing import ( - get_origin as get_origin_og, -) +from typing import get_origin as get_origin_og import sqlalchemy @@ -42,12 +40,7 @@ except ModuleNotFoundError: from sqlalchemy.ext.associationproxy import AssociationProxyInstance from sqlalchemy.ext.hybrid import hybrid_property -from sqlalchemy.orm import ( - DeclarativeBase, - Mapped, - QueryableAttribute, - Relationship, -) +from sqlalchemy.orm import DeclarativeBase, Mapped, QueryableAttribute, Relationship from reflex import constants from reflex.base import Base diff --git a/reflex/vars/base.py b/reflex/vars/base.py index 0e6bbaec7..1fa0a539e 100644 --- a/reflex/vars/base.py +++ b/reflex/vars/base.py @@ -38,13 +38,7 @@ from typing import ( overload, ) -from typing_extensions import ( - ParamSpec, - TypeGuard, - deprecated, - get_type_hints, - override, -) +from typing_extensions import ParamSpec, TypeGuard, deprecated, get_type_hints, override from reflex import constants from reflex.base import Base @@ -75,10 +69,7 @@ from reflex.utils.types import ( if TYPE_CHECKING: from reflex.state import BaseState - from .number import ( - BooleanVar, - NumberVar, - ) + from .number import BooleanVar, NumberVar from .object import ObjectVar from .sequence import ArrayVar, StringVar diff --git a/reflex/vars/function.py b/reflex/vars/function.py index 9d734a458..49ef99614 100644 --- a/reflex/vars/function.py +++ b/reflex/vars/function.py @@ -8,13 +8,7 @@ from typing import Any, Callable, Optional, Tuple, Type, Union from reflex.utils.types import GenericType -from .base import ( - CachedVarOperation, - LiteralVar, - Var, - VarData, - cached_property_no_lock, -) +from .base import CachedVarOperation, LiteralVar, Var, VarData, cached_property_no_lock class FunctionVar(Var[Callable], python_types=Callable): diff --git a/tests/units/components/test_component.py b/tests/units/components/test_component.py index 111431ab3..e4744b9fb 100644 --- a/tests/units/components/test_component.py +++ b/tests/units/components/test_component.py @@ -27,9 +27,7 @@ from reflex.event import ( from reflex.state import BaseState from reflex.style import Style from reflex.utils import imports -from reflex.utils.exceptions import ( - EventFnArgMismatch, -) +from reflex.utils.exceptions import EventFnArgMismatch from reflex.utils.imports import ImportDict, ImportVar, ParsedImportDict, parse_imports from reflex.vars import VarData from reflex.vars.base import LiteralVar, Var diff --git a/tests/units/test_var.py b/tests/units/test_var.py index 2f3f81e2c..8ff829eac 100644 --- a/tests/units/test_var.py +++ b/tests/units/test_var.py @@ -23,11 +23,7 @@ from reflex.vars.base import ( var_operation_return, ) from reflex.vars.function import ArgsFunctionOperation, FunctionStringVar -from reflex.vars.number import ( - LiteralBooleanVar, - LiteralNumberVar, - NumberVar, -) +from reflex.vars.number import LiteralBooleanVar, LiteralNumberVar, NumberVar from reflex.vars.object import LiteralObjectVar, ObjectVar from reflex.vars.sequence import ( ArrayVar, diff --git a/tests/units/utils/test_utils.py b/tests/units/utils/test_utils.py index c04df9c75..dd1a3b3ef 100644 --- a/tests/units/utils/test_utils.py +++ b/tests/units/utils/test_utils.py @@ -13,11 +13,7 @@ from reflex.base import Base from reflex.config import environment from reflex.event import EventHandler from reflex.state import BaseState -from reflex.utils import ( - build, - prerequisites, - types, -) +from reflex.utils import build, prerequisites, types from reflex.utils import exec as utils_exec from reflex.utils.exceptions import ReflexError, SystemPackageMissingError from reflex.vars.base import Var From 93ae79aa60104ab893fdcff3d615dcdcc11bc25b Mon Sep 17 00:00:00 2001 From: Khaleel Al-Adhami Date: Wed, 6 Nov 2024 15:13:00 -0800 Subject: [PATCH 3/6] fix call_function events sent from backend (#4316) --- reflex/.templates/web/utils/state.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/reflex/.templates/web/utils/state.js b/reflex/.templates/web/utils/state.js index 66df09ee1..3899ddc89 100644 --- a/reflex/.templates/web/utils/state.js +++ b/reflex/.templates/web/utils/state.js @@ -238,7 +238,10 @@ export const applyEvent = async (event, socket) => { return false; } - if (event.name == "_call_function") { + if ( + event.name == "_call_function" && + typeof event.payload.function !== "string" + ) { try { const eval_result = event.payload.function(); if (event.payload.callback) { @@ -257,9 +260,13 @@ export const applyEvent = async (event, socket) => { return false; } - if (event.name == "_call_script") { + if (event.name == "_call_script" || event.name == "_call_function") { try { - const eval_result = eval(event.payload.javascript_code); + const eval_result = + event.name == "_call_script" + ? eval(event.payload.javascript_code) + : eval(event.payload.function)(); + if (event.payload.callback) { if (!!eval_result && typeof eval_result.then === "function") { eval(event.payload.callback)(await eval_result); From 3bd35f53f26263f36762e67ec91817649e7e2a18 Mon Sep 17 00:00:00 2001 From: Khaleel Al-Adhami Date: Wed, 6 Nov 2024 16:41:13 -0800 Subject: [PATCH 4/6] add type hinting for plotly (#4279) * add type hinting for plotly * fix merge --- reflex/components/plotly/plotly.py | 155 ++++++++++++++-------------- reflex/components/plotly/plotly.pyi | 72 ++++++++----- 2 files changed, 124 insertions(+), 103 deletions(-) diff --git a/reflex/components/plotly/plotly.py b/reflex/components/plotly/plotly.py index c93488d40..aff6e62b0 100644 --- a/reflex/components/plotly/plotly.py +++ b/reflex/components/plotly/plotly.py @@ -2,12 +2,13 @@ from __future__ import annotations -from typing import Any, Dict, List +from typing import Any, Dict, List, Tuple, Union + +from typing_extensions import TypedDict, TypeVar -from reflex.base import Base from reflex.components.component import Component, NoSSRComponent from reflex.components.core.cond import color_mode_cond -from reflex.event import EventHandler +from reflex.event import EventHandler, no_args_event_spec from reflex.utils import console from reflex.vars.base import LiteralVar, Var @@ -21,19 +22,7 @@ except ImportError: Template = Any # type: ignore -def _event_data_signature(e0: Var) -> List[Any]: - """For plotly events with event data and no points. - - Args: - e0: The event data. - - Returns: - The event key extracted from the event data (if defined). - """ - return [Var(_js_expr=f"{e0}?.event")] - - -def _event_points_data_signature(e0: Var) -> List[Any]: +def _event_points_data_signature(e0: Var) -> Tuple[Var[List[Point]]]: """For plotly events with event data containing a point array. Args: @@ -42,51 +31,63 @@ def _event_points_data_signature(e0: Var) -> List[Any]: Returns: The event data and the extracted points. """ - return [ - Var(_js_expr=f"{e0}?.event"), - Var(_js_expr=f"extractPoints({e0}?.points)"), + return (Var(_js_expr=f"extractPoints({e0}?.points)"),) + + +T = TypeVar("T") + +ItemOrList = Union[T, List[T]] + + +class BBox(TypedDict): + """Bounding box for a point in a plotly graph.""" + + x0: Union[float, int, None] + x1: Union[float, int, None] + y0: Union[float, int, None] + y1: Union[float, int, None] + z0: Union[float, int, None] + z1: Union[float, int, None] + + +class Point(TypedDict): + """A point in a plotly graph.""" + + x: Union[float, int, None] + y: Union[float, int, None] + z: Union[float, int, None] + lat: Union[float, int, None] + lon: Union[float, int, None] + curveNumber: Union[int, None] + pointNumber: Union[int, None] + pointNumbers: Union[List[int], None] + pointIndex: Union[int, None] + markerColor: Union[ + ItemOrList[ + ItemOrList[ + Union[ + float, + int, + str, + None, + ] + ] + ], + None, ] - - -class _ButtonClickData(Base): - """Event data structure for plotly UI buttons.""" - - menu: Any - button: Any - active: Any - - -def _button_click_signature(e0: _ButtonClickData) -> List[Any]: - """For plotly button click events. - - Args: - e0: The button click data. - - Returns: - The menu, button, and active state. - """ - return [e0.menu, e0.button, e0.active] - - -def _passthrough_signature(e0: Var) -> List[Any]: - """For plotly events with arbitrary serializable data, passed through directly. - - Args: - e0: The event data. - - Returns: - The event data. - """ - return [e0] - - -def _null_signature() -> List[Any]: - """For plotly events with no data or non-serializable data. Nothing passed through. - - Returns: - An empty list (nothing passed through). - """ - return [] + markerSize: Union[ + ItemOrList[ + ItemOrList[ + Union[ + float, + int, + None, + ] + ] + ], + None, + ] + bbox: Union[BBox, None] class Plotly(NoSSRComponent): @@ -116,49 +117,49 @@ class Plotly(NoSSRComponent): use_resize_handler: Var[bool] = LiteralVar.create(True) # Fired after the plot is redrawn. - on_after_plot: EventHandler[_passthrough_signature] + on_after_plot: EventHandler[no_args_event_spec] # Fired after the plot was animated. - on_animated: EventHandler[_null_signature] + on_animated: EventHandler[no_args_event_spec] # Fired while animating a single frame (does not currently pass data through). - on_animating_frame: EventHandler[_null_signature] + on_animating_frame: EventHandler[no_args_event_spec] # Fired when an animation is interrupted (to start a new animation for example). - on_animation_interrupted: EventHandler[_null_signature] + on_animation_interrupted: EventHandler[no_args_event_spec] # Fired when the plot is responsively sized. - on_autosize: EventHandler[_event_data_signature] + on_autosize: EventHandler[no_args_event_spec] # Fired whenever mouse moves over a plot. - on_before_hover: EventHandler[_event_data_signature] + on_before_hover: EventHandler[no_args_event_spec] # Fired when a plotly UI button is clicked. - on_button_clicked: EventHandler[_button_click_signature] + on_button_clicked: EventHandler[no_args_event_spec] # Fired when the plot is clicked. on_click: EventHandler[_event_points_data_signature] # Fired when a selection is cleared (via double click). - on_deselect: EventHandler[_null_signature] + on_deselect: EventHandler[no_args_event_spec] # Fired when the plot is double clicked. - on_double_click: EventHandler[_passthrough_signature] + on_double_click: EventHandler[no_args_event_spec] # Fired when a plot element is hovered over. on_hover: EventHandler[_event_points_data_signature] # Fired after the plot is layed out (zoom, pan, etc). - on_relayout: EventHandler[_passthrough_signature] + on_relayout: EventHandler[no_args_event_spec] # Fired while the plot is being layed out. - on_relayouting: EventHandler[_passthrough_signature] + on_relayouting: EventHandler[no_args_event_spec] # Fired after the plot style is changed. - on_restyle: EventHandler[_passthrough_signature] + on_restyle: EventHandler[no_args_event_spec] # Fired after the plot is redrawn. - on_redraw: EventHandler[_event_data_signature] + on_redraw: EventHandler[no_args_event_spec] # Fired after selecting plot elements. on_selected: EventHandler[_event_points_data_signature] @@ -167,10 +168,10 @@ class Plotly(NoSSRComponent): on_selecting: EventHandler[_event_points_data_signature] # Fired while an animation is occuring. - on_transitioning: EventHandler[_event_data_signature] + on_transitioning: EventHandler[no_args_event_spec] # Fired when a transition is stopped early. - on_transition_interrupted: EventHandler[_event_data_signature] + on_transition_interrupted: EventHandler[no_args_event_spec] # Fired when a hovered element is no longer hovered. on_unhover: EventHandler[_event_points_data_signature] @@ -216,8 +217,8 @@ const extractPoints = (points) => { pointNumber: point.pointNumber, pointNumbers: point.pointNumbers, pointIndex: point.pointIndex, - 'marker.color': point['marker.color'], - 'marker.size': point['marker.size'], + markerColor: point['marker.color'], + markerSize: point['marker.size'], bbox: bbox, }) }) diff --git a/reflex/components/plotly/plotly.pyi b/reflex/components/plotly/plotly.pyi index 4c87d589f..ba3f323f5 100644 --- a/reflex/components/plotly/plotly.pyi +++ b/reflex/components/plotly/plotly.pyi @@ -3,9 +3,10 @@ # ------------------- DO NOT EDIT ---------------------- # This file was generated by `reflex/utils/pyi_generator.py`! # ------------------------------------------------------ -from typing import Any, Dict, Optional, Union, overload +from typing import Any, Dict, List, Optional, Union, overload + +from typing_extensions import TypedDict, TypeVar -from reflex.base import Base from reflex.components.component import NoSSRComponent from reflex.event import BASE_STATE, EventType from reflex.style import Style @@ -20,11 +21,30 @@ except ImportError: console.warn("Plotly is not installed. Please run `pip install plotly`.") Figure = Any Template = Any +T = TypeVar("T") +ItemOrList = Union[T, List[T]] -class _ButtonClickData(Base): - menu: Any - button: Any - active: Any +class BBox(TypedDict): + x0: Union[float, int, None] + x1: Union[float, int, None] + y0: Union[float, int, None] + y1: Union[float, int, None] + z0: Union[float, int, None] + z1: Union[float, int, None] + +class Point(TypedDict): + x: Union[float, int, None] + y: Union[float, int, None] + z: Union[float, int, None] + lat: Union[float, int, None] + lon: Union[float, int, None] + curveNumber: Union[int, None] + pointNumber: Union[int, None] + pointNumbers: Union[List[int], None] + pointIndex: Union[int, None] + markerColor: Union[ItemOrList[ItemOrList[Union[float, int, str, None]]], None] + markerSize: Union[ItemOrList[ItemOrList[Union[float, int, None]]], None] + bbox: Union[BBox, None] class Plotly(NoSSRComponent): def add_imports(self) -> dict[str, str]: ... @@ -45,20 +65,20 @@ class Plotly(NoSSRComponent): class_name: Optional[Any] = None, autofocus: Optional[bool] = None, custom_attrs: Optional[Dict[str, Union[Var, str]]] = None, - on_after_plot: Optional[EventType[..., BASE_STATE]] = None, - on_animated: Optional[EventType[..., BASE_STATE]] = None, - on_animating_frame: Optional[EventType[..., BASE_STATE]] = None, - on_animation_interrupted: Optional[EventType[..., BASE_STATE]] = None, - on_autosize: Optional[EventType[..., BASE_STATE]] = None, - on_before_hover: Optional[EventType[..., BASE_STATE]] = None, + on_after_plot: Optional[EventType[[], BASE_STATE]] = None, + on_animated: Optional[EventType[[], BASE_STATE]] = None, + on_animating_frame: Optional[EventType[[], BASE_STATE]] = None, + on_animation_interrupted: Optional[EventType[[], BASE_STATE]] = None, + on_autosize: Optional[EventType[[], BASE_STATE]] = None, + on_before_hover: Optional[EventType[[], BASE_STATE]] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, - on_button_clicked: Optional[EventType[..., BASE_STATE]] = None, - on_click: Optional[EventType[..., BASE_STATE]] = None, + on_button_clicked: Optional[EventType[[], BASE_STATE]] = None, + on_click: Optional[EventType[[List[Point]], BASE_STATE]] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, - on_deselect: Optional[EventType[..., BASE_STATE]] = None, - on_double_click: Optional[EventType[..., BASE_STATE]] = None, + on_deselect: Optional[EventType[[], BASE_STATE]] = None, + on_double_click: Optional[EventType[[], BASE_STATE]] = None, on_focus: Optional[EventType[[], BASE_STATE]] = None, - on_hover: Optional[EventType[..., BASE_STATE]] = None, + on_hover: Optional[EventType[[List[Point]], BASE_STATE]] = None, on_mount: Optional[EventType[[], BASE_STATE]] = None, on_mouse_down: Optional[EventType[[], BASE_STATE]] = None, on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None, @@ -67,16 +87,16 @@ class Plotly(NoSSRComponent): on_mouse_out: Optional[EventType[[], BASE_STATE]] = None, on_mouse_over: Optional[EventType[[], BASE_STATE]] = None, on_mouse_up: Optional[EventType[[], BASE_STATE]] = None, - on_redraw: Optional[EventType[..., BASE_STATE]] = None, - on_relayout: Optional[EventType[..., BASE_STATE]] = None, - on_relayouting: Optional[EventType[..., BASE_STATE]] = None, - on_restyle: Optional[EventType[..., BASE_STATE]] = None, + on_redraw: Optional[EventType[[], BASE_STATE]] = None, + on_relayout: Optional[EventType[[], BASE_STATE]] = None, + on_relayouting: Optional[EventType[[], BASE_STATE]] = None, + on_restyle: Optional[EventType[[], BASE_STATE]] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, - on_selected: Optional[EventType[..., BASE_STATE]] = None, - on_selecting: Optional[EventType[..., BASE_STATE]] = None, - on_transition_interrupted: Optional[EventType[..., BASE_STATE]] = None, - on_transitioning: Optional[EventType[..., BASE_STATE]] = None, - on_unhover: Optional[EventType[..., BASE_STATE]] = None, + on_selected: Optional[EventType[[List[Point]], BASE_STATE]] = None, + on_selecting: Optional[EventType[[List[Point]], BASE_STATE]] = None, + on_transition_interrupted: Optional[EventType[[], BASE_STATE]] = None, + on_transitioning: Optional[EventType[[], BASE_STATE]] = None, + on_unhover: Optional[EventType[[List[Point]], BASE_STATE]] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, ) -> "Plotly": From 68407ce2d84fc975f1be274d719dac218b822de6 Mon Sep 17 00:00:00 2001 From: Khaleel Al-Adhami Date: Wed, 6 Nov 2024 16:56:26 -0800 Subject: [PATCH 5/6] unbreak pyi plotly (#4320) --- reflex/components/plotly/plotly.pyi | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/reflex/components/plotly/plotly.pyi b/reflex/components/plotly/plotly.pyi index ba3f323f5..c9847b67e 100644 --- a/reflex/components/plotly/plotly.pyi +++ b/reflex/components/plotly/plotly.pyi @@ -73,12 +73,16 @@ class Plotly(NoSSRComponent): on_before_hover: Optional[EventType[[], BASE_STATE]] = None, on_blur: Optional[EventType[[], BASE_STATE]] = None, on_button_clicked: Optional[EventType[[], BASE_STATE]] = None, - on_click: Optional[EventType[[List[Point]], BASE_STATE]] = None, + on_click: Optional[ + Union[EventType[[], BASE_STATE], EventType[[List[Point]], BASE_STATE]] + ] = None, on_context_menu: Optional[EventType[[], BASE_STATE]] = None, on_deselect: Optional[EventType[[], BASE_STATE]] = None, on_double_click: Optional[EventType[[], BASE_STATE]] = None, on_focus: Optional[EventType[[], BASE_STATE]] = None, - on_hover: Optional[EventType[[List[Point]], BASE_STATE]] = None, + on_hover: Optional[ + Union[EventType[[], BASE_STATE], EventType[[List[Point]], BASE_STATE]] + ] = None, on_mount: Optional[EventType[[], BASE_STATE]] = None, on_mouse_down: Optional[EventType[[], BASE_STATE]] = None, on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None, @@ -92,11 +96,17 @@ class Plotly(NoSSRComponent): on_relayouting: Optional[EventType[[], BASE_STATE]] = None, on_restyle: Optional[EventType[[], BASE_STATE]] = None, on_scroll: Optional[EventType[[], BASE_STATE]] = None, - on_selected: Optional[EventType[[List[Point]], BASE_STATE]] = None, - on_selecting: Optional[EventType[[List[Point]], BASE_STATE]] = None, + on_selected: Optional[ + Union[EventType[[], BASE_STATE], EventType[[List[Point]], BASE_STATE]] + ] = None, + on_selecting: Optional[ + Union[EventType[[], BASE_STATE], EventType[[List[Point]], BASE_STATE]] + ] = None, on_transition_interrupted: Optional[EventType[[], BASE_STATE]] = None, on_transitioning: Optional[EventType[[], BASE_STATE]] = None, - on_unhover: Optional[EventType[[List[Point]], BASE_STATE]] = None, + on_unhover: Optional[ + Union[EventType[[], BASE_STATE], EventType[[List[Point]], BASE_STATE]] + ] = None, on_unmount: Optional[EventType[[], BASE_STATE]] = None, **props, ) -> "Plotly": From e457d53924c6175f035980d9d98f9bbbabe68199 Mon Sep 17 00:00:00 2001 From: Simon Young <40179067+Kastier1@users.noreply.github.com> Date: Wed, 6 Nov 2024 17:18:41 -0800 Subject: [PATCH 6/6] Adding hosting v1 support (#4309) Co-authored-by: simon Co-authored-by: Khaleel Al-Adhami --- poetry.lock | 14 ++--- pyproject.toml | 2 +- reflex/reflex.py | 134 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 142 insertions(+), 8 deletions(-) diff --git a/poetry.lock b/poetry.lock index 15f8b951d..0fd0f7109 100644 --- a/poetry.lock +++ b/poetry.lock @@ -54,13 +54,13 @@ trio = ["trio (>=0.26.1)"] [[package]] name = "async-timeout" -version = "5.0.0" +version = "5.0.1" description = "Timeout context manager for asyncio programs" optional = false python-versions = ">=3.8" files = [ - {file = "async_timeout-5.0.0-py3-none-any.whl", hash = "sha256:904719a4bd6e0520047d0ddae220aabee67b877f7ca17bf8cea20f67f6247ae0"}, - {file = "async_timeout-5.0.0.tar.gz", hash = "sha256:49675ec889daacfe65ff66d2dde7dd1447a6f4b2f23721022e4ba121f8772a85"}, + {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, + {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, ] [[package]] @@ -2198,13 +2198,13 @@ reflex = ">=0.6.0a" [[package]] name = "reflex-hosting-cli" -version = "0.1.13" +version = "0.1.14" description = "Reflex Hosting CLI" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "reflex_hosting_cli-0.1.13-py3-none-any.whl", hash = "sha256:5bfec7f3d7ce4bbd703989f086494e586a641ef37c9e60e60fb82bdfb07ff227"}, - {file = "reflex_hosting_cli-0.1.13.tar.gz", hash = "sha256:c5d6afdcfeb74cee046a374ddbd59116ab8ed797dae688fcc744dabae24dc571"}, + {file = "reflex_hosting_cli-0.1.14-py3-none-any.whl", hash = "sha256:b38676a39708511801bd666e5a9788d8eb4aeb6f9196bea77a8c4c6a6c06492f"}, + {file = "reflex_hosting_cli-0.1.14.tar.gz", hash = "sha256:8c7721b87dd2ce22db110d905ee01e78e5185f0e6dd521752f70aef6cf17b39f"}, ] [package.dependencies] @@ -3050,4 +3050,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "664c8d3c78923d39d1d59227cb43416228ac396a7004344c058377886421c086" +content-hash = "fe91a9b22081a48be519ed3789e40904bd358a05fd6da912566592aa8d382f31" diff --git a/pyproject.toml b/pyproject.toml index 828c3d989..9e8edb0e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -49,7 +49,7 @@ wrapt = [ {version = ">=1.11.0,<2.0", python = "<3.11"}, ] packaging = ">=23.1,<25.0" -reflex-hosting-cli = ">=0.1.2,<2.0" +reflex-hosting-cli = ">=0.1.4,<2.0" charset-normalizer = ">=3.3.2,<4.0" wheel = ">=0.42.0,<1.0" build = ">=1.0.3,<2.0" diff --git a/reflex/reflex.py b/reflex/reflex.py index 8c5f0fc6f..fa36b8601 100644 --- a/reflex/reflex.py +++ b/reflex/reflex.py @@ -11,6 +11,7 @@ import typer import typer.core from reflex_cli.deployments import deployments_cli from reflex_cli.utils import dependency +from reflex_cli.v2.deployments import hosting_cli from reflex import constants from reflex.config import environment, get_config @@ -383,6 +384,14 @@ def login( _login() +@cli.command() +def loginv2(loglevel: constants.LogLevel = typer.Option(config.loglevel)): + """Authenicate with experimental Reflex hosting service.""" + from reflex_cli.v2 import cli as hosting_cli + + hosting_cli.login() + + @cli.command() def logout( loglevel: constants.LogLevel = typer.Option( @@ -399,6 +408,22 @@ def logout( hosting.delete_token_from_config(include_invitation_code=True) +@cli.command() +def logoutv2( + loglevel: constants.LogLevel = typer.Option( + config.loglevel, help="The log level to use." + ), +): + """Log out of access to Reflex hosting service.""" + from reflex_cli.v2.utils import hosting + + console.set_log_level(loglevel) + + hosting.log_out_on_browser() + console.debug("Deleting access token from config locally") + hosting.delete_token_from_config(include_invitation_code=True) + + db_cli = typer.Typer() script_cli = typer.Typer() @@ -599,6 +624,110 @@ def deploy( ) +@cli.command() +def deployv2( + app_name: str = typer.Option( + config.app_name, + "--app-name", + help="The name of the App to deploy under.", + hidden=True, + ), + regions: List[str] = typer.Option( + list(), + "-r", + "--region", + help="The regions to deploy to. For multiple envs, repeat this option, e.g. --region sjc --region iad", + ), + envs: List[str] = typer.Option( + list(), + "--env", + help="The environment variables to set: =. For multiple envs, repeat this option, e.g. --env k1=v2 --env k2=v2.", + ), + vmtype: Optional[str] = typer.Option( + None, + "--vmtype", + help="Vm type id. Run reflex apps vmtypes list to get options.", + ), + hostname: Optional[str] = typer.Option( + None, + "--hostname", + help="The hostname of the frontend.", + hidden=True, + ), + interactive: bool = typer.Option( + True, + help="Whether to list configuration options and ask for confirmation.", + ), + envfile: Optional[str] = typer.Option( + None, + "--envfile", + help="The path to an env file to use. Will override any envs set manually.", + hidden=True, + ), + loglevel: constants.LogLevel = typer.Option( + config.loglevel, help="The log level to use." + ), + project: Optional[str] = typer.Option( + None, + "--project", + help="project to deploy to", + hidden=True, + ), + token: Optional[str] = typer.Option( + None, + "--token", + help="token to use for auth", + hidden=True, + ), +): + """Deploy the app to the Reflex hosting service.""" + from reflex_cli.v2 import cli as hosting_cli + from reflex_cli.v2.utils import dependency + + from reflex.utils import export as export_utils + from reflex.utils import prerequisites + + # Set the log level. + console.set_log_level(loglevel) + + # Only check requirements if interactive. + # There is user interaction for requirements update. + if interactive: + dependency.check_requirements() + + # Check if we are set up. + if prerequisites.needs_reinit(frontend=True): + _init(name=config.app_name, loglevel=loglevel) + prerequisites.check_latest_package_version(constants.ReflexHostingCLI.MODULE_NAME) + + hosting_cli.deploy( + app_name=app_name, + export_fn=lambda zip_dest_dir, + api_url, + deploy_url, + frontend, + backend, + zipping: export_utils.export( + zip_dest_dir=zip_dest_dir, + api_url=api_url, + deploy_url=deploy_url, + frontend=frontend, + backend=backend, + zipping=zipping, + loglevel=loglevel.subprocess_level(), + ), + regions=regions, + envs=envs, + vmtype=vmtype, + envfile=envfile, + hostname=hostname, + interactive=interactive, + loglevel=loglevel.subprocess_level(), + token=token, + project=project, + ) + + cli.add_typer(db_cli, name="db", help="Subcommands for managing the database schema.") cli.add_typer(script_cli, name="script", help="Subcommands running helper scripts.") cli.add_typer( @@ -606,6 +735,11 @@ cli.add_typer( name="deployments", help="Subcommands for managing the Deployments.", ) +cli.add_typer( + hosting_cli, + name="apps", + help="Subcommands for managing the Deployments.", +) cli.add_typer( custom_components_cli, name="component",