Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/IPython/terminal/pt_inputhooks/__init__.py: 18%

62 statements  

« prev     ^ index     » next       coverage.py v7.2.2, created at 2023-03-26 06:07 +0000

1import importlib 

2import os 

3 

4aliases = { 

5 'qt4': 'qt', 

6 'gtk2': 'gtk', 

7} 

8 

9backends = [ 

10 "qt", 

11 "qt5", 

12 "qt6", 

13 "gtk", 

14 "gtk2", 

15 "gtk3", 

16 "gtk4", 

17 "tk", 

18 "wx", 

19 "pyglet", 

20 "glut", 

21 "osx", 

22 "asyncio", 

23] 

24 

25registered = {} 

26 

27def register(name, inputhook): 

28 """Register the function *inputhook* as an event loop integration.""" 

29 registered[name] = inputhook 

30 

31 

32class UnknownBackend(KeyError): 

33 def __init__(self, name): 

34 self.name = name 

35 

36 def __str__(self): 

37 return ("No event loop integration for {!r}. " 

38 "Supported event loops are: {}").format(self.name, 

39 ', '.join(backends + sorted(registered))) 

40 

41 

42def set_qt_api(gui): 

43 """Sets the `QT_API` environment variable if it isn't already set.""" 

44 

45 qt_api = os.environ.get("QT_API", None) 

46 

47 from IPython.external.qt_loaders import ( 

48 QT_API_PYQT, 

49 QT_API_PYQT5, 

50 QT_API_PYQT6, 

51 QT_API_PYSIDE, 

52 QT_API_PYSIDE2, 

53 QT_API_PYSIDE6, 

54 QT_API_PYQTv1, 

55 loaded_api, 

56 ) 

57 

58 loaded = loaded_api() 

59 

60 qt_env2gui = { 

61 QT_API_PYSIDE: "qt4", 

62 QT_API_PYQTv1: "qt4", 

63 QT_API_PYQT: "qt4", 

64 QT_API_PYSIDE2: "qt5", 

65 QT_API_PYQT5: "qt5", 

66 QT_API_PYSIDE6: "qt6", 

67 QT_API_PYQT6: "qt6", 

68 } 

69 if loaded is not None and gui != "qt": 

70 if qt_env2gui[loaded] != gui: 

71 print( 

72 f"Cannot switch Qt versions for this session; must use {qt_env2gui[loaded]}." 

73 ) 

74 return 

75 

76 if qt_api is not None and gui != "qt": 

77 if qt_env2gui[qt_api] != gui: 

78 print( 

79 f'Request for "{gui}" will be ignored because `QT_API` ' 

80 f'environment variable is set to "{qt_api}"' 

81 ) 

82 else: 

83 if gui == "qt5": 

84 try: 

85 import PyQt5 # noqa 

86 

87 os.environ["QT_API"] = "pyqt5" 

88 except ImportError: 

89 try: 

90 import PySide2 # noqa 

91 

92 os.environ["QT_API"] = "pyside2" 

93 except ImportError: 

94 os.environ["QT_API"] = "pyqt5" 

95 elif gui == "qt6": 

96 try: 

97 import PyQt6 # noqa 

98 

99 os.environ["QT_API"] = "pyqt6" 

100 except ImportError: 

101 try: 

102 import PySide6 # noqa 

103 

104 os.environ["QT_API"] = "pyside6" 

105 except ImportError: 

106 os.environ["QT_API"] = "pyqt6" 

107 elif gui == "qt": 

108 # Don't set QT_API; let IPython logic choose the version. 

109 if "QT_API" in os.environ.keys(): 

110 del os.environ["QT_API"] 

111 else: 

112 print(f'Unrecognized Qt version: {gui}. Should be "qt5", "qt6", or "qt".') 

113 return 

114 

115 

116def get_inputhook_name_and_func(gui): 

117 if gui in registered: 

118 return gui, registered[gui] 

119 

120 if gui not in backends: 

121 raise UnknownBackend(gui) 

122 

123 if gui in aliases: 

124 return get_inputhook_name_and_func(aliases[gui]) 

125 

126 gui_mod = gui 

127 if gui.startswith("qt"): 

128 set_qt_api(gui) 

129 gui_mod = "qt" 

130 

131 mod = importlib.import_module("IPython.terminal.pt_inputhooks." + gui_mod) 

132 return gui, mod.inputhook