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

65 statements  

« prev     ^ index     » next       coverage.py v7.4.4, created at 2024-04-20 06:09 +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; will use {qt_env2gui[loaded]}." 

73 ) 

74 return qt_env2gui[loaded] 

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 return qt_env2gui[qt_api] 

83 else: 

84 if gui == "qt5": 

85 try: 

86 import PyQt5 # noqa 

87 

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

89 except ImportError: 

90 try: 

91 import PySide2 # noqa 

92 

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

94 except ImportError: 

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

96 elif gui == "qt6": 

97 try: 

98 import PyQt6 # noqa 

99 

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

101 except ImportError: 

102 try: 

103 import PySide6 # noqa 

104 

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

106 except ImportError: 

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

108 elif gui == "qt": 

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

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

111 del os.environ["QT_API"] 

112 else: 

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

114 return 

115 

116 # Import it now so we can figure out which version it is. 

117 from IPython.external.qt_for_kernel import QT_API 

118 

119 return qt_env2gui[QT_API] 

120 

121 

122def get_inputhook_name_and_func(gui): 

123 if gui in registered: 

124 return gui, registered[gui] 

125 

126 if gui not in backends: 

127 raise UnknownBackend(gui) 

128 

129 if gui in aliases: 

130 return get_inputhook_name_and_func(aliases[gui]) 

131 

132 gui_mod = gui 

133 if gui.startswith("qt"): 

134 gui = set_qt_api(gui) 

135 gui_mod = "qt" 

136 

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

138 return gui, mod.inputhook