Skip to content

Commit

Permalink
Merge pull request #98 from alfred82santa/feature/improve-serialization
Browse files Browse the repository at this point in the history
Feature/improve serialization
  • Loading branch information
alfred82santa committed Jan 31, 2017
2 parents 6527dd4 + 1d44828 commit 995104f
Show file tree
Hide file tree
Showing 10 changed files with 395 additions and 106 deletions.
11 changes: 10 additions & 1 deletion README.rst
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
|travis-master| |coverall-master| |doc-master| |pypi-downloads| |pypi-lastrelease| |python-versions|
|travis-master| |coverall-master| |doc-master| |pypi-lastrelease| |python-versions|
|project-status| |project-license| |project-format| |project-implementation|

.. |travis-master| image:: https://travis-ci.org/alfred82santa/dirty-models.svg?branch=master
Expand Down Expand Up @@ -85,6 +85,15 @@ Features
Changelog
---------

Version 0.10.0
--------------

- Pickable lists.
- Improved pickle performance.
- Setting ``None`` to a field remove content.
- More tests.
- Some code improvements.

Version 0.9.2
-------------

Expand Down
2 changes: 1 addition & 1 deletion dirty_models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@
from .models import *
from .fields import *

__version__ = '0.9.2'
__version__ = '0.10.0'
4 changes: 3 additions & 1 deletion dirty_models/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,9 @@ def __set__(self, obj, value):
self._setter(self, obj, value)
return

if self.check_value(value) or self.can_use_value(value):
if value is None:
self.delete_value(obj)
elif self.check_value(value) or self.can_use_value(value):
self.set_value(obj, self.use_value(value))

def __delete__(self, obj):
Expand Down
36 changes: 34 additions & 2 deletions dirty_models/model_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,21 @@ def func(self, *args, **kwargs):
return func


def restore_list_model_from_data(list_class, field, common_data, original_list, modified_list):

model = list_class(field_type=field[0](**field[1]))

if original_list is not None:
model.__original_data__ = [common_data[i] for i in original_list]
list(map(model._prepare_child, model.__original_data__))

if modified_list is not None:
model.__modified_data__ = [common_data[i] for i in modified_list]
list(map(model._prepare_child, model.__modified_data__))

return model


class ListModel(InnerFieldTypeMixin, BaseData):
"""
Dirty model for a list. It has the behavior to work as a list implementing its methods
Expand Down Expand Up @@ -162,12 +177,12 @@ def extend(self, iterable):
self.append(value)

@modified_data_decorator
def pop(self, index=None):
def pop(self, *args):
"""
Obtains and delete the element from the list
"""
if self.__modified_data__ is not None:
return self.__modified_data__.pop(index)
return self.__modified_data__.pop(*args)

def count(self, value):
"""
Expand Down Expand Up @@ -495,3 +510,20 @@ def __str__(self):

def __contains__(self, item):
return item in self.__modified_data__ if self.__modified_data__ is not None else item in self.__original_data__

def __reduce__(self):
orginal_list = [id(i) for i in self.__original_data__]
common_data = {id(i): i for i in self.__original_data__}

try:
modified_list = [id(i) for i in self.__modified_data__]
common_data.update({id(i): i for i in self.__modified_data__ if id(i) not in common_data})
except TypeError:
modified_list = None

return restore_list_model_from_data, (self.__class__,
(self.get_field_type().__class__,
self.get_field_type().export_definition()),
common_data,
orginal_list,
modified_list)

0 comments on commit 995104f

Please sign in to comment.