summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2022-04-26Update YAML C extension checkpy311Florian Bruhin
2022-04-25fixupFlorian Bruhin
2022-04-25Ignore certifi deprecation warningFlorian Bruhin
See https://github.com/certifi/python-certifi/issues/170
2022-04-25ci: Update Python versionsFlorian Bruhin
2022-04-25Update babel changelog URLFlorian Bruhin
2022-04-25Update dependenciesqutebrowser bot
2022-04-25Fix lintFlorian Bruhin
2022-04-25Skip astroid 2.11.3Florian Bruhin
See https://github.com/PyCQA/pylint/issues/6438#issuecomment-1108747642
2022-04-25mypy: Fix inspector typingFlorian Bruhin
The previous solution with making AbstractInspector know about the concrete inspector types results in Liskov issues for the backend-specific overrides: https://mypy.readthedocs.io/en/stable/common_issues.html#incompatible-overrides So, for now, let's just declare them as Any. Perhaps we should have a typing.Protocol to unify the two, as they don't share a common base class. See #7098.
2022-04-25mypy: Upgrade to PyQt5-stubs 5.15.6.0Florian Bruhin
For some unknown reason, those new stubs cause a *lot* of things now to be checked by mypy which formerly probably got skipped due to Any being implied somewhere. The stubs themselves mainly improved, with a couple of regressions too. In total, there were some 337 (!) new mypy errors. This commit fixes almost all of them, and the next commit improves a fix to get things down to 0 errors again. Overview of the changes: ==== qutebrowser/app.py - Drop type ignore due to improved stubs. ==== qutebrowser/browser/browsertab.py - Specify the type of _widget members more closely than just QWidget. This is debatable: I suppose the abstract stuff shouldn't need to know anything about the concrete backends at all. But it seems like we cut some corners when initially implementing things, and put some code in browsertab.py just because the APIs of both backends happened to be compatible. Perhaps something to reconsider once we drop QtWebKit and hopefully implement a dummy backend. - Add an additional assertion in AbstractAction.run_string. This is already covered by the isinstance(member, self.action_base) above it, but that's too dynamic for mypy to understand. - Fix the return type of AbstractScroller.pos_px, which is a QPoint (with x and y components), not a single int. - Fix the return type of AbstractScroller.pos_perc, which is a Tuple (with x and y components), not a single int. - Fix the argument types of AbstractScroller.to_perc, as it's possible to pass fractional percentages too. - Specify the type for AbstractHistoryPrivate._history. See above (_widget) re this being debatable. - Fix the return type of AbstractTabPrivate.event_target(), which can be None (see #3888). - Fix the return type of AbstractTabPrivate.run_js_sync, which is Any (the JS return value), not None. - Fix the argument type for AbstractTabPrivate.toggle_inspector: position can be None to use the last used position. - Declare the type of sub-objects of AbstractTab. - Fix the return value of AbstractTab.icon(), which is the QIcon, not None. ==== qutebrowser/browser/commands.py - Make sure the active window is a MainWindow (with a .win_id attribute). ==== qutebrowser/browser/downloadview.py - Add _model() which makes sure that self.model() is a DownloadModel, not None or any other model. This is needed because other methods access a variety of custom attributes on it, e.g. last_index(). ==== qutebrowser/browser/greasemonkey.py - Add an ignore for AbstractDownload.requested_url which we patch onto the downloads. Probably would be nicer to add it as a proper attribute which always gets set by the DownloadManager. ==== qutebrowser/browser/hints.py - Remove type ignores for QUrl.toString(). - Add a new type ignore for combining different URL flags (which works, but is not exactly type safe... still probably a regression in the stubs). - Make sure the things we get back from self._get_keyparser are what we actually expect. Probably should introduce a TypedDict (and/or overloads for _get_keyparser with typing.Literal) to teach mypy about the exact return value. See #7098. This is needed because we access Hint/NormalKeyParser-specific attributes such as .set_inhibited_timout() or .update_bindings(). ==== qutebrowser/browser/inspector.py - Similar changes than in browsertab.py to make some types where we share API (e.g. .setPage()) more concrete. Didn't work out unfortunately, see next commit. ==== qutebrowser/browser/network/pac.py - Remove now unneeded type ignore for signal. ==== qutebrowser/browser/qtnetworkdownloads.py - Make sure that downloads is a qtnetworkdownloads.DownloadItem (rather than an AbstractDownload), so that we can call ._uses_nam() on it. ==== qutebrowser/browser/qutescheme.py - Remove now unneeded type ignore for QUrl flags. ==== qutebrowser/browser/urlmarks.py - Specify the type of UrlMarkManager._lineparser, as those only get initialized in _init_lineparser of subclasses, so mypy doesn't know it's supposed to exist. ==== qutebrowser/browser/webelem.py - New casts to turn single KeyboardModifier (enum) entries into KeyboardModifiers (flags). Might not be needed anymore with Qt 6. - With that, casting the final value is now unneeded. ==== qutebrowser/browser/webengine/notification.py - Remove now unneeded type ignore for signal. - Make sure the self.sender() we get in HerbeNotificationAdapter._on_finished() is a QProcess, not just any QObject. ==== qutebrowser/browser/webengine/webenginedownloads.py - Remove now unneeded type ignores for signals. ==== qutebrowser/browser/webengine/webengineelem.py - Specify the type of WebEngineElement._tab. - Remove now unneeded type ignore for mixed flags. ==== qutebrowser/browser/webengine/webengineinspector.py - See changes to inspector.py and next commit. - Remove now unneeded type ignore for signal. ==== qutebrowser/browser/webengine/webenginequtescheme.py - Remove now unneeded type ignore for mixed flags. ==== qutebrowser/browser/webengine/webenginesettings.py - Ignore access of .setter attribute which we patch onto QWebEngineProfile. Would be nice to have a subclass or wrapper-class instead. ==== qutebrowser/browser/webengine/webenginetab.py - Specified the type of _widget members more closely than just QWidget. See browsertab.py changes for details. - Remove some now-unneeded type ignores for creating FindFlags. - Specify more concrete types for WebEngineTab members where we actually need to access WebEngine-specific attributes. - Make sure the page we get is our custom WebEnginePage subclass, not just any QWebEnginePage. This is needed because we access custom attributes on it. ==== qutebrowser/browser/webengine/webview.py - Make sure the page we get is our custom WebEnginePage subclass, not just any QWebEnginePage. This is needed because we access custom attributes on it. ==== qutebrowser/browser/webkit/network/networkreply.py - Remove now unneeded type ignores for signals. ==== qutebrowser/browser/webkit/webkitinspector.py - See changes to inspector.py and next commit. ==== qutebrowser/browser/webkit/webkittab.py - Specify the type of _widget members more closely than just QWidget. See browsertab.py changes for details. - Add a type ignore for WebKitAction because our workaround needs to treat them as ints (which is allowed by PyQt, even if not type-safe). - Add new ignores for findText calls: The text is a QString and can be None; the flags are valid despite mypy thinking they aren't (stubs regression?). - Specify the type for WebKitHistoryPrivate._history, because we access WebKit-specific attributes. See above (_widget) re this being debatable. - Make mypy aware that .currentFrame() and .frameAt() can return None (stubs regression?). - Make sure the .page() and .page().networkAccessManager() are our subclasses rather than the more generic QtWebKit objects, as we use custom attributes. - Add new type ignores for signals (stubs regression!) ==== qutebrowser/browser/webkit/webpage.py - Make sure the .networkAccessManager() is our subclass rather than the more generic QtWebKit object, as we use custom attributes. - Replace a cast by a type ignore. The cast didn't work anymore. ==== qutebrowser/browser/webkit/webview.py - Make sure the .page() is our subclass rather than the more generic QtWebKit object, as we use custom attributes. ==== qutebrowser/commands/userscripts.py - Remove now unneeded type ignore for signal. ==== qutebrowser/completion/completer.py - Add a new _completion() getter (which ensures it actually gets the completion view) rather than accessing the .parent() directly (which could be any QObject). ==== qutebrowser/completion/completiondelegate.py - Make sure self.parent() is a CompletionView (no helper method as there is only one instance). - Remove a now-unneeded type ignore for adding QSizes. ==== qutebrowser/completion/completionwidget.py - Add a ._model() getter which ensures that we get a CompletionModel (with custom attributes) rather than Qt's .model() which can be any QAbstractItemModel (or None). - Removed a now-unneeded type ignore for OR-ing flags. ==== qutebrowser/completion/models/completionmodel.py - Remove now unneeded type ignores for signals. - Ignore a complaint about .set_pattern() not being defined. Completion categories don't share any common parent class, so it would be good to introduce a typing.Protocol for this. See #7098. ==== qutebrowser/components/misccommands.py - Removed a now-unneeded type ignore for OR-ing flags. ==== qutebrowser/components/readlinecommands.py - Make sure QApplication.instance() is a QApplication (and not just a QCoreApplication). This includes the former "not None" check. ==== qutebrowser/components/scrollcommands.py - Add basic annotation for "funcs" dict. Could have a callable protocol to specify it needs a count kwarg, see #7098. ==== qutebrowser/config/stylesheet.py - Correctly specify that stylesheet apply to QWidgets, not any QObject. - Ignore an attr-defined for obj.STYLESHEET. Perhaps could somehow teach mypy about this with overloads and protocols (stylesheet for set_register being None => STYLESHEET needs to be defined, otherwise anything goes), but perhaps not worth the troble. See #7098. ==== qutebrowser/keyinput/keyutils.py - Remove some now-unneeded type ignores and add a cast for using a single enum value as flags. Might need to look at this again with Qt 6 support. ==== qutebrowser/keyinput/modeman.py - Add a FIXME for using a TypedDict, see comments for hints.py above. ==== qutebrowser/mainwindow/mainwindow.py - Remove now-unneeded type ignores for calling with OR-ed flags. - Improve where we cast from WindowType to WindowFlags, no int needed - Use new .tab_bar() getter, see below. ==== qutebrowser/mainwindow/prompt.py - Remove now-unneeded type ignores for calling with OR-ed flags. ==== qutebrowser/mainwindow/statusbar/bar.py - Adjust type ignores around @pyqtProperty. The fact one is still needed seems like a stub regression. ==== qutebrowser/mainwindow/statusbar/command.py - Fix type for setText() override (from QLineEdit): text can be None (QString in C++). ==== qutebrowser/mainwindow/statusbar/url.py - Adjust type ignores around @pyqtProperty. The fact one is still needed seems like a stub regression. ==== qutebrowser/mainwindow/tabbedbrowser.py - Specify that TabDeque manages browser tabs, not any QWidgets. It accesses AbstractTab-specific attributes. - Make sure that the .tabBar() we get is a tabwidget.TabBar, as we access .maybe_hide. - Fix the annotations for stored marks: Scroll positions are a QPoint, not int. - Add _current_tab() and _tab_by_idx() wrappers for .currentWidget() and .widget(), which ensures that the return values are valid AbstractTabs (or None for _tab_by_idx). This is needed because we access AbstractTab-specific attributes. - For some places, where the tab can be None, continue using .currentTab() but add asserts. - Remove some now-unneeded [unreachable] ignores, as mypy knows about the None possibility now. ==== qutebrowser/mainwindow/tabwidget.py - Add new tab_bar() and _tab_by_idx() helpers which check that the .tabBar() and .widget() are of type TabBar and AbstractTab, respectively. - Add additional assertions where we expect ._tab_by_idx() to never be None. - Remove dead code in get_tab_fields for handling a None y scroll position. I was unable to find any place in the code where this could be set to None. - Remove some now-unneeded type ignores and casts, as mypy now knows that _type_by_idx() could be None. - Work around a strange instance where mypy complains about not being able to find the type of TabBar.drag_in_progress from TabWidget._toggle_visibility, despite it clearly being shown as a bool *inside* that class without any annotation. - Add a ._tab_widget() getter in TabBar which ensures that the .parent() is in fact a TabWidget. ==== qutebrowser/misc/crashsignal.py - Remove now unneeded type ignores for signals. ==== qutebrowser/misc/editor.py - Remove now unneeded type ignores for signals. ==== qutebrowser/misc/ipc.py - Remove now unneeded type ignores for signals. - Add new type ignores for .error() which is both a signal and a getter (stub regression?). Won't be relevant for Qt 6 anymore, as the signal was renamed to errorOccurred in 5.15. ==== qutebrowser/misc/objects.py - Make sure mypy knows that objects.app is our custom Application (with custom attributes) rather than any QApplication. ==== qutebrowser/utils/objreg.py - Ignore attr-defined for .win_id attributes. Maybe could add a typing.Protocol, but ideally, the whole objreg stuff should die one day anyways. ==== tests/unit/completion/test_completer.py - Make CompletionWidgetStub inherit from CompletionView so that it passes the new isinstance() asserts in completer.py (see above).
2022-04-25Update docs/changelogJimmy
2022-04-25Merge pull request #7123 from pylbrecht/bitwarden-userscript-url-matchingJimmy
Fix qute-bitwarden userscript URL matching for multi level subdomains The qute-bitwarden userscript is not able to autofill for a multi-level subdomain URLs (e.g. `http://my.sub.domain.local/`). qute-bitwarden exits with status code 2 and returns the following on stderr: ``` No pass candidates for URL 'http://my.sub.domain.local/' found! ``` Joining the extracted subdomain and domain with a `.` solves the issue.
2022-04-22coverage: Show contexts by defaultFlorian Bruhin
We don't pass --cov-context=test by default though, as it slows dowh the test run by 2.5min and results in a 325 MB htmlcov/
2022-04-19Workaround PyInstaller 5.0 icon findingFlorian Bruhin
See https://github.com/pyinstaller/pyinstaller/issues/6759 Fixes #7132, see #7129
2022-04-19Revert "Avoid PyInstaller 5.0"Florian Bruhin
This reverts commit d98314799ae541cbda3eaec637638e6282bced5e.
2022-04-19Avoid PyInstaller 5.0Florian Bruhin
See https://github.com/pyinstaller/pyinstaller/issues/6759 Follow-up to #7129
2022-04-19Merge pull request #7129 from qutebrowser/update-dependenciestoofar
Update dependencies
2022-04-18add ply changelogJimmy
Although this is just the version published to pypi. I don't know what version sip is using. The version published on pypi is apparently stable and mature and any further changes on github are simplifications that the author doesn't particularly want to support. I don't know if we actually hit the parsing code in our workflows but it is published as a dependancy. The latest version talks about removing optional stuff from the API a bunch. But sip just uses `from ply import lex, yacc` so hopefully that is a stable part of the API. Even if sip is using the newer one.
2022-04-18Update dependenciesqutebrowser bot
2022-04-14doc: Adjust some PyQt5 referencesFlorian Bruhin
2022-04-13Fix lintFlorian Bruhin
2022-04-13Use QFontMetrics::boundingRect()Florian Bruhin
.width() was deprecated in Qt 5.11 because what it actually does is better described as .horizontalAdvance(): https://codereview.qt-project.org/c/qt/qtbase/+/201397 (ee2ad9df701b27790e2ab72e99111d255fde42ed in qtbase) Docs: https://doc.qt.io/qt-6/qfontmetrics.html#horizontalAdvance-2 What we actually want for the size hint is the bounding box. (originally cherry picked from commit 78838338c331d74931da31acd2306550721ef121)
2022-04-13Switch to new API for SSL ciphersFlorian Bruhin
This got moved to QSslConfiguration in Qt 5.5: https://codereview.qt-project.org/c/qt/qtbase/+/113886 (92cda9474245c79b635c21cd140c5d0a3a6d2e5b in qtbase) (cherry picked from commit 317da1e3cf23bf40d24d186cd6d06b6bc9a09958)
2022-04-13Remove old resources.pyFlorian Bruhin
(cherry picked from commit 18d7e400cd7f61647953f1f1b5e74006246d4276)
2022-04-13Join subdomain and domain with a dotPhilipp Albrecht
2022-04-11Merge pull request #7120 from qutebrowser/update-dependenciesFlorian Bruhin
Update dependencies
2022-04-11tests: Update bs4 argument nameFlorian Bruhin
2022-04-11Update dependenciesqutebrowser bot
2022-04-05Merge remote-tracking branch 'origin/feat/remove_pyqt_resources_for_importlib'Florian Bruhin
2022-04-05Update changelogFlorian Bruhin
2022-04-05Merge remote-tracking branch 'origin/pr/7103'Florian Bruhin
2022-04-05Use legacy PDF.js build for macOS/Windows releaseslegacy-pdfjsFlorian Bruhin
Fixes #7108
2022-04-05fix more moved icons/ referencesfeat/remove_pyqt_resources_for_importlibJimmy
For Makefile installs (broke while copying stuff over) and pyinstaller installs (broke on launch).
2022-04-04Fix qute-lastpass testsFlorian Bruhin
2022-04-04Switch to Python 3.7 subprocess APIFlorian Bruhin
Follow-up for #6905
2022-04-04Merge branch 'update-dependencies'Florian Bruhin
2022-04-04Revert "pylint: Disable unnecessary-ellipsis for tests"Florian Bruhin
This reverts commit 2b76b6164093754482d848e7487356215556d0d0.
2022-04-04Update changelog URLsFlorian Bruhin
2022-04-04Update dependenciesqutebrowser bot
2022-04-04scripts: Handle root requirements.txt properlyFlorian Bruhin
Regressed in ac2cb6bb303ceec8429b084cdf372a6c8584d780
2022-04-04Update changelogFlorian Bruhin
2022-04-04Clean up some remaining Python version referencesFlorian Bruhin
2022-04-04Update flake8 config for Python 3.6Florian Bruhin
The 'generator_stop' future import is default in Python 3.7: https://docs.python.org/3/library/__future__.html While we do want 'annotations' eventually, it doesn't bring us any gain right now, see #7098.
2022-04-04Drop types-dataclassesFlorian Bruhin
There is https://github.com/python/typeshed/blob/master/stdlib/dataclasses.pyi for the stdlib one
2022-04-04Merge remote-tracking branch 'origin/pr/7102'Florian Bruhin
2022-04-04Load icons via importlib.resourcesJimmy
The PyQt resources system is gone in 6.2 and deprecated before that. This should be the last usage of it. Switches icons to be read with `utils.resources.read_file_binary()` in `notification.py` (fallback desktop notification icon) and `app.py` (icon for the desktop window). importlib only loads resources under a package, so the icons are moved under the `qutebrowser/` directory. Closes: #6062
2022-04-04Add back empty header indexerror workaroundfeat/remove_py36_supportJimmy
The test case on the bug works for me on py37 but CI is failing on 3.10, maybe this isn't quite the same issue. Anyway, we are getting rid of webkit soon.
2022-04-04Remove 3.6 pins from requirements files.Jimmy
Then regenerate the relevant files. Also drop dataclasses from requirements files. TODO: should we drop the dataclasses-types requirement for mypy too?
2022-04-04Drop python3.6 support.Jimmy
Commits for dropping 3.5 support to copy from: c245b7d855ccd "Initial drop of Python 3.5" ccdfb44b8568b "Drop support for Python 3.6.0" Anything needed to update regarding OS version support in doc/install.asciidoc? TODO: remove 3.6/7 annotations in requirements files and rebuild workflows: not sure I updated it right (run 5.12 with 3.7, same 18.04 OS) but 18.04 seems to have 3.7 on it too so it should work. It'll all change when we drop <5.15 anyway. Not sure what the minimum ubuntu version will be going forward. Regarding mimetype overrides (ebb3046822adb) the doctring says they can all go in 3.7 but .h5 is still missing on py39, not sure if we should care. There are a bunch of old(?) warning messages still ignored in tests/end2end/fixtures/quteprocess.py.
2022-04-03Adjust broken linkFlorian Bruhin