diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 046c94550..18a834664 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,17 +5,17 @@ ci: repos: - repo: https://github.com/abravalheri/validate-pyproject - rev: v0.23 + rev: v0.24.1 hooks: - id: validate-pyproject - repo: https://github.com/crate-ci/typos - rev: v1.30.0 + rev: v1 hooks: - id: typos - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.9.9 + rev: v0.11.8 hooks: - id: ruff args: ["--fix", "--unsafe-fixes"] diff --git a/src/magicgui/schema/_ui_field.py b/src/magicgui/schema/_ui_field.py index a14c5abdd..40039a18b 100644 --- a/src/magicgui/schema/_ui_field.py +++ b/src/magicgui/schema/_ui_field.py @@ -828,7 +828,7 @@ def _get_values(obj: Any) -> dict | None: # named tuple if isinstance(obj, tuple) and hasattr(obj, "_asdict"): - return cast(dict, obj._asdict()) + return cast("dict", obj._asdict()) # dataclass if dc.is_dataclass(type(obj)): @@ -837,13 +837,13 @@ def _get_values(obj: Any) -> dict | None: # attrs attr = sys.modules.get("attr") if attr is not None and attr.has(obj): - return cast(dict, attr.asdict(obj)) + return cast("dict", attr.asdict(obj)) # pydantic models if hasattr(obj, "model_dump"): - return cast(dict, obj.model_dump()) + return cast("dict", obj.model_dump()) elif hasattr(obj, "dict"): - return cast(dict, obj.dict()) + return cast("dict", obj.dict()) return None diff --git a/src/magicgui/signature.py b/src/magicgui/signature.py index 573b5ca52..d67ed6ae3 100644 --- a/src/magicgui/signature.py +++ b/src/magicgui/signature.py @@ -17,7 +17,6 @@ import inspect import typing import warnings -from collections.abc import Sequence from types import MappingProxyType from typing import TYPE_CHECKING, Annotated, Any, Callable, cast @@ -26,6 +25,8 @@ from magicgui.types import Undefined if TYPE_CHECKING: + from collections.abc import Sequence + from typing_extensions import Unpack from magicgui.application import AppRef @@ -173,7 +174,7 @@ def __init__( @property def options(self) -> dict: """Return just this options part of the annotation.""" - return cast(dict, get_args(self.annotation)[1]) + return cast("dict", get_args(self.annotation)[1]) def __repr__(self) -> str: """Return __repr__, replacing NoneType if present.""" @@ -334,7 +335,7 @@ def replace( # type: ignore[override] return_annotation = self.return_annotation return type(self)( - cast(Sequence[inspect.Parameter], parameters), + cast("Sequence[inspect.Parameter]", parameters), return_annotation=return_annotation, ) diff --git a/src/magicgui/tqdm.py b/src/magicgui/tqdm.py index 8cddf1173..55bf49c37 100644 --- a/src/magicgui/tqdm.py +++ b/src/magicgui/tqdm.py @@ -148,7 +148,7 @@ def close(self) -> None: if not self._in_visible_gui: super().close() return - self._mgui = cast(FunctionGui, self._mgui) + self._mgui = cast("FunctionGui", self._mgui) if self.disable: return diff --git a/src/magicgui/type_map/_type_map.py b/src/magicgui/type_map/_type_map.py index 8f62f0eb2..a01e4ce43 100644 --- a/src/magicgui/type_map/_type_map.py +++ b/src/magicgui/type_map/_type_map.py @@ -1013,7 +1013,7 @@ def _register_widget( widget_type: WidgetRef | None = None, **options: Any, ) -> WidgetTuple | None: - _options = cast(dict, options) + _options = cast("dict", options) previous_widget = self._type_defs.get(resolved_type) @@ -1074,7 +1074,9 @@ def inner_func(func: Callable) -> widgets.FunctionGui | MagicFactory: ) # MagicFactory is unnecessary if we are immediately instantiating the # widget, so we shortcut that and just return the FunctionGui here. - return cast(widgets.FunctionGui, magic_class(func, type_map=self, **kwargs)) + return cast( + "widgets.FunctionGui", magic_class(func, type_map=self, **kwargs) + ) return inner_func if function is None else inner_func(function) @@ -1160,7 +1162,7 @@ def _import_wdg_class(class_name: str) -> WidgetClass: mod_name, name = class_name.rsplit(".", 1) mod = importlib.import_module(mod_name) - return cast(WidgetClass, getattr(mod, name)) + return cast("WidgetClass", getattr(mod, name)) def _validate_return_callback(func: Callable) -> None: @@ -1176,4 +1178,4 @@ def _generate_union_variants(type_: Any) -> Iterator[type]: type_args = get_args(type_) for i in range(2, len(type_args) + 1): for per in itertools.combinations(type_args, i): - yield cast(type, Union[per]) + yield cast("type", Union[per]) diff --git a/src/magicgui/widgets/_concrete.py b/src/magicgui/widgets/_concrete.py index d9d7b066f..75fdda825 100644 --- a/src/magicgui/widgets/_concrete.py +++ b/src/magicgui/widgets/_concrete.py @@ -745,7 +745,7 @@ def _append_value(self, value: _V | _Undefined = Undefined) -> None: name=f"value_{i}", options=self._child_options, ) - widget = _ListEditChildWidget(cast(BaseValueWidget, _value_widget)) + widget = _ListEditChildWidget(cast("BaseValueWidget", _value_widget)) # connect the minus-button-clicked event def _remove_me() -> None: @@ -844,7 +844,7 @@ def __setitem__(self, key: slice, value: _V | Iterable[_V]) -> None: ... def __setitem__(self, key: int | slice, value: _V | Iterable[_V]) -> None: """Update widget value.""" if isinstance(key, int): - self._obj._get_child_widget(key).value = cast(_V, value) + self._obj._get_child_widget(key).value = cast("_V", value) elif isinstance(key, slice): with self._obj.changed.blocked(): if isinstance(value, type(self._obj._get_child_widget(0).value)): @@ -926,7 +926,7 @@ def __init__( for a in _value: i = len(self) widget = cast( - BaseValueWidget, + "BaseValueWidget", create_widget( value=a, annotation=self._args_types[i], diff --git a/src/magicgui/widgets/_function_gui.py b/src/magicgui/widgets/_function_gui.py index 55279b325..12b59d26e 100644 --- a/src/magicgui/widgets/_function_gui.py +++ b/src/magicgui/widgets/_function_gui.py @@ -25,7 +25,6 @@ from magicgui._type_resolution import resolve_single_type from magicgui.signature import MagicSignature, magic_signature from magicgui.widgets import Container, MainWindow, ProgressBar, PushButton -from magicgui.widgets.bases import BaseValueWidget if TYPE_CHECKING: from collections.abc import Iterator @@ -36,6 +35,7 @@ from magicgui.application import Application, AppRef # noqa: F401 from magicgui.type_map import TypeMap from magicgui.widgets import TextEdit + from magicgui.widgets.bases import BaseValueWidget from magicgui.widgets.protocols import ContainerProtocol, MainWindowProtocol _P = ParamSpec("_P") @@ -229,7 +229,7 @@ def __init__( @self._call_button.changed.connect def _disable_button_and_call() -> None: # disable the call button until the function has finished - self._call_button = cast(PushButton, self._call_button) + self._call_button = cast("PushButton", self._call_button) self._call_button.enabled = False try: self.__call__() # type: ignore [call-arg] @@ -241,7 +241,7 @@ def _disable_button_and_call() -> None: self._result_widget: BaseValueWidget | None = None if result_widget: self._result_widget = cast( - BaseValueWidget, + "BaseValueWidget", type_map.create_widget( value=None, annotation=self._return_annotation, diff --git a/src/magicgui/widgets/_table.py b/src/magicgui/widgets/_table.py index 98c0f1c48..f4ee76d13 100644 --- a/src/magicgui/widgets/_table.py +++ b/src/magicgui/widgets/_table.py @@ -364,7 +364,7 @@ def shape(self) -> tuple[int, int]: @property def size(self) -> int: """Return shape of table widget (rows, cols).""" - return cast(int, operator.mul(*self.shape)) + return cast("int", operator.mul(*self.shape)) def keys(self, axis: str = "column") -> HeadersView[TblKey]: """Return a set-like object providing a view on this table's headers.""" diff --git a/src/magicgui/widgets/bases/_categorical_widget.py b/src/magicgui/widgets/bases/_categorical_widget.py index ff39d8a0e..f671b2e2e 100644 --- a/src/magicgui/widgets/bases/_categorical_widget.py +++ b/src/magicgui/widgets/bases/_categorical_widget.py @@ -108,7 +108,7 @@ def __len__(self) -> int: def get_choice(self, choice_name: str) -> T: """Get data for the provided ``choice_name``.""" - return cast(T, self._widget._mgui_get_choice(choice_name)) + return cast("T", self._widget._mgui_get_choice(choice_name)) def set_choice(self, choice_name: str, data: Any | None = None) -> None: """Set data for the provided ``choice_name``.""" diff --git a/src/magicgui/widgets/bases/_container_widget.py b/src/magicgui/widgets/bases/_container_widget.py index 9415b2ede..9a2ebc31f 100644 --- a/src/magicgui/widgets/bases/_container_widget.py +++ b/src/magicgui/widgets/bases/_container_widget.py @@ -265,7 +265,7 @@ def __init__( **base_widget_kwargs, ) if value is not Undefined: - self.value = cast(T, value) + self.value = cast("T", value) if self._bound_value is not Undefined and "visible" not in base_widget_kwargs: self.hide() diff --git a/src/magicgui/widgets/bases/_ranged_widget.py b/src/magicgui/widgets/bases/_ranged_widget.py index 2e419d267..de48f59c0 100644 --- a/src/magicgui/widgets/bases/_ranged_widget.py +++ b/src/magicgui/widgets/bases/_ranged_widget.py @@ -73,7 +73,7 @@ def __init__( self.step = None self._widget._mgui_set_step(1) else: - self.step = cast(float, step) + self.step = cast("float", step) self.min, self.max = self._init_range(value, min, max) if value is not None and not isinstance(value, _Undefined): diff --git a/src/magicgui/widgets/bases/_value_widget.py b/src/magicgui/widgets/bases/_value_widget.py index b143ae87e..31fa91bf3 100644 --- a/src/magicgui/widgets/bases/_value_widget.py +++ b/src/magicgui/widgets/bases/_value_widget.py @@ -58,7 +58,7 @@ def __init__( self._call_bound: bool = True super().__init__(**base_widget_kwargs) if value is not Undefined: - self.value = cast(T, value) + self.value = cast("T", value) if self._bound_value is not Undefined and "visible" not in base_widget_kwargs: self.hide() @@ -95,7 +95,7 @@ def value(self) -> T: "access `widget.value` in your bound callback, use " "`widget.get_value()`" ) from e - return cast(T, self._bound_value) + return cast("T", self._bound_value) return self.get_value() @value.setter @@ -200,7 +200,7 @@ def get_value(self) -> T: an escape hatch if trying to access the widget's value inside of a callback bound to self._bound_value. """ - return cast(T, self._widget._mgui_get_value()) + return cast("T", self._widget._mgui_get_value()) def set_value(self, value: Any) -> None: self._widget._mgui_set_value(value)