From 41f374a6625fa773ce9440d1e0eef4d155e51f9c Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Thu, 29 Jun 2023 23:27:29 +0200 Subject: qt6 mypy: Fix lint --- qutebrowser/browser/network/pac.py | 2 +- .../browser/webengine/webenginequtescheme.py | 1 + qutebrowser/mainwindow/statusbar/bar.py | 1 - qutebrowser/misc/nativeeventfilter.py | 10 +-- qutebrowser/qt/_core_pyqtproperty.py | 73 ++++++++++++++++++++++ qutebrowser/qt/core.py | 64 +------------------ qutebrowser/utils/urlutils.py | 13 ++-- 7 files changed, 89 insertions(+), 75 deletions(-) create mode 100644 qutebrowser/qt/_core_pyqtproperty.py diff --git a/qutebrowser/browser/network/pac.py b/qutebrowser/browser/network/pac.py index 8a67850f5..7e24f5a49 100644 --- a/qutebrowser/browser/network/pac.py +++ b/qutebrowser/browser/network/pac.py @@ -215,7 +215,7 @@ class PACResolver: """ qtutils.ensure_valid(query.url()) - string_flags: urlutils.URL_FLAGS_T + string_flags: urlutils.UrlFlagsType if from_file: string_flags = QUrl.ComponentFormattingOption.PrettyDecoded else: diff --git a/qutebrowser/browser/webengine/webenginequtescheme.py b/qutebrowser/browser/webengine/webenginequtescheme.py index 205380484..63ff752fd 100644 --- a/qutebrowser/browser/webengine/webenginequtescheme.py +++ b/qutebrowser/browser/webengine/webenginequtescheme.py @@ -30,6 +30,7 @@ from qutebrowser.utils import log, qtutils # FIXME:mypy PyQt6-stubs issue? _QUTE = QByteArray(b'qute') # type: ignore[call-overload,unused-ignore] + class QuteSchemeHandler(QWebEngineUrlSchemeHandler): """Handle qute://* requests on QtWebEngine.""" diff --git a/qutebrowser/mainwindow/statusbar/bar.py b/qutebrowser/mainwindow/statusbar/bar.py index 92e77df2f..b9e1d7465 100644 --- a/qutebrowser/mainwindow/statusbar/bar.py +++ b/qutebrowser/mainwindow/statusbar/bar.py @@ -23,7 +23,6 @@ import enum import dataclasses from qutebrowser.qt.core import pyqtSignal, pyqtProperty, pyqtSlot, Qt, QSize, QTimer -from qutebrowser.qt.core import pyqtProperty from qutebrowser.qt.widgets import QWidget, QHBoxLayout, QStackedLayout, QSizePolicy from qutebrowser.browser import browsertab diff --git a/qutebrowser/misc/nativeeventfilter.py b/qutebrowser/misc/nativeeventfilter.py index dad22ef7d..963baeea7 100644 --- a/qutebrowser/misc/nativeeventfilter.py +++ b/qutebrowser/misc/nativeeventfilter.py @@ -106,9 +106,9 @@ class xcb_query_extension_reply_t(ctypes.Structure): # noqa: N801 if machinery.IS_QT6: - _POINTER_RET_T = sip.voidptr + _PointerRetType = sip.voidptr else: - _POINTER_RET_T = int + _PointerRetType = int class NativeEventFilter(QAbstractNativeEventFilter): @@ -119,8 +119,8 @@ class NativeEventFilter(QAbstractNativeEventFilter): # # Tuple because PyQt uses the second value as the *result out-pointer, which # according to the Qt documentation is only used on Windows. - _PASS_EVENT_RET = (False, cast(_POINTER_RET_T, 0)) - _FILTER_EVENT_RET = (True, cast(_POINTER_RET_T, 0)) + _PASS_EVENT_RET = (False, cast(_PointerRetType, 0)) + _FILTER_EVENT_RET = (True, cast(_PointerRetType, 0)) def __init__(self) -> None: super().__init__() @@ -153,7 +153,7 @@ class NativeEventFilter(QAbstractNativeEventFilter): def nativeEventFilter( self, evtype: Union[bytes, QByteArray], message: sip.voidptr - ) -> Tuple[bool, _POINTER_RET_T]: + ) -> Tuple[bool, _PointerRetType]: """Handle XCB events.""" # We're only installed when the platform plugin is xcb assert evtype == b"xcb_generic_event_t", evtype diff --git a/qutebrowser/qt/_core_pyqtproperty.py b/qutebrowser/qt/_core_pyqtproperty.py new file mode 100644 index 000000000..7f89b8e5b --- /dev/null +++ b/qutebrowser/qt/_core_pyqtproperty.py @@ -0,0 +1,73 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +""" +# FIXME:mypy PyQt6-stubs issue +# WORKAROUND for missing pyqtProperty typing, ported from PyQt5-stubs: +# https://github.com/python-qt-tools/PyQt5-stubs/blob/5.15.6.0/PyQt5-stubs/QtCore.pyi#L70-L111 +""" + +# flake8: noqa +# pylint: disable=invalid-name,undefined-variable,too-many-arguments,redefined-builtin,unused-argument + +import typing +from PyQt6.QtCore import QObjectT, pyqtSignal + +if typing.TYPE_CHECKING: + + TPropertyTypeVal = typing.TypeVar('TPropertyTypeVal') + + TPropGetter = typing.TypeVar('TPropGetter', bound=typing.Callable[[QObjectT], TPropertyTypeVal]) + TPropSetter = typing.TypeVar('TPropSetter', bound=typing.Callable[[QObjectT, TPropertyTypeVal], None]) + TPropDeleter = typing.TypeVar('TPropDeleter', bound=typing.Callable[[QObjectT], None]) + TPropResetter = typing.TypeVar('TPropResetter', bound=typing.Callable[[QObjectT], None]) + + class pyqtProperty: + def __init__( + self, + type: typing.Union[type, str], + fget: typing.Optional[ + typing.Callable[[QObjectT], TPropertyTypeVal] + ] = None, + fset: typing.Optional[ + typing.Callable[[QObjectT, TPropertyTypeVal], None] + ] = None, + freset: typing.Optional[typing.Callable[[QObjectT], None]] = None, + fdel: typing.Optional[typing.Callable[[QObjectT], None]] = None, + doc: typing.Optional[str] = "", + designable: bool = True, + scriptable: bool = True, + stored: bool = True, + user: bool = True, + constant: bool = True, + final: bool = True, + notify: typing.Optional[pyqtSignal] = None, + revision: int = 0, + ) -> None: + ... + + type: typing.Union[type, str] + fget: typing.Optional[typing.Callable[[], TPropertyTypeVal]] + fset: typing.Optional[typing.Callable[[TPropertyTypeVal], None]] + freset: typing.Optional[typing.Callable[[], None]] + fdel: typing.Optional[typing.Callable[[], None]] + + def read(self, func: TPropGetter) -> "pyqtProperty": + ... + + def write(self, func: TPropSetter) -> "pyqtProperty": + ... + + def reset(self, func: TPropResetter) -> "pyqtProperty": + ... + + def getter(self, func: TPropGetter) -> "pyqtProperty": + ... + + def setter(self, func: TPropSetter) -> "pyqtProperty": + ... + + def deleter(self, func: TPropDeleter) -> "pyqtProperty": + ... + + def __call__(self, func: TPropGetter) -> "pyqtProperty": + ... diff --git a/qutebrowser/qt/core.py b/qutebrowser/qt/core.py index 733b4bc9c..3349b3c17 100644 --- a/qutebrowser/qt/core.py +++ b/qutebrowser/qt/core.py @@ -26,68 +26,6 @@ elif machinery.USE_PYQT6: from PyQt6.QtCore import * if TYPE_CHECKING: - # FIXME:mypy PyQt6-stubs issue - # WORKAROUND for missing pyqtProperty typing, ported from PyQt5-stubs: - # https://github.com/python-qt-tools/PyQt5-stubs/blob/5.15.6.0/PyQt5-stubs/QtCore.pyi#L70-L111 - import typing - - TPropertyTypeVal = typing.TypeVar('TPropertyTypeVal') - - TPropGetter = typing.TypeVar('TPropGetter', bound=typing.Callable[[QObjectT], TPropertyTypeVal]) - TPropSetter = typing.TypeVar('TPropSetter', bound=typing.Callable[[QObjectT, TPropertyTypeVal], None]) - TPropDeleter = typing.TypeVar('TPropDeleter', bound=typing.Callable[[QObjectT], None]) - TPropResetter = typing.TypeVar('TPropResetter', bound=typing.Callable[[QObjectT], None]) - - class pyqtProperty: - def __init__( - self, - type: typing.Union[type, str], - fget: typing.Optional[ - typing.Callable[[QObjectT], TPropertyTypeVal] - ] = None, - fset: typing.Optional[ - typing.Callable[[QObjectT, TPropertyTypeVal], None] - ] = None, - freset: typing.Optional[typing.Callable[[QObjectT], None]] = None, - fdel: typing.Optional[typing.Callable[[QObjectT], None]] = None, - doc: typing.Optional[str] = "", - designable: bool = True, - scriptable: bool = True, - stored: bool = True, - user: bool = True, - constant: bool = True, - final: bool = True, - notify: typing.Optional[pyqtSignal] = None, - revision: int = 0, - ) -> None: - ... - - type: typing.Union[type, str] - fget: typing.Optional[typing.Callable[[], TPropertyTypeVal]] - fset: typing.Optional[typing.Callable[[TPropertyTypeVal], None]] - freset: typing.Optional[typing.Callable[[], None]] - fdel: typing.Optional[typing.Callable[[], None]] - - def read(self, func: TPropGetter) -> "pyqtProperty": - ... - - def write(self, func: TPropSetter) -> "pyqtProperty": - ... - - def reset(self, func: TPropResetter) -> "pyqtProperty": - ... - - def getter(self, func: TPropGetter) -> "pyqtProperty": - ... - - def setter(self, func: TPropSetter) -> "pyqtProperty": - ... - - def deleter(self, func: TPropDeleter) -> "pyqtProperty": - ... - - def __call__(self, func: TPropGetter) -> "pyqtProperty": - ... - + from qutebrowser.qt._core_pyqtproperty import pyqtProperty else: raise machinery.UnknownWrapper() diff --git a/qutebrowser/utils/urlutils.py b/qutebrowser/utils/urlutils.py index e9abb104b..f9eada254 100644 --- a/qutebrowser/utils/urlutils.py +++ b/qutebrowser/utils/urlutils.py @@ -43,8 +43,11 @@ from qutebrowser.browser.network import pac if machinery.IS_QT6: - URL_FLAGS_T = Union[QUrl.UrlFormattingOption, QUrl.ComponentFormattingOption] + UrlFlagsType = Union[QUrl.UrlFormattingOption, QUrl.ComponentFormattingOption] + class FormatOption: + """Simple wrapper around Qt enums to fix typing problems on Qt 5.""" + ENCODED = QUrl.ComponentFormattingOption.FullyEncoded ENCODE_UNICODE = QUrl.ComponentFormattingOption.EncodeUnicode DECODE_RESERVED = QUrl.ComponentFormattingOption.DecodeReserved @@ -52,7 +55,7 @@ if machinery.IS_QT6: REMOVE_SCHEME = QUrl.UrlFormattingOption.RemoveScheme REMOVE_PASSWORD = QUrl.UrlFormattingOption.RemovePassword else: - URL_FLAGS_T = Union[ + UrlFlagsType = Union[ QUrl.FormattingOptions, QUrl.UrlFormattingOption, QUrl.ComponentFormattingOption, @@ -64,7 +67,8 @@ else: Teach mypy that | works for QUrl.FormattingOptions. """ - def __or__(self, f: URL_FLAGS_T) -> '_QtFormattingOptions': + + def __or__(self, f: UrlFlagsType) -> '_QtFormattingOptions': return super() | f # type: ignore[operator,return-value] class FormatOption: @@ -73,6 +77,7 @@ else: Pretend that all ComponentFormattingOption values are also valid QUrl.FormattingOptions values, i.e. can be passed to QUrl.toString(). """ + ENCODED = cast( _QtFormattingOptions, QUrl.ComponentFormattingOption.FullyEncoded) ENCODE_UNICODE = cast( @@ -86,8 +91,6 @@ else: _QtFormattingOptions, QUrl.UrlFormattingOption.RemovePassword) - - # URL schemes supported by QtWebEngine WEBENGINE_SCHEMES = [ 'about', -- cgit v1.2.3-54-g00ecf