Make _extra_keys a property of ModelBase

Currently  _get_extra_keys() used as as function.
Changing it to read only property makes class interface more cleaner
and reliable
We don't have to explicitly call it and it can't be accidently overriden
by assigning of an instance variable

Change-Id: I236408be953f299854fce80aa38e24708c13a60a
This commit is contained in:
Dima Shulyak
2013-11-28 13:46:02 +02:00
committed by Ben Nemec
parent 543aedf1e6
commit 28f8fd5f0a
2 changed files with 52 additions and 3 deletions

View File

@@ -59,7 +59,16 @@ class ModelBase(object):
def get(self, key, default=None):
return getattr(self, key, default)
def _get_extra_keys(self):
@property
def _extra_keys(self):
"""Specifies custom fields
Subclasses can override this property to return a list
of custom fields that should be included in their dict
representation.
For reference check tests/db/sqlalchemy/test_models.py
"""
return []
def __iter__(self):
@@ -67,7 +76,7 @@ class ModelBase(object):
# NOTE(russellb): Allow models to specify other keys that can be looked
# up, beyond the actual db columns. An example would be the 'name'
# property for an Instance.
columns.extend(self._get_extra_keys())
columns.extend(self._extra_keys)
self._i = iter(columns)
return self

View File

@@ -13,11 +13,19 @@
# License for the specific language governing permissions and limitations
# under the License.
from sqlalchemy import Column
from sqlalchemy import Integer, String
from sqlalchemy.ext.declarative import declarative_base
from openstack.common.db.sqlalchemy import models
from openstack.common import test
from tests.unit.db.sqlalchemy import base as test_base
class ModelBaseTest(test.BaseTestCase):
BASE = declarative_base()
class ModelBaseTest(test_base.DbTestCase):
def test_modelbase_has_dict_methods(self):
dict_methods = ('__getitem__',
@@ -70,6 +78,38 @@ class ModelBaseTest(test.BaseTestCase):
self.assertEqual(min_items, found_items)
def test_extra_keys_empty(self):
"""Test verifies that by default extra_keys return empty list."""
mb = models.ModelBase()
self.assertEqual(mb._extra_keys, [])
def test_extra_keys_defined(self):
"""Property _extra_keys will return list with attributes names."""
ekm = ExtraKeysModel()
self.assertEqual(ekm._extra_keys, ['name'])
def test_model_with_extra_keys(self):
item = ExtraKeysModel()
data = dict(item)
self.assertEqual(data, {'smth': None,
'id': None,
'name': 'NAME'})
class ExtraKeysModel(BASE, models.ModelBase):
__tablename__ = 'test_model'
id = Column(Integer, primary_key=True)
smth = Column(String(255))
@property
def name(self):
return 'NAME'
@property
def _extra_keys(self):
return ['name']
class TimestampMixinTest(test.BaseTestCase):