def test_ref(): assert glom([[[]]], Ref('item', [Ref('item')])) == [[[]]] with pytest.raises( Exception ): # check that it recurses downards and dies on int iteration glom([[[1]]], Ref('item', [Ref('item')])) assert repr(Ref('item', (T[1], Ref('item')))) == "Ref('item', (T[1], Ref('item')))" etree2dicts = Ref( 'ElementTree', { "tag": "tag", "text": "text", "attrib": "attrib", "children": (iter, [Ref('ElementTree')]) }) etree2tuples = Fill( Ref('ElementTree', (T.tag, Iter(Ref('ElementTree')).all()))) etree = ElementTree.fromstring(''' <html> <head> <title>the title</title> </head> <body id="the-body"> <p>A paragraph</p> </body> </html>''') glom(etree, etree2dicts) glom(etree, etree2tuples)
def test_nested_struct(): """adapted from use case""" import json def _json(spec): return Auto((json.loads, _str_json, Match(spec))) _str_json = Ref( 'json', Match( Or(And(dict, {Ref('json'): Ref('json')}), And(list, [Ref('json')]), And(type(u''), Auto(str)), object))) rule_spec = Match({ 'rule_id': Or('', Regex(r'\d+')), 'rule_name': str, 'effect': Or('approve', 'custom_approvers'), 'rule_approvers': _json([{ 'pk': int, 'level': int }]), 'rule_data': _json([ # list of condition-objects { Optional('value', 'null'): _json(Or(None, int, float, str, [int, float, str])), 'field': Auto(int), # id of row from FilterField 'operator': str, # corresponds to FilterOperator.display_name } ]), Optional('save_as_new', False): Or(str, bool), }) rule = dict(rule_id='1', rule_name='test rule', effect='approve', rule_approvers=json.dumps([{ 'pk': 2, 'level': 1 }]), rule_data=json.dumps([{ 'value': json.dumps([1, 2]), 'field': 2, 'operator': '>' }, { 'field': 2, 'operator': '==' }])) glom(rule, rule_spec) rule['save_as_new'] = 'true' glom(rule, rule_spec)
def test_json_ref(): assert glom( {'a': {'b': [0, 1]}}, Ref('json', Match(Or( And(dict, {Ref('json'): Ref('json')}), And(list, [Ref('json')]), And(0, Val(None)), object)))) == {'a': {'b': [None, 1]}}
def test_pattern_matching(): pattern_matcher = Or(And(Match(1), Val('one')), And(Match(2), Val('two')), And(Match(float), Val('float'))) assert glom(1, pattern_matcher) == 'one' assert glom(1.1, pattern_matcher) == 'float' # obligatory fibonacci fib = (M > 2) & (lambda n: glom(n - 1, fib) + glom(n - 2, fib)) | T assert glom(5, fib) == 8 factorial = (lambda t: t + 1, Ref('fact', (lambda t: t - 1, (M == 0) & Fill(1) | (S(r=Ref('fact')), S, lambda s: s['r'] * s[T])))) assert glom(4, factorial) == 4 * 3 * 2