Hide keyboard shortcuts

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

1""" 

2 lml.utils 

3 ~~~~~~~~~~~~~~~~~~~ 

4 

5 json utils for dump plugin info class 

6 

7 :copyright: (c) 2017-2020 by Onni Software Ltd. 

8 :license: New BSD License, see LICENSE for more details 

9""" 

10import sys 

11import logging 

12from json import JSONEncoder, dumps 

13 

14PY2 = sys.version_info[0] == 2 

15log = logging.getLogger(__name__) 

16 

17 

18class PythonObjectEncoder(JSONEncoder): 

19 """ 

20 Custom object encoder for json dump 

21 """ 

22 

23 def default(self, obj): 

24 a_list_of_types = (list, dict, str, int, float, bool, type(None)) 

25 if PY2: 

26 a_list_of_types += (unicode,) 

27 if isinstance(obj, a_list_of_types): 

28 return JSONEncoder.default(self, obj) 

29 return {"_python_object": str(obj)} 

30 

31 

32def json_dumps(keywords): 

33 """ 

34 Dump function keywords in json 

35 """ 

36 return dumps(keywords, cls=PythonObjectEncoder) 

37 

38 

39def do_import(plugin_module_name): 

40 """dynamically import a module""" 

41 try: 

42 return _do_import(plugin_module_name) 

43 except ImportError: 

44 log.exception("%s is absent or cannot be imported", plugin_module_name) 

45 raise 

46 

47 

48def _do_import(plugin_module_name): 

49 plugin_module = __import__(plugin_module_name) 

50 if "." in plugin_module_name: 

51 modules = plugin_module_name.split(".") 

52 for module in modules[1:]: 

53 plugin_module = getattr(plugin_module, module) 

54 log.debug("found " + plugin_module_name) 

55 return plugin_module 

56 

57 

58def do_import_class(plugin_class): 

59 """dynamically import a class""" 

60 try: 

61 plugin_module_name = plugin_class.rsplit(".", 1)[0] 

62 plugin_module = __import__(plugin_module_name) 

63 modules = plugin_class.split(".") 

64 for module in modules[1:]: 

65 plugin_module = getattr(plugin_module, module) 

66 return plugin_module 

67 except ImportError: 

68 log.exception("Failed to import %s", plugin_module_name) 

69 raise