From 3775860565d43a77cbf2ba7d46a6ee03d1926175 Mon Sep 17 00:00:00 2001 From: Fabre Florian Date: Thu, 23 Jan 2020 21:52:04 +0100 Subject: [PATCH 1/5] Improve travis script & switch to bionic beaver (python 3.8) --- .travis.yml | 61 ++++++++++++++--------------------------------------- tox.ini | 16 +++++++++++--- 2 files changed, 29 insertions(+), 48 deletions(-) diff --git a/.travis.yml b/.travis.yml index ce8b071..0319e3d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,54 +1,25 @@ -dist: trusty +dist: bionic sudo: false language: python -env: - matrix: - - TOXENV=flake8 - - TOXENV=isort cache: pip -matrix: +python: + - 2.7 + - 3.4 + - 3.5 + - 3.6 + - 3.7 + - 3.8 +stages: + - lint + - test +jobs: fast_finish: true include: - - python: 2.7 - env: TOXENV=py27-1.11 - - python: 3.4 - env: TOXENV=py34-1.11 - - python: 3.4 - env: TOXENV=py34-2.0 - - python: 3.5 - env: TOXENV=py35-1.11 - - python: 3.5 - env: TOXENV=py35-2.0 - - python: 3.5 - env: TOXENV=py35-2.1 - - python: 3.5 - env: TOXENV=py35-master - - python: 3.6 - env: TOXENV=py36-1.11 - - python: 3.6 - env: TOXENV=py36-2.0 - - python: 3.6 - env: TOXENV=py36-2.1 - - python: 3.6 - env: TOXENV=py36-master - - python: 3.7 - env: TOXENV=py37-2.0 - dist: xenial - sudo: true - - python: 3.7 - env: TOXENV=py37-2.1 - dist: xenial - sudo: true - - python: 3.7 - env: TOXENV=py37-master - dist: xenial - sudo: true - allow_failures: - - env: TOXENV=py35-master - - env: TOXENV=py36-master - - env: TOXENV=py37-master + - { stage: lint, env: TOXENV=flake8, python: 3.6 } + - { stage: lint, env: TOXENV=isort, python: 3.6 } + install: -- pip install tox coveralls +- pip install tox coveralls tox-travis script: - tox after_success: diff --git a/tox.ini b/tox.ini index fcd5535..75db51b 100644 --- a/tox.ini +++ b/tox.ini @@ -6,9 +6,18 @@ envlist = isort, py27-1.11, py34-{1.11,2.0}, - py35-{1.11,2.0,2.1,master}, + py35-{1.11,2.0,2.1}, py36-{1.11,2.0,2.1,master}, - py37-{1.11,2.0,2.1,master} + py37-{1.11,2.0,2.1,master}, + py38-{2.1,master}, + +[tox:travis] +2.7 = py27 +3.4 = py34 +3.5 = py35 +3.6 = py36 +3.7 = py37 +3.8 = py38 [testenv] basepython = @@ -17,9 +26,10 @@ basepython = py35: python3.5 py36: python3.6 py37: python3.7 + py38: python3.8 usedevelop = true commands = - {envpython} -R -Wonce {envbindir}/coverage run -m django test -v2 --settings=tests.settings {posargs} + {envpython} -R -Wonce {envbindir}/coverage run --branch django test -v2 --settings=tests.settings {posargs} coverage report deps = coverage From 79626f385fcf3b6500fb17167a1307fc89390098 Mon Sep 17 00:00:00 2001 From: Fabre Florian Date: Thu, 23 Jan 2020 21:54:09 +0100 Subject: [PATCH 2/5] Improve coverage reporting --- .coveragerc | 5 +++++ picklefield/fields.py | 15 +++++---------- tests/models.py | 1 + tests/tests.py | 21 +++++++++++++++++++++ tox.ini | 5 +++-- 5 files changed, 35 insertions(+), 12 deletions(-) diff --git a/.coveragerc b/.coveragerc index 7c7a536..9d0ba33 100644 --- a/.coveragerc +++ b/.coveragerc @@ -1,3 +1,8 @@ [run] source = picklefield branch = True + +[report] +exclude_lines = + pragma: no cover + except ImportError: diff --git a/picklefield/fields.py b/picklefield/fields.py index ef811d3..9fa18c1 100644 --- a/picklefield/fields.py +++ b/picklefield/fields.py @@ -4,7 +4,6 @@ from copy import deepcopy from zlib import compress, decompress -import django from django.core import checks from django.db import models from django.utils.encoding import force_text @@ -12,9 +11,9 @@ from .constants import DEFAULT_PROTOCOL try: - from cPickle import loads, dumps + from cPickle import loads, dumps # pragma: no cover except ImportError: - from pickle import loads, dumps + from pickle import loads, dumps # pragma: no cover class PickledObject(str): @@ -158,7 +157,7 @@ def to_python(self, value): value = dbsafe_decode(value, self.compress) except Exception: # If the value is a definite pickle; and an error is raised in - # de-pickling it should be allowed to propogate. + # de-pickling it should be allowed to propagate. if isinstance(value, PickledObject): raise else: @@ -170,12 +169,8 @@ def pre_save(self, model_instance, add): value = super(PickledObjectField, self).pre_save(model_instance, add) return wrap_conflictual_object(value) - if django.VERSION < (2, 0): - def from_db_value(self, value, expression, connection, context): - return self.to_python(value) - else: - def from_db_value(self, value, expression, connection): - return self.to_python(value) + def from_db_value(self, value, expression, connection, context=None): + return self.to_python(value) def get_db_prep_value(self, value, connection=None, prepared=False): """ diff --git a/tests/models.py b/tests/models.py index cc10344..3c80b6e 100644 --- a/tests/models.py +++ b/tests/models.py @@ -27,6 +27,7 @@ class TestingModel(models.Model): default_pickle_field = PickledObjectField(default=(D1, S1, T1, L1)) callable_pickle_field = PickledObjectField(default=date.today) non_copying_field = PickledObjectField(copy=False, default=TestCopyDataType('boom!')) + nullable_pickle_field = PickledObjectField(null=True) class MinimalTestingModel(models.Model): diff --git a/tests/tests.py b/tests/tests.py index 6afe920..1bb42f8 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -14,6 +14,11 @@ TestCustomDataType, TestingModel, ) +try: + from unittest.mock import patch # pragma: no cover +except ImportError: + from mock import patch # pragma: no cover + class PickledObjectFieldTests(TestCase): def setUp(self): @@ -35,6 +40,7 @@ def test_data_integrity(self): # the same data, even thought it's stored differently in the DB. self.assertEqual(value, model_test.pickle_field) self.assertEqual(value, model_test.compressed_pickle_field) + self.assertIsNone(model_test.nullable_pickle_field) # Make sure we can also retrieve the model model_test.save() model_test.delete() @@ -181,6 +187,21 @@ def test_empty_strings_not_allowed(self): with self.assertRaises(IntegrityError): MinimalTestingModel.objects.create() + def test_decode_error(self): + def mock_decode_error(*args, **kwargs): + raise Exception() + + model = MinimalTestingModel.objects.create(pickle_field={'foo': 'bar'}) + model.save() + + self.assertEqual( + {'foo': 'bar'}, MinimalTestingModel.objects.get(pk=model.pk).pickle_field + ) + + with patch('picklefield.fields.dbsafe_decode', mock_decode_error): + encoded_value = dbsafe_encode({'foo': 'bar'}) + self.assertEqual(encoded_value, MinimalTestingModel.objects.get(pk=model.pk).pickle_field) + @isolate_apps('tests') class PickledObjectFieldCheckTests(SimpleTestCase): diff --git a/tox.ini b/tox.ini index 75db51b..3d6e98f 100644 --- a/tox.ini +++ b/tox.ini @@ -29,9 +29,10 @@ basepython = py38: python3.8 usedevelop = true commands = - {envpython} -R -Wonce {envbindir}/coverage run --branch django test -v2 --settings=tests.settings {posargs} - coverage report + {envpython} -R -Wonce {envbindir}/coverage run --branch -m django test -v2 --settings=tests.settings {posargs} + coverage report -m deps = + py27: mock coverage 1.11: Django>=1.11,<2.0 2.0: Django>=2.0,<2.1 From 678178f66d6309756d1fe9229dcc4ba5d282ebd5 Mon Sep 17 00:00:00 2001 From: Fabre Florian Date: Thu, 23 Jan 2020 21:57:39 +0100 Subject: [PATCH 3/5] Add support for Django 2.2 --- setup.py | 2 ++ tox.ini | 9 +++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index 68fa527..9d4a7ae 100644 --- a/setup.py +++ b/setup.py @@ -23,6 +23,7 @@ 'Framework :: Django :: 1.11', 'Framework :: Django :: 2.0', 'Framework :: Django :: 2.1', + 'Framework :: Django :: 2.2', 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent', @@ -34,6 +35,7 @@ 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', 'Topic :: Software Development :: Libraries :: Application Frameworks', 'Topic :: Software Development :: Libraries :: Python Modules', ], diff --git a/tox.ini b/tox.ini index 3d6e98f..736934d 100644 --- a/tox.ini +++ b/tox.ini @@ -6,10 +6,10 @@ envlist = isort, py27-1.11, py34-{1.11,2.0}, - py35-{1.11,2.0,2.1}, - py36-{1.11,2.0,2.1,master}, - py37-{1.11,2.0,2.1,master}, - py38-{2.1,master}, + py35-{1.11,2.0,2.1,2.2}, + py36-{1.11,2.0,2.1,2.2,master}, + py37-{1.11,2.0,2.1,2.2,master}, + py38-{2.1,2.2,master}, [tox:travis] 2.7 = py27 @@ -37,6 +37,7 @@ deps = 1.11: Django>=1.11,<2.0 2.0: Django>=2.0,<2.1 2.1: Django>=2.1,<2.2 + 2.2: Django>=2.2,<3.0 master: https://github.com/django/django/archive/master.tar.gz [testenv:flake8] From 72b90d27cf8c8fbb619b977e1f76bec4b00fc227 Mon Sep 17 00:00:00 2001 From: Fabre Florian Date: Thu, 23 Jan 2020 22:00:09 +0100 Subject: [PATCH 4/5] Drop support for Django 2.0 & 2.1 --- setup.py | 2 -- tox.ini | 10 +++++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/setup.py b/setup.py index 9d4a7ae..df67a5b 100644 --- a/setup.py +++ b/setup.py @@ -21,8 +21,6 @@ 'Environment :: Web Environment', 'Framework :: Django', 'Framework :: Django :: 1.11', - 'Framework :: Django :: 2.0', - 'Framework :: Django :: 2.1', 'Framework :: Django :: 2.2', 'Intended Audience :: Developers', 'License :: OSI Approved :: MIT License', diff --git a/tox.ini b/tox.ini index 736934d..14ea5ba 100644 --- a/tox.ini +++ b/tox.ini @@ -5,11 +5,11 @@ envlist = flake8, isort, py27-1.11, - py34-{1.11,2.0}, - py35-{1.11,2.0,2.1,2.2}, - py36-{1.11,2.0,2.1,2.2,master}, - py37-{1.11,2.0,2.1,2.2,master}, - py38-{2.1,2.2,master}, + py34-1.11, + py35-{1.11,2.2}, + py36-{1.11,2.2,master}, + py37-{1.11,2.2,master}, + py38-{2.2,master}, [tox:travis] 2.7 = py27 From 4226edddc661974428990c7207acb39cdd7e6393 Mon Sep 17 00:00:00 2001 From: Fabre Florian Date: Fri, 24 Jan 2020 06:23:28 +0100 Subject: [PATCH 5/5] Drop support of python 3.4 --- .travis.yml | 1 - tox.ini | 3 --- 2 files changed, 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0319e3d..ec59a30 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,6 @@ language: python cache: pip python: - 2.7 - - 3.4 - 3.5 - 3.6 - 3.7 diff --git a/tox.ini b/tox.ini index 14ea5ba..72304b2 100644 --- a/tox.ini +++ b/tox.ini @@ -5,7 +5,6 @@ envlist = flake8, isort, py27-1.11, - py34-1.11, py35-{1.11,2.2}, py36-{1.11,2.2,master}, py37-{1.11,2.2,master}, @@ -13,7 +12,6 @@ envlist = [tox:travis] 2.7 = py27 -3.4 = py34 3.5 = py35 3.6 = py36 3.7 = py37 @@ -22,7 +20,6 @@ envlist = [testenv] basepython = py27: python2.7 - py34: python3.4 py35: python3.5 py36: python3.6 py37: python3.7