From 6a20dc070797516b6d56511f8434f58b1cad387f Mon Sep 17 00:00:00 2001 From: Matthias Kestenholz Date: Mon, 26 Feb 2024 12:53:45 +0100 Subject: [PATCH] Require at least Django 4.2 --- .pre-commit-config.yaml | 16 +++++----- CHANGELOG.rst | 1 + pyproject.toml | 16 +++++----- tests/testapp/test_feincms3.py | 54 ++++++++++++++++++++-------------- tox.ini | 6 ++-- 5 files changed, 52 insertions(+), 41 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b5b5f0c..42c4b56 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,30 +14,30 @@ repos: - id: mixed-line-ending - id: trailing-whitespace - repo: https://github.com/adamchainz/django-upgrade - rev: 1.15.0 + rev: 1.16.0 hooks: - id: django-upgrade - args: [--target-version, "3.2"] + args: [--target-version, "4.2"] - repo: https://github.com/MarcoGorelli/absolufy-imports rev: v0.3.1 hooks: - id: absolufy-imports - repo: https://github.com/astral-sh/ruff-pre-commit - rev: "v0.1.11" + rev: "v0.2.2" hooks: - id: ruff - id: ruff-format - repo: https://github.com/pre-commit/mirrors-prettier - rev: v3.1.0 + rev: v4.0.0-alpha.8 hooks: - id: prettier - args: [--list-different, --no-semi] - exclude: "^conf/|.*\\.html$" + entry: env PRETTIER_LEGACY_CLI=1 prettier + types_or: [javascript, css] - repo: https://github.com/tox-dev/pyproject-fmt - rev: 1.6.0 + rev: 1.7.0 hooks: - id: pyproject-fmt - repo: https://github.com/abravalheri/validate-pyproject - rev: v0.15 + rev: v0.16 hooks: - id: validate-pyproject diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 20ea1c1..2e1bdb3 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -7,6 +7,7 @@ Next version - Handle the case when a page's site and its parent's site do not match. - Added Python 3.12, Django 5.0. +- Dropped support for Django before 4.2. - Changed the ``DefaultLanguageListFilter`` to use the model admin's default empty value display, and allowed filtering for sites where a default value isn't set. diff --git a/pyproject.toml b/pyproject.toml index e6ced8d..bae836e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,7 +33,7 @@ dynamic = [ "version", ] dependencies = [ - "Django>=3.2", + "Django>=4.2", "feincms3>=4.5", ] [project.optional-dependencies] @@ -48,6 +48,11 @@ Homepage = "https://github.com/matthiask/feincms3-sites/" path = "feincms3_sites/__init__.py" [tool.ruff] +fix = true +show-fixes = true +target-version = "py39" + +[tool.ruff.lint] extend-select = [ # pyflakes, pycodestyle "F", "E", "W", @@ -90,18 +95,15 @@ extend-ignore = [ # No line length errors "E501", ] -fix = true -show-fixes = true -target-version = "py39" -[tool.ruff.isort] +[tool.ruff.lint.isort] combine-as-imports = true lines-after-imports = 2 -[tool.ruff.mccabe] +[tool.ruff.lint.mccabe] max-complexity = 15 -[tool.ruff.per-file-ignores] +[tool.ruff.lint.per-file-ignores] "*/migrat*/*" = [ # Allow using PascalCase model names in migrations "N806", diff --git a/tests/testapp/test_feincms3.py b/tests/testapp/test_feincms3.py index c351e30..4224ce9 100644 --- a/tests/testapp/test_feincms3.py +++ b/tests/testapp/test_feincms3.py @@ -490,7 +490,7 @@ def setUp(self): class MiddlewareNotUsedTestCase(CanonicalDomainMiddlewareTest): def test_request(self): self.assertContains( - self.client.get("/de/", HTTP_HOST="example.com"), "home - testapp" + self.client.get("/de/", headers={"host": "example.com"}), "home - testapp" ) @@ -503,7 +503,7 @@ def test_request(self): class ImproperlyConfiguredTest(CanonicalDomainMiddlewareTest): def test_request(self): with self.assertRaisesRegex(ImproperlyConfigured, "Current site unknown."): - self.client.get("/de/", HTTP_HOST="example.com") + self.client.get("/de/", headers={"host": "example.com"}) @override_settings( @@ -515,21 +515,21 @@ def test_request(self): ) class CanonicalDomainTestCase(CanonicalDomainMiddlewareTest): def test_http_requests(self): - response = self.client.get("/", HTTP_HOST="example.org") + response = self.client.get("/", headers={"host": "example.org"}) self.assertEqual(response.status_code, 301) self.assertEqual(response["Location"], "http://example.com/") self.assertContains( - self.client.get("/de/", HTTP_HOST="example.com"), "home - testapp" + self.client.get("/de/", headers={"host": "example.com"}), "home - testapp" ) def test_https_requests(self): - response = self.client.get("/", HTTP_HOST="example.org", secure=True) + response = self.client.get("/", headers={"host": "example.org"}, secure=True) self.assertEqual(response.status_code, 301) self.assertEqual(response["Location"], "https://example.com/") self.assertContains( - self.client.get("/de/", HTTP_HOST="example.com", secure=True), + self.client.get("/de/", headers={"host": "example.com"}, secure=True), "home - testapp", ) @@ -548,31 +548,31 @@ def test_http_redirects(self): self.assertEqual(response.status_code, 301) self.assertEqual(response["Location"], "https://example.com/") - response = self.client.get("/", HTTP_HOST="example.org") + response = self.client.get("/", headers={"host": "example.org"}) self.assertEqual(response.status_code, 301) self.assertEqual(response["Location"], "https://example.com/") def test_https_redirects(self): - response = self.client.get("/", HTTP_HOST="example.org", secure=True) + response = self.client.get("/", headers={"host": "example.org"}, secure=True) self.assertEqual(response.status_code, 301) self.assertEqual(response["Location"], "https://example.com/") def test_match(self): self.assertContains( - self.client.get("/de/", HTTP_HOST="example.com", secure=True), + self.client.get("/de/", headers={"host": "example.com"}, secure=True), "home - testapp", ) def test_other_site(self): """SSL redirect happens, but stays on secondary domain""" Site.objects.create(host="example.org") - response = self.client.get("/", HTTP_HOST="example.org") + response = self.client.get("/", headers={"host": "example.org"}) self.assertEqual(response.status_code, 301) self.assertEqual(response["Location"], "https://example.org/") @override_settings(DEBUG=True) def test_debug(self): - response = self.client.get("/", HTTP_HOST="example.org", secure=True) + response = self.client.get("/", headers={"host": "example.org"}, secure=True) self.assertEqual(response.status_code, 302) self.assertEqual(response["Location"], "https://example.com/") @@ -594,7 +594,7 @@ def test_debug(self): class ImproperlyConfiguredDLTest(CanonicalDomainMiddlewareTest): def test_request(self): with self.assertRaisesRegex(ImproperlyConfigured, "Current site unknown."): - self.client.get("/de/", HTTP_HOST="example.com") + self.client.get("/de/", headers={"host": "example.com"}) @override_settings( @@ -619,7 +619,7 @@ def test_language(self): Page.objects.create(title="de", slug="de", path="/de/", site=site) self.assertRedirects( - self.client.get("/", HTTP_HOST=site.host), + self.client.get("/", headers={"host": site.host}), "/de/", fetch_redirect_response=False, ) @@ -628,7 +628,7 @@ def test_language(self): site.save() self.assertRedirects( - self.client.get("/", HTTP_HOST=site.host), + self.client.get("/", headers={"host": site.host}), "/en/", fetch_redirect_response=False, ) @@ -637,19 +637,21 @@ def test_language(self): site.save() self.assertRedirects( - self.client.get("/", HTTP_HOST=site.host, HTTP_ACCEPT_LANGUAGE="de"), + self.client.get("/", headers={"host": site.host, "accept-language": "de"}), "/de/", fetch_redirect_response=False, ) self.assertRedirects( - self.client.get("/", HTTP_HOST=site.host, HTTP_ACCEPT_LANGUAGE="fr, en"), + self.client.get( + "/", headers={"host": site.host, "accept-language": "fr, en"} + ), "/en/", fetch_redirect_response=False, ) self.assertRedirects( - self.client.get("/", HTTP_HOST=site.host, HTTP_ACCEPT_LANGUAGE="fr"), + self.client.get("/", headers={"host": site.host, "accept-language": "fr"}), "/en/", fetch_redirect_response=False, ) @@ -661,20 +663,28 @@ def test_i18n_patterns(self): site = Site.objects.create(host="example.com") self.assertRedirects( - self.client.get("/i18n/", HTTP_HOST=site.host), "/en/i18n/" + self.client.get("/i18n/", headers={"host": site.host}), "/en/i18n/" ) - self.assertContains(self.client.get("/en/i18n/", HTTP_HOST=site.host), "en") - self.assertContains(self.client.get("/de/i18n/", HTTP_HOST=site.host), "de") + self.assertContains( + self.client.get("/en/i18n/", headers={"host": site.host}), "en" + ) + self.assertContains( + self.client.get("/de/i18n/", headers={"host": site.host}), "de" + ) self.assertRedirects( - self.client.get("/i18n/", HTTP_HOST=site.host, HTTP_ACCEPT_LANGUAGE="de"), + self.client.get( + "/i18n/", headers={"host": site.host, "accept-language": "de"} + ), "/de/i18n/", ) site.default_language = "en" site.save() self.assertRedirects( - self.client.get("/i18n/", HTTP_HOST=site.host, HTTP_ACCEPT_LANGUAGE="de"), + self.client.get( + "/i18n/", headers={"host": site.host, "accept-language": "de"} + ), "/en/i18n/", ) diff --git a/tox.ini b/tox.ini index 5fac7c5..456ff59 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,7 @@ [tox] envlist = - py{39,310}-dj{32,41,42} - py{310,311}-dj{32,41,42,50,main} + py{39,310}-dj{42} + py{310,311}-dj{42,50,main} py{312}-dj{42,50,main} [testenv] @@ -11,8 +11,6 @@ commands = python -Wd {envbindir}/coverage run tests/manage.py test -v2 --keepdb {posargs:testapp} coverage report -m deps = - dj32: Django>=3.2,<4.0 - dj41: Django>=4.1,<4.2 dj42: Django>=4.2,<5.0 dj42: Django>=4.2,<5.0 dj50: Django>=5.0,<5.1