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
« 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
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
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
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``.
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"
64def find_latex_path(exc=True):
65 """
66 Finds latex path.
67 Returns an empty string on :epkg:`linux`.
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 ""
90def find_pandoc_path(exc=True):
91 """
92 Determines :epkg:`pandoc` location.
93 Returns an empty string on :epkg:`linux`.
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]
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)
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 ""
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
148def find_dvipng_path(exc=True):
149 """
150 Determines :epkg:`dvipng` location.
152 @return *imgmath_latex*, *imgmath_dvipng*,
153 *imgmath_dvisvgm*
154 """
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"
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
182 if imgmath_latex is not None and sys.platform.startswith("win"):
183 imgmath_latex = os.path.join(imgmath_latex, "latex.exe")
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"
200 return imgmath_latex, imgmath_dvipng, imgmath_dvisvgm