A nicer calling convention for object instantiation
This patch makes the base object constructor take some arguments to streamline the process of creating a new object. By taking a context and an optional set of keyword args, we can reduce the lines of code required to create an object from many to, often, one. Change-Id: Id85c70d04af500ece48e9c93ee55a8e3d579299d
This commit is contained in:
@@ -177,9 +177,11 @@ class NovaObject(object):
|
||||
fields = {}
|
||||
obj_extra_fields = []
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, context=None, **kwargs):
|
||||
self._changed_fields = set()
|
||||
self._context = None
|
||||
self._context = context
|
||||
for key in kwargs.keys():
|
||||
self[key] = kwargs[key]
|
||||
|
||||
@classmethod
|
||||
def obj_name(cls):
|
||||
|
||||
@@ -163,15 +163,18 @@ class Instance(base.NovaPersistentObject, base.NovaObject):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(Instance, self).__init__(*args, **kwargs)
|
||||
self.obj_reset_changes()
|
||||
self._reset_metadata_tracking()
|
||||
|
||||
def obj_reset_changes(self, fields=None):
|
||||
super(Instance, self).obj_reset_changes(fields)
|
||||
def _reset_metadata_tracking(self):
|
||||
self._orig_system_metadata = (dict(self.system_metadata) if
|
||||
'system_metadata' in self else {})
|
||||
self._orig_metadata = (dict(self.metadata) if
|
||||
'metadata' in self else {})
|
||||
|
||||
def obj_reset_changes(self, fields=None):
|
||||
super(Instance, self).obj_reset_changes(fields)
|
||||
self._reset_metadata_tracking()
|
||||
|
||||
def obj_what_changed(self):
|
||||
changes = super(Instance, self).obj_what_changed()
|
||||
if 'metadata' in self and self.metadata != self._orig_metadata:
|
||||
|
||||
@@ -647,6 +647,12 @@ class _TestObject(object):
|
||||
obj = TestObj()
|
||||
self.assertEqual(['foo', 'bar'], obj.obj_fields)
|
||||
|
||||
def test_obj_constructor(self):
|
||||
obj = MyObj(context=self.context, foo=123, bar='abc')
|
||||
self.assertEqual(123, obj.foo)
|
||||
self.assertEqual('abc', obj.bar)
|
||||
self.assertEqual(set(['foo', 'bar']), obj.obj_what_changed())
|
||||
|
||||
|
||||
class TestObject(_LocalTest, _TestObject):
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user