From 0c4026daf8bc0d3c542b484b2f63007450396fc7 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 10 Nov 2026 10:02:41 +0900 Subject: [PATCH] chore: clear typehinting errors --- dzgui/api/acf.py | 3 ++- dzgui/api/servers.py | 10 ++++++---- dzgui/controllers/mc.py | 6 +++--- dzgui/managers/filter.py | 5 ++--- dzgui/model/proxy_model.py | 10 +++------- dzgui/util/format.py | 3 ++- dzgui/views/components/buttons.py | 14 ++++---------- dzgui/views/components/connect_panel.py | 2 +- dzgui/views/components/entry.py | 9 ++++----- dzgui/views/components/filter_panel.py | 4 ++-- dzgui/views/dialogs/boot.py | 2 +- dzgui/views/dialogs/generic.py | 2 +- dzgui/views/mixins/context_mixin.py | 6 ++---- 13 files changed, 33 insertions(+), 43 deletions(-) diff --git a/dzgui/api/acf.py b/dzgui/api/acf.py index ba36ce0..4b1dc71 100644 --- a/dzgui/api/acf.py +++ b/dzgui/api/acf.py @@ -111,7 +111,8 @@ class WorkshopACF(ACF): def __init__(self, file: Path) -> None: super().__init__(file) - def unpack(self, d: dict[str, str], lines: list[Any] = []) -> str: + def unpack(self, d: dict[str, Any], lines: list[Any] = []) -> str: + self.indent: int t1 = "AppWorkshop" t2 = ("WorkshopItemsInstalled", "WorkshopItemDetails") for k, v in d.items(): diff --git a/dzgui/api/servers.py b/dzgui/api/servers.py index 8c331e4..6ac446b 100644 --- a/dzgui/api/servers.py +++ b/dzgui/api/servers.py @@ -111,7 +111,7 @@ def get_netmask() -> str: # TODO: rename -def test_ip(suffix: int, port: int, event: threading.Event) -> dict | None: +def test_ip(suffix: int, port: int, event: threading.Event) -> dict[str, Any] | None: if event.is_set(): return None netmask = get_netmask() @@ -139,7 +139,9 @@ def sanitize(name: str) -> str: return name -def parse_json(json: list) -> list: +def parse_json( + json: list[dict[str, Any]], +) -> list[tuple[str, str, str, str, int, int, int, str, int, int, str, bool]]: """ Server metadata is underspecified and server operators tend to insert random garbage in the headers. In case @@ -507,14 +509,14 @@ def record_to_fqip(record: Record) -> str: return f"{record.ip}:{record.gameport}:{record.qport}" -def response_to_fqip(res: dict) -> str: +def response_to_fqip(res: dict[str, Any]) -> str: ip = res["addr"].split(":")[0] gameport = res["gameport"] qport = res["addr"].split(":")[1] return f"{ip}:{gameport}:{qport}" -def response_to_record(res: dict) -> Record: +def response_to_record(res: dict[str, Any]) -> Record: ip = res["addr"].split(":")[0] gameport = res["gameport"] qport = res["addr"].split(":")[1] diff --git a/dzgui/controllers/mc.py b/dzgui/controllers/mc.py index db656ec..6074046 100644 --- a/dzgui/controllers/mc.py +++ b/dzgui/controllers/mc.py @@ -77,7 +77,7 @@ class AppNavigation: class Controller(GObject.GObject): def __init__(self) -> None: - self.dist_cache: dict[str, "Haversine"] = {} + self.dist_cache: dict[str, "Haversine" | None] = {} self.mediator = AppNavigation() self.prefs: UserPrefs @@ -355,10 +355,10 @@ class Controller(GObject.GObject): filter_man.set_filter(filt, state) self.mediator.filters.set_filters(filters) - def get_dist_cache(self) -> dict[str, "Haversine"]: + def get_dist_cache(self) -> dict[str, Union["Haversine", None]]: return self.dist_cache - def set_dist_cache(self, addr: str, haversine: "Haversine") -> None: + def set_dist_cache(self, addr: str, haversine: Union["Haversine", None]) -> None: self.dist_cache[addr] = haversine def get_map_store(self) -> Gtk.ListStore: diff --git a/dzgui/managers/filter.py b/dzgui/managers/filter.py index f3f175c..357318f 100644 --- a/dzgui/managers/filter.py +++ b/dzgui/managers/filter.py @@ -51,7 +51,6 @@ class FilterManager: self.active_map = (0, all_maps) self.prior_map = all_maps - self.filters: list self.enabled_filters = dict(self.default_filters) def get_tooltips(self) -> dict[str, str]: @@ -75,7 +74,7 @@ class FilterManager: def set_active_keyword(self, word: str) -> None: self.active_keyword = word - def get_default_filters(self) -> dict: + def get_default_filters(self) -> dict[str, bool]: """Deep copy of defaults""" return dict(self.default_filters) @@ -116,7 +115,7 @@ class FilterManager: def get_unique_maps(self) -> list[str]: return [row[0] for row in self.map_store if row[0] != "All maps"] - def get_all_filters(self) -> tuple: + def get_all_filters(self) -> tuple[str, ...]: map_name = self.get_active_map_name() enabled = self.get_filters() kw = self.get_active_keyword() diff --git a/dzgui/model/proxy_model.py b/dzgui/model/proxy_model.py index c5ebc66..023da66 100644 --- a/dzgui/model/proxy_model.py +++ b/dzgui/model/proxy_model.py @@ -47,7 +47,7 @@ class ProxyModelManager: def __init__(self, filter_man: "FilterManager") -> None: self.filter_cache: dict[ - tuple[str], + tuple[str, ...], list[tuple[str, str, str, str, int, int, int, str, int, int, str, bool]], ] = {} @@ -68,9 +68,6 @@ class ProxyModelManager: return False return True - def append_row(self, row: list) -> None: - self.proxy_model.append(row) - def append_row_to_control( self, row: tuple[str, str, str, str, int, int, int, str, int, int, str, bool] ) -> None: @@ -84,7 +81,6 @@ class ProxyModelManager: self.proxy_model[treeiter][4] = playercount.players self.proxy_model[treeiter][6] = playercount.queue - # TODO: use dataclass for record rows def append_row_to_history( self, history: tuple[str, str, str, str, int, int, int, str, int, int, str, bool], @@ -264,7 +260,7 @@ class ProxyModelManager: rows = [row for row in rows if row[11]] return rows - def filter_toggle_on(self, filters: tuple[str]) -> list: + def filter_toggle_on(self, filters: tuple[str, ...]) -> list: """Effectively applies all filters""" self.set_filtered(self.control_model) self.set_filtered(self.filter_map(filters)) @@ -275,7 +271,7 @@ class ProxyModelManager: self.set_filtered(self.filter_toggle_off(filters, f)) return self.filtered - def set_cache(self, filters: tuple[str], filtered_rows: list[tuple]) -> None: + def set_cache(self, filters: tuple[str, ...], filtered_rows: list[tuple]) -> None: self.filter_cache[filters] = filtered_rows def set_filtered(self, rows: list | None) -> None: diff --git a/dzgui/util/format.py b/dzgui/util/format.py index e7b4d07..203ab3f 100644 --- a/dzgui/util/format.py +++ b/dzgui/util/format.py @@ -1,4 +1,5 @@ import re +from typing import Any from dzgui.util.localize import number from dzgui.strings.generic import selectable_tree @@ -60,7 +61,7 @@ def format_server_mods(mods: int) -> str: return f"Found {mods:n} {plural}. {workshop}" -def format_player_count(model: Gtk.TreeModel | None, control: list) -> str: +def format_player_count(model: Gtk.TreeModel | None, control: list[Any]) -> str: players = 0 hits: int status: str diff --git a/dzgui/views/components/buttons.py b/dzgui/views/components/buttons.py index ac480be..cd150c7 100644 --- a/dzgui/views/components/buttons.py +++ b/dzgui/views/components/buttons.py @@ -1,10 +1,8 @@ from typing import Callable, Literal, Self, TYPE_CHECKING, Union from dzgui.util.clip import copy_clipboard -from dzgui.util.format import pluralize from dzgui.strings import buttons from dzgui.util.strings import ( - alert_button_tooltip, atomic_buttons, ) from dzgui.const.constants import ( @@ -14,7 +12,6 @@ from dzgui.const.constants import ( LIST_ADD, REFRESH_ICON, STEAM_ICON, - WARNING, WEB_BROWSER, ) from dzgui.strings import connect_panel @@ -101,15 +98,14 @@ class LargeIconTextButton(IconButton): class ClipboardButton(IconTextButton): - def __init__(self, controller: Union["Controller", None], func: Callable) -> None: + def __init__(self, func: Callable[[], str]) -> None: super().__init__(CLIPBOARD, atomic_buttons.copy) - self.controller = controller self.connect("clicked", self._on_button_clicked, func) # TODO: strings self.set_tooltip_text("Copy to clipboard") - def _on_button_clicked(self, button: Self, func: Callable) -> None: + def _on_button_clicked(self, button: Self, func: Callable[[], str]) -> None: def revert() -> Literal[False]: self.revert_icon() return False @@ -120,10 +116,9 @@ class ClipboardButton(IconTextButton): GLib.timeout_add(600, revert) -# TODO: determine when controller would be passed to this button or drop class CopyIpButton(ClipboardButton): - def __init__(self, controller: Union["Controller", None], func: Callable) -> None: - super().__init__(controller, func) + def __init__(self, func: Callable[[], str]) -> None: + super().__init__(func) # TODO: strings self.set_tooltip_text("Copy IP to clipboard") @@ -252,7 +247,6 @@ class AddButton(IconTextButton): self.set_tooltip_text(connect_panel.add_tooltip) - class SpinnerButton(Gtk.Button): def __init__(self, label: str) -> None: super().__init__() diff --git a/dzgui/views/components/connect_panel.py b/dzgui/views/components/connect_panel.py index 17d0a71..0f91f84 100644 --- a/dzgui/views/components/connect_panel.py +++ b/dzgui/views/components/connect_panel.py @@ -187,7 +187,7 @@ class FavPanel(Gtk.Frame): self.fav_button = SteamConnectButton() self.fav_button.connect("clicked", self._on_connect_clicked) - self.copy_button = CopyIpButton(self.controller, self.get_fav_ip) + self.copy_button = CopyIpButton(self.get_fav_ip) # TODO: strings self.unset_button = CloseButton("Unset") diff --git a/dzgui/views/components/entry.py b/dzgui/views/components/entry.py index e1b3e7e..408ead8 100644 --- a/dzgui/views/components/entry.py +++ b/dzgui/views/components/entry.py @@ -38,7 +38,7 @@ class ValidatedEntry(Gtk.Entry): def __init__( self, controller: "Controller", - func: Callable, + func: Callable[[str], bool], placeholder_text: str = "", tooltip_text: str = "", ) -> None: @@ -46,7 +46,6 @@ class ValidatedEntry(Gtk.Entry): hexpand=True, placeholder_text=placeholder_text, tooltip_text=tooltip_text ) - self.func: Callable self.set_validation_func(func) self.controller = controller @@ -72,7 +71,7 @@ class ValidatedEntry(Gtk.Entry): self.emit("string_validated", False) remove_class(self, self.classname) - def set_validation_func(self, func: Callable) -> None: + def set_validation_func(self, func: Callable[[str], bool]) -> None: self.func = func def insert_icon(self) -> None: @@ -141,7 +140,7 @@ class APIEntry(Gtk.Box): def __init__(self) -> None: super().__init__(orientation=Gtk.Orientation.HORIZONTAL, spacing=10) - self.func: Callable | None = None + self.func: Callable[[str], None] | None = None # TODO: strings self.entry = Gtk.Entry( @@ -222,7 +221,7 @@ class APIEntry(Gtk.Box): res = self.func(text) return res - def set_validation_func(self, func: Callable | None) -> None: + def set_validation_func(self, func: Callable[[str], None] | None) -> None: self.func = func def disable_button(self) -> None: diff --git a/dzgui/views/components/filter_panel.py b/dzgui/views/components/filter_panel.py index 59c0e46..2fa69a5 100644 --- a/dzgui/views/components/filter_panel.py +++ b/dzgui/views/components/filter_panel.py @@ -30,7 +30,7 @@ class ButtonGrid(Gtk.Grid): def __init__( self, controller: "Controller", - defaults: dict[str, str], + defaults: dict[str, bool], tooltips: dict[str, str], ) -> None: super().__init__( @@ -96,7 +96,7 @@ class ButtonGrid(Gtk.Grid): logger.info(f"User toggled button '{label}' to {state}") self.emitter.emit("check_toggled", label, state) - def get_checkboxes(self) -> list: + def get_checkboxes(self) -> list[Gtk.CheckButton]: return self.checks diff --git a/dzgui/views/dialogs/boot.py b/dzgui/views/dialogs/boot.py index d4aa557..f3809a6 100644 --- a/dzgui/views/dialogs/boot.py +++ b/dzgui/views/dialogs/boot.py @@ -105,7 +105,7 @@ class BootDialog(ColorAwareApp, Gtk.Dialog): # type: ignore self.error_label = Gtk.Label(margin_start=15, margin_end=15) # TODO: abstract class - self.copy_button = ClipboardButton(None, lambda: self.error_label.get_text()) + self.copy_button = ClipboardButton(self.error_label.get_text) self.button_hbox = Gtk.Box( orientation=Gtk.Orientation.HORIZONTAL, halign=Gtk.Align.CENTER, spacing=10 ) diff --git a/dzgui/views/dialogs/generic.py b/dzgui/views/dialogs/generic.py index cff1e2a..08dc77b 100644 --- a/dzgui/views/dialogs/generic.py +++ b/dzgui/views/dialogs/generic.py @@ -187,7 +187,7 @@ class TextBufferDialog(GenericDialog): secondary=secondary, ) self.text = text - copy_button = ClipboardButton(controller, self.get_text) + copy_button = ClipboardButton(self.get_text) self.add_action_widget(copy_button, Gtk.ResponseType.NONE) self.add_button("OK", Gtk.ResponseType.OK) self.connect("response", self._on_response) diff --git a/dzgui/views/mixins/context_mixin.py b/dzgui/views/mixins/context_mixin.py index 5befa2c..2fd7ca1 100644 --- a/dzgui/views/mixins/context_mixin.py +++ b/dzgui/views/mixins/context_mixin.py @@ -15,9 +15,7 @@ logger = logging.getLogger(APP_NAME) class ContextMixin(TreeView): - def present_menu( - self, widget: Gtk.Widget, event: Gdk.Event - ) -> bool: + def present_menu(self, widget: Gtk.Widget, event: Gdk.Event) -> bool: if self.menu is None: return False @@ -26,7 +24,7 @@ class ContextMixin(TreeView): match event.type: case Gdk.EventType.BUTTON_PRESS: - if event.button != 3: + if event.button != Gdk.BUTTON_SECONDARY: # type: ignore[comparison-overlap] return False self._process_button_event(event) # type: ignore case Gdk.EventType.KEY_PRESS: