def test_expand_identities(self): root = {0:'x'} l1 = [{1:'a'}, {1:'b'}, {1:'c'}] l2 = [{2:'a'}, {2:'b'}, {2:'c'}] l1cp = copy.deepcopy(l1) d = {'root': root, 'l1':l1, 'l2':l2} try: next(namespaces.expand_fuzzyspec_partial(d, ('root', 'l1', 'l2'))) except StopIteration as e: specs = e.value else: raise RuntimeError() self.assertEqual(len(specs), 3*3) for i, spec in enumerate(specs): res = namespaces.resolve(d, spec) namespaces.push_nslevel(res, 'container', {'i':i}) for i, spec in enumerate(specs): res = namespaces.resolve(d, (*spec, 'container')) self.assertEqual(res['i'], i) self.assertEqual(res[1], l1cp[i//3][1]) self.assertEqual(res[2], l2[i%3][2]) self.assertEqual(res[0], 'x')
def process_fuzzyspec(self, fuzzy, ns, parents=None): if not parents: parents = [] gen = namespaces.expand_fuzzyspec_partial(fuzzy, ns) while True: try: key, currspec, currns = next(gen) except StopIteration as e: return e.value else: self.resolve_key(key, currns, parents=[*parents, currspec])
def test_nested_expand(self): d = self.d d['c'][0]['l3'] = [{'x':1},{'x':2}] d['c'][1]['l3'] = [{'x':1},] ns = ChainMap(d) fuzzy = ('c', 'l3') gen = namespaces.expand_fuzzyspec_partial(ns, fuzzy) with self.assertRaises(StopIteration) as ec: next(gen) self.assertEqual(ec.exception.value, [(('c', 0), ('l3', 0)), (('c', 0), ('l3', 1)), (('c', 1), ('l3', 0))] )
def process_fuzzyspec(self, fuzzy, ns, parents=None): if parents is None: parents = [] gen = namespaces.expand_fuzzyspec_partial(ns, fuzzy) while True: try: key, currspec, currns = next(gen) except StopIteration as e: return e.value except TypeError as e: raise ConfigError("Error when processing namespace " "specification %s: %s" % (fuzzy, e)) else: self.resolve_key(key, currns, parents=[*parents, currspec])
def test_expand(self): fuzzy = ('a', 'c') ns = ChainMap(self.d) gen = namespaces.expand_fuzzyspec_partial(ns, fuzzy) #self.assertFalse(list(gen)) while True: try: next(gen) except StopIteration as e: self.assertEqual(e.value, [('a', ('c', 0)), ('a', ('c', 1))]) break else: self.fail() fuzzy = ('a', 'x', 'c') ns = ChainMap(self.d) gen = namespaces.expand_fuzzyspec_partial(ns, fuzzy) #self.assertFalse(list(gen)) var, spec, cns = next(gen) cns[var] = 'not ok' with self.assertRaises(TypeError): next(gen) fuzzy = ('a', 'xx', 'c') ns = ChainMap(self.d) gen = namespaces.expand_fuzzyspec_partial(ns, fuzzy) #self.assertFalse(list(gen)) var, spec, cns = next(gen) cns[var] = [{'ok': True}, {'ok':'yes'}, {'ok':1}] with self.assertRaises(StopIteration) as ec: next(gen) specs = ec.exception.value self.assertEqual(set(specs), set(itertools.product('a', [('xx', 0), ('xx', 1,), ('xx', 2)], [('c', 0), ('c', 1)])) )