Merge branch 'access-as-dict' of github.com:kdeldycke/cqlengine into pull-158

This commit is contained in:
Blake Eggleston
2014-02-11 11:27:17 -08:00
3 changed files with 53 additions and 0 deletions

View File

@@ -13,6 +13,7 @@ CHANGELOG
* clear TTL and timestamp off models after persisting to DB * clear TTL and timestamp off models after persisting to DB
* allows UUID without dashes - (Thanks to Michael Hall, github.com/mahall) * allows UUID without dashes - (Thanks to Michael Hall, github.com/mahall)
* fixes regarding syncing schema settings (thanks Kai Lautaportti github.com/dokai) * fixes regarding syncing schema settings (thanks Kai Lautaportti github.com/dokai)
* allow acces to instance columns as if it is a dict
0.10.0 0.10.0

View File

@@ -421,6 +421,37 @@ class BaseModel(object):
val = col.validate(getattr(self, name)) val = col.validate(getattr(self, name))
setattr(self, name, val) setattr(self, name, val)
### Let an instance be used like a dict of its columns keys/values
def __iter__(self):
""" Iterate over column ids. """
for column_id in self._columns.keys():
yield column_id
def __getitem__(self, key):
""" Returns column's value. """
if not isinstance(key, basestring):
raise TypeError
if key not in self._columns.keys():
raise KeyError
return getattr(self, key)
def __len__(self):
""" Returns the number of columns defined on that model. """
return len(self._columns.keys())
def keys(self):
""" Returns list of column's IDs. """
return [k for k in self]
def values(self):
""" Returns list of column's values. """
return [self[k] for k in self]
def items(self):
""" Returns a list of columns's IDs/values. """
return [(k, self[k]) for k in self]
def _as_dict(self): def _as_dict(self):
""" Returns a map of column names to cleaned values """ """ Returns a map of column names to cleaned values """
values = self._dynamic_columns or {} values = self._dynamic_columns or {}

View File

@@ -1,6 +1,7 @@
from uuid import uuid4 from uuid import uuid4
import random import random
from datetime import date from datetime import date
from operator import itemgetter
from cqlengine.tests.base import BaseCassEngTestCase from cqlengine.tests.base import BaseCassEngTestCase
from cqlengine.management import create_table from cqlengine.management import create_table
@@ -43,6 +44,26 @@ class TestModelIO(BaseCassEngTestCase):
for cname in tm._columns.keys(): for cname in tm._columns.keys():
self.assertEquals(getattr(tm, cname), getattr(tm2, cname)) self.assertEquals(getattr(tm, cname), getattr(tm2, cname))
def test_model_read_as_dict(self):
"""
Tests that columns of an instance can be read as a dict.
"""
tm = TestModel.create(count=8, text='123456789', a_bool=True)
column_dict = {
'id': tm.id,
'count': tm.count,
'text': tm.text,
'a_bool': tm.a_bool,
}
self.assertEquals(sorted(tm.keys()), sorted(column_dict.keys()))
self.assertEquals(sorted(tm.values()), sorted(column_dict.values()))
self.assertEquals(
sorted(tm.items(), key=itemgetter(0)),
sorted(column_dict.items(), key=itemgetter(0)))
self.assertEquals(len(tm), len(column_dict))
for column_id in column_dict.keys():
self.assertEqual(tm[column_id], column_dict[column_id])
def test_model_updating_works_properly(self): def test_model_updating_works_properly(self):
""" """
Tests that subsequent saves after initial model creation work Tests that subsequent saves after initial model creation work