[Python-modules-commits] [django-picklefield] 01/09: Import django-picklefield_1.0.0.orig.tar.gz
Michael Fladischer
fladi at moszumanska.debian.org
Thu Jul 13 11:33:01 UTC 2017
This is an automated email from the git hooks/post-receive script.
fladi pushed a commit to branch master
in repository django-picklefield.
commit fe068eb0ecefd309f2e6ee81b911080589910da7
Author: Michael Fladischer <FladischerMichael at fladi.at>
Date: Thu Jul 13 11:13:20 2017 +0200
Import django-picklefield_1.0.0.orig.tar.gz
---
PKG-INFO | 18 ++++++++++++--
README.rst | 15 ++++++++++++
setup.cfg | 1 -
setup.py | 3 +--
src/django_picklefield.egg-info/PKG-INFO | 18 ++++++++++++--
src/picklefield/compat.py | 9 -------
src/picklefield/fields.py | 40 ++++++++++++++------------------
src/picklefield/tests.py | 33 ++++++++++++++++++++++++++
8 files changed, 99 insertions(+), 38 deletions(-)
diff --git a/PKG-INFO b/PKG-INFO
index ccaa561..a66c55a 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: django-picklefield
-Version: 0.3.2
+Version: 1.0.0
Summary: Pickled object field for Django
Home-page: http://github.com/gintas/django-picklefield
Author: Gintautas Miliauskas
@@ -58,6 +58,12 @@ Description: .. image:: https://travis-ci.org/gintas/django-picklefield.svg?bran
format is not convenient for parsing in the browser. By overriding
``value_to_string()`` you can choose a more convenient serialization format.
+ Fields now accept the boolean key word argument `copy`, which defaults to
+ `True`. The `copy` is necessary for lookups to work correctly. If you don't
+ care about performing lookups on the picklefield, you can set `copy=False` to
+ save on some memory usage. This an be especially beneficial for very large
+ object trees.
+
-------------
Running tests
-------------
@@ -139,6 +145,15 @@ Description: .. image:: https://travis-ci.org/gintas/django-picklefield.svg?bran
Changes
-------
+ Changes in version 1.0.0
+ ========================
+
+ * Added a new option to prevent a copy of the object before pickling: `copy=True`
+ * Dropped support for Django 1.4
+ * Dropped support for Django 1.7
+ * Dropped support for Python 3.2
+ * Added support for Python 3.6
+
Changes in version 0.3.2
========================
@@ -234,7 +249,6 @@ Classifier: Framework :: Django
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3.2
Classifier: Programming Language :: Python :: 3.3
diff --git a/README.rst b/README.rst
index dfce781..b37bd40 100644
--- a/README.rst
+++ b/README.rst
@@ -50,6 +50,12 @@ base64-encoded pickles, which allows reliable deserialization, but such a
format is not convenient for parsing in the browser. By overriding
``value_to_string()`` you can choose a more convenient serialization format.
+Fields now accept the boolean key word argument `copy`, which defaults to
+`True`. The `copy` is necessary for lookups to work correctly. If you don't
+care about performing lookups on the picklefield, you can set `copy=False` to
+save on some memory usage. This an be especially beneficial for very large
+object trees.
+
-------------
Running tests
-------------
@@ -131,6 +137,15 @@ since it is never a good idea to have a PickledObjectField be user editable.
Changes
-------
+Changes in version 1.0.0
+========================
+
+* Added a new option to prevent a copy of the object before pickling: `copy=True`
+* Dropped support for Django 1.4
+* Dropped support for Django 1.7
+* Dropped support for Python 3.2
+* Added support for Python 3.6
+
Changes in version 0.3.2
========================
diff --git a/setup.cfg b/setup.cfg
index f314eba..391f954 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -14,5 +14,4 @@ universal = 1
[egg_info]
tag_build =
tag_date = 0
-tag_svn_revision = 0
diff --git a/setup.py b/setup.py
index 51c3145..05d4290 100644
--- a/setup.py
+++ b/setup.py
@@ -26,7 +26,7 @@ long_description = codecs.open('README.rst', encoding='utf-8').read()
setup(
name='django-picklefield',
- version='0.3.2',
+ version='1.0.0',
description='Pickled object field for Django',
long_description=long_description,
author='Gintautas Miliauskas',
@@ -40,7 +40,6 @@ setup(
'Intended Audience :: Developers',
'License :: OSI Approved :: MIT License',
'Programming Language :: Python',
- 'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3.2',
'Programming Language :: Python :: 3.3',
diff --git a/src/django_picklefield.egg-info/PKG-INFO b/src/django_picklefield.egg-info/PKG-INFO
index ccaa561..a66c55a 100644
--- a/src/django_picklefield.egg-info/PKG-INFO
+++ b/src/django_picklefield.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.1
Name: django-picklefield
-Version: 0.3.2
+Version: 1.0.0
Summary: Pickled object field for Django
Home-page: http://github.com/gintas/django-picklefield
Author: Gintautas Miliauskas
@@ -58,6 +58,12 @@ Description: .. image:: https://travis-ci.org/gintas/django-picklefield.svg?bran
format is not convenient for parsing in the browser. By overriding
``value_to_string()`` you can choose a more convenient serialization format.
+ Fields now accept the boolean key word argument `copy`, which defaults to
+ `True`. The `copy` is necessary for lookups to work correctly. If you don't
+ care about performing lookups on the picklefield, you can set `copy=False` to
+ save on some memory usage. This an be especially beneficial for very large
+ object trees.
+
-------------
Running tests
-------------
@@ -139,6 +145,15 @@ Description: .. image:: https://travis-ci.org/gintas/django-picklefield.svg?bran
Changes
-------
+ Changes in version 1.0.0
+ ========================
+
+ * Added a new option to prevent a copy of the object before pickling: `copy=True`
+ * Dropped support for Django 1.4
+ * Dropped support for Django 1.7
+ * Dropped support for Python 3.2
+ * Added support for Python 3.6
+
Changes in version 0.3.2
========================
@@ -234,7 +249,6 @@ Classifier: Framework :: Django
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2.6
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3.2
Classifier: Programming Language :: Python :: 3.3
diff --git a/src/picklefield/compat.py b/src/picklefield/compat.py
index e38997d..924894b 100644
--- a/src/picklefield/compat.py
+++ b/src/picklefield/compat.py
@@ -1,15 +1,6 @@
-import django
-from django.db import models
-from django.utils import six
-
# python 3.x does not have cPickle module
try:
# cpython 2.x
from cPickle import loads, dumps # noqa
except ImportError:
from pickle import loads, dumps # noqa
-
-if django.VERSION >= (1, 8):
- _PickledObjectField = models.Field
-else:
- _PickledObjectField = six.with_metaclass(models.SubfieldBase, models.Field)
diff --git a/src/picklefield/fields.py b/src/picklefield/fields.py
index c53f491..968b66d 100644
--- a/src/picklefield/fields.py
+++ b/src/picklefield/fields.py
@@ -3,10 +3,11 @@ from base64 import b64decode, b64encode
from copy import deepcopy
from zlib import compress, decompress
+from django.db import models
from django.utils.encoding import force_text
from . import DEFAULT_PROTOCOL
-from .compat import _PickledObjectField, dumps, loads
+from .compat import dumps, loads
class PickledObject(str):
@@ -44,14 +45,18 @@ def wrap_conflictual_object(obj):
return obj
-def dbsafe_encode(value, compress_object=False, pickle_protocol=DEFAULT_PROTOCOL):
+def dbsafe_encode(value, compress_object=False, pickle_protocol=DEFAULT_PROTOCOL, copy=True):
# We use deepcopy() here to avoid a problem with cPickle, where dumps
# can generate different character streams for same lookup value if
# they are referenced differently.
# The reason this is important is because we do all of our lookups as
# simple string matches, thus the character streams must be the same
# for the lookups to work properly. See tests.py for more information.
- value = dumps(deepcopy(value), protocol=pickle_protocol)
+ if copy:
+ # Copy can be very expensive if users aren't going to perform lookups
+ # on the value anyway.
+ value = deepcopy(value)
+ value = dumps(value, protocol=pickle_protocol)
if compress_object:
value = compress(value)
value = b64encode(value).decode() # decode bytes to str
@@ -66,7 +71,7 @@ def dbsafe_decode(value, compress_object=False):
return loads(value)
-class PickledObjectField(_PickledObjectField):
+class PickledObjectField(models.Field):
"""
A field that will accept *any* python object and store it in the
database. PickledObjectField will optionally compress its values if
@@ -80,6 +85,7 @@ class PickledObjectField(_PickledObjectField):
def __init__(self, *args, **kwargs):
self.compress = kwargs.pop('compress', False)
self.protocol = kwargs.pop('protocol', DEFAULT_PROTOCOL)
+ self.copy = kwargs.pop('copy', True)
kwargs.setdefault('editable', False)
super(PickledObjectField, self).__init__(*args, **kwargs)
@@ -150,7 +156,7 @@ class PickledObjectField(_PickledObjectField):
# marshaller (telling it to store it like it would a string), but
# since both of these methods result in the same value being stored,
# doing things this way is much easier.
- value = force_text(dbsafe_encode(value, self.compress, self.protocol))
+ value = force_text(dbsafe_encode(value, self.compress, self.protocol, self.copy))
return value
def value_to_string(self, obj):
@@ -160,20 +166,10 @@ class PickledObjectField(_PickledObjectField):
def get_internal_type(self):
return 'TextField'
- def get_db_prep_lookup(self, lookup_type, value, connection=None, prepared=False):
- if lookup_type not in ['exact', 'in', 'isnull']:
- raise TypeError('Lookup type %s is not supported.' % lookup_type)
- # The Field model already calls get_db_prep_value before doing the
- # actual lookup, so all we need to do is limit the lookup types.
- return super(PickledObjectField, self).get_db_prep_lookup(
- lookup_type, value, connection=connection, prepared=prepared
- )
-
-
-# South support; see http://south.aeracode.org/docs/tutorial/part4.html#simple-inheritance
-try:
- from south.modelsinspector import add_introspection_rules
-except ImportError:
- pass
-else:
- add_introspection_rules([], [r"^picklefield\.fields\.PickledObjectField"])
+ def get_lookup(self, lookup_name):
+ """
+ We need to limit the lookup types.
+ """
+ if lookup_name not in ['exact', 'in', 'isnull']:
+ raise TypeError('Lookup type %s is not supported.' % lookup_name)
+ return super(PickledObjectField, self).get_lookup(lookup_name)
diff --git a/src/picklefield/tests.py b/src/picklefield/tests.py
index 2430b21..c357569 100644
--- a/src/picklefield/tests.py
+++ b/src/picklefield/tests.py
@@ -1,6 +1,9 @@
"""Unit tests for django-picklefield."""
import json
+from datetime import date
+from unittest import skipIf
+import django
from django.core import serializers
from django.db import models
from django.test import TestCase
@@ -14,10 +17,17 @@ D1 = {1: 1, 2: 4, 3: 6, 4: 8, 5: 10}
D2 = {1: 2, 2: 4, 3: 6, 4: 8, 5: 10}
+class TestCopyDataType(str):
+ def __deepcopy__(self, memo):
+ raise ValueError('Please dont copy me')
+
+
class TestingModel(models.Model):
pickle_field = PickledObjectField()
compressed_pickle_field = PickledObjectField(compress=True)
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!'))
class MinimalTestingModel(models.Model):
@@ -58,6 +68,7 @@ class PickledObjectFieldTests(TestCase):
model_test.save()
model_test = TestingModel.objects.get(id__exact=model_test.id)
self.assertEqual((D1, S1, T1, L1), model_test.default_pickle_field)
+ self.assertEqual(date.today(), model_test.callable_pickle_field)
def testLookups(self):
"""
@@ -150,6 +161,14 @@ class PickledObjectFieldTests(TestCase):
self.assertEqual(value, model_test.pickle_field)
model_test.delete()
+ @skipIf(django.VERSION[:2] < (1, 5), 'Skip for older Django versions')
+ def testLimitLookupsType(self):
+ """
+ Test that picklefield supports lookup type limit
+ """
+ with self.assertRaisesMessage(TypeError, 'Lookup type gte is not supported'):
+ TestingModel.objects.filter(pickle_field__gte=1)
+
def testSerialization(self):
model = MinimalTestingModel(pk=1, pickle_field={'foo': 'bar'})
serialized = serializers.serialize('json', [model])
@@ -167,3 +186,17 @@ class PickledObjectFieldTests(TestCase):
for deserialized_test in serializers.deserialize('json', serialized):
self.assertEqual(deserialized_test.object, model)
+
+ def testNoCopy(self):
+ TestingModel.objects.create(
+ pickle_field='Copy Me',
+ compressed_pickle_field='Copy Me',
+ non_copying_field=TestCopyDataType('Dont Copy Me')
+ )
+
+ with self.assertRaises(ValueError):
+ TestingModel.objects.create(
+ pickle_field=TestCopyDataType('BOOM!'),
+ compressed_pickle_field='Copy Me',
+ non_copying_field='Dont copy me'
+ )
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/django-picklefield.git
More information about the Python-modules-commits
mailing list