From d0940b9cefa90a28c428c067aba1cc5e1fb4fad6 Mon Sep 17 00:00:00 2001 From: Khaleel Al-Adhami Date: Tue, 18 Feb 2025 14:09:23 -0800 Subject: [PATCH] do the same for tuple --- reflex/compiler/compiler.py | 4 +-- reflex/components/base/error_boundary.py | 4 +-- reflex/components/base/error_boundary.pyi | 4 +-- reflex/components/core/breakpoints.py | 4 +-- reflex/components/core/clipboard.py | 4 +-- reflex/components/core/match.py | 4 +-- reflex/components/core/upload.py | 4 +-- reflex/components/datadisplay/dataeditor.py | 18 +++++------ reflex/components/el/elements/forms.py | 6 ++-- reflex/components/el/elements/forms.pyi | 6 ++-- reflex/components/plotly/plotly.py | 4 +-- .../components/radix/primitives/accordion.py | 4 +-- .../components/radix/primitives/accordion.pyi | 4 +-- reflex/components/radix/primitives/slider.py | 4 +-- reflex/components/radix/primitives/slider.pyi | 4 +-- .../themes/components/segmented_control.py | 4 +-- .../themes/components/segmented_control.pyi | 4 +-- reflex/components/suneditor/editor.py | 6 ++-- reflex/components/suneditor/editor.pyi | 6 ++-- reflex/components/tags/iter_tag.py | 4 +-- reflex/components/tags/tag.py | 2 +- reflex/custom_components/custom_components.py | 4 +-- reflex/event.py | 23 +++++++------- reflex/state.py | 4 +-- reflex/style.py | 4 +-- reflex/utils/imports.py | 4 +-- reflex/utils/pyi_generator.py | 8 +++-- reflex/utils/serializers.py | 5 ++- reflex/utils/types.py | 2 +- reflex/vars/base.py | 18 +++++------ reflex/vars/function.py | 7 ++--- reflex/vars/object.py | 16 ++-------- reflex/vars/sequence.py | 31 +++++++++---------- scripts/wait_for_listening_port.py | 3 +- tests/units/components/core/test_foreach.py | 14 ++++----- tests/units/test_app.py | 6 ++-- tests/units/test_var.py | 18 +++++------ tests/units/utils/test_types.py | 6 ++-- 38 files changed, 132 insertions(+), 145 deletions(-) diff --git a/reflex/compiler/compiler.py b/reflex/compiler/compiler.py index 9bee81c82..d00b82599 100644 --- a/reflex/compiler/compiler.py +++ b/reflex/compiler/compiler.py @@ -4,7 +4,7 @@ from __future__ import annotations from datetime import datetime from pathlib import Path -from typing import TYPE_CHECKING, Iterable, Optional, Sequence, Tuple, Type, Union +from typing import TYPE_CHECKING, Iterable, Optional, Sequence, Type, Union from reflex import constants from reflex.compiler import templates, utils @@ -594,7 +594,7 @@ def compile_unevaluated_page( state: Type[BaseState] | None = None, style: ComponentStyle | None = None, theme: Component | None = None, -) -> Tuple[Component, bool]: +) -> tuple[Component, bool]: """Compiles an uncompiled page into a component and adds meta information. Args: diff --git a/reflex/components/base/error_boundary.py b/reflex/components/base/error_boundary.py index 5d909ca42..f659c8ad4 100644 --- a/reflex/components/base/error_boundary.py +++ b/reflex/components/base/error_boundary.py @@ -2,8 +2,6 @@ from __future__ import annotations -from typing import Tuple - from reflex.components.component import Component from reflex.components.datadisplay.logo import svg_logo from reflex.components.el import a, button, details, div, h2, hr, p, pre, summary @@ -16,7 +14,7 @@ from reflex.vars.object import ObjectVar def on_error_spec( error: ObjectVar[dict[str, str]], info: ObjectVar[dict[str, str]] -) -> Tuple[Var[str], Var[str]]: +) -> tuple[Var[str], Var[str]]: """The spec for the on_error event handler. Args: diff --git a/reflex/components/base/error_boundary.pyi b/reflex/components/base/error_boundary.pyi index 21649cefe..7368258e6 100644 --- a/reflex/components/base/error_boundary.pyi +++ b/reflex/components/base/error_boundary.pyi @@ -3,7 +3,7 @@ # ------------------- DO NOT EDIT ---------------------- # This file was generated by `reflex/utils/pyi_generator.py`! # ------------------------------------------------------ -from typing import Any, Optional, Tuple, Union, overload +from typing import Any, Optional, Union, overload from reflex.components.component import Component from reflex.event import EventType @@ -13,7 +13,7 @@ from reflex.vars.object import ObjectVar def on_error_spec( error: ObjectVar[dict[str, str]], info: ObjectVar[dict[str, str]] -) -> Tuple[Var[str], Var[str]]: ... +) -> tuple[Var[str], Var[str]]: ... class ErrorBoundary(Component): @overload diff --git a/reflex/components/core/breakpoints.py b/reflex/components/core/breakpoints.py index dcfe8e667..9b0a607c0 100644 --- a/reflex/components/core/breakpoints.py +++ b/reflex/components/core/breakpoints.py @@ -2,13 +2,13 @@ from __future__ import annotations -from typing import Tuple, TypeVar, Union +from typing import TypeVar, Union breakpoints_values = ["30em", "48em", "62em", "80em", "96em"] breakpoint_names = ["xs", "sm", "md", "lg", "xl"] -def set_breakpoints(values: Tuple[str, str, str, str, str]): +def set_breakpoints(values: tuple[str, str, str, str, str]): """Overwrite default breakpoint values. Args: diff --git a/reflex/components/core/clipboard.py b/reflex/components/core/clipboard.py index c12932dec..cab6235ee 100644 --- a/reflex/components/core/clipboard.py +++ b/reflex/components/core/clipboard.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import Tuple, Union +from typing import Union from reflex.components.base.fragment import Fragment from reflex.components.tags.tag import Tag @@ -21,7 +21,7 @@ class Clipboard(Fragment): targets: Var[list[str]] # Called when the user pastes data into the document. Data is a list of tuples of (mime_type, data). Binary types will be base64 encoded as a data uri. - on_paste: EventHandler[passthrough_event_spec(list[Tuple[str, str]])] + on_paste: EventHandler[passthrough_event_spec(list[tuple[str, str]])] # Save the original event actions for the on_paste event. on_paste_event_actions: Var[dict[str, Union[bool, int]]] diff --git a/reflex/components/core/match.py b/reflex/components/core/match.py index 0e697ddf9..4f9ab86ac 100644 --- a/reflex/components/core/match.py +++ b/reflex/components/core/match.py @@ -1,7 +1,7 @@ """rx.match.""" import textwrap -from typing import Any, Dict, List, Optional, Tuple, Union +from typing import Any, Dict, List, Optional, Union from reflex.components.base import Fragment from reflex.components.component import BaseComponent, Component, MemoizationLeaf @@ -77,7 +77,7 @@ class Match(MemoizationLeaf): @classmethod def _process_cases( cls, cases: List - ) -> Tuple[List, Optional[Union[Var, BaseComponent]]]: + ) -> tuple[List, Optional[Union[Var, BaseComponent]]]: """Process the list of match cases and the catchall default case. Args: diff --git a/reflex/components/core/upload.py b/reflex/components/core/upload.py index a598ba32f..0a10ae336 100644 --- a/reflex/components/core/upload.py +++ b/reflex/components/core/upload.py @@ -3,7 +3,7 @@ from __future__ import annotations from pathlib import Path -from typing import Any, Callable, ClassVar, List, Optional, Tuple +from typing import Any, Callable, ClassVar, List, Optional from reflex.components.base.fragment import Fragment from reflex.components.component import ( @@ -161,7 +161,7 @@ def get_upload_url(file_path: str | Var[str]) -> Var[str]: return Var.create(f"{uploaded_files_url_prefix}/{file_path}") -def _on_drop_spec(files: Var) -> Tuple[Var[Any]]: +def _on_drop_spec(files: Var) -> tuple[Var[Any]]: """Args spec for the on_drop event trigger. Args: diff --git a/reflex/components/datadisplay/dataeditor.py b/reflex/components/datadisplay/dataeditor.py index 3754c19e2..28d18088e 100644 --- a/reflex/components/datadisplay/dataeditor.py +++ b/reflex/components/datadisplay/dataeditor.py @@ -3,7 +3,7 @@ from __future__ import annotations from enum import Enum -from typing import Any, Dict, Literal, Optional, Tuple, TypedDict, Union +from typing import Any, Dict, Literal, Optional, TypedDict, Union from reflex.base import Base from reflex.components.component import Component, NoSSRComponent @@ -260,20 +260,20 @@ class DataEditor(NoSSRComponent): theme: Var[Union[DataEditorTheme, Dict]] # Fired when a cell is activated. - on_cell_activated: EventHandler[passthrough_event_spec(Tuple[int, int])] + on_cell_activated: EventHandler[passthrough_event_spec(tuple[int, int])] # Fired when a cell is clicked. - on_cell_clicked: EventHandler[passthrough_event_spec(Tuple[int, int])] + on_cell_clicked: EventHandler[passthrough_event_spec(tuple[int, int])] # Fired when a cell is right-clicked. - on_cell_context_menu: EventHandler[passthrough_event_spec(Tuple[int, int])] + on_cell_context_menu: EventHandler[passthrough_event_spec(tuple[int, int])] # Fired when a cell is edited. - on_cell_edited: EventHandler[passthrough_event_spec(Tuple[int, int], GridCell)] + on_cell_edited: EventHandler[passthrough_event_spec(tuple[int, int], GridCell)] # Fired when a group header is clicked. on_group_header_clicked: EventHandler[ - passthrough_event_spec(Tuple[int, int], GridCell) + passthrough_event_spec(tuple[int, int], GridCell) ] # Fired when a group header is right-clicked. @@ -285,16 +285,16 @@ class DataEditor(NoSSRComponent): on_group_header_renamed: EventHandler[passthrough_event_spec(str, str)] # Fired when a header is clicked. - on_header_clicked: EventHandler[passthrough_event_spec(Tuple[int, int])] + on_header_clicked: EventHandler[passthrough_event_spec(tuple[int, int])] # Fired when a header is right-clicked. - on_header_context_menu: EventHandler[passthrough_event_spec(Tuple[int, int])] + on_header_context_menu: EventHandler[passthrough_event_spec(tuple[int, int])] # Fired when a header menu item is clicked. on_header_menu_click: EventHandler[passthrough_event_spec(int, Rectangle)] # Fired when an item is hovered. - on_item_hovered: EventHandler[passthrough_event_spec(Tuple[int, int])] + on_item_hovered: EventHandler[passthrough_event_spec(tuple[int, int])] # Fired when a selection is deleted. on_delete: EventHandler[passthrough_event_spec(GridSelection)] diff --git a/reflex/components/el/elements/forms.py b/reflex/components/el/elements/forms.py index 0dfc71276..96354a780 100644 --- a/reflex/components/el/elements/forms.py +++ b/reflex/components/el/elements/forms.py @@ -3,7 +3,7 @@ from __future__ import annotations from hashlib import md5 -from typing import Any, Iterator, Literal, Tuple, Union +from typing import Any, Iterator, Literal, Union from jinja2 import Environment @@ -104,7 +104,7 @@ class Fieldset(Element): name: Var[str] -def on_submit_event_spec() -> Tuple[Var[dict[str, Any]]]: +def on_submit_event_spec() -> tuple[Var[dict[str, Any]]]: """Event handler spec for the on_submit event. Returns: @@ -113,7 +113,7 @@ def on_submit_event_spec() -> Tuple[Var[dict[str, Any]]]: return (FORM_DATA,) -def on_submit_string_event_spec() -> Tuple[Var[dict[str, str]]]: +def on_submit_string_event_spec() -> tuple[Var[dict[str, str]]]: """Event handler spec for the on_submit event. Returns: diff --git a/reflex/components/el/elements/forms.pyi b/reflex/components/el/elements/forms.pyi index abdb06a65..cd2f8f4ee 100644 --- a/reflex/components/el/elements/forms.pyi +++ b/reflex/components/el/elements/forms.pyi @@ -3,7 +3,7 @@ # ------------------- DO NOT EDIT ---------------------- # This file was generated by `reflex/utils/pyi_generator.py`! # ------------------------------------------------------ -from typing import Any, Literal, Optional, Tuple, Union, overload +from typing import Any, Literal, Optional, Union, overload from jinja2 import Environment @@ -634,8 +634,8 @@ class Fieldset(Element): """ ... -def on_submit_event_spec() -> Tuple[Var[dict[str, Any]]]: ... -def on_submit_string_event_spec() -> Tuple[Var[dict[str, str]]]: ... +def on_submit_event_spec() -> tuple[Var[dict[str, Any]]]: ... +def on_submit_string_event_spec() -> tuple[Var[dict[str, str]]]: ... class Form(BaseHTML): @overload diff --git a/reflex/components/plotly/plotly.py b/reflex/components/plotly/plotly.py index 27213196f..0762fb78d 100644 --- a/reflex/components/plotly/plotly.py +++ b/reflex/components/plotly/plotly.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import Any, Dict, Tuple, TypedDict, TypeVar, Union +from typing import Any, Dict, TypedDict, TypeVar, Union from reflex.components.component import Component, NoSSRComponent from reflex.components.core.cond import color_mode_cond @@ -21,7 +21,7 @@ except ImportError: Template = Any -def _event_points_data_signature(e0: Var) -> Tuple[Var[list[Point]]]: +def _event_points_data_signature(e0: Var) -> tuple[Var[list[Point]]]: """For plotly events with event data containing a point array. Args: diff --git a/reflex/components/radix/primitives/accordion.py b/reflex/components/radix/primitives/accordion.py index d8b8e52f0..48d81c02d 100644 --- a/reflex/components/radix/primitives/accordion.py +++ b/reflex/components/radix/primitives/accordion.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import Any, Literal, Tuple, Union +from typing import Any, Literal, Union from reflex.components.component import Component, ComponentNamespace from reflex.components.core.colors import color @@ -72,7 +72,7 @@ class AccordionComponent(RadixPrimitiveComponent): return ["color_scheme", "variant"] -def on_value_change(value: Var[str | list[str]]) -> Tuple[Var[str | list[str]]]: +def on_value_change(value: Var[str | list[str]]) -> tuple[Var[str | list[str]]]: """Handle the on_value_change event. Args: diff --git a/reflex/components/radix/primitives/accordion.pyi b/reflex/components/radix/primitives/accordion.pyi index 9ad41dfa6..5290c6442 100644 --- a/reflex/components/radix/primitives/accordion.pyi +++ b/reflex/components/radix/primitives/accordion.pyi @@ -3,7 +3,7 @@ # ------------------- DO NOT EDIT ---------------------- # This file was generated by `reflex/utils/pyi_generator.py`! # ------------------------------------------------------ -from typing import Any, Literal, Optional, Tuple, Union, overload +from typing import Any, Literal, Optional, Union, overload from reflex.components.component import Component, ComponentNamespace from reflex.components.lucide.icon import Icon @@ -138,7 +138,7 @@ class AccordionComponent(RadixPrimitiveComponent): """ ... -def on_value_change(value: Var[str | list[str]]) -> Tuple[Var[str | list[str]]]: ... +def on_value_change(value: Var[str | list[str]]) -> tuple[Var[str | list[str]]]: ... class AccordionRoot(AccordionComponent): def add_style(self): ... diff --git a/reflex/components/radix/primitives/slider.py b/reflex/components/radix/primitives/slider.py index 4e5898398..4173400ac 100644 --- a/reflex/components/radix/primitives/slider.py +++ b/reflex/components/radix/primitives/slider.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import Any, Literal, Tuple +from typing import Any, Literal from reflex.components.component import Component, ComponentNamespace from reflex.components.radix.primitives.base import RadixPrimitiveComponentWithClassName @@ -21,7 +21,7 @@ class SliderComponent(RadixPrimitiveComponentWithClassName): def on_value_event_spec( value: Var[list[int]], -) -> Tuple[Var[list[int]]]: +) -> tuple[Var[list[int]]]: """Event handler spec for the value event. Args: diff --git a/reflex/components/radix/primitives/slider.pyi b/reflex/components/radix/primitives/slider.pyi index c6a9fa5e7..9c09ea68e 100644 --- a/reflex/components/radix/primitives/slider.pyi +++ b/reflex/components/radix/primitives/slider.pyi @@ -3,7 +3,7 @@ # ------------------- DO NOT EDIT ---------------------- # This file was generated by `reflex/utils/pyi_generator.py`! # ------------------------------------------------------ -from typing import Any, Literal, Optional, Tuple, Union, overload +from typing import Any, Literal, Optional, Union, overload from reflex.components.component import Component, ComponentNamespace from reflex.components.radix.primitives.base import RadixPrimitiveComponentWithClassName @@ -62,7 +62,7 @@ class SliderComponent(RadixPrimitiveComponentWithClassName): """ ... -def on_value_event_spec(value: Var[list[int]]) -> Tuple[Var[list[int]]]: ... +def on_value_event_spec(value: Var[list[int]]) -> tuple[Var[list[int]]]: ... class SliderRoot(SliderComponent): def add_style(self) -> dict[str, Any] | None: ... diff --git a/reflex/components/radix/themes/components/segmented_control.py b/reflex/components/radix/themes/components/segmented_control.py index 61bcb1785..c2a47ab97 100644 --- a/reflex/components/radix/themes/components/segmented_control.py +++ b/reflex/components/radix/themes/components/segmented_control.py @@ -3,7 +3,7 @@ from __future__ import annotations from types import SimpleNamespace -from typing import Literal, Tuple, Union +from typing import Literal, Union from reflex.components.core.breakpoints import Responsive from reflex.event import EventHandler @@ -14,7 +14,7 @@ from ..base import LiteralAccentColor, RadixThemesComponent def on_value_change( value: Var[Union[str, list[str]]], -) -> Tuple[Var[Union[str, list[str]]]]: +) -> tuple[Var[Union[str, list[str]]]]: """Handle the on_value_change event. Args: diff --git a/reflex/components/radix/themes/components/segmented_control.pyi b/reflex/components/radix/themes/components/segmented_control.pyi index f50d324a8..829e8a89d 100644 --- a/reflex/components/radix/themes/components/segmented_control.pyi +++ b/reflex/components/radix/themes/components/segmented_control.pyi @@ -4,7 +4,7 @@ # This file was generated by `reflex/utils/pyi_generator.py`! # ------------------------------------------------------ from types import SimpleNamespace -from typing import Any, Literal, Optional, Tuple, Union, overload +from typing import Any, Literal, Optional, Union, overload from reflex.components.core.breakpoints import Breakpoints from reflex.event import EventType @@ -15,7 +15,7 @@ from ..base import RadixThemesComponent def on_value_change( value: Var[Union[str, list[str]]], -) -> Tuple[Var[Union[str, list[str]]]]: ... +) -> tuple[Var[Union[str, list[str]]]]: ... class SegmentedControlRoot(RadixThemesComponent): @overload diff --git a/reflex/components/suneditor/editor.py b/reflex/components/suneditor/editor.py index 6ff63b35e..7f4e51f06 100644 --- a/reflex/components/suneditor/editor.py +++ b/reflex/components/suneditor/editor.py @@ -3,7 +3,7 @@ from __future__ import annotations import enum -from typing import Any, Dict, Literal, Optional, Tuple, Union +from typing import Any, Dict, Literal, Optional, Union from reflex.base import Base from reflex.components.component import Component, NoSSRComponent @@ -68,7 +68,7 @@ class EditorOptions(Base): button_list: Optional[list[Union[list[str], str]]] -def on_blur_spec(e: Var, content: Var[str]) -> Tuple[Var[str]]: +def on_blur_spec(e: Var, content: Var[str]) -> tuple[Var[str]]: """A helper function to specify the on_blur event handler. Args: @@ -83,7 +83,7 @@ def on_blur_spec(e: Var, content: Var[str]) -> Tuple[Var[str]]: def on_paste_spec( e: Var, clean_data: Var[str], max_char_count: Var[bool] -) -> Tuple[Var[str], Var[bool]]: +) -> tuple[Var[str], Var[bool]]: """A helper function to specify the on_paste event handler. Args: diff --git a/reflex/components/suneditor/editor.pyi b/reflex/components/suneditor/editor.pyi index 8cebbbd9b..fc3630d75 100644 --- a/reflex/components/suneditor/editor.pyi +++ b/reflex/components/suneditor/editor.pyi @@ -4,7 +4,7 @@ # This file was generated by `reflex/utils/pyi_generator.py`! # ------------------------------------------------------ import enum -from typing import Any, Dict, Literal, Optional, Tuple, Union, overload +from typing import Any, Dict, Literal, Optional, Union, overload from reflex.base import Base from reflex.components.component import NoSSRComponent @@ -44,10 +44,10 @@ class EditorOptions(Base): rtl: Optional[bool] button_list: Optional[list[Union[list[str], str]]] -def on_blur_spec(e: Var, content: Var[str]) -> Tuple[Var[str]]: ... +def on_blur_spec(e: Var, content: Var[str]) -> tuple[Var[str]]: ... def on_paste_spec( e: Var, clean_data: Var[str], max_char_count: Var[bool] -) -> Tuple[Var[str], Var[bool]]: ... +) -> tuple[Var[str], Var[bool]]: ... class Editor(NoSSRComponent): def add_imports(self) -> ImportDict: ... diff --git a/reflex/components/tags/iter_tag.py b/reflex/components/tags/iter_tag.py index 221b65ca9..eb6e9b081 100644 --- a/reflex/components/tags/iter_tag.py +++ b/reflex/components/tags/iter_tag.py @@ -4,7 +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, Type, Union, get_args from reflex.components.tags.tag import Tag from reflex.vars import LiteralArrayVar, Var, get_unique_variable_name @@ -41,7 +41,7 @@ class IterTag(Tag): try: if iterable._var_type.mro()[0] is dict: # Arg is a tuple of (key, value). - return Tuple[get_args(iterable._var_type)] # pyright: ignore [reportReturnType] + return tuple[get_args(iterable._var_type)] # pyright: ignore [reportReturnType] elif iterable._var_type.mro()[0] is tuple: # Arg is a union of any possible values in the tuple. return Union[get_args(iterable._var_type)] # pyright: ignore [reportReturnType] diff --git a/reflex/components/tags/tag.py b/reflex/components/tags/tag.py index 8d785dfee..d9e307781 100644 --- a/reflex/components/tags/tag.py +++ b/reflex/components/tags/tag.py @@ -83,7 +83,7 @@ class Tag: """Iterate over the tag's fields. Yields: - Tuple[str, Any]: The field name and value. + tuple[str, Any]: The field name and value. """ for field in dataclasses.fields(self): rendered_value = render_prop(getattr(self, field.name)) diff --git a/reflex/custom_components/custom_components.py b/reflex/custom_components/custom_components.py index 6bb428072..bf302ad4b 100644 --- a/reflex/custom_components/custom_components.py +++ b/reflex/custom_components/custom_components.py @@ -9,7 +9,7 @@ import sys from collections import namedtuple from contextlib import contextmanager from pathlib import Path -from typing import Optional, Tuple +from typing import Optional import httpx import tomlkit @@ -927,7 +927,7 @@ def _validate_url_with_protocol_prefix(url: str | None) -> bool: return not url or (url.startswith("http://") or url.startswith("https://")) -def _get_file_from_prompt_in_loop() -> Tuple[bytes, str] | None: +def _get_file_from_prompt_in_loop() -> tuple[bytes, str] | None: image_file = file_extension = None while image_file is None: image_filepath = Path( diff --git a/reflex/event.py b/reflex/event.py index 805f74c1d..4903257d3 100644 --- a/reflex/event.py +++ b/reflex/event.py @@ -18,7 +18,6 @@ from typing import ( Optional, Protocol, Sequence, - Tuple, Type, TypedDict, TypeVar, @@ -260,14 +259,14 @@ class EventSpec(EventActionsMixin): client_handler_name: str = dataclasses.field(default="") # The arguments to pass to the function. - args: Tuple[Tuple[Var, Var], ...] = dataclasses.field(default_factory=tuple) + args: tuple[tuple[Var, Var], ...] = dataclasses.field(default_factory=tuple) def __init__( self, handler: EventHandler, event_actions: dict[str, Union[bool, int]] | None = None, client_handler_name: str = "", - args: Tuple[Tuple[Var, Var], ...] = (), + args: tuple[tuple[Var, Var], ...] = (), ): """Initialize an EventSpec. @@ -284,7 +283,7 @@ class EventSpec(EventActionsMixin): object.__setattr__(self, "client_handler_name", client_handler_name) object.__setattr__(self, "args", args or ()) - def with_args(self, args: Tuple[Tuple[Var, Var], ...]) -> EventSpec: + def with_args(self, args: tuple[tuple[Var, Var], ...]) -> EventSpec: """Copy the event spec, with updated args. Args: @@ -531,7 +530,7 @@ class JavasciptKeyboardEvent: shiftKey: bool = False # noqa: N815 -def input_event(e: ObjectVar[JavascriptInputEvent]) -> Tuple[Var[str]]: +def input_event(e: ObjectVar[JavascriptInputEvent]) -> tuple[Var[str]]: """Get the value from an input event. Args: @@ -554,7 +553,7 @@ class KeyInputInfo(TypedDict): def key_event( e: ObjectVar[JavasciptKeyboardEvent], -) -> Tuple[Var[str], Var[KeyInputInfo]]: +) -> tuple[Var[str], Var[KeyInputInfo]]: """Get the key from a keyboard event. Args: @@ -576,7 +575,7 @@ def key_event( ) -def no_args_event_spec() -> Tuple[()]: +def no_args_event_spec() -> tuple[()]: """Empty event handler. Returns: @@ -597,7 +596,7 @@ U = TypeVar("U") class IdentityEventReturn(Generic[T], Protocol): """Protocol for an identity event return.""" - def __call__(self, *values: Var[T]) -> Tuple[Var[T], ...]: + def __call__(self, *values: Var[T]) -> tuple[Var[T], ...]: """Return the input values. Args: @@ -612,13 +611,13 @@ class IdentityEventReturn(Generic[T], Protocol): @overload def passthrough_event_spec( # pyright: ignore [reportOverlappingOverload] event_type: Type[T], / -) -> Callable[[Var[T]], Tuple[Var[T]]]: ... +) -> Callable[[Var[T]], tuple[Var[T]]]: ... @overload def passthrough_event_spec( event_type_1: Type[T], event_type2: Type[U], / -) -> Callable[[Var[T], Var[U]], Tuple[Var[T], Var[U]]]: ... +) -> Callable[[Var[T], Var[U]], tuple[Var[T], Var[U]]]: ... @overload @@ -635,11 +634,11 @@ def passthrough_event_spec(*event_types: Type[T]) -> IdentityEventReturn[T]: # A function that returns the input event as output. """ - def inner(*values: Var[T]) -> Tuple[Var[T], ...]: + def inner(*values: Var[T]) -> tuple[Var[T], ...]: return values inner_type = tuple(Var[event_type] for event_type in event_types) - return_annotation = Tuple[inner_type] + return_annotation = tuple[inner_type] inner.__signature__ = inspect.signature(inner).replace( # pyright: ignore [reportFunctionMemberAccess] parameters=[ diff --git a/reflex/state.py b/reflex/state.py index 90b130b94..94010f495 100644 --- a/reflex/state.py +++ b/reflex/state.py @@ -354,7 +354,7 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow): class_subclasses: ClassVar[set[Type[BaseState]]] = set() # Mapping of var name to set of (state_full_name, var_name) that depend on it. - _var_dependencies: ClassVar[Dict[str, set[Tuple[str, str]]]] = {} + _var_dependencies: ClassVar[Dict[str, set[tuple[str, str]]]] = {} # Set of vars which always need to be recomputed _always_dirty_computed_vars: ClassVar[set[str]] = set() @@ -2144,7 +2144,7 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow): def _field_tuple( field_name: str, - ) -> Tuple[str, str, Any, Union[bool, None], Any]: + ) -> tuple[str, str, Any, Union[bool, None], Any]: model_field = cls.__fields__[field_name] return ( field_name, diff --git a/reflex/style.py b/reflex/style.py index 1d818ed06..5b43c734d 100644 --- a/reflex/style.py +++ b/reflex/style.py @@ -2,7 +2,7 @@ from __future__ import annotations -from typing import Any, Literal, Tuple, Type +from typing import Any, Literal, Type from reflex import constants from reflex.components.core.breakpoints import Breakpoints, breakpoints_values @@ -226,7 +226,7 @@ def convert( return out, var_data -def format_style_key(key: str) -> Tuple[str, ...]: +def format_style_key(key: str) -> tuple[str, ...]: """Convert style keys to camel case and convert shorthand styles names to their corresponding css names. diff --git a/reflex/utils/imports.py b/reflex/utils/imports.py index 83474f8f5..3f2b10a72 100644 --- a/reflex/utils/imports.py +++ b/reflex/utils/imports.py @@ -4,7 +4,7 @@ from __future__ import annotations import dataclasses from collections import defaultdict -from typing import DefaultDict, Optional, Tuple, Union +from typing import DefaultDict, Optional, Union def merge_imports( @@ -134,4 +134,4 @@ class ImportVar: ImportTypes = Union[str, ImportVar, list[Union[str, ImportVar]], list[ImportVar]] ImportDict = dict[str, ImportTypes] ParsedImportDict = dict[str, list[ImportVar]] -ImmutableParsedImportDict = Tuple[Tuple[str, Tuple[ImportVar, ...]], ...] +ImmutableParsedImportDict = tuple[tuple[str, tuple[ImportVar, ...]], ...] diff --git a/reflex/utils/pyi_generator.py b/reflex/utils/pyi_generator.py index f384dad9d..50e7f9e14 100644 --- a/reflex/utils/pyi_generator.py +++ b/reflex/utils/pyi_generator.py @@ -529,8 +529,12 @@ def _generate_component_create_functiondef( 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("]") + if isinstance(annotation, str) and annotation.lower().startswith("tuple["): + inside_of_tuple = ( + annotation.removeprefix("tuple[") + .removeprefix("Tuple[") + .removesuffix("]") + ) if inside_of_tuple == "()": return ast.Name(id="EventType[()]") diff --git a/reflex/utils/serializers.py b/reflex/utils/serializers.py index 2feb1abf6..ed378ddd3 100644 --- a/reflex/utils/serializers.py +++ b/reflex/utils/serializers.py @@ -16,7 +16,6 @@ from typing import ( Literal, Optional, Set, - Tuple, Type, TypeVar, Union, @@ -114,7 +113,7 @@ def serializer( @overload def serialize( value: Any, get_type: Literal[True] -) -> Tuple[Optional[SerializedType], Optional[types.GenericType]]: ... +) -> tuple[Optional[SerializedType], Optional[types.GenericType]]: ... @overload @@ -129,7 +128,7 @@ def serialize( value: Any, get_type: bool = False ) -> Union[ Optional[SerializedType], - Tuple[Optional[SerializedType], Optional[types.GenericType]], + tuple[Optional[SerializedType], Optional[types.GenericType]], ]: """Serialize the value to a JSON string. diff --git a/reflex/utils/types.py b/reflex/utils/types.py index 999e1c4ac..2fd49e7f6 100644 --- a/reflex/utils/types.py +++ b/reflex/utils/types.py @@ -805,7 +805,7 @@ StateBases = get_base_class(StateVar) StateIterBases = get_base_class(StateIterVar) -def safe_issubclass(cls: Type, cls_check: Type | Tuple[Type, ...]): +def safe_issubclass(cls: Type, cls_check: Type | tuple[Type, ...]): """Check if a class is a subclass of another class. Returns False if internal error occurs. Args: diff --git a/reflex/vars/base.py b/reflex/vars/base.py index ec27740be..71427931a 100644 --- a/reflex/vars/base.py +++ b/reflex/vars/base.py @@ -100,11 +100,11 @@ class VarSubclassEntry: var_subclass: Type[Var] to_var_subclass: Type[ToOperation] - python_types: Tuple[GenericType, ...] + python_types: tuple[GenericType, ...] _var_subclasses: list[VarSubclassEntry] = [] -_var_literal_subclasses: list[Tuple[Type[LiteralVar], VarSubclassEntry]] = [] +_var_literal_subclasses: list[tuple[Type[LiteralVar], VarSubclassEntry]] = [] @dataclasses.dataclass( @@ -124,10 +124,10 @@ class VarData: imports: ImmutableParsedImportDict = dataclasses.field(default_factory=tuple) # Hooks that need to be present in the component to render this var - hooks: Tuple[str, ...] = dataclasses.field(default_factory=tuple) + hooks: tuple[str, ...] = dataclasses.field(default_factory=tuple) # Dependencies of the var - deps: Tuple[Var, ...] = dataclasses.field(default_factory=tuple) + deps: tuple[Var, ...] = dataclasses.field(default_factory=tuple) # Position of the hook in the component position: Hooks.HookPosition | None = None @@ -429,7 +429,7 @@ class Var(Generic[VAR_TYPE]): def __init_subclass__( cls, - python_types: Tuple[GenericType, ...] | GenericType = types.Unset(), + python_types: tuple[GenericType, ...] | GenericType = types.Unset(), default_type: GenericType = types.Unset(), **kwargs, ): @@ -1680,7 +1680,7 @@ def figure_out_type(value: Any) -> types.GenericType: if isinstance(value, set): return set[unionize(*(figure_out_type(v) for v in value))] if isinstance(value, tuple): - return Tuple[unionize(*(figure_out_type(v) for v in value)), ...] + return tuple[unionize(*(figure_out_type(v) for v in value)), ...] if isinstance(value, Mapping): return Mapping[ unionize(*(figure_out_type(k) for k in value)), @@ -2720,7 +2720,7 @@ class CustomVarOperation(CachedVarOperation, Var[T]): _name: str = dataclasses.field(default="") - _args: Tuple[Tuple[str, Var], ...] = dataclasses.field(default_factory=tuple) + _args: tuple[tuple[str, Var], ...] = dataclasses.field(default_factory=tuple) _return: CustomVarOperationReturn[T] = dataclasses.field( default_factory=lambda: CustomVarOperationReturn.create("") @@ -2752,7 +2752,7 @@ class CustomVarOperation(CachedVarOperation, Var[T]): def create( cls, name: str, - args: Tuple[Tuple[str, Var], ...], + args: tuple[tuple[str, Var], ...], return_var: CustomVarOperationReturn[T], _var_data: VarData | None = None, ) -> CustomVarOperation[T]: @@ -3269,7 +3269,7 @@ class Field(Generic[FIELD_TYPE]): @overload def __get__( - self: Field[list[V]] | Field[set[V]] | Field[Tuple[V, ...]], + self: Field[list[V]] | Field[set[V]] | Field[tuple[V, ...]], instance: None, owner: Any, ) -> ArrayVar[list[V]]: ... diff --git a/reflex/vars/function.py b/reflex/vars/function.py index 54f1d08e7..5e5cf5254 100644 --- a/reflex/vars/function.py +++ b/reflex/vars/function.py @@ -13,7 +13,6 @@ from typing import ( ParamSpec, Protocol, Sequence, - Tuple, Type, TypeVar, Union, @@ -244,7 +243,7 @@ class VarOperationCall(Generic[P, R], CachedVarOperation, Var[R]): """Base class for immutable vars that are the result of a function call.""" _func: Optional[FunctionVar[ReflexCallable[P, R]]] = dataclasses.field(default=None) - _args: Tuple[Union[Var, Any], ...] = dataclasses.field(default_factory=tuple) + _args: tuple[Union[Var, Any], ...] = dataclasses.field(default_factory=tuple) @cached_property_no_lock def _cached_var_name(self) -> str: @@ -306,7 +305,7 @@ class VarOperationCall(Generic[P, R], CachedVarOperation, Var[R]): class DestructuredArg: """Class for destructured arguments.""" - fields: Tuple[str, ...] = () + fields: tuple[str, ...] = () rest: Optional[str] = None def to_javascript(self) -> str: @@ -328,7 +327,7 @@ class DestructuredArg: class FunctionArgs: """Class for function arguments.""" - args: Tuple[Union[str, DestructuredArg], ...] = () + args: tuple[Union[str, DestructuredArg], ...] = () rest: Optional[str] = None diff --git a/reflex/vars/object.py b/reflex/vars/object.py index b4fc75945..4b502ce9d 100644 --- a/reflex/vars/object.py +++ b/reflex/vars/object.py @@ -5,17 +5,7 @@ from __future__ import annotations import dataclasses import typing from inspect import isclass -from typing import ( - Any, - Mapping, - NoReturn, - Tuple, - Type, - TypeVar, - Union, - get_args, - overload, -) +from typing import Any, Mapping, NoReturn, Type, TypeVar, Union, get_args, overload from typing_extensions import is_typeddict @@ -109,7 +99,7 @@ class ObjectVar(Var[OBJECT_TYPE], python_types=Mapping): @overload def entries( self: ObjectVar[Mapping[Any, VALUE_TYPE]], - ) -> ArrayVar[list[Tuple[str, VALUE_TYPE]]]: ... + ) -> ArrayVar[list[tuple[str, VALUE_TYPE]]]: ... @overload def entries(self) -> ArrayVar: ... @@ -458,7 +448,7 @@ def object_entries_operation(value: ObjectVar): """ return var_operation_return( js_expression=f"Object.entries({value})", - var_type=list[Tuple[str, value._value_type()]], + var_type=list[tuple[str, value._value_type()]], ) diff --git a/reflex/vars/sequence.py b/reflex/vars/sequence.py index 2fce103fd..fc6032c96 100644 --- a/reflex/vars/sequence.py +++ b/reflex/vars/sequence.py @@ -13,7 +13,6 @@ from typing import ( Literal, NoReturn, Sequence, - Tuple, Type, TypeVar, Union, @@ -799,7 +798,7 @@ class LiteralStringVar(LiteralVar, StringVar[str]): class ConcatVarOperation(CachedVarOperation, StringVar[str]): """Representing a concatenation of literal string vars.""" - _var_value: Tuple[Var, ...] = dataclasses.field(default_factory=tuple) + _var_value: tuple[Var, ...] = dataclasses.field(default_factory=tuple) @cached_property_no_lock def _cached_var_name(self) -> str: @@ -957,41 +956,41 @@ class ArrayVar(Var[ARRAY_VAR_TYPE], python_types=(list, tuple, set)): @overload def __getitem__( self: ( - ArrayVar[Tuple[int, OTHER_TUPLE]] - | ArrayVar[Tuple[float, OTHER_TUPLE]] - | ArrayVar[Tuple[int | float, OTHER_TUPLE]] + ArrayVar[tuple[int, OTHER_TUPLE]] + | ArrayVar[tuple[float, OTHER_TUPLE]] + | ArrayVar[tuple[int | float, OTHER_TUPLE]] ), i: Literal[0, -2], ) -> NumberVar: ... @overload def __getitem__( - self: ArrayVar[Tuple[Any, bool]], i: Literal[1, -1] + self: ArrayVar[tuple[Any, bool]], i: Literal[1, -1] ) -> BooleanVar: ... @overload def __getitem__( self: ( - ArrayVar[Tuple[Any, int]] - | ArrayVar[Tuple[Any, float]] - | ArrayVar[Tuple[Any, int | float]] + ArrayVar[tuple[Any, int]] + | ArrayVar[tuple[Any, float]] + | ArrayVar[tuple[Any, int | float]] ), i: Literal[1, -1], ) -> NumberVar: ... @overload def __getitem__( - self: ArrayVar[Tuple[str, Any]], i: Literal[0, -2] + self: ArrayVar[tuple[str, Any]], i: Literal[0, -2] ) -> StringVar: ... @overload def __getitem__( - self: ArrayVar[Tuple[Any, str]], i: Literal[1, -1] + self: ArrayVar[tuple[Any, str]], i: Literal[1, -1] ) -> StringVar: ... @overload def __getitem__( - self: ArrayVar[Tuple[bool, Any]], i: Literal[0, -2] + self: ArrayVar[tuple[bool, Any]], i: Literal[0, -2] ) -> BooleanVar: ... @overload @@ -1022,15 +1021,15 @@ class ArrayVar(Var[ARRAY_VAR_TYPE], python_types=(list, tuple, set)): @overload def __getitem__( - self: ARRAY_VAR_OF_LIST_ELEMENT[Tuple[KEY_TYPE, VALUE_TYPE]], + self: ARRAY_VAR_OF_LIST_ELEMENT[tuple[KEY_TYPE, VALUE_TYPE]], i: int | NumberVar, - ) -> ArrayVar[Tuple[KEY_TYPE, VALUE_TYPE]]: ... + ) -> ArrayVar[tuple[KEY_TYPE, VALUE_TYPE]]: ... @overload def __getitem__( - self: ARRAY_VAR_OF_LIST_ELEMENT[Tuple[INNER_ARRAY_VAR, ...]], + self: ARRAY_VAR_OF_LIST_ELEMENT[tuple[INNER_ARRAY_VAR, ...]], i: int | NumberVar, - ) -> ArrayVar[Tuple[INNER_ARRAY_VAR, ...]]: ... + ) -> ArrayVar[tuple[INNER_ARRAY_VAR, ...]]: ... @overload def __getitem__( diff --git a/scripts/wait_for_listening_port.py b/scripts/wait_for_listening_port.py index 4befa00bd..a65293f73 100644 --- a/scripts/wait_for_listening_port.py +++ b/scripts/wait_for_listening_port.py @@ -8,7 +8,6 @@ import argparse import socket import time from concurrent.futures import ThreadPoolExecutor, as_completed -from typing import Tuple # psutil is already a dependency of Reflex itself - so it's OK to use import psutil @@ -23,7 +22,7 @@ def _pid_exists(pid: int): return pid in psutil.pids() -def _wait_for_port(port: int, server_pid: int, timeout: float) -> Tuple[bool, str]: +def _wait_for_port(port: int, server_pid: int, timeout: float) -> tuple[bool, str]: start = time.time() print(f"Waiting for up to {timeout} seconds for port {port} to start listening.") # noqa: T201 while True: diff --git a/tests/units/components/core/test_foreach.py b/tests/units/components/core/test_foreach.py index c86e636c6..80d937e68 100644 --- a/tests/units/components/core/test_foreach.py +++ b/tests/units/components/core/test_foreach.py @@ -1,4 +1,4 @@ -from typing import Tuple, Union +from typing import Union import pydantic.v1 import pytest @@ -46,13 +46,13 @@ class ForEachState(BaseState): nested_colors_with_shades: dict[str, dict[str, list[dict[str, str]]]] = { "primary": {"red": [{"shade": "dark"}]} } - color_tuple: Tuple[str, str] = ( + color_tuple: tuple[str, str] = ( "red", "yellow", ) colors_set: set[str] = {"red", "green"} bad_annotation_list: list = [["red", "orange"], ["yellow", "blue"]] - color_index_tuple: Tuple[int, str] = (0, "red") + color_index_tuple: tuple[int, str] = (0, "red") default_factory_list: list[ForEachTag] = pydantic.v1.Field(default_factory=list) @@ -92,17 +92,17 @@ def display_shade(color): def display_primary_colors(color): - assert color._var_type == Tuple[str, str] + assert color._var_type == tuple[str, str] return box(text(color[0]), text(color[1])) def display_color_with_shades(color): - assert color._var_type == Tuple[str, list[str]] + assert color._var_type == tuple[str, list[str]] return box(text(color[0]), text(color[1][0])) def display_nested_color_with_shades(color): - assert color._var_type == Tuple[str, dict[str, list[dict[str, str]]]] + assert color._var_type == tuple[str, dict[str, list[dict[str, str]]]] return box(text(color[0]), text(color[1]["red"][0]["shade"])) @@ -111,7 +111,7 @@ def show_shade(item): def display_nested_color_with_shades_v2(color): - assert color._var_type == Tuple[str, dict[str, list[dict[str, str]]]] + assert color._var_type == tuple[str, dict[str, list[dict[str, str]]]] return box(text(foreach(color[1], show_shade))) diff --git a/tests/units/test_app.py b/tests/units/test_app.py index 74381070a..9777ba9d3 100644 --- a/tests/units/test_app.py +++ b/tests/units/test_app.py @@ -9,7 +9,7 @@ import unittest.mock import uuid from contextlib import nullcontext as does_not_raise from pathlib import Path -from typing import Generator, Tuple, Type +from typing import Generator, Type from unittest.mock import AsyncMock import pytest @@ -570,7 +570,7 @@ async def test_dynamic_var_event(test_state: Type[ATestState], token: str): ], ) async def test_list_mutation_detection__plain_list( - event_tuples: list[Tuple[str, list[str]]], + event_tuples: list[tuple[str, list[str]]], list_mutation_state: State, token: str, ): @@ -695,7 +695,7 @@ async def test_list_mutation_detection__plain_list( ], ) async def test_dict_mutation_detection__plain_list( - event_tuples: list[Tuple[str, list[str]]], + event_tuples: list[tuple[str, list[str]]], dict_mutation_state: State, token: str, ): diff --git a/tests/units/test_var.py b/tests/units/test_var.py index 3558abfcd..0be5badd6 100644 --- a/tests/units/test_var.py +++ b/tests/units/test_var.py @@ -1,7 +1,7 @@ import json import math import typing -from typing import List, Mapping, Optional, Tuple, Union, cast +from typing import List, Mapping, Optional, Union, cast import pytest from pandas import DataFrame @@ -483,7 +483,7 @@ def test_dict_contains(var, expected): "var", [ Var(_js_expr="list", _var_type=list[int]).guess_type(), - Var(_js_expr="tuple", _var_type=Tuple[int, int]).guess_type(), + Var(_js_expr="tuple", _var_type=tuple[int, int]).guess_type(), Var(_js_expr="str", _var_type=str).guess_type(), ], ) @@ -506,7 +506,7 @@ def test_var_indexing_lists(var): [ (Var(_js_expr="list", _var_type=list[int]).guess_type(), [int, int]), ( - Var(_js_expr="tuple", _var_type=Tuple[int, str]).guess_type(), + Var(_js_expr="tuple", _var_type=tuple[int, str]).guess_type(), [int, str], ), ], @@ -611,18 +611,18 @@ def test_computed_var_replace_with_invalid_kwargs(): Var(_js_expr="lst", _var_type=str).guess_type(), Var(_js_expr="float_var", _var_type=float).guess_type(), ), - (Var(_js_expr="str", _var_type=Tuple[str]).guess_type(), [1, 2]), + (Var(_js_expr="str", _var_type=tuple[str]).guess_type(), [1, 2]), ( - Var(_js_expr="lst", _var_type=Tuple[str]).guess_type(), + Var(_js_expr="lst", _var_type=tuple[str]).guess_type(), {"name": "dict"}, ), - (Var(_js_expr="lst", _var_type=Tuple[str]).guess_type(), {"set"}), + (Var(_js_expr="lst", _var_type=tuple[str]).guess_type(), {"set"}), ( - Var(_js_expr="lst", _var_type=Tuple[str]).guess_type(), + Var(_js_expr="lst", _var_type=tuple[str]).guess_type(), Var(_js_expr="string_var", _var_type=str).guess_type(), ), ( - Var(_js_expr="lst", _var_type=Tuple[str]).guess_type(), + Var(_js_expr="lst", _var_type=tuple[str]).guess_type(), Var(_js_expr="float_var", _var_type=float).guess_type(), ), ], @@ -642,7 +642,7 @@ def test_var_unsupported_indexing_lists(var, index): "var", [ Var(_js_expr="lst", _var_type=list[int]).guess_type(), - Var(_js_expr="tuple", _var_type=Tuple[int, int]).guess_type(), + Var(_js_expr="tuple", _var_type=tuple[int, int]).guess_type(), ], ) def test_var_list_slicing(var): diff --git a/tests/units/utils/test_types.py b/tests/units/utils/test_types.py index cf6a377a4..02cdd47dd 100644 --- a/tests/units/utils/test_types.py +++ b/tests/units/utils/test_types.py @@ -1,4 +1,4 @@ -from typing import Any, Literal, Tuple, Union +from typing import Any, Literal, Union import pytest @@ -26,7 +26,7 @@ def test_validate_literal_error_msg(params, allowed_value_str, value_str): "cls,cls_check,expected", [ (int, Any, True), - (Tuple[int], Any, True), + (tuple[int], Any, True), (list[int], Any, True), (int, int, True), (int, object, True), @@ -77,7 +77,7 @@ class ChildGenericDict(GenericDict): (int, False), (str, False), (float, False), - (Tuple[int], True), + (tuple[int], True), (list[int], True), (Union[int, str], True), (Union[str, int], True),