Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 3
0
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]}}
Esempio n. 4
0
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