userver: en/testsuite/utils/tskv.py Source File
Loading...
Searching...
No Matches
tskv.py
1"""Tools to format messages to different formats."""
2
3import datetime
4import itertools
5
6ENTRIES_SEP = '\t'
7KV_SEP = '='
8
9
10def dict_to_tskv(dct, tskv_format='', add_header=True):
11 """Convert dictionary to string in TSKV format."""
12 return items_to_tskv(
13 dct.items(),
14 tskv_format=tskv_format,
15 add_header=add_header,
16 )
17
18
19def items_to_tskv(items, tskv_format='', add_header=True):
20 """Return items to string in TSKV format."""
21 data_segments = map(_format_pair, items)
22
23 segments: map | itertools.chain
24 if add_header:
25 segments = itertools.chain(
26 ('tskv', _format_pair(('tskv_format', tskv_format))),
27 data_segments,
28 )
29 else:
30 segments = data_segments
31
32 return ENTRIES_SEP.join(segments)
33
34
35def join_tskv(*escaped_strings):
36 """Join strings in TSKV format."""
37 return ENTRIES_SEP.join(escaped_strings)
38
39
40def _escape(item):
41 if isinstance(item, datetime.datetime):
42 return _escape_datetime(item)
43 return _escape_string(str(item))
44
45
46def _escape_datetime(stamp):
47 return stamp.isoformat()
48
49
50def _escape_key(string):
51 return _escape_string(string).replace('=', '\\=')
52
53
54def _escape_string(string):
55 if not isinstance(string, str):
56 string = str(string)
57 return (
58 string.replace('\\', '\\\\')
59 .replace('\t', '\\t')
60 .replace('\r', '\\r')
61 .replace('\n', '\\n')
62 .replace('\0', '\\0')
63 )
64
65
66def _format_pair(value):
67 return f'{_escape_key(value[0])}={_escape(value[1])}'