From 5aafbfe38d425d9c86bd1ee268e605583aa321a4 Mon Sep 17 00:00:00 2001 From: Oliver Sauder Date: Mon, 5 Oct 2020 20:31:39 +0200 Subject: [PATCH] Add support for Django 3.1 --- .travis.yml | 15 +++++++ CHANGELOG.md | 8 ++-- README.rst | 2 +- docs/getting-started.md | 2 +- example/tests/test_errors.py | 7 ++- example/tests/test_parsers.py | 5 +-- example/urls_test.py | 84 +++++++++++++++++------------------ setup.py | 3 +- tox.ini | 3 +- 9 files changed, 73 insertions(+), 56 deletions(-) diff --git a/.travis.yml b/.travis.yml index 65266132..a70727aa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,9 @@ matrix: - env: TOXENV=py36-django30-drfmaster - env: TOXENV=py37-django30-drfmaster - env: TOXENV=py38-django30-drfmaster + - env: TOXENV=py36-django31-drfmaster + - env: TOXENV=py37-django31-drfmaster + - env: TOXENV=py38-django31-drfmaster include: - python: 3.6 @@ -32,6 +35,10 @@ matrix: env: TOXENV=py36-django30-drf312 - python: 3.6 env: TOXENV=py36-django30-drfmaster + - python: 3.6 + env: TOXENV=py36-django31-drf312 + - python: 3.6 + env: TOXENV=py36-django31-drfmaster - python: 3.7 env: TOXENV=py37-django22-drf312 @@ -41,6 +48,10 @@ matrix: env: TOXENV=py37-django30-drf312 - python: 3.7 env: TOXENV=py37-django30-drfmaster + - python: 3.7 + env: TOXENV=py37-django31-drf312 + - python: 3.7 + env: TOXENV=py37-django31-drfmaster - python: 3.8 env: TOXENV=py38-django22-drf312 @@ -50,6 +61,10 @@ matrix: env: TOXENV=py38-django30-drf312 - python: 3.8 env: TOXENV=py38-django30-drfmaster + - python: 3.8 + env: TOXENV=py38-django31-drf312 + - python: 3.8 + env: TOXENV=py38-django31-drfmaster install: - pip install tox diff --git a/CHANGELOG.md b/CHANGELOG.md index 4b872109..768fcba4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,15 +10,17 @@ any parts of the framework not mentioned in the documentation should generally b ## [Unreleased] +### Added + +* Added support for Django REST framework 3.12 +* Added support for Django 3.1 + ### Removed * Removed support for Django 1.11. * Removed support for Django 2.1. * Removed support for Django REST framework 3.10, 3.11 -### Added -* Added support for Django REST framework 3.12 - ## [3.2.0] - 2020-08-26 diff --git a/README.rst b/README.rst index 89656f22..f1d606bb 100644 --- a/README.rst +++ b/README.rst @@ -88,7 +88,7 @@ Requirements ------------ 1. Python (3.5, 3.6, 3.7, 3.8) -2. Django (2.2, 3.0) +2. Django (2.2, 3.0, 3.1) 3. Django REST Framework (3.12) We **highly** recommend and only officially support the latest patch release of each Python, Django and REST Framework series. diff --git a/docs/getting-started.md b/docs/getting-started.md index d6c88a3d..f16afd57 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -52,7 +52,7 @@ like the following: ## Requirements 1. Python (3.5, 3.6, 3.7, 3.8) -2. Django (2.2, 3.0) +2. Django (2.2, 3.0, 3.1) 3. Django REST Framework (3.12) We **highly** recommend and only officially support the latest patch release of each Python, Django and REST Framework series. diff --git a/example/tests/test_errors.py b/example/tests/test_errors.py index 75bc8842..305e14b9 100644 --- a/example/tests/test_errors.py +++ b/example/tests/test_errors.py @@ -1,7 +1,6 @@ import pytest -from django.conf.urls import url from django.test import override_settings -from django.urls import reverse +from django.urls import path, reverse from rest_framework import views from rest_framework_json_api import serializers @@ -51,8 +50,8 @@ def post(self, request, *args, **kwargs): urlpatterns = [ - url('entries-nested', DummyTestView.as_view(), - name='entries-nested-list') + path('entries-nested', DummyTestView.as_view(), + name='entries-nested-list') ] diff --git a/example/tests/test_parsers.py b/example/tests/test_parsers.py index be2b2ce3..38d7c6d7 100644 --- a/example/tests/test_parsers.py +++ b/example/tests/test_parsers.py @@ -1,9 +1,8 @@ import json from io import BytesIO -from django.conf.urls import url from django.test import TestCase, override_settings -from django.urls import reverse +from django.urls import path, reverse from rest_framework import status, views from rest_framework.exceptions import ParseError from rest_framework.response import Response @@ -104,7 +103,7 @@ def patch(self, request, *args, **kwargs): urlpatterns = [ - url(r'repeater$', DummyAPIView.as_view(), name='repeater'), + path('repeater', DummyAPIView.as_view(), name='repeater'), ] diff --git a/example/urls_test.py b/example/urls_test.py index 020ab2f3..44ae6f58 100644 --- a/example/urls_test.py +++ b/example/urls_test.py @@ -1,4 +1,4 @@ -from django.conf.urls import include, url +from django.conf.urls import re_path from rest_framework import routers from .api.resources.identity import GenericIdentity, Identity @@ -41,50 +41,50 @@ router.register(r'identities', Identity) urlpatterns = [ - url(r'^', include(router.urls)), - # old tests - url(r'identities/default/(?P\d+)$', - GenericIdentity.as_view(), name='user-default'), + re_path(r'identities/default/(?P\d+)$', + GenericIdentity.as_view(), name='user-default'), - url(r'^entries/(?P[^/.]+)/blog$', - BlogViewSet.as_view({'get': 'retrieve'}), - name='entry-blog' - ), - url(r'^entries/(?P[^/.]+)/comments$', - CommentViewSet.as_view({'get': 'list'}), - name='entry-comments' - ), - url(r'^entries/(?P[^/.]+)/suggested/$', - EntryViewSet.as_view({'get': 'list'}), - name='entry-suggested' - ), - url(r'^drf-entries/(?P[^/.]+)/suggested/$', - DRFEntryViewSet.as_view({'get': 'list'}), - name='drf-entry-suggested' - ), - url(r'entries/(?P[^/.]+)/authors$', - AuthorViewSet.as_view({'get': 'list'}), - name='entry-authors'), - url(r'entries/(?P[^/.]+)/featured$', - EntryViewSet.as_view({'get': 'retrieve'}), - name='entry-featured'), + re_path(r'^entries/(?P[^/.]+)/blog$', + BlogViewSet.as_view({'get': 'retrieve'}), + name='entry-blog' + ), + re_path(r'^entries/(?P[^/.]+)/comments$', + CommentViewSet.as_view({'get': 'list'}), + name='entry-comments' + ), + re_path(r'^entries/(?P[^/.]+)/suggested/$', + EntryViewSet.as_view({'get': 'list'}), + name='entry-suggested' + ), + re_path(r'^drf-entries/(?P[^/.]+)/suggested/$', + DRFEntryViewSet.as_view({'get': 'list'}), + name='drf-entry-suggested' + ), + re_path(r'entries/(?P[^/.]+)/authors$', + AuthorViewSet.as_view({'get': 'list'}), + name='entry-authors'), + re_path(r'entries/(?P[^/.]+)/featured$', + EntryViewSet.as_view({'get': 'retrieve'}), + name='entry-featured'), - url(r'^authors/(?P[^/.]+)/(?P\w+)/$', - AuthorViewSet.as_view({'get': 'retrieve_related'}), - name='author-related'), + re_path(r'^authors/(?P[^/.]+)/(?P\w+)/$', + AuthorViewSet.as_view({'get': 'retrieve_related'}), + name='author-related'), - url(r'^entries/(?P[^/.]+)/relationships/(?P\w+)$', - EntryRelationshipView.as_view(), - name='entry-relationships'), - url(r'^blogs/(?P[^/.]+)/relationships/(?P\w+)$', - BlogRelationshipView.as_view(), - name='blog-relationships'), - url(r'^comments/(?P[^/.]+)/relationships/(?P\w+)$', - CommentRelationshipView.as_view(), - name='comment-relationships'), - url(r'^authors/(?P[^/.]+)/relationships/(?P\w+)$', - AuthorRelationshipView.as_view(), - name='author-relationships'), + re_path(r'^entries/(?P[^/.]+)/relationships/(?P\w+)$', + EntryRelationshipView.as_view(), + name='entry-relationships'), + re_path(r'^blogs/(?P[^/.]+)/relationships/(?P\w+)$', + BlogRelationshipView.as_view(), + name='blog-relationships'), + re_path(r'^comments/(?P[^/.]+)/relationships/(?P\w+)$', + CommentRelationshipView.as_view(), + name='comment-relationships'), + re_path(r'^authors/(?P[^/.]+)/relationships/(?P\w+)$', + AuthorRelationshipView.as_view(), + name='author-relationships'), ] + +urlpatterns += router.urls diff --git a/setup.py b/setup.py index 19c1fa74..5053a63c 100755 --- a/setup.py +++ b/setup.py @@ -84,6 +84,7 @@ def get_package_data(package): 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', 'Topic :: Internet :: WWW/HTTP', 'Topic :: Software Development :: Libraries :: Application Frameworks', 'Topic :: Software Development :: Libraries :: Python Modules', @@ -91,7 +92,7 @@ def get_package_data(package): install_requires=[ 'inflection>=0.3.0', 'djangorestframework>=3.12,<3.13', - 'django>=2.2,<3.1', + 'django>=2.2,<3.2', ], extras_require={ 'django-polymorphic': ['django-polymorphic>=2.0'], diff --git a/tox.ini b/tox.ini index e4d1bb15..48b790ef 100644 --- a/tox.ini +++ b/tox.ini @@ -1,13 +1,14 @@ [tox] envlist = py{35,36,37,38}-django22-drf{312,master}, - py{36,37,38}-django30-drf{312,master}, + py{36,37,38}-django{30.31}-drf{312,master}, lint,docs [testenv] deps = django22: Django>=2.2,<2.3 django30: Django>=3.0,<3.1 + django31: Django>=3.1,<3.2 drf312: djangorestframework>=3.12,<3.13 drfmaster: https://github.com/encode/django-rest-framework/archive/master.zip -rrequirements/requirements-testing.txt