From 72cc3d769d8444ebf0a846b017bb6388e66d72f6 Mon Sep 17 00:00:00 2001 From: Sobolev Nikita Date: Fri, 7 Apr 2017 13:18:14 +0300 Subject: [PATCH 01/10] Updates README.rst with svg badge --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 4c769cf..f72b011 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -.. image:: https://travis-ci.org/django-polymorphic/django-polymorphic.png?branch=master +.. image:: https://travis-ci.org/django-polymorphic/django-polymorphic.svg?branch=master :target: http://travis-ci.org/django-polymorphic/django-polymorphic .. image:: https://img.shields.io/pypi/v/django-polymorphic.svg :target: https://pypi.python.org/pypi/django-polymorphic/ From f010c6ddf71e7d68e9895196fae7ab92ee80b3d0 Mon Sep 17 00:00:00 2001 From: Charlie Denton Date: Wed, 12 Apr 2017 23:52:06 +0100 Subject: [PATCH 02/10] Get tests running on django 1.11 I'm a little concerned that this loses some of the efficiencies (in particular, chunking) from previous versions. That's something that can probably be improved. --- polymorphic/query.py | 98 +++++++++++++++++++++++++++----------------- 1 file changed, 61 insertions(+), 37 deletions(-) diff --git a/polymorphic/query.py b/polymorphic/query.py index c842414..fb1dfa8 100644 --- a/polymorphic/query.py +++ b/polymorphic/query.py @@ -25,6 +25,25 @@ except ImportError: Polymorphic_QuerySet_objects_per_request = CHUNK_SIZE +if django.VERSION >= (1, 9): + # We ignore this on django < 1.9, as ModelIterable didn't yet exist. + from django.db.models.query import ModelIterable + + + class PolymorphicModelIterable(ModelIterable): + def __iter__(self): + base_iter = super(PolymorphicModelIterable, self).__iter__() + + if self.queryset.polymorphic_disabled: + for o in base_iter: + yield o + return + + real_instances = self.queryset._get_real_instances(base_iter) + for obj in real_instances: + yield obj + + def transmogrify(cls, obj): """ Upcast a class to a different type without asking questions. @@ -72,6 +91,9 @@ class PolymorphicQuerySet(QuerySet): # to that queryset as well). self.polymorphic_deferred_loading = (set([]), True) super(PolymorphicQuerySet, self).__init__(*args, **kwargs) + if django.VERSION >= (1, 9): + # On django < 1.9 we override the iterator() method instead + self._iterable_class = PolymorphicModelIterable def _clone(self, *args, **kwargs): # Django's _clone only copies its own variables, so we need to copy ours here @@ -407,49 +429,51 @@ class PolymorphicQuerySet(QuerySet): return resultlist - def iterator(self): - """ - This function is used by Django for all object retrieval. - By overriding it, we modify the objects that this queryset returns - when it is evaluated (or its get method or other object-returning methods are called). + if django.VERSION < (1, 9): + # On django 1.9+, we can define self._iterator_class instead of iterator() + def iterator(self): + """ + This function is used by Django for all object retrieval. + By overriding it, we modify the objects that this queryset returns + when it is evaluated (or its get method or other object-returning methods are called). - Here we do the same as:: + Here we do the same as:: - base_result_objects = list(super(PolymorphicQuerySet, self).iterator()) - real_results = self._get_real_instances(base_result_objects) - for o in real_results: yield o + base_result_objects = list(super(PolymorphicQuerySet, self).iterator()) + real_results = self._get_real_instances(base_result_objects) + for o in real_results: yield o - but it requests the objects in chunks from the database, - with Polymorphic_QuerySet_objects_per_request per chunk - """ - base_iter = super(PolymorphicQuerySet, self).iterator() + but it requests the objects in chunks from the database, + with Polymorphic_QuerySet_objects_per_request per chunk + """ + base_iter = super(PolymorphicQuerySet, self).iterator() - # disabled => work just like a normal queryset - if self.polymorphic_disabled: - for o in base_iter: - yield o - return - - while True: - base_result_objects = [] - reached_end = False - - for i in range(Polymorphic_QuerySet_objects_per_request): - try: - o = next(base_iter) - base_result_objects.append(o) - except StopIteration: - reached_end = True - break - - real_results = self._get_real_instances(base_result_objects) - - for o in real_results: - yield o - - if reached_end: + # disabled => work just like a normal queryset + if self.polymorphic_disabled: + for o in base_iter: + yield o return + while True: + base_result_objects = [] + reached_end = False + + for i in range(Polymorphic_QuerySet_objects_per_request): + try: + o = next(base_iter) + base_result_objects.append(o) + except StopIteration: + reached_end = True + break + + real_results = self._get_real_instances(base_result_objects) + + for o in real_results: + yield o + + if reached_end: + return + def __repr__(self, *args, **kwargs): if self.model.polymorphic_query_multiline_output: result = [repr(o) for o in self.all()] From 64325d0f9945c16507d42a233f66cf67cd3a6796 Mon Sep 17 00:00:00 2001 From: Charlie Denton Date: Thu, 13 Apr 2017 00:18:31 +0100 Subject: [PATCH 03/10] Do not allow failures on django 1.11 --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index be2fa59..175a66b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -90,7 +90,6 @@ matrix: - python: "2.6" env: DJANGO="https://github.com/django/django/tarball/master" allow_failures: - - env: DJANGO="Django>=1.11,<1.12" - env: DJANGO="https://github.com/django/django/tarball/master" before_install: From 7dfe58bb10442546fa65b7b0e1d47f49360ebd72 Mon Sep 17 00:00:00 2001 From: Charlie Denton Date: Fri, 14 Apr 2017 00:49:35 +0100 Subject: [PATCH 04/10] Remove duplicate line in tox config --- tox.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/tox.ini b/tox.ini index ee02b1b..c4abcf5 100644 --- a/tox.ini +++ b/tox.ini @@ -5,7 +5,6 @@ envlist= py32-django{15,16,17,18}, py33-django{15,16,17,18}, py34-django{15,16,17,18,19,110,111}, - py35-django{18,19,110,111} py35-django{18,19,110,111}, py36-django{111}, # py33-django-dev, From 24d7509879ae95ec4dc7e0339fe11095b8283cc8 Mon Sep 17 00:00:00 2001 From: Charlie Denton Date: Fri, 14 Apr 2017 00:53:17 +0100 Subject: [PATCH 05/10] Run django master in tox tests --- tox.ini | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tox.ini b/tox.ini index c4abcf5..32508e2 100644 --- a/tox.ini +++ b/tox.ini @@ -5,9 +5,8 @@ envlist= py32-django{15,16,17,18}, py33-django{15,16,17,18}, py34-django{15,16,17,18,19,110,111}, - py35-django{18,19,110,111}, - py36-django{111}, - # py33-django-dev, + py35-django{18,19,110,111,dev}, + py36-django{111,dev}, docs, [testenv] @@ -20,7 +19,7 @@ deps = django19: Django >= 1.9, < 1.10 django110: Django >= 1.10, < 1.11 django111: Django >= 1.11, < 1.12 - django-dev: https://github.com/django/django/tarball/master + djangodev: https://github.com/django/django/tarball/master commands= python runtests.py From c6e58db73e95e479c5e0298ff3fab9726c422739 Mon Sep 17 00:00:00 2001 From: Charlie Denton Date: Fri, 14 Apr 2017 01:03:11 +0100 Subject: [PATCH 06/10] Use tox for travis builds This paves the way for more complex tox configs that don't need duplicated config. --- .travis.yml | 154 ++++++++++++++++++++++++++-------------------------- tox.ini | 3 +- 2 files changed, 78 insertions(+), 79 deletions(-) diff --git a/.travis.yml b/.travis.yml index be2fa59..9da22ac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,97 +10,95 @@ python: - "3.5" - "3.6" env: - - DJANGO="Django>=1.4,<1.5" - - DJANGO="Django>=1.5,<1.6" - - DJANGO="Django>=1.6,<1.7" - - DJANGO="Django>=1.7,<1.8" - - DJANGO="Django>=1.8,<1.9" - - DJANGO="Django>=1.9,<1.10" - - DJANGO="Django>=1.10,<1.11" - - DJANGO="Django>=1.11,<1.12" - - DJANGO="https://github.com/django/django/tarball/master" + - TOX_ENV="django14" + - TOX_ENV="django15" + - TOX_ENV="django16" + - TOX_ENV="django17" + - TOX_ENV="django18" + - TOX_ENV="django19" + - TOX_ENV="django110" + - TOX_ENV="django111" + - TOX_ENV="djangodev" matrix: exclude: - - python: "3.6" - env: DJANGO="Django>=1.4,<1.5" - - python: "3.6" - env: DJANGO="Django>=1.5,<1.6" - - python: "3.6" - env: DJANGO="Django>=1.6,<1.7" - - python: "3.6" - env: DJANGO="Django>=1.7,<1.8" - - python: "3.6" - env: DJANGO="Django>=1.8,<1.9" - - python: "3.6" - env: DJANGO="Django>=1.9,<1.10" - - python: "3.6" - env: DJANGO="Django>=1.10,<1.11" + - python: "3.6" + env: TOX_ENV="django14" + - python: "3.6" + env: TOX_ENV="django15" + - python: "3.6" + env: TOX_ENV="django16" + - python: "3.6" + env: TOX_ENV="django17" + - python: "3.6" + env: TOX_ENV="django18" + - python: "3.6" + env: TOX_ENV="django19" + - python: "3.6" + env: TOX_ENV="django110" - - python: "3.5" - env: DJANGO="Django>=1.4,<1.5" - - python: "3.5" - env: DJANGO="Django>=1.5,<1.6" - - python: "3.5" - env: DJANGO="Django>=1.6,<1.7" - - python: "3.5" - env: DJANGO="Django>=1.7,<1.8" + - python: "3.5" + env: TOX_ENV="django14" + - python: "3.5" + env: TOX_ENV="django15" + - python: "3.5" + env: TOX_ENV="django16" + - python: "3.5" + env: TOX_ENV="django17" - - python: "3.4" - env: DJANGO="Django>=1.4,<1.5" - - python: "3.4" - env: DJANGO="Django>=1.9,<1.10" - - python: "3.4" - env: DJANGO="Django>=1.10,<1.11" - - python: "3.4" - env: DJANGO="Django>=1.11,<1.12" + - python: "3.4" + env: TOX_ENV="django14" + - python: "3.4" + env: TOX_ENV="django19" + - python: "3.4" + env: TOX_ENV="django110" + - python: "3.4" + env: TOX_ENV="django111" - - python: "3.3" - env: DJANGO="Django>=1.4,<1.5" - - python: "3.3" - env: DJANGO="Django>=1.9,<1.10" - - python: "3.3" - env: DJANGO="Django>=1.10,<1.11" - - python: "3.3" - env: DJANGO="Django>=1.11,<1.12" - - python: "3.3" - env: DJANGO="https://github.com/django/django/tarball/master" + - python: "3.3" + env: TOX_ENV="django14" + - python: "3.3" + env: TOX_ENV="django19" + - python: "3.3" + env: TOX_ENV="django110" + - python: "3.3" + env: TOX_ENV="django111" + - python: "3.3" + env: TOX_ENV="djangodev" - - python: "3.2" - env: DJANGO="Django>=1.4,<1.5" - - python: "3.2" - env: DJANGO="Django>=1.9,<1.10" - - python: "3.2" - env: DJANGO="Django>=1.10,<1.11" - - python: "3.2" - env: DJANGO="Django>=1.11,<1.12" - - python: "3.2" - env: DJANGO="https://github.com/django/django/tarball/master" + - python: "3.2" + env: TOX_ENV="django14" + - python: "3.2" + env: TOX_ENV="django19" + - python: "3.2" + env: TOX_ENV="django110" + - python: "3.2" + env: TOX_ENV="django111" + - python: "3.2" + env: TOX_ENV="djangodev" + + - python: "2.6" + env: TOX_ENV="django17" + - python: "2.6" + env: TOX_ENV="django18" + - python: "2.6" + env: TOX_ENV="django19" + - python: "2.6" + env: TOX_ENV="django110" + - python: "2.6" + env: TOX_ENV="django111" + - python: "2.6" + env: TOX_ENV="djangodev" - - python: "2.6" - env: DJANGO="Django>=1.7,<1.8" - - python: "2.6" - env: DJANGO="Django>=1.8,<1.9" - - python: "2.6" - env: DJANGO="Django>=1.9,<1.10" - - python: "2.6" - env: DJANGO="Django>=1.10,<1.11" - - python: "2.6" - env: DJANGO="Django>=1.11,<1.12" - - python: "2.6" - env: DJANGO="https://github.com/django/django/tarball/master" allow_failures: - - env: DJANGO="Django>=1.11,<1.12" - - env: DJANGO="https://github.com/django/django/tarball/master" + - env: TOX_ENV="django111" + - env: TOX_ENV="djangodev" before_install: -- pip install codecov - -install: - - pip install -q $DJANGO coverage==3.6 +- pip install codecov tox script: - - coverage run --source=polymorphic runtests.py + - tox -e py${TRAVIS_PYTHON_VERSION/./}-$TOX_ENV after_success: - codecov diff --git a/tox.ini b/tox.ini index 32508e2..cff1ea7 100644 --- a/tox.ini +++ b/tox.ini @@ -11,6 +11,7 @@ envlist= [testenv] deps = + coverage == 3.6 django14: Django >= 1.4, < 1.5 django15: Django >= 1.5, < 1.6 django16: Django >= 1.6, < 1.7 @@ -21,7 +22,7 @@ deps = django111: Django >= 1.11, < 1.12 djangodev: https://github.com/django/django/tarball/master commands= - python runtests.py + coverage run --source polymorphic runtests.py [testenv:docs] deps=Sphinx From d5886387d4f641e665348926b55b0a309b6080e7 Mon Sep 17 00:00:00 2001 From: Charlie Denton Date: Fri, 14 Apr 2017 01:10:59 +0100 Subject: [PATCH 07/10] Allow travis builds to report failure early --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 9da22ac..d4329d0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,6 +21,7 @@ env: - TOX_ENV="djangodev" matrix: + fast_finish: true exclude: - python: "3.6" env: TOX_ENV="django14" From a57b067b425a40678238a88cf5cc330cc44b44aa Mon Sep 17 00:00:00 2001 From: Charlie Denton Date: Fri, 14 Apr 2017 01:26:24 +0100 Subject: [PATCH 08/10] Compile coverage for coveralls command on travis --- .gitignore | 1 + tox.ini | 1 + 2 files changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index e63dffc..8699683 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ *.egg-info/ *.egg/ .coverage +coverage.xml .project .idea/ .pydevproject diff --git a/tox.ini b/tox.ini index cff1ea7..0b79eca 100644 --- a/tox.ini +++ b/tox.ini @@ -23,6 +23,7 @@ deps = djangodev: https://github.com/django/django/tarball/master commands= coverage run --source polymorphic runtests.py + coverage xml -i [testenv:docs] deps=Sphinx From 1481891733d727dc4a69902d24c2d4b1902457bb Mon Sep 17 00:00:00 2001 From: Charlie Denton Date: Sat, 15 Apr 2017 00:07:57 +0100 Subject: [PATCH 09/10] Use TOXENV env var in travis config I had previously used TOX_ENV, but not realised that TOXENV has a special meaning for tox. We can now expect TOX to run the appropriate build on travis without having it explicitly passed into the tox command. --- .travis.yml | 86 ++++++++++++++++++++++++++--------------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/.travis.yml b/.travis.yml index d4329d0..0cfc81e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,96 +10,96 @@ python: - "3.5" - "3.6" env: - - TOX_ENV="django14" - - TOX_ENV="django15" - - TOX_ENV="django16" - - TOX_ENV="django17" - - TOX_ENV="django18" - - TOX_ENV="django19" - - TOX_ENV="django110" - - TOX_ENV="django111" - - TOX_ENV="djangodev" + - TOXENV="django14" + - TOXENV="django15" + - TOXENV="django16" + - TOXENV="django17" + - TOXENV="django18" + - TOXENV="django19" + - TOXENV="django110" + - TOXENV="django111" + - TOXENV="djangodev" matrix: fast_finish: true exclude: - python: "3.6" - env: TOX_ENV="django14" + env: TOXENV="django14" - python: "3.6" - env: TOX_ENV="django15" + env: TOXENV="django15" - python: "3.6" - env: TOX_ENV="django16" + env: TOXENV="django16" - python: "3.6" - env: TOX_ENV="django17" + env: TOXENV="django17" - python: "3.6" - env: TOX_ENV="django18" + env: TOXENV="django18" - python: "3.6" - env: TOX_ENV="django19" + env: TOXENV="django19" - python: "3.6" - env: TOX_ENV="django110" + env: TOXENV="django110" - python: "3.5" - env: TOX_ENV="django14" + env: TOXENV="django14" - python: "3.5" - env: TOX_ENV="django15" + env: TOXENV="django15" - python: "3.5" - env: TOX_ENV="django16" + env: TOXENV="django16" - python: "3.5" - env: TOX_ENV="django17" + env: TOXENV="django17" - python: "3.4" - env: TOX_ENV="django14" + env: TOXENV="django14" - python: "3.4" - env: TOX_ENV="django19" + env: TOXENV="django19" - python: "3.4" - env: TOX_ENV="django110" + env: TOXENV="django110" - python: "3.4" - env: TOX_ENV="django111" + env: TOXENV="django111" - python: "3.3" - env: TOX_ENV="django14" + env: TOXENV="django14" - python: "3.3" - env: TOX_ENV="django19" + env: TOXENV="django19" - python: "3.3" - env: TOX_ENV="django110" + env: TOXENV="django110" - python: "3.3" - env: TOX_ENV="django111" + env: TOXENV="django111" - python: "3.3" - env: TOX_ENV="djangodev" + env: TOXENV="djangodev" - python: "3.2" - env: TOX_ENV="django14" + env: TOXENV="django14" - python: "3.2" - env: TOX_ENV="django19" + env: TOXENV="django19" - python: "3.2" - env: TOX_ENV="django110" + env: TOXENV="django110" - python: "3.2" - env: TOX_ENV="django111" + env: TOXENV="django111" - python: "3.2" - env: TOX_ENV="djangodev" + env: TOXENV="djangodev" - python: "2.6" - env: TOX_ENV="django17" + env: TOXENV="django17" - python: "2.6" - env: TOX_ENV="django18" + env: TOXENV="django18" - python: "2.6" - env: TOX_ENV="django19" + env: TOXENV="django19" - python: "2.6" - env: TOX_ENV="django110" + env: TOXENV="django110" - python: "2.6" - env: TOX_ENV="django111" + env: TOXENV="django111" - python: "2.6" - env: TOX_ENV="djangodev" + env: TOXENV="djangodev" allow_failures: - - env: TOX_ENV="django111" - - env: TOX_ENV="djangodev" + - env: TOXENV="django111" + - env: TOXENV="djangodev" before_install: - pip install codecov tox script: - - tox -e py${TRAVIS_PYTHON_VERSION/./}-$TOX_ENV + - tox after_success: - codecov From fcbbbe52b30343d0bf2d7b21004ca6428a1fb185 Mon Sep 17 00:00:00 2001 From: Charlie Denton Date: Sat, 15 Apr 2017 00:11:33 +0100 Subject: [PATCH 10/10] Explicitly build coverage XML on travis, not tox --- .travis.yml | 3 ++- tox.ini | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0cfc81e..532655e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -96,12 +96,13 @@ matrix: - env: TOXENV="djangodev" before_install: -- pip install codecov tox +- pip install codecov coverage==3.6 tox script: - tox after_success: +- coverage xml -i - codecov branches: diff --git a/tox.ini b/tox.ini index 0b79eca..cff1ea7 100644 --- a/tox.ini +++ b/tox.ini @@ -23,7 +23,6 @@ deps = djangodev: https://github.com/django/django/tarball/master commands= coverage run --source polymorphic runtests.py - coverage xml -i [testenv:docs] deps=Sphinx