summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2023-06-26 14:24:11 +0200
committerFlorian Bruhin <me@the-compiler.org>2023-06-26 14:39:54 +0200
commit93c7fdd60c0f1f0d26415525914fdca997b06c42 (patch)
treec102bdb52a4b079084ee6a9925e20de73a96d5ba
parentb9855b910448b504ab34ef11e91caab62c39c8e6 (diff)
downloadqutebrowser-93c7fdd60c0f1f0d26415525914fdca997b06c42.tar.gz
qutebrowser-93c7fdd60c0f1f0d26415525914fdca997b06c42.zip
Initial Python 3.7 drop
-rw-r--r--.flake82
-rw-r--r--.github/workflows/ci.yml8
-rw-r--r--.github/workflows/recompile-requirements.yml4
-rw-r--r--.mypy.ini2
-rw-r--r--.pylintrc3
-rw-r--r--README.asciidoc8
-rw-r--r--doc/changelog.asciidoc6
-rw-r--r--doc/contributing.asciidoc14
-rw-r--r--doc/install.asciidoc4
-rw-r--r--misc/requirements/requirements-mypy.txt-raw1
-rw-r--r--misc/requirements/requirements-pylint.txt5
-rw-r--r--misc/requirements/requirements-qutebrowser.txt-raw8
-rw-r--r--misc/requirements/requirements-tests.txt13
-rw-r--r--misc/requirements/requirements-tests.txt-raw7
-rw-r--r--qutebrowser/commands/command.py15
-rw-r--r--qutebrowser/misc/checkpyver.py4
-rw-r--r--qutebrowser/misc/earlyinit.py2
-rw-r--r--qutebrowser/utils/resources.py2
-rw-r--r--qutebrowser/utils/version.py19
-rw-r--r--requirements.txt5
-rw-r--r--scripts/dev/changelog_urls.json2
-rw-r--r--scripts/dev/recompile_requirements.py25
-rwxr-xr-xsetup.py5
-rw-r--r--tests/end2end/test_invocations.py4
-rw-r--r--tests/unit/misc/test_checkpyver.py2
-rw-r--r--tests/unit/utils/test_version.py20
-rw-r--r--tox.ini1
27 files changed, 54 insertions, 137 deletions
diff --git a/.flake8 b/.flake8
index 8460fa68d..01c259784 100644
--- a/.flake8
+++ b/.flake8
@@ -58,7 +58,7 @@ ignore =
PT004,
PT011,
PT012
-min-version = 3.7.0
+min-version = 3.8.0
max-complexity = 12
per-file-ignores =
qutebrowser/api/hook.py : N801
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index cd918b99a..d64f08de9 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -128,10 +128,10 @@ jobs:
fail-fast: false
matrix:
include:
- ### PyQt 5.15.2 (Python 3.7)
+ ### PyQt 5.15.2 (Python 3.8)
- testenv: py37-pyqt5152
os: ubuntu-20.04
- python: "3.7"
+ python: "3.8"
### PyQt 5.15 (Python 3.10, with coverage)
# FIXME:qt6
# - testenv: py310-pyqt515-cov
@@ -141,10 +141,10 @@ jobs:
- testenv: py311-pyqt515
os: ubuntu-20.04
python: "3.11"
- ### PyQt 6.2 (Python 3.7)
+ ### PyQt 6.2 (Python 3.8)
- testenv: py37-pyqt62
os: ubuntu-20.04
- python: "3.7"
+ python: "3.8"
### PyQt 6.3 (Python 3.8)
- testenv: py38-pyqt63
os: ubuntu-20.04
diff --git a/.github/workflows/recompile-requirements.yml b/.github/workflows/recompile-requirements.yml
index 0509a6226..623f11ca5 100644
--- a/.github/workflows/recompile-requirements.yml
+++ b/.github/workflows/recompile-requirements.yml
@@ -21,10 +21,6 @@ jobs:
- uses: actions/checkout@v3
with:
persist-credentials: false
- - name: Set up Python 3.7
- uses: actions/setup-python@v4
- with:
- python-version: '3.7'
- name: Set up Python 3.8
uses: actions/setup-python@v4
with:
diff --git a/.mypy.ini b/.mypy.ini
index 4679ce19f..03b5a0b1d 100644
--- a/.mypy.ini
+++ b/.mypy.ini
@@ -1,5 +1,5 @@
[mypy]
-python_version = 3.7
+python_version = 3.8
### --strict
warn_unused_configs = True
diff --git a/.pylintrc b/.pylintrc
index ba8feae00..b5a391288 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -20,7 +20,7 @@ load-plugins=qute_pylint.config,
pylint.extensions.dunder
persistent=n
-py-version=3.7
+py-version=3.8
[MESSAGES CONTROL]
enable=all
@@ -52,6 +52,7 @@ disable=locally-disabled,
too-few-public-methods,
import-outside-toplevel,
consider-using-f-string,
+ consider-using-assignment-expr,
logging-fstring-interpolation,
raise-missing-from,
consider-using-tuple,
diff --git a/README.asciidoc b/README.asciidoc
index 4335a871c..b3fd3331f 100644
--- a/README.asciidoc
+++ b/README.asciidoc
@@ -82,7 +82,7 @@ Requirements
The following software and libraries are required to run qutebrowser:
-* https://www.python.org/[Python] 3.7 or newer
+* https://www.python.org/[Python] 3.8 or newer
* https://www.qt.io/[Qt], either 6.2.0 or newer, or 5.15.0 or newer, with the following modules:
- QtCore / qtbase
- QtQuick (part of qtbase or qtdeclarative in some distributions)
@@ -103,7 +103,7 @@ websites and using it for transmission of sensitive data._
* https://palletsprojects.com/p/jinja/[jinja2]
* https://github.com/yaml/pyyaml[PyYAML]
-On older Python versions (3.7/3.8), the following backports are also required:
+On Python 3.8, the following backport is also required:
* https://importlib-resources.readthedocs.io/[importlib_resources]
@@ -119,10 +119,6 @@ The following libraries are optional:
QtWebEngine backend.
* On Windows, https://pypi.python.org/pypi/colorama/[colorama] for colored log
output.
-* https://importlib-metadata.readthedocs.io/[importlib_metadata] on Python 3.7,
- to improve QtWebEngine version detection when PyQtWebEngine is
- installed via pip (thus, this dependency usually isn't relevant for
- packagers).
* https://asciidoc.org/[asciidoc] to generate the documentation for the `:help`
command, when using the git repository (rather than a release).
diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc
index 5f2e945e6..20d940f0e 100644
--- a/doc/changelog.asciidoc
+++ b/doc/changelog.asciidoc
@@ -57,9 +57,9 @@ Added
Removed
~~~~~~~
-- Support for Python 3.6 is dropped, as it's been
- https://discuss.python.org/t/python-3-6-rides-into-the-sunset/12964[end-of-life upstream]
- since December 2021. Python 3.7.0 or newer is now required.
+- Python 3.8.0 or newer is now required.
+ - Support for Python 3.6 and 3.7 is dropped, as they both reached
+ their [end of life] in December 2021 and June 2023, respectively.
- Support for Qt/PyQt before 5.15.0 and QtWebEngine before 5.15.2 are now
dropped, as older Qt versions are
https://endoflife.date/qt[end-of-life upstream] since mid/late 2020
diff --git a/doc/contributing.asciidoc b/doc/contributing.asciidoc
index d99dc41ef..c2c791c89 100644
--- a/doc/contributing.asciidoc
+++ b/doc/contributing.asciidoc
@@ -111,9 +111,9 @@ unittests and several linters/checkers.
Currently, the following tox environments are available:
* Tests using https://www.pytest.org[pytest]:
- - `py37`, `py38`, ...: Run pytest for python 3.7/3.8/... with the system-wide PyQt.
- - `py37-pyqt512`, ..., `py37-pyqt515`: Run pytest with the given PyQt version (`py37-*` also works).
- - `py37-pyqt515-cov`: Run with coverage support (other Python/PyQt versions work too).
+ - `py38`, `py39`, ...: Run pytest for python 3.8/3.9/... with the system-wide PyQt.
+ - `py38-pyqt515`, ..., `py38-pyqt65`: Run pytest with the given PyQt version (`py39-*` etc. also works).
+ - `py38-pyqt515-cov`: Run with coverage support (other Python/PyQt versions work too).
* `flake8`: Run various linting checks via https://pypi.python.org/pypi/flake8[flake8].
* `vulture`: Run https://pypi.python.org/pypi/vulture[vulture] to find
unused code portions.
@@ -171,16 +171,16 @@ Examples:
----
# run only pytest tests which failed in last run:
-tox -e py37 -- --lf
+tox -e py38 -- --lf
# run only the end2end feature tests:
-tox -e py37 -- tests/end2end/features
+tox -e py38 -- tests/end2end/features
# run everything with undo in the generated name, based on the scenario text
-tox -e py37 -- tests/end2end/features/test_tabs_bdd.py -k undo
+tox -e py38 -- tests/end2end/features/test_tabs_bdd.py -k undo
# run coverage test for specific file (updates htmlcov/index.html)
-tox -e py37-cov -- tests/unit/browser/test_webelem.py
+tox -e py38-cov -- tests/unit/browser/test_webelem.py
----
Specifying the backend for tests
diff --git a/doc/install.asciidoc b/doc/install.asciidoc
index c8be798df..63c6e95fc 100644
--- a/doc/install.asciidoc
+++ b/doc/install.asciidoc
@@ -38,7 +38,7 @@ version (Qt 5.7, based on a Chromium from March 2016). Furthermore, it packages
Ubuntu 16.04 doesn't come with an up-to-date engine (a new enough QtWebKit, or
QtWebEngine) and also comes with Python 3.5.
-You should be able to install a newer Python (3.7+) using the
+You should be able to install a newer Python (3.8+) using the
https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa[deadsnakes PPA] or
https://github.com/pyenv/pyenv[pyenv], and then proceed to
<<tox,install qutebrowser in a virtualenv>>. However, this is currently untested. If you
@@ -452,7 +452,7 @@ This installs all needed Python dependencies in a `.venv` subfolder
This comes with an up-to-date Qt/PyQt including a pre-compiled QtWebEngine
binary, but has a few caveats:
-- Make sure your `python3` is Python 3.7 or newer, otherwise you'll get a "No
+- Make sure your `python3` is Python 3.8 or newer, otherwise you'll get a "No
matching distribution found" error and/or qutebrowser will not run.
- It only works on 64-bit x86 systems, with other architectures you'll get the
same error.
diff --git a/misc/requirements/requirements-mypy.txt-raw b/misc/requirements/requirements-mypy.txt-raw
index dd00d3219..53a2e82f3 100644
--- a/misc/requirements/requirements-mypy.txt-raw
+++ b/misc/requirements/requirements-mypy.txt-raw
@@ -7,4 +7,3 @@ types-PyYAML
# So stubs are available even on newer Python versions
importlib_resources
-importlib_metadata
diff --git a/misc/requirements/requirements-pylint.txt b/misc/requirements/requirements-pylint.txt
index 4337b583d..fd5e29978 100644
--- a/misc/requirements/requirements-pylint.txt
+++ b/misc/requirements/requirements-pylint.txt
@@ -8,7 +8,7 @@ cryptography==41.0.1
dill==0.3.6
github3.py==4.0.1
idna==3.4
-isort==5.11.5
+isort==5.12.0
lazy-object-proxy==1.9.0
mccabe==0.7.0
pefile==2023.2.7
@@ -20,10 +20,7 @@ python-dateutil==2.8.2
./scripts/dev/pylint_checkers
requests==2.31.0
six==1.16.0
-tomli==2.0.1
tomlkit==0.11.8
-typed-ast==1.5.4 ; python_version<"3.8"
-typing_extensions==4.6.3
uritemplate==4.1.1
# urllib3==2.0.3
wrapt==1.15.0
diff --git a/misc/requirements/requirements-qutebrowser.txt-raw b/misc/requirements/requirements-qutebrowser.txt-raw
index 4c1d32ae7..bd33e26e4 100644
--- a/misc/requirements/requirements-qutebrowser.txt-raw
+++ b/misc/requirements/requirements-qutebrowser.txt-raw
@@ -20,10 +20,4 @@ Pygments # For :view-source --pygments or on QtWebKit
colorama # Colored log output on Windows
adblock # Improved adblocking
-# Optional, only relevant when installing PyQt5/PyQtWebEngine via pip.
-importlib-metadata # Determining PyQt version
-typing_extensions # from importlib-metadata
-
-#@ markers: importlib-resources python_version=="3.7.*" or python_version=="3.8.*"
-#@ markers: importlib-metadata python_version=="3.7.*"
-#@ markers: typing_extensions python_version<"3.8"
+#@ markers: importlib-resources python_version=="3.8.*"
diff --git a/misc/requirements/requirements-tests.txt b/misc/requirements/requirements-tests.txt
index 6ab512bd5..abc44017a 100644
--- a/misc/requirements/requirements-tests.txt
+++ b/misc/requirements/requirements-tests.txt
@@ -8,17 +8,15 @@ charset-normalizer==3.1.0
cheroot==10.0.0
click==8.1.3
coverage==7.2.7
-exceptiongroup==1.1.1
execnet==1.9.0
filelock==3.12.2
-Flask==2.3.2 ; python_version>="3.8"
+Flask==2.3.2
hunter==3.6.1
hypothesis==6.79.3
idna==3.4
-importlib-metadata==6.7.0
iniconfig==2.0.0
itsdangerous==2.1.2
-jaraco.functools==3.8.0 ; python_version>="3.8"
+jaraco.functools==3.8.0
# Jinja2==3.1.2
Mako==1.2.4
manhole==1.8.0
@@ -49,12 +47,7 @@ sortedcontainers==2.4.0
soupsieve==2.4.1
tldextract==3.4.4
toml==0.10.2
-tomli==2.0.1
typing_extensions==4.6.3
urllib3==2.0.3
vulture==2.7
-Werkzeug==2.3.6 ; python_version>="3.8"
-zipp==3.15.0
-Flask==2.2.5 ; python_version=="3.7.*"
-Werkzeug==2.2.3 ; python_version=="3.7.*"
-jaraco.functools<3.8.0 ; python_version=="3.7.*"
+Werkzeug==2.3.6
diff --git a/misc/requirements/requirements-tests.txt-raw b/misc/requirements/requirements-tests.txt-raw
index bb4eb9bfa..54e036106 100644
--- a/misc/requirements/requirements-tests.txt-raw
+++ b/misc/requirements/requirements-tests.txt-raw
@@ -32,10 +32,3 @@ pytest-xdist
tldextract
#@ ignore: Jinja2, MarkupSafe, colorama
-# Python 3.7
-#@ markers: Flask python_version>="3.8"
-#@ add: Flask==2.2.5 ; python_version=="3.7.*"
-#@ markers: Werkzeug python_version>="3.8"
-#@ add: Werkzeug==2.2.3 ; python_version=="3.7.*"
-#@ markers: jaraco.functools python_version>="3.8"
-#@ add: jaraco.functools<3.8.0 ; python_version=="3.7.*"
diff --git a/qutebrowser/commands/command.py b/qutebrowser/commands/command.py
index eee5b7cde..cfae87958 100644
--- a/qutebrowser/commands/command.py
+++ b/qutebrowser/commands/command.py
@@ -403,21 +403,12 @@ class Command:
raise TypeError("{}: Legacy tuple type annotation!".format(
self.name))
- try:
- origin = typing.get_origin(typ) # type: ignore[attr-defined]
- except AttributeError:
- # typing.get_origin was added in Python 3.8
- origin = getattr(typ, '__origin__', None)
-
+ origin = typing.get_origin(typ)
if origin is Union:
- try:
- types = list(typing.get_args(typ)) # type: ignore[attr-defined]
- except AttributeError:
- # typing.get_args was added in Python 3.8
- types = list(typ.__args__)
-
+ types = list(typing.get_args(typ))
if param.default is not inspect.Parameter.empty:
types.append(type(param.default))
+
choices = self.get_arg_info(param).choices
value = argparser.multitype_conv(param, types, value,
str_choices=choices)
diff --git a/qutebrowser/misc/checkpyver.py b/qutebrowser/misc/checkpyver.py
index 82fe3d70f..ad22affa1 100644
--- a/qutebrowser/misc/checkpyver.py
+++ b/qutebrowser/misc/checkpyver.py
@@ -43,11 +43,11 @@ except ImportError: # pragma: no cover
# to stderr.
def check_python_version():
"""Check if correct python version is run."""
- if sys.hexversion < 0x03070000:
+ if sys.hexversion < 0x03080000:
# We don't use .format() and print_function here just in case someone
# still has < 2.6 installed.
version_str = '.'.join(map(str, sys.version_info[:3]))
- text = ("At least Python 3.7 is required to run qutebrowser, but " +
+ text = ("At least Python 3.8 is required to run qutebrowser, but " +
"it's running with " + version_str + ".\n")
show_errors = '--no-err-windows' not in sys.argv
diff --git a/qutebrowser/misc/earlyinit.py b/qutebrowser/misc/earlyinit.py
index 40f6dbd49..8dcf0dce0 100644
--- a/qutebrowser/misc/earlyinit.py
+++ b/qutebrowser/misc/earlyinit.py
@@ -19,7 +19,7 @@
"""Things which need to be done really early (e.g. before importing Qt).
-At this point we can be sure we have all python 3.7 features available.
+At this point we can be sure we have all python 3.8 features available.
"""
try:
diff --git a/qutebrowser/utils/resources.py b/qutebrowser/utils/resources.py
index 796d8457b..e21482dba 100644
--- a/qutebrowser/utils/resources.py
+++ b/qutebrowser/utils/resources.py
@@ -27,7 +27,7 @@ import pathlib
from typing import Iterator, Iterable, Union
-# We cannot use the stdlib version on 3.7-3.8 because we need the files() API.
+# We cannot use the stdlib version on 3.8 because we need the files() API.
if sys.version_info >= (3, 11): # pragma: no cover
# https://github.com/python/cpython/issues/90276
import importlib.resources as importlib_resources
diff --git a/qutebrowser/utils/version.py b/qutebrowser/utils/version.py
index 0cebead58..83171ba6a 100644
--- a/qutebrowser/utils/version.py
+++ b/qutebrowser/utils/version.py
@@ -33,6 +33,7 @@ import datetime
import getpass
import functools
import dataclasses
+import importlib.metadata
from typing import (Mapping, Optional, Sequence, Tuple, ClassVar, Dict, cast,
TYPE_CHECKING)
@@ -520,19 +521,9 @@ def _get_pyqt_webengine_qt_version() -> Optional[str]:
PyQtWebEngine 5.15.4 renamed it to PyQtWebEngine-Qt5...:
https://www.riverbankcomputing.com/pipermail/pyqt/2021-March/043699.html
- Here, we try to use importlib.metadata or its backport (optional dependency) to
- figure out that version number. If PyQtWebEngine is installed via pip, this will
- give us an accurate answer.
+ Here, we try to use importlib.metadata to figure out that version number.
+ If PyQtWebEngine is installed via pip, this will give us an accurate answer.
"""
- try:
- import importlib.metadata as importlib_metadata # type: ignore[import]
- except ImportError:
- try:
- import importlib_metadata
- except ImportError:
- log.misc.debug("Neither importlib.metadata nor backport available")
- return None
-
names = (
['PyQt6-WebEngine-Qt6']
if machinery.IS_QT6 else
@@ -541,8 +532,8 @@ def _get_pyqt_webengine_qt_version() -> Optional[str]:
for name in names:
try:
- return importlib_metadata.version(name)
- except importlib_metadata.PackageNotFoundError:
+ return importlib.metadata.version(name)
+ except importlib.metadata.PackageNotFoundError:
log.misc.debug(f"{name} not found")
return None
diff --git a/requirements.txt b/requirements.txt
index ec5aee3e1..b0c1444f8 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,14 +2,11 @@
adblock==0.6.0
colorama==0.4.6
-importlib-metadata==6.7.0 ; python_version=="3.7.*"
-importlib-resources==5.12.0 ; python_version=="3.7.*" or python_version=="3.8.*"
+importlib-resources==5.12.0 ; python_version=="3.8.*"
Jinja2==3.1.2
MarkupSafe==2.1.3
Pygments==2.15.1
PyYAML==6.0
-typing_extensions==4.6.3 ; python_version<"3.8"
-zipp==3.15.0
# Unpinned due to recompile_requirements.py limitations
pyobjc-core ; sys_platform=="darwin"
pyobjc-framework-Cocoa ; sys_platform=="darwin"
diff --git a/scripts/dev/changelog_urls.json b/scripts/dev/changelog_urls.json
index 4141a2ebc..1c9528f22 100644
--- a/scripts/dev/changelog_urls.json
+++ b/scripts/dev/changelog_urls.json
@@ -23,7 +23,6 @@
"Flask": "https://flask.palletsprojects.com/en/latest/changes/",
"Mako": "https://docs.makotemplates.org/en/latest/changelog.html",
"hypothesis": "https://hypothesis.readthedocs.io/en/latest/changes.html",
- "exceptiongroup": "https://github.com/agronholm/exceptiongroup/blob/main/CHANGES.rst",
"mypy": "https://mypy-lang.blogspot.com/",
"types-PyYAML": "https://github.com/python/typeshed/commits/main/stubs/PyYAML",
"pytest": "https://docs.pytest.org/en/latest/changelog.html",
@@ -84,7 +83,6 @@
"pyinstaller": "https://pyinstaller.readthedocs.io/en/stable/CHANGES.html",
"pyinstaller-hooks-contrib": "https://github.com/pyinstaller/pyinstaller-hooks-contrib/blob/master/CHANGELOG.rst",
"pytest-benchmark": "https://pytest-benchmark.readthedocs.io/en/stable/changelog.html",
- "typed-ast": "https://github.com/python/typed_ast/commits/master",
"docutils": "https://docutils.sourceforge.io/RELEASE-NOTES.html",
"bump2version": "https://github.com/c4urself/bump2version/blob/master/CHANGELOG.md",
"six": "https://github.com/benjaminp/six/blob/master/CHANGES",
diff --git a/scripts/dev/recompile_requirements.py b/scripts/dev/recompile_requirements.py
index 365f9a51e..8459031e2 100644
--- a/scripts/dev/recompile_requirements.py
+++ b/scripts/dev/recompile_requirements.py
@@ -144,11 +144,11 @@ def run_pip(venv_dir, *args, quiet=False, **kwargs):
return subprocess.run([venv_python, '-m', 'pip'] + args, check=True, **kwargs)
-def init_venv(host_python, venv_dir, requirements, pre=False, pip_args=None):
+def init_venv(venv_dir, requirements, pre=False, pip_args=None):
"""Initialize a new virtualenv and install the given packages."""
with utils.gha_group('Creating virtualenv'):
utils.print_col('$ python3 -m venv {}'.format(venv_dir), 'blue')
- subprocess.run([host_python, '-m', 'venv', venv_dir], check=True)
+ subprocess.run([sys.executable, '-m', 'venv', venv_dir], check=True)
run_pip(venv_dir, 'install', '-U', 'pip', quiet=not utils.ON_CI)
run_pip(venv_dir, 'install', '-U', 'setuptools', 'wheel', quiet=not utils.ON_CI)
@@ -347,17 +347,6 @@ def print_changed_files():
print('::set-output name=diff::' + diff_table)
-def get_host_python(name):
- """Get the Python to use for a given requirement name.
-
- pylint installs typed_ast on < 3.8 only
- """
- if name == 'pylint':
- return 'python3.7'
- else:
- return sys.executable
-
-
def get_venv_python(venv_dir):
"""Get the path to Python inside a virtualenv."""
subdir = 'Scripts' if os.name == 'nt' else 'bin'
@@ -375,14 +364,12 @@ def build_requirements(name):
"""Build a requirements file."""
utils.print_subtitle("Building")
filename = os.path.join(REQ_DIR, 'requirements-{}.txt-raw'.format(name))
- host_python = get_host_python(name)
with open(filename, 'r', encoding='utf-8') as f:
comments = read_comments(f)
with tempfile.TemporaryDirectory() as tmpdir:
- init_venv(host_python=host_python,
- venv_dir=tmpdir,
+ init_venv(venv_dir=tmpdir,
requirements=filename,
pre=comments['pre'],
pip_args=comments['pip_args'])
@@ -411,14 +398,13 @@ def build_requirements(name):
def test_tox():
"""Test requirements via tox."""
- host_python = get_host_python('tox')
req_path = os.path.join(REQ_DIR, 'requirements-tox.txt')
with tempfile.TemporaryDirectory() as tmpdir:
venv_dir = os.path.join(tmpdir, 'venv')
tox_workdir = os.path.join(tmpdir, 'tox-workdir')
venv_python = get_venv_python(venv_dir)
- init_venv(host_python, venv_dir, req_path)
+ init_venv(venv_dir, req_path)
list_proc = subprocess.run([venv_python, '-m', 'tox', '--listenvs'],
check=True,
stdout=subprocess.PIPE,
@@ -448,9 +434,8 @@ def test_requirements(name, outfile, *, force=False):
with open(in_file, 'r', encoding='utf-8') as f:
comments = read_comments(f)
- host_python = get_host_python(name)
with tempfile.TemporaryDirectory() as tmpdir:
- init_venv(host_python, tmpdir, outfile, pip_args=comments['pip_args'])
+ init_venv(tmpdir, outfile, pip_args=comments['pip_args'])
def cleanup_pylint_build():
diff --git a/setup.py b/setup.py
index cb088e04c..187d0902b 100755
--- a/setup.py
+++ b/setup.py
@@ -73,7 +73,7 @@ try:
zip_safe=True,
install_requires=['jinja2', 'PyYAML',
'importlib_resources>=1.1.0; python_version < "3.9"'],
- python_requires='>=3.7',
+ python_requires='>=3.8',
name='qutebrowser',
version=_get_constant('version'),
description=_get_constant('description'),
@@ -95,9 +95,10 @@ try:
'Operating System :: MacOS',
'Operating System :: POSIX :: BSD',
'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9',
+ 'Programming Language :: Python :: 3.10',
+ 'Programming Language :: Python :: 3.11',
'Topic :: Internet',
'Topic :: Internet :: WWW/HTTP',
'Topic :: Internet :: WWW/HTTP :: Browsers',
diff --git a/tests/end2end/test_invocations.py b/tests/end2end/test_invocations.py
index ce38eec24..a86782c1c 100644
--- a/tests/end2end/test_invocations.py
+++ b/tests/end2end/test_invocations.py
@@ -336,7 +336,7 @@ def test_command_on_start(request, quteproc_new):
quteproc_new.wait_for_quit()
-@pytest.mark.parametrize('python', ['python2', 'python3.6'])
+@pytest.mark.parametrize('python', ['python2', 'python3.6', 'python3.7'])
def test_launching_with_old_python(python):
try:
proc = subprocess.run(
@@ -346,7 +346,7 @@ def test_launching_with_old_python(python):
except FileNotFoundError:
pytest.skip(f"{python} not found")
assert proc.returncode == 1
- error = "At least Python 3.7 is required to run qutebrowser"
+ error = "At least Python 3.8 is required to run qutebrowser"
assert proc.stderr.decode('ascii').startswith(error)
diff --git a/tests/unit/misc/test_checkpyver.py b/tests/unit/misc/test_checkpyver.py
index 35f8cfeec..ffadec31b 100644
--- a/tests/unit/misc/test_checkpyver.py
+++ b/tests/unit/misc/test_checkpyver.py
@@ -28,7 +28,7 @@ import pytest
from qutebrowser.misc import checkpyver
-TEXT = (r"At least Python 3.7 is required to run qutebrowser, but it's "
+TEXT = (r"At least Python 3.8 is required to run qutebrowser, but it's "
r"running with \d+\.\d+\.\d+.")
diff --git a/tests/unit/utils/test_version.py b/tests/unit/utils/test_version.py
index fe48f9fe7..3d0fe7b9f 100644
--- a/tests/unit/utils/test_version.py
+++ b/tests/unit/utils/test_version.py
@@ -29,6 +29,7 @@ import logging
import textwrap
import datetime
import dataclasses
+import importlib.metadata
import pytest
import hypothesis
@@ -1107,23 +1108,9 @@ class TestChromiumVersion:
monkeypatch.setattr(elf, 'parse_webenginecore', lambda: None)
@pytest.fixture
- def patch_no_importlib(self, monkeypatch, stubs):
- """Simulate missing importlib modules."""
- import_fake = stubs.ImportFake({
- 'importlib_metadata': False,
- 'importlib.metadata': False,
- }, monkeypatch)
- import_fake.patch()
-
- @pytest.fixture
def importlib_patcher(self, monkeypatch):
"""Patch the importlib module."""
def _patch(*, qt, qt5, qt6):
- try:
- import importlib.metadata as importlib_metadata
- except ImportError:
- importlib_metadata = pytest.importorskip("importlib_metadata")
-
def _fake_version(name):
if name == 'PyQtWebEngine-Qt':
outcome = qt
@@ -1135,10 +1122,10 @@ class TestChromiumVersion:
raise utils.Unreachable(name)
if outcome is None:
- raise importlib_metadata.PackageNotFoundError(name)
+ raise importlib.metadata.PackageNotFoundError(name)
return outcome
- monkeypatch.setattr(importlib_metadata, 'version', _fake_version)
+ monkeypatch.setattr(importlib.metadata, 'version', _fake_version)
return _patch
@@ -1150,7 +1137,6 @@ class TestChromiumVersion:
@pytest.mark.parametrize('patches, sources', [
(['no_api'], ['ELF', 'importlib', 'PyQt', 'Qt']),
(['no_api', 'elf_fail'], ['importlib', 'PyQt', 'Qt']),
- (['no_api', 'elf_fail', 'no_importlib'], ['PyQt', 'Qt']),
(['no_api', 'elf_fail', 'importlib_no_package'], ['PyQt', 'Qt']),
], ids=','.join)
def test_simulated(self, request, patches, sources):
diff --git a/tox.ini b/tox.ini
index 9dc56737d..a96c155f4 100644
--- a/tox.ini
+++ b/tox.ini
@@ -35,7 +35,6 @@ passenv =
basepython =
py: {env:PYTHON:python3}
py3: {env:PYTHON:python3}
- py37: {env:PYTHON:python3.7}
py38: {env:PYTHON:python3.8}
py39: {env:PYTHON:python3.9}
py310: {env:PYTHON:python3.10}