diff --git a/.travis.yml b/.travis.yml index dbef5c0b..7ee053ef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,12 +4,13 @@ python: - '3.5' - '3.6' - '3.7' + - '3.8-dev' dist: xenial cache: pip -jobs: +matrix: include: - python: '3.6' env: TOXENV=docs @@ -38,6 +39,7 @@ jobs: allow_failures: - env: TOXENV=lint - env: TOXENV=djmaster + - python: '3.8-dev' fast_finish: true @@ -59,11 +61,6 @@ after_success: codecov fi -branches: - only: - - master - - /^v?\d+\.\d+(\.\d+)?(-?\S+)?$/ - stages: - test - name: publish diff --git a/requirements/testproj.txt b/requirements/testproj.txt index b79d77cc..209a481f 100644 --- a/requirements/testproj.txt +++ b/requirements/testproj.txt @@ -1,6 +1,5 @@ # test project requirements Pillow>=4.3.0 -django-cors-headers>=2.1.0 django-filter>=1.1.0,<2.0; python_version == "2.7" django-filter>=1.1.0; python_version >= "3.5" #djangorestframework-camel-case>=0.2.0 @@ -9,5 +8,3 @@ django-filter>=1.1.0; python_version >= "3.5" djangorestframework-recursive>=0.1.2 dj-database-url>=0.4.2 user_agents>=1.1.0 -# django-oauth-toolkit 1.2 does not support Django 1.11 -django-oauth-toolkit>=1.1.0,<1.2.0 diff --git a/src/drf_yasg/inspectors/__init__.py b/src/drf_yasg/inspectors/__init__.py index 654de798..ad6916d8 100644 --- a/src/drf_yasg/inspectors/__init__.py +++ b/src/drf_yasg/inspectors/__init__.py @@ -5,7 +5,7 @@ from .field import ( CamelCaseJSONFilter, ChoiceFieldInspector, DictFieldInspector, FileFieldInspector, HiddenFieldInspector, InlineSerializerInspector, JSONFieldInspector, RecursiveFieldInspector, ReferencingSerializerInspector, - RelatedFieldInspector, SerializerMethodFieldInspector, SimpleFieldInspector, StringDefaultFieldInspector + RelatedFieldInspector, SerializerMethodFieldInspector, SimpleFieldInspector, StringDefaultFieldInspector ) from .query import CoreAPICompatInspector, DjangoRestResponsePagination from .view import SwaggerAutoSchema diff --git a/src/drf_yasg/renderers.py b/src/drf_yasg/renderers.py index 276e4a52..5b88933d 100644 --- a/src/drf_yasg/renderers.py +++ b/src/drf_yasg/renderers.py @@ -2,7 +2,7 @@ from django.shortcuts import resolve_url from django.template.loader import render_to_string -from django.utils.encoding import force_text +from django.utils.encoding import force_str from django.utils.functional import Promise from rest_framework.renderers import BaseRenderer, JSONRenderer, TemplateHTMLRenderer from rest_framework.utils import encoders, json @@ -124,7 +124,7 @@ def set_context(self, renderer_context, swagger=None): swagger_ui_settings = self.get_swagger_ui_settings() request = renderer_context.get('request', None) - oauth_redirect_url = force_text(swagger_ui_settings.get('oauth2RedirectUrl', '')) + oauth_redirect_url = force_str(swagger_ui_settings.get('oauth2RedirectUrl', '')) if request and oauth_redirect_url: swagger_ui_settings['oauth2RedirectUrl'] = request.build_absolute_uri(oauth_redirect_url) diff --git a/src/drf_yasg/utils.py b/src/drf_yasg/utils.py index b94cf84f..3784e4b6 100644 --- a/src/drf_yasg/utils.py +++ b/src/drf_yasg/utils.py @@ -5,7 +5,7 @@ from decimal import Decimal from django.db import models -from django.utils.encoding import force_text +from django.utils.encoding import force_str from rest_framework import serializers, status from rest_framework.mixins import DestroyModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin from rest_framework.parsers import FileUploadParser @@ -434,7 +434,7 @@ def force_real_str(s, encoding='utf-8', strings_only=False, errors='strict'): Fix for https://github.com/axnsan12/drf-yasg/issues/159 """ if s is not None: - s = force_text(s, encoding, strings_only, errors) + s = force_str(s, encoding, strings_only, errors) if type(s) != str: s = '' + s diff --git a/src/drf_yasg/views.py b/src/drf_yasg/views.py index 9fdbe4a9..1741b9f9 100644 --- a/src/drf_yasg/views.py +++ b/src/drf_yasg/views.py @@ -1,8 +1,7 @@ import warnings -from functools import wraps +from functools import WRAPPER_ASSIGNMENTS, wraps from django.utils.cache import add_never_cache_headers -from django.utils.decorators import available_attrs from django.views.decorators.cache import cache_page from django.views.decorators.vary import vary_on_headers from rest_framework import exceptions @@ -30,7 +29,7 @@ def deferred_never_cache(view_func): never be cached. """ - @wraps(view_func, assigned=available_attrs(view_func)) + @wraps(view_func, assigned=WRAPPER_ASSIGNMENTS) def _wrapped_view_func(request, *args, **kwargs): response = view_func(request, *args, **kwargs) diff --git a/testproj/snippets/serializers.py b/testproj/snippets/serializers.py index 4db926a6..01a1a95e 100644 --- a/testproj/snippets/serializers.py +++ b/testproj/snippets/serializers.py @@ -13,7 +13,6 @@ from django.core.validators import MaxLengthValidator, MinValueValidator - class LanguageSerializer(serializers.Serializer): name = serializers.ChoiceField( choices=LANGUAGE_CHOICES, default='python', help_text='The name of the programming language') diff --git a/tox.ini b/tox.ini index 644d5a0d..d357f42b 100644 --- a/tox.ini +++ b/tox.ini @@ -8,9 +8,10 @@ envlist = py27-django111-drf39-typing, py27-django111-drf{38,39}, py{35,36}-django{111,21,22}-drf{38,39}, - py37-django{21,22}-drf{38,39}, - py37-django{21,22}-drf310, + py37-django{21,22}-drf{38,39,310}, + py38-django22-drf310, djmaster, lint, docs +skip_missing_interpreters = true [testenv:.package] # no additional dependencies besides PEP 517 @@ -19,8 +20,17 @@ deps = [testenv] deps = django111: Django>=1.11,<2.0 + django111: django-cors-headers>=2.1.0 + django111: django-oauth-toolkit>=1.1.0,<1.2.0 + django21: Django>=2.1,<2.2 + django21: django-cors-headers>=2.1.0 + django21: django-oauth-toolkit>=1.2.0 + django22: Django>=2.2,<2.3 + django22: django-cors-headers>=2.1.0 + django22: django-oauth-toolkit>=1.2.0 + drf38: djangorestframework>=3.8,<3.9 drf39: djangorestframework>=3.9,<3.10 @@ -28,9 +38,12 @@ deps = typing: typing>=3.6.6 - # test with the latest build of django-rest-framework to get early warning of compatibility issues - djmaster: https://github.com/encode/django-rest-framework/archive/master.tar.gz + # test with the latest builds of Django and django-rest-framework + # to get early warning of compatibility issues djmaster: https://github.com/django/django/archive/master.tar.gz + djmaster: https://github.com/ottoyiu/django-cors-headers/archive/master.tar.gz + djmaster: https://github.com/encode/django-rest-framework/archive/master.tar.gz + djmaster: django-oauth-toolkit>=1.2.0 # other dependencies -r requirements/validation.txt @@ -77,5 +90,5 @@ known_standard_library = known_third_party = coreapi,coreschema,datadiff,dj_database_url,django,django_filters,djangorestframework_camel_case, rest_framework_recursive,flex,gunicorn,inflection,pytest,rest_framework,ruamel,setuptools_scm, - swagger_spec_validator,uritemplate,user_agents,whitenoise,oauth2_provider + swagger_spec_validator,uritemplate,user_agents,whitenoise,oauth2_provider,packaging known_first_party = drf_yasg,testproj,articles,people,snippets,todo,users,urlconfs