summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2022-12-13 09:05:32 +0100
committerFlorian Bruhin <me@the-compiler.org>2022-12-13 09:05:32 +0100
commitb4d32e04f42d0c4994a234105f01aabe0aba6ce0 (patch)
tree388355af97e3c41020a1c996bac844dbcf4bae6b
parentac761234c9de65bd6b25ae8b2eeae0828c98a99c (diff)
parent5afc8a68191160f8d5c74b92874a0032d3c1996e (diff)
downloadqutebrowser-b4d32e04f42d0c4994a234105f01aabe0aba6ce0.tar.gz
qutebrowser-b4d32e04f42d0c4994a234105f01aabe0aba6ce0.zip
Merge branch 'master' into qt6-v2
-rw-r--r--.github/workflows/ci.yml7
-rw-r--r--.github/workflows/nightly.yml11
-rw-r--r--doc/changelog.asciidoc29
-rw-r--r--doc/faq.asciidoc4
-rw-r--r--doc/install.asciidoc22
-rw-r--r--misc/requirements/requirements-check-manifest.txt5
-rw-r--r--misc/requirements/requirements-dev.txt19
-rw-r--r--misc/requirements/requirements-docs.txt3
-rw-r--r--misc/requirements/requirements-docs.txt-raw1
-rw-r--r--misc/requirements/requirements-flake8.txt9
-rw-r--r--misc/requirements/requirements-flake8.txt-raw3
-rw-r--r--misc/requirements/requirements-mypy.txt12
-rw-r--r--misc/requirements/requirements-pyinstaller.txt4
-rw-r--r--misc/requirements/requirements-pylint.txt12
-rw-r--r--misc/requirements/requirements-pyroma.txt10
-rw-r--r--misc/requirements/requirements-sphinx.txt11
-rw-r--r--misc/requirements/requirements-tests-bleeding.txt4
-rw-r--r--misc/requirements/requirements-tests.txt25
-rw-r--r--misc/requirements/requirements-tox.txt19
-rw-r--r--misc/requirements/requirements-yamllint.txt2
-rwxr-xr-xmisc/userscripts/password_fill4
-rw-r--r--qutebrowser/completion/models/filepathcategory.py2
-rw-r--r--qutebrowser/config/config.py4
-rw-r--r--qutebrowser/mainwindow/mainwindow.py2
-rw-r--r--qutebrowser/mainwindow/prompt.py18
-rw-r--r--requirements.txt6
-rwxr-xr-xscripts/asciidoc2html.py48
-rwxr-xr-xscripts/dev/build_release.py17
-rw-r--r--scripts/dev/changelog_urls.json9
-rw-r--r--scripts/dev/ci/docker/Dockerfile.j25
-rw-r--r--scripts/dev/misc_checks.py2
-rw-r--r--scripts/dev/update_version.py3
-rwxr-xr-xscripts/mkvenv.py20
-rw-r--r--tests/end2end/features/utilcmds.feature2
-rw-r--r--tests/end2end/test_invocations.py2
-rw-r--r--tests/unit/browser/test_navigate.py3
-rw-r--r--tests/unit/browser/webkit/test_webkitelem.py3
-rw-r--r--tests/unit/completion/test_completer.py2
-rw-r--r--tests/unit/completion/test_histcategory.py3
-rw-r--r--tests/unit/config/test_configcommands.py12
-rw-r--r--tests/unit/config/test_configfiles.py6
-rw-r--r--tests/unit/javascript/test_js_quirks.py6
-rw-r--r--tox.ini37
43 files changed, 203 insertions, 225 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index ae5e95cdf..b4fbf502b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -75,7 +75,12 @@ jobs:
python -m pip install -U pip
python -m pip install -U -r misc/requirements/requirements-tox.txt
- name: "Run ${{ matrix.testenv }}"
- run: "dbus-run-session -- tox -e ${{ matrix.testenv}} -- ${{ matrix.args }}"
+ run: |
+ if [[ -z "${{ matrix.args }}" ]]; then
+ dbus-run-session -- tox -e ${{ matrix.testenv }}
+ else
+ dbus-run-session -- tox -e ${{ matrix.testenv }} -- ${{ matrix.args }}
+ fi
tests-docker:
if: "!contains(github.event.head_commit.message, '[ci skip]')"
diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml
index 5aaafb666..3d046615d 100644
--- a/.github/workflows/nightly.yml
+++ b/.github/workflows/nightly.yml
@@ -75,15 +75,6 @@ jobs:
uses: actions/setup-python@v4
with:
python-version: "3.10"
- - name: Get asciidoc
- uses: actions/checkout@v3
- with:
- repository: asciidoc-py/asciidoc-py
- ref: '9.x'
- path: asciidoc
- persist-credentials: false
- - name: Move asciidoc out of the repo
- run: mv asciidoc ..
- name: Install dependencies
run: |
python -m pip install -U pip
@@ -93,7 +84,7 @@ jobs:
run: |
sed -i '' '/.-d., .--debug.,/s/$/ default=True,/' qutebrowser/qutebrowser.py
- name: Run tox
- run: "tox -e ${{ matrix.toxenv }} -- --asciidoc ../asciidoc/asciidoc.py --gh-token ${{ secrets.GITHUB_TOKEN }} ${{ matrix.args }}"
+ run: "tox -e ${{ matrix.toxenv }} -- --gh-token ${{ secrets.GITHUB_TOKEN }} ${{ matrix.args }}"
- name: Gather info
id: info
run: |
diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc
index 6d740fe3f..c4fb2d106 100644
--- a/doc/changelog.asciidoc
+++ b/doc/changelog.asciidoc
@@ -127,6 +127,13 @@ Fixed
v2.5.3 (unreleased)
-------------------
+Added
+~~~~~
+
+- New `array_at` quirk, polyfilling the
+ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/at[`Array.at` method],
+ which is needed by various websites, but only natively available with Qt 6.2.
+
Fixed
~~~~~
@@ -599,13 +606,13 @@ Changed
- When a shown message replaces an existing related one (e.g. for zoom levels),
the replacing now also works even if a different message was shown in between.
- The `.redirect(...)` method on interceptors now supports an
- `ignore_unsupported=True` argument which supresses exceptions if a request could
+ `ignore_unsupported=True` argument which suppresses exceptions if a request could
not be redirected. Note, however, that it is still not public API.
- When the `--config-py` argument is used, no warning about a missing
`config.load_autoconfig` is shown anymore, as the argument is typically used
for temporarily testing a config.
- The internal `_autosave` session used for crash recovery is now only saved
- once per minute, since saving it for every page load is a noticable performance
+ once per minute, since saving it for every page load is a noticeable performance
issue.
- The `readability-js` userscript now displays a small header with page
information.
@@ -1033,7 +1040,7 @@ Changed
- `config.py` files now are required to have either
`config.load_autoconfig(False)` (don't load `autoconfig.yml`) or
`config.load_autoconfig()` (do load `autoconfig.yml`) in them.
-- Various host-blocking settings have been renamed to accomodate the new ABP-like
+- Various host-blocking settings have been renamed to accommodate the new ABP-like
adblocker:
* `content.host_blocking.enabled` -> `content.blocking.enabled` (controlling both blockers)
* `content.host_blocking.whitelist` -> `content.blocking.whitelist` (controlling both blockers)
@@ -1209,11 +1216,11 @@ Fixed
~~~~~
- Setting the `content.headers.referer` setting to `same-domain` (the default)
- was supposed to truncate referers to only the host with QtWebEngine.
+ was supposed to truncate referrers to only the host with QtWebEngine.
Unfortunately, this functionality broke in Qt 5.14. It works properly again
with this release, including a test so this won't happen again.
- With QtWebEngine 5.15, setting the `content.headers.referer` setting to
- `never` did still send referers. This is now fixed as well.
+ `never` did still send referrers. This is now fixed as well.
- In v1.14.0, a regression was introduced, causing a crash when qutebrowser was
closed after opening a download with PDF.js. This is now fixed.
- With Qt 5.12, the `Object.fromEntries` JavaScript API is unavailable (it was
@@ -1230,7 +1237,7 @@ Fixed
conversion was shown. This is now fixed.
- Ever since Qt 5.11, fetching more completion data when that data is loaded
lazily (such as with history) and the last visible item is selected was broken.
- The exact reason is currently unknown, but this release adds a tenative fix.
+ The exact reason is currently unknown, but this release adds a tentative fix.
- When PgUp/PgDown were used to go beyond the last visible item, the above issue
caused a crash, which is now also fixed.
- As a workaround for an overzealous Microsoft Defender false-positive detecting
@@ -1346,9 +1353,9 @@ Changed
which fixes issues with e.g. formulas on Wikipedia.
- The `readability-js` userscript now adds some CSS to improve the reader mode
styling in various scenarios:
- * Images are now shrinked to the page width, similarly to what Firefox' reader
+ * Images are now shrunk to the page width, similarly to what Firefox' reader
mode does.
- * Some images ore now displayed as block (rather than inline) which is what
+ * Some images are now displayed as block (rather than inline) which is what
Firefox' reader mode does as well.
* Blockquotes are now styled more distinctively, again based on the Firefox
reader mode.
@@ -3170,7 +3177,7 @@ Fixed
- Fix workaround for black screens or crashes with Nvidia cards
- Handle a filesystem going read-only gracefully
- Fix crash when setting `fonts.monospace`
-- Fix list options not being modifyable via `.append()` in `config.py`
+- Fix list options not being modifiable via `.append()` in `config.py`
- Mark the content.notifications setting as QtWebKit only correctly
- Fix wrong rendering of keys like `<back>` in the completion
@@ -3206,7 +3213,7 @@ Major changes
* New dependency on the QtSql module and Qt sqlite support.
* New dependency on the https://www.attrs.org/[attrs] project (packaged as
`python-attr` in some distributions).
- * The depedency on PyOpenGL (when using QtWebEngine) got removed. Note
+ * The dependency on PyOpenGL (when using QtWebEngine) got removed. Note
that PyQt5.QtOpenGL is still a dependency.
* PyQt5.QtOpenGL is now always required, even with QtWebKit.
- The QtWebEngine backend is now used by default. Note this means that
@@ -4427,7 +4434,7 @@ Changed
* Add `-s`/`--space` argument to `:set-cmd-text` (as `:set-cmd-text "foo "` will now set the literal text `"foo "`)
- Ignore `;;` for splitting with some commands like `:bind`.
- Add unbound (new) default keybindings to config. This also adds a new `<unbound>` special command.
- * To unbind a command keybinding without binding it to a new key, you now have to bind it to `<unbound>` or it'll be readded automatically.
+ * To unbind a command keybinding without binding it to a new key, you now have to bind it to `<unbound>` or it'll be re-added automatically.
- If an SSL error is raised multiple times with the same error/certificate/host/scheme/port, the user is only asked once.
- Jump to last instead of first item when pressing Shift-Tab the first time in the completion.
- Add a fullscreen keybinding.
diff --git a/doc/faq.asciidoc b/doc/faq.asciidoc
index bcbd0d29a..61f787d3d 100644
--- a/doc/faq.asciidoc
+++ b/doc/faq.asciidoc
@@ -170,7 +170,7 @@ text/html; qutebrowser %s; needsterminal; nametemplate=%s.html
----
+
Note that you might want to add additional options to qutebrowser, so that it
-runs as a seperate instance configured to disable JavaScript and avoid network
+runs as a separate instance configured to disable JavaScript and avoid network
requests, in order to avoid privacy leaks when reading mails. The easiest way
to do so is by specifying a non-existent proxy server, e.g.:
+
@@ -376,7 +376,7 @@ There is a total of four possible approaches to get dark websites:
How do I make copy to clipboard buttons work?::
You can `:set content.javascript.clipboard access` to allow this globally (not
-recommended!), or `:set -u some.domain content.javascript.clipboad access` if
+recommended!), or `:set -u some.domain content.javascript.clipboard access` if
you want to limit the setting to `some.domain`.
diff --git a/doc/install.asciidoc b/doc/install.asciidoc
index 4b1d5bfff..da211d850 100644
--- a/doc/install.asciidoc
+++ b/doc/install.asciidoc
@@ -48,7 +48,7 @@ instructions!
Note you'll need some basic libraries to use the virtualenv-installed PyQt:
----
-# apt install --no-install-recommends git ca-certificates python3 python3-venv asciidoc libglib2.0-0 libgl1 libfontconfig1 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-shape0 libxcb-xfixes0 libxcb-xinerama0 libxcb-xkb1 libxkbcommon-x11-0 libdbus-1-3 libyaml-dev gcc python3-dev libnss3 libasound2
+# apt install --no-install-recommends git ca-certificates python3 python3-venv libglib2.0-0 libgl1 libfontconfig1 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-shape0 libxcb-xfixes0 libxcb-xinerama0 libxcb-xkb1 libxkbcommon-x11-0 libdbus-1-3 libyaml-dev gcc python3-dev libnss3 libasound2
----
// FIXME not needed anymore?
@@ -72,7 +72,7 @@ qutebrowser in a virtualenv>> with a newer PyQt/Qt binary instead.
Note you'll need some basic libraries to use the virtualenv-installed PyQt:
----
-# apt install --no-install-recommends git ca-certificates python3 python3-venv asciidoc libglib2.0-0 libgl1 libfontconfig1 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-shape0 libxcb-xfixes0 libxcb-xinerama0 libxcb-xkb1 libxkbcommon-x11-0 libdbus-1-3 libyaml-dev gcc python3-dev libnss3 libasound2
+# apt install --no-install-recommends git ca-certificates python3 python3-venv libglib2.0-0 libgl1 libfontconfig1 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-shape0 libxcb-xfixes0 libxcb-xinerama0 libxcb-xkb1 libxkbcommon-x11-0 libdbus-1-3 libyaml-dev gcc python3-dev libnss3 libasound2
----
Ubuntu 20.04 LTS / Linux Mint 20 (or newer)
@@ -93,7 +93,7 @@ Additional hints
this for you):
+
----
-# apt install --no-install-recommends asciidoc
+$ pip install -r misc/requirements/requirements-docs.txt # or install asciidoc manually
$ python3 scripts/asciidoc2html.py
----
@@ -292,7 +292,7 @@ Nightly builds
If you want to test out new features before an official qutebrowser release, automated
https://github.com/qutebrowser/qutebrowser/actions/workflows/nightly.yml[nightly
-builds] are available. To download them, open the lastest run (usually the first one),
+builds] are available. To download them, open the latest run (usually the first one),
then download the archive at the bottom of the page.
Those builds also include variants with debug logging enabled, which can be useful to
@@ -369,7 +369,7 @@ Nightly builds
If you want to test out new features before an official qutebrowser release, automated
https://github.com/qutebrowser/qutebrowser/actions/workflows/nightly.yml[nightly
-builds] are available. To download them, open the lastest run (usually the first one),
+builds] are available. To download them, open the latest run (usually the first one),
then download the archive at the bottom of the page.
Those builds also include variants with debug logging enabled, which can be useful to
@@ -514,18 +514,6 @@ You can create a simple wrapper script to start qutebrowser somewhere in your
~/path/to/qutebrowser/.venv/bin/python3 -m qutebrowser "$@"
----
-Building the docs
-~~~~~~~~~~~~~~~~~
-
-To build the documentation, install `asciidoc` (note that LaTeX which comes as
-optional/recommended dependency with some distributions is not required).
-
-Then, run:
-
-----
-$ python3 scripts/asciidoc2html.py
-----
-
Updating
~~~~~~~~
diff --git a/misc/requirements/requirements-check-manifest.txt b/misc/requirements/requirements-check-manifest.txt
index 2e804cbeb..f35ba3f3f 100644
--- a/misc/requirements/requirements-check-manifest.txt
+++ b/misc/requirements/requirements-check-manifest.txt
@@ -1,8 +1,7 @@
# This file is automatically generated by scripts/dev/recompile_requirements.py
build==0.9.0
-check-manifest==0.48
-packaging==21.3
+check-manifest==0.49
+packaging==22.0
pep517==0.13.0
-pyparsing==3.0.9
tomli==2.0.1
diff --git a/misc/requirements/requirements-dev.txt b/misc/requirements/requirements-dev.txt
index b3dafe27c..7eca59878 100644
--- a/misc/requirements/requirements-dev.txt
+++ b/misc/requirements/requirements-dev.txt
@@ -3,30 +3,29 @@
bleach==5.0.1
build==0.9.0
bump2version==1.0.1
-certifi==2022.9.24
+certifi==2022.12.7
cffi==1.15.1
charset-normalizer==2.1.1
commonmark==0.9.1
-cryptography==38.0.3
+cryptography==38.0.4
docutils==0.19
github3.py==3.2.0
hunter==3.5.1
idna==3.4
-importlib-metadata==5.0.0
+importlib-metadata==5.1.0
jaraco.classes==3.2.3
jeepney==0.8.0
keyring==23.11.0
manhole==1.8.0
more-itertools==9.0.0
-packaging==21.3
+packaging==22.0
pep517==0.13.0
-pkginfo==1.8.3
+pkginfo==1.9.2
ply==3.11
pycparser==2.21
Pygments==2.13.0
PyJWT==2.6.0
Pympler==1.0.1
-pyparsing==3.0.9
PyQt-builder==1.14.0
python-dateutil==2.8.2
readme-renderer==37.3
@@ -35,13 +34,13 @@ requests-toolbelt==0.10.1
rfc3986==2.0.0
rich==12.6.0
SecretStorage==3.3.3
-sip==6.7.4
+sip==6.7.5
six==1.16.0
toml==0.10.2
tomli==2.0.1
-twine==4.0.1
+twine==4.0.2
typing_extensions==4.4.0
uritemplate==4.1.1
-# urllib3==1.26.12
+# urllib3==1.26.13
webencodings==0.5.1
-zipp==3.10.0
+zipp==3.11.0
diff --git a/misc/requirements/requirements-docs.txt b/misc/requirements/requirements-docs.txt
new file mode 100644
index 000000000..d2d35d758
--- /dev/null
+++ b/misc/requirements/requirements-docs.txt
@@ -0,0 +1,3 @@
+# This file is automatically generated by scripts/dev/recompile_requirements.py
+
+asciidoc==10.2.0
diff --git a/misc/requirements/requirements-docs.txt-raw b/misc/requirements/requirements-docs.txt-raw
new file mode 100644
index 000000000..1cd92d927
--- /dev/null
+++ b/misc/requirements/requirements-docs.txt-raw
@@ -0,0 +1 @@
+asciidoc
diff --git a/misc/requirements/requirements-flake8.txt b/misc/requirements/requirements-flake8.txt
index 413c5be78..e67ce883d 100644
--- a/misc/requirements/requirements-flake8.txt
+++ b/misc/requirements/requirements-flake8.txt
@@ -1,11 +1,10 @@
# This file is automatically generated by scripts/dev/recompile_requirements.py
attrs==22.1.0
-flake8==5.0.4
-flake8-bugbear==22.10.27
+flake8==6.0.0
+flake8-bugbear==22.12.6
flake8-builtins==2.0.1
flake8-comprehensions==3.10.1
-flake8-copyright==0.2.3
flake8-debugger==4.1.2
flake8-deprecated==2.0.1
flake8-docstrings==1.6.0
@@ -17,8 +16,8 @@ flake8-tidy-imports==4.8.0
flake8-tuple==0.4.1
mccabe==0.7.0
pep8-naming==0.13.2
-pycodestyle==2.9.1
+pycodestyle==2.10.0
pydocstyle==6.1.1
-pyflakes==2.5.0
+pyflakes==3.0.1
six==1.16.0
snowballstemmer==2.2.0
diff --git a/misc/requirements/requirements-flake8.txt-raw b/misc/requirements/requirements-flake8.txt-raw
index f5ecb7c8d..42bf76ee2 100644
--- a/misc/requirements/requirements-flake8.txt-raw
+++ b/misc/requirements/requirements-flake8.txt-raw
@@ -5,7 +5,8 @@ flake8-comprehensions
flake8-debugger
flake8-deprecated!=2.0.0
flake8-docstrings
-flake8-copyright
+# https://github.com/savoirfairelinux/flake8-copyright/issues/19
+# flake8-copyright
flake8-future-import
# https://github.com/aleGpereira/flake8-mock/issues/10
# flake8-mock
diff --git a/misc/requirements/requirements-mypy.txt b/misc/requirements/requirements-mypy.txt
index 1cd283d8a..dbd21d0b4 100644
--- a/misc/requirements/requirements-mypy.txt
+++ b/misc/requirements/requirements-mypy.txt
@@ -1,13 +1,13 @@
# This file is automatically generated by scripts/dev/recompile_requirements.py
-chardet==5.0.0
-diff-cover==7.0.2
-importlib-metadata==5.0.0
-importlib-resources==5.10.0
+chardet==5.1.0
+diff-cover==7.3.0
+importlib-metadata==5.1.0
+importlib-resources==5.10.1
Jinja2==3.1.2
lxml==4.9.1
MarkupSafe==2.1.1
-mypy==0.990
+mypy==0.991
mypy-extensions==0.4.3
pluggy==1.0.0
Pygments==2.13.0
@@ -15,4 +15,4 @@ PyQt5-stubs==5.15.6.0
tomli==2.0.1
types-PyYAML==6.0.12.2
typing_extensions==4.4.0
-zipp==3.10.0
+zipp==3.11.0
diff --git a/misc/requirements/requirements-pyinstaller.txt b/misc/requirements/requirements-pyinstaller.txt
index 5c938bea0..6c4cb4a77 100644
--- a/misc/requirements/requirements-pyinstaller.txt
+++ b/misc/requirements/requirements-pyinstaller.txt
@@ -1,5 +1,5 @@
# This file is automatically generated by scripts/dev/recompile_requirements.py
altgraph==0.17.3
-pyinstaller==5.6.2
-pyinstaller-hooks-contrib==2022.13
+pyinstaller==5.7.0
+pyinstaller-hooks-contrib==2022.14
diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt
index 52211c92c..12457a850 100644
--- a/misc/requirements/requirements-pylint.txt
+++ b/misc/requirements/requirements-pylint.txt
@@ -1,10 +1,10 @@
# This file is automatically generated by scripts/dev/recompile_requirements.py
-astroid==2.12.12
-certifi==2022.9.24
+astroid==2.12.13
+certifi==2022.12.7
cffi==1.15.1
charset-normalizer==2.1.1
-cryptography==38.0.3
+cryptography==38.0.4
dill==0.3.6
future==0.18.2
github3.py==3.2.0
@@ -13,10 +13,10 @@ isort==5.10.1
lazy-object-proxy==1.8.0
mccabe==0.7.0
pefile==2022.5.30
-platformdirs==2.5.4
+platformdirs==2.6.0
pycparser==2.21
PyJWT==2.6.0
-pylint==2.15.5
+pylint==2.15.8
python-dateutil==2.8.2
./scripts/dev/pylint_checkers
requests==2.28.1
@@ -26,5 +26,5 @@ tomlkit==0.11.6
typed-ast==1.5.4 ; python_version<"3.8"
typing_extensions==4.4.0
uritemplate==4.1.1
-# urllib3==1.26.12
+# urllib3==1.26.13
wrapt==1.14.1
diff --git a/misc/requirements/requirements-pyroma.txt b/misc/requirements/requirements-pyroma.txt
index 5ca054ae8..5702eafe8 100644
--- a/misc/requirements/requirements-pyroma.txt
+++ b/misc/requirements/requirements-pyroma.txt
@@ -1,15 +1,15 @@
# This file is automatically generated by scripts/dev/recompile_requirements.py
build==0.9.0
-certifi==2022.9.24
+certifi==2022.12.7
charset-normalizer==2.1.1
docutils==0.19
idna==3.4
-packaging==21.3
+packaging==22.0
pep517==0.13.0
Pygments==2.13.0
-pyparsing==3.0.9
-pyroma==4.0
+pyroma==4.1
requests==2.28.1
tomli==2.0.1
-urllib3==1.26.12
+trove-classifiers==2022.12.1
+urllib3==1.26.13
diff --git a/misc/requirements/requirements-sphinx.txt b/misc/requirements/requirements-sphinx.txt
index f04f2d829..98d43093f 100644
--- a/misc/requirements/requirements-sphinx.txt
+++ b/misc/requirements/requirements-sphinx.txt
@@ -2,17 +2,16 @@
alabaster==0.7.12
Babel==2.11.0
-certifi==2022.9.24
+certifi==2022.12.7
charset-normalizer==2.1.1
docutils==0.19
idna==3.4
imagesize==1.4.1
-importlib-metadata==5.0.0
+importlib-metadata==5.1.0
Jinja2==3.1.2
MarkupSafe==2.1.1
-packaging==21.3
+packaging==22.0
Pygments==2.13.0
-pyparsing==3.0.9
pytz==2022.6
requests==2.28.1
snowballstemmer==2.2.0
@@ -23,5 +22,5 @@ sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
-urllib3==1.26.12
-zipp==3.10.0
+urllib3==1.26.13
+zipp==3.11.0
diff --git a/misc/requirements/requirements-tests-bleeding.txt b/misc/requirements/requirements-tests-bleeding.txt
index d249a7e7e..f1ad30158 100644
--- a/misc/requirements/requirements-tests-bleeding.txt
+++ b/misc/requirements/requirements-tests-bleeding.txt
@@ -9,9 +9,7 @@ git+https://github.com/HypothesisWorks/hypothesis.git#subdirectory=hypothesis-py
git+https://github.com/pytest-dev/pytest.git
git+https://github.com/pytest-dev/pytest-bdd.git
git+https://github.com/ionelmc/pytest-benchmark.git
-# WORKAROUND for pytest-instafail using deprectated pytest functionality
-# See https://github.com/pytest-dev/pytest-instafail/pull/26
-git+https://github.com/The-Compiler/pytest-instafail.git@new-hookimpl
+git+https://github.com/pytest-dev/pytest-instafail.git
git+https://github.com/pytest-dev/pytest-mock.git
git+https://github.com/pytest-dev/pytest-qt.git
git+https://github.com/pytest-dev/pytest-rerunfailures.git
diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt
index daa7f1dd8..bd944c934 100644
--- a/misc/requirements/requirements-tests.txt
+++ b/misc/requirements/requirements-tests.txt
@@ -2,34 +2,33 @@
attrs==22.1.0
beautifulsoup4==4.11.1
-certifi==2022.9.24
+certifi==2022.12.7
charset-normalizer==2.1.1
-cheroot==8.6.0
+cheroot==9.0.0
click==8.1.3
coverage==6.5.0
-exceptiongroup==1.0.2
+exceptiongroup==1.0.4
execnet==1.9.0
-filelock==3.8.0
+filelock==3.8.2
Flask==2.2.2
hunter==3.5.1
-hypothesis==6.56.4
+hypothesis==6.61.0
idna==3.4
-importlib-metadata==5.0.0
+importlib-metadata==5.1.0
iniconfig==1.1.1
itsdangerous==2.1.2
jaraco.functools==3.5.2
# Jinja2==3.1.2
-Mako==1.2.3
+Mako==1.2.4
manhole==1.8.0
# MarkupSafe==2.1.1
more-itertools==9.0.0
-packaging==21.3
+packaging==22.0
parse==1.19.0
parse-type==0.6.0
pluggy==1.0.0
py-cpuinfo==9.0.0
Pygments==2.13.0
-pyparsing==3.0.9
pytest==7.2.0
pytest-bdd==6.1.1
pytest-benchmark==4.0.0
@@ -38,8 +37,8 @@ pytest-instafail==0.4.2
pytest-mock==3.10.0
pytest-qt==4.2.0
pytest-repeat==0.9.1
-pytest-rerunfailures==10.2
-pytest-xdist==3.0.2
+pytest-rerunfailures==10.3
+pytest-xdist==3.1.0
pytest-xvfb==2.0.0
PyVirtualDisplay==3.0
requests==2.28.1
@@ -51,7 +50,7 @@ tldextract==3.4.0
toml==0.10.2
tomli==2.0.1
typing_extensions==4.4.0
-urllib3==1.26.12
+urllib3==1.26.13
vulture==2.6
Werkzeug==2.2.2
-zipp==3.10.0
+zipp==3.11.0
diff --git a/misc/requirements/requirements-tox.txt b/misc/requirements/requirements-tox.txt
index 520b410b1..814faeae4 100644
--- a/misc/requirements/requirements-tox.txt
+++ b/misc/requirements/requirements-tox.txt
@@ -1,16 +1,17 @@
# This file is automatically generated by scripts/dev/recompile_requirements.py
+cachetools==5.2.0
+chardet==5.1.0
+colorama==0.4.6
distlib==0.3.6
-filelock==3.8.0
-packaging==21.3
+filelock==3.8.2
+packaging==22.0
pip==22.3.1
-platformdirs==2.5.4
+platformdirs==2.6.0
pluggy==1.0.0
-py==1.11.0
-pyparsing==3.0.9
-setuptools==65.5.1
-six==1.16.0
+pyproject_api==1.2.1
+setuptools==65.6.3
tomli==2.0.1
-tox==3.27.0
-virtualenv==20.16.7
+tox==4.0.8
+virtualenv==20.17.1
wheel==0.38.4
diff --git a/misc/requirements/requirements-yamllint.txt b/misc/requirements/requirements-yamllint.txt
index 2dccc1085..f825718e9 100644
--- a/misc/requirements/requirements-yamllint.txt
+++ b/misc/requirements/requirements-yamllint.txt
@@ -1,5 +1,5 @@
# This file is automatically generated by scripts/dev/recompile_requirements.py
-pathspec==0.10.2
+pathspec==0.10.3
PyYAML==6.0
yamllint==1.28.0
diff --git a/misc/userscripts/password_fill b/misc/userscripts/password_fill
index 3ea8fd9f6..b63d36276 100755
--- a/misc/userscripts/password_fill
+++ b/misc/userscripts/password_fill
@@ -143,6 +143,7 @@ no_entries_found() {
# expected to write the username of that entry to the $username variable and
# the corresponding password to $password
+# shellcheck disable=SC2317
reset_backend() {
init() { true ; }
query_entries() { true ; }
@@ -198,7 +199,7 @@ choose_entry_zenity() {
}
choose_entry_zenity_radio() {
- zenity_helper() {
+ zenity_helper() { # shellcheck disable=SC2317
awk '{ print $0 ; print $0 }' \
| zenity --list --radiolist \
--title "qutebrowser password fill" \
@@ -278,6 +279,7 @@ pass_backend() {
# =======================================================
# backend: secret
+# shellcheck disable=SC2317
secret_backend() {
init() {
return
diff --git a/qutebrowser/completion/models/filepathcategory.py b/qutebrowser/completion/models/filepathcategory.py
index 3bf241c30..66bf41ebd 100644
--- a/qutebrowser/completion/models/filepathcategory.py
+++ b/qutebrowser/completion/models/filepathcategory.py
@@ -19,7 +19,7 @@
"""Completion category for filesystem paths.
-NOTE: This module deliberatly uses os.path rather than pathlib, because of how
+NOTE: This module deliberately uses os.path rather than pathlib, because of how
it interacts with the completion, which operates on strings. For example, we
need to be able to tell the difference between "~/input" and "~/input/". Also,
if we get "~/input", we want to glob "~/input*" rather than "~/input/*" which
diff --git a/qutebrowser/config/config.py b/qutebrowser/config/config.py
index 07a6c5046..cdb360ef1 100644
--- a/qutebrowser/config/config.py
+++ b/qutebrowser/config/config.py
@@ -109,7 +109,7 @@ class change_filter: # noqa: N801,N806 pylint: disable=invalid-name
and calls the wrapped function if we are.
We assume the function passed doesn't take any parameters. However, it
- could take a "self" argument, so we can't cleary express this in the
+ could take a "self" argument, so we can't clearly express this in the
type above.
Args:
@@ -188,7 +188,7 @@ class KeyConfig:
def get_reverse_bindings_for(self, mode: str) -> '_ReverseBindings':
"""Get a dict of commands to a list of bindings for the mode.
- This is intented for user-facing display of keybindings.
+ This is intended for user-facing display of keybindings.
As such, bindings for 'set-cmd-text [flags] :<cmd> ...' are translated
to '<cmd> ...', as from the user's perspective these keys behave like
bindings for '<cmd>' (that allow for further input before running).
diff --git a/qutebrowser/mainwindow/mainwindow.py b/qutebrowser/mainwindow/mainwindow.py
index 2c6cd673f..4b01dadfd 100644
--- a/qutebrowser/mainwindow/mainwindow.py
+++ b/qutebrowser/mainwindow/mainwindow.py
@@ -412,7 +412,7 @@ class MainWindow(QWidget):
self._set_decoration(config.val.window.hide_decoration)
def _add_widgets(self):
- """Add or readd all widgets to the VBox."""
+ """Add or re-add all widgets to the VBox."""
self._vbox.removeWidget(self.tabbed_browser.widget)
self._vbox.removeWidget(self._downloadview)
self._vbox.removeWidget(self.status)
diff --git a/qutebrowser/mainwindow/prompt.py b/qutebrowser/mainwindow/prompt.py
index db7553e7e..c1ad82990 100644
--- a/qutebrowser/mainwindow/prompt.py
+++ b/qutebrowser/mainwindow/prompt.py
@@ -752,9 +752,21 @@ class FilenamePrompt(_BasePrompt):
self._file_view.setColumnHidden(col, True)
# Nothing selected initially
self._file_view.setCurrentIndex(QModelIndex())
- # The model needs to be sorted so we get the correct first/last index
- self._file_model.directoryLoaded.connect(
- lambda: self._file_model.sort(0))
+
+ self._file_model.directoryLoaded.connect(self.on_directory_loaded)
+
+ @pyqtSlot()
+ def on_directory_loaded(self):
+ """Sort the model after a directory gets loaded.
+
+ The model needs to be sorted so we get the correct first/last index.
+
+ NOTE: This needs to be a proper @pystSlot() function, and not a lambda.
+ Otherwise, PyQt seems to fail to disconnect it immediately after the
+ object gets destroyed, and we get segfaults when deleting the directory
+ in unit tests.
+ """
+ self._file_model.sort(0)
def accept(self, value=None, save=False):
self._check_save_support(save)
diff --git a/requirements.txt b/requirements.txt
index cc254cf60..2e993e977 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,14 +2,14 @@
adblock==0.6.0
colorama==0.4.6
-importlib-metadata==5.0.0 ; python_version=="3.7.*"
-importlib-resources==5.10.0 ; python_version=="3.7.*" or python_version=="3.8.*"
+importlib-metadata==5.1.0 ; python_version=="3.7.*"
+importlib-resources==5.10.1 ; python_version=="3.7.*" or python_version=="3.8.*"
Jinja2==3.1.2
MarkupSafe==2.1.1
Pygments==2.13.0
PyYAML==6.0
typing_extensions==4.4.0 ; python_version<"3.8"
-zipp==3.10.0
+zipp==3.11.0
# Unpinned due to recompile_requirements.py limitations
pyobjc-core ; sys_platform=="darwin"
pyobjc-framework-Cocoa ; sys_platform=="darwin"
diff --git a/scripts/asciidoc2html.py b/scripts/asciidoc2html.py
index 1b904736d..6f3b170af 100755
--- a/scripts/asciidoc2html.py
+++ b/scripts/asciidoc2html.py
@@ -20,7 +20,7 @@
"""Generate the html documentation based on the asciidoc files."""
-from typing import List, Optional
+from typing import Optional
import re
import os
import sys
@@ -48,13 +48,7 @@ class AsciiDoc:
'install', 'stacktrace'
]
- def __init__(self,
- asciidoc: Optional[str],
- asciidoc_python: Optional[str],
- website: Optional[str]) -> None:
- self._cmd: Optional[List[str]] = None
- self._asciidoc = asciidoc
- self._asciidoc_python = asciidoc_python
+ def __init__(self, website: Optional[str]) -> None:
self._website = website
self._homedir: Optional[pathlib.Path] = None
self._themedir: Optional[pathlib.Path] = None
@@ -63,7 +57,6 @@ class AsciiDoc:
def prepare(self) -> None:
"""Get the asciidoc command and create the homedir to use."""
- self._cmd = self._get_asciidoc_cmd()
self._homedir = pathlib.Path(tempfile.mkdtemp())
self._themedir = self._homedir / '.asciidoc' / 'themes' / 'qute'
self._tempdir = self._homedir / 'tmp'
@@ -224,26 +217,6 @@ class AsciiDoc:
except FileExistsError:
pass
- def _get_asciidoc_cmd(self) -> List[str]:
- """Try to find out what commandline to use to invoke asciidoc."""
- if self._asciidoc is not None:
- python = (sys.executable if self._asciidoc_python is None
- else self._asciidoc_python)
- return [python, self._asciidoc]
-
- for executable in ['asciidoc', 'asciidoc.py']:
- try:
- subprocess.run([executable, '--version'],
- stdout=subprocess.DEVNULL,
- stderr=subprocess.DEVNULL,
- check=True)
- except OSError:
- pass
- else:
- return [executable]
-
- raise FileNotFoundError
-
def call(self, src: pathlib.Path, dst: pathlib.Path, *args):
"""Call asciidoc for the given files.
@@ -253,8 +226,7 @@ class AsciiDoc:
*args: Additional arguments passed to asciidoc.
"""
print("Calling asciidoc for {}...".format(src.name))
- assert self._cmd is not None # for mypy
- cmdline = self._cmd[:]
+ cmdline = [sys.executable, "-m", "asciidoc"]
if dst is not None:
cmdline += ['--out-file', str(dst)]
cmdline += args
@@ -281,12 +253,6 @@ def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser()
parser.add_argument('--website', help="Build website into a given "
"directory.")
- parser.add_argument('--asciidoc', help="Full path to asciidoc.py. "
- "If not given, it's searched in PATH.",
- nargs='?')
- parser.add_argument('--asciidoc-python', help="Python to use for asciidoc."
- "If not given, the current Python interpreter is used.",
- nargs='?')
return parser.parse_args()
@@ -298,9 +264,8 @@ def run(**kwargs) -> None:
try:
asciidoc.prepare()
except FileNotFoundError:
- utils.print_error("Could not find asciidoc! Please install it, or use "
- "the --asciidoc argument to point this script to "
- "the correct asciidoc.py location!")
+ utils.print_error("Could not find asciidoc! Please install it, e.g. via "
+ "pip install -r misc/requirements/requirements-docs.txt")
sys.exit(1)
try:
@@ -314,8 +279,7 @@ def main(colors: bool = False) -> None:
utils.change_cwd()
utils.use_color = colors
args = parse_args()
- run(asciidoc=args.asciidoc, asciidoc_python=args.asciidoc_python,
- website=args.website)
+ run(website=args.website)
if __name__ == '__main__':
diff --git a/scripts/dev/build_release.py b/scripts/dev/build_release.py
index 11495562f..5cc3a4821 100755
--- a/scripts/dev/build_release.py
+++ b/scripts/dev/build_release.py
@@ -100,15 +100,10 @@ def call_tox(
env=env, check=True)
-def run_asciidoc2html(args: argparse.Namespace) -> None:
+def run_asciidoc2html() -> None:
"""Run the asciidoc2html script."""
utils.print_title("Running asciidoc2html.py")
- a2h_args = []
- if args.asciidoc is not None:
- a2h_args += ['--asciidoc', args.asciidoc]
- if args.asciidoc_python is not None:
- a2h_args += ['--asciidoc-python', args.asciidoc_python]
- call_script('asciidoc2html.py', *a2h_args)
+ call_script('asciidoc2html.py')
def _maybe_remove(path: pathlib.Path) -> None:
@@ -724,12 +719,6 @@ def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument('--skip-docs', action='store_true',
help="Don't generate docs")
- parser.add_argument('--asciidoc', help="Full path to asciidoc.py. "
- "If not given, it's searched in PATH.",
- nargs='?')
- parser.add_argument('--asciidoc-python', help="Python to use for asciidoc."
- "If not given, the current Python interpreter is used.",
- nargs='?')
parser.add_argument('--gh-token', help="GitHub token to use.",
nargs='?')
parser.add_argument('--upload', action='store_true', required=False,
@@ -766,7 +755,7 @@ def main() -> None:
if args.skip_docs:
pathlib.Path("qutebrowser", "html", "doc").mkdir(parents=True, exist_ok=True)
else:
- run_asciidoc2html(args)
+ run_asciidoc2html()
if IS_WINDOWS:
artifacts = build_windows(
diff --git a/scripts/dev/changelog_urls.json b/scripts/dev/changelog_urls.json
index f19112f17..06a7396e3 100644
--- a/scripts/dev/changelog_urls.json
+++ b/scripts/dev/changelog_urls.json
@@ -1,5 +1,4 @@
{
- "pyparsing": "https://github.com/pyparsing/pyparsing/blob/master/CHANGES",
"pylint": "https://pylint.pycqa.org/en/latest/whatsnew/2/index.html",
"tomlkit": "https://github.com/sdispater/tomlkit/blob/master/CHANGELOG.md",
"dill": "https://github.com/uqfoundation/dill/commits/master",
@@ -30,6 +29,8 @@
"pytest": "https://docs.pytest.org/en/latest/changelog.html",
"iniconfig": "https://github.com/pytest-dev/iniconfig/blob/master/CHANGELOG",
"tox": "https://tox.readthedocs.io/en/latest/changelog.html",
+ "cachetools": "https://github.com/tkem/cachetools/blob/master/CHANGELOG.rst",
+ "pyproject_api": "https://pyproject-api.readthedocs.io/en/latest/changelog.html",
"PyYAML": "https://github.com/yaml/pyyaml/blob/master/CHANGES",
"pytest-bdd": "https://github.com/pytest-dev/pytest-bdd/blob/master/CHANGES.rst",
"snowballstemmer": "https://github.com/snowballstem/snowball/blob/master/NEWS",
@@ -47,7 +48,6 @@
"flake8-tidy-imports": "https://github.com/adamchainz/flake8-tidy-imports/blob/main/HISTORY.rst",
"flake8-tuple": "https://github.com/ar4s/flake8_tuple/blob/master/HISTORY.rst",
"flake8-comprehensions": "https://github.com/adamchainz/flake8-comprehensions/blob/main/HISTORY.rst",
- "flake8-copyright": "https://github.com/savoirfairelinux/flake8-copyright/blob/master/CHANGELOG.rst",
"flake8-deprecated": "https://github.com/gforcada/flake8-deprecated/blob/master/CHANGES.rst",
"flake8-future-import": "https://github.com/xZise/flake8-future-import#changes",
"flake8-string-format": "https://github.com/xZise/flake8-string-format#changes",
@@ -78,7 +78,6 @@
"sphinxcontrib-serializinghtml": "https://www.sphinx-doc.org/en/master/changes.html",
"jaraco.functools": "https://github.com/jaraco/jaraco.functools/blob/main/CHANGES.rst",
"parse": "https://github.com/r1chardj0n3s/parse#potential-gotchas",
- "py": "https://py.readthedocs.io/en/latest/changelog.html#changelog",
"Pympler": "https://github.com/pympler/pympler/blob/master/CHANGELOG.md",
"pytest-mock": "https://github.com/pytest-dev/pytest-mock/blob/main/CHANGELOG.rst",
"pytest-qt": "https://github.com/pytest-dev/pytest-qt/blob/master/CHANGELOG.rst",
@@ -160,5 +159,7 @@
"rich": "https://github.com/Textualize/rich/blob/master/CHANGELOG.md",
"ply": "https://github.com/dabeaz/ply/blob/master/CHANGES",
"pyobjc-core": "https://pyobjc.readthedocs.io/en/latest/changelog.html",
- "pyobjc-framework-Cocoa": "https://pyobjc.readthedocs.io/en/latest/changelog.html"
+ "pyobjc-framework-Cocoa": "https://pyobjc.readthedocs.io/en/latest/changelog.html",
+ "trove-classifiers": "https://github.com/pypa/trove-classifiers/commits/main",
+ "asciidoc": "https://asciidoc-py.github.io/CHANGELOG.html"
}
diff --git a/scripts/dev/ci/docker/Dockerfile.j2 b/scripts/dev/ci/docker/Dockerfile.j2
index cc66f37d7..fb0095194 100644
--- a/scripts/dev/ci/docker/Dockerfile.j2
+++ b/scripts/dev/ci/docker/Dockerfile.j2
@@ -29,6 +29,11 @@ RUN pacman -Suyy --noconfirm \
libyaml \
xorg-xdpyinfo
+# WORKAROUND for https://bugs.archlinux.org/task/76720
+{% if unstable %}
+RUN pacman -U --noconfirm https://archlinux.org/packages/extra/x86_64/mesa/download/
+{% endif %}
+
{% if not webengine %}
RUN pacman -U --noconfirm \
https://archive.archlinux.org/packages/q/qt5-webkit/qt5-webkit-5.212.0alpha4-18-x86_64.pkg.tar.zst \
diff --git a/scripts/dev/misc_checks.py b/scripts/dev/misc_checks.py
index c5c20a593..998929827 100644
--- a/scripts/dev/misc_checks.py
+++ b/scripts/dev/misc_checks.py
@@ -165,7 +165,7 @@ def check_spelling(args: argparse.Namespace) -> Optional[bool]:
'artefact', 'an unix', 'an utf', 'an unicode', 'unparseable',
'dependancies', 'convertable', 'chosing', 'authentification'}
- # Words which look better when splitted, but might need some fine tuning.
+ # Words which look better when split, but might need some fine tuning.
words |= {'webelements', 'mouseevent', 'keysequence', 'normalmode',
'eventloops', 'sizehint', 'statemachine', 'metaobject',
'logrecord'}
diff --git a/scripts/dev/update_version.py b/scripts/dev/update_version.py
index 975787415..67e22ea26 100644
--- a/scripts/dev/update_version.py
+++ b/scripts/dev/update_version.py
@@ -81,8 +81,7 @@ if __name__ == "__main__":
"tox -e build-release -- --upload"
.format(v=version))
print("* Windows: git fetch; git checkout v{v}; "
- "py -3.9 -m tox -e build-release -- --asciidoc "
- "$env:userprofile\\bin\\asciidoc-9.1.0\\asciidoc.py --upload"
+ "py -3.9 -m tox -e build-release -- --upload"
.format(v=version))
print("* macOS: git fetch && git checkout v{v} && "
"tox -e build-release -- --upload"
diff --git a/scripts/mkvenv.py b/scripts/mkvenv.py
index cc9c9403d..cd75874fc 100755
--- a/scripts/mkvenv.py
+++ b/scripts/mkvenv.py
@@ -31,7 +31,7 @@ import shutil
import venv as pyvenv
import subprocess
import platform
-from typing import List, Optional, Tuple, Dict, Union
+from typing import List, Tuple, Dict, Union
sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.pardir))
from scripts import utils, link_pyqt
@@ -92,9 +92,6 @@ def parse_args(argv: List[str] = None) -> argparse.Namespace:
parser.add_argument('--virtualenv',
action='store_true',
help="Use virtualenv instead of venv.")
- parser.add_argument('--asciidoc', help="Full path to asciidoc.py. "
- "If not given, asciidoc is searched in PATH.",
- nargs='?',)
parser.add_argument('--dev',
action='store_true',
help="Also install dev/test dependencies.")
@@ -475,17 +472,14 @@ def install_qutebrowser(venv_dir: pathlib.Path) -> None:
pip_install(venv_dir, '-e', str(REPO_ROOT))
-def regenerate_docs(venv_dir: pathlib.Path, asciidoc: Optional[str]):
+def regenerate_docs(venv_dir: pathlib.Path):
"""Regenerate docs using asciidoc."""
utils.print_title("Generating documentation")
- if asciidoc is not None:
- a2h_args = ['--asciidoc', asciidoc]
- else:
- a2h_args = []
- script_path = pathlib.Path(__file__).parent / 'asciidoc2html.py'
+ pip_install(venv_dir, '-r', str(requirements_file('docs')))
- print_command('python3 scripts/asciidoc2html.py', *a2h_args, venv=True)
- run_venv(venv_dir, 'python', str(script_path), *a2h_args)
+ script_path = pathlib.Path(__file__).parent / 'asciidoc2html.py'
+ print_command('python3 scripts/asciidoc2html.py', venv=True)
+ run_venv(venv_dir, 'python', str(script_path))
def update_repo():
@@ -558,7 +552,7 @@ def run(args) -> None:
if args.pyqt_type != 'skip' and not args.skip_smoke_test:
run_qt_smoke_test(venv_dir, pyqt_version=args.pyqt_version)
if not args.skip_docs:
- regenerate_docs(venv_dir, args.asciidoc)
+ regenerate_docs(venv_dir)
def main():
diff --git a/tests/end2end/features/utilcmds.feature b/tests/end2end/features/utilcmds.feature
index e8172ae20..621a7650b 100644
--- a/tests/end2end/features/utilcmds.feature
+++ b/tests/end2end/features/utilcmds.feature
@@ -11,7 +11,7 @@ Feature: Miscellaneous utility commands exposed to the user.
Scenario: :later before
When I run :later 500 scroll down
Then the page should not be scrolled
- # wait for scroll to execture so we don't ruin our future
+ # wait for scroll to execute so we don't ruin our future
And the page should be scrolled vertically
Scenario: :later after
diff --git a/tests/end2end/test_invocations.py b/tests/end2end/test_invocations.py
index a8f0dd9ae..3730c887f 100644
--- a/tests/end2end/test_invocations.py
+++ b/tests/end2end/test_invocations.py
@@ -846,7 +846,7 @@ def test_unavailable_backend(request, quteproc_new):
def test_json_logging_without_debug(request, quteproc_new, runtime_tmpdir):
args = _base_args(request.config) + ['--temp-basedir', ':quit']
args.remove('--debug')
- args.remove('about:blank') # interfers with :quit at the end
+ args.remove('about:blank') # interferes with :quit at the end
quteproc_new.exit_expected = True
quteproc_new.start(args, env={'XDG_RUNTIME_DIR': str(runtime_tmpdir)})
diff --git a/tests/unit/browser/test_navigate.py b/tests/unit/browser/test_navigate.py
index 427058c68..b96624d0a 100644
--- a/tests/unit/browser/test_navigate.py
+++ b/tests/unit/browser/test_navigate.py
@@ -26,10 +26,9 @@ from qutebrowser.browser import navigate
from qutebrowser.utils import urlutils
+@pytest.mark.usefixtures('config_stub')
class TestIncDec:
- pytestmark = pytest.mark.usefixtures('config_stub')
-
@pytest.mark.parametrize('incdec', ['increment', 'decrement'])
@pytest.mark.parametrize('value', [
'{}foo', 'foo{}', 'foo{}bar', '42foo{}'
diff --git a/tests/unit/browser/webkit/test_webkitelem.py b/tests/unit/browser/webkit/test_webkitelem.py
index c02af6b25..504f1d64a 100644
--- a/tests/unit/browser/webkit/test_webkitelem.py
+++ b/tests/unit/browser/webkit/test_webkitelem.py
@@ -678,10 +678,9 @@ class TestIsVisibleIframe:
assert not invalid_objects.elems[1]._is_visible(invalid_objects.frame)
+@pytest.mark.usefixtures('config_stub')
class TestRectOnView:
- pytestmark = pytest.mark.usefixtures('config_stub')
-
@pytest.mark.parametrize('js_rect', [
None, # real geometry via getElementRects
{}, # no geometry at all via getElementRects
diff --git a/tests/unit/completion/test_completer.py b/tests/unit/completion/test_completer.py
index 9218a1333..f8cfc9039 100644
--- a/tests/unit/completion/test_completer.py
+++ b/tests/unit/completion/test_completer.py
@@ -196,7 +196,7 @@ def _set_cmd_prompt(cmd, txt):
marks=pytest.mark.xfail(reason='issue #74')),
(':set -t -p |', 'section', '', []),
(':open -- |', None, '', []),
- (':gibberish nonesense |', None, '', []),
+ (':gibberish nonsense |', None, '', []),
('/:help|', None, '', []),
('::bind|', 'command', ':bind', []),
(':-w open |', None, '', []),
diff --git a/tests/unit/completion/test_histcategory.py b/tests/unit/completion/test_histcategory.py
index cb37fb784..648017cf0 100644
--- a/tests/unit/completion/test_histcategory.py
+++ b/tests/unit/completion/test_histcategory.py
@@ -36,7 +36,8 @@ def hist(data_tmpdir, config_stub):
db = sql.Database(str(data_tmpdir / 'test_histcategory.db'))
config_stub.val.completion.timestamp_format = '%Y-%m-%d'
config_stub.val.completion.web_history.max_items = -1
- return sql.SqlTable(db, 'CompletionHistory', ['url', 'title', 'last_atime'])
+ yield sql.SqlTable(db, 'CompletionHistory', ['url', 'title', 'last_atime'])
+ db.close() # pytest could re-use the filename
@pytest.mark.parametrize('pattern, before, after', [
diff --git a/tests/unit/config/test_configcommands.py b/tests/unit/config/test_configcommands.py
index c273fecc8..40dfa48f8 100644
--- a/tests/unit/config/test_configcommands.py
+++ b/tests/unit/config/test_configcommands.py
@@ -522,13 +522,12 @@ class TestUnsetAndClear:
assert yaml_value(name) == (usertypes.UNSET if save else 'never')
+@pytest.mark.usefixtures('config_tmpdir', 'data_tmpdir',
+ 'config_stub', 'key_config_stub')
class TestSource:
"""Test :config-source."""
- pytestmark = pytest.mark.usefixtures('config_tmpdir', 'data_tmpdir',
- 'config_stub', 'key_config_stub')
-
@pytest.mark.parametrize('location', ['default', 'absolute', 'relative'])
@pytest.mark.parametrize('clear', [True, False])
def test_config_source(self, tmp_path, commands, config_stub, config_tmpdir,
@@ -606,14 +605,13 @@ class TestSource:
assert str(excinfo.value) == expected
+@pytest.mark.usefixtures('config_tmpdir', 'data_tmpdir',
+ 'config_stub', 'key_config_stub',
+ 'qapp')
class TestEdit:
"""Tests for :config-edit."""
- pytestmark = pytest.mark.usefixtures('config_tmpdir', 'data_tmpdir',
- 'config_stub', 'key_config_stub',
- 'qapp')
-
def test_no_source(self, commands, mocker):
mock = mocker.patch('qutebrowser.config.configcommands.editor.'
'ExternalEditor._start_editor', autospec=True)
diff --git a/tests/unit/config/test_configfiles.py b/tests/unit/config/test_configfiles.py
index 6c14c86c3..394214a8b 100644
--- a/tests/unit/config/test_configfiles.py
+++ b/tests/unit/config/test_configfiles.py
@@ -942,10 +942,9 @@ def confpy(tmp_path, config_tmpdir, data_tmpdir, config_stub, key_config_stub):
return ConfPy(tmp_path)
+@pytest.mark.usefixtures('config_stub', 'key_config_stub')
class TestConfigPyModules:
- pytestmark = pytest.mark.usefixtures('config_stub', 'key_config_stub')
-
@pytest.fixture
def qbmodulepy(self, tmp_path):
return ConfPy(tmp_path, filename="qbmodule.py")
@@ -1002,12 +1001,11 @@ class TestConfigPyModules:
assert sys.path.count(tmp_path) == 1
+@pytest.mark.usefixtures('config_stub', 'key_config_stub')
class TestConfigPy:
"""Tests for ConfigAPI and read_config_py()."""
- pytestmark = pytest.mark.usefixtures('config_stub', 'key_config_stub')
-
def test_assertions(self, confpy):
"""Make sure assertions in config.py work for these tests."""
confpy.write('assert False')
diff --git a/tests/unit/javascript/test_js_quirks.py b/tests/unit/javascript/test_js_quirks.py
index da05a74a1..7f2940ea8 100644
--- a/tests/unit/javascript/test_js_quirks.py
+++ b/tests/unit/javascript/test_js_quirks.py
@@ -59,6 +59,12 @@ from qutebrowser.config import configdata
2,
id='array-at',
),
+ pytest.param(
+ QUrl("https://test.qutebrowser.org/linkedin"),
+ '[1, 2, 3].at(1)',
+ 2,
+ id='array-at',
+ ),
])
def test_js_quirks(config_stub, js_tester_webengine, base_url, source, expected):
config_stub.val.content.site_specific_quirks.skip = []
diff --git a/tox.ini b/tox.ini
index 4c72acaf5..b1f8f9ed4 100644
--- a/tox.ini
+++ b/tox.ini
@@ -16,7 +16,20 @@ setenv =
pyqt{62,63,64}: PYTEST_QT_API=pyqt6
pyqt{62,63,64}: QUTE_QT_WRAPPER=PyQt6
cov: PYTEST_ADDOPTS=--cov --cov-report xml --cov-report=html --cov-report=
-passenv = PYTHON DISPLAY XAUTHORITY HOME USERNAME USER CI XDG_* QUTE_* DOCKER QT_QUICK_BACKEND FORCE_COLOR DBUS_SESSION_BUS_ADDRESS
+passenv =
+ PYTHON
+ DISPLAY
+ XAUTHORITY
+ HOME
+ USERNAME
+ USER
+ CI
+ XDG_*
+ QUTE_*
+ DOCKER
+ QT_QUICK_BACKEND
+ FORCE_COLOR
+ DBUS_SESSION_BUS_ADDRESS
basepython =
py: {env:PYTHON:python3}
py3: {env:PYTHON:python3}
@@ -144,10 +157,12 @@ commands =
[testenv:docs]
basepython = {env:PYTHON:python3}
-whitelist_externals = git
-passenv = CI GITHUB_REF
+passenv =
+ CI
+ GITHUB_REF
deps =
-r{toxinidir}/requirements.txt
+ -r{toxinidir}/misc/requirements/requirements-docs.txt
-r{toxinidir}/misc/requirements/requirements-pyqt.txt
commands =
{envpython} scripts/dev/src2asciidoc.py {posargs}
@@ -156,7 +171,10 @@ commands =
[testenv:pyinstaller-{64,32}{,-qt6}]
basepython = {env:PYTHON:python3}
-passenv = APPDATA HOME PYINSTALLER_DEBUG
+passenv =
+ APPDATA
+ HOME
+ PYINSTALLER_DEBUG
setenv =
qt6: PYINSTALLER_QT6=true
deps =
@@ -171,19 +189,21 @@ commands =
basepython = python3
deps =
passenv = TERM
-whitelist_externals = eslint
+allowlist_externals = eslint
changedir = {toxinidir}/qutebrowser/javascript
commands = eslint --report-unused-disable-directives .
[testenv:shellcheck]
basepython = python3
deps =
-whitelist_externals = bash
+allowlist_externals = bash
commands = bash scripts/dev/run_shellcheck.sh {posargs}
[testenv:mypy-{pyqt5,pyqt6}]
basepython = {env:PYTHON:python3}
-passenv = TERM MYPY_FORCE_TERMINAL_WIDTH
+passenv =
+ TERM
+ MYPY_FORCE_TERMINAL_WIDTH
setenv =
pyqt6: QUTE_CONSTANTS_ARGS=--always-true=USE_PYQT6 --always-false=USE_PYQT5 --always-false=USE_PYSIDE2 --always-false=USE_PYSIDE6 --always-false=IS_QT5 --always-true=IS_QT6
pyqt5: QUTE_CONSTANTS_ARGS=--always-false=USE_PYQT6 --always-true=USE_PYQT5 --always-false=USE_PYSIDE2 --always-false=USE_PYSIDE6 --always-true=IS_QT5 --always-false=IS_QT6
@@ -205,7 +225,7 @@ commands =
[testenv:actionlint]
basepython = python3
deps =
-whitelist_externals = actionlint
+allowlist_externals = actionlint
commands =
actionlint
@@ -241,6 +261,7 @@ usedevelop = true
deps =
-r{toxinidir}/requirements.txt
-r{toxinidir}/misc/requirements/requirements-tox.txt
+ -r{toxinidir}/misc/requirements/requirements-docs.txt
!qt6: -r{toxinidir}/misc/requirements/requirements-pyqt.txt
qt6: -r{toxinidir}/misc/requirements/requirements-pyqt-6.txt
-r{toxinidir}/misc/requirements/requirements-dev.txt