Upgrade to Django 5.2 & Python 3.12 (#249)
Some checks failed
Test / build (3.10, 5) (push) Has been cancelled
Test / build (3.10, 6) (push) Has been cancelled
Test / build (3.10, 7) (push) Has been cancelled
Test / build (3.11, 5) (push) Has been cancelled
Test / build (3.11, 6) (push) Has been cancelled
Test / build (3.11, 7) (push) Has been cancelled
Test / build (3.12, 5) (push) Has been cancelled
Test / build (3.12, 6) (push) Has been cancelled
Test / build (3.12, 7) (push) Has been cancelled
Test / build (3.13, 5) (push) Has been cancelled
Test / build (3.13, 6) (push) Has been cancelled
Test / build (3.13, 7) (push) Has been cancelled
Test / build (3.9, 5) (push) Has been cancelled
Test / build (3.9, 6) (push) Has been cancelled
Test / build (3.9, 7) (push) Has been cancelled

* feat: add support for Django 5.0, 5.1, and 5.2
* fix: resolve Python 3.12 build failures in docs and lint environments
This commit is contained in:
Hesam Noorin 2026-02-01 19:58:21 +03:30 committed by GitHub
parent 289af19ce9
commit daa6235caf
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 45 additions and 26 deletions

View file

@ -7,6 +7,7 @@ include CODE_OF_CONDUCT.md
include requirements.txt include requirements.txt
include tox.ini include tox.ini
include .pre-commit-config.yaml include .pre-commit-config.yaml
include .readthedocs.yaml
recursive-include docs * recursive-include docs *
recursive-include exampleapp * recursive-include exampleapp *
recursive-include defender/templates *.html recursive-include defender/templates *.html

View file

@ -108,8 +108,8 @@ Admin pages
Requirements Requirements
------------ ------------
* Python: 3.7, 3.8, 3.9, 3.10, PyPy * Python: 3.8, 3.9, 3.10, 3.11, 3.12, PyPy
* Django: 3.x, 4.x * Django: 3.2, 4.2, 5.0, 5.1, 5.2
* Redis: 5.x, 6.x, 7.x * Redis: 5.x, 6.x, 7.x
@ -534,8 +534,8 @@ Below is a sample ``BasicAuthenticationDefender`` class based on ``rest_framewor
from django.contrib.auth.forms import PasswordResetForm, SetPasswordForm from django.contrib.auth.forms import PasswordResetForm, SetPasswordForm
from django.contrib.auth.tokens import default_token_generator from django.contrib.auth.tokens import default_token_generator
from django.utils.http import urlsafe_base64_decode as uid_decoder from django.utils.http import urlsafe_base64_decode as uid_decoder
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.utils.encoding import force_text from django.utils.encoding import force_str
from rest_framework import serializers, exceptions, HTTP_HEADER_ENCODING from rest_framework import serializers, exceptions, HTTP_HEADER_ENCODING
from rest_framework.exceptions import ValidationError from rest_framework.exceptions import ValidationError
from defender import utils as defender_utils from defender import utils as defender_utils

View file

@ -13,7 +13,11 @@
# import os # import os
# import sys # import sys
# sys.path.insert(0, os.path.abspath(".")) # sys.path.insert(0, os.path.abspath("."))
from pkg_resources import get_distribution try:
from importlib import metadata
except ImportError:
# Running on pre-3.8 Python; use importlib-metadata package
import importlib_metadata as metadata
# -- Project information ----------------------------------------------------- # -- Project information -----------------------------------------------------
@ -22,7 +26,11 @@ copyright = "2024, Ken Cochrane"
author = "Ken Cochrane" author = "Ken Cochrane"
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = get_distribution("django-defender").version try:
release = metadata.version("django-defender")
except metadata.PackageNotFoundError:
# package is not installed
release = "0.0.0"
# The short X.Y version. # The short X.Y version.
version = ".".join(release.split(".")[:2]) version = ".".join(release.split(".")[:2])
@ -38,7 +46,7 @@ master_doc = "index"
extensions = [] extensions = []
# Add any paths that contain templates here, relative to this directory. # Add any paths that contain templates here, relative to this directory.
templates_path = ["_templates"] templates_path = []
# List of patterns, relative to source directory, that match files and # List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files. # directories to ignore when looking for source files.
@ -56,4 +64,4 @@ html_theme = "sphinx_rtd_theme"
# Add any paths that contain custom static files (such as style sheets) here, # Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files, # relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css". # so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ["_static"] html_static_path = []

View file

@ -34,16 +34,21 @@ setup(
"Framework :: Django :: 3.2", "Framework :: Django :: 3.2",
"Framework :: Django :: 4.0", "Framework :: Django :: 4.0",
"Framework :: Django :: 4.1", "Framework :: Django :: 4.1",
"Framework :: Django :: 4.2",
"Framework :: Django :: 5.0",
"Framework :: Django :: 5.1",
"Framework :: Django :: 5.2",
"Intended Audience :: Developers", "Intended Audience :: Developers",
"License :: OSI Approved :: Apache Software License", "License :: OSI Approved :: Apache Software License",
"Operating System :: OS Independent", "Operating System :: OS Independent",
"Programming Language :: Python", "Programming Language :: Python",
'Programming Language :: Python :: 3', "Programming Language :: Python :: 3",
'Programming Language :: Python :: 3 :: Only', "Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: Implementation :: PyPy", "Programming Language :: Python :: Implementation :: PyPy",
"Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: CPython",
"Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
@ -59,12 +64,12 @@ setup(
include_package_data=True, include_package_data=True,
packages=find_packages(), packages=find_packages(),
package_data=get_package_data("defender"), package_data=get_package_data("defender"),
python_requires='~=3.7', python_requires="~=3.8",
install_requires=["Django", "redis"], install_requires=["Django", "redis>=4.0.0"],
tests_require=[ tests_require=[
"mockredispy>=2.9.0.11,<3.0", "mockredispy>=2.9.0.11,<3.0",
"coverage", "coverage",
"celery", "celery",
"django-redis-cache", "django-redis",
], ],
) )

29
tox.ini
View file

@ -1,27 +1,29 @@
[tox] [tox]
envlist = envlist =
# list of supported Django/Python versions: # list of supported Django/Python versions:
py{37,38,39,py3}-dj{32} py{38,39,py3}-dj{32}
py{38,39,310,311}-dj{40,41,42} py{38,39,310,311,312}-dj{42}
py{311}-dj{main} py{310,311,312}-dj{50,51,52,main}
py38-{lint,docs} py312-{lint,docs}
[gh-actions] [gh-actions]
python = python =
3.7: py37
3.8: py38 3.8: py38
3.9: py39 3.9: py39
3.10: py310 3.10: py310
3.11: py311 3.11: py311
3.12: py312
pypy3: pypy3 pypy3: pypy3
[testenv] [testenv]
deps = deps =
setuptools
-rrequirements.txt -rrequirements.txt
dj32: django>=3.2,<4.0 dj32: django>=3.2,<4.0
dj40: django>=4.0,<4.1 dj42: django>=4.2,<5.0
dj41: django>=4.1,<4.2 dj50: django>=5.0,<5.1
dj42: django>=4.2,<4.3 dj51: django>=5.1,<5.2
dj52: django>=5.2,<5.3
djmain: https://github.com/django/django/archive/main.tar.gz djmain: https://github.com/django/django/archive/main.tar.gz
usedevelop = True usedevelop = True
commands = commands =
@ -33,19 +35,22 @@ ignore_outcome =
ignore_errors = ignore_errors =
djmain: True djmain: True
[testenv:py38-docs] [testenv:py312-docs]
basepython = python3.8 basepython = python3.12
deps = deps =
-rrequirements.txt -rrequirements.txt
Sphinx Sphinx
sphinx_rtd_theme sphinx_rtd_theme
setuptools
commands = sphinx-build -b html -d {envtmpdir}/doctrees docs {envtmpdir}/html commands = sphinx-build -b html -d {envtmpdir}/doctrees docs {envtmpdir}/html
[testenv:py38-lint] [testenv:py312-lint]
basepython = python3.8 basepython = python3.12
deps = deps =
twine twine
check-manifest check-manifest
setuptools
setuptools_scm
commands = commands =
check-manifest -v check-manifest -v
python setup.py sdist python setup.py sdist