diff --git a/.travis.yml b/.travis.yml index 2f068970d..26ada45f1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,6 +21,8 @@ matrix: - { python: "3.6", env: DJANGO=master } - { python: "3.6", env: DJANGO=1.11 } - { python: "3.6", env: DJANGO=2.0 } + - { python: "3.6", env: DJANGO=2.0 } + - { python: "3.6", env: TOXENV=py36-django20-optionals } - { python: "3.6", env: DJANGO=2.1 } - { python: "3.6", env: TOXENV=base } - { python: "2.7", env: TOXENV=lint } @@ -33,6 +35,13 @@ matrix: - tox --installpkg ./dist/djangorestframework-*.whl - tox # test sdist + - python: "3.6" + env: TOXENV=dist-optionals + script: + - python setup.py bdist_wheel + - tox --installpkg ./dist/djangorestframework-*.whl + - tox # test sdist + exclude: - { python: "2.7", env: DJANGO=master } - { python: "2.7", env: DJANGO=2.0 } diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 7783bced3..7db548f00 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -139,16 +139,6 @@ except ImportError: requests = None -# Django-guardian is optional. Import only if guardian is in INSTALLED_APPS -# Fixes (#1712). We keep the try/except for the test suite. -guardian = None -try: - if 'guardian' in settings.INSTALLED_APPS: - import guardian # noqa -except ImportError: - pass - - # PATCH method is not implemented by Django if 'patch' not in View.http_method_names: View.http_method_names = View.http_method_names + ['patch'] diff --git a/rest_framework/filters.py b/rest_framework/filters.py index cf8f6d1f7..3b52e5c19 100644 --- a/rest_framework/filters.py +++ b/rest_framework/filters.py @@ -16,7 +16,7 @@ from django.utils import six from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ -from rest_framework.compat import coreapi, coreschema, distinct, guardian +from rest_framework.compat import coreapi, coreschema, distinct from rest_framework.settings import api_settings @@ -282,7 +282,11 @@ class DjangoObjectPermissionsFilter(BaseFilterBackend): has read object level permissions. """ def __init__(self): - assert guardian, 'Using DjangoObjectPermissionsFilter, but django-guardian is not installed' + try: + import guardian + except ImportError: + raise ImportError('Using DjangoObjectPermissionsFilter, but django-guardian is not installed') + self.guardian_version = guardian.VERSION perm_format = '%(app_label)s.view_%(model_name)s' @@ -300,7 +304,7 @@ class DjangoObjectPermissionsFilter(BaseFilterBackend): 'model_name': model_cls._meta.model_name } permission = self.perm_format % kwargs - if tuple(guardian.VERSION) >= (1, 3): + if tuple(self.guardian_version) >= (1, 3): # Maintain behavior compatibility with versions prior to 1.3 extra = {'accept_global_perms': False} else: diff --git a/tests/test_permissions.py b/tests/test_permissions.py index 80b666180..f34c91682 100644 --- a/tests/test_permissions.py +++ b/tests/test_permissions.py @@ -12,12 +12,16 @@ from rest_framework import ( HTTP_HEADER_ENCODING, authentication, generics, permissions, serializers, status, views ) -from rest_framework.compat import guardian from rest_framework.filters import DjangoObjectPermissionsFilter from rest_framework.routers import DefaultRouter from rest_framework.test import APIRequestFactory from tests.models import BasicModel +try: + import guardian +except ImportError: + guardian = None + factory = APIRequestFactory() diff --git a/tox.ini b/tox.ini index dcd44f161..ae3c872b3 100644 --- a/tox.ini +++ b/tox.ini @@ -27,8 +27,8 @@ deps = django20: Django>=2.0,<2.1 django21: Django>=2.1b1,<2.2 djangomaster: https://github.com/django/django/archive/master.tar.gz + optionals: -rrequirements/requirements-optionals.txt -rrequirements/requirements-testing.txt - -rrequirements/requirements-optionals.txt [testenv:base] ; Ensure optional dependencies are not required @@ -41,6 +41,10 @@ commands = ./runtests.py --fast {posargs} --no-pkgroot --staticfiles -rw deps = django -rrequirements/requirements-testing.txt + +[testenv:dist-optionals] +commands = {[testenv:dist]commands} +deps = {[testenv:dist]deps} -rrequirements/requirements-optionals.txt [testenv:lint]