@cryptotaxi247 / netdata-1 / commits / 8b6d748fb

loaders classes added

lgz committed Oct 13, 2017 at 00:07 UTC 8b6d748fbaba06b268fe3437f0e3fc5bf07faf86
1 file changed +66
python.d/python_modules/bases/loaders.py new
+66
@@ -0,0 +1,66 @@
1 +# -*- coding: utf-8 -*-
2 +# Description:
3 +# Author: Ilya Mashchenko (l2isbad)
4 +
5 +import types
6 +from sys import version_info
7 +
8 +PY_VERSION = version_info[:2]
9 +
10 +if PY_VERSION > (3, 1):
11 + from pyyaml3 import SafeLoader as YamlSafeLoader
12 + from importlib.machinery import SourceFileLoader
13 + DEFAULT_MAPPING_TAG = 'tag:yaml.org,2002:map'
14 +else:
15 + from pyyaml2 import SafeLoader as YamlSafeLoader
16 + from imp import load_source as SourceFileLoader
17 + DEFAULT_MAPPING_TAG = u'tag:yaml.org,2002:map'
18 +
19 +try:
20 + from collections import OrderedDict
21 +except ImportError:
22 + from third_party.ordereddict import OrderedDict
23 +
24 +
25 +def dict_constructor(loader, node):
26 + return OrderedDict(loader.construct_pairs(node))
27 +
28 +
29 +YamlSafeLoader.add_constructor(DEFAULT_MAPPING_TAG, dict_constructor)
30 +
31 +
32 +class YamlOrderedLoader:
33 + @staticmethod
34 + def load_config_from_file(file_name):
35 + opened, loaded = False, False
36 + try:
37 + stream = open(file_name, 'r')
38 + opened = True
39 + loader = YamlSafeLoader(stream)
40 + loaded = True
41 + parsed = loader.get_single_data()
42 + except Exception as error:
43 + return dict(), error
44 + else:
45 + return parsed, None
46 + finally:
47 + if opened:
48 + stream.close()
49 + if loaded:
50 + loader.dispose()
51 +
52 +
53 +class SourceLoader:
54 + @staticmethod
55 + def load_module_from_file(name, path):
56 + try:
57 + loaded = SourceFileLoader(name, path)
58 + if isinstance(loaded, types.ModuleType):
59 + return loaded, None
60 + return loaded.load_module(), None
61 + except Exception as error:
62 + return None, error
63 +
64 +
65 +class ModuleAndConfigLoader(YamlOrderedLoader, SourceLoader):
66 + pass