Add a Set and SetOfIntegers object fields
Object fields that represent sets of things. Will be useful for NUMA topology object which will be added in subsequent patches. Change-Id: I66d61c760a70ad661dff4c40c6933df06192ee8f Blueprint: virt-driver-numa-placement
This commit is contained in:
parent
2341ccb2ff
commit
e72c5f7ea2
@ -434,6 +434,30 @@ class Dict(CompoundFieldType):
|
||||
for key, val in sorted(value.items())]))
|
||||
|
||||
|
||||
class Set(CompoundFieldType):
|
||||
def coerce(self, obj, attr, value):
|
||||
if not isinstance(value, set):
|
||||
raise ValueError(_('A set is required here'))
|
||||
|
||||
coerced = set()
|
||||
for element in value:
|
||||
coerced.add(self._element_type.coerce(
|
||||
obj, '%s["%s"]' % (attr, element), element))
|
||||
return coerced
|
||||
|
||||
def to_primitive(self, obj, attr, value):
|
||||
return tuple(
|
||||
self._element_type.to_primitive(obj, attr, x) for x in value)
|
||||
|
||||
def from_primitive(self, obj, attr, value):
|
||||
return set([self._element_type.from_primitive(obj, attr, x)
|
||||
for x in value])
|
||||
|
||||
def stringify(self, value):
|
||||
return 'set([%s])' % (
|
||||
','.join([self._element_type.stringify(x) for x in value]))
|
||||
|
||||
|
||||
class Object(FieldType):
|
||||
def __init__(self, obj_name, **kwargs):
|
||||
self._obj_name = obj_name
|
||||
@ -575,6 +599,10 @@ class ListOfStringsField(AutoTypedField):
|
||||
AUTO_TYPE = List(String())
|
||||
|
||||
|
||||
class SetOfIntegersField(AutoTypedField):
|
||||
AUTO_TYPE = Set(Integer())
|
||||
|
||||
|
||||
class ListOfDictOfNullableStringsField(AutoTypedField):
|
||||
AUTO_TYPE = List(Dict(String(), nullable=True))
|
||||
|
||||
|
@ -271,6 +271,34 @@ class TestListOfStrings(TestField):
|
||||
self.assertEqual("['abc']", self.field.stringify(['abc']))
|
||||
|
||||
|
||||
class TestSet(TestField):
|
||||
def setUp(self):
|
||||
super(TestSet, self).setUp()
|
||||
self.field = fields.Field(fields.Set(FakeFieldType()))
|
||||
self.coerce_good_values = [(set(['foo', 'bar']),
|
||||
set(['*foo*', '*bar*']))]
|
||||
self.coerce_bad_values = [['foo'], {'foo': 'bar'}]
|
||||
self.to_primitive_values = [(set(['foo']), tuple(['!foo!']))]
|
||||
self.from_primitive_values = [(tuple(['!foo!']), set(['foo']))]
|
||||
|
||||
def test_stringify(self):
|
||||
self.assertEqual('set([123])', self.field.stringify(set([123])))
|
||||
|
||||
|
||||
class TestSetOfIntegers(TestField):
|
||||
def setUp(self):
|
||||
super(TestSetOfIntegers, self).setUp()
|
||||
self.field = fields.SetOfIntegersField()
|
||||
self.coerce_good_values = [(set(['1', 2]),
|
||||
set([1, 2]))]
|
||||
self.coerce_bad_values = [set(['foo'])]
|
||||
self.to_primitive_values = [(set([1]), tuple([1]))]
|
||||
self.from_primitive_values = [(tuple([1]), set([1]))]
|
||||
|
||||
def test_stringify(self):
|
||||
self.assertEqual('set([1,2])', self.field.stringify(set([1, 2])))
|
||||
|
||||
|
||||
class TestObject(TestField):
|
||||
def setUp(self):
|
||||
super(TestObject, self).setUp()
|
||||
|
Loading…
Reference in New Issue
Block a user