From 75d20b69200e99f8ff209530c6c824505b2f93f1 Mon Sep 17 00:00:00 2001 From: Jon Haddad Date: Thu, 27 Jun 2013 14:22:47 -0700 Subject: [PATCH] fixed empty sets, maps, lists --- cqlengine/columns.py | 15 +++++++++----- .../tests/columns/test_container_columns.py | 20 +++++++++++++++++++ 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/cqlengine/columns.py b/cqlengine/columns.py index fe205ae8..f8d262df 100644 --- a/cqlengine/columns.py +++ b/cqlengine/columns.py @@ -473,14 +473,15 @@ class Set(BaseContainerColumn): cq = cql_quote return '{' + ', '.join([cq(v) for v in self.value]) + '}' - def __init__(self, value_type, strict=True, **kwargs): + def __init__(self, value_type, strict=True, default=set, **kwargs): """ :param value_type: a column class indicating the types of the value :param strict: sets whether non set values will be coerced to set type on validation, or raise a validation error, defaults to True """ self.strict = strict - super(Set, self).__init__(value_type, **kwargs) + + super(Set, self).__init__(value_type, default=default, **kwargs) def validate(self, value): val = super(Set, self).validate(value) @@ -495,11 +496,12 @@ class Set(BaseContainerColumn): return {self.value_col.validate(v) for v in val} def to_python(self, value): - if value is None: return None + if value is None: return set() return {self.value_col.to_python(v) for v in value} def to_database(self, value): if value is None: return None + if isinstance(value, self.Quoter): return value return self.Quoter({self.value_col.to_database(v) for v in value}) @@ -560,6 +562,9 @@ class List(BaseContainerColumn): cq = cql_quote return '[' + ', '.join([cq(v) for v in self.value]) + ']' + def __init__(self, value_type, default=set, **kwargs): + return super(List, self).__init__(value_type=value_type, default=default, **kwargs) + def validate(self, value): val = super(List, self).validate(value) if val is None: return @@ -668,7 +673,7 @@ class Map(BaseContainerColumn): cq = cql_quote return '{' + ', '.join([cq(k) + ':' + cq(v) for k,v in self.value.items()]) + '}' - def __init__(self, key_type, value_type, **kwargs): + def __init__(self, key_type, value_type, default=dict, **kwargs): """ :param key_type: a column class indicating the types of the key :param value_type: a column class indicating the types of the value @@ -687,7 +692,7 @@ class Map(BaseContainerColumn): else: self.key_col = key_type self.key_type = self.key_col.__class__ - super(Map, self).__init__(value_type, **kwargs) + super(Map, self).__init__(value_type, default=default, **kwargs) def get_column_def(self): """ diff --git a/cqlengine/tests/columns/test_container_columns.py b/cqlengine/tests/columns/test_container_columns.py index 2134764d..180378de 100644 --- a/cqlengine/tests/columns/test_container_columns.py +++ b/cqlengine/tests/columns/test_container_columns.py @@ -40,6 +40,16 @@ class TestSetColumn(BaseCassEngTestCase): super(TestSetColumn, cls).tearDownClass() delete_table(TestSetModel) + + def test_empty_set_initial(self): + """ + tests that sets are set() by default, should never be none + :return: + """ + m = TestSetModel.create() + m.int_set.add(5) + m.save() + def test_io_success(self): """ Tests that a basic usage works as expected """ m1 = TestSetModel.create(int_set={1, 2}, text_set={'kai', 'andreas'}) @@ -129,6 +139,8 @@ class TestSetColumn(BaseCassEngTestCase): column = columns.Set(columns.Text(min_length=100)) assert isinstance(column.value_col, columns.Text) + + def test_to_python(self): """ Tests that to_python of value column is called """ column = columns.Set(JsonTestColumn) @@ -157,6 +169,10 @@ class TestListColumn(BaseCassEngTestCase): super(TestListColumn, cls).tearDownClass() delete_table(TestListModel) + def test_initial(self): + tmp = TestListModel.create() + tmp.int_list.append(1) + def test_io_success(self): """ Tests that a basic usage works as expected """ m1 = TestListModel.create(int_list=[1, 2], text_list=['kai', 'andreas']) @@ -275,6 +291,10 @@ class TestMapColumn(BaseCassEngTestCase): super(TestMapColumn, cls).tearDownClass() delete_table(TestMapModel) + def test_empty_default(self): + tmp = TestMapModel.create() + tmp.int_map['blah'] = 1 + def test_io_success(self): """ Tests that a basic usage works as expected """ k1 = uuid4()