cli-ih 0.6.3.1__py3-none-any.whl → 0.7.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 (427) hide show
  1. cli_ih/__init__.py +1 -0
  2. cli_ih/asyncClient.py +109 -10
  3. cli_ih/client.py +110 -18
  4. cli_ih/utils.py +51 -0
  5. cli_ih-0.7.1.dist-info/METADATA +100 -0
  6. cli_ih-0.7.1.dist-info/RECORD +9 -0
  7. {cli_ih-0.6.3.1.dist-info → cli_ih-0.7.1.dist-info}/top_level.txt +0 -1
  8. cli_ih-0.6.3.1.dist-info/METADATA +0 -86
  9. cli_ih-0.6.3.1.dist-info/RECORD +0 -425
  10. venv/Lib/site-packages/__editable___cli_ih_0_6_3_1_finder.py +0 -85
  11. venv/Lib/site-packages/pip/__init__.py +0 -13
  12. venv/Lib/site-packages/pip/__main__.py +0 -24
  13. venv/Lib/site-packages/pip/__pip-runner__.py +0 -50
  14. venv/Lib/site-packages/pip/_internal/__init__.py +0 -18
  15. venv/Lib/site-packages/pip/_internal/build_env.py +0 -349
  16. venv/Lib/site-packages/pip/_internal/cache.py +0 -291
  17. venv/Lib/site-packages/pip/_internal/cli/__init__.py +0 -3
  18. venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +0 -184
  19. venv/Lib/site-packages/pip/_internal/cli/base_command.py +0 -244
  20. venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +0 -1138
  21. venv/Lib/site-packages/pip/_internal/cli/command_context.py +0 -28
  22. venv/Lib/site-packages/pip/_internal/cli/index_command.py +0 -175
  23. venv/Lib/site-packages/pip/_internal/cli/main.py +0 -80
  24. venv/Lib/site-packages/pip/_internal/cli/main_parser.py +0 -134
  25. venv/Lib/site-packages/pip/_internal/cli/parser.py +0 -298
  26. venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +0 -151
  27. venv/Lib/site-packages/pip/_internal/cli/req_command.py +0 -351
  28. venv/Lib/site-packages/pip/_internal/cli/spinners.py +0 -235
  29. venv/Lib/site-packages/pip/_internal/cli/status_codes.py +0 -6
  30. venv/Lib/site-packages/pip/_internal/commands/__init__.py +0 -139
  31. venv/Lib/site-packages/pip/_internal/commands/cache.py +0 -231
  32. venv/Lib/site-packages/pip/_internal/commands/check.py +0 -66
  33. venv/Lib/site-packages/pip/_internal/commands/completion.py +0 -135
  34. venv/Lib/site-packages/pip/_internal/commands/configuration.py +0 -288
  35. venv/Lib/site-packages/pip/_internal/commands/debug.py +0 -203
  36. venv/Lib/site-packages/pip/_internal/commands/download.py +0 -145
  37. venv/Lib/site-packages/pip/_internal/commands/freeze.py +0 -107
  38. venv/Lib/site-packages/pip/_internal/commands/hash.py +0 -58
  39. venv/Lib/site-packages/pip/_internal/commands/help.py +0 -40
  40. venv/Lib/site-packages/pip/_internal/commands/index.py +0 -159
  41. venv/Lib/site-packages/pip/_internal/commands/inspect.py +0 -92
  42. venv/Lib/site-packages/pip/_internal/commands/install.py +0 -798
  43. venv/Lib/site-packages/pip/_internal/commands/list.py +0 -400
  44. venv/Lib/site-packages/pip/_internal/commands/lock.py +0 -170
  45. venv/Lib/site-packages/pip/_internal/commands/search.py +0 -178
  46. venv/Lib/site-packages/pip/_internal/commands/show.py +0 -231
  47. venv/Lib/site-packages/pip/_internal/commands/uninstall.py +0 -113
  48. venv/Lib/site-packages/pip/_internal/commands/wheel.py +0 -181
  49. venv/Lib/site-packages/pip/_internal/configuration.py +0 -397
  50. venv/Lib/site-packages/pip/_internal/distributions/__init__.py +0 -21
  51. venv/Lib/site-packages/pip/_internal/distributions/base.py +0 -55
  52. venv/Lib/site-packages/pip/_internal/distributions/installed.py +0 -33
  53. venv/Lib/site-packages/pip/_internal/distributions/sdist.py +0 -165
  54. venv/Lib/site-packages/pip/_internal/distributions/wheel.py +0 -44
  55. venv/Lib/site-packages/pip/_internal/exceptions.py +0 -881
  56. venv/Lib/site-packages/pip/_internal/index/__init__.py +0 -1
  57. venv/Lib/site-packages/pip/_internal/index/collector.py +0 -489
  58. venv/Lib/site-packages/pip/_internal/index/package_finder.py +0 -1059
  59. venv/Lib/site-packages/pip/_internal/index/sources.py +0 -287
  60. venv/Lib/site-packages/pip/_internal/locations/__init__.py +0 -441
  61. venv/Lib/site-packages/pip/_internal/locations/_distutils.py +0 -173
  62. venv/Lib/site-packages/pip/_internal/locations/_sysconfig.py +0 -215
  63. venv/Lib/site-packages/pip/_internal/locations/base.py +0 -82
  64. venv/Lib/site-packages/pip/_internal/main.py +0 -12
  65. venv/Lib/site-packages/pip/_internal/metadata/__init__.py +0 -164
  66. venv/Lib/site-packages/pip/_internal/metadata/_json.py +0 -87
  67. venv/Lib/site-packages/pip/_internal/metadata/base.py +0 -685
  68. venv/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py +0 -6
  69. venv/Lib/site-packages/pip/_internal/metadata/importlib/_compat.py +0 -87
  70. venv/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py +0 -223
  71. venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py +0 -143
  72. venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py +0 -298
  73. venv/Lib/site-packages/pip/_internal/models/__init__.py +0 -1
  74. venv/Lib/site-packages/pip/_internal/models/candidate.py +0 -25
  75. venv/Lib/site-packages/pip/_internal/models/direct_url.py +0 -227
  76. venv/Lib/site-packages/pip/_internal/models/format_control.py +0 -78
  77. venv/Lib/site-packages/pip/_internal/models/index.py +0 -28
  78. venv/Lib/site-packages/pip/_internal/models/installation_report.py +0 -57
  79. venv/Lib/site-packages/pip/_internal/models/link.py +0 -613
  80. venv/Lib/site-packages/pip/_internal/models/pylock.py +0 -188
  81. venv/Lib/site-packages/pip/_internal/models/scheme.py +0 -25
  82. venv/Lib/site-packages/pip/_internal/models/search_scope.py +0 -126
  83. venv/Lib/site-packages/pip/_internal/models/selection_prefs.py +0 -53
  84. venv/Lib/site-packages/pip/_internal/models/target_python.py +0 -122
  85. venv/Lib/site-packages/pip/_internal/models/wheel.py +0 -141
  86. venv/Lib/site-packages/pip/_internal/network/__init__.py +0 -1
  87. venv/Lib/site-packages/pip/_internal/network/auth.py +0 -564
  88. venv/Lib/site-packages/pip/_internal/network/cache.py +0 -133
  89. venv/Lib/site-packages/pip/_internal/network/download.py +0 -342
  90. venv/Lib/site-packages/pip/_internal/network/lazy_wheel.py +0 -213
  91. venv/Lib/site-packages/pip/_internal/network/session.py +0 -528
  92. venv/Lib/site-packages/pip/_internal/network/utils.py +0 -98
  93. venv/Lib/site-packages/pip/_internal/network/xmlrpc.py +0 -61
  94. venv/Lib/site-packages/pip/_internal/operations/__init__.py +0 -0
  95. venv/Lib/site-packages/pip/_internal/operations/build/__init__.py +0 -0
  96. venv/Lib/site-packages/pip/_internal/operations/build/build_tracker.py +0 -140
  97. venv/Lib/site-packages/pip/_internal/operations/build/metadata.py +0 -38
  98. venv/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py +0 -41
  99. venv/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py +0 -73
  100. venv/Lib/site-packages/pip/_internal/operations/build/wheel.py +0 -38
  101. venv/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py +0 -47
  102. venv/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py +0 -119
  103. venv/Lib/site-packages/pip/_internal/operations/check.py +0 -175
  104. venv/Lib/site-packages/pip/_internal/operations/freeze.py +0 -259
  105. venv/Lib/site-packages/pip/_internal/operations/install/__init__.py +0 -1
  106. venv/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py +0 -48
  107. venv/Lib/site-packages/pip/_internal/operations/install/wheel.py +0 -746
  108. venv/Lib/site-packages/pip/_internal/operations/prepare.py +0 -742
  109. venv/Lib/site-packages/pip/_internal/pyproject.py +0 -182
  110. venv/Lib/site-packages/pip/_internal/req/__init__.py +0 -105
  111. venv/Lib/site-packages/pip/_internal/req/constructors.py +0 -562
  112. venv/Lib/site-packages/pip/_internal/req/req_dependency_group.py +0 -75
  113. venv/Lib/site-packages/pip/_internal/req/req_file.py +0 -620
  114. venv/Lib/site-packages/pip/_internal/req/req_install.py +0 -937
  115. venv/Lib/site-packages/pip/_internal/req/req_set.py +0 -81
  116. venv/Lib/site-packages/pip/_internal/req/req_uninstall.py +0 -639
  117. venv/Lib/site-packages/pip/_internal/resolution/__init__.py +0 -0
  118. venv/Lib/site-packages/pip/_internal/resolution/base.py +0 -20
  119. venv/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py +0 -0
  120. venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py +0 -598
  121. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py +0 -0
  122. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py +0 -142
  123. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +0 -582
  124. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +0 -814
  125. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py +0 -166
  126. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py +0 -276
  127. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py +0 -85
  128. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py +0 -247
  129. venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +0 -336
  130. venv/Lib/site-packages/pip/_internal/self_outdated_check.py +0 -254
  131. venv/Lib/site-packages/pip/_internal/utils/__init__.py +0 -0
  132. venv/Lib/site-packages/pip/_internal/utils/_jaraco_text.py +0 -109
  133. venv/Lib/site-packages/pip/_internal/utils/_log.py +0 -38
  134. venv/Lib/site-packages/pip/_internal/utils/appdirs.py +0 -52
  135. venv/Lib/site-packages/pip/_internal/utils/compat.py +0 -85
  136. venv/Lib/site-packages/pip/_internal/utils/compatibility_tags.py +0 -201
  137. venv/Lib/site-packages/pip/_internal/utils/datetime.py +0 -10
  138. venv/Lib/site-packages/pip/_internal/utils/deprecation.py +0 -126
  139. venv/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py +0 -87
  140. venv/Lib/site-packages/pip/_internal/utils/egg_link.py +0 -81
  141. venv/Lib/site-packages/pip/_internal/utils/entrypoints.py +0 -88
  142. venv/Lib/site-packages/pip/_internal/utils/filesystem.py +0 -152
  143. venv/Lib/site-packages/pip/_internal/utils/filetypes.py +0 -24
  144. venv/Lib/site-packages/pip/_internal/utils/glibc.py +0 -102
  145. venv/Lib/site-packages/pip/_internal/utils/hashes.py +0 -150
  146. venv/Lib/site-packages/pip/_internal/utils/logging.py +0 -364
  147. venv/Lib/site-packages/pip/_internal/utils/misc.py +0 -765
  148. venv/Lib/site-packages/pip/_internal/utils/packaging.py +0 -44
  149. venv/Lib/site-packages/pip/_internal/utils/retry.py +0 -45
  150. venv/Lib/site-packages/pip/_internal/utils/setuptools_build.py +0 -149
  151. venv/Lib/site-packages/pip/_internal/utils/subprocess.py +0 -248
  152. venv/Lib/site-packages/pip/_internal/utils/temp_dir.py +0 -294
  153. venv/Lib/site-packages/pip/_internal/utils/unpacking.py +0 -337
  154. venv/Lib/site-packages/pip/_internal/utils/urls.py +0 -55
  155. venv/Lib/site-packages/pip/_internal/utils/virtualenv.py +0 -105
  156. venv/Lib/site-packages/pip/_internal/utils/wheel.py +0 -132
  157. venv/Lib/site-packages/pip/_internal/vcs/__init__.py +0 -15
  158. venv/Lib/site-packages/pip/_internal/vcs/bazaar.py +0 -130
  159. venv/Lib/site-packages/pip/_internal/vcs/git.py +0 -571
  160. venv/Lib/site-packages/pip/_internal/vcs/mercurial.py +0 -186
  161. venv/Lib/site-packages/pip/_internal/vcs/subversion.py +0 -335
  162. venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py +0 -693
  163. venv/Lib/site-packages/pip/_internal/wheel_builder.py +0 -334
  164. venv/Lib/site-packages/pip/_vendor/__init__.py +0 -117
  165. venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py +0 -29
  166. venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py +0 -70
  167. venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py +0 -168
  168. venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py +0 -75
  169. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +0 -8
  170. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +0 -145
  171. venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +0 -48
  172. venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py +0 -511
  173. venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py +0 -119
  174. venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py +0 -157
  175. venv/Lib/site-packages/pip/_vendor/cachecontrol/py.typed +0 -0
  176. venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py +0 -146
  177. venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py +0 -43
  178. venv/Lib/site-packages/pip/_vendor/certifi/__init__.py +0 -4
  179. venv/Lib/site-packages/pip/_vendor/certifi/__main__.py +0 -12
  180. venv/Lib/site-packages/pip/_vendor/certifi/core.py +0 -83
  181. venv/Lib/site-packages/pip/_vendor/certifi/py.typed +0 -0
  182. venv/Lib/site-packages/pip/_vendor/dependency_groups/__init__.py +0 -13
  183. venv/Lib/site-packages/pip/_vendor/dependency_groups/__main__.py +0 -65
  184. venv/Lib/site-packages/pip/_vendor/dependency_groups/_implementation.py +0 -209
  185. venv/Lib/site-packages/pip/_vendor/dependency_groups/_lint_dependency_groups.py +0 -59
  186. venv/Lib/site-packages/pip/_vendor/dependency_groups/_pip_wrapper.py +0 -62
  187. venv/Lib/site-packages/pip/_vendor/dependency_groups/_toml_compat.py +0 -9
  188. venv/Lib/site-packages/pip/_vendor/dependency_groups/py.typed +0 -0
  189. venv/Lib/site-packages/pip/_vendor/distlib/__init__.py +0 -33
  190. venv/Lib/site-packages/pip/_vendor/distlib/compat.py +0 -1137
  191. venv/Lib/site-packages/pip/_vendor/distlib/resources.py +0 -358
  192. venv/Lib/site-packages/pip/_vendor/distlib/scripts.py +0 -447
  193. venv/Lib/site-packages/pip/_vendor/distlib/util.py +0 -1984
  194. venv/Lib/site-packages/pip/_vendor/distro/__init__.py +0 -54
  195. venv/Lib/site-packages/pip/_vendor/distro/__main__.py +0 -4
  196. venv/Lib/site-packages/pip/_vendor/distro/distro.py +0 -1403
  197. venv/Lib/site-packages/pip/_vendor/distro/py.typed +0 -0
  198. venv/Lib/site-packages/pip/_vendor/idna/__init__.py +0 -45
  199. venv/Lib/site-packages/pip/_vendor/idna/codec.py +0 -122
  200. venv/Lib/site-packages/pip/_vendor/idna/compat.py +0 -15
  201. venv/Lib/site-packages/pip/_vendor/idna/core.py +0 -437
  202. venv/Lib/site-packages/pip/_vendor/idna/idnadata.py +0 -4243
  203. venv/Lib/site-packages/pip/_vendor/idna/intranges.py +0 -57
  204. venv/Lib/site-packages/pip/_vendor/idna/package_data.py +0 -1
  205. venv/Lib/site-packages/pip/_vendor/idna/py.typed +0 -0
  206. venv/Lib/site-packages/pip/_vendor/idna/uts46data.py +0 -8681
  207. venv/Lib/site-packages/pip/_vendor/msgpack/__init__.py +0 -55
  208. venv/Lib/site-packages/pip/_vendor/msgpack/exceptions.py +0 -48
  209. venv/Lib/site-packages/pip/_vendor/msgpack/ext.py +0 -170
  210. venv/Lib/site-packages/pip/_vendor/msgpack/fallback.py +0 -929
  211. venv/Lib/site-packages/pip/_vendor/packaging/__init__.py +0 -15
  212. venv/Lib/site-packages/pip/_vendor/packaging/_elffile.py +0 -109
  213. venv/Lib/site-packages/pip/_vendor/packaging/_manylinux.py +0 -262
  214. venv/Lib/site-packages/pip/_vendor/packaging/_musllinux.py +0 -85
  215. venv/Lib/site-packages/pip/_vendor/packaging/_parser.py +0 -353
  216. venv/Lib/site-packages/pip/_vendor/packaging/_structures.py +0 -61
  217. venv/Lib/site-packages/pip/_vendor/packaging/_tokenizer.py +0 -195
  218. venv/Lib/site-packages/pip/_vendor/packaging/licenses/__init__.py +0 -145
  219. venv/Lib/site-packages/pip/_vendor/packaging/licenses/_spdx.py +0 -759
  220. venv/Lib/site-packages/pip/_vendor/packaging/markers.py +0 -362
  221. venv/Lib/site-packages/pip/_vendor/packaging/metadata.py +0 -862
  222. venv/Lib/site-packages/pip/_vendor/packaging/py.typed +0 -0
  223. venv/Lib/site-packages/pip/_vendor/packaging/requirements.py +0 -91
  224. venv/Lib/site-packages/pip/_vendor/packaging/specifiers.py +0 -1019
  225. venv/Lib/site-packages/pip/_vendor/packaging/tags.py +0 -656
  226. venv/Lib/site-packages/pip/_vendor/packaging/utils.py +0 -163
  227. venv/Lib/site-packages/pip/_vendor/packaging/version.py +0 -582
  228. venv/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py +0 -3676
  229. venv/Lib/site-packages/pip/_vendor/platformdirs/__init__.py +0 -631
  230. venv/Lib/site-packages/pip/_vendor/platformdirs/__main__.py +0 -55
  231. venv/Lib/site-packages/pip/_vendor/platformdirs/android.py +0 -249
  232. venv/Lib/site-packages/pip/_vendor/platformdirs/api.py +0 -299
  233. venv/Lib/site-packages/pip/_vendor/platformdirs/macos.py +0 -144
  234. venv/Lib/site-packages/pip/_vendor/platformdirs/py.typed +0 -0
  235. venv/Lib/site-packages/pip/_vendor/platformdirs/unix.py +0 -272
  236. venv/Lib/site-packages/pip/_vendor/platformdirs/version.py +0 -21
  237. venv/Lib/site-packages/pip/_vendor/platformdirs/windows.py +0 -272
  238. venv/Lib/site-packages/pip/_vendor/pygments/__init__.py +0 -82
  239. venv/Lib/site-packages/pip/_vendor/pygments/__main__.py +0 -17
  240. venv/Lib/site-packages/pip/_vendor/pygments/console.py +0 -70
  241. venv/Lib/site-packages/pip/_vendor/pygments/filter.py +0 -70
  242. venv/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py +0 -940
  243. venv/Lib/site-packages/pip/_vendor/pygments/formatter.py +0 -129
  244. venv/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py +0 -157
  245. venv/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py +0 -23
  246. venv/Lib/site-packages/pip/_vendor/pygments/lexer.py +0 -963
  247. venv/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py +0 -362
  248. venv/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py +0 -602
  249. venv/Lib/site-packages/pip/_vendor/pygments/lexers/python.py +0 -1201
  250. venv/Lib/site-packages/pip/_vendor/pygments/modeline.py +0 -43
  251. venv/Lib/site-packages/pip/_vendor/pygments/plugin.py +0 -72
  252. venv/Lib/site-packages/pip/_vendor/pygments/regexopt.py +0 -91
  253. venv/Lib/site-packages/pip/_vendor/pygments/scanner.py +0 -104
  254. venv/Lib/site-packages/pip/_vendor/pygments/sphinxext.py +0 -247
  255. venv/Lib/site-packages/pip/_vendor/pygments/style.py +0 -203
  256. venv/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py +0 -61
  257. venv/Lib/site-packages/pip/_vendor/pygments/styles/_mapping.py +0 -54
  258. venv/Lib/site-packages/pip/_vendor/pygments/token.py +0 -214
  259. venv/Lib/site-packages/pip/_vendor/pygments/unistring.py +0 -153
  260. venv/Lib/site-packages/pip/_vendor/pygments/util.py +0 -324
  261. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__init__.py +0 -31
  262. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_impl.py +0 -410
  263. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py +0 -21
  264. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py +0 -389
  265. venv/Lib/site-packages/pip/_vendor/pyproject_hooks/py.typed +0 -0
  266. venv/Lib/site-packages/pip/_vendor/requests/__init__.py +0 -179
  267. venv/Lib/site-packages/pip/_vendor/requests/__version__.py +0 -14
  268. venv/Lib/site-packages/pip/_vendor/requests/_internal_utils.py +0 -50
  269. venv/Lib/site-packages/pip/_vendor/requests/adapters.py +0 -719
  270. venv/Lib/site-packages/pip/_vendor/requests/api.py +0 -157
  271. venv/Lib/site-packages/pip/_vendor/requests/auth.py +0 -314
  272. venv/Lib/site-packages/pip/_vendor/requests/certs.py +0 -17
  273. venv/Lib/site-packages/pip/_vendor/requests/compat.py +0 -90
  274. venv/Lib/site-packages/pip/_vendor/requests/cookies.py +0 -561
  275. venv/Lib/site-packages/pip/_vendor/requests/exceptions.py +0 -151
  276. venv/Lib/site-packages/pip/_vendor/requests/help.py +0 -127
  277. venv/Lib/site-packages/pip/_vendor/requests/hooks.py +0 -33
  278. venv/Lib/site-packages/pip/_vendor/requests/models.py +0 -1039
  279. venv/Lib/site-packages/pip/_vendor/requests/packages.py +0 -25
  280. venv/Lib/site-packages/pip/_vendor/requests/sessions.py +0 -831
  281. venv/Lib/site-packages/pip/_vendor/requests/status_codes.py +0 -128
  282. venv/Lib/site-packages/pip/_vendor/requests/structures.py +0 -99
  283. venv/Lib/site-packages/pip/_vendor/requests/utils.py +0 -1086
  284. venv/Lib/site-packages/pip/_vendor/resolvelib/__init__.py +0 -27
  285. venv/Lib/site-packages/pip/_vendor/resolvelib/providers.py +0 -196
  286. venv/Lib/site-packages/pip/_vendor/resolvelib/py.typed +0 -0
  287. venv/Lib/site-packages/pip/_vendor/resolvelib/reporters.py +0 -55
  288. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/__init__.py +0 -27
  289. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/abstract.py +0 -47
  290. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/criterion.py +0 -48
  291. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/exceptions.py +0 -57
  292. venv/Lib/site-packages/pip/_vendor/resolvelib/resolvers/resolution.py +0 -622
  293. venv/Lib/site-packages/pip/_vendor/resolvelib/structs.py +0 -209
  294. venv/Lib/site-packages/pip/_vendor/rich/__init__.py +0 -177
  295. venv/Lib/site-packages/pip/_vendor/rich/__main__.py +0 -245
  296. venv/Lib/site-packages/pip/_vendor/rich/_cell_widths.py +0 -454
  297. venv/Lib/site-packages/pip/_vendor/rich/_emoji_codes.py +0 -3610
  298. venv/Lib/site-packages/pip/_vendor/rich/_emoji_replace.py +0 -32
  299. venv/Lib/site-packages/pip/_vendor/rich/_export_format.py +0 -76
  300. venv/Lib/site-packages/pip/_vendor/rich/_extension.py +0 -10
  301. venv/Lib/site-packages/pip/_vendor/rich/_fileno.py +0 -24
  302. venv/Lib/site-packages/pip/_vendor/rich/_inspect.py +0 -268
  303. venv/Lib/site-packages/pip/_vendor/rich/_log_render.py +0 -94
  304. venv/Lib/site-packages/pip/_vendor/rich/_loop.py +0 -43
  305. venv/Lib/site-packages/pip/_vendor/rich/_null_file.py +0 -69
  306. venv/Lib/site-packages/pip/_vendor/rich/_palettes.py +0 -309
  307. venv/Lib/site-packages/pip/_vendor/rich/_pick.py +0 -17
  308. venv/Lib/site-packages/pip/_vendor/rich/_ratio.py +0 -153
  309. venv/Lib/site-packages/pip/_vendor/rich/_spinners.py +0 -482
  310. venv/Lib/site-packages/pip/_vendor/rich/_stack.py +0 -16
  311. venv/Lib/site-packages/pip/_vendor/rich/_timer.py +0 -19
  312. venv/Lib/site-packages/pip/_vendor/rich/_win32_console.py +0 -661
  313. venv/Lib/site-packages/pip/_vendor/rich/_windows.py +0 -71
  314. venv/Lib/site-packages/pip/_vendor/rich/_windows_renderer.py +0 -56
  315. venv/Lib/site-packages/pip/_vendor/rich/_wrap.py +0 -93
  316. venv/Lib/site-packages/pip/_vendor/rich/abc.py +0 -33
  317. venv/Lib/site-packages/pip/_vendor/rich/align.py +0 -306
  318. venv/Lib/site-packages/pip/_vendor/rich/ansi.py +0 -241
  319. venv/Lib/site-packages/pip/_vendor/rich/bar.py +0 -93
  320. venv/Lib/site-packages/pip/_vendor/rich/box.py +0 -474
  321. venv/Lib/site-packages/pip/_vendor/rich/cells.py +0 -174
  322. venv/Lib/site-packages/pip/_vendor/rich/color.py +0 -621
  323. venv/Lib/site-packages/pip/_vendor/rich/color_triplet.py +0 -38
  324. venv/Lib/site-packages/pip/_vendor/rich/columns.py +0 -187
  325. venv/Lib/site-packages/pip/_vendor/rich/console.py +0 -2680
  326. venv/Lib/site-packages/pip/_vendor/rich/constrain.py +0 -37
  327. venv/Lib/site-packages/pip/_vendor/rich/containers.py +0 -167
  328. venv/Lib/site-packages/pip/_vendor/rich/control.py +0 -219
  329. venv/Lib/site-packages/pip/_vendor/rich/default_styles.py +0 -193
  330. venv/Lib/site-packages/pip/_vendor/rich/diagnose.py +0 -39
  331. venv/Lib/site-packages/pip/_vendor/rich/emoji.py +0 -91
  332. venv/Lib/site-packages/pip/_vendor/rich/errors.py +0 -34
  333. venv/Lib/site-packages/pip/_vendor/rich/file_proxy.py +0 -57
  334. venv/Lib/site-packages/pip/_vendor/rich/filesize.py +0 -88
  335. venv/Lib/site-packages/pip/_vendor/rich/highlighter.py +0 -232
  336. venv/Lib/site-packages/pip/_vendor/rich/json.py +0 -139
  337. venv/Lib/site-packages/pip/_vendor/rich/jupyter.py +0 -101
  338. venv/Lib/site-packages/pip/_vendor/rich/layout.py +0 -442
  339. venv/Lib/site-packages/pip/_vendor/rich/live.py +0 -400
  340. venv/Lib/site-packages/pip/_vendor/rich/live_render.py +0 -106
  341. venv/Lib/site-packages/pip/_vendor/rich/logging.py +0 -297
  342. venv/Lib/site-packages/pip/_vendor/rich/markup.py +0 -251
  343. venv/Lib/site-packages/pip/_vendor/rich/measure.py +0 -151
  344. venv/Lib/site-packages/pip/_vendor/rich/padding.py +0 -141
  345. venv/Lib/site-packages/pip/_vendor/rich/pager.py +0 -34
  346. venv/Lib/site-packages/pip/_vendor/rich/palette.py +0 -100
  347. venv/Lib/site-packages/pip/_vendor/rich/panel.py +0 -317
  348. venv/Lib/site-packages/pip/_vendor/rich/pretty.py +0 -1016
  349. venv/Lib/site-packages/pip/_vendor/rich/progress.py +0 -1715
  350. venv/Lib/site-packages/pip/_vendor/rich/progress_bar.py +0 -223
  351. venv/Lib/site-packages/pip/_vendor/rich/prompt.py +0 -400
  352. venv/Lib/site-packages/pip/_vendor/rich/protocol.py +0 -42
  353. venv/Lib/site-packages/pip/_vendor/rich/py.typed +0 -0
  354. venv/Lib/site-packages/pip/_vendor/rich/region.py +0 -10
  355. venv/Lib/site-packages/pip/_vendor/rich/repr.py +0 -149
  356. venv/Lib/site-packages/pip/_vendor/rich/rule.py +0 -130
  357. venv/Lib/site-packages/pip/_vendor/rich/scope.py +0 -86
  358. venv/Lib/site-packages/pip/_vendor/rich/screen.py +0 -54
  359. venv/Lib/site-packages/pip/_vendor/rich/segment.py +0 -752
  360. venv/Lib/site-packages/pip/_vendor/rich/spinner.py +0 -132
  361. venv/Lib/site-packages/pip/_vendor/rich/status.py +0 -131
  362. venv/Lib/site-packages/pip/_vendor/rich/style.py +0 -796
  363. venv/Lib/site-packages/pip/_vendor/rich/styled.py +0 -42
  364. venv/Lib/site-packages/pip/_vendor/rich/syntax.py +0 -985
  365. venv/Lib/site-packages/pip/_vendor/rich/table.py +0 -1006
  366. venv/Lib/site-packages/pip/_vendor/rich/terminal_theme.py +0 -153
  367. venv/Lib/site-packages/pip/_vendor/rich/text.py +0 -1361
  368. venv/Lib/site-packages/pip/_vendor/rich/theme.py +0 -115
  369. venv/Lib/site-packages/pip/_vendor/rich/themes.py +0 -5
  370. venv/Lib/site-packages/pip/_vendor/rich/traceback.py +0 -899
  371. venv/Lib/site-packages/pip/_vendor/rich/tree.py +0 -257
  372. venv/Lib/site-packages/pip/_vendor/tomli/__init__.py +0 -8
  373. venv/Lib/site-packages/pip/_vendor/tomli/_parser.py +0 -770
  374. venv/Lib/site-packages/pip/_vendor/tomli/_re.py +0 -112
  375. venv/Lib/site-packages/pip/_vendor/tomli/_types.py +0 -10
  376. venv/Lib/site-packages/pip/_vendor/tomli/py.typed +0 -1
  377. venv/Lib/site-packages/pip/_vendor/tomli_w/__init__.py +0 -4
  378. venv/Lib/site-packages/pip/_vendor/tomli_w/_writer.py +0 -229
  379. venv/Lib/site-packages/pip/_vendor/tomli_w/py.typed +0 -1
  380. venv/Lib/site-packages/pip/_vendor/truststore/__init__.py +0 -36
  381. venv/Lib/site-packages/pip/_vendor/truststore/_api.py +0 -333
  382. venv/Lib/site-packages/pip/_vendor/truststore/_macos.py +0 -571
  383. venv/Lib/site-packages/pip/_vendor/truststore/_openssl.py +0 -66
  384. venv/Lib/site-packages/pip/_vendor/truststore/_ssl_constants.py +0 -31
  385. venv/Lib/site-packages/pip/_vendor/truststore/_windows.py +0 -567
  386. venv/Lib/site-packages/pip/_vendor/truststore/py.typed +0 -0
  387. venv/Lib/site-packages/pip/_vendor/urllib3/__init__.py +0 -102
  388. venv/Lib/site-packages/pip/_vendor/urllib3/_collections.py +0 -355
  389. venv/Lib/site-packages/pip/_vendor/urllib3/_version.py +0 -2
  390. venv/Lib/site-packages/pip/_vendor/urllib3/connection.py +0 -572
  391. venv/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py +0 -1140
  392. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py +0 -0
  393. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py +0 -36
  394. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py +0 -0
  395. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py +0 -519
  396. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py +0 -397
  397. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py +0 -314
  398. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py +0 -130
  399. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py +0 -518
  400. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py +0 -920
  401. venv/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py +0 -216
  402. venv/Lib/site-packages/pip/_vendor/urllib3/exceptions.py +0 -323
  403. venv/Lib/site-packages/pip/_vendor/urllib3/fields.py +0 -274
  404. venv/Lib/site-packages/pip/_vendor/urllib3/filepost.py +0 -98
  405. venv/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py +0 -0
  406. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py +0 -0
  407. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py +0 -51
  408. venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py +0 -155
  409. venv/Lib/site-packages/pip/_vendor/urllib3/packages/six.py +0 -1076
  410. venv/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py +0 -540
  411. venv/Lib/site-packages/pip/_vendor/urllib3/request.py +0 -191
  412. venv/Lib/site-packages/pip/_vendor/urllib3/response.py +0 -879
  413. venv/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py +0 -49
  414. venv/Lib/site-packages/pip/_vendor/urllib3/util/connection.py +0 -149
  415. venv/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py +0 -57
  416. venv/Lib/site-packages/pip/_vendor/urllib3/util/queue.py +0 -22
  417. venv/Lib/site-packages/pip/_vendor/urllib3/util/request.py +0 -137
  418. venv/Lib/site-packages/pip/_vendor/urllib3/util/response.py +0 -107
  419. venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py +0 -622
  420. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py +0 -504
  421. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py +0 -159
  422. venv/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py +0 -221
  423. venv/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py +0 -271
  424. venv/Lib/site-packages/pip/_vendor/urllib3/util/url.py +0 -435
  425. venv/Lib/site-packages/pip/_vendor/urllib3/util/wait.py +0 -152
  426. venv/Lib/site-packages/pip/py.typed +0 -4
  427. {cli_ih-0.6.3.1.dist-info → cli_ih-0.7.1.dist-info}/WHEEL +0 -0
@@ -1,294 +0,0 @@
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
@@ -1,337 +0,0 @@
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}")
@@ -1,55 +0,0 @@
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