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