diff --git a/news/+upgrade-lint-typecheck-tooling.misc.md b/news/+upgrade-lint-typecheck-tooling.misc.md new file mode 100644 index 00000000000..971b9ee6c39 --- /dev/null +++ b/news/+upgrade-lint-typecheck-tooling.misc.md @@ -0,0 +1 @@ +Upgrade the locked dev tooling: `ruff` 0.15.12 -> 0.16.2, `pyright` 1.1.408 -> 1.1.411, `typer` 0.25.1 -> 0.27.1. Property docstrings are now noun phrases rather than "Get the ..." / "Return the ..." (ruff's new `D421`), and `typer.main.get_command()` is cast to `click.Command` because typer 0.27 vendors its own copy of click. diff --git a/packages/reflex-base/news/+upgrade-lint-typecheck-tooling.misc.md b/packages/reflex-base/news/+upgrade-lint-typecheck-tooling.misc.md new file mode 100644 index 00000000000..1541996c062 --- /dev/null +++ b/packages/reflex-base/news/+upgrade-lint-typecheck-tooling.misc.md @@ -0,0 +1 @@ +Property docstrings are now noun phrases rather than "Get the ..." / "Return the ..." (ruff 0.16's new `D421`). `chain_updates()` declares its `events` parameter as `Any`, matching the runtime validation it delegates to. `Field.default`, `Field.default_factory`, and `Field.default_value()` now admit `None`: a field whose annotated type has no computed default is given a `None` default and has its recorded annotation widened to match, so the static types were previously understating what these can hold. Internally, `ImportVar` and `unionize` are imported from the modules that define them instead of by way of `reflex_base.vars.base`, and two dead `is not None` guards were dropped from `_isinstance()` and the dependency-tracking bytecode scanner. diff --git a/packages/reflex-base/src/reflex_base/config.py b/packages/reflex-base/src/reflex_base/config.py index b15533da731..a17bdbbe40b 100644 --- a/packages/reflex-base/src/reflex_base/config.py +++ b/packages/reflex-base/src/reflex_base/config.py @@ -682,7 +682,7 @@ def prepend_backend_path(self, path: str) -> str: @property def app_module(self) -> ModuleType | None: - """Return the app module if `app_module_import` is set. + """The app module if `app_module_import` is set. Returns: The app module. @@ -695,7 +695,7 @@ def app_module(self) -> ModuleType | None: @property def module(self) -> str: - """Get the module name of the app. + """The module name of the app. Returns: The module name. diff --git a/packages/reflex-base/src/reflex_base/event/__init__.py b/packages/reflex-base/src/reflex_base/event/__init__.py index 1aad2ec241d..74fcdb9b4ad 100644 --- a/packages/reflex-base/src/reflex_base/event/__init__.py +++ b/packages/reflex-base/src/reflex_base/event/__init__.py @@ -523,7 +523,7 @@ def _get_type_hints(self) -> dict[str, Any]: @property def state_full_name(self) -> str: - """Get the full name of the state class this event handler is attached to. + """The full name of the state class this event handler is attached to. Returns: The full name of the state class this event handler is attached to. @@ -550,7 +550,7 @@ def get_parameters(self) -> Mapping[str, inspect.Parameter]: @property def _parameters(self) -> Mapping[str, inspect.Parameter]: - """Get the parameters of the function. + """The parameters of the function. Returns: The parameters of the function. @@ -3126,7 +3126,7 @@ def wrapper( @property def BaseState(self) -> "type[BaseState]": # noqa: N802 - """Get the BaseState class. + """The BaseState class. A reference to BaseState is needed for doc generation when resolving type hints, so add it to the namespace late to avoid circular import diff --git a/packages/reflex-base/src/reflex_base/event/processor/base_state_processor.py b/packages/reflex-base/src/reflex_base/event/processor/base_state_processor.py index aec3de4a1d3..d69baa8f77d 100644 --- a/packages/reflex-base/src/reflex_base/event/processor/base_state_processor.py +++ b/packages/reflex-base/src/reflex_base/event/processor/base_state_processor.py @@ -24,7 +24,7 @@ logger = logging.getLogger(__name__) if TYPE_CHECKING: - from reflex.event import Event, EventHandler, EventSpec + from reflex.event import Event, EventHandler from reflex.state import BaseState # Resolved once at import: find_spec on a missing package scans sys.path (~90us), @@ -194,7 +194,7 @@ async def _route_events(ctx: EventContext, events: Sequence[Event]) -> None: async def chain_updates( - events: EventSpec | list[EventSpec] | None, + events: Any, handler_name: str, root_state: BaseState | None = None, ) -> None: @@ -204,7 +204,9 @@ async def chain_updates( to be queued against the current EventContext. Args: - events: The events to queue with the update. + events: Whatever the handler yielded; `_check_valid_yield` raises TypeError + for anything that is not an Event, EventHandler, EventSpec, a sequence + of those, or None. handler_name: The name of the handler that yielded the events, used for error messages. root_state: The root state of the app, no delta emitted if omitted. """ diff --git a/packages/reflex-base/src/reflex_base/plugins/compiler.py b/packages/reflex-base/src/reflex_base/plugins/compiler.py index c8ffe6d2711..97c466abc0b 100644 --- a/packages/reflex-base/src/reflex_base/plugins/compiler.py +++ b/packages/reflex-base/src/reflex_base/plugins/compiler.py @@ -40,12 +40,12 @@ class PageDefinition(Protocol): @property def route(self) -> str: - """Return the route for this page definition.""" + """The route for this page definition.""" ... @property def component(self) -> PageComponent: - """Return the component or callable for this page definition.""" + """The component or callable for this page definition.""" ... diff --git a/packages/reflex-base/src/reflex_base/registry.py b/packages/reflex-base/src/reflex_base/registry.py index 04d7e258e92..61963cb538f 100644 --- a/packages/reflex-base/src/reflex_base/registry.py +++ b/packages/reflex-base/src/reflex_base/registry.py @@ -72,7 +72,7 @@ class RegistrationContext(BaseContext): @property def app(self) -> App: - """Get the App instance associated with this context. + """The App instance associated with this context. Returns: The App instance. @@ -87,7 +87,7 @@ def app(self) -> App: @property def config(self) -> Config: - """Get the Config associated with this context. + """The Config associated with this context. Returns: The Config instance. diff --git a/packages/reflex-base/src/reflex_base/utils/log.py b/packages/reflex-base/src/reflex_base/utils/log.py index c7c17e10bf7..ede9a99d867 100644 --- a/packages/reflex-base/src/reflex_base/utils/log.py +++ b/packages/reflex-base/src/reflex_base/utils/log.py @@ -31,7 +31,7 @@ import time from pathlib import Path from types import FrameType, ModuleType -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, cast from rich.console import Console from rich.errors import MarkupError @@ -354,7 +354,8 @@ def log_file_stream() -> TextIO: Returns: The writable stream of the full-logging file. """ - return _file_handler().stream + # The handler opens eagerly (delay=False), so its stream is never None. + return cast("TextIO", _file_handler().stream) @once diff --git a/packages/reflex-base/src/reflex_base/utils/types.py b/packages/reflex-base/src/reflex_base/utils/types.py index 1298287ec6e..d3d7551080d 100644 --- a/packages/reflex-base/src/reflex_base/utils/types.py +++ b/packages/reflex-base/src/reflex_base/utils/types.py @@ -678,7 +678,7 @@ def _isinstance( if cls is None or cls is type(None): return obj is None - if cls is not None and is_union(cls): + if is_union(cls): return any( _isinstance(obj, arg, nested=nested, treat_var_as_type=treat_var_as_type) for arg in get_args(cls) diff --git a/packages/reflex-base/src/reflex_base/vars/base.py b/packages/reflex-base/src/reflex_base/vars/base.py index c2c3300cf86..b2adb434405 100644 --- a/packages/reflex-base/src/reflex_base/vars/base.py +++ b/packages/reflex-base/src/reflex_base/vars/base.py @@ -2464,7 +2464,7 @@ def _replace( @property def _cache_attr(self) -> str: - """Get the attribute used to cache the value on the instance. + """The attribute used to cache the value on the instance. Returns: An attribute name. @@ -2473,7 +2473,7 @@ def _cache_attr(self) -> str: @property def _last_updated_attr(self) -> str: - """Get the attribute used to store the last updated timestamp. + """The attribute used to store the last updated timestamp. Returns: An attribute name. @@ -2724,7 +2724,7 @@ def _determine_var_type(self) -> type: @property def __class__(self) -> type: - """Get the class of the var. + """The class of the var. Returns: The class of the var. @@ -2733,7 +2733,7 @@ def __class__(self) -> type: @property def fget(self) -> Callable[[BaseState], RETURN_TYPE]: - """Get the getter function. + """The getter function. Returns: The getter function. @@ -2869,7 +2869,7 @@ async def _awaitable_result(instance: BaseState = instance) -> RETURN_TYPE: @property def fget(self) -> Callable[[BaseState], Coroutine[None, None, RETURN_TYPE]]: - """Get the getter function. + """The getter function. Returns: The getter function. @@ -3485,8 +3485,8 @@ class Field(Generic[FIELD_TYPE]): if TYPE_CHECKING: type_: GenericType - default: FIELD_TYPE | _MISSING_TYPE - default_factory: Callable[[], FIELD_TYPE] | None + default: FIELD_TYPE | _MISSING_TYPE | None + default_factory: Callable[[], FIELD_TYPE | None] | None def __init__( self, @@ -3520,7 +3520,11 @@ def __init__( type_origin = get_origin(annotated_type) or annotated_type if self.default is MISSING and self.default_factory is None: - default_value = types.get_default_value_for_type(annotated_type) + # A type with no computed default gets None, even when FIELD_TYPE + # itself excludes None; `annotated_type` is widened to match below. + default_value: FIELD_TYPE | None = types.get_default_value_for_type( + annotated_type + ) if default_value is None and not types.is_optional(annotated_type): annotated_type = annotated_type | None if types.is_immutable(default_value): @@ -3547,7 +3551,7 @@ def __init__( if key not in self.__dict__ and key not in _RESERVED_FIELD_ATTRS: self.__dict__[key] = value - def default_value(self) -> FIELD_TYPE: + def default_value(self) -> FIELD_TYPE | None: """Get the default value for the field. Returns: diff --git a/packages/reflex-base/src/reflex_base/vars/datetime.py b/packages/reflex-base/src/reflex_base/vars/datetime.py index bc3574bc09d..341366aee77 100644 --- a/packages/reflex-base/src/reflex_base/vars/datetime.py +++ b/packages/reflex-base/src/reflex_base/vars/datetime.py @@ -7,11 +7,11 @@ from typing import Any, Literal, TypeVar from reflex_base.utils.exceptions import VarTypeError +from reflex_base.utils.imports import ImportVar from reflex_base.vars.number import BooleanVar from .base import ( CustomVarOperationReturn, - ImportVar, LiteralVar, Var, VarData, diff --git a/packages/reflex-base/src/reflex_base/vars/dep_tracking.py b/packages/reflex-base/src/reflex_base/vars/dep_tracking.py index 7f2a9fd5c7a..4d4ad5e8333 100644 --- a/packages/reflex-base/src/reflex_base/vars/dep_tracking.py +++ b/packages/reflex-base/src/reflex_base/vars/dep_tracking.py @@ -454,7 +454,9 @@ def _populate_dependencies(self) -> None: tracked_locals=self.tracked_locals, ) ) - elif instruction.opname == "IMPORT_NAME" and instruction.argval is not None: + elif instruction.opname == "IMPORT_NAME": + if instruction.argval is None: + continue self.scan_status = ScanStatus.GETTING_IMPORT self._last_import_name = instruction.argval importlib.import_module(instruction.argval) diff --git a/packages/reflex-base/src/reflex_base/vars/number.py b/packages/reflex-base/src/reflex_base/vars/number.py index ae3f8ac4987..779c06b42cf 100644 --- a/packages/reflex-base/src/reflex_base/vars/number.py +++ b/packages/reflex-base/src/reflex_base/vars/number.py @@ -18,14 +18,13 @@ VarValueError, ) from reflex_base.utils.imports import ImportDict, ImportVar -from reflex_base.utils.types import safe_issubclass +from reflex_base.utils.types import safe_issubclass, unionize from .base import ( CustomVarOperationReturn, LiteralVar, Var, VarData, - unionize, var_operation, var_operation_return, ) diff --git a/packages/reflex-components-core/news/+upgrade-lint-typecheck-tooling.misc.md b/packages/reflex-components-core/news/+upgrade-lint-typecheck-tooling.misc.md new file mode 100644 index 00000000000..1deca0cb37f --- /dev/null +++ b/packages/reflex-components-core/news/+upgrade-lint-typecheck-tooling.misc.md @@ -0,0 +1 @@ +Property docstrings are now noun phrases rather than "Get the ..." / "Return the ..." (ruff 0.16's new `D421`). diff --git a/packages/reflex-components-core/src/reflex_components_core/core/_upload.py b/packages/reflex-components-core/src/reflex_components_core/core/_upload.py index 388fc6faea3..fc654e26f87 100644 --- a/packages/reflex-components-core/src/reflex_components_core/core/_upload.py +++ b/packages/reflex-components-core/src/reflex_components_core/core/_upload.py @@ -57,7 +57,7 @@ class UploadFile(StarletteUploadFile): @property def filename(self) -> str | None: - """Get the name of the uploaded file. + """The name of the uploaded file. Returns: The name of the uploaded file. @@ -66,7 +66,7 @@ def filename(self) -> str | None: @property def name(self) -> str | None: - """Get the name of the uploaded file. + """The name of the uploaded file. Returns: The name of the uploaded file. diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/accordion.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/accordion.py index 1db1e93c5d4..c29bc33b42a 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/accordion.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/accordion.py @@ -37,7 +37,7 @@ class AccordionBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the accordion component.""" + """The import variable for the accordion component.""" return ImportVar(tag="Accordion", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/avatar.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/avatar.py index 53d1204b141..fca0c799b45 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/avatar.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/avatar.py @@ -22,7 +22,7 @@ class AvatarBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the avatar component.""" + """The import variable for the avatar component.""" return ImportVar(tag="Avatar", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/checkbox.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/checkbox.py index 4e5a135af9c..a3f955bffd2 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/checkbox.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/checkbox.py @@ -27,7 +27,7 @@ class CheckboxBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the checkbox component.""" + """The import variable for the checkbox component.""" return ImportVar(tag="Checkbox", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/collapsible.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/collapsible.py index 8dc5dd4305c..5fa807b67d1 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/collapsible.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/collapsible.py @@ -22,7 +22,7 @@ class CollapsibleBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the collapsible component.""" + """The import variable for the collapsible component.""" return ImportVar(tag="Collapsible", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/context_menu.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/context_menu.py index 2e69eba8c9b..d4a11a5dbae 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/context_menu.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/context_menu.py @@ -61,7 +61,7 @@ class ContextMenuBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the context menu component.""" + """The import variable for the context menu component.""" return ImportVar(tag="ContextMenu", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/dialog.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/dialog.py index 2ca17bef12f..b4e185db5e1 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/dialog.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/dialog.py @@ -33,7 +33,7 @@ class DialogBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the dialog component.""" + """The import variable for the dialog component.""" return ImportVar(tag="Dialog", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/drawer.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/drawer.py index e286da33d70..46e0dddd7f4 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/drawer.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/drawer.py @@ -44,7 +44,7 @@ class DrawerBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the drawer component.""" + """The import variable for the drawer component.""" return ImportVar(tag="Drawer", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/input.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/input.py index 824836ea4af..880b43a4246 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/input.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/input.py @@ -47,7 +47,7 @@ class InputBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the input component.""" + """The import variable for the input component.""" return ImportVar(tag="Input", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/menu.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/menu.py index 169866a6c46..2be1209d613 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/menu.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/menu.py @@ -62,7 +62,7 @@ class MenuBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the menu component.""" + """The import variable for the menu component.""" return ImportVar(tag="Menu", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/navigation_menu.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/navigation_menu.py index 84f515c483e..809196ffa74 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/navigation_menu.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/navigation_menu.py @@ -40,7 +40,7 @@ class NavigationMenuBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the navigation menu component.""" + """The import variable for the navigation menu component.""" return ImportVar(tag="NavigationMenu", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/number_field.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/number_field.py index b8a903e9a20..b3f1dd90773 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/number_field.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/number_field.py @@ -41,7 +41,7 @@ class NumberFieldBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the number field component.""" + """The import variable for the number field component.""" return ImportVar(tag="NumberField", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/otp_field.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/otp_field.py index 36cfb342b45..f9ad8c9ee04 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/otp_field.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/otp_field.py @@ -32,7 +32,7 @@ class OTPFieldBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the OTP field component.""" + """The import variable for the OTP field component.""" return ImportVar(tag="OTPField", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/popover.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/popover.py index 0219c3213d2..9bef5235974 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/popover.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/popover.py @@ -36,7 +36,7 @@ class PopoverBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the popover component.""" + """The import variable for the popover component.""" return ImportVar(tag="Popover", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/preview_card.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/preview_card.py index fcd265e1578..32f4fae3aa9 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/preview_card.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/preview_card.py @@ -33,7 +33,7 @@ class PreviewCardBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the preview card component.""" + """The import variable for the preview card component.""" return ImportVar(tag="PreviewCard", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/scroll_area.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/scroll_area.py index 00069d8664d..e72c0452254 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/scroll_area.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/scroll_area.py @@ -33,7 +33,7 @@ class ScrollAreaBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the scroll area component.""" + """The import variable for the scroll area component.""" return ImportVar(tag="ScrollArea", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/select.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/select.py index ddde1a10dcc..e5c1dbbcac5 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/select.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/select.py @@ -51,7 +51,7 @@ class SelectBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the select component.""" + """The import variable for the select component.""" return ImportVar(tag="Select", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/slider.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/slider.py index b2a304c06c9..7424b0a2b66 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/slider.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/slider.py @@ -40,7 +40,7 @@ class SliderBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the slider component.""" + """The import variable for the slider component.""" return ImportVar(tag="Slider", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/switch.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/switch.py index 43d50320768..184c7315b2c 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/switch.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/switch.py @@ -21,7 +21,7 @@ class SwitchBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the switch component.""" + """The import variable for the switch component.""" return ImportVar(tag="Switch", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/tabs.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/tabs.py index 4fe83c92479..9cc8bb96ba3 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/tabs.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/tabs.py @@ -46,7 +46,7 @@ class TabsBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the tabs component.""" + """The import variable for the tabs component.""" return ImportVar(tag="Tabs", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/toggle.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/toggle.py index 43cda22bd7e..c91fd9c1e93 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/toggle.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/toggle.py @@ -20,7 +20,7 @@ class ToggleBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the toggle component.""" + """The import variable for the toggle component.""" return ImportVar(tag="Toggle", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/toggle_group.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/toggle_group.py index 2519ad0d907..e6ca7612dd7 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/toggle_group.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/toggle_group.py @@ -24,7 +24,7 @@ class ToggleGroupBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the toggle group component.""" + """The import variable for the toggle group component.""" return ImportVar(tag="ToggleGroup", package_path="", install=False) diff --git a/packages/reflex-components-internal/src/reflex_components_internal/components/base/tooltip.py b/packages/reflex-components-internal/src/reflex_components_internal/components/base/tooltip.py index 3491f393798..5b2358d3ba1 100644 --- a/packages/reflex-components-internal/src/reflex_components_internal/components/base/tooltip.py +++ b/packages/reflex-components-internal/src/reflex_components_internal/components/base/tooltip.py @@ -31,7 +31,7 @@ class TooltipBaseComponent(BaseUIComponent): @property def import_var(self): - """Return the import variable for the tooltip component.""" + """The import variable for the tooltip component.""" return ImportVar(tag="Tooltip", package_path="", install=False) diff --git a/packages/reflex-docgen/news/+upgrade-lint-typecheck-tooling.misc.md b/packages/reflex-docgen/news/+upgrade-lint-typecheck-tooling.misc.md new file mode 100644 index 00000000000..1deca0cb37f --- /dev/null +++ b/packages/reflex-docgen/news/+upgrade-lint-typecheck-tooling.misc.md @@ -0,0 +1 @@ +Property docstrings are now noun phrases rather than "Get the ..." / "Return the ..." (ruff 0.16's new `D421`). diff --git a/packages/reflex-docgen/src/reflex_docgen/markdown/_types.py b/packages/reflex-docgen/src/reflex_docgen/markdown/_types.py index 1b65ed85874..f5202e5edfc 100644 --- a/packages/reflex-docgen/src/reflex_docgen/markdown/_types.py +++ b/packages/reflex-docgen/src/reflex_docgen/markdown/_types.py @@ -328,20 +328,20 @@ class Document: @property def metadata(self) -> Mapping[str, object]: - """Return the raw frontmatter mapping, or an empty mapping if absent.""" + """The raw frontmatter mapping, or an empty mapping if absent.""" return self.frontmatter.metadata if self.frontmatter is not None else {} @property def headings(self) -> tuple[HeadingBlock, ...]: - """Return all headings in the document.""" + """All headings in the document.""" return tuple(b for b in self.blocks if isinstance(b, HeadingBlock)) @property def code_blocks(self) -> tuple[CodeBlock, ...]: - """Return all code blocks in the document.""" + """All code blocks in the document.""" return tuple(b for b in self.blocks if isinstance(b, CodeBlock)) @property def directives(self) -> tuple[DirectiveBlock, ...]: - """Return all directive blocks in the document.""" + """All directive blocks in the document.""" return tuple(b for b in self.blocks if isinstance(b, DirectiveBlock)) diff --git a/packages/reflex-release/news/+upgrade-lint-typecheck-tooling.misc.md b/packages/reflex-release/news/+upgrade-lint-typecheck-tooling.misc.md new file mode 100644 index 00000000000..1deca0cb37f --- /dev/null +++ b/packages/reflex-release/news/+upgrade-lint-typecheck-tooling.misc.md @@ -0,0 +1 @@ +Property docstrings are now noun phrases rather than "Get the ..." / "Return the ..." (ruff 0.16's new `D421`). diff --git a/packages/reflex-release/src/reflex_release/config.py b/packages/reflex-release/src/reflex_release/config.py index a0eeb5d38e7..91d4f99443c 100644 --- a/packages/reflex-release/src/reflex_release/config.py +++ b/packages/reflex-release/src/reflex_release/config.py @@ -92,7 +92,7 @@ class CustomBuild: @property def job_id(self) -> str: - """Return the publish-workflow job id that calls this workflow. + """The publish-workflow job id that calls this workflow. Returns: The workflow filename reduced to the characters GitHub allows in a diff --git a/pyproject.toml b/pyproject.toml index 2638de9c41b..d9155d19c6a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -188,6 +188,8 @@ lint.ignore = [ "ANN2", "ANN4", "ARG", + # Background event handlers hold `async with self` across `yield` by design. + "ASYNC119", "BLE", "C901", "COM", @@ -213,6 +215,11 @@ lint.ignore = [ "PYI", "RUF012", "RUF067", + # State managers deliberately skip write-back when the `with` body raises. + "RUF075", + # `noqa` comments stay readable to non-ruff tooling and to older ruff versions. + "RUF105", + "RUF201", "S", "SLF", "SLOT", diff --git a/reflex/app.py b/reflex/app.py index 63ec53a4c75..28265b5a69a 100644 --- a/reflex/app.py +++ b/reflex/app.py @@ -479,7 +479,7 @@ class App(MiddlewareMixin, LifespanMixin): @property def event_namespace(self) -> EventNamespace | None: - """Get the event namespace. + """The event namespace. Returns: The event namespace. @@ -488,7 +488,7 @@ def event_namespace(self) -> EventNamespace | None: @property def event_processor(self) -> EventProcessor: - """Get the event processor. + """The event processor. Raises: RuntimeError: If the event processor is not initialized. @@ -885,7 +885,7 @@ def _add_cors(api: Starlette): @property def state_manager(self) -> StateManager: - """Get the state manager. + """The state manager. Returns: The initialized state manager. @@ -1316,7 +1316,7 @@ def _compile_page(self, route: str, save_page: bool = True): @functools.cached_property def router(self) -> Callable[[str], str | None]: - """Get the route computer function. + """The route computer function. Returns: The route computer function. @@ -1958,7 +1958,7 @@ def __init__(self, namespace: str, app: App): @property def token_to_sid(self) -> Mapping[str, str]: - """Get token to SID mapping for backward compatibility. + """Token to SID mapping for backward compatibility. Note: this mapping is read-only. @@ -1970,7 +1970,7 @@ def token_to_sid(self) -> Mapping[str, str]: @property def sid_to_token(self) -> dict[str, str]: - """Get SID to token mapping for backward compatibility. + """SID to token mapping for backward compatibility. Returns: The SID to token mapping dict. diff --git a/reflex/app_mixins/lifespan.py b/reflex/app_mixins/lifespan.py index 0deab885dd6..e3c6e2e37a0 100644 --- a/reflex/app_mixins/lifespan.py +++ b/reflex/app_mixins/lifespan.py @@ -60,14 +60,14 @@ class LifespanMixin(AppMixin): @property @deprecated("Use get_lifespan_tasks method instead.") def lifespan_tasks(self) -> frozenset[asyncio.Task | Callable]: - """Get a copy of registered lifespan tasks (deprecated).""" + """A copy of registered lifespan tasks (deprecated).""" ... else: @property def lifespan_tasks(self) -> frozenset[asyncio.Task | Callable]: - """Get a copy of registered lifespan tasks. + """A copy of registered lifespan tasks. Returns: A frozenset of registered lifespan tasks. diff --git a/reflex/compiler/compiler.py b/reflex/compiler/compiler.py index 13f10555971..7a90cce2f2e 100644 --- a/reflex/compiler/compiler.py +++ b/reflex/compiler/compiler.py @@ -10,7 +10,7 @@ from collections.abc import Callable, Iterable, Sequence from inspect import getmodule from pathlib import Path -from typing import TYPE_CHECKING, Any +from typing import TYPE_CHECKING, Any, cast from reflex_base import constants from reflex_base.components.component import ( @@ -397,9 +397,13 @@ def _compile_root_stylesheet( from sass import compile as sass_compile target.write_text( - data=sass_compile( - filename=str(stylesheet), - output_style="compressed", + # libsass is untyped; compiling from a filename returns the CSS. + data=cast( + "str", + sass_compile( + filename=str(stylesheet), + output_style="compressed", + ), ), encoding="utf8", ) diff --git a/reflex/experimental/client_state.py b/reflex/experimental/client_state.py index e24315b4734..d8e041b025e 100644 --- a/reflex/experimental/client_state.py +++ b/reflex/experimental/client_state.py @@ -194,7 +194,7 @@ def create( @property def value(self) -> Var: - """Get a placeholder for the Var. + """A placeholder for the Var. This property can only be rendered on the frontend. diff --git a/reflex/istate/data.py b/reflex/istate/data.py index d0f044e54d0..74e13c60899 100644 --- a/reflex/istate/data.py +++ b/reflex/istate/data.py @@ -424,7 +424,7 @@ class RouterData: @property def page(self) -> PageData: - """Get the page data. + """The page data. Returns: The PageData object. diff --git a/reflex/istate/manager/__init__.py b/reflex/istate/manager/__init__.py index 1b5cab9d974..3ad86dba354 100644 --- a/reflex/istate/manager/__init__.py +++ b/reflex/istate/manager/__init__.py @@ -37,7 +37,7 @@ class StateManager(ABC): @property def state(self): - """Get the state class. + """The state class. Deprecated: the state manager no longer holds a reference to the state class. diff --git a/reflex/istate/manager/disk.py b/reflex/istate/manager/disk.py index 65066505247..b1da40ae209 100644 --- a/reflex/istate/manager/disk.py +++ b/reflex/istate/manager/disk.py @@ -79,7 +79,7 @@ def __post_init__(self): @functools.cached_property def states_directory(self) -> Path: - """Get the states directory. + """The states directory. Resolved once so later cwd changes do not move where states are written or purged. diff --git a/reflex/reflex.py b/reflex/reflex.py index 3d44a60a34d..3d8f791dd8a 100644 --- a/reflex/reflex.py +++ b/reflex/reflex.py @@ -5,7 +5,7 @@ import logging from importlib.util import find_spec from pathlib import Path -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, cast import click from reflex_base import constants @@ -1044,7 +1044,9 @@ def rename(new_name: str): import typer # pyright: ignore[reportMissingImports] if isinstance(hosting_cli, typer.Typer): - hosting_cli_command = typer.main.get_command(hosting_cli) + # typer >=0.27 vendors click, so its commands are structurally but not + # nominally click commands. + hosting_cli_command = cast("click.Command", typer.main.get_command(hosting_cli)) else: hosting_cli_command = hosting_cli else: diff --git a/tests/units/conftest.py b/tests/units/conftest.py index 8ef4232fbc7..04d37950acb 100644 --- a/tests/units/conftest.py +++ b/tests/units/conftest.py @@ -240,9 +240,7 @@ def model_registry() -> Generator[type[ModelRegistry], None, None]: ModelRegistry._metadata = None -@pytest_asyncio.fixture( - loop_scope="function", scope="function", params=["in_process", "disk", "redis"] -) +@pytest_asyncio.fixture(loop_scope="function", params=["in_process", "disk", "redis"]) async def state_manager( request: pytest.FixtureRequest, mock_root_event_context: EventContext ) -> AsyncGenerator[StateManager, None]: diff --git a/tests/units/istate/manager/test_expiration.py b/tests/units/istate/manager/test_expiration.py index f20ea71b052..d9a95227f21 100644 --- a/tests/units/istate/manager/test_expiration.py +++ b/tests/units/istate/manager/test_expiration.py @@ -39,7 +39,7 @@ async def _poll_until( assert predicate() -@pytest_asyncio.fixture(loop_scope="function", scope="function") +@pytest_asyncio.fixture(loop_scope="function") async def state_manager_memory() -> AsyncGenerator[StateManagerMemory]: """Create a memory state manager with a short expiration. diff --git a/tests/units/istate/manager/test_redis.py b/tests/units/istate/manager/test_redis.py index 0b37389a337..5ec8de77be6 100644 --- a/tests/units/istate/manager/test_redis.py +++ b/tests/units/istate/manager/test_redis.py @@ -37,7 +37,7 @@ def root_state() -> type[RedisTestState]: return RedisTestState -@pytest_asyncio.fixture(loop_scope="function", scope="function") +@pytest_asyncio.fixture(loop_scope="function") async def state_manager_redis( root_state: type[RedisTestState], ) -> AsyncGenerator[StateManagerRedis]: diff --git a/tests/units/reflex_cli/v2/test_apps.py b/tests/units/reflex_cli/v2/test_apps.py index 96c574cd9ea..47a0c308dc3 100644 --- a/tests/units/reflex_cli/v2/test_apps.py +++ b/tests/units/reflex_cli/v2/test_apps.py @@ -14,11 +14,10 @@ from reflex_cli.utils.exceptions import GetAppError from reflex_cli.v2.apps import _resolve_app_id, apps_cli from reflex_cli.v2.deployments import hosting_cli -from typer.main import Typer, get_command -hosting_cli = ( - get_command(hosting_cli) if isinstance(hosting_cli, Typer) else hosting_cli -) +from .utils import as_click_command + +hosting_cli = as_click_command(hosting_cli) runner = CliRunner() diff --git a/tests/units/reflex_cli/v2/test_gcp.py b/tests/units/reflex_cli/v2/test_gcp.py index ac7d6aec193..bee8c05d741 100644 --- a/tests/units/reflex_cli/v2/test_gcp.py +++ b/tests/units/reflex_cli/v2/test_gcp.py @@ -10,11 +10,10 @@ from pytest_mock import MockFixture from reflex_cli.utils import hosting from reflex_cli.v2.deployments import hosting_cli -from typer.main import Typer, get_command -hosting_cli = ( - get_command(hosting_cli) if isinstance(hosting_cli, Typer) else hosting_cli -) +from .utils import as_click_command + +hosting_cli = as_click_command(hosting_cli) runner = CliRunner() diff --git a/tests/units/reflex_cli/v2/test_project.py b/tests/units/reflex_cli/v2/test_project.py index 24bb75cd182..e8b7bcfca50 100644 --- a/tests/units/reflex_cli/v2/test_project.py +++ b/tests/units/reflex_cli/v2/test_project.py @@ -9,12 +9,10 @@ from reflex_cli.utils import hosting from reflex_cli.utils.exceptions import NotAuthenticatedError from reflex_cli.v2.deployments import hosting_cli -from typer import Typer -from typer.main import get_command -hosting_cli = ( - get_command(hosting_cli) if isinstance(hosting_cli, Typer) else hosting_cli -) +from .utils import as_click_command + +hosting_cli = as_click_command(hosting_cli) runner = CliRunner() diff --git a/tests/units/reflex_cli/v2/test_scan.py b/tests/units/reflex_cli/v2/test_scan.py index ce54962f9b9..69c894ae035 100644 --- a/tests/units/reflex_cli/v2/test_scan.py +++ b/tests/units/reflex_cli/v2/test_scan.py @@ -12,11 +12,10 @@ from reflex_cli.utils import hosting from reflex_cli.utils.exceptions import NotAuthenticatedError from reflex_cli.v2.deployments import hosting_cli -from typer.main import Typer, get_command -hosting_cli = ( - get_command(hosting_cli) if isinstance(hosting_cli, Typer) else hosting_cli -) +from .utils import as_click_command + +hosting_cli = as_click_command(hosting_cli) runner = CliRunner() diff --git a/tests/units/reflex_cli/v2/test_secrets.py b/tests/units/reflex_cli/v2/test_secrets.py index cd2060e5bf5..982f3fd7456 100644 --- a/tests/units/reflex_cli/v2/test_secrets.py +++ b/tests/units/reflex_cli/v2/test_secrets.py @@ -8,12 +8,10 @@ from reflex_base.utils.log import SUCCESS from reflex_cli.utils import hosting from reflex_cli.v2.deployments import hosting_cli -from typer import Typer -from typer.main import get_command -hosting_cli = ( - get_command(hosting_cli) if isinstance(hosting_cli, Typer) else hosting_cli -) +from .utils import as_click_command + +hosting_cli = as_click_command(hosting_cli) runner = CliRunner() diff --git a/tests/units/reflex_cli/v2/test_vmtypes_regions.py b/tests/units/reflex_cli/v2/test_vmtypes_regions.py index 56134d3e31c..31f0c45baab 100644 --- a/tests/units/reflex_cli/v2/test_vmtypes_regions.py +++ b/tests/units/reflex_cli/v2/test_vmtypes_regions.py @@ -6,13 +6,10 @@ from click.testing import CliRunner from pytest_mock import MockerFixture, MockFixture from reflex_cli.v2.deployments import hosting_cli -from typer import Typer -from typer.main import get_command -hosting_cli = ( - get_command(hosting_cli) if isinstance(hosting_cli, Typer) else hosting_cli -) +from .utils import as_click_command +hosting_cli = as_click_command(hosting_cli) runner = CliRunner() diff --git a/tests/units/reflex_cli/v2/utils.py b/tests/units/reflex_cli/v2/utils.py new file mode 100644 index 00000000000..987f898a2ad --- /dev/null +++ b/tests/units/reflex_cli/v2/utils.py @@ -0,0 +1,25 @@ +"""Shared helpers for the hosting CLI tests.""" + +from __future__ import annotations + +from typing import cast + +import click +from typer import Typer +from typer.main import get_command + + +def as_click_command(cli: Typer | click.Command) -> click.Command: + """Resolve the hosting CLI to a command that `CliRunner` can invoke. + + Args: + cli: The hosting CLI, either wrapped in a Typer app or a plain click command. + + Returns: + The click command to invoke. + """ + if not isinstance(cli, Typer): + return cli + # typer >=0.27 vendors click, so its commands are structurally but not + # nominally click commands. + return cast("click.Command", get_command(cli)) diff --git a/tests/units/test_state.py b/tests/units/test_state.py index 416e09ade65..7f661aa17a4 100644 --- a/tests/units/test_state.py +++ b/tests/units/test_state.py @@ -1974,7 +1974,7 @@ def _clear_dedupe(): mock_deprecate.assert_called() -@pytest_asyncio.fixture(loop_scope="function", scope="function") +@pytest_asyncio.fixture(loop_scope="function") async def state_manager_redis() -> AsyncGenerator[StateManager, None]: """Instance of state manager for redis only. diff --git a/tests/units/test_state_tree.py b/tests/units/test_state_tree.py index 2e72d83fc8b..e6315b89554 100644 --- a/tests/units/test_state_tree.py +++ b/tests/units/test_state_tree.py @@ -214,7 +214,7 @@ def sub_e_a_a_a_d_var(self) -> int: ] -@pytest_asyncio.fixture(loop_scope="function", scope="function") +@pytest_asyncio.fixture(loop_scope="function") async def state_manager_redis( app_module_mock, ) -> AsyncGenerator[StateManager, None]: diff --git a/uv.lock b/uv.lock index ab4dfd64387..c5f03b2c6e3 100644 --- a/uv.lock +++ b/uv.lock @@ -585,7 +585,7 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } wheels = [ @@ -663,7 +663,7 @@ resolution-markers = [ "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } @@ -1003,7 +1003,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -1879,15 +1879,15 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "contourpy", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "cycler", marker = "python_full_version < '3.11'" }, - { name = "fonttools", marker = "python_full_version < '3.11'" }, - { name = "kiwisolver", marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "packaging", marker = "python_full_version < '3.11'" }, - { name = "pillow", marker = "python_full_version < '3.11'" }, - { name = "pyparsing", marker = "python_full_version < '3.11'" }, - { name = "python-dateutil", marker = "python_full_version < '3.11'" }, + { name = "contourpy", version = "1.3.2", source = { registry = "https://pypi.org/simple" } }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, ] sdist = { url = "https://files.pythonhosted.org/packages/63/1b/4be5be87d43d327a0cf4de1a56e86f7f84c89312452406cf122efe2839e6/matplotlib-3.10.9.tar.gz", hash = "sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358", size = 34811233, upload-time = "2026-04-24T00:14:13.539Z" } wheels = [ @@ -1963,16 +1963,16 @@ resolution-markers = [ "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "contourpy", version = "1.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "cycler", marker = "python_full_version >= '3.11'" }, - { name = "fonttools", marker = "python_full_version >= '3.11'" }, - { name = "kiwisolver", marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "contourpy", version = "1.3.3", source = { registry = "https://pypi.org/simple" } }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "packaging", marker = "python_full_version >= '3.11'" }, - { name = "pillow", marker = "python_full_version >= '3.11'" }, - { name = "pyparsing", marker = "python_full_version >= '3.11'" }, - { name = "python-dateutil", marker = "python_full_version >= '3.11'" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, ] sdist = { url = "https://files.pythonhosted.org/packages/49/64/f9a391af28f518b11ad45a8a712353c94a0aefce09d3703200e5c54b610a/matplotlib-3.11.1.tar.gz", hash = "sha256:69647db5746941c793d6e445a4cd349323ffb87d9cc958c2ad84a659b4832d30", size = 32612045, upload-time = "2026-07-18T03:39:46.63Z" } wheels = [ @@ -2534,10 +2534,10 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "python-dateutil", marker = "python_full_version < '3.11'" }, - { name = "pytz", marker = "python_full_version < '3.11'" }, - { name = "tzdata", marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, ] sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } wheels = [ @@ -2606,10 +2606,10 @@ resolution-markers = [ "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "python-dateutil", marker = "python_full_version >= '3.11'" }, - { name = "tzdata", marker = "(python_full_version >= '3.11' and sys_platform == 'emscripten') or (python_full_version >= '3.11' and sys_platform == 'win32')" }, + { name = "python-dateutil" }, + { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/be/4f/5f3422a2afec5ffc46308b79e53291365a93748b498ac2e58bead0197916/pandas-3.0.5.tar.gz", hash = "sha256:dca3734d6ab7c906e6730f0788b0a1dbb9f2467731f9711f77995c8e9d62d712", size = 4658219, upload-time = "2026-07-22T22:19:28.819Z" } wheels = [ @@ -3278,15 +3278,15 @@ wheels = [ [[package]] name = "pyright" -version = "1.1.408" +version = "1.1.411" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "nodeenv" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/b2/5db700e52554b8f025faa9c3c624c59f1f6c8841ba81ab97641b54322f16/pyright-1.1.408.tar.gz", hash = "sha256:f28f2321f96852fa50b5829ea492f6adb0e6954568d1caa3f3af3a5f555eb684", size = 4400578, upload-time = "2026-01-08T08:07:38.795Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/ab/265f7dc69d28113ebba19092e57b075f41543b2ed048429c5f56e2b88eac/pyright-1.1.411.tar.gz", hash = "sha256:d885a0551f2e763b089a02702174e7f4ba77548cddabc972ab86d1f7f1b0f998", size = 4112861, upload-time = "2026-06-25T02:14:06.37Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/82/a2c93e32800940d9573fb28c346772a14778b84ba7524e691b324620ab89/pyright-1.1.408-py3-none-any.whl", hash = "sha256:090b32865f4fdb1e0e6cd82bf5618480d48eecd2eb2e70f960982a3d9a4c17c1", size = 6399144, upload-time = "2026-01-08T08:07:37.082Z" }, + { url = "https://files.pythonhosted.org/packages/0a/49/385be530a6a5b78d1cbcd5c2e38debc8959a2fc6bdb716f4e581002979fc/pyright-1.1.411-py3-none-any.whl", hash = "sha256:dc7c72a8e2700c55baa127554040e067041ea53ccfd50bf96308cc4291c7d5d9", size = 6181526, upload-time = "2026-06-25T02:14:04.691Z" }, ] [[package]] @@ -4238,27 +4238,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.15.12" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/99/43/3291f1cc9106f4c63bdce7a8d0df5047fe8422a75b091c16b5e9355e0b11/ruff-0.15.12.tar.gz", hash = "sha256:ecea26adb26b4232c0c2ca19ccbc0083a68344180bba2a600605538ce51a40a6", size = 4643852, upload-time = "2026-04-24T18:17:14.305Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/6e/e78ffb61d4686f3d96ba3df2c801161843746dcbcbb17a1e927d4829312b/ruff-0.15.12-py3-none-linux_armv6l.whl", hash = "sha256:f86f176e188e94d6bdbc09f09bfd9dc729059ad93d0e7390b5a73efe19f8861c", size = 10640713, upload-time = "2026-04-24T18:17:22.841Z" }, - { url = "https://files.pythonhosted.org/packages/ae/08/a317bc231fb9e7b93e4ef3089501e51922ff88d6936ce5cf870c4fe55419/ruff-0.15.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e3bcd123364c3770b8e1b7baaf343cc99a35f197c5c6e8af79015c666c423a6c", size = 11069267, upload-time = "2026-04-24T18:17:30.105Z" }, - { url = "https://files.pythonhosted.org/packages/aa/a4/f828e9718d3dce1f5f11c39c4f65afd32783c8b2aebb2e3d259e492c47bd/ruff-0.15.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fe87510d000220aa1ed530d4448a7c696a0cae1213e5ec30e5874287b66557b5", size = 10397182, upload-time = "2026-04-24T18:17:07.177Z" }, - { url = "https://files.pythonhosted.org/packages/71/e0/3310fc6d1b5e1fdea22bf3b1b807c7e187b581021b0d7d4514cccdb5fb71/ruff-0.15.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84a1630093121375a3e2a95b4a6dc7b59e2b4ee76216e32d81aae550a832d002", size = 10758012, upload-time = "2026-04-24T18:16:55.759Z" }, - { url = "https://files.pythonhosted.org/packages/11/c1/a606911aee04c324ddaa883ae418f3569792fd3c4a10c50e0dd0a2311e1e/ruff-0.15.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fb129f40f114f089ebe0ca56c0d251cf2061b17651d464bb6478dc01e69f11f5", size = 10447479, upload-time = "2026-04-24T18:16:51.677Z" }, - { url = "https://files.pythonhosted.org/packages/9d/68/4201e8444f0894f21ab4aeeaee68aa4f10b51613514a20d80bd628d57e88/ruff-0.15.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0c862b172d695db7598426b8af465e7e9ac00a3ea2a3630ee67eb82e366aaa6", size = 11234040, upload-time = "2026-04-24T18:17:16.529Z" }, - { url = "https://files.pythonhosted.org/packages/34/ff/8a6d6cf4ccc23fd67060874e832c18919d1557a0611ebef03fdb01fff11e/ruff-0.15.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2849ea9f3484c3aca43a82f484210370319e7170df4dfe4843395ddf6c57bc33", size = 12087377, upload-time = "2026-04-24T18:17:04.944Z" }, - { url = "https://files.pythonhosted.org/packages/85/f6/c669cf73f5152f623d34e69866a46d5e6185816b19fcd5b6dd8a2d299922/ruff-0.15.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e77c7e51c07fe396826d5969a5b846d9cd4c402535835fb6e21ce8b28fef847", size = 11367784, upload-time = "2026-04-24T18:17:25.409Z" }, - { url = "https://files.pythonhosted.org/packages/e8/39/c61d193b8a1daaa8977f7dea9e8d8ba866e02ea7b65d32f6861693aa4c12/ruff-0.15.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83b2f4f2f3b1026b5fb449b467d9264bf22067b600f7b6f41fc5958909f449d0", size = 11344088, upload-time = "2026-04-24T18:17:12.258Z" }, - { url = "https://files.pythonhosted.org/packages/c2/8d/49afab3645e31e12c590acb6d3b5b69d7aab5b81926dbaf7461f9441f37a/ruff-0.15.12-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9ba3b8f1afd7e2e43d8943e55f249e13f9682fde09711644a6e7290eb4f3e339", size = 11271770, upload-time = "2026-04-24T18:17:02.457Z" }, - { url = "https://files.pythonhosted.org/packages/46/06/33f41fe94403e2b755481cdfb9b7ef3e4e0ed031c4581124658d935d52b4/ruff-0.15.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e852ba9fdc890655e1d78f2df1499efbe0e54126bd405362154a75e2bde159c5", size = 10719355, upload-time = "2026-04-24T18:17:27.648Z" }, - { url = "https://files.pythonhosted.org/packages/0d/59/18aa4e014debbf559670e4048e39260a85c7fcee84acfd761ac01e7b8d35/ruff-0.15.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dd8aed930da53780d22fc70bdf84452c843cf64f8cb4eb38984319c24c5cd5fd", size = 10462758, upload-time = "2026-04-24T18:17:32.347Z" }, - { url = "https://files.pythonhosted.org/packages/25/e7/cc9f16fd0f3b5fddcbd7ec3d6ae30c8f3fde1047f32a4093a98d633c6570/ruff-0.15.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:01da3988d225628b709493d7dc67c3b9b12c0210016b08690ef9bd27970b262b", size = 10953498, upload-time = "2026-04-24T18:17:20.674Z" }, - { url = "https://files.pythonhosted.org/packages/72/7a/a9ba7f98c7a575978698f4230c5e8cc54bbc761af34f560818f933dafa0c/ruff-0.15.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:9cae0f92bd5700d1213188b31cd3bdd2b315361296d10b96b8e2337d3d11f53e", size = 11447765, upload-time = "2026-04-24T18:17:09.755Z" }, - { url = "https://files.pythonhosted.org/packages/ea/f9/0ae446942c846b8266059ad8a30702a35afae55f5cdc54c5adf8d7afdc27/ruff-0.15.12-py3-none-win32.whl", hash = "sha256:d0185894e038d7043ba8fd6aee7499ece6462dc0ea9f1e260c7451807c714c20", size = 10657277, upload-time = "2026-04-24T18:17:18.591Z" }, - { url = "https://files.pythonhosted.org/packages/33/f1/9614e03e1cdcbf9437570b5400ced8a720b5db22b28d8e0f1bda429f660d/ruff-0.15.12-py3-none-win_amd64.whl", hash = "sha256:c87a162d61ab3adca47c03f7f717c68672edec7d1b5499e652331780fe74950d", size = 11837758, upload-time = "2026-04-24T18:17:00.113Z" }, - { url = "https://files.pythonhosted.org/packages/c0/98/6beb4b351e472e5f4c4613f7c35a5290b8be2497e183825310c4c3a3984b/ruff-0.15.12-py3-none-win_arm64.whl", hash = "sha256:a538f7a82d061cee7be55542aca1d86d1393d55d81d4fcc314370f4340930d4f", size = 11120821, upload-time = "2026-04-24T18:16:57.979Z" }, +version = "0.16.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/61/b3/3213589383f8f1b3938781bd1278713f6d18621a14992b3e81fefb8a5ef9/ruff-0.16.3.tar.gz", hash = "sha256:e76d33a347661a84b5be6d043d0347fdc745dfdcf825a8f4fed64b5e26eebdf2", size = 4891904, upload-time = "2026-08-13T15:17:13.381Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/96/493770daebd68c0a67f1549fdf519f53be51fc435186c0585bcc272fd76c/ruff-0.16.3-py3-none-linux_armv6l.whl", hash = "sha256:0c5710e247a58a4521e66e124ba9a74655b414f61ba3a2e9e3811e11098f48f7", size = 10902799, upload-time = "2026-08-13T15:16:27.382Z" }, + { url = "https://files.pythonhosted.org/packages/5e/e6/2becf3942fddc29a29b8df47691d456fb1085391a694f74d84513251418c/ruff-0.16.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:fe155130631a2471fd2e14a7a664a4dfbd7194b8229c3d7b2a40b21178639081", size = 11135539, upload-time = "2026-08-13T15:16:30.87Z" }, + { url = "https://files.pythonhosted.org/packages/3e/1e/4b8b72f0d006dbf19326aa99f9ca0ee2ff374187c4d301cf529a51aa06fe/ruff-0.16.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e2ed719e14aa64d895c2ee922594a90a43c861a93f0575a95ff8c47cdbd13eb9", size = 10475095, upload-time = "2026-08-13T15:16:33.259Z" }, + { url = "https://files.pythonhosted.org/packages/92/32/2201fa49ba1f6c101ee321e83f051ac7a4b8d07b0ef6b4d3f2772b302275/ruff-0.16.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e0b1da805eb043654645d74d5de1e5ce2edc686e40790d2b86f56d71cc06a84", size = 10668771, upload-time = "2026-08-13T15:16:35.65Z" }, + { url = "https://files.pythonhosted.org/packages/c3/66/4afc5c8363bd04d45effce1b7c8713ca037d7a6740b7451a2403a6e3a972/ruff-0.16.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a37bdea0bbe21780f590bf437d6412c8c4e1b6cd010f91a65c2c40c5e5f5f870", size = 10699568, upload-time = "2026-08-13T15:16:38.195Z" }, + { url = "https://files.pythonhosted.org/packages/53/fd/c67d246bf36bf1698551c56de39e95cd07f70e64433e0098e6267d77061b/ruff-0.16.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09571e6d1288ed9be475207a3ac04ada404f1cd898104be0f6ab8d7df438575b", size = 11499365, upload-time = "2026-08-13T15:16:40.623Z" }, + { url = "https://files.pythonhosted.org/packages/67/0b/00ecbceb99a263af7b12f6f05ac3c92bc47b905e91adc3f207a836e3bc01/ruff-0.16.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c18c5a101eb540010638cc1ff3c84944d3adb3df62b8d98ca8f22ba484d3413", size = 12311728, upload-time = "2026-08-13T15:16:43.564Z" }, + { url = "https://files.pythonhosted.org/packages/54/b2/b7b3bb54f4d3f7db504e476ad4ab8de530dceebe2c061384b2757ee419e8/ruff-0.16.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8457c44f15033c85ddbb77b15d451df9e24e4bd03b628396dd3610cedc3b8f82", size = 11699896, upload-time = "2026-08-13T15:16:46.209Z" }, + { url = "https://files.pythonhosted.org/packages/c7/30/4c468429ac195addc5ee1b717b6ab1b66632786737ca3b2ed3443fb0c26a/ruff-0.16.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:294b95c4ae0cda9388525c2047778aa758d6b8d4bb876fd4e9eaa3ebc92343eb", size = 11058736, upload-time = "2026-08-13T15:16:48.823Z" }, + { url = "https://files.pythonhosted.org/packages/43/67/7a113cdaddf24b64d7f75b1242a99d04c82fcef4f6921fdbb832beaffb5f/ruff-0.16.3-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:3d0c7c40c87c2a820509c31ba007968da6e1306468c067b2d82fbfdbcd0e8474", size = 11586911, upload-time = "2026-08-13T15:16:51.913Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c1/2e66f24c0f3ead25a5e660111778685e505e5da353c82802bf49f0cbe7b9/ruff-0.16.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:9f738c0fdfa8eed0b2ce7fb27ee7258208a92a68d7949e62aa15164bc7b389da", size = 10954265, upload-time = "2026-08-13T15:16:54.763Z" }, + { url = "https://files.pythonhosted.org/packages/c2/ba/4cee23bf52cba9a058d3726de623624daf50ef9638868edd86f4126157f6/ruff-0.16.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:fb785f0be25abe69d320415cd4f833b59e17ba7613d9ba6a958023b6bceb0a50", size = 10709886, upload-time = "2026-08-13T15:16:57.339Z" }, + { url = "https://files.pythonhosted.org/packages/82/df/7da7194fa5d9dc0a285f7e6fa5a4722e7c63faac0b45b614ded9314363a1/ruff-0.16.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c5536e3acfbf9563085aa2be7b13c629c3077e902afc5b941ac44024dbb9f506", size = 11210392, upload-time = "2026-08-13T15:17:00.171Z" }, + { url = "https://files.pythonhosted.org/packages/35/85/7795f6e817af050e7517bf3e7aa9b061cce70ef33d280aad902c956c1ecf/ruff-0.16.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a2d85c02f9b8e165d85e6779184d38c4132de12603dab59c51c28e22584f9e4d", size = 11626910, upload-time = "2026-08-13T15:17:03.299Z" }, + { url = "https://files.pythonhosted.org/packages/78/9b/475b927cf27a5cbbda3c7bafb69ed6ff77e1d7923d5d85f17c2749d7ae32/ruff-0.16.3-py3-none-win32.whl", hash = "sha256:388cdf2166642bd9b13d52b5932d3170f34f8abed7e8d9a855f1d84b83645a0a", size = 10931415, upload-time = "2026-08-13T15:17:05.726Z" }, + { url = "https://files.pythonhosted.org/packages/b2/99/e2a2bfc4fbf0a1e8a916bc9ebe6fe6c58cc34c28e0ffc6ce281d572d1c2e/ruff-0.16.3-py3-none-win_amd64.whl", hash = "sha256:e80a7d69ca2a6d1c4d352ec91458cdca6e56c83cdbcabd93e4abe1e53591d948", size = 11445993, upload-time = "2026-08-13T15:17:08.353Z" }, + { url = "https://files.pythonhosted.org/packages/69/3e/4132e539aed78c148854d4997a2685b0ed4dc4e87110b59ce528564e184e/ruff-0.16.3-py3-none-win_arm64.whl", hash = "sha256:b8ca152da82c1acc1fa8d5874b15951935f0eef46f10e6954c83859011b6178a", size = 11399302, upload-time = "2026-08-13T15:17:10.908Z" }, ] [[package]] @@ -4306,7 +4306,7 @@ resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214, upload-time = "2025-05-08T16:13:05.955Z" } wheels = [ @@ -4367,7 +4367,7 @@ resolution-markers = [ "python_full_version == '3.11.*' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } wheels = [ @@ -4446,7 +4446,7 @@ resolution-markers = [ "python_full_version >= '3.12' and python_full_version < '3.14' and sys_platform != 'emscripten' and sys_platform != 'win32'", ] dependencies = [ - { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" } }, ] sdist = { url = "https://files.pythonhosted.org/packages/a7/25/c2700dfaf6442b4effaa91af24ebce5dc9d31bb4a69706313aae70d72cd0/scipy-1.18.0.tar.gz", hash = "sha256:67b2ad2ad54c72ca6d04975a9b2df8c3638c34ddd5b28738e94fc2b57929d378", size = 30774447, upload-time = "2026-06-19T15:01:43.456Z" } wheels = [ @@ -4870,17 +4870,17 @@ wheels = [ [[package]] name = "typer" -version = "0.25.1" +version = "0.27.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-doc" }, - { name = "click" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "rich" }, { name = "shellingham" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e4/51/9aed62104cea109b820bbd6c14245af756112017d309da813ef107d42e7e/typer-0.25.1.tar.gz", hash = "sha256:9616eb8853a09ffeabab1698952f33c6f29ffdbceb4eaeecf571880e8d7664cc", size = 122276, upload-time = "2026-04-30T19:32:16.964Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/40/4a3db7990d1f62a53182aa96eaef57aeb2886a27f90a195bc66713565d31/typer-0.27.1.tar.gz", hash = "sha256:a79bef8469a79c45498e7b814ecf8d603cc7644e9acbd9e19cac0334240b18df", size = 203994, upload-time = "2026-08-03T14:41:03.438Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/f9/2b3ff4e56e5fa7debfaf9eb135d0da96f3e9a1d5b27222223c7296336e5f/typer-0.25.1-py3-none-any.whl", hash = "sha256:75caa44ed46a03fb2dab8808753ffacdbfea88495e74c85a28c5eefcf5f39c89", size = 58409, upload-time = "2026-04-30T19:32:18.271Z" }, + { url = "https://files.pythonhosted.org/packages/43/89/9518bc0c3929bee36b3a4a8e3daddd6e03f92f9961c66d4983b837160543/typer-0.27.1-py3-none-any.whl", hash = "sha256:53150287edd11baeb4e4722c8e394fcdf8181c0ae89485cba8d25c778d5edd56", size = 122874, upload-time = "2026-08-03T14:41:04.391Z" }, ] [[package]]