From b893e52eba89b36fbaa2c4d30256f4487d073741 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20HUBSCHER?= Date: Tue, 7 Jan 2020 15:01:26 +0100 Subject: [PATCH] Remove support for Python 2.7 --- .travis.yml | 1 - demo/demoproject/virtual/views.py | 2 +- django_downloadview/__init__.py | 4 +--- django_downloadview/apache/__init__.py | 1 - django_downloadview/apache/decorators.py | 1 - django_downloadview/apache/response.py | 4 +--- django_downloadview/apache/tests.py | 3 +-- django_downloadview/api.py | 1 - django_downloadview/exceptions.py | 1 - django_downloadview/files.py | 5 +---- django_downloadview/io.py | 2 -- django_downloadview/lighttpd/__init__.py | 1 - django_downloadview/lighttpd/decorators.py | 1 - django_downloadview/lighttpd/response.py | 1 - django_downloadview/middlewares.py | 1 - django_downloadview/nginx/__init__.py | 1 - django_downloadview/nginx/decorators.py | 1 - django_downloadview/nginx/response.py | 1 - django_downloadview/nginx/settings.py | 1 - django_downloadview/nginx/tests.py | 3 +-- django_downloadview/response.py | 10 ++++------ django_downloadview/shortcuts.py | 1 - django_downloadview/test.py | 4 +--- django_downloadview/utils.py | 1 - django_downloadview/views/__init__.py | 3 --- django_downloadview/views/base.py | 1 - django_downloadview/views/http.py | 1 - django_downloadview/views/object.py | 1 - django_downloadview/views/path.py | 1 - django_downloadview/views/storage.py | 1 - django_downloadview/views/virtual.py | 1 - setup.py | 7 +------ tests/api.py | 4 +--- tests/io.py | 1 - tests/packaging.py | 1 - tests/response.py | 1 - tests/sendfile.py | 1 - tests/views.py | 1 - tox.ini | 6 ++++-- 39 files changed, 17 insertions(+), 66 deletions(-) diff --git a/.travis.yml b/.travis.yml index eff1a53..77b08f7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: python dist: bionic python: - - 2.7 - 3.6 - 3.7 - 3.8 diff --git a/demo/demoproject/virtual/views.py b/demo/demoproject/virtual/views.py index 3dc8ed2..ba4db32 100644 --- a/demo/demoproject/virtual/views.py +++ b/demo/demoproject/virtual/views.py @@ -1,4 +1,4 @@ -from six import StringIO +from io import StringIO from django.core.files.base import ContentFile diff --git a/django_downloadview/__init__.py b/django_downloadview/__init__.py index f25b9e5..9a2d4d0 100644 --- a/django_downloadview/__init__.py +++ b/django_downloadview/__init__.py @@ -1,11 +1,9 @@ -# -*- coding: utf-8 -*- """Serve files with Django and reverse proxies.""" import pkg_resources #: Module version, as defined in PEP-0396. -__version__ = pkg_resources.get_distribution(__package__.replace('-', '_')) \ - .version +__version__ = pkg_resources.get_distribution(__package__.replace('-', '_')).version # API shortcuts. diff --git a/django_downloadview/apache/__init__.py b/django_downloadview/apache/__init__.py index ec284eb..b68d63d 100644 --- a/django_downloadview/apache/__init__.py +++ b/django_downloadview/apache/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Optimizations for Apache. See also `documentation of mod_xsendfile for Apache diff --git a/django_downloadview/apache/decorators.py b/django_downloadview/apache/decorators.py index 7af7e3d..26f1523 100644 --- a/django_downloadview/apache/decorators.py +++ b/django_downloadview/apache/decorators.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Decorators to apply Apache X-Sendfile on a specific view.""" from django_downloadview.decorators import DownloadDecorator from django_downloadview.apache.middlewares import XSendfileMiddleware diff --git a/django_downloadview/apache/response.py b/django_downloadview/apache/response.py index 9a37d8e..3eae968 100644 --- a/django_downloadview/apache/response.py +++ b/django_downloadview/apache/response.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Apache's specific responses.""" import os.path @@ -8,8 +7,7 @@ from django_downloadview.response import (ProxiedDownloadResponse, class XSendfileResponse(ProxiedDownloadResponse): "Delegates serving file to Apache via X-Sendfile header." - def __init__(self, file_path, content_type, basename=None, - attachment=True): + def __init__(self, file_path, content_type, basename=None, attachment=True): """Return a HttpResponse with headers for Apache X-Sendfile.""" super(XSendfileResponse, self).__init__(content_type=content_type) if attachment: diff --git a/django_downloadview/apache/tests.py b/django_downloadview/apache/tests.py index 0aa17b0..ee7910b 100644 --- a/django_downloadview/apache/tests.py +++ b/django_downloadview/apache/tests.py @@ -1,4 +1,3 @@ -from six import iteritems from django_downloadview.apache.response import XSendfileResponse @@ -22,7 +21,7 @@ class XSendfileValidator(object): """ self.assert_x_sendfile_response(test_case, response) - for key, value in iteritems(assertions): + for key, value in assertions.items(): assert_func = getattr(self, 'assert_%s' % key) assert_func(test_case, response, value) diff --git a/django_downloadview/api.py b/django_downloadview/api.py index f0726b7..086b528 100644 --- a/django_downloadview/api.py +++ b/django_downloadview/api.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Declaration of API shortcuts.""" from django_downloadview.io import (BytesIteratorIO, # NoQA TextIteratorIO) diff --git a/django_downloadview/exceptions.py b/django_downloadview/exceptions.py index 064dc45..18d2760 100644 --- a/django_downloadview/exceptions.py +++ b/django_downloadview/exceptions.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Custom exceptions.""" diff --git a/django_downloadview/files.py b/django_downloadview/files.py index 70061f1..146bfc9 100644 --- a/django_downloadview/files.py +++ b/django_downloadview/files.py @@ -1,9 +1,6 @@ -# -*- coding: utf-8 -*- """File wrappers for use as exchange data between views and responses.""" -from __future__ import absolute_import - from io import BytesIO -from six.moves.urllib.parse import urlparse +from urllib.parse import urlparse from django.core.files.base import File from django.utils.encoding import force_bytes diff --git a/django_downloadview/io.py b/django_downloadview/io.py index 882c87f..83649a7 100644 --- a/django_downloadview/io.py +++ b/django_downloadview/io.py @@ -1,6 +1,4 @@ -# -*- coding: utf-8 -*- """Low-level IO operations, for use with file wrappers.""" -from __future__ import absolute_import import io from django.utils.encoding import force_text, force_bytes diff --git a/django_downloadview/lighttpd/__init__.py b/django_downloadview/lighttpd/__init__.py index 8328a20..9f750fe 100644 --- a/django_downloadview/lighttpd/__init__.py +++ b/django_downloadview/lighttpd/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Optimizations for Lighttpd. See also `documentation of X-Sendfile for Lighttpd diff --git a/django_downloadview/lighttpd/decorators.py b/django_downloadview/lighttpd/decorators.py index 25999ea..f55459e 100644 --- a/django_downloadview/lighttpd/decorators.py +++ b/django_downloadview/lighttpd/decorators.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Decorators to apply Lighttpd X-Sendfile on a specific view.""" from django_downloadview.decorators import DownloadDecorator from django_downloadview.lighttpd.middlewares import XSendfileMiddleware diff --git a/django_downloadview/lighttpd/response.py b/django_downloadview/lighttpd/response.py index cfa64e1..09f7217 100644 --- a/django_downloadview/lighttpd/response.py +++ b/django_downloadview/lighttpd/response.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Lighttpd's specific responses.""" import os.path diff --git a/django_downloadview/middlewares.py b/django_downloadview/middlewares.py index 3cbc291..d84c68a 100644 --- a/django_downloadview/middlewares.py +++ b/django_downloadview/middlewares.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Base material for download middlewares. Download middlewares capture :py:class:`django_downloadview.DownloadResponse` diff --git a/django_downloadview/nginx/__init__.py b/django_downloadview/nginx/__init__.py index 4cf9805..d8e4853 100644 --- a/django_downloadview/nginx/__init__.py +++ b/django_downloadview/nginx/__init__.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Optimizations for Nginx. See also `Nginx X-accel documentation `_ and diff --git a/django_downloadview/nginx/decorators.py b/django_downloadview/nginx/decorators.py index 468d727..0a7f3a9 100644 --- a/django_downloadview/nginx/decorators.py +++ b/django_downloadview/nginx/decorators.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Decorators to apply Nginx X-Accel on a specific view.""" from django_downloadview.decorators import DownloadDecorator from django_downloadview.nginx.middlewares import XAccelRedirectMiddleware diff --git a/django_downloadview/nginx/response.py b/django_downloadview/nginx/response.py index 4bbf0d4..529c862 100644 --- a/django_downloadview/nginx/response.py +++ b/django_downloadview/nginx/response.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Nginx's specific responses.""" from datetime import timedelta diff --git a/django_downloadview/nginx/settings.py b/django_downloadview/nginx/settings.py index 804766a..05f4d79 100644 --- a/django_downloadview/nginx/settings.py +++ b/django_downloadview/nginx/settings.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Django settings around Nginx X-Accel. .. warning:: diff --git a/django_downloadview/nginx/tests.py b/django_downloadview/nginx/tests.py index 02bfec9..e43c881 100644 --- a/django_downloadview/nginx/tests.py +++ b/django_downloadview/nginx/tests.py @@ -1,4 +1,3 @@ -from six import iteritems from django_downloadview.nginx.response import XAccelRedirectResponse @@ -36,7 +35,7 @@ class XAccelRedirectValidator(object): """ self.assert_x_accel_redirect_response(test_case, response) - for key, value in iteritems(assertions): + for key, value in assertions.items(): assert_func = getattr(self, 'assert_%s' % key) assert_func(test_case, response, value) diff --git a/django_downloadview/response.py b/django_downloadview/response.py index 85cacda..5049e20 100644 --- a/django_downloadview/response.py +++ b/django_downloadview/response.py @@ -1,11 +1,9 @@ -# -*- coding: utf-8 -*- """:py:class:`django.http.HttpResponse` subclasses.""" import os import mimetypes import re import unicodedata -import six -from six.moves import urllib +from urllib.parse import quote from django.conf import settings from django.http import HttpResponse, StreamingHttpResponse @@ -31,9 +29,9 @@ def encode_basename_ascii(value): ea """ - if isinstance(value, six.binary_type): + if isinstance(value, bytes): value = value.decode('utf-8') - ascii_basename = six.text_type(value) + ascii_basename = str(value) ascii_basename = unicodedata.normalize('NFKD', ascii_basename) ascii_basename = ascii_basename.encode('ascii', 'ignore') ascii_basename = ascii_basename.decode('ascii') @@ -51,7 +49,7 @@ def encode_basename_utf8(value): %C3%A9%C3%A0 """ - return urllib.parse.quote(force_str(value)) + return quote(force_str(value)) def content_disposition(filename): diff --git a/django_downloadview/shortcuts.py b/django_downloadview/shortcuts.py index 8fbebbc..241d8d5 100644 --- a/django_downloadview/shortcuts.py +++ b/django_downloadview/shortcuts.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Port of django-sendfile in django-downloadview.""" from django_downloadview.views.path import PathDownloadView diff --git a/django_downloadview/test.py b/django_downloadview/test.py index 08f6ce9..fdd05cc 100644 --- a/django_downloadview/test.py +++ b/django_downloadview/test.py @@ -1,6 +1,4 @@ -"""Testing utilities.""" import shutil -from six import iteritems import tempfile from django.conf import settings @@ -103,7 +101,7 @@ class DownloadResponseValidator(object): """ self.assert_download_response(test_case, response) - for key, value in iteritems(assertions): + for key, value in assertions.items(): assert_func = getattr(self, 'assert_%s' % key) assert_func(test_case, response, value) diff --git a/django_downloadview/utils.py b/django_downloadview/utils.py index b1facc1..36f32b1 100644 --- a/django_downloadview/utils.py +++ b/django_downloadview/utils.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Utility functions that may be implemented in external packages.""" import re diff --git a/django_downloadview/views/__init__.py b/django_downloadview/views/__init__.py index 608dd94..0466f3a 100644 --- a/django_downloadview/views/__init__.py +++ b/django_downloadview/views/__init__.py @@ -1,6 +1,3 @@ -# coding=utf-8 -"""Views.""" -# -*- coding: utf-8 -*- """Views to stream files.""" # API shortcuts. from django_downloadview.views.base import (DownloadMixin, # NoQA diff --git a/django_downloadview/views/base.py b/django_downloadview/views/base.py index c476d83..4a30f4e 100644 --- a/django_downloadview/views/base.py +++ b/django_downloadview/views/base.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Base material for download views: :class:`DownloadMixin` and :class:`BaseDownloadView`""" import calendar diff --git a/django_downloadview/views/http.py b/django_downloadview/views/http.py index c4e5d0b..b7316f9 100644 --- a/django_downloadview/views/http.py +++ b/django_downloadview/views/http.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Stream files given an URL, i.e. files you want to proxy.""" import requests diff --git a/django_downloadview/views/object.py b/django_downloadview/views/object.py index 5bfa3fc..5f74c5a 100644 --- a/django_downloadview/views/object.py +++ b/django_downloadview/views/object.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Stream files that live in models.""" from django.views.generic.detail import SingleObjectMixin diff --git a/django_downloadview/views/path.py b/django_downloadview/views/path.py index 2779ddf..e51081d 100644 --- a/django_downloadview/views/path.py +++ b/django_downloadview/views/path.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """:class:`PathDownloadView`.""" import os diff --git a/django_downloadview/views/storage.py b/django_downloadview/views/storage.py index 56a1662..9e1900d 100644 --- a/django_downloadview/views/storage.py +++ b/django_downloadview/views/storage.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Stream files from storage.""" from django.core.files.storage import DefaultStorage diff --git a/django_downloadview/views/virtual.py b/django_downloadview/views/virtual.py index 6f97824..0edd002 100644 --- a/django_downloadview/views/virtual.py +++ b/django_downloadview/views/virtual.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Stream files that you generate or that live in memory.""" from django_downloadview.views.base import BaseDownloadView diff --git a/setup.py b/setup.py index 5dce0b0..9c9aa10 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -# -*- coding: utf-8 -*- """Python packaging.""" import os import sys @@ -23,8 +22,6 @@ class Tox(TestCommand): #: Absolute path to directory containing setup.py file. here = os.path.abspath(os.path.dirname(__file__)) -#: Boolean, ``True`` if environment is running Python version 2. -IS_PYTHON2 = sys.version_info[0] == 2 NAME = 'django-downloadview' @@ -39,8 +36,7 @@ CLASSIFIERS = [ 'Development Status :: 5 - Production/Stable', 'Framework :: Django', 'License :: OSI Approved :: BSD License', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3 :: Only', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', @@ -62,7 +58,6 @@ REQUIREMENTS = [ 'Django>=1.11', 'requests', 'setuptools', - 'six', # END requirements ] ENTRY_POINTS = {} diff --git a/tests/api.py b/tests/api.py index 9ef17fd..8568279 100644 --- a/tests/api.py +++ b/tests/api.py @@ -1,8 +1,6 @@ -# -*- coding: utf-8 -*- """Test suite around :mod:`django_downloadview.api` and deprecation plan.""" -from importlib import import_module +from importlib import import_module, reload import unittest -from six.moves import reload_module as reload import warnings from django.core.exceptions import ImproperlyConfigured diff --git a/tests/io.py b/tests/io.py index d90816f..5da43e2 100644 --- a/tests/io.py +++ b/tests/io.py @@ -1,4 +1,3 @@ -# coding=utf-8 """Tests around :mod:`django_downloadview.io`.""" import unittest diff --git a/tests/packaging.py b/tests/packaging.py index 7a97105..e53465e 100644 --- a/tests/packaging.py +++ b/tests/packaging.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Tests around project's distribution and packaging.""" import os import unittest diff --git a/tests/response.py b/tests/response.py index 19088f1..6793f04 100644 --- a/tests/response.py +++ b/tests/response.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- """Unit tests around responses.""" import unittest diff --git a/tests/sendfile.py b/tests/sendfile.py index 370a5a9..f8b6e81 100644 --- a/tests/sendfile.py +++ b/tests/sendfile.py @@ -1,4 +1,3 @@ -# coding=utf-8 """Tests around :py:mod:`django_downloadview.sendfile`.""" from django.http import Http404 import django.test diff --git a/tests/views.py b/tests/views.py index 6ad8e1d..1fa3806 100644 --- a/tests/views.py +++ b/tests/views.py @@ -1,4 +1,3 @@ -# coding=utf-8 """Tests around :mod:`django_downloadview.views`.""" import calendar import os diff --git a/tox.ini b/tox.ini index 0fcb13c..8a8bc55 100644 --- a/tox.ini +++ b/tox.ini @@ -1,6 +1,5 @@ [tox] -envlist = py27-django111, - py{35,36,36,37,38}-django{22,30}, +envlist = py{35,36,36,37,38}-django{111,22,30}, flake8, sphinx, readme [travis] @@ -54,3 +53,6 @@ deps = zest.releaser commands = fullrelease + +[flake8] +max-line-length = 99