diff options
author | Victor Stinner <vstinner@redhat.com> | 2015-06-24 16:09:26 +0200 |
---|---|---|
committer | Victor Stinner <vstinner@redhat.com> | 2015-06-24 17:16:06 +0200 |
commit | 9c646eaf5a835f68247c64e6d1899912004a4dd7 (patch) | |
tree | 9a9c71c9c97a0de9c5fcaa4c8fbcf16ccf3066f5 | |
parent | 33afc3329de41eafc10504330c22f9368d166dfe (diff) | |
download | oslo-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.py | 12 | ||||
-rw-r--r-- | oslo_db/tests/sqlalchemy/test_models.py | 4 |
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): |