From 81c7e40e60855404860e14b6dde9bfde23d209d5 Mon Sep 17 00:00:00 2001 From: Trey Hunner Date: Sat, 6 Apr 2013 15:55:22 -0700 Subject: [PATCH 01/13] Fix iterator/list problems for Python 3 support --- model_utils/managers.py | 2 +- model_utils/tests/tests.py | 6 +++--- model_utils/tracker.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/model_utils/managers.py b/model_utils/managers.py index 74cc7bc..1f502ad 100644 --- a/model_utils/managers.py +++ b/model_utils/managers.py @@ -38,7 +38,7 @@ class InheritanceQuerySet(QuerySet): def annotate(self, *args, **kwargs): qset = super(InheritanceQuerySet, self).annotate(*args, **kwargs) - qset._annotated = [a.default_alias for a in args] + kwargs.keys() + qset._annotated = [a.default_alias for a in args] + list(kwargs.keys()) return qset diff --git a/model_utils/tests/tests.py b/model_utils/tests/tests.py index 1b94abd..02b69ce 100644 --- a/model_utils/tests/tests.py +++ b/model_utils/tests/tests.py @@ -654,7 +654,7 @@ class ModelTrackerTestCase(TestCase): def assertHasChanged(self, **kwargs): tracker = kwargs.pop('tracker', self.tracker) - for field, value in kwargs.iteritems(): + for field, value in kwargs.items(): if value is None: self.assertRaises(FieldError, tracker.has_changed, field) else: @@ -662,7 +662,7 @@ class ModelTrackerTestCase(TestCase): def assertPrevious(self, **kwargs): tracker = kwargs.pop('tracker', self.tracker) - for field, value in kwargs.iteritems(): + for field, value in kwargs.items(): self.assertEqual(tracker.previous(field), value) def assertChanged(self, **kwargs): @@ -674,7 +674,7 @@ class ModelTrackerTestCase(TestCase): self.assertEqual(tracker.current(), kwargs) def update_instance(self, **kwargs): - for field, value in kwargs.iteritems(): + for field, value in kwargs.items(): setattr(self.instance, field, value) self.instance.save() diff --git a/model_utils/tracker.py b/model_utils/tracker.py index d93dfea..9a83f1d 100644 --- a/model_utils/tracker.py +++ b/model_utils/tracker.py @@ -74,6 +74,6 @@ class ModelInstanceTracker(object): """Returns dict of fields that changed since save (with old values)""" if not self.instance.pk: return {} - saved = self.saved_data.iteritems() + saved = self.saved_data.items() current = self.current() return dict((k, v) for k, v in saved if v != current[k]) From 4f2673e6a4bd9bc86ca61f3187c36191f58f646c Mon Sep 17 00:00:00 2001 From: Trey Hunner Date: Sat, 6 Apr 2013 15:55:42 -0700 Subject: [PATCH 02/13] Fix str/unicode problems in Python 3 Changes: - Use unicode_literals from the future for Python 2.6.5+ - Use six's text_type for proper unicode use in Python 2/3 --- model_utils/choices.py | 5 ++++- model_utils/fields.py | 6 ++++-- model_utils/managers.py | 1 + model_utils/models.py | 1 + model_utils/tests/tests.py | 19 ++++++++++--------- model_utils/tracker.py | 1 + 6 files changed, 21 insertions(+), 12 deletions(-) diff --git a/model_utils/choices.py b/model_utils/choices.py index 65097c7..b5177cd 100644 --- a/model_utils/choices.py +++ b/model_utils/choices.py @@ -1,3 +1,6 @@ +from __future__ import unicode_literals + + class Choices(object): """ A class to encapsulate handy functionality for lists of choices @@ -72,4 +75,4 @@ class Choices(object): def __repr__(self): return '%s(%s)' % (self.__class__.__name__, - ', '.join(("%s" % str(i) for i in self._full))) + ', '.join(("%s" % repr(i) for i in self._full))) diff --git a/model_utils/fields.py b/model_utils/fields.py index 6dd6459..9178e1f 100644 --- a/model_utils/fields.py +++ b/model_utils/fields.py @@ -1,7 +1,9 @@ +from __future__ import unicode_literals from datetime import datetime from django.db import models from django.conf import settings +from django.utils.encoding import python_2_unicode_compatible try: @@ -128,6 +130,7 @@ def get_excerpt(content): return '\n'.join(default_excerpt) +@python_2_unicode_compatible class SplitText(object): def __init__(self, instance, field_name, excerpt_field_name): # instead of storing actual values store a reference to the instance @@ -153,8 +156,7 @@ class SplitText(object): return self.excerpt.strip() != self.content.strip() has_more = property(_get_has_more) - # allows display via templates without .content necessary - def __unicode__(self): + def __str__(self): return self.content class SplitDescriptor(object): diff --git a/model_utils/managers.py b/model_utils/managers.py index 1f502ad..7c6c9f9 100644 --- a/model_utils/managers.py +++ b/model_utils/managers.py @@ -1,3 +1,4 @@ +from __future__ import unicode_literals import django from django.db import models from django.db.models.fields.related import OneToOneField diff --git a/model_utils/models.py b/model_utils/models.py index 40e7aa8..ff8b375 100644 --- a/model_utils/models.py +++ b/model_utils/models.py @@ -1,3 +1,4 @@ +from __future__ import unicode_literals from datetime import datetime from django.db import models diff --git a/model_utils/tests/tests.py b/model_utils/tests/tests.py index 02b69ce..2933f21 100644 --- a/model_utils/tests/tests.py +++ b/model_utils/tests/tests.py @@ -1,4 +1,4 @@ -from __future__ import with_statement +from __future__ import unicode_literals, with_statement import pickle from datetime import datetime, timedelta @@ -6,6 +6,7 @@ from datetime import datetime, timedelta import django from django.db import models from django.db.models.fields import FieldDoesNotExist +from django.utils.six import text_type from django.core.exceptions import ImproperlyConfigured, FieldError from django.test import TestCase @@ -47,8 +48,8 @@ class GetExcerptTests(TestCase): class SplitFieldTests(TestCase): - full_text = u'summary\n\n\n\nmore' - excerpt = u'summary\n' + full_text = 'summary\n\n\n\nmore' + excerpt = 'summary\n' def setUp(self): @@ -57,7 +58,7 @@ class SplitFieldTests(TestCase): def test_unicode_content(self): - self.assertEquals(unicode(self.post.body), self.full_text) + self.assertEquals(text_type(self.post.body), self.full_text) def test_excerpt(self): @@ -85,17 +86,17 @@ class SplitFieldTests(TestCase): def test_assign_to_body(self): - new_text = u'different\n\n\n\nother' + new_text = 'different\n\n\n\nother' self.post.body = new_text self.post.save() - self.assertEquals(unicode(self.post.body), new_text) + self.assertEquals(text_type(self.post.body), new_text) def test_assign_to_content(self): - new_text = u'different\n\n\n\nother' + new_text = 'different\n\n\n\nother' self.post.body.content = new_text self.post.save() - self.assertEquals(unicode(self.post.body), new_text) + self.assertEquals(text_type(self.post.body), new_text) def test_assign_to_excerpt(self): @@ -118,7 +119,7 @@ class SplitFieldTests(TestCase): def test_assign_splittext(self): a = Article(title='Some Title') a.body = self.post.body - self.assertEquals(a.body.excerpt, u'summary\n') + self.assertEquals(a.body.excerpt, 'summary\n') def test_value_to_string(self): diff --git a/model_utils/tracker.py b/model_utils/tracker.py index 9a83f1d..a366490 100644 --- a/model_utils/tracker.py +++ b/model_utils/tracker.py @@ -1,3 +1,4 @@ +from __future__ import unicode_literals from django.db import models from django.core.exceptions import FieldError From fa85becf363ac86a507fb5b3b139ac5832970ad7 Mon Sep 17 00:00:00 2001 From: Trey Hunner Date: Mon, 8 Apr 2013 22:37:45 -0700 Subject: [PATCH 03/13] Add Python 3 to tox and drop Django 1.2 and 1.3 --- tox.ini | 54 +++++++++++++++++++++++++----------------------------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/tox.ini b/tox.ini index 55ea176..4449cea 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist=py26-1.2,py26-1.3,py26-1.4,py26,py26-trunk,py27-1.2,py27-1.3,py27-1.4,py27,py27-trunk,py27-nosouth +envlist=py26-1.4,py26,py26-trunk,py27-1.4,py27,py27-trunk,py27-nosouth,py32-1.5-nosouth,py32-trunk-nosouth,py33-1.5-nosouth,py33-trunk-nosouth [testenv] deps= @@ -8,20 +8,6 @@ deps= coverage==3.6 commands=coverage run -a --branch setup.py test -[testenv:py26-1.2] -basepython=python2.6 -deps= - django==1.2.7 - South==0.7.6 - coverage==3.6 - -[testenv:py26-1.3] -basepython=python2.6 -deps= - django==1.3.7 - South==0.7.6 - coverage==3.6 - [testenv:py26-1.4] basepython=python2.6 deps= @@ -36,20 +22,6 @@ deps= South==0.7.6 coverage==3.6 -[testenv:py27-1.2] -basepython=python2.7 -deps= - django==1.2.7 - South==0.7.6 - coverage==3.6 - -[testenv:py27-1.3] -basepython=python2.7 -deps= - django==1.3.7 - South==0.7.6 - coverage==3.6 - [testenv:py27-1.4] basepython=python2.7 deps= @@ -64,6 +36,30 @@ deps= South==0.7.6 coverage==3.6 +[testenv:py32-1.5-nosouth] +basepython=python3.2 +deps= + django==1.5.0 + coverage==3.6 + +[testenv:py32-trunk-nosouth] +basepython=python3.2 +deps= + https://github.com/django/django/tarball/master + coverage==3.6 + +[testenv:py33-1.5-nosouth] +basepython=python3.3 +deps= + django==1.5.0 + coverage==3.6 + +[testenv:py33-trunk-nosouth] +basepython=python3.3 +deps= + https://github.com/django/django/tarball/master + coverage==3.6 + [testenv:py27-nosouth] deps= From f6e70a0805f018e99a32977ac61b0936673ec635 Mon Sep 17 00:00:00 2001 From: Trey Hunner Date: Sat, 6 Apr 2013 16:10:33 -0700 Subject: [PATCH 04/13] Add Python 3 to travis and drop Django 1.2 and 1.3 --- .travis.yml | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0c00347..2634fcd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,13 +5,10 @@ python: - "2.7" env: - - DJANGO=Django==1.2.7 SOUTH=1 - - DJANGO=Django==1.3.7 SOUTH=1 - DJANGO=Django==1.4.5 SOUTH=1 - - DJANGO=Django==1.4.5 SOUTH=1 - - DJANGO=Django==1.5 SOUTH=1 + - DJANGO=Django==1.5.1 SOUTH=1 - DJANGO=https://github.com/django/django/tarball/master SOUTH=1 - - DJANGO=Django==1.4.5 SOUTH=0 + - DJANGO=Django==1.5.1 SOUTH=0 install: - pip install $DJANGO --use-mirrors @@ -20,4 +17,15 @@ install: script: coverage run -a --branch --include="model_utils/*" --omit="model_utils/tests/*" setup.py test +matrix: + include: + - python: 3.2 + env: DJANGO=Django==1.5.1 SOUTH=0 + - python: 3.2 + env: DJANGO=https://github.com/django/django/tarball/master SOUTH=0 + - python: 3.3 + env: DJANGO=Django==1.5.1 SOUTH=0 + - python: 3.3 + env: DJANGO=https://github.com/django/django/tarball/master SOUTH=0 + after_success: coveralls From f7f7cc0953e2fe5e445e4cbedd85c55b69168b6b Mon Sep 17 00:00:00 2001 From: Trey Hunner Date: Tue, 9 Apr 2013 14:58:41 -0700 Subject: [PATCH 05/13] Fix repr tests for Python 2 (no string comparison) --- model_utils/tests/tests.py | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/model_utils/tests/tests.py b/model_utils/tests/tests.py index 2933f21..780b120 100644 --- a/model_utils/tests/tests.py +++ b/model_utils/tests/tests.py @@ -204,10 +204,10 @@ class ChoicesTests(TestCase): def test_repr(self): - self.assertEquals(repr(self.STATUS), - "Choices(" - "('DRAFT', 'DRAFT', 'DRAFT'), " - "('PUBLISHED', 'PUBLISHED', 'PUBLISHED'))") + self.assertEquals(repr(self.STATUS), "Choices" + repr(( + ('DRAFT', 'DRAFT', 'DRAFT'), + ('PUBLISHED', 'PUBLISHED', 'PUBLISHED'), + ))) def test_wrong_length_tuple(self): @@ -249,11 +249,11 @@ class LabelChoicesTests(ChoicesTests): def test_repr(self): - self.assertEquals(repr(self.STATUS), - "Choices(" - "('DRAFT', 'DRAFT', 'is draft'), " - "('PUBLISHED', 'PUBLISHED', 'is published'), " - "('DELETED', 'DELETED', 'DELETED'))") + self.assertEquals(repr(self.STATUS), "Choices" + repr(( + ('DRAFT', 'DRAFT', 'is draft'), + ('PUBLISHED', 'PUBLISHED', 'is published'), + ('DELETED', 'DELETED', 'DELETED'), + ))) @@ -285,12 +285,11 @@ class IdentifierChoicesTests(ChoicesTests): def test_repr(self): - self.assertEquals(repr(self.STATUS), - "Choices(" - "(0, 'DRAFT', 'is draft'), " - "(1, 'PUBLISHED', 'is published'), " - "(2, 'DELETED', 'is deleted'))") - + self.assertEquals(repr(self.STATUS), "Choices" + repr(( + (0, 'DRAFT', 'is draft'), + (1, 'PUBLISHED', 'is published'), + (2, 'DELETED', 'is deleted'), + ))) class InheritanceManagerTests(TestCase): From ca14e4826c2cfd4199801ae7c45e3d3f837148fa Mon Sep 17 00:00:00 2001 From: Trey Hunner Date: Tue, 9 Apr 2013 15:59:55 -0700 Subject: [PATCH 06/13] Note Python/Django version support in CHANGES.rst --- CHANGES.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index 202e8e6..de41a41 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -12,6 +12,8 @@ tip (unreleased) compatibility. - Fix intermittent ``StatusField`` bug. Fixes GH-29. +- Added Python 3 support +- Dropped support for Django 1.2 and 1.3. Django 1.4.2+ required. 1.3.0 (2013.03.27) From e6293d9b0cc798d826b117bd5fc01917fcbc4f48 Mon Sep 17 00:00:00 2001 From: Trey Hunner Date: Wed, 10 Apr 2013 12:09:56 -0700 Subject: [PATCH 07/13] Remove datetime imports unused by Django 1.4+ --- model_utils/fields.py | 8 +------- model_utils/models.py | 8 +------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/model_utils/fields.py b/model_utils/fields.py index 9178e1f..8f8bbbb 100644 --- a/model_utils/fields.py +++ b/model_utils/fields.py @@ -1,15 +1,9 @@ from __future__ import unicode_literals -from datetime import datetime from django.db import models from django.conf import settings from django.utils.encoding import python_2_unicode_compatible - - -try: - from django.utils.timezone import now as now -except ImportError: - now = datetime.now +from django.utils.timezone import now as now class AutoCreatedField(models.DateTimeField): diff --git a/model_utils/models.py b/model_utils/models.py index ff8b375..8de2625 100644 --- a/model_utils/models.py +++ b/model_utils/models.py @@ -1,21 +1,15 @@ from __future__ import unicode_literals -from datetime import datetime from django.db import models from django.utils.translation import ugettext_lazy as _ from django.db.models.fields import FieldDoesNotExist from django.core.exceptions import ImproperlyConfigured +from django.utils.timezone import now as now from model_utils.managers import QueryManager from model_utils.fields import AutoCreatedField, AutoLastModifiedField, \ StatusField, MonitorField -try: - from django.utils.timezone import now as now -except ImportError: - now = datetime.now - - class TimeStampedModel(models.Model): """ From d04a6552a41e7349d00969e5b2a564284e2e15e1 Mon Sep 17 00:00:00 2001 From: Trey Hunner Date: Fri, 12 Apr 2013 07:57:00 -0700 Subject: [PATCH 08/13] Update supported Python/Django versions in README --- README.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.rst b/README.rst index b73ca5d..1ceea79 100644 --- a/README.rst +++ b/README.rst @@ -29,7 +29,8 @@ your ``INSTALLED_APPS`` setting. Dependencies ------------ -``django-model-utils`` is tested with `Django`_ 1.2 and later on Python 2.6 and 2.7. +``django-model-utils`` supports `Django`_ 1.4.2 and later on Python 2.6, 2.7, +3.2, and 3.3. .. _Django: http://www.djangoproject.com/ From f18a180d0e3ac07412d814e326b3875c7468afc8 Mon Sep 17 00:00:00 2001 From: Trey Hunner Date: Fri, 12 Apr 2013 14:26:08 -0700 Subject: [PATCH 09/13] Add supported Python versions to classifier troves --- setup.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/setup.py b/setup.py index 9d12670..cc9fa03 100644 --- a/setup.py +++ b/setup.py @@ -22,6 +22,11 @@ setup( 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', 'Programming Language :: Python', + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.2', + 'Programming Language :: Python :: 3.3', 'Framework :: Django', ], zip_safe=False, From f08f0651d20de27720b9ea444075e7b3267eee31 Mon Sep 17 00:00:00 2001 From: Trey Hunner Date: Fri, 12 Apr 2013 14:55:29 -0700 Subject: [PATCH 10/13] Add minimum required Django version to setup --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index cc9fa03..12af89a 100644 --- a/setup.py +++ b/setup.py @@ -15,6 +15,7 @@ setup( author_email='carl@oddbird.net', url='https://github.com/carljm/django-model-utils/', packages=find_packages(), + install_requires=['django>=1.4.2'], classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Web Environment', From 32bb718107925a0d4fad6f1e10ddf79806829185 Mon Sep 17 00:00:00 2001 From: Trey Hunner Date: Fri, 12 Apr 2013 16:12:06 -0700 Subject: [PATCH 11/13] Remove reduntant "as" in import --- model_utils/fields.py | 2 +- model_utils/models.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/model_utils/fields.py b/model_utils/fields.py index 8f8bbbb..7d46504 100644 --- a/model_utils/fields.py +++ b/model_utils/fields.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals from django.db import models from django.conf import settings from django.utils.encoding import python_2_unicode_compatible -from django.utils.timezone import now as now +from django.utils.timezone import now class AutoCreatedField(models.DateTimeField): diff --git a/model_utils/models.py b/model_utils/models.py index 8de2625..0ad9d32 100644 --- a/model_utils/models.py +++ b/model_utils/models.py @@ -4,7 +4,7 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ from django.db.models.fields import FieldDoesNotExist from django.core.exceptions import ImproperlyConfigured -from django.utils.timezone import now as now +from django.utils.timezone import now from model_utils.managers import QueryManager from model_utils.fields import AutoCreatedField, AutoLastModifiedField, \ From 396bb7ac3fc1123058a8409a54afdd3efc2c78f4 Mon Sep 17 00:00:00 2001 From: Trey Hunner Date: Fri, 12 Apr 2013 16:13:56 -0700 Subject: [PATCH 12/13] Remove with_statement import (was needed for 2.5) --- model_utils/tests/tests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model_utils/tests/tests.py b/model_utils/tests/tests.py index 780b120..ba4de2b 100644 --- a/model_utils/tests/tests.py +++ b/model_utils/tests/tests.py @@ -1,4 +1,4 @@ -from __future__ import unicode_literals, with_statement +from __future__ import unicode_literals import pickle from datetime import datetime, timedelta From c2f3bd8a77c013de0dee09f65cdc260ad35bf51e Mon Sep 17 00:00:00 2001 From: Trey Hunner Date: Fri, 12 Apr 2013 17:01:43 -0700 Subject: [PATCH 13/13] Fix deprecated assertion methods in tests --- model_utils/tests/tests.py | 118 ++++++++++++++++++------------------- 1 file changed, 59 insertions(+), 59 deletions(-) diff --git a/model_utils/tests/tests.py b/model_utils/tests/tests.py index ba4de2b..d2ce0d1 100644 --- a/model_utils/tests/tests.py +++ b/model_utils/tests/tests.py @@ -28,22 +28,22 @@ from model_utils.tests.models import ( class GetExcerptTests(TestCase): def test_split(self): e = get_excerpt("some content\n\n\n\nsome more") - self.assertEquals(e, 'some content\n') + self.assertEqual(e, 'some content\n') def test_auto_split(self): e = get_excerpt("para one\n\npara two\n\npara three") - self.assertEquals(e, 'para one\n\npara two') + self.assertEqual(e, 'para one\n\npara two') def test_middle_of_para(self): e = get_excerpt("some text\n\nmore text") - self.assertEquals(e, 'some text') + self.assertEqual(e, 'some text') def test_middle_of_line(self): e = get_excerpt("some text more text") - self.assertEquals(e, "some text more text") + self.assertEqual(e, "some text more text") @@ -58,45 +58,45 @@ class SplitFieldTests(TestCase): def test_unicode_content(self): - self.assertEquals(text_type(self.post.body), self.full_text) + self.assertEqual(text_type(self.post.body), self.full_text) def test_excerpt(self): - self.assertEquals(self.post.body.excerpt, self.excerpt) + self.assertEqual(self.post.body.excerpt, self.excerpt) def test_content(self): - self.assertEquals(self.post.body.content, self.full_text) + self.assertEqual(self.post.body.content, self.full_text) def test_has_more(self): - self.failUnless(self.post.body.has_more) + self.assertTrue(self.post.body.has_more) def test_not_has_more(self): post = Article.objects.create(title='example 2', body='some text\n\nsome more\n') - self.failIf(post.body.has_more) + self.assertFalse(post.body.has_more) def test_load_back(self): post = Article.objects.get(pk=self.post.pk) - self.assertEquals(post.body.content, self.post.body.content) - self.assertEquals(post.body.excerpt, self.post.body.excerpt) + self.assertEqual(post.body.content, self.post.body.content) + self.assertEqual(post.body.excerpt, self.post.body.excerpt) def test_assign_to_body(self): new_text = 'different\n\n\n\nother' self.post.body = new_text self.post.save() - self.assertEquals(text_type(self.post.body), new_text) + self.assertEqual(text_type(self.post.body), new_text) def test_assign_to_content(self): new_text = 'different\n\n\n\nother' self.post.body.content = new_text self.post.save() - self.assertEquals(text_type(self.post.body), new_text) + self.assertEqual(text_type(self.post.body), new_text) def test_assign_to_excerpt(self): @@ -113,18 +113,18 @@ class SplitFieldTests(TestCase): def test_none(self): a = Article(title='Some Title', body=None) - self.assertEquals(a.body, None) + self.assertEqual(a.body, None) def test_assign_splittext(self): a = Article(title='Some Title') a.body = self.post.body - self.assertEquals(a.body.excerpt, 'summary\n') + self.assertEqual(a.body.excerpt, 'summary\n') def test_value_to_string(self): f = self.post._meta.get_field('body') - self.assertEquals(f.value_to_string(self.post), self.full_text) + self.assertEqual(f.value_to_string(self.post), self.full_text) def test_abstract_inheritance(self): @@ -145,13 +145,13 @@ class MonitorFieldTests(TestCase): def test_save_no_change(self): self.instance.save() - self.assertEquals(self.instance.name_changed, self.created) + self.assertEqual(self.instance.name_changed, self.created) def test_save_changed(self): self.instance.name = 'Maria' self.instance.save() - self.failUnless(self.instance.name_changed > self.created) + self.assertTrue(self.instance.name_changed > self.created) def test_double_save(self): @@ -159,7 +159,7 @@ class MonitorFieldTests(TestCase): self.instance.save() changed = self.instance.name_changed self.instance.save() - self.assertEquals(self.instance.name_changed, changed) + self.assertEqual(self.instance.name_changed, changed) def test_no_monitor_arg(self): @@ -170,11 +170,11 @@ class StatusFieldTests(TestCase): def test_status_with_default_filled(self): instance = StatusFieldDefaultFilled() - self.assertEquals(instance.status, instance.STATUS.yes) + self.assertEqual(instance.status, instance.STATUS.yes) def test_status_with_default_not_filled(self): instance = StatusFieldDefaultNotFilled() - self.assertEquals(instance.status, instance.STATUS.no) + self.assertEqual(instance.status, instance.STATUS.no) def test_no_check_for_status(self): field = StatusField(no_check_for_status=True) @@ -188,15 +188,15 @@ class ChoicesTests(TestCase): def test_getattr(self): - self.assertEquals(self.STATUS.DRAFT, 'DRAFT') + self.assertEqual(self.STATUS.DRAFT, 'DRAFT') def test_indexing(self): - self.assertEquals(self.STATUS[1], ('PUBLISHED', 'PUBLISHED')) + self.assertEqual(self.STATUS[1], ('PUBLISHED', 'PUBLISHED')) def test_iteration(self): - self.assertEquals(tuple(self.STATUS), (('DRAFT', 'DRAFT'), ('PUBLISHED', 'PUBLISHED'))) + self.assertEqual(tuple(self.STATUS), (('DRAFT', 'DRAFT'), ('PUBLISHED', 'PUBLISHED'))) def test_len(self): @@ -204,7 +204,7 @@ class ChoicesTests(TestCase): def test_repr(self): - self.assertEquals(repr(self.STATUS), "Choices" + repr(( + self.assertEqual(repr(self.STATUS), "Choices" + repr(( ('DRAFT', 'DRAFT', 'DRAFT'), ('PUBLISHED', 'PUBLISHED', 'PUBLISHED'), ))) @@ -225,7 +225,7 @@ class LabelChoicesTests(ChoicesTests): def test_iteration(self): - self.assertEquals(tuple(self.STATUS), ( + self.assertEqual(tuple(self.STATUS), ( ('DRAFT', 'is draft'), ('PUBLISHED', 'is published'), ('DELETED', 'DELETED')) @@ -233,15 +233,15 @@ class LabelChoicesTests(ChoicesTests): def test_indexing(self): - self.assertEquals(self.STATUS[1], ('PUBLISHED', 'is published')) + self.assertEqual(self.STATUS[1], ('PUBLISHED', 'is published')) def test_default(self): - self.assertEquals(self.STATUS.DELETED, 'DELETED') + self.assertEqual(self.STATUS.DELETED, 'DELETED') def test_provided(self): - self.assertEquals(self.STATUS.DRAFT, 'DRAFT') + self.assertEqual(self.STATUS.DRAFT, 'DRAFT') def test_len(self): @@ -249,7 +249,7 @@ class LabelChoicesTests(ChoicesTests): def test_repr(self): - self.assertEquals(repr(self.STATUS), "Choices" + repr(( + self.assertEqual(repr(self.STATUS), "Choices" + repr(( ('DRAFT', 'DRAFT', 'is draft'), ('PUBLISHED', 'PUBLISHED', 'is published'), ('DELETED', 'DELETED', 'DELETED'), @@ -273,11 +273,11 @@ class IdentifierChoicesTests(ChoicesTests): def test_indexing(self): - self.assertEquals(self.STATUS[1], (1, 'is published')) + self.assertEqual(self.STATUS[1], (1, 'is published')) def test_getattr(self): - self.assertEquals(self.STATUS.DRAFT, 0) + self.assertEqual(self.STATUS.DRAFT, 0) def test_len(self): @@ -285,7 +285,7 @@ class IdentifierChoicesTests(ChoicesTests): def test_repr(self): - self.assertEquals(repr(self.STATUS), "Choices" + repr(( + self.assertEqual(repr(self.STATUS), "Choices" + repr(( (0, 'DRAFT', 'is draft'), (1, 'PUBLISHED', 'is published'), (2, 'DELETED', 'is deleted'), @@ -309,7 +309,7 @@ class InheritanceManagerTests(TestCase): InheritanceManagerTestParent(pk=self.child2.pk), InheritanceManagerTestParent(pk=self.grandchild1.pk), ]) - self.assertEquals(set(self.get_manager().all()), children) + self.assertEqual(set(self.get_manager().all()), children) def test_select_all_subclasses(self): @@ -318,7 +318,7 @@ class InheritanceManagerTests(TestCase): children.add(self.grandchild1) else: children.add(InheritanceManagerTestChild1(pk=self.grandchild1.pk)) - self.assertEquals( + self.assertEqual( set(self.get_manager().select_subclasses()), children) @@ -328,7 +328,7 @@ class InheritanceManagerTests(TestCase): InheritanceManagerTestParent(pk=self.child2.pk), InheritanceManagerTestChild1(pk=self.grandchild1.pk), ]) - self.assertEquals( + self.assertEqual( set( self.get_manager().select_subclasses( "inheritancemanagertestchild1") @@ -344,7 +344,7 @@ class InheritanceManagerTests(TestCase): InheritanceManagerTestParent(pk=self.child2.pk), self.grandchild1, ]) - self.assertEquals( + self.assertEqual( set( self.get_manager().select_subclasses( "inheritancemanagertestchild1__" @@ -356,7 +356,7 @@ class InheritanceManagerTests(TestCase): def test_get_subclass(self): - self.assertEquals( + self.assertEqual( self.get_manager().get_subclass(pk=self.child1.pk), self.child1) @@ -422,14 +422,14 @@ class TimeStampedModelTests(TestCase): def test_created(self): t1 = TimeStamp.objects.create() t2 = TimeStamp.objects.create() - self.assert_(t2.created > t1.created) + self.assertTrue(t2.created > t1.created) def test_modified(self): t1 = TimeStamp.objects.create() t2 = TimeStamp.objects.create() t1.save() - self.assert_(t2.modified < t1.modified) + self.assertTrue(t2.modified < t1.modified) @@ -440,34 +440,34 @@ class TimeFramedModelTests(TestCase): def test_not_yet_begun(self): TimeFrame.objects.create(start=self.now+timedelta(days=2)) - self.assertEquals(TimeFrame.timeframed.count(), 0) + self.assertEqual(TimeFrame.timeframed.count(), 0) def test_finished(self): TimeFrame.objects.create(end=self.now-timedelta(days=1)) - self.assertEquals(TimeFrame.timeframed.count(), 0) + self.assertEqual(TimeFrame.timeframed.count(), 0) def test_no_end(self): TimeFrame.objects.create(start=self.now-timedelta(days=10)) - self.assertEquals(TimeFrame.timeframed.count(), 1) + self.assertEqual(TimeFrame.timeframed.count(), 1) def test_no_start(self): TimeFrame.objects.create(end=self.now+timedelta(days=2)) - self.assertEquals(TimeFrame.timeframed.count(), 1) + self.assertEqual(TimeFrame.timeframed.count(), 1) def test_within_range(self): TimeFrame.objects.create(start=self.now-timedelta(days=1), end=self.now+timedelta(days=1)) - self.assertEquals(TimeFrame.timeframed.count(), 1) + self.assertEqual(TimeFrame.timeframed.count(), 1) class TimeFrameManagerAddedTests(TestCase): def test_manager_available(self): - self.assert_(isinstance(TimeFrameManagerAdded.timeframed, QueryManager)) + self.assertTrue(isinstance(TimeFrameManagerAdded.timeframed, QueryManager)) def test_conflict_error(self): @@ -488,9 +488,9 @@ class StatusModelTests(TestCase): def test_created(self): c1 = self.model.objects.create() c2 = self.model.objects.create() - self.assert_(c2.status_changed > c1.status_changed) - self.assertEquals(self.model.active.count(), 2) - self.assertEquals(self.model.deleted.count(), 0) + self.assertTrue(c2.status_changed > c1.status_changed) + self.assertEqual(self.model.active.count(), 2) + self.assertEqual(self.model.deleted.count(), 0) def test_modification(self): @@ -498,16 +498,16 @@ class StatusModelTests(TestCase): date_created = t1.status_changed t1.status = self.on_hold t1.save() - self.assertEquals(self.model.active.count(), 0) - self.assertEquals(self.model.on_hold.count(), 1) - self.assert_(t1.status_changed > date_created) + self.assertEqual(self.model.active.count(), 0) + self.assertEqual(self.model.on_hold.count(), 1) + self.assertTrue(t1.status_changed > date_created) date_changed = t1.status_changed t1.save() - self.assertEquals(t1.status_changed, date_changed) + self.assertEqual(t1.status_changed, date_changed) date_active_again = t1.status_changed t1.status = self.active t1.save() - self.assert_(t1.status_changed > date_active_again) + self.assertTrue(t1.status_changed > date_active_again) @@ -521,7 +521,7 @@ class StatusModelPlainTupleTests(StatusModelTests): class StatusManagerAddedTests(TestCase): def test_manager_available(self): - self.assert_(isinstance(StatusManagerAdded.active, QueryManager)) + self.assertTrue(isinstance(StatusManagerAdded.active, QueryManager)) def test_conflict_error(self): @@ -550,17 +550,17 @@ class QueryManagerTests(TestCase): def test_passing_kwargs(self): qs = Post.public.all() - self.assertEquals([p.order for p in qs], [0, 1, 4, 5]) + self.assertEqual([p.order for p in qs], [0, 1, 4, 5]) def test_passing_Q(self): qs = Post.public_confirmed.all() - self.assertEquals([p.order for p in qs], [0, 1]) + self.assertEqual([p.order for p in qs], [0, 1]) def test_ordering(self): qs = Post.public_reversed.all() - self.assertEquals([p.order for p in qs], [5, 4, 1, 0]) + self.assertEqual([p.order for p in qs], [5, 4, 1, 0]) @@ -575,7 +575,7 @@ if introspector: def test_introspector_adds_no_excerpt_field(self): mf = Article._meta.get_field('body') args, kwargs = introspector(mf) - self.assertEquals(kwargs['no_excerpt_field'], 'True') + self.assertEqual(kwargs['no_excerpt_field'], 'True') def test_no_excerpt_field_works(self):