Merge "Rework update_attrs so dirty list always updated"

This commit is contained in:
Jenkins
2015-04-14 15:28:34 +00:00
committed by Gerrit Code Review
3 changed files with 27 additions and 18 deletions

View File

@@ -31,6 +31,7 @@ There are plenty of examples of use of this class in the SDK code.
import abc import abc
import collections import collections
import itertools
import six import six
from six.moves.urllib import parse as url_parse from six.moves.urllib import parse as url_parse
@@ -434,13 +435,10 @@ class Resource(collections.MutableMapping):
:rtype: None :rtype: None
""" """
# ensure setters are called for type coercion # ensure setters are called for type coercion
for key, value in dict(*args).items(): for key, value in itertools.chain(dict(*args).items(), kwargs.items()):
if key != "id": # id property is read only if key != "id": # id property is read only
self._attrs[key] = value
setattr(self, key, value) setattr(self, key, value)
self[key] = value
for key, value in kwargs.items():
setattr(self, key, value)
def get_headers(self): def get_headers(self):
if HEADERS in self._attrs: if HEADERS in self._attrs:

View File

@@ -178,11 +178,10 @@ class PropTests(base.TestCase):
attr = resource.prop("something", alias="attr") attr = resource.prop("something", alias="attr")
val = "hey" val = "hey"
args = {"attr": val} args = {"something": val}
sot = Test(args) sot = Test(args)
self.assertEqual(val, sot._attrs["something"]) self.assertEqual(val, sot._attrs["something"])
self.assertIsNone(sot._attrs.get("attr"))
self.assertEqual(val, sot.attr) self.assertEqual(val, sot.attr)
@@ -523,13 +522,13 @@ class ResourceTests(base.TestTransportBase):
FakeResource.resource_key] FakeResource.resource_key]
self.assertEqual(4, len(last_req)) self.assertEqual(4, len(last_req))
self.assertEqual('True', last_req['enabled']) self.assertTrue(last_req['enabled'])
self.assertEqual(fake_name, last_req['name']) self.assertEqual(fake_name, last_req['name'])
self.assertEqual(fake_attr1, last_req['attr1']) self.assertEqual(fake_attr1, last_req['attr1'])
self.assertEqual(fake_attr2, last_req['attr2']) self.assertEqual(fake_attr2, last_req['attr2'])
self.assertEqual(fake_id, obj.id) self.assertEqual(fake_id, obj.id)
self.assertEqual('True', obj['enabled']) self.assertTrue(obj['enabled'])
self.assertEqual(fake_name, obj['name']) self.assertEqual(fake_name, obj['name'])
self.assertEqual(fake_attr1, obj['attr1']) self.assertEqual(fake_attr1, obj['attr1'])
self.assertEqual(fake_attr2, obj['attr2']) self.assertEqual(fake_attr2, obj['attr2'])
@@ -896,23 +895,35 @@ class ResourceTests(base.TestTransportBase):
moe = resource.prop("the-attr") moe = resource.prop("the-attr")
larry = resource.prop("the-attr2") larry = resource.prop("the-attr2")
curly = resource.prop("the-attr3", type=int) curly = resource.prop("the-attr3", type=int)
shemp = resource.prop("the-attr4")
value1 = "one" value1 = "one"
value2 = "two" value2 = "two"
value3 = "3" value3 = "3"
value4 = "fore" value4 = "fore"
value5 = "fiver"
sot = Test({"the-attr": value1}) sot = Test({"the-attr": value1})
sot.update_attrs({"the-attr2": value2, "notprop": value4}) sot.update_attrs({"the-attr2": value2, "notprop": value4})
sot.update_attrs(curly=value3) self.assertTrue(sot.is_dirty)
self.assertEqual(value1, sot.moe) self.assertEqual(value1, sot.moe)
self.assertEqual(value1, sot["the-attr"]) self.assertEqual(value1, sot["the-attr"])
self.assertEqual(value2, sot.larry) self.assertEqual(value2, sot.larry)
self.assertEqual(value4, sot.notprop)
sot._reset_dirty()
sot.update_attrs(curly=value3)
self.assertTrue(sot.is_dirty)
self.assertEqual(int, type(sot.curly)) self.assertEqual(int, type(sot.curly))
self.assertEqual(int(value3), sot.curly) self.assertEqual(int(value3), sot.curly)
self.assertEqual(value4, sot["notprop"])
sot._reset_dirty()
sot.update_attrs(**{"the-attr4": value5})
self.assertTrue(sot.is_dirty)
self.assertEqual(value5, sot.shemp)
def test_get_id(self): def test_get_id(self):
class Test(resource.Resource): class Test(resource.Resource):
@@ -968,12 +979,12 @@ class ResourceTests(base.TestTransportBase):
def test_boolstr_prop(self): def test_boolstr_prop(self):
faker = FakeResource(fake_data) faker = FakeResource(fake_data)
self.assertEqual(True, faker.enabled) self.assertTrue(faker.enabled)
self.assertEqual('True', faker['enabled']) self.assertTrue(faker['enabled'])
faker.enabled = False faker._attrs['enabled'] = False
self.assertEqual(False, faker.enabled) self.assertFalse(faker.enabled)
self.assertEqual('False', faker['enabled']) self.assertFalse(faker['enabled'])
# should fail fast # should fail fast
def set_invalid(): def set_invalid():

View File

@@ -74,7 +74,7 @@ class TestVolume(testtools.TestCase):
self.assertEqual(VOLUME["bootable"], sot.bootable) self.assertEqual(VOLUME["bootable"], sot.bootable)
self.assertEqual(VOLUME["created_at"], sot.created) self.assertEqual(VOLUME["created_at"], sot.created)
self.assertEqual(VOLUME["description"], sot.description) self.assertEqual(VOLUME["description"], sot.description)
self.assertEqual(VOLUME["volume_type"], sot.volume_type) self.assertEqual(VOLUME["volume_type"], sot.type)
self.assertEqual(VOLUME["snapshot_id"], sot.snapshot) self.assertEqual(VOLUME["snapshot_id"], sot.snapshot)
self.assertEqual(VOLUME["source_volid"], sot.source_volume) self.assertEqual(VOLUME["source_volid"], sot.source_volume)
self.assertEqual(VOLUME["metadata"], sot.metadata) self.assertEqual(VOLUME["metadata"], sot.metadata)