[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