Skip to content

Commit

Permalink
Fixes and improvements on formatters and dynamic models
Browse files Browse the repository at this point in the history
  • Loading branch information
alfred82santa committed Jun 8, 2016
1 parent f8a3358 commit bed1b0c
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 6 deletions.
6 changes: 6 additions & 0 deletions README.rst
Expand Up @@ -83,6 +83,12 @@ Features
Changelog
---------

Version 0.7.1
-------------

- Solved problem formatting dynamic models
- Added date, time and timedelta fields to dynamic models.

Version 0.7.0
-------------

Expand Down
20 changes: 18 additions & 2 deletions dirty_models/models.py
Expand Up @@ -3,11 +3,12 @@
"""

import itertools
from datetime import datetime
from datetime import datetime, date, time, timedelta

from collections import Mapping
from copy import deepcopy

from dirty_models.fields import DateField, TimeField, TimedeltaField
from .base import BaseData, InnerFieldTypeMixin
from .fields import IntegerField, FloatField, BooleanField, StringField, DateTimeField, \
BaseField, ModelField, ArrayField
Expand Down Expand Up @@ -147,7 +148,7 @@ def __reduce__(self):
self.export_modified_data(), self.export_deleted_fields(),)

def _get_real_name(self, name):
obj = self.__class__.get_field_obj(name)
obj = self.get_field_obj(name)
try:
return obj.name
except AttributeError:
Expand Down Expand Up @@ -539,8 +540,14 @@ def _get_field_type(self, key, value):
return FloatField(name=key)
elif isinstance(value, str):
return StringField(name=key)
elif isinstance(value, time):
return TimeField(name=key)
elif isinstance(value, datetime):
return DateTimeField(name=key)
elif isinstance(value, date):
return DateField(name=key)
elif isinstance(value, timedelta):
return TimedeltaField(name=key)
elif isinstance(value, (dict, BaseDynamicModel, Mapping)):
return ModelField(name=key, model_class=self._dynamic_model or self.__class__)
elif isinstance(value, BaseModel):
Expand Down Expand Up @@ -593,6 +600,9 @@ def __setattr__(self, name, value):

super(DynamicModel, self).__setattr__(name, value)

# def get_field_obj(self, name):
# return self._structure[name]

def __hasattr__(self, name):
try:
getattr(super(DynamicModel, self), name)
Expand Down Expand Up @@ -790,3 +800,9 @@ def __delattr__(self, name):
self.delete_field_value(name)
return
super(FastDynamicModel, self).__delattr__(name)

def get_field_obj(self, name):
try:
return self._field_types[name]
except KeyError:
return super(FastDynamicModel, self).get_field_obj(name)
2 changes: 1 addition & 1 deletion setup.py
Expand Up @@ -5,7 +5,7 @@
name='dirty-models',
url='https://github.com/alfred82santa/dirty-models',
author='alfred82santa',
version='0.7.0',
version='0.7.1',
author_email='alfred82santa@gmail.com',
classifiers=[
'Intended Audience :: Developers',
Expand Down
19 changes: 17 additions & 2 deletions tests/dirty_models/tests_models.py
@@ -1,11 +1,11 @@
import pickle
from datetime import datetime, date, time
from datetime import datetime, date, time, timedelta
from unittest import TestCase

from dirty_models.base import Unlocker
from dirty_models.fields import (BaseField, IntegerField, FloatField,
StringField, DateTimeField, ModelField,
ArrayField, BooleanField, DateField, TimeField, HashMapField)
ArrayField, BooleanField, DateField, TimeField, HashMapField, TimedeltaField)
from dirty_models.models import BaseModel, DynamicModel, HashMapModel, FastDynamicModel, CamelCaseMeta

INITIAL_DATA = {
Expand Down Expand Up @@ -932,6 +932,21 @@ def test_set_datetime_value(self):
self.assertEqual(self.model.test4, datetime(year=2014, month=11, day=1))
self.assertIsInstance(self._get_field_type('test4'), DateTimeField)

def test_set_date_value(self):
self.model.test4 = date(year=2014, month=11, day=1)
self.assertEqual(self.model.test4, date(year=2014, month=11, day=1))
self.assertIsInstance(self._get_field_type('test4'), DateField)

def test_set_time_value(self):
self.model.test4 = time(hour=23, minute=43, second=11)
self.assertEqual(self.model.test4, time(hour=23, minute=43, second=11))
self.assertIsInstance(self._get_field_type('test4'), TimeField)

def test_set_timedelta_value(self):
self.model.test4 = timedelta(seconds=3223)
self.assertEqual(self.model.test4, timedelta(seconds=3223))
self.assertIsInstance(self._get_field_type('test4'), TimedeltaField)

def test_load_from_dict_value(self):
self.model.import_data({"aa": "aaaaaa"})
self.assertEqual(self.model.export_data(), {"aa": "aaaaaa"})
Expand Down
60 changes: 59 additions & 1 deletion tests/dirty_models/tests_utils.py
Expand Up @@ -4,7 +4,7 @@

from dirty_models.fields import StringIdField, IntegerField, DateTimeField, ArrayField, MultiTypeField, ModelField, \
HashMapField, DateField, TimedeltaField
from dirty_models.models import BaseModel
from dirty_models.models import BaseModel, DynamicModel, FastDynamicModel
from dirty_models.utils import underscore_to_camel, ModelFormatterIter, ListFormatterIter, HashMapFormatterIter, \
JSONEncoder

Expand Down Expand Up @@ -79,6 +79,64 @@ def test_model_formatter(self):
self.assertEqual({k: v for k, v in data['test_hash_map']}, {'foo': '2015-07-30 date'})
self.assertEqual(data['test_timedelta'], 32.1122)

def test_dynamic_model_formatter(self):
model = DynamicModel(data={'test_string_field_1': 'foo',
'test_int_field_1': 4,
'test_datetime': datetime(year=2016, month=5, day=30,
hour=22, minute=22, second=22),
'test_array_datetime': [datetime(year=2015, month=5, day=30,
hour=22, minute=22, second=22),
datetime(year=2015, month=6, day=30,
hour=22, minute=22, second=22)],
'test_model_field_1': [[{'test_datetime': datetime(year=2015, month=7, day=30,
hour=22, minute=22, second=22)}]],
'test_hash_map': {'foo': date(year=2015, month=7, day=30)},
'test_timedelta': timedelta(seconds=32.1122)})

formatter = ModelFormatterIter(model)
data = {k: v for k, v in formatter}
print(data)
self.assertEqual(data['test_int_field_1'], 4)
self.assertEqual(data['test_datetime'], '2016-05-30 22:22:22')
self.assertIsInstance(data['test_array_datetime'], ListFormatterIter)
self.assertEqual(list(data['test_array_datetime']), ['2015-05-30 22:22:22', '2015-06-30 22:22:22'])
self.assertIsInstance(data['test_model_field_1'], ListFormatterIter)
self.assertIsInstance(list(data['test_model_field_1'])[0], ListFormatterIter)
self.assertEqual({k: v for k, v in list(list(data['test_model_field_1'])[0])[0]},
{'test_datetime': '2015-07-30 22:22:22'})
self.assertIsInstance(data['test_hash_map'], ModelFormatterIter)
self.assertEqual({k: v for k, v in data['test_hash_map']}, {'foo': '2015-07-30'})
self.assertEqual(data['test_timedelta'], 32.1122)

def test_fast_dynamic_model_formatter(self):
model = FastDynamicModel(data={'test_string_field_1': 'foo',
'test_int_field_1': 4,
'test_datetime': datetime(year=2016, month=5, day=30,
hour=22, minute=22, second=22),
'test_array_datetime': [datetime(year=2015, month=5, day=30,
hour=22, minute=22, second=22),
datetime(year=2015, month=6, day=30,
hour=22, minute=22, second=22)],
'test_model_field_1': [[{'test_datetime': datetime(year=2015, month=7, day=30,
hour=22, minute=22,
second=22)}]],
'test_hash_map': {'foo': date(year=2015, month=7, day=30)},
'test_timedelta': timedelta(seconds=32.1122)})

formatter = ModelFormatterIter(model)
data = {k: v for k, v in formatter}
self.assertEqual(data['test_int_field_1'], 4)
self.assertEqual(data['test_datetime'], '2016-05-30 22:22:22')
self.assertIsInstance(data['test_array_datetime'], ListFormatterIter)
self.assertEqual(list(data['test_array_datetime']), ['2015-05-30 22:22:22', '2015-06-30 22:22:22'])
self.assertIsInstance(data['test_model_field_1'], ListFormatterIter)
self.assertIsInstance(list(data['test_model_field_1'])[0], ListFormatterIter)
self.assertEqual({k: v for k, v in list(list(data['test_model_field_1'])[0])[0]},
{'test_datetime': '2015-07-30 22:22:22'})
self.assertIsInstance(data['test_hash_map'], ModelFormatterIter)
self.assertEqual({k: v for k, v in data['test_hash_map']}, {'foo': '2015-07-30'})
self.assertEqual(data['test_timedelta'], 32.1122)


class JSONEncoderTests(TestCase):

Expand Down

0 comments on commit bed1b0c

Please sign in to comment.