Coverage for pyquickhelper/helpgen/conf_path_tools.py: 100%

29 statements  

« prev     ^ index     » next       coverage.py v7.2.7, created at 2023-06-03 02:21 +0200

1""" 

2@file 

3@brief Looks for paths, Miktek, Graphviz... 

4""" 

5import sys 

6import os 

7import errno 

8 

9 

10def find_in_PATH(prog): 

11 """ 

12 look into every path mentioned in ``%PATH%`` a specific file, 

13 it raises an exception if not Found 

14 

15 @param prog program to look for 

16 @return path 

17 """ 

18 sep = ";" if sys.platform.startswith("win") else ":" 

19 path = os.environ["PATH"] 

20 for p in path.split(sep): 

21 f = os.path.join(p, prog) 

22 if os.path.exists(f): 

23 return p # pragma: no cover 

24 return None 

25 

26 

27def find_graphviz_dot(exc=True): 

28 """ 

29 Determines the path to graphviz (on Windows), 

30 the function tests the existence of versions 34 to 45 

31 assuming it was installed in a standard folder: 

32 ``C:\\Program Files\\MiKTeX 2.9\\miktex\\bin\\x64``. 

33 

34 :param exc: raise exception of be silent 

35 :return: path to dot 

36 :raises FileNotFoundError: if graphviz not found 

37 """ 

38 if sys.platform.startswith("win"): # pragma: no cover 

39 version = list(range(34, 60)) 

40 version.extend([f"{v}.1" for v in version]) 

41 for v in version: 

42 graphviz_dot = ( 

43 f"C:\\Program Files (x86)\\Graphviz2.{v}\\bin\\dot.exe") 

44 if os.path.exists(graphviz_dot): 

45 return graphviz_dot 

46 extra = ['build/update_modules/Graphviz/bin'] 

47 for ext in extra: 

48 graphviz_dot = os.path.join(ext, "dot.exe") 

49 if os.path.exists(graphviz_dot): 

50 return graphviz_dot 

51 p = find_in_PATH("dot.exe") 

52 if p is None: 

53 if exc: 

54 typstr = str 

55 raise FileNotFoundError( 

56 "Unable to find graphviz, look into paths such as {}" 

57 ".".format(typstr(graphviz_dot))) 

58 return None 

59 return os.path.join(p, "dot.exe") 

60 # linux 

61 return "dot" 

62 

63 

64def find_latex_path(exc=True): 

65 """ 

66 Finds latex path. 

67 Returns an empty string on :epkg:`linux`. 

68 

69 :param exc: raises an exception or be silent 

70 :return: something like 

71 ``C:\\Program Files\\MiKTeX 2.9\\miktex\\bin\\x64`` 

72 :raises FileNotFoundError: if latex not found 

73 """ 

74 if sys.platform.startswith("win"): # pragma: no cover 

75 latex = latex0 = r"C:\Program Files\MiKTeX 2.9\miktex\bin\x64" 

76 if not os.path.exists(latex): 

77 latex = find_in_PATH("latex.exe") 

78 if latex is None or not os.path.exists(latex): 

79 if exc: 

80 typstr = str 

81 raise FileNotFoundError( 

82 "Unable to find latex (miktex), " 

83 "look into paths such as %r." % typstr(latex0)) 

84 return None 

85 return latex 

86 # linux, should be in PATH. 

87 return "" 

88 

89 

90def find_pandoc_path(exc=True): 

91 """ 

92 Determines :epkg:`pandoc` location. 

93 Returns an empty string on :epkg:`linux`. 

94 

95 @return path to :epkg:`pandoc` 

96 """ 

97 if sys.platform.startswith("win"): # pragma: no cover 

98 path = os.environ["USERPROFILE"] 

99 pandoc = os.path.join(path, "AppData", "Local", "Pandoc") 

100 pdoc = os.path.join(pandoc, "pandoc.exe") 

101 if os.path.exists(pdoc): 

102 return pandoc 

103 tries = [pandoc] 

104 

