quarchpy 2.1.14.dev3__py2.py3-none-any.whl → 2.1.14.dev5__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (701) hide show
  1. quarchpy/.idea/.name +1 -0
  2. quarchpy/.idea/workspace.xml +70 -11
  3. quarchpy/__pycache__/_version.cpython-311.pyc +0 -0
  4. quarchpy/__pycache__/run.cpython-311.pyc +0 -0
  5. quarchpy/_version.py +1 -1
  6. quarchpy/_version.py.bak +1 -0
  7. quarchpy/connection_specific/__pycache__/connection_QIS.cpython-311.pyc +0 -0
  8. quarchpy/connection_specific/connection_QIS.py +22 -9
  9. quarchpy/connection_specific/connection_QIS.py.bak +35 -17
  10. quarchpy/connection_specific/connection_ReST.py +26 -16
  11. quarchpy/debug/__pycache__/module_debug.cpython-311.pyc +0 -0
  12. quarchpy/debug/__pycache__/simple_terminal.cpython-311.pyc +0 -0
  13. quarchpy/debug/__pycache__/upgrade_quarchpy.cpython-311.pyc +0 -0
  14. quarchpy/device/__pycache__/scanDevices.cpython-311.pyc +0 -0
  15. quarchpy/device/scanDevices.py +2 -4
  16. quarchpy/device/scanDevices.py.bak +657 -0
  17. quarchpy/qis/qisFuncs.py +25 -42
  18. quarchpy/qis/qisFuncs.py.bak +213 -0
  19. quarchpy/qps/__pycache__/qpsFuncs.cpython-311.pyc +0 -0
  20. quarchpy/qps/qpsFuncs.py +18 -22
  21. quarchpy/qps/qpsFuncs.py.bak +224 -0
  22. quarchpy/venv/.gitignore +2 -0
  23. quarchpy/venv/Include/Python-ast.h +535 -0
  24. quarchpy/venv/Include/Python.h +181 -0
  25. quarchpy/venv/Include/abstract.h +1396 -0
  26. quarchpy/venv/Include/asdl.h +45 -0
  27. quarchpy/venv/Include/ast.h +13 -0
  28. quarchpy/venv/Include/bitset.h +32 -0
  29. quarchpy/venv/Include/boolobject.h +36 -0
  30. quarchpy/venv/Include/bufferobject.h +33 -0
  31. quarchpy/venv/Include/bytearrayobject.h +57 -0
  32. quarchpy/venv/Include/bytes_methods.h +75 -0
  33. quarchpy/venv/Include/bytesobject.h +27 -0
  34. quarchpy/venv/Include/cStringIO.h +73 -0
  35. quarchpy/venv/Include/cellobject.h +28 -0
  36. quarchpy/venv/Include/ceval.h +154 -0
  37. quarchpy/venv/Include/classobject.h +83 -0
  38. quarchpy/venv/Include/cobject.h +89 -0
  39. quarchpy/venv/Include/code.h +116 -0
  40. quarchpy/venv/Include/codecs.h +212 -0
  41. quarchpy/venv/Include/compile.h +40 -0
  42. quarchpy/venv/Include/complexobject.h +66 -0
  43. quarchpy/venv/Include/datetime.h +239 -0
  44. quarchpy/venv/Include/descrobject.h +94 -0
  45. quarchpy/venv/Include/dictobject.h +160 -0
  46. quarchpy/venv/Include/dtoa.h +15 -0
  47. quarchpy/venv/Include/enumobject.h +17 -0
  48. quarchpy/venv/Include/errcode.h +37 -0
  49. quarchpy/venv/Include/eval.h +25 -0
  50. quarchpy/venv/Include/fileobject.h +97 -0
  51. quarchpy/venv/Include/floatobject.h +140 -0
  52. quarchpy/venv/Include/frameobject.h +89 -0
  53. quarchpy/venv/Include/funcobject.h +76 -0
  54. quarchpy/venv/Include/genobject.h +40 -0
  55. quarchpy/venv/Include/graminit.h +87 -0
  56. quarchpy/venv/Include/grammar.h +94 -0
  57. quarchpy/venv/Include/import.h +71 -0
  58. quarchpy/venv/Include/intobject.h +84 -0
  59. quarchpy/venv/Include/intrcheck.h +15 -0
  60. quarchpy/venv/Include/iterobject.h +23 -0
  61. quarchpy/venv/Include/listobject.h +68 -0
  62. quarchpy/venv/Include/longintrepr.h +103 -0
  63. quarchpy/venv/Include/longobject.h +135 -0
  64. quarchpy/venv/Include/marshal.h +25 -0
  65. quarchpy/venv/Include/memoryobject.h +74 -0
  66. quarchpy/venv/Include/metagrammar.h +18 -0
  67. quarchpy/venv/Include/methodobject.h +93 -0
  68. quarchpy/venv/Include/modsupport.h +134 -0
  69. quarchpy/venv/Include/moduleobject.h +24 -0
  70. quarchpy/venv/Include/node.h +41 -0
  71. quarchpy/venv/Include/object.h +1046 -0
  72. quarchpy/venv/Include/objimpl.h +369 -0
  73. quarchpy/venv/Include/opcode.h +171 -0
  74. quarchpy/venv/Include/osdefs.h +63 -0
  75. quarchpy/venv/Include/parsetok.h +64 -0
  76. quarchpy/venv/Include/patchlevel.h +43 -0
  77. quarchpy/venv/Include/pgen.h +18 -0
  78. quarchpy/venv/Include/pgenheaders.h +43 -0
  79. quarchpy/venv/Include/py_curses.h +177 -0
  80. quarchpy/venv/Include/pyarena.h +62 -0
  81. quarchpy/venv/Include/pycapsule.h +56 -0
  82. quarchpy/venv/Include/pyconfig.h +770 -0
  83. quarchpy/venv/Include/pyctype.h +31 -0
  84. quarchpy/venv/Include/pydebug.h +41 -0
  85. quarchpy/venv/Include/pyerrors.h +329 -0
  86. quarchpy/venv/Include/pyexpat.h +50 -0
  87. quarchpy/venv/Include/pyfpe.h +176 -0
  88. quarchpy/venv/Include/pygetopt.h +18 -0
  89. quarchpy/venv/Include/pymacconfig.h +102 -0
  90. quarchpy/venv/Include/pymactoolbox.h +232 -0
  91. quarchpy/venv/Include/pymath.h +214 -0
  92. quarchpy/venv/Include/pymem.h +122 -0
  93. quarchpy/venv/Include/pyport.h +950 -0
  94. quarchpy/venv/Include/pystate.h +200 -0
  95. quarchpy/venv/Include/pystrcmp.h +23 -0
  96. quarchpy/venv/Include/pystrtod.h +45 -0
  97. quarchpy/venv/Include/pythonrun.h +181 -0
  98. quarchpy/venv/Include/pythread.h +41 -0
  99. quarchpy/venv/Include/rangeobject.h +28 -0
  100. quarchpy/venv/Include/setobject.h +99 -0
  101. quarchpy/venv/Include/sliceobject.h +50 -0
  102. quarchpy/venv/Include/stringobject.h +210 -0
  103. quarchpy/venv/Include/structmember.h +99 -0
  104. quarchpy/venv/Include/structseq.h +41 -0
  105. quarchpy/venv/Include/symtable.h +98 -0
  106. quarchpy/venv/Include/sysmodule.h +31 -0
  107. quarchpy/venv/Include/timefuncs.h +26 -0
  108. quarchpy/venv/Include/token.h +85 -0
  109. quarchpy/venv/Include/traceback.h +31 -0
  110. quarchpy/venv/Include/tupleobject.h +61 -0
  111. quarchpy/venv/Include/ucnhash.h +33 -0
  112. quarchpy/venv/Include/unicodeobject.h +1413 -0
  113. quarchpy/venv/Include/warnings.h +23 -0
  114. quarchpy/venv/Include/weakrefobject.h +82 -0
  115. quarchpy/venv/Lib/os.py +742 -0
  116. quarchpy/venv/Lib/os.pyc +0 -0
  117. quarchpy/venv/Lib/site-packages/_virtualenv.pth +1 -0
  118. quarchpy/venv/Lib/site-packages/_virtualenv.py +130 -0
  119. quarchpy/venv/Lib/site-packages/_virtualenv.pyc +0 -0
  120. quarchpy/venv/Lib/site-packages/easy_install.py +5 -0
  121. quarchpy/venv/Lib/site-packages/pip/__init__.py +18 -0
  122. quarchpy/venv/Lib/site-packages/pip/__main__.py +26 -0
  123. quarchpy/venv/Lib/site-packages/pip/_internal/__init__.py +17 -0
  124. quarchpy/venv/Lib/site-packages/pip/_internal/build_env.py +242 -0
  125. quarchpy/venv/Lib/site-packages/pip/_internal/cache.py +346 -0
  126. quarchpy/venv/Lib/site-packages/pip/_internal/cli/__init__.py +4 -0
  127. quarchpy/venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +164 -0
  128. quarchpy/venv/Lib/site-packages/pip/_internal/cli/base_command.py +260 -0
  129. quarchpy/venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +971 -0
  130. quarchpy/venv/Lib/site-packages/pip/_internal/cli/command_context.py +36 -0
  131. quarchpy/venv/Lib/site-packages/pip/_internal/cli/main.py +75 -0
  132. quarchpy/venv/Lib/site-packages/pip/_internal/cli/main_parser.py +96 -0
  133. quarchpy/venv/Lib/site-packages/pip/_internal/cli/parser.py +285 -0
  134. quarchpy/venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +280 -0
  135. quarchpy/venv/Lib/site-packages/pip/_internal/cli/req_command.py +436 -0
  136. quarchpy/venv/Lib/site-packages/pip/_internal/cli/spinners.py +173 -0
  137. quarchpy/venv/Lib/site-packages/pip/_internal/cli/status_codes.py +8 -0
  138. quarchpy/venv/Lib/site-packages/pip/_internal/commands/__init__.py +123 -0
  139. quarchpy/venv/Lib/site-packages/pip/_internal/commands/cache.py +234 -0
  140. quarchpy/venv/Lib/site-packages/pip/_internal/commands/check.py +51 -0
  141. quarchpy/venv/Lib/site-packages/pip/_internal/commands/completion.py +98 -0
  142. quarchpy/venv/Lib/site-packages/pip/_internal/commands/configuration.py +280 -0
  143. quarchpy/venv/Lib/site-packages/pip/_internal/commands/debug.py +230 -0
  144. quarchpy/venv/Lib/site-packages/pip/_internal/commands/download.py +143 -0
  145. quarchpy/venv/Lib/site-packages/pip/_internal/commands/freeze.py +116 -0
  146. quarchpy/venv/Lib/site-packages/pip/_internal/commands/hash.py +63 -0
  147. quarchpy/venv/Lib/site-packages/pip/_internal/commands/help.py +46 -0
  148. quarchpy/venv/Lib/site-packages/pip/_internal/commands/install.py +737 -0
  149. quarchpy/venv/Lib/site-packages/pip/_internal/commands/list.py +327 -0
  150. quarchpy/venv/Lib/site-packages/pip/_internal/commands/search.py +169 -0
  151. quarchpy/venv/Lib/site-packages/pip/_internal/commands/show.py +186 -0
  152. quarchpy/venv/Lib/site-packages/pip/_internal/commands/uninstall.py +95 -0
  153. quarchpy/venv/Lib/site-packages/pip/_internal/commands/wheel.py +198 -0
  154. quarchpy/venv/Lib/site-packages/pip/_internal/configuration.py +407 -0
  155. quarchpy/venv/Lib/site-packages/pip/_internal/distributions/__init__.py +24 -0
  156. quarchpy/venv/Lib/site-packages/pip/_internal/distributions/base.py +46 -0
  157. quarchpy/venv/Lib/site-packages/pip/_internal/distributions/installed.py +25 -0
  158. quarchpy/venv/Lib/site-packages/pip/_internal/distributions/sdist.py +105 -0
  159. quarchpy/venv/Lib/site-packages/pip/_internal/distributions/wheel.py +37 -0
  160. quarchpy/venv/Lib/site-packages/pip/_internal/exceptions.py +391 -0
  161. quarchpy/venv/Lib/site-packages/pip/_internal/index/__init__.py +2 -0
  162. quarchpy/venv/Lib/site-packages/pip/_internal/index/collector.py +667 -0
  163. quarchpy/venv/Lib/site-packages/pip/_internal/index/package_finder.py +1015 -0
  164. quarchpy/venv/Lib/site-packages/pip/_internal/locations.py +193 -0
  165. quarchpy/venv/Lib/site-packages/pip/_internal/main.py +16 -0
  166. quarchpy/venv/Lib/site-packages/pip/_internal/models/__init__.py +2 -0
  167. quarchpy/venv/Lib/site-packages/pip/_internal/models/candidate.py +39 -0
  168. quarchpy/venv/Lib/site-packages/pip/_internal/models/direct_url.py +243 -0
  169. quarchpy/venv/Lib/site-packages/pip/_internal/models/format_control.py +92 -0
  170. quarchpy/venv/Lib/site-packages/pip/_internal/models/index.py +34 -0
  171. quarchpy/venv/Lib/site-packages/pip/_internal/models/link.py +246 -0
  172. quarchpy/venv/Lib/site-packages/pip/_internal/models/scheme.py +31 -0
  173. quarchpy/venv/Lib/site-packages/pip/_internal/models/search_scope.py +135 -0
  174. quarchpy/venv/Lib/site-packages/pip/_internal/models/selection_prefs.py +50 -0
  175. quarchpy/venv/Lib/site-packages/pip/_internal/models/target_python.py +117 -0
  176. quarchpy/venv/Lib/site-packages/pip/_internal/models/wheel.py +78 -0
  177. quarchpy/venv/Lib/site-packages/pip/_internal/network/__init__.py +2 -0
  178. quarchpy/venv/Lib/site-packages/pip/_internal/network/auth.py +310 -0
  179. quarchpy/venv/Lib/site-packages/pip/_internal/network/cache.py +79 -0
  180. quarchpy/venv/Lib/site-packages/pip/_internal/network/download.py +202 -0
  181. quarchpy/venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py +231 -0
  182. quarchpy/venv/Lib/site-packages/pip/_internal/network/session.py +428 -0
  183. quarchpy/venv/Lib/site-packages/pip/_internal/network/utils.py +97 -0
  184. quarchpy/venv/Lib/site-packages/pip/_internal/network/xmlrpc.py +53 -0
  185. quarchpy/venv/Lib/site-packages/pip/_internal/operations/__init__.py +0 -0
  186. quarchpy/venv/Lib/site-packages/pip/_internal/operations/build/__init__.py +0 -0
  187. quarchpy/venv/Lib/site-packages/pip/_internal/operations/build/metadata.py +38 -0
  188. quarchpy/venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py +77 -0
  189. quarchpy/venv/Lib/site-packages/pip/_internal/operations/build/wheel.py +47 -0
  190. quarchpy/venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py +113 -0
  191. quarchpy/venv/Lib/site-packages/pip/_internal/operations/check.py +155 -0
  192. quarchpy/venv/Lib/site-packages/pip/_internal/operations/freeze.py +277 -0
  193. quarchpy/venv/Lib/site-packages/pip/_internal/operations/install/__init__.py +2 -0
  194. quarchpy/venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py +52 -0
  195. quarchpy/venv/Lib/site-packages/pip/_internal/operations/install/legacy.py +130 -0
  196. quarchpy/venv/Lib/site-packages/pip/_internal/operations/install/wheel.py +846 -0
  197. quarchpy/venv/Lib/site-packages/pip/_internal/operations/prepare.py +608 -0
  198. quarchpy/venv/Lib/site-packages/pip/_internal/pyproject.py +196 -0
  199. quarchpy/venv/Lib/site-packages/pip/_internal/req/__init__.py +103 -0
  200. quarchpy/venv/Lib/site-packages/pip/_internal/req/constructors.py +476 -0
  201. quarchpy/venv/Lib/site-packages/pip/_internal/req/req_file.py +574 -0
  202. quarchpy/venv/Lib/site-packages/pip/_internal/req/req_install.py +907 -0
  203. quarchpy/venv/Lib/site-packages/pip/_internal/req/req_set.py +204 -0
  204. quarchpy/venv/Lib/site-packages/pip/_internal/req/req_tracker.py +151 -0
  205. quarchpy/venv/Lib/site-packages/pip/_internal/req/req_uninstall.py +657 -0
  206. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/__init__.py +0 -0
  207. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/base.py +21 -0
  208. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py +0 -0
  209. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py +473 -0
  210. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py +0 -0
  211. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py +156 -0
  212. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +604 -0
  213. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +504 -0
  214. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +101 -0
  215. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py +174 -0
  216. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py +84 -0
  217. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py +201 -0
  218. quarchpy/venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +296 -0
  219. quarchpy/venv/Lib/site-packages/pip/_internal/self_outdated_check.py +197 -0
  220. quarchpy/venv/Lib/site-packages/pip/_internal/utils/__init__.py +0 -0
  221. quarchpy/venv/Lib/site-packages/pip/_internal/utils/appdirs.py +44 -0
  222. quarchpy/venv/Lib/site-packages/pip/_internal/utils/compat.py +293 -0
  223. quarchpy/venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py +178 -0
  224. quarchpy/venv/Lib/site-packages/pip/_internal/utils/datetime.py +14 -0
  225. quarchpy/venv/Lib/site-packages/pip/_internal/utils/deprecation.py +104 -0
  226. quarchpy/venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py +126 -0
  227. quarchpy/venv/Lib/site-packages/pip/_internal/utils/distutils_args.py +48 -0
  228. quarchpy/venv/Lib/site-packages/pip/_internal/utils/encoding.py +41 -0
  229. quarchpy/venv/Lib/site-packages/pip/_internal/utils/entrypoints.py +31 -0
  230. quarchpy/venv/Lib/site-packages/pip/_internal/utils/filesystem.py +224 -0
  231. quarchpy/venv/Lib/site-packages/pip/_internal/utils/filetypes.py +26 -0
  232. quarchpy/venv/Lib/site-packages/pip/_internal/utils/glibc.py +98 -0
  233. quarchpy/venv/Lib/site-packages/pip/_internal/utils/hashes.py +169 -0
  234. quarchpy/venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py +36 -0
  235. quarchpy/venv/Lib/site-packages/pip/_internal/utils/logging.py +399 -0
  236. quarchpy/venv/Lib/site-packages/pip/_internal/utils/misc.py +962 -0
  237. quarchpy/venv/Lib/site-packages/pip/_internal/utils/models.py +44 -0
  238. quarchpy/venv/Lib/site-packages/pip/_internal/utils/packaging.py +95 -0
  239. quarchpy/venv/Lib/site-packages/pip/_internal/utils/parallel.py +107 -0
  240. quarchpy/venv/Lib/site-packages/pip/_internal/utils/pkg_resources.py +44 -0
  241. quarchpy/venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py +181 -0
  242. quarchpy/venv/Lib/site-packages/pip/_internal/utils/subprocess.py +299 -0
  243. quarchpy/venv/Lib/site-packages/pip/_internal/utils/temp_dir.py +284 -0
  244. quarchpy/venv/Lib/site-packages/pip/_internal/utils/typing.py +38 -0
  245. quarchpy/venv/Lib/site-packages/pip/_internal/utils/unpacking.py +281 -0
  246. quarchpy/venv/Lib/site-packages/pip/_internal/utils/urls.py +55 -0
  247. quarchpy/venv/Lib/site-packages/pip/_internal/utils/virtualenv.py +119 -0
  248. quarchpy/venv/Lib/site-packages/pip/_internal/utils/wheel.py +225 -0
  249. quarchpy/venv/Lib/site-packages/pip/_internal/vcs/__init__.py +15 -0
  250. quarchpy/venv/Lib/site-packages/pip/_internal/vcs/bazaar.py +123 -0
  251. quarchpy/venv/Lib/site-packages/pip/_internal/vcs/git.py +454 -0
  252. quarchpy/venv/Lib/site-packages/pip/_internal/vcs/mercurial.py +172 -0
  253. quarchpy/venv/Lib/site-packages/pip/_internal/vcs/subversion.py +340 -0
  254. quarchpy/venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py +735 -0
  255. quarchpy/venv/Lib/site-packages/pip/_internal/wheel_builder.py +362 -0
  256. quarchpy/venv/Lib/site-packages/pip/_vendor/__init__.py +114 -0
  257. quarchpy/venv/Lib/site-packages/pip/_vendor/appdirs.py +633 -0
  258. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py +11 -0
  259. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py +57 -0
  260. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py +133 -0
  261. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py +39 -0
  262. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +2 -0
  263. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +146 -0
  264. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +33 -0
  265. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py +29 -0
  266. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py +376 -0
  267. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py +80 -0
  268. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py +135 -0
  269. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py +188 -0
  270. quarchpy/venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py +29 -0
  271. quarchpy/venv/Lib/site-packages/pip/_vendor/certifi/__init__.py +3 -0
  272. quarchpy/venv/Lib/site-packages/pip/_vendor/certifi/__main__.py +12 -0
  273. quarchpy/venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem +4606 -0
  274. quarchpy/venv/Lib/site-packages/pip/_vendor/certifi/core.py +60 -0
  275. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/__init__.py +39 -0
  276. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/big5freq.py +386 -0
  277. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/big5prober.py +47 -0
  278. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/chardistribution.py +233 -0
  279. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py +106 -0
  280. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/charsetprober.py +145 -0
  281. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py +1 -0
  282. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py +85 -0
  283. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py +88 -0
  284. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/compat.py +34 -0
  285. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/cp949prober.py +49 -0
  286. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/enums.py +76 -0
  287. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/escprober.py +101 -0
  288. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/escsm.py +246 -0
  289. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py +92 -0
  290. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py +195 -0
  291. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/euckrprober.py +47 -0
  292. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py +387 -0
  293. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/euctwprober.py +46 -0
  294. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py +283 -0
  295. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py +46 -0
  296. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py +292 -0
  297. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/jisfreq.py +325 -0
  298. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/jpcntx.py +233 -0
  299. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py +228 -0
  300. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langcyrillicmodel.py +333 -0
  301. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py +225 -0
  302. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py +200 -0
  303. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py +225 -0
  304. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py +199 -0
  305. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py +193 -0
  306. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/latin1prober.py +145 -0
  307. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py +91 -0
  308. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py +54 -0
  309. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/mbcssm.py +572 -0
  310. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py +132 -0
  311. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py +73 -0
  312. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/sjisprober.py +92 -0
  313. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/universaldetector.py +286 -0
  314. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/utf8prober.py +82 -0
  315. quarchpy/venv/Lib/site-packages/pip/_vendor/chardet/version.py +9 -0
  316. quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/__init__.py +6 -0
  317. quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/ansi.py +102 -0
  318. quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py +258 -0
  319. quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/initialise.py +80 -0
  320. quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/win32.py +152 -0
  321. quarchpy/venv/Lib/site-packages/pip/_vendor/colorama/winterm.py +169 -0
  322. quarchpy/venv/Lib/site-packages/pip/_vendor/contextlib2.py +518 -0
  323. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/__init__.py +23 -0
  324. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py +6 -0
  325. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py +41 -0
  326. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py +764 -0
  327. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg +84 -0
  328. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py +786 -0
  329. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py +2607 -0
  330. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/compat.py +1120 -0
  331. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/database.py +1339 -0
  332. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/index.py +516 -0
  333. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/locators.py +1302 -0
  334. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/manifest.py +393 -0
  335. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/markers.py +131 -0
  336. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/metadata.py +1056 -0
  337. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/resources.py +355 -0
  338. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/scripts.py +419 -0
  339. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/t32.exe +0 -0
  340. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/t64.exe +0 -0
  341. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/util.py +1761 -0
  342. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/version.py +736 -0
  343. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/w32.exe +0 -0
  344. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/w64.exe +0 -0
  345. quarchpy/venv/Lib/site-packages/pip/_vendor/distlib/wheel.py +1018 -0
  346. quarchpy/venv/Lib/site-packages/pip/_vendor/distro.py +1230 -0
  347. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/__init__.py +35 -0
  348. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py +289 -0
  349. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py +918 -0
  350. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py +1735 -0
  351. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py +5 -0
  352. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py +40 -0
  353. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py +67 -0
  354. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/_utils.py +159 -0
  355. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/constants.py +2946 -0
  356. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py +0 -0
  357. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py +29 -0
  358. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/base.py +12 -0
  359. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py +73 -0
  360. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py +93 -0
  361. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py +207 -0
  362. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py +916 -0
  363. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py +38 -0
  364. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/html5parser.py +2795 -0
  365. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/serializer.py +409 -0
  366. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py +30 -0
  367. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py +54 -0
  368. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py +50 -0
  369. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py +88 -0
  370. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py +417 -0
  371. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py +239 -0
  372. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py +343 -0
  373. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py +392 -0
  374. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py +154 -0
  375. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py +252 -0
  376. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py +43 -0
  377. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py +131 -0
  378. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py +215 -0
  379. quarchpy/venv/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py +69 -0
  380. quarchpy/venv/Lib/site-packages/pip/_vendor/idna/__init__.py +2 -0
  381. quarchpy/venv/Lib/site-packages/pip/_vendor/idna/codec.py +118 -0
  382. quarchpy/venv/Lib/site-packages/pip/_vendor/idna/compat.py +12 -0
  383. quarchpy/venv/Lib/site-packages/pip/_vendor/idna/core.py +400 -0
  384. quarchpy/venv/Lib/site-packages/pip/_vendor/idna/idnadata.py +2050 -0
  385. quarchpy/venv/Lib/site-packages/pip/_vendor/idna/intranges.py +53 -0
  386. quarchpy/venv/Lib/site-packages/pip/_vendor/idna/package_data.py +2 -0
  387. quarchpy/venv/Lib/site-packages/pip/_vendor/idna/uts46data.py +8357 -0
  388. quarchpy/venv/Lib/site-packages/pip/_vendor/ipaddress.py +2420 -0
  389. quarchpy/venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py +54 -0
  390. quarchpy/venv/Lib/site-packages/pip/_vendor/msgpack/_version.py +1 -0
  391. quarchpy/venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py +48 -0
  392. quarchpy/venv/Lib/site-packages/pip/_vendor/msgpack/ext.py +191 -0
  393. quarchpy/venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py +1063 -0
  394. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/__about__.py +27 -0
  395. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/__init__.py +26 -0
  396. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/_compat.py +38 -0
  397. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/_structures.py +86 -0
  398. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/_typing.py +48 -0
  399. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/markers.py +328 -0
  400. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/requirements.py +151 -0
  401. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py +864 -0
  402. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/tags.py +852 -0
  403. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/utils.py +67 -0
  404. quarchpy/venv/Lib/site-packages/pip/_vendor/packaging/version.py +556 -0
  405. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/__init__.py +6 -0
  406. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/_in_process.py +280 -0
  407. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/build.py +124 -0
  408. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/check.py +203 -0
  409. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/colorlog.py +115 -0
  410. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/compat.py +34 -0
  411. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/dirtools.py +44 -0
  412. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/envbuild.py +167 -0
  413. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/meta.py +92 -0
  414. quarchpy/venv/Lib/site-packages/pip/_vendor/pep517/wrappers.py +327 -0
  415. quarchpy/venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py +3296 -0
  416. quarchpy/venv/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py +23 -0
  417. quarchpy/venv/Lib/site-packages/pip/_vendor/progress/__init__.py +177 -0
  418. quarchpy/venv/Lib/site-packages/pip/_vendor/progress/bar.py +91 -0
  419. quarchpy/venv/Lib/site-packages/pip/_vendor/progress/counter.py +41 -0
  420. quarchpy/venv/Lib/site-packages/pip/_vendor/progress/spinner.py +43 -0
  421. quarchpy/venv/Lib/site-packages/pip/_vendor/pyparsing.py +7107 -0
  422. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/__init__.py +144 -0
  423. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/__version__.py +14 -0
  424. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py +42 -0
  425. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/adapters.py +533 -0
  426. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/api.py +161 -0
  427. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/auth.py +305 -0
  428. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/certs.py +18 -0
  429. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/compat.py +76 -0
  430. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/cookies.py +549 -0
  431. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/exceptions.py +123 -0
  432. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/help.py +119 -0
  433. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/hooks.py +34 -0
  434. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/models.py +956 -0
  435. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/packages.py +16 -0
  436. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/sessions.py +781 -0
  437. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/status_codes.py +123 -0
  438. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/structures.py +105 -0
  439. quarchpy/venv/Lib/site-packages/pip/_vendor/requests/utils.py +988 -0
  440. quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py +26 -0
  441. quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py +0 -0
  442. quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py +6 -0
  443. quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py +119 -0
  444. quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py +37 -0
  445. quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py +454 -0
  446. quarchpy/venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py +149 -0
  447. quarchpy/venv/Lib/site-packages/pip/_vendor/retrying.py +267 -0
  448. quarchpy/venv/Lib/site-packages/pip/_vendor/six.py +982 -0
  449. quarchpy/venv/Lib/site-packages/pip/_vendor/toml/__init__.py +25 -0
  450. quarchpy/venv/Lib/site-packages/pip/_vendor/toml/decoder.py +1057 -0
  451. quarchpy/venv/Lib/site-packages/pip/_vendor/toml/encoder.py +304 -0
  452. quarchpy/venv/Lib/site-packages/pip/_vendor/toml/ordered.py +15 -0
  453. quarchpy/venv/Lib/site-packages/pip/_vendor/toml/tz.py +24 -0
  454. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py +85 -0
  455. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py +337 -0
  456. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/_version.py +2 -0
  457. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/connection.py +535 -0
  458. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py +1067 -0
  459. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py +0 -0
  460. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py +36 -0
  461. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +0 -0
  462. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +519 -0
  463. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +396 -0
  464. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py +314 -0
  465. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +121 -0
  466. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +509 -0
  467. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +920 -0
  468. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py +216 -0
  469. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py +313 -0
  470. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/fields.py +274 -0
  471. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py +98 -0
  472. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py +5 -0
  473. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py +0 -0
  474. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +51 -0
  475. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py +1021 -0
  476. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/__init__.py +22 -0
  477. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/packages/ssl_match_hostname/_implementation.py +160 -0
  478. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py +536 -0
  479. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/request.py +170 -0
  480. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/response.py +821 -0
  481. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py +49 -0
  482. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py +150 -0
  483. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py +56 -0
  484. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py +22 -0
  485. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py +143 -0
  486. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py +107 -0
  487. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py +601 -0
  488. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py +474 -0
  489. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py +221 -0
  490. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py +268 -0
  491. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py +430 -0
  492. quarchpy/venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py +153 -0
  493. quarchpy/venv/Lib/site-packages/pip/_vendor/vendor.txt +24 -0
  494. quarchpy/venv/Lib/site-packages/pip/_vendor/webencodings/__init__.py +342 -0
  495. quarchpy/venv/Lib/site-packages/pip/_vendor/webencodings/labels.py +231 -0
  496. quarchpy/venv/Lib/site-packages/pip/_vendor/webencodings/mklabels.py +59 -0
  497. quarchpy/venv/Lib/site-packages/pip/_vendor/webencodings/tests.py +153 -0
  498. quarchpy/venv/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py +325 -0
  499. quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/INSTALLER +1 -0
  500. quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/LICENSE.txt +20 -0
  501. quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/METADATA +94 -0
  502. quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/RECORD +812 -0
  503. quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/WHEEL +6 -0
  504. quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/entry_points.txt +5 -0
  505. quarchpy/venv/Lib/site-packages/pip-20.3.4.dist-info/top_level.txt +1 -0
  506. quarchpy/venv/Lib/site-packages/pip-20.3.4.virtualenv +0 -0
  507. quarchpy/venv/Lib/site-packages/pkg_resources/__init__.py +3296 -0
  508. quarchpy/venv/Lib/site-packages/pkg_resources/__init__.pyc +0 -0
  509. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/__init__.py +0 -0
  510. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/__init__.pyc +0 -0
  511. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/appdirs.py +608 -0
  512. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/appdirs.pyc +0 -0
  513. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py +21 -0
  514. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.pyc +0 -0
  515. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py +14 -0
  516. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.pyc +0 -0
  517. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py +30 -0
  518. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.pyc +0 -0
  519. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py +68 -0
  520. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.pyc +0 -0
  521. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py +301 -0
  522. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/markers.pyc +0 -0
  523. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py +127 -0
  524. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.pyc +0 -0
  525. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py +774 -0
  526. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.pyc +0 -0
  527. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py +14 -0
  528. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.py +393 -0
  529. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/packaging/version.pyc +0 -0
  530. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing.py +5742 -0
  531. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/pyparsing.pyc +0 -0
  532. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/six.py +868 -0
  533. quarchpy/venv/Lib/site-packages/pkg_resources/_vendor/six.pyc +0 -0
  534. quarchpy/venv/Lib/site-packages/pkg_resources/extern/__init__.py +73 -0
  535. quarchpy/venv/Lib/site-packages/pkg_resources/extern/__init__.pyc +0 -0
  536. quarchpy/venv/Lib/site-packages/pkg_resources/py31compat.py +23 -0
  537. quarchpy/venv/Lib/site-packages/pkg_resources/py31compat.pyc +0 -0
  538. quarchpy/venv/Lib/site-packages/setuptools/__init__.py +245 -0
  539. quarchpy/venv/Lib/site-packages/setuptools/_deprecation_warning.py +7 -0
  540. quarchpy/venv/Lib/site-packages/setuptools/_imp.py +73 -0
  541. quarchpy/venv/Lib/site-packages/setuptools/_vendor/__init__.py +0 -0
  542. quarchpy/venv/Lib/site-packages/setuptools/_vendor/ordered_set.py +488 -0
  543. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/__about__.py +27 -0
  544. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/__init__.py +26 -0
  545. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/_compat.py +31 -0
  546. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/_structures.py +68 -0
  547. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/markers.py +296 -0
  548. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/requirements.py +138 -0
  549. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py +749 -0
  550. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/tags.py +404 -0
  551. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/utils.py +57 -0
  552. quarchpy/venv/Lib/site-packages/setuptools/_vendor/packaging/version.py +420 -0
  553. quarchpy/venv/Lib/site-packages/setuptools/_vendor/pyparsing.py +5742 -0
  554. quarchpy/venv/Lib/site-packages/setuptools/_vendor/six.py +868 -0
  555. quarchpy/venv/Lib/site-packages/setuptools/archive_util.py +173 -0
  556. quarchpy/venv/Lib/site-packages/setuptools/build_meta.py +264 -0
  557. quarchpy/venv/Lib/site-packages/setuptools/cli-32.exe +0 -0
  558. quarchpy/venv/Lib/site-packages/setuptools/cli-64.exe +0 -0
  559. quarchpy/venv/Lib/site-packages/setuptools/cli.exe +0 -0
  560. quarchpy/venv/Lib/site-packages/setuptools/command/__init__.py +17 -0
  561. quarchpy/venv/Lib/site-packages/setuptools/command/alias.py +80 -0
  562. quarchpy/venv/Lib/site-packages/setuptools/command/bdist_egg.py +502 -0
  563. quarchpy/venv/Lib/site-packages/setuptools/command/bdist_rpm.py +43 -0
  564. quarchpy/venv/Lib/site-packages/setuptools/command/bdist_wininst.py +21 -0
  565. quarchpy/venv/Lib/site-packages/setuptools/command/build_clib.py +98 -0
  566. quarchpy/venv/Lib/site-packages/setuptools/command/build_ext.py +327 -0
  567. quarchpy/venv/Lib/site-packages/setuptools/command/build_py.py +270 -0
  568. quarchpy/venv/Lib/site-packages/setuptools/command/develop.py +221 -0
  569. quarchpy/venv/Lib/site-packages/setuptools/command/dist_info.py +36 -0
  570. quarchpy/venv/Lib/site-packages/setuptools/command/easy_install.py +2347 -0
  571. quarchpy/venv/Lib/site-packages/setuptools/command/egg_info.py +717 -0
  572. quarchpy/venv/Lib/site-packages/setuptools/command/install.py +125 -0
  573. quarchpy/venv/Lib/site-packages/setuptools/command/install_egg_info.py +62 -0
  574. quarchpy/venv/Lib/site-packages/setuptools/command/install_lib.py +121 -0
  575. quarchpy/venv/Lib/site-packages/setuptools/command/install_scripts.py +65 -0
  576. quarchpy/venv/Lib/site-packages/setuptools/command/launcher manifest.xml +15 -0
  577. quarchpy/venv/Lib/site-packages/setuptools/command/py36compat.py +136 -0
  578. quarchpy/venv/Lib/site-packages/setuptools/command/register.py +18 -0
  579. quarchpy/venv/Lib/site-packages/setuptools/command/rotate.py +66 -0
  580. quarchpy/venv/Lib/site-packages/setuptools/command/saveopts.py +22 -0
  581. quarchpy/venv/Lib/site-packages/setuptools/command/sdist.py +252 -0
  582. quarchpy/venv/Lib/site-packages/setuptools/command/setopt.py +149 -0
  583. quarchpy/venv/Lib/site-packages/setuptools/command/test.py +279 -0
  584. quarchpy/venv/Lib/site-packages/setuptools/command/upload.py +17 -0
  585. quarchpy/venv/Lib/site-packages/setuptools/command/upload_docs.py +206 -0
  586. quarchpy/venv/Lib/site-packages/setuptools/config.py +659 -0
  587. quarchpy/venv/Lib/site-packages/setuptools/dep_util.py +23 -0
  588. quarchpy/venv/Lib/site-packages/setuptools/depends.py +176 -0
  589. quarchpy/venv/Lib/site-packages/setuptools/dist.py +1274 -0
  590. quarchpy/venv/Lib/site-packages/setuptools/errors.py +16 -0
  591. quarchpy/venv/Lib/site-packages/setuptools/extension.py +57 -0
  592. quarchpy/venv/Lib/site-packages/setuptools/extern/__init__.py +73 -0
  593. quarchpy/venv/Lib/site-packages/setuptools/glob.py +174 -0
  594. quarchpy/venv/Lib/site-packages/setuptools/gui-32.exe +0 -0
  595. quarchpy/venv/Lib/site-packages/setuptools/gui-64.exe +0 -0
  596. quarchpy/venv/Lib/site-packages/setuptools/gui.exe +0 -0
  597. quarchpy/venv/Lib/site-packages/setuptools/installer.py +150 -0
  598. quarchpy/venv/Lib/site-packages/setuptools/launch.py +35 -0
  599. quarchpy/venv/Lib/site-packages/setuptools/lib2to3_ex.py +62 -0
  600. quarchpy/venv/Lib/site-packages/setuptools/monkey.py +179 -0
  601. quarchpy/venv/Lib/site-packages/setuptools/msvc.py +1679 -0
  602. quarchpy/venv/Lib/site-packages/setuptools/namespaces.py +107 -0
  603. quarchpy/venv/Lib/site-packages/setuptools/package_index.py +1136 -0
  604. quarchpy/venv/Lib/site-packages/setuptools/py27compat.py +60 -0
  605. quarchpy/venv/Lib/site-packages/setuptools/py31compat.py +32 -0
  606. quarchpy/venv/Lib/site-packages/setuptools/py33compat.py +59 -0
  607. quarchpy/venv/Lib/site-packages/setuptools/py34compat.py +13 -0
  608. quarchpy/venv/Lib/site-packages/setuptools/sandbox.py +491 -0
  609. quarchpy/venv/Lib/site-packages/setuptools/script (dev).tmpl +6 -0
  610. quarchpy/venv/Lib/site-packages/setuptools/script.tmpl +3 -0
  611. quarchpy/venv/Lib/site-packages/setuptools/site-patch.py +74 -0
  612. quarchpy/venv/Lib/site-packages/setuptools/ssl_support.py +260 -0
  613. quarchpy/venv/Lib/site-packages/setuptools/unicode_utils.py +44 -0
  614. quarchpy/venv/Lib/site-packages/setuptools/version.py +6 -0
  615. quarchpy/venv/Lib/site-packages/setuptools/wheel.py +220 -0
  616. quarchpy/venv/Lib/site-packages/setuptools/windows_support.py +29 -0
  617. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/INSTALLER +1 -0
  618. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/LICENSE +19 -0
  619. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/METADATA +86 -0
  620. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/RECORD +207 -0
  621. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/WHEEL +6 -0
  622. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/dependency_links.txt +2 -0
  623. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/entry_points.txt +69 -0
  624. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/top_level.txt +3 -0
  625. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.dist-info/zip-safe +1 -0
  626. quarchpy/venv/Lib/site-packages/setuptools-44.1.1.virtualenv +0 -0
  627. quarchpy/venv/Lib/site-packages/wheel/__init__.py +1 -0
  628. quarchpy/venv/Lib/site-packages/wheel/__main__.py +19 -0
  629. quarchpy/venv/Lib/site-packages/wheel/bdist_wheel.py +492 -0
  630. quarchpy/venv/Lib/site-packages/wheel/cli/__init__.py +88 -0
  631. quarchpy/venv/Lib/site-packages/wheel/cli/convert.py +269 -0
  632. quarchpy/venv/Lib/site-packages/wheel/cli/pack.py +82 -0
  633. quarchpy/venv/Lib/site-packages/wheel/cli/unpack.py +25 -0
  634. quarchpy/venv/Lib/site-packages/wheel/macosx_libfile.py +428 -0
  635. quarchpy/venv/Lib/site-packages/wheel/metadata.py +133 -0
  636. quarchpy/venv/Lib/site-packages/wheel/pkginfo.py +43 -0
  637. quarchpy/venv/Lib/site-packages/wheel/util.py +46 -0
  638. quarchpy/venv/Lib/site-packages/wheel/vendored/__init__.py +0 -0
  639. quarchpy/venv/Lib/site-packages/wheel/vendored/packaging/__init__.py +0 -0
  640. quarchpy/venv/Lib/site-packages/wheel/vendored/packaging/_typing.py +48 -0
  641. quarchpy/venv/Lib/site-packages/wheel/vendored/packaging/tags.py +866 -0
  642. quarchpy/venv/Lib/site-packages/wheel/wheelfile.py +181 -0
  643. quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/INSTALLER +1 -0
  644. quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/LICENSE.txt +22 -0
  645. quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/METADATA +69 -0
  646. quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/RECORD +49 -0
  647. quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/WHEEL +6 -0
  648. quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/entry_points.txt +6 -0
  649. quarchpy/venv/Lib/site-packages/wheel-0.37.1.dist-info/top_level.txt +1 -0
  650. quarchpy/venv/Lib/site-packages/wheel-0.37.1.virtualenv +0 -0
  651. quarchpy/venv/Lib/site.py +190 -0
  652. quarchpy/venv/Lib/site.pyc +0 -0
  653. quarchpy/venv/Scripts/activate +83 -0
  654. quarchpy/venv/Scripts/activate.bat +39 -0
  655. quarchpy/venv/Scripts/activate.fish +100 -0
  656. quarchpy/venv/Scripts/activate.nu +41 -0
  657. quarchpy/venv/Scripts/activate.ps1 +60 -0
  658. quarchpy/venv/Scripts/activate_this.py +32 -0
  659. quarchpy/venv/Scripts/deactivate.bat +19 -0
  660. quarchpy/venv/Scripts/deactivate.nu +11 -0
  661. quarchpy/venv/Scripts/easy_install-2.7.exe +0 -0
  662. quarchpy/venv/Scripts/easy_install.exe +0 -0
  663. quarchpy/venv/Scripts/easy_install2.7.exe +0 -0
  664. quarchpy/venv/Scripts/easy_install2.exe +0 -0
  665. quarchpy/venv/Scripts/pip-2.7.exe +0 -0
  666. quarchpy/venv/Scripts/pip.exe +0 -0
  667. quarchpy/venv/Scripts/pip2.7.exe +0 -0
  668. quarchpy/venv/Scripts/pip2.exe +0 -0
  669. quarchpy/venv/Scripts/pydoc.bat +1 -0
  670. quarchpy/venv/Scripts/python.exe +0 -0
  671. quarchpy/venv/Scripts/python27.dll +0 -0
  672. quarchpy/venv/Scripts/pythonw.exe +0 -0
  673. quarchpy/venv/Scripts/wheel-2.7.exe +0 -0
  674. quarchpy/venv/Scripts/wheel.exe +0 -0
  675. quarchpy/venv/Scripts/wheel2.7.exe +0 -0
  676. quarchpy/venv/Scripts/wheel2.exe +0 -0
  677. quarchpy/venv/libs/_bsddb.lib +0 -0
  678. quarchpy/venv/libs/_ctypes.lib +0 -0
  679. quarchpy/venv/libs/_ctypes_test.lib +0 -0
  680. quarchpy/venv/libs/_elementtree.lib +0 -0
  681. quarchpy/venv/libs/_hashlib.lib +0 -0
  682. quarchpy/venv/libs/_msi.lib +0 -0
  683. quarchpy/venv/libs/_multiprocessing.lib +0 -0
  684. quarchpy/venv/libs/_socket.lib +0 -0
  685. quarchpy/venv/libs/_sqlite3.lib +0 -0
  686. quarchpy/venv/libs/_ssl.lib +0 -0
  687. quarchpy/venv/libs/_testcapi.lib +0 -0
  688. quarchpy/venv/libs/_tkinter.lib +0 -0
  689. quarchpy/venv/libs/bz2.lib +0 -0
  690. quarchpy/venv/libs/libpython27.a +0 -0
  691. quarchpy/venv/libs/pyexpat.lib +0 -0
  692. quarchpy/venv/libs/python27.lib +0 -0
  693. quarchpy/venv/libs/select.lib +0 -0
  694. quarchpy/venv/libs/unicodedata.lib +0 -0
  695. quarchpy/venv/libs/winsound.lib +0 -0
  696. quarchpy/venv/pyvenv.cfg +8 -0
  697. {quarchpy-2.1.14.dev3.dist-info → quarchpy-2.1.14.dev5.dist-info}/METADATA +1 -1
  698. quarchpy-2.1.14.dev5.dist-info/RECORD +1219 -0
  699. quarchpy-2.1.14.dev3.dist-info/RECORD +0 -535
  700. {quarchpy-2.1.14.dev3.dist-info → quarchpy-2.1.14.dev5.dist-info}/WHEEL +0 -0
  701. {quarchpy-2.1.14.dev3.dist-info → quarchpy-2.1.14.dev5.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1679 @@
1
+ """
2
+ Improved support for Microsoft Visual C++ compilers.
3
+
4
+ Known supported compilers:
5
+ --------------------------
6
+ Microsoft Visual C++ 9.0:
7
+ Microsoft Visual C++ Compiler for Python 2.7 (x86, amd64)
8
+ Microsoft Windows SDK 6.1 (x86, x64, ia64)
9
+ Microsoft Windows SDK 7.0 (x86, x64, ia64)
10
+
11
+ Microsoft Visual C++ 10.0:
12
+ Microsoft Windows SDK 7.1 (x86, x64, ia64)
13
+
14
+ Microsoft Visual C++ 14.X:
15
+ Microsoft Visual C++ Build Tools 2015 (x86, x64, arm)
16
+ Microsoft Visual Studio Build Tools 2017 (x86, x64, arm, arm64)
17
+ Microsoft Visual Studio Build Tools 2019 (x86, x64, arm, arm64)
18
+
19
+ This may also support compilers shipped with compatible Visual Studio versions.
20
+ """
21
+
22
+ import json
23
+ from io import open
24
+ from os import listdir, pathsep
25
+ from os.path import join, isfile, isdir, dirname
26
+ import sys
27
+ import platform
28
+ import itertools
29
+ import distutils.errors
30
+ from setuptools.extern.packaging.version import LegacyVersion
31
+
32
+ from setuptools.extern.six.moves import filterfalse
33
+
34
+ from .monkey import get_unpatched
35
+
36
+ if platform.system() == 'Windows':
37
+ from setuptools.extern.six.moves import winreg
38
+ from os import environ
39
+ else:
40
+ # Mock winreg and environ so the module can be imported on this platform.
41
+
42
+ class winreg:
43
+ HKEY_USERS = None
44
+ HKEY_CURRENT_USER = None
45
+ HKEY_LOCAL_MACHINE = None
46
+ HKEY_CLASSES_ROOT = None
47
+
48
+ environ = dict()
49
+
50
+ _msvc9_suppress_errors = (
51
+ # msvc9compiler isn't available on some platforms
52
+ ImportError,
53
+
54
+ # msvc9compiler raises DistutilsPlatformError in some
55
+ # environments. See #1118.
56
+ distutils.errors.DistutilsPlatformError,
57
+ )
58
+
59
+ try:
60
+ from distutils.msvc9compiler import Reg
61
+ except _msvc9_suppress_errors:
62
+ pass
63
+
64
+
65
+ def msvc9_find_vcvarsall(version):
66
+ """
67
+ Patched "distutils.msvc9compiler.find_vcvarsall" to use the standalone
68
+ compiler build for Python
69
+ (VCForPython / Microsoft Visual C++ Compiler for Python 2.7).
70
+
71
+ Fall back to original behavior when the standalone compiler is not
72
+ available.
73
+
74
+ Redirect the path of "vcvarsall.bat".
75
+
76
+ Parameters
77
+ ----------
78
+ version: float
79
+ Required Microsoft Visual C++ version.
80
+
81
+ Return
82
+ ------
83
+ str
84
+ vcvarsall.bat path
85
+ """
86
+ vc_base = r'Software\%sMicrosoft\DevDiv\VCForPython\%0.1f'
87
+ key = vc_base % ('', version)
88
+ try:
89
+ # Per-user installs register the compiler path here
90
+ productdir = Reg.get_value(key, "installdir")
91
+ except KeyError:
92
+ try:
93
+ # All-user installs on a 64-bit system register here
94
+ key = vc_base % ('Wow6432Node\\', version)
95
+ productdir = Reg.get_value(key, "installdir")
96
+ except KeyError:
97
+ productdir = None
98
+
99
+ if productdir:
100
+ vcvarsall = join(productdir, "vcvarsall.bat")
101
+ if isfile(vcvarsall):
102
+ return vcvarsall
103
+
104
+ return get_unpatched(msvc9_find_vcvarsall)(version)
105
+
106
+
107
+ def msvc9_query_vcvarsall(ver, arch='x86', *args, **kwargs):
108
+ """
109
+ Patched "distutils.msvc9compiler.query_vcvarsall" for support extra
110
+ Microsoft Visual C++ 9.0 and 10.0 compilers.
111
+
112
+ Set environment without use of "vcvarsall.bat".
113
+
114
+ Parameters
115
+ ----------
116
+ ver: float
117
+ Required Microsoft Visual C++ version.
118
+ arch: str
119
+ Target architecture.
120
+
121
+ Return
122
+ ------
123
+ dict
124
+ environment
125
+ """
126
+ # Try to get environment from vcvarsall.bat (Classical way)
127
+ try:
128
+ orig = get_unpatched(msvc9_query_vcvarsall)
129
+ return orig(ver, arch, *args, **kwargs)
130
+ except distutils.errors.DistutilsPlatformError:
131
+ # Pass error if Vcvarsall.bat is missing
132
+ pass
133
+ except ValueError:
134
+ # Pass error if environment not set after executing vcvarsall.bat
135
+ pass
136
+
137
+ # If error, try to set environment directly
138
+ try:
139
+ return EnvironmentInfo(arch, ver).return_env()
140
+ except distutils.errors.DistutilsPlatformError as exc:
141
+ _augment_exception(exc, ver, arch)
142
+ raise
143
+
144
+
145
+ def msvc14_get_vc_env(plat_spec):
146
+ """
147
+ Patched "distutils._msvccompiler._get_vc_env" for support extra
148
+ Microsoft Visual C++ 14.X compilers.
149
+
150
+ Set environment without use of "vcvarsall.bat".
151
+
152
+ Parameters
153
+ ----------
154
+ plat_spec: str
155
+ Target architecture.
156
+
157
+ Return
158
+ ------
159
+ dict
160
+ environment
161
+ """
162
+ # Try to get environment from vcvarsall.bat (Classical way)
163
+ try:
164
+ return get_unpatched(msvc14_get_vc_env)(plat_spec)
165
+ except distutils.errors.DistutilsPlatformError:
166
+ # Pass error Vcvarsall.bat is missing
167
+ pass
168
+
169
+ # If error, try to set environment directly
170
+ try:
171
+ return EnvironmentInfo(plat_spec, vc_min_ver=14.0).return_env()
172
+ except distutils.errors.DistutilsPlatformError as exc:
173
+ _augment_exception(exc, 14.0)
174
+ raise
175
+
176
+
177
+ def msvc14_gen_lib_options(*args, **kwargs):
178
+ """
179
+ Patched "distutils._msvccompiler.gen_lib_options" for fix
180
+ compatibility between "numpy.distutils" and "distutils._msvccompiler"
181
+ (for Numpy < 1.11.2)
182
+ """
183
+ if "numpy.distutils" in sys.modules:
184
+ import numpy as np
185
+ if LegacyVersion(np.__version__) < LegacyVersion('1.11.2'):
186
+ return np.distutils.ccompiler.gen_lib_options(*args, **kwargs)
187
+ return get_unpatched(msvc14_gen_lib_options)(*args, **kwargs)
188
+
189
+
190
+ def _augment_exception(exc, version, arch=''):
191
+ """
192
+ Add details to the exception message to help guide the user
193
+ as to what action will resolve it.
194
+ """
195
+ # Error if MSVC++ directory not found or environment not set
196
+ message = exc.args[0]
197
+
198
+ if "vcvarsall" in message.lower() or "visual c" in message.lower():
199
+ # Special error message if MSVC++ not installed
200
+ tmpl = 'Microsoft Visual C++ {version:0.1f} is required.'
201
+ message = tmpl.format(**locals())
202
+ msdownload = 'www.microsoft.com/download/details.aspx?id=%d'
203
+ if version == 9.0:
204
+ if arch.lower().find('ia64') > -1:
205
+ # For VC++ 9.0, if IA64 support is needed, redirect user
206
+ # to Windows SDK 7.0.
207
+ # Note: No download link available from Microsoft.
208
+ message += ' Get it with "Microsoft Windows SDK 7.0"'
209
+ else:
210
+ # For VC++ 9.0 redirect user to Vc++ for Python 2.7 :
211
+ # This redirection link is maintained by Microsoft.
212
+ # Contact vspython@microsoft.com if it needs updating.
213
+ message += ' Get it from http://aka.ms/vcpython27'
214
+ elif version == 10.0:
215
+ # For VC++ 10.0 Redirect user to Windows SDK 7.1
216
+ message += ' Get it with "Microsoft Windows SDK 7.1": '
217
+ message += msdownload % 8279
218
+ elif version >= 14.0:
219
+ # For VC++ 14.X Redirect user to latest Visual C++ Build Tools
220
+ message += (' Get it with "Build Tools for Visual Studio": '
221
+ r'https://visualstudio.microsoft.com/downloads/')
222
+
223
+ exc.args = (message, )
224
+
225
+
226
+ class PlatformInfo:
227
+ """
228
+ Current and Target Architectures information.
229
+
230
+ Parameters
231
+ ----------
232
+ arch: str
233
+ Target architecture.
234
+ """
235
+ current_cpu = environ.get('processor_architecture', '').lower()
236
+
237
+ def __init__(self, arch):
238
+ self.arch = arch.lower().replace('x64', 'amd64')
239
+
240
+ @property
241
+ def target_cpu(self):
242
+ """
243
+ Return Target CPU architecture.
244
+
245
+ Return
246
+ ------
247
+ str
248
+ Target CPU
249
+ """
250
+ return self.arch[self.arch.find('_') + 1:]
251
+
252
+ def target_is_x86(self):
253
+ """
254
+ Return True if target CPU is x86 32 bits..
255
+
256
+ Return
257
+ ------
258
+ bool
259
+ CPU is x86 32 bits
260
+ """
261
+ return self.target_cpu == 'x86'
262
+
263
+ def current_is_x86(self):
264
+ """
265
+ Return True if current CPU is x86 32 bits..
266
+
267
+ Return
268
+ ------
269
+ bool
270
+ CPU is x86 32 bits
271
+ """
272
+ return self.current_cpu == 'x86'
273
+
274
+ def current_dir(self, hidex86=False, x64=False):
275
+ """
276
+ Current platform specific subfolder.
277
+
278
+ Parameters
279
+ ----------
280
+ hidex86: bool
281
+ return '' and not '\x86' if architecture is x86.
282
+ x64: bool
283
+ return '\x64' and not '\amd64' if architecture is amd64.
284
+
285
+ Return
286
+ ------
287
+ str
288
+ subfolder: '\target', or '' (see hidex86 parameter)
289
+ """
290
+ return (
291
+ '' if (self.current_cpu == 'x86' and hidex86) else
292
+ r'\x64' if (self.current_cpu == 'amd64' and x64) else
293
+ r'\%s' % self.current_cpu
294
+ )
295
+
296
+ def target_dir(self, hidex86=False, x64=False):
297
+ r"""
298
+ Target platform specific subfolder.
299
+
300
+ Parameters
301
+ ----------
302
+ hidex86: bool
303
+ return '' and not '\x86' if architecture is x86.
304
+ x64: bool
305
+ return '\x64' and not '\amd64' if architecture is amd64.
306
+
307
+ Return
308
+ ------
309
+ str
310
+ subfolder: '\current', or '' (see hidex86 parameter)
311
+ """
312
+ return (
313
+ '' if (self.target_cpu == 'x86' and hidex86) else
314
+ r'\x64' if (self.target_cpu == 'amd64' and x64) else
315
+ r'\%s' % self.target_cpu
316
+ )
317
+
318
+ def cross_dir(self, forcex86=False):
319
+ r"""
320
+ Cross platform specific subfolder.
321
+
322
+ Parameters
323
+ ----------
324
+ forcex86: bool
325
+ Use 'x86' as current architecture even if current architecture is
326
+ not x86.
327
+
328
+ Return
329
+ ------
330
+ str
331
+ subfolder: '' if target architecture is current architecture,
332
+ '\current_target' if not.
333
+ """
334
+ current = 'x86' if forcex86 else self.current_cpu
335
+ return (
336
+ '' if self.target_cpu == current else
337
+ self.target_dir().replace('\\', '\\%s_' % current)
338
+ )
339
+
340
+
341
+ class RegistryInfo:
342
+ """
343
+ Microsoft Visual Studio related registry information.
344
+
345
+ Parameters
346
+ ----------
347
+ platform_info: PlatformInfo
348
+ "PlatformInfo" instance.
349
+ """
350
+ HKEYS = (winreg.HKEY_USERS,
351
+ winreg.HKEY_CURRENT_USER,
352
+ winreg.HKEY_LOCAL_MACHINE,
353
+ winreg.HKEY_CLASSES_ROOT)
354
+
355
+ def __init__(self, platform_info):
356
+ self.pi = platform_info
357
+
358
+ @property
359
+ def visualstudio(self):
360
+ """
361
+ Microsoft Visual Studio root registry key.
362
+
363
+ Return
364
+ ------
365
+ str
366
+ Registry key
367
+ """
368
+ return 'VisualStudio'
369
+
370
+ @property
371
+ def sxs(self):
372
+ """
373
+ Microsoft Visual Studio SxS registry key.
374
+
375
+ Return
376
+ ------
377
+ str
378
+ Registry key
379
+ """
380
+ return join(self.visualstudio, 'SxS')
381
+
382
+ @property
383
+ def vc(self):
384
+ """
385
+ Microsoft Visual C++ VC7 registry key.
386
+
387
+ Return
388
+ ------
389
+ str
390
+ Registry key
391
+ """
392
+ return join(self.sxs, 'VC7')
393
+
394
+ @property
395
+ def vs(self):
396
+ """
397
+ Microsoft Visual Studio VS7 registry key.
398
+
399
+ Return
400
+ ------
401
+ str
402
+ Registry key
403
+ """
404
+ return join(self.sxs, 'VS7')
405
+
406
+ @property
407
+ def vc_for_python(self):
408
+ """
409
+ Microsoft Visual C++ for Python registry key.
410
+
411
+ Return
412
+ ------
413
+ str
414
+ Registry key
415
+ """
416
+ return r'DevDiv\VCForPython'
417
+
418
+ @property
419
+ def microsoft_sdk(self):
420
+ """
421
+ Microsoft SDK registry key.
422
+
423
+ Return
424
+ ------
425
+ str
426
+ Registry key
427
+ """
428
+ return 'Microsoft SDKs'
429
+
430
+ @property
431
+ def windows_sdk(self):
432
+ """
433
+ Microsoft Windows/Platform SDK registry key.
434
+
435
+ Return
436
+ ------
437
+ str
438
+ Registry key
439
+ """
440
+ return join(self.microsoft_sdk, 'Windows')
441
+
442
+ @property
443
+ def netfx_sdk(self):
444
+ """
445
+ Microsoft .NET Framework SDK registry key.
446
+
447
+ Return
448
+ ------
449
+ str
450
+ Registry key
451
+ """
452
+ return join(self.microsoft_sdk, 'NETFXSDK')
453
+
454
+ @property
455
+ def windows_kits_roots(self):
456
+ """
457
+ Microsoft Windows Kits Roots registry key.
458
+
459
+ Return
460
+ ------
461
+ str
462
+ Registry key
463
+ """
464
+ return r'Windows Kits\Installed Roots'
465
+
466
+ def microsoft(self, key, x86=False):
467
+ """
468
+ Return key in Microsoft software registry.
469
+
470
+ Parameters
471
+ ----------
472
+ key: str
473
+ Registry key path where look.
474
+ x86: str
475
+ Force x86 software registry.
476
+
477
+ Return
478
+ ------
479
+ str
480
+ Registry key
481
+ """
482
+ node64 = '' if self.pi.current_is_x86() or x86 else 'Wow6432Node'
483
+ return join('Software', node64, 'Microsoft', key)
484
+
485
+ def lookup(self, key, name):
486
+ """
487
+ Look for values in registry in Microsoft software registry.
488
+
489
+ Parameters
490
+ ----------
491
+ key: str
492
+ Registry key path where look.
493
+ name: str
494
+ Value name to find.
495
+
496
+ Return
497
+ ------
498
+ str
499
+ value
500
+ """
501
+ key_read = winreg.KEY_READ
502
+ openkey = winreg.OpenKey
503
+ ms = self.microsoft
504
+ for hkey in self.HKEYS:
505
+ try:
506
+ bkey = openkey(hkey, ms(key), 0, key_read)
507
+ except (OSError, IOError):
508
+ if not self.pi.current_is_x86():
509
+ try:
510
+ bkey = openkey(hkey, ms(key, True), 0, key_read)
511
+ except (OSError, IOError):
512
+ continue
513
+ else:
514
+ continue
515
+ try:
516
+ return winreg.QueryValueEx(bkey, name)[0]
517
+ except (OSError, IOError):
518
+ pass
519
+
520
+
521
+ class SystemInfo:
522
+ """
523
+ Microsoft Windows and Visual Studio related system information.
524
+
525
+ Parameters
526
+ ----------
527
+ registry_info: RegistryInfo
528
+ "RegistryInfo" instance.
529
+ vc_ver: float
530
+ Required Microsoft Visual C++ version.
531
+ """
532
+
533
+ # Variables and properties in this class use originals CamelCase variables
534
+ # names from Microsoft source files for more easy comparison.
535
+ WinDir = environ.get('WinDir', '')
536
+ ProgramFiles = environ.get('ProgramFiles', '')
537
+ ProgramFilesx86 = environ.get('ProgramFiles(x86)', ProgramFiles)
538
+
539
+ def __init__(self, registry_info, vc_ver=None):
540
+ self.ri = registry_info
541
+ self.pi = self.ri.pi
542
+
543
+ self.known_vs_paths = self.find_programdata_vs_vers()
544
+
545
+ # Except for VS15+, VC version is aligned with VS version
546
+ self.vs_ver = self.vc_ver = (
547
+ vc_ver or self._find_latest_available_vs_ver())
548
+
549
+ def _find_latest_available_vs_ver(self):
550
+ """
551
+ Find the latest VC version
552
+
553
+ Return
554
+ ------
555
+ float
556
+ version
557
+ """
558
+ reg_vc_vers = self.find_reg_vs_vers()
559
+
560
+ if not (reg_vc_vers or self.known_vs_paths):
561
+ raise distutils.errors.DistutilsPlatformError(
562
+ 'No Microsoft Visual C++ version found')
563
+
564
+ vc_vers = set(reg_vc_vers)
565
+ vc_vers.update(self.known_vs_paths)
566
+ return sorted(vc_vers)[-1]
567
+
568
+ def find_reg_vs_vers(self):
569
+ """
570
+ Find Microsoft Visual Studio versions available in registry.
571
+
572
+ Return
573
+ ------
574
+ list of float
575
+ Versions
576
+ """
577
+ ms = self.ri.microsoft
578
+ vckeys = (self.ri.vc, self.ri.vc_for_python, self.ri.vs)
579
+ vs_vers = []
580
+ for hkey in self.ri.HKEYS:
581
+ for key in vckeys:
582
+ try:
583
+ bkey = winreg.OpenKey(hkey, ms(key), 0, winreg.KEY_READ)
584
+ except (OSError, IOError):
585
+ continue
586
+ subkeys, values, _ = winreg.QueryInfoKey(bkey)
587
+ for i in range(values):
588
+ try:
589
+ ver = float(winreg.EnumValue(bkey, i)[0])
590
+ if ver not in vs_vers:
591
+ vs_vers.append(ver)
592
+ except ValueError:
593
+ pass
594
+ for i in range(subkeys):
595
+ try:
596
+ ver = float(winreg.EnumKey(bkey, i))
597
+ if ver not in vs_vers:
598
+ vs_vers.append(ver)
599
+ except ValueError:
600
+ pass
601
+ return sorted(vs_vers)
602
+
603
+ def find_programdata_vs_vers(self):
604
+ r"""
605
+ Find Visual studio 2017+ versions from information in
606
+ "C:\ProgramData\Microsoft\VisualStudio\Packages\_Instances".
607
+
608
+ Return
609
+ ------
610
+ dict
611
+ float version as key, path as value.
612
+ """
613
+ vs_versions = {}
614
+ instances_dir = \
615
+ r'C:\ProgramData\Microsoft\VisualStudio\Packages\_Instances'
616
+
617
+ try:
618
+ hashed_names = listdir(instances_dir)
619
+
620
+ except (OSError, IOError):
621
+ # Directory not exists with all Visual Studio versions
622
+ return vs_versions
623
+
624
+ for name in hashed_names:
625
+ try:
626
+ # Get VS installation path from "state.json" file
627
+ state_path = join(instances_dir, name, 'state.json')
628
+ with open(state_path, 'rt', encoding='utf-8') as state_file:
629
+ state = json.load(state_file)
630
+ vs_path = state['installationPath']
631
+
632
+ # Raises OSError if this VS installation does not contain VC
633
+ listdir(join(vs_path, r'VC\Tools\MSVC'))
634
+
635
+ # Store version and path
636
+ vs_versions[self._as_float_version(
637
+ state['installationVersion'])] = vs_path
638
+
639
+ except (OSError, IOError, KeyError):
640
+ # Skip if "state.json" file is missing or bad format
641
+ continue
642
+
643
+ return vs_versions
644
+
645
+ @staticmethod
646
+ def _as_float_version(version):
647
+ """
648
+ Return a string version as a simplified float version (major.minor)
649
+
650
+ Parameters
651
+ ----------
652
+ version: str
653
+ Version.
654
+
655
+ Return
656
+ ------
657
+ float
658
+ version
659
+ """
660
+ return float('.'.join(version.split('.')[:2]))
661
+
662
+ @property
663
+ def VSInstallDir(self):
664
+ """
665
+ Microsoft Visual Studio directory.
666
+
667
+ Return
668
+ ------
669
+ str
670
+ path
671
+ """
672
+ # Default path
673
+ default = join(self.ProgramFilesx86,
674
+ 'Microsoft Visual Studio %0.1f' % self.vs_ver)
675
+
676
+ # Try to get path from registry, if fail use default path
677
+ return self.ri.lookup(self.ri.vs, '%0.1f' % self.vs_ver) or default
678
+
679
+ @property
680
+ def VCInstallDir(self):
681
+ """
682
+ Microsoft Visual C++ directory.
683
+
684
+ Return
685
+ ------
686
+ str
687
+ path
688
+ """
689
+ path = self._guess_vc() or self._guess_vc_legacy()
690
+
691
+ if not isdir(path):
692
+ msg = 'Microsoft Visual C++ directory not found'
693
+ raise distutils.errors.DistutilsPlatformError(msg)
694
+
695
+ return path
696
+
697
+ def _guess_vc(self):
698
+ """
699
+ Locate Visual C++ for VS2017+.
700
+
701
+ Return
702
+ ------
703
+ str
704
+ path
705
+ """
706
+ if self.vs_ver <= 14.0:
707
+ return ''
708
+
709
+ try:
710
+ # First search in known VS paths
711
+ vs_dir = self.known_vs_paths[self.vs_ver]
712
+ except KeyError:
713
+ # Else, search with path from registry
714
+ vs_dir = self.VSInstallDir
715
+
716
+ guess_vc = join(vs_dir, r'VC\Tools\MSVC')
717
+
718
+ # Subdir with VC exact version as name
719
+ try:
720
+ # Update the VC version with real one instead of VS version
721
+ vc_ver = listdir(guess_vc)[-1]
722
+ self.vc_ver = self._as_float_version(vc_ver)
723
+ return join(guess_vc, vc_ver)
724
+ except (OSError, IOError, IndexError):
725
+ return ''
726
+
727
+ def _guess_vc_legacy(self):
728
+ """
729
+ Locate Visual C++ for versions prior to 2017.
730
+
731
+ Return
732
+ ------
733
+ str
734
+ path
735
+ """
736
+ default = join(self.ProgramFilesx86,
737
+ r'Microsoft Visual Studio %0.1f\VC' % self.vs_ver)
738
+
739
+ # Try to get "VC++ for Python" path from registry as default path
740
+ reg_path = join(self.ri.vc_for_python, '%0.1f' % self.vs_ver)
741
+ python_vc = self.ri.lookup(reg_path, 'installdir')
742
+ default_vc = join(python_vc, 'VC') if python_vc else default
743
+
744
+ # Try to get path from registry, if fail use default path
745
+ return self.ri.lookup(self.ri.vc, '%0.1f' % self.vs_ver) or default_vc
746
+
747
+ @property
748
+ def WindowsSdkVersion(self):
749
+ """
750
+ Microsoft Windows SDK versions for specified MSVC++ version.
751
+
752
+ Return
753
+ ------
754
+ tuple of str
755
+ versions
756
+ """
757
+ if self.vs_ver <= 9.0:
758
+ return '7.0', '6.1', '6.0a'
759
+ elif self.vs_ver == 10.0:
760
+ return '7.1', '7.0a'
761
+ elif self.vs_ver == 11.0:
762
+ return '8.0', '8.0a'
763
+ elif self.vs_ver == 12.0:
764
+ return '8.1', '8.1a'
765
+ elif self.vs_ver >= 14.0:
766
+ return '10.0', '8.1'
767
+
768
+ @property
769
+ def WindowsSdkLastVersion(self):
770
+ """
771
+ Microsoft Windows SDK last version.
772
+
773
+ Return
774
+ ------
775
+ str
776
+ version
777
+ """
778
+ return self._use_last_dir_name(join(self.WindowsSdkDir, 'lib'))
779
+
780
+ @property
781
+ def WindowsSdkDir(self):
782
+ """
783
+ Microsoft Windows SDK directory.
784
+
785
+ Return
786
+ ------
787
+ str
788
+ path
789
+ """
790
+ sdkdir = ''
791
+ for ver in self.WindowsSdkVersion:
792
+ # Try to get it from registry
793
+ loc = join(self.ri.windows_sdk, 'v%s' % ver)
794
+ sdkdir = self.ri.lookup(loc, 'installationfolder')
795
+ if sdkdir:
796
+ break
797
+ if not sdkdir or not isdir(sdkdir):
798
+ # Try to get "VC++ for Python" version from registry
799
+ path = join(self.ri.vc_for_python, '%0.1f' % self.vc_ver)
800
+ install_base = self.ri.lookup(path, 'installdir')
801
+ if install_base:
802
+ sdkdir = join(install_base, 'WinSDK')
803
+ if not sdkdir or not isdir(sdkdir):
804
+ # If fail, use default new path
805
+ for ver in self.WindowsSdkVersion:
806
+ intver = ver[:ver.rfind('.')]
807
+ path = r'Microsoft SDKs\Windows Kits\%s' % intver
808
+ d = join(self.ProgramFiles, path)
809
+ if isdir(d):
810
+ sdkdir = d
811
+ if not sdkdir or not isdir(sdkdir):
812
+ # If fail, use default old path
813
+ for ver in self.WindowsSdkVersion:
814
+ path = r'Microsoft SDKs\Windows\v%s' % ver
815
+ d = join(self.ProgramFiles, path)
816
+ if isdir(d):
817
+ sdkdir = d
818
+ if not sdkdir:
819
+ # If fail, use Platform SDK
820
+ sdkdir = join(self.VCInstallDir, 'PlatformSDK')
821
+ return sdkdir
822
+
823
+ @property
824
+ def WindowsSDKExecutablePath(self):
825
+ """
826
+ Microsoft Windows SDK executable directory.
827
+
828
+ Return
829
+ ------
830
+ str
831
+ path
832
+ """
833
+ # Find WinSDK NetFx Tools registry dir name
834
+ if self.vs_ver <= 11.0:
835
+ netfxver = 35
836
+ arch = ''
837
+ else:
838
+ netfxver = 40
839
+ hidex86 = True if self.vs_ver <= 12.0 else False
840
+ arch = self.pi.current_dir(x64=True, hidex86=hidex86)
841
+ fx = 'WinSDK-NetFx%dTools%s' % (netfxver, arch.replace('\\', '-'))
842
+
843
+ # list all possibles registry paths
844
+ regpaths = []
845
+ if self.vs_ver >= 14.0:
846
+ for ver in self.NetFxSdkVersion:
847
+ regpaths += [join(self.ri.netfx_sdk, ver, fx)]
848
+
849
+ for ver in self.WindowsSdkVersion:
850
+ regpaths += [join(self.ri.windows_sdk, 'v%sA' % ver, fx)]
851
+
852
+ # Return installation folder from the more recent path
853
+ for path in regpaths:
854
+ execpath = self.ri.lookup(path, 'installationfolder')
855
+ if execpath:
856
+ return execpath
857
+
858
+ @property
859
+ def FSharpInstallDir(self):
860
+ """
861
+ Microsoft Visual F# directory.
862
+
863
+ Return
864
+ ------
865
+ str
866
+ path
867
+ """
868
+ path = join(self.ri.visualstudio, r'%0.1f\Setup\F#' % self.vs_ver)
869
+ return self.ri.lookup(path, 'productdir') or ''
870
+
871
+ @property
872
+ def UniversalCRTSdkDir(self):
873
+ """
874
+ Microsoft Universal CRT SDK directory.
875
+
876
+ Return
877
+ ------
878
+ str
879
+ path
880
+ """
881
+ # Set Kit Roots versions for specified MSVC++ version
882
+ vers = ('10', '81') if self.vs_ver >= 14.0 else ()
883
+
884
+ # Find path of the more recent Kit
885
+ for ver in vers:
886
+ sdkdir = self.ri.lookup(self.ri.windows_kits_roots,
887
+ 'kitsroot%s' % ver)
888
+ if sdkdir:
889
+ return sdkdir or ''
890
+
891
+ @property
892
+ def UniversalCRTSdkLastVersion(self):
893
+ """
894
+ Microsoft Universal C Runtime SDK last version.
895
+
896
+ Return
897
+ ------
898
+ str
899
+ version
900
+ """
901
+ return self._use_last_dir_name(join(self.UniversalCRTSdkDir, 'lib'))
902
+
903
+ @property
904
+ def NetFxSdkVersion(self):
905
+ """
906
+ Microsoft .NET Framework SDK versions.
907
+
908
+ Return
909
+ ------
910
+ tuple of str
911
+ versions
912
+ """
913
+ # Set FxSdk versions for specified VS version
914
+ return (('4.7.2', '4.7.1', '4.7',
915
+ '4.6.2', '4.6.1', '4.6',
916
+ '4.5.2', '4.5.1', '4.5')
917
+ if self.vs_ver >= 14.0 else ())
918
+
919
+ @property
920
+ def NetFxSdkDir(self):
921
+ """
922
+ Microsoft .NET Framework SDK directory.
923
+
924
+ Return
925
+ ------
926
+ str
927
+ path
928
+ """
929
+ sdkdir = ''
930
+ for ver in self.NetFxSdkVersion:
931
+ loc = join(self.ri.netfx_sdk, ver)
932
+ sdkdir = self.ri.lookup(loc, 'kitsinstallationfolder')
933
+ if sdkdir:
934
+ break
935
+ return sdkdir
936
+
937
+ @property
938
+ def FrameworkDir32(self):
939
+ """
940
+ Microsoft .NET Framework 32bit directory.
941
+
942
+ Return
943
+ ------
944
+ str
945
+ path
946
+ """
947
+ # Default path
948
+ guess_fw = join(self.WinDir, r'Microsoft.NET\Framework')
949
+
950
+ # Try to get path from registry, if fail use default path
951
+ return self.ri.lookup(self.ri.vc, 'frameworkdir32') or guess_fw
952
+
953
+ @property
954
+ def FrameworkDir64(self):
955
+ """
956
+ Microsoft .NET Framework 64bit directory.
957
+
958
+ Return
959
+ ------
960
+ str
961
+ path
962
+ """
963
+ # Default path
964
+ guess_fw = join(self.WinDir, r'Microsoft.NET\Framework64')
965
+
966
+ # Try to get path from registry, if fail use default path
967
+ return self.ri.lookup(self.ri.vc, 'frameworkdir64') or guess_fw
968
+
969
+ @property
970
+ def FrameworkVersion32(self):
971
+ """
972
+ Microsoft .NET Framework 32bit versions.
973
+
974
+ Return
975
+ ------
976
+ tuple of str
977
+ versions
978
+ """
979
+ return self._find_dot_net_versions(32)
980
+
981
+ @property
982
+ def FrameworkVersion64(self):
983
+ """
984
+ Microsoft .NET Framework 64bit versions.
985
+
986
+ Return
987
+ ------
988
+ tuple of str
989
+ versions
990
+ """
991
+ return self._find_dot_net_versions(64)
992
+
993
+ def _find_dot_net_versions(self, bits):
994
+ """
995
+ Find Microsoft .NET Framework versions.
996
+
997
+ Parameters
998
+ ----------
999
+ bits: int
1000
+ Platform number of bits: 32 or 64.
1001
+
1002
+ Return
1003
+ ------
1004
+ tuple of str
1005
+ versions
1006
+ """
1007
+ # Find actual .NET version in registry
1008
+ reg_ver = self.ri.lookup(self.ri.vc, 'frameworkver%d' % bits)
1009
+ dot_net_dir = getattr(self, 'FrameworkDir%d' % bits)
1010
+ ver = reg_ver or self._use_last_dir_name(dot_net_dir, 'v') or ''
1011
+
1012
+ # Set .NET versions for specified MSVC++ version
1013
+ if self.vs_ver >= 12.0:
1014
+ return ver, 'v4.0'
1015
+ elif self.vs_ver >= 10.0:
1016
+ return 'v4.0.30319' if ver.lower()[:2] != 'v4' else ver, 'v3.5'
1017
+ elif self.vs_ver == 9.0:
1018
+ return 'v3.5', 'v2.0.50727'
1019
+ elif self.vs_ver == 8.0:
1020
+ return 'v3.0', 'v2.0.50727'
1021
+
1022
+ @staticmethod
1023
+ def _use_last_dir_name(path, prefix=''):
1024
+ """
1025
+ Return name of the last dir in path or '' if no dir found.
1026
+
1027
+ Parameters
1028
+ ----------
1029
+ path: str
1030
+ Use dirs in this path
1031
+ prefix: str
1032
+ Use only dirs starting by this prefix
1033
+
1034
+ Return
1035
+ ------
1036
+ str
1037
+ name
1038
+ """
1039
+ matching_dirs = (
1040
+ dir_name
1041
+ for dir_name in reversed(listdir(path))
1042
+ if isdir(join(path, dir_name)) and
1043
+ dir_name.startswith(prefix)
1044
+ )
1045
+ return next(matching_dirs, None) or ''
1046
+
1047
+
1048
+ class EnvironmentInfo:
1049
+ """
1050
+ Return environment variables for specified Microsoft Visual C++ version
1051
+ and platform : Lib, Include, Path and libpath.
1052
+
1053
+ This function is compatible with Microsoft Visual C++ 9.0 to 14.X.
1054
+
1055
+ Script created by analysing Microsoft environment configuration files like
1056
+ "vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ...
1057
+
1058
+ Parameters
1059
+ ----------
1060
+ arch: str
1061
+ Target architecture.
1062
+ vc_ver: float
1063
+ Required Microsoft Visual C++ version. If not set, autodetect the last
1064
+ version.
1065
+ vc_min_ver: float
1066
+ Minimum Microsoft Visual C++ version.
1067
+ """
1068
+
1069
+ # Variables and properties in this class use originals CamelCase variables
1070
+ # names from Microsoft source files for more easy comparison.
1071
+
1072
+ def __init__(self, arch, vc_ver=None, vc_min_ver=0):
1073
+ self.pi = PlatformInfo(arch)
1074
+ self.ri = RegistryInfo(self.pi)
1075
+ self.si = SystemInfo(self.ri, vc_ver)
1076
+
1077
+ if self.vc_ver < vc_min_ver:
1078
+ err = 'No suitable Microsoft Visual C++ version found'
1079
+ raise distutils.errors.DistutilsPlatformError(err)
1080
+
1081
+ @property
1082
+ def vs_ver(self):
1083
+ """
1084
+ Microsoft Visual Studio.
1085
+
1086
+ Return
1087
+ ------
1088
+ float
1089
+ version
1090
+ """
1091
+ return self.si.vs_ver
1092
+
1093
+ @property
1094
+ def vc_ver(self):
1095
+ """
1096
+ Microsoft Visual C++ version.
1097
+
1098
+ Return
1099
+ ------
1100
+ float
1101
+ version
1102
+ """
1103
+ return self.si.vc_ver
1104
+
1105
+ @property
1106
+ def VSTools(self):
1107
+ """
1108
+ Microsoft Visual Studio Tools.
1109
+
1110
+ Return
1111
+ ------
1112
+ list of str
1113
+ paths
1114
+ """
1115
+ paths = [r'Common7\IDE', r'Common7\Tools']
1116
+
1117
+ if self.vs_ver >= 14.0:
1118
+ arch_subdir = self.pi.current_dir(hidex86=True, x64=True)
1119
+ paths += [r'Common7\IDE\CommonExtensions\Microsoft\TestWindow']
1120
+ paths += [r'Team Tools\Performance Tools']
1121
+ paths += [r'Team Tools\Performance Tools%s' % arch_subdir]
1122
+
1123
+ return [join(self.si.VSInstallDir, path) for path in paths]
1124
+
1125
+ @property
1126
+ def VCIncludes(self):
1127
+ """
1128
+ Microsoft Visual C++ & Microsoft Foundation Class Includes.
1129
+
1130
+ Return
1131
+ ------
1132
+ list of str
1133
+ paths
1134
+ """
1135
+ return [join(self.si.VCInstallDir, 'Include'),
1136
+ join(self.si.VCInstallDir, r'ATLMFC\Include')]
1137
+
1138
+ @property
1139
+ def VCLibraries(self):
1140
+ """
1141
+ Microsoft Visual C++ & Microsoft Foundation Class Libraries.
1142
+
1143
+ Return
1144
+ ------
1145
+ list of str
1146
+ paths
1147
+ """
1148
+ if self.vs_ver >= 15.0:
1149
+ arch_subdir = self.pi.target_dir(x64=True)
1150
+ else:
1151
+ arch_subdir = self.pi.target_dir(hidex86=True)
1152
+ paths = ['Lib%s' % arch_subdir, r'ATLMFC\Lib%s' % arch_subdir]
1153
+
1154
+ if self.vs_ver >= 14.0:
1155
+ paths += [r'Lib\store%s' % arch_subdir]
1156
+
1157
+ return [join(self.si.VCInstallDir, path) for path in paths]
1158
+
1159
+ @property
1160
+ def VCStoreRefs(self):
1161
+ """
1162
+ Microsoft Visual C++ store references Libraries.
1163
+
1164
+ Return
1165
+ ------
1166
+ list of str
1167
+ paths
1168
+ """
1169
+ if self.vs_ver < 14.0:
1170
+ return []
1171
+ return [join(self.si.VCInstallDir, r'Lib\store\references')]
1172
+
1173
+ @property
1174
+ def VCTools(self):
1175
+ """
1176
+ Microsoft Visual C++ Tools.
1177
+
1178
+ Return
1179
+ ------
1180
+ list of str
1181
+ paths
1182
+ """
1183
+ si = self.si
1184
+ tools = [join(si.VCInstallDir, 'VCPackages')]
1185
+
1186
+ forcex86 = True if self.vs_ver <= 10.0 else False
1187
+ arch_subdir = self.pi.cross_dir(forcex86)
1188
+ if arch_subdir:
1189
+ tools += [join(si.VCInstallDir, 'Bin%s' % arch_subdir)]
1190
+
1191
+ if self.vs_ver == 14.0:
1192
+ path = 'Bin%s' % self.pi.current_dir(hidex86=True)
1193
+ tools += [join(si.VCInstallDir, path)]
1194
+
1195
+ elif self.vs_ver >= 15.0:
1196
+ host_dir = (r'bin\HostX86%s' if self.pi.current_is_x86() else
1197
+ r'bin\HostX64%s')
1198
+ tools += [join(
1199
+ si.VCInstallDir, host_dir % self.pi.target_dir(x64=True))]
1200
+
1201
+ if self.pi.current_cpu != self.pi.target_cpu:
1202
+ tools += [join(
1203
+ si.VCInstallDir, host_dir % self.pi.current_dir(x64=True))]
1204
+
1205
+ else:
1206
+ tools += [join(si.VCInstallDir, 'Bin')]
1207
+
1208
+ return tools
1209
+
1210
+ @property
1211
+ def OSLibraries(self):
1212
+ """
1213
+ Microsoft Windows SDK Libraries.
1214
+
1215
+ Return
1216
+ ------
1217
+ list of str
1218
+ paths
1219
+ """
1220
+ if self.vs_ver <= 10.0:
1221
+ arch_subdir = self.pi.target_dir(hidex86=True, x64=True)
1222
+ return [join(self.si.WindowsSdkDir, 'Lib%s' % arch_subdir)]
1223
+
1224
+ else:
1225
+ arch_subdir = self.pi.target_dir(x64=True)
1226
+ lib = join(self.si.WindowsSdkDir, 'lib')
1227
+ libver = self._sdk_subdir
1228
+ return [join(lib, '%sum%s' % (libver , arch_subdir))]
1229
+
1230
+ @property
1231
+ def OSIncludes(self):
1232
+ """
1233
+ Microsoft Windows SDK Include.
1234
+
1235
+ Return
1236
+ ------
1237
+ list of str
1238
+ paths
1239
+ """
1240
+ include = join(self.si.WindowsSdkDir, 'include')
1241
+
1242
+ if self.vs_ver <= 10.0:
1243
+ return [include, join(include, 'gl')]
1244
+
1245
+ else:
1246
+ if self.vs_ver >= 14.0:
1247
+ sdkver = self._sdk_subdir
1248
+ else:
1249
+ sdkver = ''
1250
+ return [join(include, '%sshared' % sdkver),
1251
+ join(include, '%sum' % sdkver),
1252
+ join(include, '%swinrt' % sdkver)]
1253
+
1254
+ @property
1255
+ def OSLibpath(self):
1256
+ """
1257
+ Microsoft Windows SDK Libraries Paths.
1258
+
1259
+ Return
1260
+ ------
1261
+ list of str
1262
+ paths
1263
+ """
1264
+ ref = join(self.si.WindowsSdkDir, 'References')
1265
+ libpath = []
1266
+
1267
+ if self.vs_ver <= 9.0:
1268
+ libpath += self.OSLibraries
1269
+
1270
+ if self.vs_ver >= 11.0:
1271
+ libpath += [join(ref, r'CommonConfiguration\Neutral')]
1272
+
1273
+ if self.vs_ver >= 14.0:
1274
+ libpath += [
1275
+ ref,
1276
+ join(self.si.WindowsSdkDir, 'UnionMetadata'),
1277
+ join(ref, 'Windows.Foundation.UniversalApiContract', '1.0.0.0'),
1278
+ join(ref, 'Windows.Foundation.FoundationContract', '1.0.0.0'),
1279
+ join(ref,'Windows.Networking.Connectivity.WwanContract',
1280
+ '1.0.0.0'),
1281
+ join(self.si.WindowsSdkDir, 'ExtensionSDKs', 'Microsoft.VCLibs',
1282
+ '%0.1f' % self.vs_ver, 'References', 'CommonConfiguration',
1283
+ 'neutral'),
1284
+ ]
1285
+ return libpath
1286
+
1287
+ @property
1288
+ def SdkTools(self):
1289
+ """
1290
+ Microsoft Windows SDK Tools.
1291
+
1292
+ Return
1293
+ ------
1294
+ list of str
1295
+ paths
1296
+ """
1297
+ return list(self._sdk_tools())
1298
+
1299
+ def _sdk_tools(self):
1300
+ """
1301
+ Microsoft Windows SDK Tools paths generator.
1302
+
1303
+ Return
1304
+ ------
1305
+ generator of str
1306
+ paths
1307
+ """
1308
+ if self.vs_ver < 15.0:
1309
+ bin_dir = 'Bin' if self.vs_ver <= 11.0 else r'Bin\x86'
1310
+ yield join(self.si.WindowsSdkDir, bin_dir)
1311
+
1312
+ if not self.pi.current_is_x86():
1313
+ arch_subdir = self.pi.current_dir(x64=True)
1314
+ path = 'Bin%s' % arch_subdir
1315
+ yield join(self.si.WindowsSdkDir, path)
1316
+
1317
+ if self.vs_ver in (10.0, 11.0):
1318
+ if self.pi.target_is_x86():
1319
+ arch_subdir = ''
1320
+ else:
1321
+ arch_subdir = self.pi.current_dir(hidex86=True, x64=True)
1322
+ path = r'Bin\NETFX 4.0 Tools%s' % arch_subdir
1323
+ yield join(self.si.WindowsSdkDir, path)
1324
+
1325
+ elif self.vs_ver >= 15.0:
1326
+ path = join(self.si.WindowsSdkDir, 'Bin')
1327
+ arch_subdir = self.pi.current_dir(x64=True)
1328
+ sdkver = self.si.WindowsSdkLastVersion
1329
+ yield join(path, '%s%s' % (sdkver, arch_subdir))
1330
+
1331
+ if self.si.WindowsSDKExecutablePath:
1332
+ yield self.si.WindowsSDKExecutablePath
1333
+
1334
+ @property
1335
+ def _sdk_subdir(self):
1336
+ """
1337
+ Microsoft Windows SDK version subdir.
1338
+
1339
+ Return
1340
+ ------
1341
+ str
1342
+ subdir
1343
+ """
1344
+ ucrtver = self.si.WindowsSdkLastVersion
1345
+ return ('%s\\' % ucrtver) if ucrtver else ''
1346
+
1347
+ @property
1348
+ def SdkSetup(self):
1349
+ """
1350
+ Microsoft Windows SDK Setup.
1351
+
1352
+ Return
1353
+ ------
1354
+ list of str
1355
+ paths
1356
+ """
1357
+ if self.vs_ver > 9.0:
1358
+ return []
1359
+
1360
+ return [join(self.si.WindowsSdkDir, 'Setup')]
1361
+
1362
+ @property
1363
+ def FxTools(self):
1364
+ """
1365
+ Microsoft .NET Framework Tools.
1366
+
1367
+ Return
1368
+ ------
1369
+ list of str
1370
+ paths
1371
+ """
1372
+ pi = self.pi
1373
+ si = self.si
1374
+
1375
+ if self.vs_ver <= 10.0:
1376
+ include32 = True
1377
+ include64 = not pi.target_is_x86() and not pi.current_is_x86()
1378
+ else:
1379
+ include32 = pi.target_is_x86() or pi.current_is_x86()
1380
+ include64 = pi.current_cpu == 'amd64' or pi.target_cpu == 'amd64'
1381
+
1382
+ tools = []
1383
+ if include32:
1384
+ tools += [join(si.FrameworkDir32, ver)
1385
+ for ver in si.FrameworkVersion32]
1386
+ if include64:
1387
+ tools += [join(si.FrameworkDir64, ver)
1388
+ for ver in si.FrameworkVersion64]
1389
+ return tools
1390
+
1391
+ @property
1392
+ def NetFxSDKLibraries(self):
1393
+ """
1394
+ Microsoft .Net Framework SDK Libraries.
1395
+
1396
+ Return
1397
+ ------
1398
+ list of str
1399
+ paths
1400
+ """
1401
+ if self.vs_ver < 14.0 or not self.si.NetFxSdkDir:
1402
+ return []
1403
+
1404
+ arch_subdir = self.pi.target_dir(x64=True)
1405
+ return [join(self.si.NetFxSdkDir, r'lib\um%s' % arch_subdir)]
1406
+
1407
+ @property
1408
+ def NetFxSDKIncludes(self):
1409
+ """
1410
+ Microsoft .Net Framework SDK Includes.
1411
+
1412
+ Return
1413
+ ------
1414
+ list of str
1415
+ paths
1416
+ """
1417
+ if self.vs_ver < 14.0 or not self.si.NetFxSdkDir:
1418
+ return []
1419
+
1420
+ return [join(self.si.NetFxSdkDir, r'include\um')]
1421
+
1422
+ @property
1423
+ def VsTDb(self):
1424
+ """
1425
+ Microsoft Visual Studio Team System Database.
1426
+
1427
+ Return
1428
+ ------
1429
+ list of str
1430
+ paths
1431
+ """
1432
+ return [join(self.si.VSInstallDir, r'VSTSDB\Deploy')]
1433
+
1434
+ @property
1435
+ def MSBuild(self):
1436
+ """
1437
+ Microsoft Build Engine.
1438
+
1439
+ Return
1440
+ ------
1441
+ list of str
1442
+ paths
1443
+ """
1444
+ if self.vs_ver < 12.0:
1445
+ return []
1446
+ elif self.vs_ver < 15.0:
1447
+ base_path = self.si.ProgramFilesx86
1448
+ arch_subdir = self.pi.current_dir(hidex86=True)
1449
+ else:
1450
+ base_path = self.si.VSInstallDir
1451
+ arch_subdir = ''
1452
+
1453
+ path = r'MSBuild\%0.1f\bin%s' % (self.vs_ver, arch_subdir)
1454
+ build = [join(base_path, path)]
1455
+
1456
+ if self.vs_ver >= 15.0:
1457
+ # Add Roslyn C# & Visual Basic Compiler
1458
+ build += [join(base_path, path, 'Roslyn')]
1459
+
1460
+ return build
1461
+
1462
+ @property
1463
+ def HTMLHelpWorkshop(self):
1464
+ """
1465
+ Microsoft HTML Help Workshop.
1466
+
1467
+ Return
1468
+ ------
1469
+ list of str
1470
+ paths
1471
+ """
1472
+ if self.vs_ver < 11.0:
1473
+ return []
1474
+
1475
+ return [join(self.si.ProgramFilesx86, 'HTML Help Workshop')]
1476
+
1477
+ @property
1478
+ def UCRTLibraries(self):
1479
+ """
1480
+ Microsoft Universal C Runtime SDK Libraries.
1481
+
1482
+ Return
1483
+ ------
1484
+ list of str
1485
+ paths
1486
+ """
1487
+ if self.vs_ver < 14.0:
1488
+ return []
1489
+
1490
+ arch_subdir = self.pi.target_dir(x64=True)
1491
+ lib = join(self.si.UniversalCRTSdkDir, 'lib')
1492
+ ucrtver = self._ucrt_subdir
1493
+ return [join(lib, '%sucrt%s' % (ucrtver, arch_subdir))]
1494
+
1495
+ @property
1496
+ def UCRTIncludes(self):
1497
+ """
1498
+ Microsoft Universal C Runtime SDK Include.
1499
+
1500
+ Return
1501
+ ------
1502
+ list of str
1503
+ paths
1504
+ """
1505
+ if self.vs_ver < 14.0:
1506
+ return []
1507
+
1508
+ include = join(self.si.UniversalCRTSdkDir, 'include')
1509
+ return [join(include, '%sucrt' % self._ucrt_subdir)]
1510
+
1511
+ @property
1512
+ def _ucrt_subdir(self):
1513
+ """
1514
+ Microsoft Universal C Runtime SDK version subdir.
1515
+
1516
+ Return
1517
+ ------
1518
+ str
1519
+ subdir
1520
+ """
1521
+ ucrtver = self.si.UniversalCRTSdkLastVersion
1522
+ return ('%s\\' % ucrtver) if ucrtver else ''
1523
+
1524
+ @property
1525
+ def FSharp(self):
1526
+ """
1527
+ Microsoft Visual F#.
1528
+
1529
+ Return
1530
+ ------
1531
+ list of str
1532
+ paths
1533
+ """
1534
+ if 11.0 > self.vs_ver > 12.0:
1535
+ return []
1536
+
1537
+ return [self.si.FSharpInstallDir]
1538
+
1539
+ @property
1540
+ def VCRuntimeRedist(self):
1541
+ """
1542
+ Microsoft Visual C++ runtime redistributable dll.
1543
+
1544
+ Return
1545
+ ------
1546
+ str
1547
+ path
1548
+ """
1549
+ vcruntime = 'vcruntime%d0.dll' % self.vc_ver
1550
+ arch_subdir = self.pi.target_dir(x64=True).strip('\\')
1551
+
1552
+ # Installation prefixes candidates
1553
+ prefixes = []
1554
+ tools_path = self.si.VCInstallDir
1555
+ redist_path = dirname(tools_path.replace(r'\Tools', r'\Redist'))
1556
+ if isdir(redist_path):
1557
+ # Redist version may not be exactly the same as tools
1558
+ redist_path = join(redist_path, listdir(redist_path)[-1])
1559
+ prefixes += [redist_path, join(redist_path, 'onecore')]
1560
+
1561
+ prefixes += [join(tools_path, 'redist')] # VS14 legacy path
1562
+
1563
+ # CRT directory
1564
+ crt_dirs = ('Microsoft.VC%d.CRT' % (self.vc_ver * 10),
1565
+ # Sometime store in directory with VS version instead of VC
1566
+ 'Microsoft.VC%d.CRT' % (int(self.vs_ver) * 10))
1567
+
1568
+ # vcruntime path
1569
+ for prefix, crt_dir in itertools.product(prefixes, crt_dirs):
1570
+ path = join(prefix, arch_subdir, crt_dir, vcruntime)
1571
+ if isfile(path):
1572
+ return path
1573
+
1574
+ def return_env(self, exists=True):
1575
+ """
1576
+ Return environment dict.
1577
+
1578
+ Parameters
1579
+ ----------
1580
+ exists: bool
1581
+ It True, only return existing paths.
1582
+
1583
+ Return
1584
+ ------
1585
+ dict
1586
+ environment
1587
+ """
1588
+ env = dict(
1589
+ include=self._build_paths('include',
1590
+ [self.VCIncludes,
1591
+ self.OSIncludes,
1592
+ self.UCRTIncludes,
1593
+ self.NetFxSDKIncludes],
1594
+ exists),
1595
+ lib=self._build_paths('lib',
1596
+ [self.VCLibraries,
1597
+ self.OSLibraries,
1598
+ self.FxTools,
1599
+ self.UCRTLibraries,
1600
+ self.NetFxSDKLibraries],
1601
+ exists),
1602
+ libpath=self._build_paths('libpath',
1603
+ [self.VCLibraries,
1604
+ self.FxTools,
1605
+ self.VCStoreRefs,
1606
+ self.OSLibpath],
1607
+ exists),
1608
+ path=self._build_paths('path',
1609
+ [self.VCTools,
1610
+ self.VSTools,
1611
+ self.VsTDb,
1612
+ self.SdkTools,
1613
+ self.SdkSetup,
1614
+ self.FxTools,
1615
+ self.MSBuild,
1616
+ self.HTMLHelpWorkshop,
1617
+ self.FSharp],
1618
+ exists),
1619
+ )
1620
+ if self.vs_ver >= 14 and isfile(self.VCRuntimeRedist):
1621
+ env['py_vcruntime_redist'] = self.VCRuntimeRedist
1622
+ return env
1623
+
1624
+ def _build_paths(self, name, spec_path_lists, exists):
1625
+ """
1626
+ Given an environment variable name and specified paths,
1627
+ return a pathsep-separated string of paths containing
1628
+ unique, extant, directories from those paths and from
1629
+ the environment variable. Raise an error if no paths
1630
+ are resolved.
1631
+
1632
+ Parameters
1633
+ ----------
1634
+ name: str
1635
+ Environment variable name
1636
+ spec_path_lists: list of str
1637
+ Paths
1638
+ exists: bool
1639
+ It True, only return existing paths.
1640
+
1641
+ Return
1642
+ ------
1643
+ str
1644
+ Pathsep-separated paths
1645
+ """
1646
+ # flatten spec_path_lists
1647
+ spec_paths = itertools.chain.from_iterable(spec_path_lists)
1648
+ env_paths = environ.get(name, '').split(pathsep)
1649
+ paths = itertools.chain(spec_paths, env_paths)
1650
+ extant_paths = list(filter(isdir, paths)) if exists else paths
1651
+ if not extant_paths:
1652
+ msg = "%s environment variable is empty" % name.upper()
1653
+ raise distutils.errors.DistutilsPlatformError(msg)
1654
+ unique_paths = self._unique_everseen(extant_paths)
1655
+ return pathsep.join(unique_paths)
1656
+
1657
+ # from Python docs
1658
+ @staticmethod
1659
+ def _unique_everseen(iterable, key=None):
1660
+ """
1661
+ List unique elements, preserving order.
1662
+ Remember all elements ever seen.
1663
+
1664
+ _unique_everseen('AAAABBBCCDAABBB') --> A B C D
1665
+
1666
+ _unique_everseen('ABBCcAD', str.lower) --> A B C D
1667
+ """
1668
+ seen = set()
1669
+ seen_add = seen.add
1670
+ if key is None:
1671
+ for element in filterfalse(seen.__contains__, iterable):
1672
+ seen_add(element)
1673
+ yield element
1674
+ else:
1675
+ for element in iterable:
1676
+ k = key(element)
1677
+ if k not in seen:
1678
+ seen_add(k)
1679
+ yield element