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:
@@ -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
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
|
||||
Reference in New Issue
Block a user