def expand(self): """Flesh out undefined items with defaults, if any, from the spec.""" if not self.dense: dense = OrderedDictWithDefaults() # Populate dict with default values from the spec stack = [[dense, self.spec]] while stack: defs, spec = stack.pop() for key, val in spec.items(): if isinstance(val, dict): if key not in defs: defs[key] = OrderedDictWithDefaults() stack.append((defs[key], spec[key])) else: try: defs[key] = spec[key][1] except IndexError: if spec[key][0].endswith('_LIST'): defs[key] = [] else: defs[key] = None # override defaults with sparse values m_override(dense, self.sparse) un_many(dense) self.dense = dense
def expand(self): """Flesh out undefined items with defaults, if any, from the spec.""" if not self.dense: dense = OrderedDictWithDefaults() # Populate dict with default values from the spec stack = [[dense, self.spec]] while stack: defs, spec = stack.pop() for node in spec: if not node.is_leaf(): if node.name not in defs: defs[node.name] = OrderedDictWithDefaults() stack.append((defs[node.name], node)) else: if node.default is ConfigNode.UNSET: if node.vdr and node.vdr.endswith('_LIST'): defs[node.name] = [] else: defs[node.name] = None else: defs[node.name] = node.default # override defaults with sparse values m_override(dense, self.sparse) un_many(dense) self.dense = dense
def test_un_many(self): target = OrderedDictWithDefaults() target["name"] = OrderedDictWithDefaults() target["name"]["index"] = 0 target['__MANY__'] = OrderedDictWithDefaults() target['__MANY__']['name2'] = OrderedDictWithDefaults() target['__MANY__']['subdict'] = OrderedDictWithDefaults() target['__MANY__']['key'] = [] target['__MANY__']['text'] = "Ad infinitum" un_many(None) # harmless, no error/exception un_many(target) self.assertFalse('__MANY__' in list(target))
def test_un_many_keyerror_no_default(self): """ Only way that this may happen is if dict is updated elsewhere. And in this case, when there is no defaults_, the API raises the current KeyError. """ class MyODWD(OrderedDictWithDefaults): def __delitem__(self, _): raise KeyError() target = MyODWD() target["name"] = "Anything" target['__MANY__'] = MyODWD() target['__MANY__']['name2'] = MyODWD() target['__MANY__']['subdict'] = MyODWD() target['__MANY__']['key'] = [] target['__MANY__']['text'] = "Ad infinitum" un_many(None) # harmless, no error/exception with self.assertRaises(KeyError): un_many(target)
def test_un_many_keyerror(self): """ Only way that this may happen is if dict is updated elsewhere. """ class MyODWD(OrderedDictWithDefaults): def __delitem__(self, _): raise KeyError() target = MyODWD() target["name"] = "Anything" target.defaults_ = dict() target.defaults_["name"] = True target.defaults_["__MANY__"] = True target['__MANY__'] = MyODWD() target['__MANY__']['name2'] = MyODWD() target['__MANY__']['subdict'] = MyODWD() target['__MANY__']['key'] = [] target['__MANY__']['text'] = "Ad infinitum" un_many(None) # harmless, no error/exception un_many(target) self.assertTrue('__MANY__' in target, target)