cli-ih 0.6.2.1__py3-none-any.whl → 0.6.3.1__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 (424) hide show
  1. cli_ih/asyncClient.py +51 -21
  2. cli_ih/client.py +14 -7
  3. {cli_ih-0.6.2.1.dist-info → cli_ih-0.6.3.1.dist-info}/METADATA +1 -1
  4. cli_ih-0.6.3.1.dist-info/RECORD +425 -0
  5. {cli_ih-0.6.2.1.dist-info → cli_ih-0.6.3.1.dist-info}/WHEEL +1 -1
  6. {cli_ih-0.6.2.1.dist-info → cli_ih-0.6.3.1.dist-info}/top_level.txt +1 -0
  7. venv/Lib/site-packages/__editable___cli_ih_0_6_3_1_finder.py +85 -0
  8. venv/Lib/site-packages/pip/__init__.py +13 -0
  9. venv/Lib/site-packages/pip/__main__.py +24 -0
  10. venv/Lib/site-packages/pip/__pip-runner__.py +50 -0
  11. venv/Lib/site-packages/pip/_internal/__init__.py +18 -0
  12. venv/Lib/site-packages/pip/_internal/build_env.py +349 -0
  13. venv/Lib/site-packages/pip/_internal/cache.py +291 -0
  14. venv/Lib/site-packages/pip/_internal/cli/__init__.py +3 -0
  15. venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +184 -0
  16. venv/Lib/site-packages/pip/_internal/cli/base_command.py +244 -0
  17. venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +1138 -0
  18. venv/Lib/site-packages/pip/_internal/cli/command_context.py +28 -0
  19. venv/Lib/site-packages/pip/_internal/cli/index_command.py +175 -0
  20. venv/Lib/site-packages/pip/_internal/cli/main.py +80 -0
  21. venv/Lib/site-packages/pip/_internal/cli/main_parser.py +134 -0
  22. venv/Lib/site-packages/pip/_internal/cli/parser.py +298 -0
  23. venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +151 -0
  24. venv/Lib/site-packages/pip/_internal/cli/req_command.py +351 -0
  25. venv/Lib/site-packages/pip/_internal/cli/spinners.py +235 -0
  26. venv/Lib/site-packages/pip/_internal/cli/status_codes.py +6 -0
  27. venv/Lib/site-packages/pip/_internal/commands/__init__.py +139 -0
  28. venv/Lib/site-packages/pip/_internal/commands/cache.py +231 -0
  29. venv/Lib/site-packages/pip/_internal/commands/check.py +66 -0
  30. venv/Lib/site-packages/pip/_internal/commands/completion.py +135 -0
  31. venv/Lib/site-packages/pip/_internal/commands/configuration.py +288 -0
  32. venv/Lib/site-packages/pip/_internal/commands/debug.py +203 -0
  33. venv/Lib/site-packages/pip/_internal/commands/download.py +145 -0
  34. venv/Lib/site-packages/pip/_internal/commands/freeze.py +107 -0
  35. venv/Lib/site-packages/pip/_internal/commands/hash.py +58 -0
  36. venv/Lib/site-packages/pip/_internal/commands/help.py +40 -0
  37. venv/Lib/site-packages/pip/_internal/commands/index.py +159 -0
  38. venv/Lib/site-packages/pip/_internal/commands/inspect.py +92 -0
  39. venv/Lib/site-packages/pip/_internal/commands/install.py +798 -0
  40. venv/Lib/site-packages/pip/_internal/commands/list.py +400 -0
  41. venv/Lib/site-packages/pip/_internal/commands/lock.py +170 -0
  42. venv/Lib/site-packages/pip/_internal/commands/search.py +178 -0
  43. venv/Lib/site-packages/pip/_internal/commands/show.py +231 -0
  44. venv/Lib/site-packages/pip/_internal/commands/uninstall.py +113 -0
  45. venv/Lib/site-packages/pip/_internal/commands/wheel.py +181 -0
  46. venv/Lib/site-packages/pip/_internal/configuration.py +397 -0
  47. venv/Lib/site-packages/pip/_internal/distributions/__init__.py +21 -0
  48. venv/Lib/site-packages/pip/_internal/distributions/base.py +55 -0
  49. venv/Lib/site-packages/pip/_internal/distributions/installed.py +33 -0
  50. venv/Lib/site-packages/pip/_internal/distributions/sdist.py +165 -0
  51. venv/Lib/site-packages/pip/_internal/distributions/wheel.py +44 -0
  52. venv/Lib/site-packages/pip/_internal/exceptions.py +881 -0
  53. venv/Lib/site-packages/pip/_internal/index/__init__.py +1 -0
  54. venv/Lib/site-packages/pip/_internal/index/collector.py +489 -0
  55. venv/Lib/site-packages/pip/_internal/index/package_finder.py +1059 -0
  56. venv/Lib/site-packages/pip/_internal/index/sources.py +287 -0
  57. venv/Lib/site-packages/pip/_internal/locations/__init__.py +441 -0
  58. venv/Lib/site-packages/pip/_internal/locations/_distutils.py +173 -0
  59. venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py +215 -0
  60. venv/Lib/site-packages/pip/_internal/locations/base.py +82 -0
  61. venv/Lib/site-packages/pip/_internal/main.py +12 -0
  62. venv/Lib/site-packages/pip/_internal/metadata/__init__.py +164 -0
  63. venv/Lib/site-packages/pip/_internal/metadata/_json.py +87 -0
  64. venv/Lib/site-packages/pip/_internal/metadata/base.py +685 -0
  65. venv/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py +6 -0
  66. venv/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py +87 -0
  67. venv/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py +223 -0
  68. venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py +143 -0
  69. venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py +298 -0
  70. venv/Lib/site-packages/pip/_internal/models/__init__.py +1 -0
  71. venv/Lib/site-packages/pip/_internal/models/candidate.py +25 -0
  72. venv/Lib/site-packages/pip/_internal/models/direct_url.py +227 -0
  73. venv/Lib/site-packages/pip/_internal/models/format_control.py +78 -0
  74. venv/Lib/site-packages/pip/_internal/models/index.py +28 -0
  75. venv/Lib/site-packages/pip/_internal/models/installation_report.py +57 -0
  76. venv/Lib/site-packages/pip/_internal/models/link.py +613 -0
  77. venv/Lib/site-packages/pip/_internal/models/pylock.py +188 -0
  78. venv/Lib/site-packages/pip/_internal/models/scheme.py +25 -0
  79. venv/Lib/site-packages/pip/_internal/models/search_scope.py +126 -0
  80. venv/Lib/site-packages/pip/_internal/models/selection_prefs.py +53 -0
  81. venv/Lib/site-packages/pip/_internal/models/target_python.py +122 -0
  82. venv/Lib/site-packages/pip/_internal/models/wheel.py +141 -0
  83. venv/Lib/site-packages/pip/_internal/network/__init__.py +1 -0
  84. venv/Lib/site-packages/pip/_internal/network/auth.py +564 -0
  85. venv/Lib/site-packages/pip/_internal/network/cache.py +133 -0
  86. venv/Lib/site-packages/pip/_internal/network/download.py +342 -0
  87. venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py +213 -0
  88. venv/Lib/site-packages/pip/_internal/network/session.py +528 -0
  89. venv/Lib/site-packages/pip/_internal/network/utils.py +98 -0
  90. venv/Lib/site-packages/pip/_internal/network/xmlrpc.py +61 -0
  91. venv/Lib/site-packages/pip/_internal/operations/__init__.py +0 -0
  92. venv/Lib/site-packages/pip/_internal/operations/build/__init__.py +0 -0
  93. venv/Lib/site-packages/pip/_internal/operations/build/build_tracker.py +140 -0
  94. venv/Lib/site-packages/pip/_internal/operations/build/metadata.py +38 -0
  95. venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py +41 -0
  96. venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py +73 -0
  97. venv/Lib/site-packages/pip/_internal/operations/build/wheel.py +38 -0
  98. venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py +47 -0
  99. venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py +119 -0
  100. venv/Lib/site-packages/pip/_internal/operations/check.py +175 -0
  101. venv/Lib/site-packages/pip/_internal/operations/freeze.py +259 -0
  102. venv/Lib/site-packages/pip/_internal/operations/install/__init__.py +1 -0
  103. venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py +48 -0
  104. venv/Lib/site-packages/pip/_internal/operations/install/wheel.py +746 -0
  105. venv/Lib/site-packages/pip/_internal/operations/prepare.py +742 -0
  106. venv/Lib/site-packages/pip/_internal/pyproject.py +182 -0
  107. venv/Lib/site-packages/pip/_internal/req/__init__.py +105 -0
  108. venv/Lib/site-packages/pip/_internal/req/constructors.py +562 -0
  109. venv/Lib/site-packages/pip/_internal/req/req_dependency_group.py +75 -0
  110. venv/Lib/site-packages/pip/_internal/req/req_file.py +620 -0
  111. venv/Lib/site-packages/pip/_internal/req/req_install.py +937 -0
  112. venv/Lib/site-packages/pip/_internal/req/req_set.py +81 -0
  113. venv/Lib/site-packages/pip/_internal/req/req_uninstall.py +639 -0
  114. venv/Lib/site-packages/pip/_internal/resolution/__init__.py +0 -0
  115. venv/Lib/site-packages/pip/_internal/resolution/base.py +20 -0
  116. venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py +0 -0
  117. venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py +598 -0
  118. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py +0 -0
  119. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py +142 -0
  120. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +582 -0
  121. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +814 -0
  122. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +166 -0
  123. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py +276 -0
  124. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py +85 -0
  125. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py +247 -0
  126. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +336 -0
  127. venv/Lib/site-packages/pip/_internal/self_outdated_check.py +254 -0
  128. venv/Lib/site-packages/pip/_internal/utils/__init__.py +0 -0
  129. venv/Lib/site-packages/pip/_internal/utils/_jaraco_text.py +109 -0
  130. venv/Lib/site-packages/pip/_internal/utils/_log.py +38 -0
  131. venv/Lib/site-packages/pip/_internal/utils/appdirs.py +52 -0
  132. venv/Lib/site-packages/pip/_internal/utils/compat.py +85 -0
  133. venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py +201 -0
  134. venv/Lib/site-packages/pip/_internal/utils/datetime.py +10 -0
  135. venv/Lib/site-packages/pip/_internal/utils/deprecation.py +126 -0
  136. venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py +87 -0
  137. venv/Lib/site-packages/pip/_internal/utils/egg_link.py +81 -0
  138. venv/Lib/site-packages/pip/_internal/utils/entrypoints.py +88 -0
  139. venv/Lib/site-packages/pip/_internal/utils/filesystem.py +152 -0
  140. venv/Lib/site-packages/pip/_internal/utils/filetypes.py +24 -0
  141. venv/Lib/site-packages/pip/_internal/utils/glibc.py +102 -0
  142. venv/Lib/site-packages/pip/_internal/utils/hashes.py +150 -0
  143. venv/Lib/site-packages/pip/_internal/utils/logging.py +364 -0
  144. venv/Lib/site-packages/pip/_internal/utils/misc.py +765 -0
  145. venv/Lib/site-packages/pip/_internal/utils/packaging.py +44 -0
  146. venv/Lib/site-packages/pip/_internal/utils/retry.py +45 -0
  147. venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py +149 -0
  148. venv/Lib/site-packages/pip/_internal/utils/subprocess.py +248 -0
  149. venv/Lib/site-packages/pip/_internal/utils/temp_dir.py +294 -0
  150. venv/Lib/site-packages/pip/_internal/utils/unpacking.py +337 -0
  151. venv/Lib/site-packages/pip/_internal/utils/urls.py +55 -0
  152. venv/Lib/site-packages/pip/_internal/utils/virtualenv.py +105 -0
  153. venv/Lib/site-packages/pip/_internal/utils/wheel.py +132 -0
  154. venv/Lib/site-packages/pip/_internal/vcs/__init__.py +15 -0
  155. venv/Lib/site-packages/pip/_internal/vcs/bazaar.py +130 -0
  156. venv/Lib/site-packages/pip/_internal/vcs/git.py +571 -0
  157. venv/Lib/site-packages/pip/_internal/vcs/mercurial.py +186 -0
  158. venv/Lib/site-packages/pip/_internal/vcs/subversion.py +335 -0
  159. venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py +693 -0
  160. venv/Lib/site-packages/pip/_internal/wheel_builder.py +334 -0
  161. venv/Lib/site-packages/pip/_vendor/__init__.py +117 -0
  162. venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py +29 -0
  163. venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py +70 -0
  164. venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py +168 -0
  165. venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py +75 -0
  166. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +8 -0
  167. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +145 -0
  168. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +48 -0
  169. venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py +511 -0
  170. venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py +119 -0
  171. venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py +157 -0
  172. venv/Lib/site-packages/pip/_vendor/cachecontrol/py.typed +0 -0
  173. venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py +146 -0
  174. venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py +43 -0
  175. venv/Lib/site-packages/pip/_vendor/certifi/__init__.py +4 -0
  176. venv/Lib/site-packages/pip/_vendor/certifi/__main__.py +12 -0
  177. venv/Lib/site-packages/pip/_vendor/certifi/core.py +83 -0
  178. venv/Lib/site-packages/pip/_vendor/certifi/py.typed +0 -0
  179. venv/Lib/site-packages/pip/_vendor/dependency_groups/__init__.py +13 -0
  180. venv/Lib/site-packages/pip/_vendor/dependency_groups/__main__.py +65 -0
  181. venv/Lib/site-packages/pip/_vendor/dependency_groups/_implementation.py +209 -0
  182. venv/Lib/site-packages/pip/_vendor/dependency_groups/_lint_dependency_groups.py +59 -0
  183. venv/Lib/site-packages/pip/_vendor/dependency_groups/_pip_wrapper.py +62 -0
  184. venv/Lib/site-packages/pip/_vendor/dependency_groups/_toml_compat.py +9 -0
  185. venv/Lib/site-packages/pip/_vendor/dependency_groups/py.typed +0 -0
  186. venv/Lib/site-packages/pip/_vendor/distlib/__init__.py +33 -0
  187. venv/Lib/site-packages/pip/_vendor/distlib/compat.py +1137 -0
  188. venv/Lib/site-packages/pip/_vendor/distlib/resources.py +358 -0
  189. venv/Lib/site-packages/pip/_vendor/distlib/scripts.py +447 -0
  190. venv/Lib/site-packages/pip/_vendor/distlib/util.py +1984 -0
  191. venv/Lib/site-packages/pip/_vendor/distro/__init__.py +54 -0
  192. venv/Lib/site-packages/pip/_vendor/distro/__main__.py +4 -0
  193. venv/Lib/site-packages/pip/_vendor/distro/distro.py +1403 -0
  194. venv/Lib/site-packages/pip/_vendor/distro/py.typed +0 -0
  195. venv/Lib/site-packages/pip/_vendor/idna/__init__.py +45 -0
  196. venv/Lib/site-packages/pip/_vendor/idna/codec.py +122 -0
  197. venv/Lib/site-packages/pip/_vendor/idna/compat.py +15 -0
  198. venv/Lib/site-packages/pip/_vendor/idna/core.py +437 -0
  199. venv/Lib/site-packages/pip/_vendor/idna/idnadata.py +4243 -0
  200. venv/Lib/site-packages/pip/_vendor/idna/intranges.py +57 -0
  201. venv/Lib/site-packages/pip/_vendor/idna/package_data.py +1 -0
  202. venv/Lib/site-packages/pip/_vendor/idna/py.typed +0 -0
  203. venv/Lib/site-packages/pip/_vendor/idna/uts46data.py +8681 -0
  204. venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py +55 -0
  205. venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py +48 -0
  206. venv/Lib/site-packages/pip/_vendor/msgpack/ext.py +170 -0
  207. venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py +929 -0
  208. venv/Lib/site-packages/pip/_vendor/packaging/__init__.py +15 -0
  209. venv/Lib/site-packages/pip/_vendor/packaging/_elffile.py +109 -0
  210. venv/Lib/site-packages/pip/_vendor/packaging/_manylinux.py +262 -0
  211. venv/Lib/site-packages/pip/_vendor/packaging/_musllinux.py +85 -0
  212. venv/Lib/site-packages/pip/_vendor/packaging/_parser.py +353 -0
  213. venv/Lib/site-packages/pip/_vendor/packaging/_structures.py +61 -0
  214. venv/Lib/site-packages/pip/_vendor/packaging/_tokenizer.py +195 -0
  215. venv/Lib/site-packages/pip/_vendor/packaging/licenses/__init__.py +145 -0
  216. venv/Lib/site-packages/pip/_vendor/packaging/licenses/_spdx.py +759 -0
  217. venv/Lib/site-packages/pip/_vendor/packaging/markers.py +362 -0
  218. venv/Lib/site-packages/pip/_vendor/packaging/metadata.py +862 -0
  219. venv/Lib/site-packages/pip/_vendor/packaging/py.typed +0 -0
  220. venv/Lib/site-packages/pip/_vendor/packaging/requirements.py +91 -0
  221. venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py +1019 -0
  222. venv/Lib/site-packages/pip/_vendor/packaging/tags.py +656 -0
  223. venv/Lib/site-packages/pip/_vendor/packaging/utils.py +163 -0
  224. venv/Lib/site-packages/pip/_vendor/packaging/version.py +582 -0
  225. venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py +3676 -0
  226. venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py +631 -0
  227. venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py +55 -0
  228. venv/Lib/site-packages/pip/_vendor/platformdirs/android.py +249 -0
  229. venv/Lib/site-packages/pip/_vendor/platformdirs/api.py +299 -0
  230. venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py +144 -0
  231. venv/Lib/site-packages/pip/_vendor/platformdirs/py.typed +0 -0
  232. venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py +272 -0
  233. venv/Lib/site-packages/pip/_vendor/platformdirs/version.py +21 -0
  234. venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py +272 -0
  235. venv/Lib/site-packages/pip/_vendor/pygments/__init__.py +82 -0
  236. venv/Lib/site-packages/pip/_vendor/pygments/__main__.py +17 -0
  237. venv/Lib/site-packages/pip/_vendor/pygments/console.py +70 -0
  238. venv/Lib/site-packages/pip/_vendor/pygments/filter.py +70 -0
  239. venv/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py +940 -0
  240. venv/Lib/site-packages/pip/_vendor/pygments/formatter.py +129 -0
  241. venv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py +157 -0
  242. venv/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py +23 -0
  243. venv/Lib/site-packages/pip/_vendor/pygments/lexer.py +963 -0
  244. venv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py +362 -0
  245. venv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py +602 -0
  246. venv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py +1201 -0
  247. venv/Lib/site-packages/pip/_vendor/pygments/modeline.py +43 -0
  248. venv/Lib/site-packages/pip/_vendor/pygments/plugin.py +72 -0
  249. venv/Lib/site-packages/pip/_vendor/pygments/regexopt.py +91 -0
  250. venv/Lib/site-packages/pip/_vendor/pygments/scanner.py +104 -0
  251. venv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py +247 -0
  252. venv/Lib/site-packages/pip/_vendor/pygments/style.py +203 -0
  253. venv/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py +61 -0
  254. venv/Lib/site-packages/pip/_vendor/pygments/styles/_mapping.py +54 -0
  255. venv/Lib/site-packages/pip/_vendor/pygments/token.py +214 -0
  256. venv/Lib/site-packages/pip/_vendor/pygments/unistring.py +153 -0
  257. venv/Lib/site-packages/pip/_vendor/pygments/util.py +324 -0
  258. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__init__.py +31 -0
  259. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_impl.py +410 -0
  260. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py +21 -0
  261. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py +389 -0
  262. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/py.typed +0 -0
  263. venv/Lib/site-packages/pip/_vendor/requests/__init__.py +179 -0
  264. venv/Lib/site-packages/pip/_vendor/requests/__version__.py +14 -0
  265. venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py +50 -0
  266. venv/Lib/site-packages/pip/_vendor/requests/adapters.py +719 -0
  267. venv/Lib/site-packages/pip/_vendor/requests/api.py +157 -0
  268. venv/Lib/site-packages/pip/_vendor/requests/auth.py +314 -0
  269. venv/Lib/site-packages/pip/_vendor/requests/certs.py +17 -0
  270. venv/Lib/site-packages/pip/_vendor/requests/compat.py +90 -0
  271. venv/Lib/site-packages/pip/_vendor/requests/cookies.py +561 -0
  272. venv/Lib/site-packages/pip/_vendor/requests/exceptions.py +151 -0
  273. venv/Lib/site-packages/pip/_vendor/requests/help.py +127 -0
  274. venv/Lib/site-packages/pip/_vendor/requests/hooks.py +33 -0
  275. venv/Lib/site-packages/pip/_vendor/requests/models.py +1039 -0
  276. venv/Lib/site-packages/pip/_vendor/requests/packages.py +25 -0
  277. venv/Lib/site-packages/pip/_vendor/requests/sessions.py +831 -0
  278. venv/Lib/site-packages/pip/_vendor/requests/status_codes.py +128 -0
  279. venv/Lib/site-packages/pip/_vendor/requests/structures.py +99 -0
  280. venv/Lib/site-packages/pip/_vendor/requests/utils.py +1086 -0
  281. venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py +27 -0
  282. venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py +196 -0
  283. venv/Lib/site-packages/pip/_vendor/resolvelib/py.typed +0 -0
  284. venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py +55 -0
  285. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/__init__.py +27 -0
  286. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/abstract.py +47 -0
  287. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/criterion.py +48 -0
  288. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/exceptions.py +57 -0
  289. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py +622 -0
  290. venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py +209 -0
  291. venv/Lib/site-packages/pip/_vendor/rich/__init__.py +177 -0
  292. venv/Lib/site-packages/pip/_vendor/rich/__main__.py +245 -0
  293. venv/Lib/site-packages/pip/_vendor/rich/_cell_widths.py +454 -0
  294. venv/Lib/site-packages/pip/_vendor/rich/_emoji_codes.py +3610 -0
  295. venv/Lib/site-packages/pip/_vendor/rich/_emoji_replace.py +32 -0
  296. venv/Lib/site-packages/pip/_vendor/rich/_export_format.py +76 -0
  297. venv/Lib/site-packages/pip/_vendor/rich/_extension.py +10 -0
  298. venv/Lib/site-packages/pip/_vendor/rich/_fileno.py +24 -0
  299. venv/Lib/site-packages/pip/_vendor/rich/_inspect.py +268 -0
  300. venv/Lib/site-packages/pip/_vendor/rich/_log_render.py +94 -0
  301. venv/Lib/site-packages/pip/_vendor/rich/_loop.py +43 -0
  302. venv/Lib/site-packages/pip/_vendor/rich/_null_file.py +69 -0
  303. venv/Lib/site-packages/pip/_vendor/rich/_palettes.py +309 -0
  304. venv/Lib/site-packages/pip/_vendor/rich/_pick.py +17 -0
  305. venv/Lib/site-packages/pip/_vendor/rich/_ratio.py +153 -0
  306. venv/Lib/site-packages/pip/_vendor/rich/_spinners.py +482 -0
  307. venv/Lib/site-packages/pip/_vendor/rich/_stack.py +16 -0
  308. venv/Lib/site-packages/pip/_vendor/rich/_timer.py +19 -0
  309. venv/Lib/site-packages/pip/_vendor/rich/_win32_console.py +661 -0
  310. venv/Lib/site-packages/pip/_vendor/rich/_windows.py +71 -0
  311. venv/Lib/site-packages/pip/_vendor/rich/_windows_renderer.py +56 -0
  312. venv/Lib/site-packages/pip/_vendor/rich/_wrap.py +93 -0
  313. venv/Lib/site-packages/pip/_vendor/rich/abc.py +33 -0
  314. venv/Lib/site-packages/pip/_vendor/rich/align.py +306 -0
  315. venv/Lib/site-packages/pip/_vendor/rich/ansi.py +241 -0
  316. venv/Lib/site-packages/pip/_vendor/rich/bar.py +93 -0
  317. venv/Lib/site-packages/pip/_vendor/rich/box.py +474 -0
  318. venv/Lib/site-packages/pip/_vendor/rich/cells.py +174 -0
  319. venv/Lib/site-packages/pip/_vendor/rich/color.py +621 -0
  320. venv/Lib/site-packages/pip/_vendor/rich/color_triplet.py +38 -0
  321. venv/Lib/site-packages/pip/_vendor/rich/columns.py +187 -0
  322. venv/Lib/site-packages/pip/_vendor/rich/console.py +2680 -0
  323. venv/Lib/site-packages/pip/_vendor/rich/constrain.py +37 -0
  324. venv/Lib/site-packages/pip/_vendor/rich/containers.py +167 -0
  325. venv/Lib/site-packages/pip/_vendor/rich/control.py +219 -0
  326. venv/Lib/site-packages/pip/_vendor/rich/default_styles.py +193 -0
  327. venv/Lib/site-packages/pip/_vendor/rich/diagnose.py +39 -0
  328. venv/Lib/site-packages/pip/_vendor/rich/emoji.py +91 -0
  329. venv/Lib/site-packages/pip/_vendor/rich/errors.py +34 -0
  330. venv/Lib/site-packages/pip/_vendor/rich/file_proxy.py +57 -0
  331. venv/Lib/site-packages/pip/_vendor/rich/filesize.py +88 -0
  332. venv/Lib/site-packages/pip/_vendor/rich/highlighter.py +232 -0
  333. venv/Lib/site-packages/pip/_vendor/rich/json.py +139 -0
  334. venv/Lib/site-packages/pip/_vendor/rich/jupyter.py +101 -0
  335. venv/Lib/site-packages/pip/_vendor/rich/layout.py +442 -0
  336. venv/Lib/site-packages/pip/_vendor/rich/live.py +400 -0
  337. venv/Lib/site-packages/pip/_vendor/rich/live_render.py +106 -0
  338. venv/Lib/site-packages/pip/_vendor/rich/logging.py +297 -0
  339. venv/Lib/site-packages/pip/_vendor/rich/markup.py +251 -0
  340. venv/Lib/site-packages/pip/_vendor/rich/measure.py +151 -0
  341. venv/Lib/site-packages/pip/_vendor/rich/padding.py +141 -0
  342. venv/Lib/site-packages/pip/_vendor/rich/pager.py +34 -0
  343. venv/Lib/site-packages/pip/_vendor/rich/palette.py +100 -0
  344. venv/Lib/site-packages/pip/_vendor/rich/panel.py +317 -0
  345. venv/Lib/site-packages/pip/_vendor/rich/pretty.py +1016 -0
  346. venv/Lib/site-packages/pip/_vendor/rich/progress.py +1715 -0
  347. venv/Lib/site-packages/pip/_vendor/rich/progress_bar.py +223 -0
  348. venv/Lib/site-packages/pip/_vendor/rich/prompt.py +400 -0
  349. venv/Lib/site-packages/pip/_vendor/rich/protocol.py +42 -0
  350. venv/Lib/site-packages/pip/_vendor/rich/py.typed +0 -0
  351. venv/Lib/site-packages/pip/_vendor/rich/region.py +10 -0
  352. venv/Lib/site-packages/pip/_vendor/rich/repr.py +149 -0
  353. venv/Lib/site-packages/pip/_vendor/rich/rule.py +130 -0
  354. venv/Lib/site-packages/pip/_vendor/rich/scope.py +86 -0
  355. venv/Lib/site-packages/pip/_vendor/rich/screen.py +54 -0
  356. venv/Lib/site-packages/pip/_vendor/rich/segment.py +752 -0
  357. venv/Lib/site-packages/pip/_vendor/rich/spinner.py +132 -0
  358. venv/Lib/site-packages/pip/_vendor/rich/status.py +131 -0
  359. venv/Lib/site-packages/pip/_vendor/rich/style.py +796 -0
  360. venv/Lib/site-packages/pip/_vendor/rich/styled.py +42 -0
  361. venv/Lib/site-packages/pip/_vendor/rich/syntax.py +985 -0
  362. venv/Lib/site-packages/pip/_vendor/rich/table.py +1006 -0
  363. venv/Lib/site-packages/pip/_vendor/rich/terminal_theme.py +153 -0
  364. venv/Lib/site-packages/pip/_vendor/rich/text.py +1361 -0
  365. venv/Lib/site-packages/pip/_vendor/rich/theme.py +115 -0
  366. venv/Lib/site-packages/pip/_vendor/rich/themes.py +5 -0
  367. venv/Lib/site-packages/pip/_vendor/rich/traceback.py +899 -0
  368. venv/Lib/site-packages/pip/_vendor/rich/tree.py +257 -0
  369. venv/Lib/site-packages/pip/_vendor/tomli/__init__.py +8 -0
  370. venv/Lib/site-packages/pip/_vendor/tomli/_parser.py +770 -0
  371. venv/Lib/site-packages/pip/_vendor/tomli/_re.py +112 -0
  372. venv/Lib/site-packages/pip/_vendor/tomli/_types.py +10 -0
  373. venv/Lib/site-packages/pip/_vendor/tomli/py.typed +1 -0
  374. venv/Lib/site-packages/pip/_vendor/tomli_w/__init__.py +4 -0
  375. venv/Lib/site-packages/pip/_vendor/tomli_w/_writer.py +229 -0
  376. venv/Lib/site-packages/pip/_vendor/tomli_w/py.typed +1 -0
  377. venv/Lib/site-packages/pip/_vendor/truststore/__init__.py +36 -0
  378. venv/Lib/site-packages/pip/_vendor/truststore/_api.py +333 -0
  379. venv/Lib/site-packages/pip/_vendor/truststore/_macos.py +571 -0
  380. venv/Lib/site-packages/pip/_vendor/truststore/_openssl.py +66 -0
  381. venv/Lib/site-packages/pip/_vendor/truststore/_ssl_constants.py +31 -0
  382. venv/Lib/site-packages/pip/_vendor/truststore/_windows.py +567 -0
  383. venv/Lib/site-packages/pip/_vendor/truststore/py.typed +0 -0
  384. venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py +102 -0
  385. venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py +355 -0
  386. venv/Lib/site-packages/pip/_vendor/urllib3/_version.py +2 -0
  387. venv/Lib/site-packages/pip/_vendor/urllib3/connection.py +572 -0
  388. venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py +1140 -0
  389. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py +0 -0
  390. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py +36 -0
  391. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +0 -0
  392. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +519 -0
  393. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +397 -0
  394. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py +314 -0
  395. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +130 -0
  396. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +518 -0
  397. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +920 -0
  398. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py +216 -0
  399. venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py +323 -0
  400. venv/Lib/site-packages/pip/_vendor/urllib3/fields.py +274 -0
  401. venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py +98 -0
  402. venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py +0 -0
  403. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py +0 -0
  404. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +51 -0
  405. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py +155 -0
  406. venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py +1076 -0
  407. venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py +540 -0
  408. venv/Lib/site-packages/pip/_vendor/urllib3/request.py +191 -0
  409. venv/Lib/site-packages/pip/_vendor/urllib3/response.py +879 -0
  410. venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py +49 -0
  411. venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py +149 -0
  412. venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py +57 -0
  413. venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py +22 -0
  414. venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py +137 -0
  415. venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py +107 -0
  416. venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py +622 -0
  417. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py +504 -0
  418. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py +159 -0
  419. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py +221 -0
  420. venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py +271 -0
  421. venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py +435 -0
  422. venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py +152 -0
  423. venv/Lib/site-packages/pip/py.typed +4 -0
  424. cli_ih-0.6.2.1.dist-info/RECORD +0 -8