105 path = os.environ["ProgramFiles(x86)"] 

106 pandoc = os.path.join(path, "Pandoc") 

107 pdoc = os.path.join(pandoc, "pandoc.exe") 

108 if os.path.exists(pdoc): 

109 return pandoc 

110 tries.append(pandoc) 

111 

112 if not os.path.exists(pandoc): 

113 # we try others users because pandoc goes into 

114 # a user folder by default. 

115 root = os.path.normpath(os.path.join(path, "..")) 

116 users = os.listdir(root) 

117 for u in users: 

118 p = os.path.join(root, u) 

119 if os.path.isdir(p): 

120 pandoc = os.path.join(p, "AppData", "Local", "Pandoc") 

121 if os.path.exists(pandoc): 

122 return pandoc 

123 tries.append(pandoc) 

124 pandoc = find_in_PATH("pandoc.exe") 

125 if pandoc is None and exc: 

126 raise FileNotFoundError( 

127 "Unable to find pandoc, look into paths such " 

128 "as:" + "\n".join(tries)) 

129 return pandoc 

130 return pandoc 

131 # linux, should be in PATH. 

132 return "" 

133 

134 

135def custom_ensuredir(path): 

136 """Ensure that a path exists.""" 

137 if "IMPOSSIBLE:TOFIND" in path: 

138 return 

139 try: 

140 os.makedirs(path) 

141 except OSError as err: 

142 # 0 for Jython/Win32 

143 EEXIST = getattr(errno, 'EEXIST', 0) 

144 if err.errno not in [0, EEXIST]: 

145 raise # pragma: no cover 

146 

147 

148def find_dvipng_path(exc=True): 

149 """ 

150 Determines :epkg:`dvipng` location. 

151 

152 @return *imgmath_latex*, *imgmath_dvipng*, 

153 *imgmath_dvisvgm* 

154 """ 

155 

156 if sys.platform.startswith("win"): # pragma: no cover 

157 sep = ";" 

158 imgmath_latex = find_latex_path(exc=exc) 

159 if imgmath_latex is None: 

160 imgmath_dvipng = None 

161 else: 

162 imgmath_dvipng = os.path.join(imgmath_latex, "dvipng.exe") 

163 if imgmath_dvipng is None or not os.path.exists(imgmath_dvipng): 

164 if exc: 

165 raise FileNotFoundError(imgmath_dvipng) 

166 imgmath_dvipng = "dvipng" 

167 if imgmath_latex is None: 

168 imgmath_dvisvgm = None 

169 else: 

170 imgmath_dvisvgm = os.path.join(imgmath_latex, "dvisvgm.exe") 

171 if imgmath_dvisvgm is None or not os.path.exists(imgmath_dvisvgm): 

172 if exc: 

173 raise FileNotFoundError(imgmath_dvisvgm) 

174 imgmath_dvisvgm = "dvisvgm" 

175 

176 env_path = os.environ.get("PATH", "") 

177 if imgmath_latex and imgmath_latex not in env_path: 

178 if len(env_path) > 0: 

179 env_path += sep 

180 env_path += imgmath_latex 

181 

182 if imgmath_latex is not None and sys.platform.startswith("win"): 

183 imgmath_latex = os.path.join(imgmath_latex, "latex.exe") 

184 

185 # verification 

186 if imgmath_latex is None or not os.path.exists(imgmath_latex): 

187 if exc: 

188 raise FileNotFoundError(imgmath_latex) 

189 imgmath_latex = "latex" 

190 if imgmath_dvipng is None or not os.path.exists(imgmath_dvipng): 

191 if exc: 

192 raise FileNotFoundError(imgmath_dvipng) 

193 imgmath_dvipng = "dvipng" 

194 else: 

195 # On linux, we expect latex, dvipng, dvisvgm to be available. 

196 imgmath_latex = "latex" 

197 imgmath_dvipng = "dvipng" 

198 imgmath_dvisvgm = "dvisvgm" 

199 

200 return imgmath_latex, imgmath_dvipng, imgmath_dvisvgm