diff --git a/setup.py b/setup.py index 4f8aa60..b4ce7c6 100644 --- a/setup.py +++ b/setup.py @@ -12,6 +12,7 @@ def read(fname): return open(os.path.join(os.path.dirname(__file__), fname)).read() + setup( name='django-betterforms', version=version, @@ -20,25 +21,28 @@ def read(fname): url="https://django-betterforms.readthedocs.org/en/latest/", author="Fusionbox", author_email='programmers@fusionbox.com', - packages=[package for package in find_packages() if package.startswith('betterforms')], - install_requires=[ - 'Django>=1.4', - 'six', - ], - tests_require=[ - 'mock>=1.0.1', - ], + packages=[package for package in find_packages() + if package.startswith('betterforms')], + install_requires=['Django>=1.8'], zip_safe=False, include_package_data=True, classifiers=[ - 'Development Status :: 4 - Beta', + 'Development Status :: 5 - Production/Stable', 'Framework :: Django', + 'Framework :: Django :: 1.8', + 'Framework :: Django :: 1.9', + 'Framework :: Django :: 1.10', + 'Framework :: Django :: 1.11', + 'Framework :: Django :: 2.0', 'Intended Audience :: Developers', 'License :: OSI Approved :: BSD License', - 'Topic :: Internet :: WWW/HTTP', 'Programming Language :: Python', - 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3.3', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.4', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Topic :: Internet :: WWW/HTTP', ], ) diff --git a/tests/models.py b/tests/models.py index 67e8ea1..37ecb56 100644 --- a/tests/models.py +++ b/tests/models.py @@ -7,8 +7,9 @@ class User(models.Model): class Profile(models.Model): - user = models.OneToOneField('User', related_name='profile') - + user = models.OneToOneField( + User, on_delete=models.CASCADE, related_name='profile', + ) display_name = models.CharField(max_length=255, blank=True) @@ -27,5 +28,7 @@ class Book(models.Model): class BookImage(models.Model): - book = models.ForeignKey(Book, related_name='images') + book = models.ForeignKey( + Book, on_delete=models.CASCADE, related_name='images', + ) name = models.CharField(max_length=255) diff --git a/tests/requirements.txt b/tests/requirements.txt new file mode 100644 index 0000000..ac7b9af --- /dev/null +++ b/tests/requirements.txt @@ -0,0 +1,5 @@ +django-formtools +pytest +pytest-django +pytest-cov +mock >=1.0.1 diff --git a/tests/settings.py b/tests/settings.py index 6db29f2..c8bf4ba 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -5,7 +5,7 @@ PROJECT_PATH = os.path.abspath(os.path.dirname(__file__)) -MIDDLEWARE_CLASSES = ( +MIDDLEWARE = MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', # We need the SessionMiddleware for the WizardView support tests in Django >= 1.7 'django.contrib.sessions.middleware.SessionMiddleware', diff --git a/tests/tests.py b/tests/tests.py index e11be2c..0643915 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -1,10 +1,12 @@ from collections import OrderedDict -import django from django.test import TestCase from django.test.client import RequestFactory from django.views.generic import CreateView -from django.core import urlresolvers +try: + from django.urls import reverse +except ImportError: + from django.core.urlresolvers import reverse from django.utils.encoding import force_text from .models import User, Profile, Badge, Book @@ -108,14 +110,7 @@ def test_is_multipart(self): def test_media(self): form = NeedsFileField() - static_prefix = "" - if django.VERSION < (1, 10): - static_prefix = "/static/" - self.assertEqual(form.media._js, [ - static_prefix + 'admin/js/calendar.js', - static_prefix + 'admin/js/admin/DateTimeShortcuts.js', - 'test.js', - ]) + self.assertIn('test.js', form.media._js) def test_is_bound(self): form = ErrorMultiForm() @@ -169,7 +164,7 @@ def test_handles_none_initial_value(self): UserProfileMultiForm(initial=None) def test_works_with_wizard_view(self): - url = urlresolvers.reverse('test_wizard') + url = reverse('test_wizard') self.client.get(url) response = self.client.post(url, { diff --git a/tests/urls.py b/tests/urls.py index 054d5f0..4badc43 100644 --- a/tests/urls.py +++ b/tests/urls.py @@ -1,21 +1,11 @@ -import django from django.conf.urls import url -if django.VERSION >= (1, 8): - from formtools.wizard.views import SessionWizardView -else: - from django.contrib.formtools.wizard.views import SessionWizardView +from formtools.wizard.views import SessionWizardView from .forms import Step1Form, Step2Form class TestWizardView(SessionWizardView): - def get_context_data(self, **kwargs): - kwargs = super(TestWizardView, self).get_context_data(**kwargs) - # Django < 1.5 does not set the view object in the context - kwargs['view'] = self - return kwargs - def done(self, form_list, **kwargs): context = { 'form_list': form_list, @@ -24,5 +14,7 @@ def done(self, form_list, **kwargs): urlpatterns = [ - url(r'^test-wizard-view/$', TestWizardView.as_view([Step1Form, Step2Form]), name='test_wizard'), + url(r'^test-wizard-view/$', + TestWizardView.as_view([Step1Form, Step2Form]), + name='test_wizard'), ] diff --git a/tox.ini b/tox.ini index f0d94c1..8ee537c 100644 --- a/tox.ini +++ b/tox.ini @@ -1,24 +1,23 @@ [tox] -envlist= - {py27,py34,py35}-{dj17,dj18,dj19,dj110,djdev} +envlist = + {py27,py34}-dj{18,19,110} + {py27,py34,py35,py36}-dj111 + {py34,py35,py36}-dj20 + {py35,py36}-djdev [testenv] -commands= - make {posargs:test} -basepython= +basepython = py27: python2.7 py34: python3.4 py35: python3.5 -deps= - dj17: Django>=1.7,<1.8 + py36: python3.6 +commands = make {posargs:test} +deps = dj18: Django>=1.8,<1.9 dj19: Django>=1.9,<1.10 dj110: Django>=1.10,<1.11 + dj111: Django>=1.11,<2.0 + dj20: Django>=2.0,<2.1 djdev: https://github.com/django/django/archive/master.tar.gz - django-formtools - pytest - pytest-django - pytest-cov - mock -whitelist_externals= - make + -r{toxinidir}/tests/requirements.txt +whitelist_externals = make