summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2015-06-24 16:09:26 +0200
committerVictor Stinner <vstinner@redhat.com>2015-06-24 17:16:06 +0200
commit9c646eaf5a835f68247c64e6d1899912004a4dd7 (patch)
tree9a9c71c9c97a0de9c5fcaa4c8fbcf16ccf3066f5
parent33afc3329de41eafc10504330c22f9368d166dfe (diff)
downloadoslo-db-9c646eaf5a835f68247c64e6d1899912004a4dd7.tar.gz
Add a new ModelBase.items() method
This change is required to port applications using oslo.db to Python 3. The iteritems() method of Python 2 dictionaries was removed in Python 3 (renamed to items()). Currently, it's not possible to replace obj.iteritems() with six.iteritems(obj) or obj.items() for oslo.db objects. Nova has a function calling obj.iteritems(), the function gets oslo.db objects and dictionaries. On Python 3, dictionaries have no iteritems() method, whereas oslo.db objects have no items() method. This change allows to write obj.items() which works on Python 2 and Python 3, on dictionaries and oslo.db objects. Change-Id: Ibd4f454183c2bd3465539c3e572fa23208975bdb
-rw-r--r--oslo_db/sqlalchemy/models.py12
-rw-r--r--oslo_db/tests/sqlalchemy/test_models.py4
2 files changed, 13 insertions, 3 deletions
diff --git a/oslo_db/sqlalchemy/models.py b/oslo_db/sqlalchemy/models.py
index 8edfe72..4293c9d 100644
--- a/oslo_db/sqlalchemy/models.py
+++ b/oslo_db/sqlalchemy/models.py
@@ -85,7 +85,7 @@ class ModelBase(six.Iterator):
for k, v in six.iteritems(values):
setattr(self, k, v)
- def iteritems(self):
+ def _as_dict(self):
"""Make the model object behave like a dict.
Includes attributes from joins.
@@ -94,7 +94,15 @@ class ModelBase(six.Iterator):
joined = dict([(k, v) for k, v in six.iteritems(self.__dict__)
if not k[0] == '_'])
local.update(joined)
- return six.iteritems(local)
+ return local
+
+ def iteritems(self):
+ """Make the model object behave like a dict."""
+ return six.iteritems(self._as_dict())
+
+ def items(self):
+ """Make the model object behave like a dict."""
+ return self._as_dict().items()
def keys(self):
"""Make the model object behave like a dict."""
diff --git a/oslo_db/tests/sqlalchemy/test_models.py b/oslo_db/tests/sqlalchemy/test_models.py
index eac66f5..525573a 100644
--- a/oslo_db/tests/sqlalchemy/test_models.py
+++ b/oslo_db/tests/sqlalchemy/test_models.py
@@ -40,6 +40,7 @@ class ModelBaseTest(test_base.DbTestCase):
'get',
'update',
'save',
+ 'items',
'iteritems',
'keys')
for method in dict_methods:
@@ -69,7 +70,7 @@ class ModelBaseTest(test_base.DbTestCase):
self.assertFalse('non-existent-key' in mb)
- def test_modelbase_iteritems(self):
+ def test_modelbase_items_iteritems(self):
h = {'a': '1', 'b': '2'}
expected = {
'id': None,
@@ -79,6 +80,7 @@ class ModelBaseTest(test_base.DbTestCase):
'b': '2',
}
self.ekm.update(h)
+ self.assertEqual(dict(self.ekm.items()), expected)
self.assertEqual(dict(self.ekm.iteritems()), expected)
def test_modelbase_dict(self):