Coverage for /home/martinb/.local/share/virtualenvs/camcops/lib/python3.6/site-packages/peppercorn/__init__.py : 21%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
2def data_type(value):
3 if ':' in value:
4 return [ x.strip() for x in value.rsplit(':', 1) ]
5 return ('', value.strip())
7START = '__start__'
8END = '__end__'
9SEQUENCE = 'sequence'
10MAPPING = 'mapping'
11RENAME = 'rename'
12IGNORE = 'ignore'
13TYPS = (SEQUENCE, MAPPING, RENAME, IGNORE)
16def parse(tokens):
17 """ Infer a data structure from the ordered set of fields and
18 return it."""
19 target = typ = None
20 out = [] # [(key, value)]
21 stack = [] # [(target, typ, out)]
23 for token in tokens:
24 key, val = token
25 if key == START:
26 stack.append((target, typ, out))
27 target, typ = data_type(val)
28 if typ in TYPS:
29 out = []
30 else:
31 raise ValueError("Unknown start marker %s" % repr(token))
32 elif key == END:
33 if typ == SEQUENCE:
34 parsed = [v for (k, v) in out]
35 elif typ == MAPPING:
36 parsed = dict(out)
37 elif typ == RENAME:
38 parsed = out[0][1] if out else ''
39 elif typ == IGNORE:
40 parsed = None
41 else:
42 raise ValueError("Too many end markers")
43 prev_target, prev_typ, out = stack.pop()
44 if parsed is not None:
45 out.append((target, parsed))
46 target = prev_target
47 typ = prev_typ
48 else:
49 out.append(token)
51 if stack:
52 raise ValueError("Not enough end markers")
54 return dict(out)