-
Notifications
You must be signed in to change notification settings - Fork 4
/
utils.py
42 lines (30 loc) · 1.06 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import json
import yaml
import collections
import logging
logger = logging.getLogger(__name__)
def ordered_load(stream, use_collections=True):
if use_collections and hasattr(collections, 'OrderedDict'):
object_pairs_hook = collections.OrderedDict
else:
object_pairs_hook = dict
try:
return yaml_ordered_load(stream, object_pairs_hook)
except Exception as e:
logger.error(e, exc_info=True)
return json_ordered_load(stream, object_pairs_hook)
def json_ordered_load(stream, object_pairs_hook):
return json.loads(
stream,
strict=False,
object_pairs_hook=object_pairs_hook)
def yaml_ordered_load(stream, object_pairs_hook, Loader=yaml.Loader):
class OrderedLoader(Loader):
pass
def construct_mapping(loader, node):
loader.flatten_mapping(node)
return object_pairs_hook(loader.construct_pairs(node))
OrderedLoader.add_constructor(
yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG,
construct_mapping)
return yaml.load(stream, OrderedLoader)