@@ -0,0 +1,294 @@
1
+ from __future__ import annotations
2
+
3
+ import errno
4
+ import itertools
5
+ import logging
6
+ import os.path
7
+ import tempfile
8
+ import traceback
9
+ from collections.abc import Generator
10
+ from contextlib import ExitStack, contextmanager
11
+ from pathlib import Path
12
+ from typing import (
13
+ Any,
14
+ Callable,
15
+ TypeVar,
16
+ )
17
+
18
+ from pip._internal.utils.misc import enum, rmtree
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+ _T = TypeVar("_T", bound="TempDirectory")
23
+
24
+
25
+ # Kinds of temporary directories. Only needed for ones that are
26
+ # globally-managed.
27
+ tempdir_kinds = enum(
28
+ BUILD_ENV="build-env",
29
+ EPHEM_WHEEL_CACHE="ephem-wheel-cache",
30
+ REQ_BUILD="req-build",
31
+ )
32
+
33
+
34
+ _tempdir_manager: ExitStack | None = None
35
+
36
+
37
+ @contextmanager
38
+ def global_tempdir_manager() -> Generator[None, None, None]:
39
+ global _tempdir_manager
40
+ with ExitStack() as stack:
41
+ old_tempdir_manager, _tempdir_manager = _tempdir_manager, stack
42
+ try:
43
+ yield
44
+ finally:
45
+ _tempdir_manager = old_tempdir_manager
46
+
47
+
48
+ class TempDirectoryTypeRegistry:
49
+ """Manages temp directory behavior"""
50
+
51
+ def __init__(self) -> None:
52
+ self._should_delete: dict[str, bool] = {}
53
+
54
+ def set_delete(self, kind: str, value: bool) -> None:
55
+ """Indicate whether a TempDirectory of the given kind should be
56
+ auto-deleted.
57
+ """
58
+ self._should_delete[kind] = value
59
+
60
+ def get_delete(self, kind: str) -> bool:
61
+ """Get configured auto-delete flag for a given TempDirectory type,
62
+ default True.
63
+ """
64
+ return self._should_delete.get(kind, True)
65
+
66
+
67
+ _tempdir_registry: TempDirectoryTypeRegistry | None = None
68
+
69
+
70
+ @contextmanager
71
+ def tempdir_registry() -> Generator[TempDirectoryTypeRegistry, None, None]:
72
+ """Provides a scoped global tempdir registry that can be used to dictate
73
+ whether directories should be deleted.
74
+ """
75
+ global _tempdir_registry
76
+ old_tempdir_registry = _tempdir_registry
77
+ _tempdir_registry = TempDirectoryTypeRegistry()
78
+ try:
79
+ yield _tempdir_registry
80
+ finally:
81
+ _tempdir_registry = old_tempdir_registry
82
+
83
+
84
+ class _Default:
85
+ pass
86
+
87
+
88
+ _default = _Default()
89
+
90
+
91
+ class TempDirectory:
92
+ """Helper class that owns and cleans up a temporary directory.
93
+
94
+ This class can be used as a context manager or as an OO representation of a
95
+ temporary directory.
96
+
97
+ Attributes:
98
+ path
99
+ Location to the created temporary directory
100
+ delete
101
+ Whether the directory should be deleted when exiting
102
+ (when used as a contextmanager)
103
+
104
+ Methods:
105
+ cleanup()
106
+ Deletes the temporary directory
107
+
108
+ When used as a context manager, if the delete attribute is True, on
109
+ exiting the context the temporary directory is deleted.
110
+ """
111
+
112
+ def __init__(
113
+ self,
114
+ path: str | None = None,
115
+ delete: bool | None | _Default = _default,
116
+ kind: str = "temp",
117
+ globally_managed: bool = False,
118
+ ignore_cleanup_errors: bool = True,
119
+ ):
120
+ super().__init__()
121
+
122
+ if delete is _default:
123
+ if path is not None:
124
+ # If we were given an explicit directory, resolve delete option
125
+ # now.
126
+ delete = False
127
+ else:
128
+ # Otherwise, we wait until cleanup and see what
129
+ # tempdir_registry says.
130
+ delete = None
131
+
132
+ # The only time we specify path is in for editables where it
133
+ # is the value of the --src option.
134
+ if path is None:
135
+ path = self._create(kind)
136
+
137
+ self._path = path
138
+ self._deleted = False
139
+ self.delete = delete
140
+ self.kind = kind
141
+ self.ignore_cleanup_errors = ignore_cleanup_errors
142
+
143
+ if globally_managed:
144
+ assert _tempdir_manager is not None
145
+ _tempdir_manager.enter_context(self)
146
+
147
+ @property
148
+ def path(self) -> str:
149
+ assert not self._deleted, f"Attempted to access deleted path: {self._path}"
150
+ return self._path
151
+
152
+ def __repr__(self) -> str:
153
+ return f"<{self.__class__.__name__} {self.path!r}>"
154
+
155
+ def __enter__(self: _T) -> _T:
156
+ return self
157
+
158
+ def __exit__(self, exc: Any, value: Any, tb: Any) -> None:
159
+ if self.delete is not None:
160
+ delete = self.delete
161
+ elif _tempdir_registry:
162
+ delete = _tempdir_registry.get_delete(self.kind)
163
+ else:
164
+ delete = True
165
+
166
+ if delete:
167
+ self.cleanup()
168
+
169
+ def _create(self, kind: str) -> str:
170
+ """Create a temporary directory and store its path in self.path"""
171
+ # We realpath here because some systems have their default tmpdir
172
+ # symlinked to another directory. This tends to confuse build
173
+ # scripts, so we canonicalize the path by traversing potential
174
+ # symlinks here.
175
+ path = os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-"))
176
+ logger.debug("Created temporary directory: %s", path)
177
+ return path
178
+
179
+ def cleanup(self) -> None:
180
+ """Remove the temporary directory created and reset state"""
181
+ self._deleted = True
182
+ if not os.path.exists(self._path):
183
+ return
184
+
185
+ errors: list[BaseException] = []
186
+
187
+ def onerror(
188
+ func: Callable[..., Any],
189
+ path: Path,
190
+ exc_val: BaseException,
191
+ ) -> None:
192
+ """Log a warning for a `rmtree` error and continue"""
193
+ formatted_exc = "\n".join(
194
+ traceback.format_exception_only(type(exc_val), exc_val)
195
+ )
196
+ formatted_exc = formatted_exc.rstrip() # remove trailing new line
197
+ if func in (os.unlink, os.remove, os.rmdir):
198
+ logger.debug(
199
+ "Failed to remove a temporary file '%s' due to %s.\n",
200
+ path,
201
+ formatted_exc,
202
+ )
203
+ else:
204
+ logger.debug("%s failed with %s.", func.__qualname__, formatted_exc)
205
+ errors.append(exc_val)
206
+
207
+ if self.ignore_cleanup_errors:
208
+ try:
209
+ # first try with @retry; retrying to handle ephemeral errors
210
+ rmtree(self._path, ignore_errors=False)
211
+ except OSError:
212
+ # last pass ignore/log all errors
213
+ rmtree(self._path, onexc=onerror)
214
+ if errors:
215
+ logger.warning(
216
+ "Failed to remove contents in a temporary directory '%s'.\n"
217
+ "You can safely remove it manually.",
218
+ self._path,
219
+ )
220
+ else:
221
+ rmtree(self._path)
222
+
223
+
224
+ class AdjacentTempDirectory(TempDirectory):
225
+ """Helper class that creates a temporary directory adjacent to a real one.
226
+
227
+ Attributes:
228
+ original
229
+ The original directory to create a temp directory for.
230
+ path
231
+ After calling create() or entering, contains the full
232
+ path to the temporary directory.
233
+ delete
234
+ Whether the directory should be deleted when exiting
235
+ (when used as a contextmanager)
236
+
237
+ """
238
+
239
+ # The characters that may be used to name the temp directory
240
+ # We always prepend a ~ and then rotate through these until
241
+ # a usable name is found.
242
+ # pkg_resources raises a different error for .dist-info folder
243
+ # with leading '-' and invalid metadata
244
+ LEADING_CHARS = "-~.=%0123456789"
245
+
246
+ def __init__(self, original: str, delete: bool | None = None) -> None:
247
+ self.original = original.rstrip("/\\")
248
+ super().__init__(delete=delete)
249
+
250
+ @classmethod
251
+ def _generate_names(cls, name: str) -> Generator[str, None, None]:
252
+ """Generates a series of temporary names.
253
+
254
+ The algorithm replaces the leading characters in the name
255
+ with ones that are valid filesystem characters, but are not
256
+ valid package names (for both Python and pip definitions of
257
+ package).
258
+ """
259
+ for i in range(1, len(name)):
260
+ for candidate in itertools.combinations_with_replacement(
261
+ cls.LEADING_CHARS, i - 1
262
+ ):
263
+ new_name = "~" + "".join(candidate) + name[i:]
264
+ if new_name != name:
265
+ yield new_name
266
+
267
+ # If we make it this far, we will have to make a longer name
268
+ for i in range(len(cls.LEADING_CHARS)):
269
+ for candidate in itertools.combinations_with_replacement(
270
+ cls.LEADING_CHARS, i
271
+ ):
272
+ new_name = "~" + "".join(candidate) + name
273
+ if new_name != name:
274
+ yield new_name
275
+
276
+ def _create(self, kind: str) -> str:
277
+ root, name = os.path.split(self.original)
278
+ for candidate in self._generate_names(name):
279
+ path = os.path.join(root, candidate)
280
+ try:
281
+ os.mkdir(path)
282
+ except OSError as ex:
283
+ # Continue if the name exists already
284
+ if ex.errno != errno.EEXIST:
285
+ raise
286
+ else:
287
+ path = os.path.realpath(path)
288
+ break
289
+ else:
290
+ # Final fallback on the default behavior.
291
+ path = os.path.realpath(tempfile.mkdtemp(prefix=f"pip-{kind}-"))
292
+
293
+ logger.debug("Created temporary directory: %s", path)
294
+ return path
@@ -0,0 +1,337 @@
1
+ """Utilities related archives."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import logging
6
+ import os
7
+ import shutil
8
+ import stat
9
+ import sys
10
+ import tarfile
11
+ import zipfile
12
+ from collections.abc import Iterable
13
+ from zipfile import ZipInfo
14
+
15
+ from pip._internal.exceptions import InstallationError
16
+ from pip._internal.utils.filetypes import (
17
+ BZ2_EXTENSIONS,
18
+ TAR_EXTENSIONS,
19
+ XZ_EXTENSIONS,
20
+ ZIP_EXTENSIONS,
21
+ )
22
+ from pip._internal.utils.misc import ensure_dir
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+
27
+ SUPPORTED_EXTENSIONS = ZIP_EXTENSIONS + TAR_EXTENSIONS
28
+
29
+ try:
30
+ import bz2 # noqa
31
+
32
+ SUPPORTED_EXTENSIONS += BZ2_EXTENSIONS
33
+ except ImportError:
34
+ logger.debug("bz2 module is not available")
35
+
36
+ try:
37
+ # Only for Python 3.3+
38
+ import lzma # noqa
39
+
40
+ SUPPORTED_EXTENSIONS += XZ_EXTENSIONS
41
+ except ImportError:
42
+ logger.debug("lzma module is not available")
43
+
44
+
45
+ def current_umask() -> int:
46
+ """Get the current umask which involves having to set it temporarily."""
47
+ mask = os.umask(0)
48
+ os.umask(mask)
49
+ return mask
50
+
51
+
52
+ def split_leading_dir(path: str) -> list[str]:
53
+ path = path.lstrip("/").lstrip("\\")
54
+ if "/" in path and (
55
+ ("\\" in path and path.find("/") < path.find("\\")) or "\\" not in path
56
+ ):
57
+ return path.split("/", 1)
58
+ elif "\\" in path:
59
+ return path.split("\\", 1)
60
+ else:
61
+ return [path, ""]
62
+
63
+
64
+ def has_leading_dir(paths: Iterable[str]) -> bool:
65
+ """Returns true if all the paths have the same leading path name
66
+ (i.e., everything is in one subdirectory in an archive)"""
67
+ common_prefix = None
68
+ for path in paths:
69
+ prefix, rest = split_leading_dir(path)
70
+ if not prefix:
71
+ return False
72
+ elif common_prefix is None:
73
+ common_prefix = prefix
74
+ elif prefix != common_prefix:
75
+ return False
76
+ return True
77
+
78
+
79
+ def is_within_directory(directory: str, target: str) -> bool:
80
+ """
81
+ Return true if the absolute path of target is within the directory
82
+ """
83
+ abs_directory = os.path.abspath(directory)
84
+ abs_target = os.path.abspath(target)
85
+
86
+ prefix = os.path.commonprefix([abs_directory, abs_target])
87
+ return prefix == abs_directory
88
+
89
+
90
+ def _get_default_mode_plus_executable() -> int:
91
+ return 0o777 & ~current_umask() | 0o111
92
+
93
+
94
+ def set_extracted_file_to_default_mode_plus_executable(path: str) -> None:
95
+ """
96
+ Make file present at path have execute for user/group/world
97
+ (chmod +x) is no-op on windows per python docs
98
+ """
99
+ os.chmod(path, _get_default_mode_plus_executable())
100
+
101
+
102
+ def zip_item_is_executable(info: ZipInfo) -> bool:
103
+ mode = info.external_attr >> 16
104
+ # if mode and regular file and any execute permissions for
105
+ # user/group/world?
106
+ return bool(mode and stat.S_ISREG(mode) and mode & 0o111)
107
+
108
+
109
+ def unzip_file(filename: str, location: str, flatten: bool = True) -> None:
110
+ """
111
+ Unzip the file (with path `filename`) to the destination `location`. All
112
+ files are written based on system defaults and umask (i.e. permissions are
113
+ not preserved), except that regular file members with any execute
114
+ permissions (user, group, or world) have "chmod +x" applied after being
115
+ written. Note that for windows, any execute changes using os.chmod are
116
+ no-ops per the python docs.
117
+ """
118
+ ensure_dir(location)
119
+ zipfp = open(filename, "rb")
120
+ try:
121
+ zip = zipfile.ZipFile(zipfp, allowZip64=True)
122
+ leading = has_leading_dir(zip.namelist()) and flatten
123
+ for info in zip.infolist():
124
+ name = info.filename
125
+ fn = name
126
+ if leading:
127
+ fn = split_leading_dir(name)[1]
128
+ fn = os.path.join(location, fn)
129
+ dir = os.path.dirname(fn)
130
+ if not is_within_directory(location, fn):
131
+ message = (
132
+ "The zip file ({}) has a file ({}) trying to install "
133
+ "outside target directory ({})"
134
+ )
135
+ raise InstallationError(message.format(filename, fn, location))
136
+ if fn.endswith(("/", "\\")):
137
+ # A directory
138
+ ensure_dir(fn)
139
+ else:
140
+ ensure_dir(dir)
141
+ # Don't use read() to avoid allocating an arbitrarily large
142
+ # chunk of memory for the file's content
143
+ fp = zip.open(name)
144
+ try:
145
+ with open(fn, "wb") as destfp:
146
+ shutil.copyfileobj(fp, destfp)
147
+ finally:
148
+ fp.close()
149
+ if zip_item_is_executable(info):
150
+ set_extracted_file_to_default_mode_plus_executable(fn)
151
+ finally:
152
+ zipfp.close()
153
+
154
+
155
+ def untar_file(filename: str, location: str) -> None:
156
+ """
157
+ Untar the file (with path `filename`) to the destination `location`.
158
+ All files are written based on system defaults and umask (i.e. permissions
159
+ are not preserved), except that regular file members with any execute
160
+ permissions (user, group, or world) have "chmod +x" applied on top of the
161
+ default. Note that for windows, any execute changes using os.chmod are
162
+ no-ops per the python docs.
163
+ """
164
+ ensure_dir(location)
165
+ if filename.lower().endswith(".gz") or filename.lower().endswith(".tgz"):
166
+ mode = "r:gz"
167
+ elif filename.lower().endswith(BZ2_EXTENSIONS):
168
+ mode = "r:bz2"
169
+ elif filename.lower().endswith(XZ_EXTENSIONS):
170
+ mode = "r:xz"
171
+ elif filename.lower().endswith(".tar"):
172
+ mode = "r"
173
+ else:
174
+ logger.warning(
175
+ "Cannot determine compression type for file %s",
176
+ filename,
177
+ )
178
+ mode = "r:*"
179
+
180
+ tar = tarfile.open(filename, mode, encoding="utf-8") # type: ignore
181
+ try:
182
+ leading = has_leading_dir([member.name for member in tar.getmembers()])
183
+
184
+ # PEP 706 added `tarfile.data_filter`, and made some other changes to
185
+ # Python's tarfile module (see below). The features were backported to
186
+ # security releases.
187
+ try:
188
+ data_filter = tarfile.data_filter
189
+ except AttributeError:
190
+ _untar_without_filter(filename, location, tar, leading)
191
+ else:
192
+ default_mode_plus_executable = _get_default_mode_plus_executable()
193
+
194
+ if leading:
195
+ # Strip the leading directory from all files in the archive,
196
+ # including hardlink targets (which are relative to the
197
+ # unpack location).
198
+ for member in tar.getmembers():
199
+ name_lead, name_rest = split_leading_dir(member.name)
200
+ member.name = name_rest
201
+ if member.islnk():
202
+ lnk_lead, lnk_rest = split_leading_dir(member.linkname)
203
+ if lnk_lead == name_lead:
204
+ member.linkname = lnk_rest
205
+
206
+ def pip_filter(member: tarfile.TarInfo, path: str) -> tarfile.TarInfo:
207
+ orig_mode = member.mode
208
+ try:
209
+ try:
210
+ member = data_filter(member, location)
211
+ except tarfile.LinkOutsideDestinationError:
212
+ if sys.version_info[:3] in {
213
+ (3, 9, 17),
214
+ (3, 10, 12),
215
+ (3, 11, 4),
216
+ }:
217
+ # The tarfile filter in specific Python versions
218
+ # raises LinkOutsideDestinationError on valid input
219
+ # (https://github.com/python/cpython/issues/107845)
220
+ # Ignore the error there, but do use the
221
+ # more lax `tar_filter`
222
+ member = tarfile.tar_filter(member, location)
223
+ else:
224
+ raise
225
+ except tarfile.TarError as exc:
226
+ message = "Invalid member in the tar file {}: {}"
227
+ # Filter error messages mention the member name.
228
+ # No need to add it here.
229
+ raise InstallationError(
230
+ message.format(
231
+ filename,
232
+ exc,
233
+ )
234
+ )
235
+ if member.isfile() and orig_mode & 0o111:
236
+ member.mode = default_mode_plus_executable
237
+ else:
238
+ # See PEP 706 note above.
239
+ # The PEP changed this from `int` to `Optional[int]`,
240
+ # where None means "use the default". Mypy doesn't
241
+ # know this yet.
242
+ member.mode = None # type: ignore [assignment]
243
+ return member
244
+
245
+ tar.extractall(location, filter=pip_filter)
246
+
247
+ finally:
248
+ tar.close()
249
+
250
+
251
+ def _untar_without_filter(
252
+ filename: str,
253
+ location: str,
254
+ tar: tarfile.TarFile,
255
+ leading: bool,
256
+ ) -> None:
257
+ """Fallback for Python without tarfile.data_filter"""
258
+ for member in tar.getmembers():
259
+ fn = member.name
260
+ if leading:
261
+ fn = split_leading_dir(fn)[1]
262
+ path = os.path.join(location, fn)
263
+ if not is_within_directory(location, path):
264
+ message = (
265
+ "The tar file ({}) has a file ({}) trying to install "
266
+ "outside target directory ({})"
267
+ )
268
+ raise InstallationError(message.format(filename, path, location))
269
+ if member.isdir():
270
+ ensure_dir(path)
271
+ elif member.issym():
272
+ try:
273
+ tar._extract_member(member, path)
274
+ except Exception as exc:
275
+ # Some corrupt tar files seem to produce this
276
+ # (specifically bad symlinks)
277
+ logger.warning(
278
+ "In the tar file %s the member %s is invalid: %s",
279
+ filename,
280
+ member.name,
281
+ exc,
282
+ )
283
+ continue
284
+ else:
285
+ try:
286
+ fp = tar.extractfile(member)
287
+ except (KeyError, AttributeError) as exc:
288
+ # Some corrupt tar files seem to produce this
289
+ # (specifically bad symlinks)
290
+ logger.warning(
291
+ "In the tar file %s the member %s is invalid: %s",
292
+ filename,
293
+ member.name,
294
+ exc,
295
+ )
296
+ continue
297
+ ensure_dir(os.path.dirname(path))
298
+ assert fp is not None
299
+ with open(path, "wb") as destfp:
300
+ shutil.copyfileobj(fp, destfp)
301
+ fp.close()
302
+ # Update the timestamp (useful for cython compiled files)
303
+ tar.utime(member, path)
304
+ # member have any execute permissions for user/group/world?
305
+ if member.mode & 0o111:
306
+ set_extracted_file_to_default_mode_plus_executable(path)
307
+
308
+
309
+ def unpack_file(
310
+ filename: str,
311
+ location: str,
312
+ content_type: str | None = None,
313
+ ) -> None:
314
+ filename = os.path.realpath(filename)
315
+ if (
316
+ content_type == "application/zip"
317
+ or filename.lower().endswith(ZIP_EXTENSIONS)
318
+ or zipfile.is_zipfile(filename)
319
+ ):
320
+ unzip_file(filename, location, flatten=not filename.endswith(".whl"))
321
+ elif (
322
+ content_type == "application/x-gzip"
323
+ or tarfile.is_tarfile(filename)
324
+ or filename.lower().endswith(TAR_EXTENSIONS + BZ2_EXTENSIONS + XZ_EXTENSIONS)
325
+ ):
326
+ untar_file(filename, location)
327
+ else:
328
+ # FIXME: handle?
329
+ # FIXME: magic signatures?
330
+ logger.critical(
331
+ "Cannot unpack file %s (downloaded from %s, content-type: %s); "
332
+ "cannot detect archive format",
333
+ filename,
334
+ location,
335
+ content_type,
336
+ )
337
+ raise InstallationError(f"Cannot determine archive format of {location}")
@@ -0,0 +1,55 @@
1
+ import os
2
+ import string
3
+ import urllib.parse
4
+ import urllib.request
5
+
6
+ from .compat import WINDOWS
7
+
8
+
9
+ def path_to_url(path: str) -> str:
10
+ """
11
+ Convert a path to a file: URL. The path will be made absolute and have
12
+ quoted path parts.
13
+ """
14
+ path = os.path.normpath(os.path.abspath(path))
15
+ url = urllib.parse.urljoin("file://", urllib.request.pathname2url(path))
16
+ return url
17
+
18
+
19
+ def url_to_path(url: str) -> str:
20
+ """
21
+ Convert a file: URL to a path.
22
+ """
23
+ assert url.startswith(
24
+ "file:"
25
+ ), f"You can only turn file: urls into filenames (not {url!r})"
26
+
27
+ _, netloc, path, _, _ = urllib.parse.urlsplit(url)
28
+
29
+ if not netloc or netloc == "localhost":
30
+ # According to RFC 8089, same as empty authority.
31
+ netloc = ""
32
+ elif WINDOWS:
33
+ # If we have a UNC path, prepend UNC share notation.
34
+ netloc = "\\\\" + netloc
35
+ else:
36
+ raise ValueError(
37
+ f"non-local file URIs are not supported on this platform: {url!r}"
38
+ )
39
+
40
+ path = urllib.request.url2pathname(netloc + path)
41
+
42
+ # On Windows, urlsplit parses the path as something like "/C:/Users/foo".
43
+ # This creates issues for path-related functions like io.open(), so we try
44
+ # to detect and strip the leading slash.
45
+ if (
46
+ WINDOWS
47
+ and not netloc # Not UNC.
48
+ and len(path) >= 3
49
+ and path[0] == "/" # Leading slash to strip.
50
+ and path[1] in string.ascii_letters # Drive letter.
51
+ and path[2:4] in (":", ":/") # Colon + end of string, or colon + absolute path.
52
+ ):
53
+ path = path[1:]
54
+
55
+ return path