class HasCollections(properties.HasProperties): tuple_unobs = properties.Tuple('') dict_unobs = properties.Dictionary('') dict_obs = properties.Dictionary('', observe_mutations=True) list_unobs = properties.List('') list_obs = properties.List('', observe_mutations=True) set_unobs = properties.Set('') set_obs = properties.Set('', observe_mutations=True)
class HasSets(properties.HasProperties): basic = properties.Set('', properties.Integer('')) advanced = properties.Set('', properties.Integer(''), observe_mutations=True) def __init__(self, **kwargs): self._basic_tic = 0 self._advanced_tic = 0 @properties.validator('basic') def _basic_val(self, change): self._basic_tic += 1 @properties.validator('advanced') def _advanced_val(self, change): self._advanced_tic += 1
class HasOptionalSet(properties.HasProperties): myset = properties.Set('', properties.Bool(''), required=False, observe_mutations=om)
class HasIntASet(properties.HasProperties): myset = properties.Set('set of HasIntA', HasIntA, observe_mutations=om)
class HasColorSet(properties.HasProperties): ccc = properties.Set('set of colors', properties.Color(''), observe_mutations=om)
class HasConstrianedSet(properties.HasProperties): aaa = properties.Set('set of ints', properties.Integer(''), max_length=2, observe_mutations=om)
class HasCoercedIntSet(properties.HasProperties): aaa = properties.Set('set of ints', properties.Integer(''), observe_mutations=om, coerce=True)
class HasIntSet(properties.HasProperties): aaa = properties.Set('set of ints', properties.Integer(''), observe_mutations=om, default=set)
class HasDummySet(properties.HasProperties): myset = properties.Set('dummy has properties set', prop=HasPropsDummy, observe_mutations=om)
def _test_set(self, om): with self.assertRaises(TypeError): properties.Set('bad string set', prop=str) with self.assertRaises(TypeError): properties.Set('bad max', properties.Integer(''), max_length=-10) with self.assertRaises(TypeError): properties.Set('bad max', properties.Integer(''), max_length='ten') with self.assertRaises(TypeError): myset = properties.Set('bad max', properties.Integer(''), min_length=20) myset.max_length = 10 with self.assertRaises(TypeError): properties.Set('bad min', properties.Integer(''), min_length=-10) with self.assertRaises(TypeError): properties.Set('bad min', properties.Integer(''), min_length='ten') with self.assertRaises(TypeError): myset = properties.Set('bad min', properties.Integer(''), max_length=10) myset.min_length = 20 with self.assertRaises(TypeError): properties.Set('bad observe', properties.Integer(''), observe_mutations=5) with self.assertRaises(TypeError): properties.Set('bad coerce', properties.Integer(''), coerce=5) class HasPropsDummy(properties.HasProperties): pass myset = properties.Set('dummy has properties set', prop=HasPropsDummy, observe_mutations=om) assert isinstance(myset.prop, properties.Instance) assert myset.prop.instance_class is HasPropsDummy class HasDummySet(properties.HasProperties): myset = properties.Set('dummy has properties set', prop=HasPropsDummy, observe_mutations=om) assert HasDummySet()._props['myset'].name == 'myset' assert HasDummySet()._props['myset'].prop.name == 'myset' class HasIntSet(properties.HasProperties): aaa = properties.Set('set of ints', properties.Integer(''), observe_mutations=om, default=set) li = HasIntSet() li.aaa = {1, 2, 3} with self.assertRaises(ValueError): li.aaa = (1, 2, 3) li.aaa = {1., 2., 3.} with self.assertRaises(ValueError): li.aaa = 4 with self.assertRaises(ValueError): li.aaa = {'a', 'b', 'c'} li1 = HasIntSet() li2 = HasIntSet() assert li1.aaa == li2.aaa assert li1.aaa is not li2.aaa class HasCoercedIntSet(properties.HasProperties): aaa = properties.Set('set of ints', properties.Integer(''), observe_mutations=om, coerce=True) li = HasCoercedIntSet() li.aaa = 1 assert li.aaa == {1} li.aaa = [1, 2, 3] assert li.aaa == {1, 2, 3} li.aaa = (1, 2, 3) assert li.aaa == {1, 2, 3} class HasConstrianedSet(properties.HasProperties): aaa = properties.Set('set of ints', properties.Integer(''), min_length=2, observe_mutations=om) li = HasConstrianedSet() li.aaa = {1, 2, 3} li.validate() li.aaa = {1} with self.assertRaises(ValueError): li.validate() class HasConstrianedSet(properties.HasProperties): aaa = properties.Set('set of ints', properties.Integer(''), max_length=2, observe_mutations=om) li = HasConstrianedSet() li.aaa = {1, 2} li.validate() li.aaa = {1, 2, 3, 4, 5} with self.assertRaises(ValueError): li.validate() class HasColorSet(properties.HasProperties): ccc = properties.Set('set of colors', properties.Color(''), observe_mutations=om) li = HasColorSet() li.ccc = {'red', '#00FF00'} assert li.ccc == {(255, 0, 0), (0, 255, 0)} numset = {1, 2, 3, 4} assert properties.Set.to_json(numset) == list(numset) assert properties.Set.from_json(list(numset)) == numset assert properties.Set.from_json(list(numset)) is not numset class HasIntA(properties.HasProperties): a = properties.Integer('int a', required=True) hia_json = properties.Set.to_json({HasIntA(a=5), HasIntA(a=10)}) assert (hia_json == [{ '__class__': 'HasIntA', 'a': 5 }, { '__class__': 'HasIntA', 'a': 10 }] or hia_json == [{ '__class__': 'HasIntA', 'a': 10 }, { '__class__': 'HasIntA', 'a': 5 }]) li_ser = li.serialize(include_class=False) assert (li_ser == { 'ccc': [[255, 0, 0], [0, 255, 0]] } or li_ser == { 'ccc': [[0, 255, 0], [255, 0, 0]] }) class HasIntASet(properties.HasProperties): myset = properties.Set('set of HasIntA', HasIntA, observe_mutations=om) deser_set = HasIntASet.deserialize({ 'myset': [{ 'a': 0 }, { 'a': 10 }, { 'a': 100 }] }).myset assert isinstance(deser_set, set) assert len(deser_set) == 3 assert all(isinstance(val, HasIntA) for val in deser_set) assert {val.a for val in deser_set} == {0, 10, 100} class HasOptionalSet(properties.HasProperties): myset = properties.Set('', properties.Bool(''), required=False, observe_mutations=om) hol = HasOptionalSet() hol.validate() assert HasIntASet._props['myset'].deserialize(None) is None assert properties.Set('', properties.Instance('', HasIntA), observe_mutations=om).equal( {HasIntA(a=1), HasIntA(a=2)}, {HasIntA(a=1), HasIntA(a=2)}) assert not properties.Set( '', properties.Instance('', HasIntA), observe_mutations=om).equal( {HasIntA(a=1), HasIntA(a=2)}, {HasIntA(a=1), HasIntA(a=2), HasIntA(a=3)}) assert not properties.Set( '', properties.Instance('', HasIntA), observe_mutations=om).equal( {HasIntA(a=1), HasIntA(a=2)}, {HasIntA(a=1), HasIntA(a=3)}) assert not properties.Set( '', properties.Integer(''), observe_mutations=om).equal(5, 5)