From 218c8bbf1edaad3c09139892c3a0f1a9930118c5 Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 11 Oct 2019 14:16:05 +0200 Subject: [PATCH] Add type hints for utils.message --- mypy.ini | 4 +++ qutebrowser/utils/message.py | 48 +++++++++++++++++++++++------------- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/mypy.ini b/mypy.ini index 13ed2c5ef..22f801354 100644 --- a/mypy.ini +++ b/mypy.ini @@ -137,3 +137,7 @@ disallow_incomplete_defs = True [mypy-qutebrowser.utils.log] disallow_untyped_defs = True disallow_incomplete_defs = True + +[mypy-qutebrowser.utils.message] +disallow_untyped_defs = True +disallow_incomplete_defs = True diff --git a/qutebrowser/utils/message.py b/qutebrowser/utils/message.py index 155547abd..40f2882d9 100644 --- a/qutebrowser/utils/message.py +++ b/qutebrowser/utils/message.py @@ -23,8 +23,9 @@ """Message singleton so we don't have to define unneeded signals.""" import traceback +import typing -from PyQt5.QtCore import pyqtSignal, QObject +from PyQt5.QtCore import pyqtSignal, QObject, QUrl from qutebrowser.utils import usertypes, log, utils @@ -82,11 +83,14 @@ def info(message: str, *, replace: bool = False) -> None: global_bridge.show(usertypes.MessageLevel.info, message, replace) -def _build_question(title, text=None, *, mode, default=None, abort_on=(), - url=None, option=None): +def _build_question(title: str, + text: str = None, *, + mode: usertypes.PromptMode, + default: typing.Union[None, bool, str] = None, + abort_on: typing.Iterable[pyqtSignal] = (), + url: QUrl = None, + option: str = None) -> usertypes.Question: """Common function for ask/ask_async.""" - if not isinstance(mode, usertypes.PromptMode): - raise TypeError("Mode {} is no PromptMode member!".format(mode)) question = usertypes.Question() question.title = title question.text = text @@ -106,7 +110,7 @@ def _build_question(title, text=None, *, mode, default=None, abort_on=(), return question -def ask(*args, **kwargs): +def ask(*args: typing.Any, **kwargs: typing.Any) -> typing.Any: """Ask a modular question in the statusbar (blocking). Args: @@ -128,7 +132,10 @@ def ask(*args, **kwargs): return answer -def ask_async(title, mode, handler, **kwargs): +def ask_async(title: str, + mode: usertypes.PromptMode, + handler: typing.Callable[[typing.Any], None], + **kwargs: typing.Any) -> None: """Ask an async question in the statusbar. Args: @@ -144,8 +151,10 @@ def ask_async(title, mode, handler, **kwargs): global_bridge.ask(question, blocking=False) -def confirm_async(*, yes_action, no_action=None, cancel_action=None, - **kwargs): +def confirm_async(*, yes_action: typing.Callable[[], None], + no_action: typing.Callable[[], None] = None, + cancel_action: typing.Callable[[], None] = None, + **kwargs: typing.Any) -> usertypes.Question: """Ask a yes/no question to the user and execute the given actions. Args: @@ -204,12 +213,15 @@ class GlobalMessageBridge(QObject): mode_left = pyqtSignal(usertypes.KeyMode) clear_messages = pyqtSignal() - def __init__(self, parent=None): + def __init__(self, parent: QObject = None) -> None: super().__init__(parent) self._connected = False - self._cache = [] + self._cache = [ + ] # type: typing.List[typing.Tuple[usertypes.MessageLevel, str, bool]] - def ask(self, question, blocking, *, log_stack=False): + def ask(self, question: usertypes.Question, + blocking: bool, *, + log_stack: bool = False) -> None: """Ask a question to the user. Note this method doesn't return the answer, it only blocks. The caller @@ -223,14 +235,16 @@ class GlobalMessageBridge(QObject): """ self.ask_question.emit(question, blocking) - def show(self, level, text, replace=False): + def show(self, level: usertypes.MessageLevel, + text: str, + replace: bool = False) -> None: """Show the given message.""" if self._connected: self.show_message.emit(level, text, replace) else: self._cache.append((level, text, replace)) - def flush(self): + def flush(self) -> None: """Flush messages which accumulated while no handler was connected. This is so we don't miss messages shown during some early init phase. @@ -256,10 +270,10 @@ class MessageBridge(QObject): s_set_text = pyqtSignal(str) s_maybe_reset_text = pyqtSignal(str) - def __repr__(self): + def __repr__(self) -> str: return utils.get_repr(self) - def set_text(self, text, *, log_stack=False): + def set_text(self, text: str, *, log_stack: bool = False) -> None: """Set the normal text of the statusbar. Args: @@ -270,7 +284,7 @@ class MessageBridge(QObject): log.message.debug(text) self.s_set_text.emit(text) - def maybe_reset_text(self, text, *, log_stack=False): + def maybe_reset_text(self, text: str, *, log_stack: bool = False) -> None: """Reset the text in the statusbar if it matches an expected text. Args: