Add type hints for utils.message

This commit is contained in:
Florian Bruhin 2019-10-11 14:16:05 +02:00
parent 8164682f73
commit 218c8bbf1e
2 changed files with 35 additions and 17 deletions

View File

@ -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

View File

@ -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: