hchak commited on
Commit
84e0912
1 Parent(s): fcabd10

Upload folder using huggingface_hub

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +1 -0
  2. .gitignore +160 -0
  3. .local/share/virtualenv/py_info/1/34a47a33ded45ae8e05857b82cbe1c4de28ab890ad2c29d68abfbba5e2e2da9c.json +74 -0
  4. .local/share/virtualenv/py_info/1/34a47a33ded45ae8e05857b82cbe1c4de28ab890ad2c29d68abfbba5e2e2da9c.lock +0 -0
  5. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any.lock +0 -0
  6. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.dist-info/AUTHORS.txt +751 -0
  7. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.dist-info/INSTALLER +1 -0
  8. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.dist-info/LICENSE.txt +20 -0
  9. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.dist-info/METADATA +88 -0
  10. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.dist-info/RECORD +1072 -0
  11. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.dist-info/WHEEL +5 -0
  12. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.dist-info/entry_points.txt +4 -0
  13. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.dist-info/top_level.txt +1 -0
  14. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.virtualenv +0 -0
  15. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/__init__.py +13 -0
  16. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/__main__.py +24 -0
  17. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/__pip-runner__.py +50 -0
  18. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/__init__.py +18 -0
  19. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/build_env.py +311 -0
  20. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cache.py +290 -0
  21. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/__init__.py +4 -0
  22. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/autocompletion.py +172 -0
  23. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/base_command.py +236 -0
  24. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/cmdoptions.py +1077 -0
  25. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/command_context.py +27 -0
  26. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/main.py +79 -0
  27. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/main_parser.py +134 -0
  28. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/parser.py +294 -0
  29. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/progress_bars.py +68 -0
  30. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/req_command.py +505 -0
  31. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/spinners.py +159 -0
  32. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/status_codes.py +6 -0
  33. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/__init__.py +132 -0
  34. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/cache.py +225 -0
  35. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/check.py +54 -0
  36. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/completion.py +130 -0
  37. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/configuration.py +282 -0
  38. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/debug.py +203 -0
  39. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/download.py +147 -0
  40. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/freeze.py +108 -0
  41. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/hash.py +59 -0
  42. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/help.py +41 -0
  43. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/index.py +139 -0
  44. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/inspect.py +92 -0
  45. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/install.py +778 -0
  46. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/list.py +368 -0
  47. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/search.py +174 -0
  48. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/show.py +189 -0
  49. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/uninstall.py +113 -0
  50. .local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/wheel.py +183 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ .pythonlibs/bin/ruff filter=lfs diff=lfs merge=lfs -text
.gitignore ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # PyInstaller
30
+ # Usually these files are written by a python script from a template
31
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
+ *.manifest
33
+ *.spec
34
+
35
+ # Installer logs
36
+ pip-log.txt
37
+ pip-delete-this-directory.txt
38
+
39
+ # Unit test / coverage reports
40
+ htmlcov/
41
+ .tox/
42
+ .nox/
43
+ .coverage
44
+ .coverage.*
45
+ .cache
46
+ nosetests.xml
47
+ coverage.xml
48
+ *.cover
49
+ *.py,cover
50
+ .hypothesis/
51
+ .pytest_cache/
52
+ cover/
53
+
54
+ # Translations
55
+ *.mo
56
+ *.pot
57
+
58
+ # Django stuff:
59
+ *.log
60
+ local_settings.py
61
+ db.sqlite3
62
+ db.sqlite3-journal
63
+
64
+ # Flask stuff:
65
+ instance/
66
+ .webassets-cache
67
+
68
+ # Scrapy stuff:
69
+ .scrapy
70
+
71
+ # Sphinx documentation
72
+ docs/_build/
73
+
74
+ # PyBuilder
75
+ .pybuilder/
76
+ target/
77
+
78
+ # Jupyter Notebook
79
+ .ipynb_checkpoints
80
+
81
+ # IPython
82
+ profile_default/
83
+ ipython_config.py
84
+
85
+ # pyenv
86
+ # For a library or package, you might want to ignore these files since the code is
87
+ # intended to run in multiple environments; otherwise, check them in:
88
+ # .python-version
89
+
90
+ # pipenv
91
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
+ # install all needed dependencies.
95
+ #Pipfile.lock
96
+
97
+ # poetry
98
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
99
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
100
+ # commonly ignored for libraries.
101
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102
+ #poetry.lock
103
+
104
+ # pdm
105
+ # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106
+ #pdm.lock
107
+ # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108
+ # in version control.
109
+ # https://pdm.fming.dev/#use-with-ide
110
+ .pdm.toml
111
+
112
+ # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
113
+ __pypackages__/
114
+
115
+ # Celery stuff
116
+ celerybeat-schedule
117
+ celerybeat.pid
118
+
119
+ # SageMath parsed files
120
+ *.sage.py
121
+
122
+ # Environments
123
+ .env
124
+ .venv
125
+ env/
126
+ venv/
127
+ ENV/
128
+ env.bak/
129
+ venv.bak/
130
+
131
+ # Spyder project settings
132
+ .spyderproject
133
+ .spyproject
134
+
135
+ # Rope project settings
136
+ .ropeproject
137
+
138
+ # mkdocs documentation
139
+ /site
140
+
141
+ # mypy
142
+ .mypy_cache/
143
+ .dmypy.json
144
+ dmypy.json
145
+
146
+ # Pyre type checker
147
+ .pyre/
148
+
149
+ # pytype static type analyzer
150
+ .pytype/
151
+
152
+ # Cython debug symbols
153
+ cython_debug/
154
+
155
+ # PyCharm
156
+ # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
157
+ # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
158
+ # and can be added to the global gitignore or merged into this file. For a more nuclear
159
+ # option (not recommended) you can uncomment the following to ignore the entire idea folder.
160
+ #.idea/
.local/share/virtualenv/py_info/1/34a47a33ded45ae8e05857b82cbe1c4de28ab890ad2c29d68abfbba5e2e2da9c.json ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "content": {
3
+ "_creators": null,
4
+ "architecture": 64,
5
+ "base_exec_prefix": "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13",
6
+ "base_prefix": "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13",
7
+ "distutils_install": {
8
+ "data": "",
9
+ "headers": "include/python3.10/UNKNOWN",
10
+ "platlib": "lib/python3.10/site-packages",
11
+ "purelib": "lib/python3.10/site-packages",
12
+ "scripts": "bin"
13
+ },
14
+ "exec_prefix": "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13",
15
+ "executable": "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13/bin/python3.10",
16
+ "file_system_encoding": "utf-8",
17
+ "has_venv": true,
18
+ "implementation": "CPython",
19
+ "max_size": 9223372036854775807,
20
+ "original_executable": "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13/bin/python3.10",
21
+ "os": "posix",
22
+ "path": [
23
+ "/nix/store/kl8q9n461fq93wvsxi7lrm3if9diax6l-poetry-in-venv/env/lib/python3.10/site-packages/virtualenv/discovery",
24
+ "/nix/store/j0w3s6nm5agyirdf0rf7j44dmcxz7vry-sitecustomize/lib/python/site-packages",
25
+ "/nix/store/b4safb4xh9j4ki6x9kqli82asr0r8n4i-python3.10-pip-23.3.1/lib/python3.10/site-packages",
26
+ "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13/lib/python310.zip",
27
+ "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13/lib/python3.10",
28
+ "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13/lib/python3.10/lib-dynload",
29
+ "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13/lib/python3.10/site-packages",
30
+ "/home/runner/GPT-Fine-Tuning-Formatter/.pythonlibs/lib/python3.10/site-packages",
31
+ "/nix/store/jj0ngw5gls74iqsh9hq7db769g0zwsxj-python3.10-setuptools-69.0.3/lib/python3.10/site-packages"
32
+ ],
33
+ "platform": "linux",
34
+ "prefix": "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13",
35
+ "real_prefix": null,
36
+ "stdout_encoding": "utf-8",
37
+ "sysconfig": {
38
+ "makefile_filename": "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13/lib/python3.10/config-3.10-x86_64-linux-gnu/Makefile"
39
+ },
40
+ "sysconfig_paths": {
41
+ "data": "{base}",
42
+ "include": "{installed_base}/include/python{py_version_short}{abiflags}",
43
+ "platlib": "{platbase}/{platlibdir}/python{py_version_short}/site-packages",
44
+ "platstdlib": "{platbase}/{platlibdir}/python{py_version_short}",
45
+ "purelib": "{base}/lib/python{py_version_short}/site-packages",
46
+ "scripts": "{base}/bin",
47
+ "stdlib": "{installed_base}/{platlibdir}/python{py_version_short}"
48
+ },
49
+ "sysconfig_scheme": null,
50
+ "sysconfig_vars": {
51
+ "PYTHONFRAMEWORK": "",
52
+ "abiflags": "",
53
+ "base": "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13",
54
+ "installed_base": "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13",
55
+ "platbase": "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13",
56
+ "platlibdir": "lib",
57
+ "py_version_short": "3.10"
58
+ },
59
+ "system_executable": "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13/bin/python3.10",
60
+ "system_stdlib": "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13/lib/python3.10",
61
+ "system_stdlib_platform": "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13/lib/python3.10",
62
+ "version": "3.10.13 (main, Aug 24 2023, 12:59:26) [GCC 13.2.0]",
63
+ "version_info": {
64
+ "major": 3,
65
+ "micro": 13,
66
+ "minor": 10,
67
+ "releaselevel": "final",
68
+ "serial": 0
69
+ },
70
+ "version_nodot": "310"
71
+ },
72
+ "path": "/nix/store/1gc9wvzsy15pclrqfspii166p52lmh5i-python3-3.10.13/bin/python3.10",
73
+ "st_mtime": 1.0
74
+ }
.local/share/virtualenv/py_info/1/34a47a33ded45ae8e05857b82cbe1c4de28ab890ad2c29d68abfbba5e2e2da9c.lock ADDED
File without changes
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any.lock ADDED
File without changes
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.dist-info/AUTHORS.txt ADDED
@@ -0,0 +1,751 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @Switch01
2
+ A_Rog
3
+ Aakanksha Agrawal
4
+ Abhinav Sagar
5
+ ABHYUDAY PRATAP SINGH
6
+ abs51295
7
+ AceGentile
8
+ Adam Chainz
9
+ Adam Tse
10
+ Adam Wentz
11
+ admin
12
+ Adrien Morison
13
+ ahayrapetyan
14
+ Ahilya
15
+ AinsworthK
16
+ Akash Srivastava
17
+ Alan Yee
18
+ Albert Tugushev
19
+ Albert-Guan
20
+ albertg
21
+ Alberto Sottile
22
+ Aleks Bunin
23
+ Ales Erjavec
24
+ Alethea Flowers
25
+ Alex Gaynor
26
+ Alex Grönholm
27
+ Alex Hedges
28
+ Alex Loosley
29
+ Alex Morega
30
+ Alex Stachowiak
31
+ Alexander Shtyrov
32
+ Alexandre Conrad
33
+ Alexey Popravka
34
+ Aleš Erjavec
35
+ Alli
36
+ Ami Fischman
37
+ Ananya Maiti
38
+ Anatoly Techtonik
39
+ Anders Kaseorg
40
+ Andre Aguiar
41
+ Andreas Lutro
42
+ Andrei Geacar
43
+ Andrew Gaul
44
+ Andrew Shymanel
45
+ Andrey Bienkowski
46
+ Andrey Bulgakov
47
+ Andrés Delfino
48
+ Andy Freeland
49
+ Andy Kluger
50
+ Ani Hayrapetyan
51
+ Aniruddha Basak
52
+ Anish Tambe
53
+ Anrs Hu
54
+ Anthony Sottile
55
+ Antoine Musso
56
+ Anton Ovchinnikov
57
+ Anton Patrushev
58
+ Antonio Alvarado Hernandez
59
+ Antony Lee
60
+ Antti Kaihola
61
+ Anubhav Patel
62
+ Anudit Nagar
63
+ Anuj Godase
64
+ AQNOUCH Mohammed
65
+ AraHaan
66
+ Arindam Choudhury
67
+ Armin Ronacher
68
+ Artem
69
+ Arun Babu Neelicattu
70
+ Ashley Manton
71
+ Ashwin Ramaswami
72
+ atse
73
+ Atsushi Odagiri
74
+ Avinash Karhana
75
+ Avner Cohen
76
+ Awit (Ah-Wit) Ghirmai
77
+ Baptiste Mispelon
78
+ Barney Gale
79
+ barneygale
80
+ Bartek Ogryczak
81
+ Bastian Venthur
82
+ Ben Bodenmiller
83
+ Ben Darnell
84
+ Ben Hoyt
85
+ Ben Mares
86
+ Ben Rosser
87
+ Bence Nagy
88
+ Benjamin Peterson
89
+ Benjamin VanEvery
90
+ Benoit Pierre
91
+ Berker Peksag
92
+ Bernard
93
+ Bernard Tyers
94
+ Bernardo B. Marques
95
+ Bernhard M. Wiedemann
96
+ Bertil Hatt
97
+ Bhavam Vidyarthi
98
+ Blazej Michalik
99
+ Bogdan Opanchuk
100
+ BorisZZZ
101
+ Brad Erickson
102
+ Bradley Ayers
103
+ Brandon L. Reiss
104
+ Brandt Bucher
105
+ Brett Randall
106
+ Brett Rosen
107
+ Brian Cristante
108
+ Brian Rosner
109
+ briantracy
110
+ BrownTruck
111
+ Bruno Oliveira
112
+ Bruno Renié
113
+ Bruno S
114
+ Bstrdsmkr
115
+ Buck Golemon
116
+ burrows
117
+ Bussonnier Matthias
118
+ bwoodsend
119
+ c22
120
+ Caleb Martinez
121
+ Calvin Smith
122
+ Carl Meyer
123
+ Carlos Liam
124
+ Carol Willing
125
+ Carter Thayer
126
+ Cass
127
+ Chandrasekhar Atina
128
+ Chih-Hsuan Yen
129
+ Chris Brinker
130
+ Chris Hunt
131
+ Chris Jerdonek
132
+ Chris Kuehl
133
+ Chris McDonough
134
+ Chris Pawley
135
+ Chris Pryer
136
+ Chris Wolfe
137
+ Christian Clauss
138
+ Christian Heimes
139
+ Christian Oudard
140
+ Christoph Reiter
141
+ Christopher Hunt
142
+ Christopher Snyder
143
+ cjc7373
144
+ Clark Boylan
145
+ Claudio Jolowicz
146
+ Clay McClure
147
+ Cody
148
+ Cody Soyland
149
+ Colin Watson
150
+ Collin Anderson
151
+ Connor Osborn
152
+ Cooper Lees
153
+ Cooper Ry Lees
154
+ Cory Benfield
155
+ Cory Wright
156
+ Craig Kerstiens
157
+ Cristian Sorinel
158
+ Cristina
159
+ Cristina Muñoz
160
+ Curtis Doty
161
+ cytolentino
162
+ Daan De Meyer
163
+ Damian
164
+ Damian Quiroga
165
+ Damian Shaw
166
+ Dan Black
167
+ Dan Savilonis
168
+ Dan Sully
169
+ Dane Hillard
170
+ daniel
171
+ Daniel Collins
172
+ Daniel Hahler
173
+ Daniel Holth
174
+ Daniel Jost
175
+ Daniel Katz
176
+ Daniel Shaulov
177
+ Daniele Esposti
178
+ Daniele Nicolodi
179
+ Daniele Procida
180
+ Daniil Konovalenko
181
+ Danny Hermes
182
+ Danny McClanahan
183
+ Darren Kavanagh
184
+ Dav Clark
185
+ Dave Abrahams
186
+ Dave Jones
187
+ David Aguilar
188
+ David Black
189
+ David Bordeynik
190
+ David Caro
191
+ David D Lowe
192
+ David Evans
193
+ David Hewitt
194
+ David Linke
195
+ David Poggi
196
+ David Pursehouse
197
+ David Runge
198
+ David Tucker
199
+ David Wales
200
+ Davidovich
201
+ ddelange
202
+ Deepak Sharma
203
+ Deepyaman Datta
204
+ Denise Yu
205
+ dependabot[bot]
206
+ derwolfe
207
+ Desetude
208
+ Devesh Kumar Singh
209
+ Diego Caraballo
210
+ Diego Ramirez
211
+ DiegoCaraballo
212
+ Dimitri Merejkowsky
213
+ Dimitri Papadopoulos
214
+ Dirk Stolle
215
+ Dmitry Gladkov
216
+ Dmitry Volodin
217
+ Domen Kožar
218
+ Dominic Davis-Foster
219
+ Donald Stufft
220
+ Dongweiming
221
+ doron zarhi
222
+ Dos Moonen
223
+ Douglas Thor
224
+ DrFeathers
225
+ Dustin Ingram
226
+ Dwayne Bailey
227
+ Ed Morley
228
+ Edgar Ramírez
229
+ Ee Durbin
230
+ Eitan Adler
231
+ ekristina
232
+ elainechan
233
+ Eli Schwartz
234
+ Elisha Hollander
235
+ Ellen Marie Dash
236
+ Emil Burzo
237
+ Emil Styrke
238
+ Emmanuel Arias
239
+ Endoh Takanao
240
+ enoch
241
+ Erdinc Mutlu
242
+ Eric Cousineau
243
+ Eric Gillingham
244
+ Eric Hanchrow
245
+ Eric Hopper
246
+ Erik M. Bray
247
+ Erik Rose
248
+ Erwin Janssen
249
+ Eugene Vereshchagin
250
+ everdimension
251
+ Federico
252
+ Felipe Peter
253
+ Felix Yan
254
+ fiber-space
255
+ Filip Kokosiński
256
+ Filipe Laíns
257
+ Finn Womack
258
+ finnagin
259
+ Florian Briand
260
+ Florian Rathgeber
261
+ Francesco
262
+ Francesco Montesano
263
+ Frost Ming
264
+ Gabriel Curio
265
+ Gabriel de Perthuis
266
+ Garry Polley
267
+ gavin
268
+ gdanielson
269
+ Geoffrey Sneddon
270
+ George Song
271
+ Georgi Valkov
272
+ Georgy Pchelkin
273
+ ghost
274
+ Giftlin Rajaiah
275
+ gizmoguy1
276
+ gkdoc
277
+ Godefroid Chapelle
278
+ Gopinath M
279
+ GOTO Hayato
280
+ gousaiyang
281
+ gpiks
282
+ Greg Roodt
283
+ Greg Ward
284
+ Guilherme Espada
285
+ Guillaume Seguin
286
+ gutsytechster
287
+ Guy Rozendorn
288
+ Guy Tuval
289
+ gzpan123
290
+ Hanjun Kim
291
+ Hari Charan
292
+ Harsh Vardhan
293
+ harupy
294
+ Harutaka Kawamura
295
+ hauntsaninja
296
+ Henrich Hartzer
297
+ Henry Schreiner
298
+ Herbert Pfennig
299
+ Holly Stotelmyer
300
+ Honnix
301
+ Hsiaoming Yang
302
+ Hugo Lopes Tavares
303
+ Hugo van Kemenade
304
+ Hugues Bruant
305
+ Hynek Schlawack
306
+ Ian Bicking
307
+ Ian Cordasco
308
+ Ian Lee
309
+ Ian Stapleton Cordasco
310
+ Ian Wienand
311
+ Igor Kuzmitshov
312
+ Igor Sobreira
313
+ Ilan Schnell
314
+ Illia Volochii
315
+ Ilya Baryshev
316
+ Inada Naoki
317
+ Ionel Cristian Mărieș
318
+ Ionel Maries Cristian
319
+ Itamar Turner-Trauring
320
+ Ivan Pozdeev
321
+ Jacob Kim
322
+ Jacob Walls
323
+ Jaime Sanz
324
+ jakirkham
325
+ Jakub Kuczys
326
+ Jakub Stasiak
327
+ Jakub Vysoky
328
+ Jakub Wilk
329
+ James Cleveland
330
+ James Curtin
331
+ James Firth
332
+ James Gerity
333
+ James Polley
334
+ Jan Pokorný
335
+ Jannis Leidel
336
+ Jarek Potiuk
337
+ jarondl
338
+ Jason Curtis
339
+ Jason R. Coombs
340
+ JasonMo
341
+ JasonMo1
342
+ Jay Graves
343
+ Jean-Christophe Fillion-Robin
344
+ Jeff Barber
345
+ Jeff Dairiki
346
+ Jeff Widman
347
+ Jelmer Vernooij
348
+ jenix21
349
+ Jeremy Stanley
350
+ Jeremy Zafran
351
+ Jesse Rittner
352
+ Jiashuo Li
353
+ Jim Fisher
354
+ Jim Garrison
355
+ Jiun Bae
356
+ Jivan Amara
357
+ Joe Bylund
358
+ Joe Michelini
359
+ John Paton
360
+ John T. Wodder II
361
+ John-Scott Atlakson
362
+ johnthagen
363
+ Jon Banafato
364
+ Jon Dufresne
365
+ Jon Parise
366
+ Jonas Nockert
367
+ Jonathan Herbert
368
+ Joonatan Partanen
369
+ Joost Molenaar
370
+ Jorge Niedbalski
371
+ Joseph Bylund
372
+ Joseph Long
373
+ Josh Bronson
374
+ Josh Hansen
375
+ Josh Schneier
376
+ Joshua
377
+ Juan Luis Cano Rodríguez
378
+ Juanjo Bazán
379
+ Judah Rand
380
+ Julian Berman
381
+ Julian Gethmann
382
+ Julien Demoor
383
+ Jussi Kukkonen
384
+ jwg4
385
+ Jyrki Pulliainen
386
+ Kai Chen
387
+ Kai Mueller
388
+ Kamal Bin Mustafa
389
+ kasium
390
+ kaustav haldar
391
+ keanemind
392
+ Keith Maxwell
393
+ Kelsey Hightower
394
+ Kenneth Belitzky
395
+ Kenneth Reitz
396
+ Kevin Burke
397
+ Kevin Carter
398
+ Kevin Frommelt
399
+ Kevin R Patterson
400
+ Kexuan Sun
401
+ Kit Randel
402
+ Klaas van Schelven
403
+ KOLANICH
404
+ kpinc
405
+ Krishna Oza
406
+ Kumar McMillan
407
+ Kurt McKee
408
+ Kyle Persohn
409
+ lakshmanaram
410
+ Laszlo Kiss-Kollar
411
+ Laurent Bristiel
412
+ Laurent LAPORTE
413
+ Laurie O
414
+ Laurie Opperman
415
+ layday
416
+ Leon Sasson
417
+ Lev Givon
418
+ Lincoln de Sousa
419
+ Lipis
420
+ lorddavidiii
421
+ Loren Carvalho
422
+ Lucas Cimon
423
+ Ludovic Gasc
424
+ Lukas Geiger
425
+ Lukas Juhrich
426
+ Luke Macken
427
+ Luo Jiebin
428
+ luojiebin
429
+ luz.paz
430
+ László Kiss Kollár
431
+ M00nL1ght
432
+ Marc Abramowitz
433
+ Marc Tamlyn
434
+ Marcus Smith
435
+ Mariatta
436
+ Mark Kohler
437
+ Mark Williams
438
+ Markus Hametner
439
+ Martey Dodoo
440
+ Martin Fischer
441
+ Martin Häcker
442
+ Martin Pavlasek
443
+ Masaki
444
+ Masklinn
445
+ Matej Stuchlik
446
+ Mathew Jennings
447
+ Mathieu Bridon
448
+ Mathieu Kniewallner
449
+ Matt Bacchi
450
+ Matt Good
451
+ Matt Maker
452
+ Matt Robenolt
453
+ matthew
454
+ Matthew Einhorn
455
+ Matthew Feickert
456
+ Matthew Gilliard
457
+ Matthew Iversen
458
+ Matthew Treinish
459
+ Matthew Trumbell
460
+ Matthew Willson
461
+ Matthias Bussonnier
462
+ mattip
463
+ Maurits van Rees
464
+ Max W Chase
465
+ Maxim Kurnikov
466
+ Maxime Rouyrre
467
+ mayeut
468
+ mbaluna
469
+ mdebi
470
+ memoselyk
471
+ meowmeowcat
472
+ Michael
473
+ Michael Aquilina
474
+ Michael E. Karpeles
475
+ Michael Klich
476
+ Michael Mintz
477
+ Michael Williamson
478
+ michaelpacer
479
+ Michał Górny
480
+ Mickaël Schoentgen
481
+ Miguel Araujo Perez
482
+ Mihir Singh
483
+ Mike
484
+ Mike Hendricks
485
+ Min RK
486
+ MinRK
487
+ Miro Hrončok
488
+ Monica Baluna
489
+ montefra
490
+ Monty Taylor
491
+ Muha Ajjan‮
492
+ Nadav Wexler
493
+ Nahuel Ambrosini
494
+ Nate Coraor
495
+ Nate Prewitt
496
+ Nathan Houghton
497
+ Nathaniel J. Smith
498
+ Nehal J Wani
499
+ Neil Botelho
500
+ Nguyễn Gia Phong
501
+ Nicholas Serra
502
+ Nick Coghlan
503
+ Nick Stenning
504
+ Nick Timkovich
505
+ Nicolas Bock
506
+ Nicole Harris
507
+ Nikhil Benesch
508
+ Nikhil Ladha
509
+ Nikita Chepanov
510
+ Nikolay Korolev
511
+ Nipunn Koorapati
512
+ Nitesh Sharma
513
+ Niyas Sait
514
+ Noah
515
+ Noah Gorny
516
+ Nowell Strite
517
+ NtaleGrey
518
+ nvdv
519
+ OBITORASU
520
+ Ofek Lev
521
+ ofrinevo
522
+ Oliver Freund
523
+ Oliver Jeeves
524
+ Oliver Mannion
525
+ Oliver Tonnhofer
526
+ Olivier Girardot
527
+ Olivier Grisel
528
+ Ollie Rutherfurd
529
+ OMOTO Kenji
530
+ Omry Yadan
531
+ onlinejudge95
532
+ Oren Held
533
+ Oscar Benjamin
534
+ Oz N Tiram
535
+ Pachwenko
536
+ Patrick Dubroy
537
+ Patrick Jenkins
538
+ Patrick Lawson
539
+ patricktokeeffe
540
+ Patrik Kopkan
541
+ Paul Ganssle
542
+ Paul Kehrer
543
+ Paul Moore
544
+ Paul Nasrat
545
+ Paul Oswald
546
+ Paul van der Linden
547
+ Paulus Schoutsen
548
+ Pavel Safronov
549
+ Pavithra Eswaramoorthy
550
+ Pawel Jasinski
551
+ Paweł Szramowski
552
+ Pekka Klärck
553
+ Peter Gessler
554
+ Peter Lisák
555
+ Peter Waller
556
+ petr-tik
557
+ Phaneendra Chiruvella
558
+ Phil Elson
559
+ Phil Freo
560
+ Phil Pennock
561
+ Phil Whelan
562
+ Philip Jägenstedt
563
+ Philip Molloy
564
+ Philippe Ombredanne
565
+ Pi Delport
566
+ Pierre-Yves Rofes
567
+ Pieter Degroote
568
+ pip
569
+ Prabakaran Kumaresshan
570
+ Prabhjyotsing Surjit Singh Sodhi
571
+ Prabhu Marappan
572
+ Pradyun Gedam
573
+ Prashant Sharma
574
+ Pratik Mallya
575
+ pre-commit-ci[bot]
576
+ Preet Thakkar
577
+ Preston Holmes
578
+ Przemek Wrzos
579
+ Pulkit Goyal
580
+ q0w
581
+ Qiangning Hong
582
+ Quentin Lee
583
+ Quentin Pradet
584
+ R. David Murray
585
+ Rafael Caricio
586
+ Ralf Schmitt
587
+ Razzi Abuissa
588
+ rdb
589
+ Reece Dunham
590
+ Remi Rampin
591
+ Rene Dudfield
592
+ Riccardo Magliocchetti
593
+ Riccardo Schirone
594
+ Richard Jones
595
+ Richard Si
596
+ Ricky Ng-Adam
597
+ Rishi
598
+ RobberPhex
599
+ Robert Collins
600
+ Robert McGibbon
601
+ Robert Pollak
602
+ Robert T. McGibbon
603
+ robin elisha robinson
604
+ Roey Berman
605
+ Rohan Jain
606
+ Roman Bogorodskiy
607
+ Roman Donchenko
608
+ Romuald Brunet
609
+ ronaudinho
610
+ Ronny Pfannschmidt
611
+ Rory McCann
612
+ Ross Brattain
613
+ Roy Wellington Ⅳ
614
+ Ruairidh MacLeod
615
+ Russell Keith-Magee
616
+ Ryan Shepherd
617
+ Ryan Wooden
618
+ ryneeverett
619
+ Sachi King
620
+ Salvatore Rinchiera
621
+ sandeepkiran-js
622
+ Sander Van Balen
623
+ Savio Jomton
624
+ schlamar
625
+ Scott Kitterman
626
+ Sean
627
+ seanj
628
+ Sebastian Jordan
629
+ Sebastian Schaetz
630
+ Segev Finer
631
+ SeongSoo Cho
632
+ Sergey Vasilyev
633
+ Seth Michael Larson
634
+ Seth Woodworth
635
+ Shahar Epstein
636
+ Shantanu
637
+ shireenrao
638
+ Shivansh-007
639
+ Shlomi Fish
640
+ Shovan Maity
641
+ Simeon Visser
642
+ Simon Cross
643
+ Simon Pichugin
644
+ sinoroc
645
+ sinscary
646
+ snook92
647
+ socketubs
648
+ Sorin Sbarnea
649
+ Srinivas Nyayapati
650
+ Stavros Korokithakis
651
+ Stefan Scherfke
652
+ Stefano Rivera
653
+ Stephan Erb
654
+ Stephen Rosen
655
+ stepshal
656
+ Steve (Gadget) Barnes
657
+ Steve Barnes
658
+ Steve Dower
659
+ Steve Kowalik
660
+ Steven Myint
661
+ Steven Silvester
662
+ stonebig
663
+ studioj
664
+ Stéphane Bidoul
665
+ Stéphane Bidoul (ACSONE)
666
+ Stéphane Klein
667
+ Sumana Harihareswara
668
+ Surbhi Sharma
669
+ Sviatoslav Sydorenko
670
+ Swat009
671
+ Sylvain
672
+ Takayuki SHIMIZUKAWA
673
+ Taneli Hukkinen
674
+ tbeswick
675
+ Thiago
676
+ Thijs Triemstra
677
+ Thomas Fenzl
678
+ Thomas Grainger
679
+ Thomas Guettler
680
+ Thomas Johansson
681
+ Thomas Kluyver
682
+ Thomas Smith
683
+ Thomas VINCENT
684
+ Tim D. Smith
685
+ Tim Gates
686
+ Tim Harder
687
+ Tim Heap
688
+ tim smith
689
+ tinruufu
690
+ Tobias Hermann
691
+ Tom Forbes
692
+ Tom Freudenheim
693
+ Tom V
694
+ Tomas Hrnciar
695
+ Tomas Orsava
696
+ Tomer Chachamu
697
+ Tommi Enenkel | AnB
698
+ Tomáš Hrnčiar
699
+ Tony Beswick
700
+ Tony Narlock
701
+ Tony Zhaocheng Tan
702
+ TonyBeswick
703
+ toonarmycaptain
704
+ Toshio Kuratomi
705
+ toxinu
706
+ Travis Swicegood
707
+ Tushar Sadhwani
708
+ Tzu-ping Chung
709
+ Valentin Haenel
710
+ Victor Stinner
711
+ victorvpaulo
712
+ Vikram - Google
713
+ Viktor Szépe
714
+ Ville Skyttä
715
+ Vinay Sajip
716
+ Vincent Philippon
717
+ Vinicyus Macedo
718
+ Vipul Kumar
719
+ Vitaly Babiy
720
+ Vladimir Rutsky
721
+ W. Trevor King
722
+ Wil Tan
723
+ Wilfred Hughes
724
+ William Edwards
725
+ William ML Leslie
726
+ William T Olson
727
+ William Woodruff
728
+ Wilson Mo
729
+ wim glenn
730
+ Winson Luk
731
+ Wolfgang Maier
732
+ Wu Zhenyu
733
+ XAMES3
734
+ Xavier Fernandez
735
+ xoviat
736
+ xtreak
737
+ YAMAMOTO Takashi
738
+ Yen Chi Hsuan
739
+ Yeray Diaz Diaz
740
+ Yoval P
741
+ Yu Jian
742
+ Yuan Jing Vincent Yan
743
+ Yusuke Hayashi
744
+ Zearin
745
+ Zhiping Deng
746
+ ziebam
747
+ Zvezdan Petkovic
748
+ Łukasz Langa
749
+ Роман Донченко
750
+ Семён Марьясин
751
+ ‮rekcäH nitraM‮
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.dist-info/INSTALLER ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.dist-info/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2008-present The pip developers (see AUTHORS.txt file)
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.dist-info/METADATA ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Metadata-Version: 2.1
2
+ Name: pip
3
+ Version: 23.3.1
4
+ Summary: The PyPA recommended tool for installing Python packages.
5
+ Home-page: https://pip.pypa.io/
6
+ Author: The pip developers
7
+ Author-email: distutils-sig@python.org
8
+ License: MIT
9
+ Project-URL: Documentation, https://pip.pypa.io
10
+ Project-URL: Source, https://github.com/pypa/pip
11
+ Project-URL: Changelog, https://pip.pypa.io/en/stable/news/
12
+ Classifier: Development Status :: 5 - Production/Stable
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Topic :: Software Development :: Build Tools
16
+ Classifier: Programming Language :: Python
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3 :: Only
19
+ Classifier: Programming Language :: Python :: 3.7
20
+ Classifier: Programming Language :: Python :: 3.8
21
+ Classifier: Programming Language :: Python :: 3.9
22
+ Classifier: Programming Language :: Python :: 3.10
23
+ Classifier: Programming Language :: Python :: 3.11
24
+ Classifier: Programming Language :: Python :: 3.12
25
+ Classifier: Programming Language :: Python :: Implementation :: CPython
26
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
27
+ Requires-Python: >=3.7
28
+ License-File: LICENSE.txt
29
+ License-File: AUTHORS.txt
30
+
31
+ pip - The Python Package Installer
32
+ ==================================
33
+
34
+ .. image:: https://img.shields.io/pypi/v/pip.svg
35
+ :target: https://pypi.org/project/pip/
36
+ :alt: PyPI
37
+
38
+ .. image:: https://img.shields.io/pypi/pyversions/pip
39
+ :target: https://pypi.org/project/pip
40
+ :alt: PyPI - Python Version
41
+
42
+ .. image:: https://readthedocs.org/projects/pip/badge/?version=latest
43
+ :target: https://pip.pypa.io/en/latest
44
+ :alt: Documentation
45
+
46
+ pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.
47
+
48
+ Please take a look at our documentation for how to install and use pip:
49
+
50
+ * `Installation`_
51
+ * `Usage`_
52
+
53
+ We release updates regularly, with a new version every 3 months. Find more details in our documentation:
54
+
55
+ * `Release notes`_
56
+ * `Release process`_
57
+
58
+ If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:
59
+
60
+ * `Issue tracking`_
61
+ * `Discourse channel`_
62
+ * `User IRC`_
63
+
64
+ If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms:
65
+
66
+ * `GitHub page`_
67
+ * `Development documentation`_
68
+ * `Development IRC`_
69
+
70
+ Code of Conduct
71
+ ---------------
72
+
73
+ Everyone interacting in the pip project's codebases, issue trackers, chat
74
+ rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.
75
+
76
+ .. _package installer: https://packaging.python.org/guides/tool-recommendations/
77
+ .. _Python Package Index: https://pypi.org
78
+ .. _Installation: https://pip.pypa.io/en/stable/installation/
79
+ .. _Usage: https://pip.pypa.io/en/stable/
80
+ .. _Release notes: https://pip.pypa.io/en/stable/news.html
81
+ .. _Release process: https://pip.pypa.io/en/latest/development/release-process/
82
+ .. _GitHub page: https://github.com/pypa/pip
83
+ .. _Development documentation: https://pip.pypa.io/en/latest/development
84
+ .. _Issue tracking: https://github.com/pypa/pip/issues
85
+ .. _Discourse channel: https://discuss.python.org/c/packaging
86
+ .. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
87
+ .. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
88
+ .. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.dist-info/RECORD ADDED
@@ -0,0 +1,1072 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ pip/__init__.py,sha256=MSbZQYwV5U4mAXP2fBQh70QhM71N-1vh7T4CRREqVog,357
2
+ pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854
3
+ pip/__pip-runner__.py,sha256=EnrfKmKMzWAdqg_JicLCOP9Y95Ux7zHh4ObvqLtQcjo,1444
4
+ pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286
5
+ pip/_internal/__init__.py,sha256=iqZ5-YQsQV08tkUc7L806Reop6tguLFWf70ySF6be0Y,515
6
+ pip/_internal/build_env.py,sha256=1ESpqw0iupS_K7phZK5zshVE5Czy9BtGLFU4W6Enva8,10243
7
+ pip/_internal/cache.py,sha256=uiYD-9F0Bv1C8ZyWE85lpzDmQf7hcUkgL99GmI8I41Q,10370
8
+ pip/_internal/configuration.py,sha256=i_dePJKndPAy7hf48Sl6ZuPyl3tFPCE67z0SNatwuwE,13839
9
+ pip/_internal/exceptions.py,sha256=LyTVY2dANx-i_TEk5Yr9YcwUtiy0HOEFCAQq1F_46co,23737
10
+ pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340
11
+ pip/_internal/pyproject.py,sha256=ltmrXWaMXjiJHbYyzWplTdBvPYPdKk99GjKuQVypGZU,7161
12
+ pip/_internal/self_outdated_check.py,sha256=saxQLB8UzIFtMScquytG10TOTsYVFJQ_mkW1NY-46wE,8378
13
+ pip/_internal/wheel_builder.py,sha256=3UlHfxQi7_AAXI7ur8aPpPbmqHhecCsubmkHEl-00KU,11842
14
+ pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132
15
+ pip/_internal/cli/autocompletion.py,sha256=_br_5NgSxSuvPjMF0MLHzS5s6BpSkQAQHKrLK89VauM,6690
16
+ pip/_internal/cli/base_command.py,sha256=iuVWGa2oTq7gBReo0er3Z0tXJ2oqBIC6QjDHcnDhKXY,8733
17
+ pip/_internal/cli/cmdoptions.py,sha256=fAi5GzWuM9mKUesJZO56LcPCVMDtm64c2tC_YUpI1qs,30117
18
+ pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774
19
+ pip/_internal/cli/main.py,sha256=Uzxt_YD1hIvB1AW5mxt6IVcht5G712AtMqdo51UMhmQ,2816
20
+ pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338
21
+ pip/_internal/cli/parser.py,sha256=o4esYgG-rvPsf6FBpF3fSLGHa4ndDvJtwxBgeckGyfI,10801
22
+ pip/_internal/cli/progress_bars.py,sha256=So4mPoSjXkXiSHiTzzquH3VVyVD_njXlHJSExYPXAow,1968
23
+ pip/_internal/cli/req_command.py,sha256=c7_XHABnXmD3_qlK9-r37KqdKBAcgmVKvQ2WcTrNLfc,18369
24
+ pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118
25
+ pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
26
+ pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882
27
+ pip/_internal/commands/cache.py,sha256=LfPA8wNcgZtjiI5faeFFCR2Zp-ugaj7XX--FmKxx4_4,7952
28
+ pip/_internal/commands/check.py,sha256=Rb13Q28yoLh0j1gpx5SU0jlResNct21eQCRsnaO9xKA,1782
29
+ pip/_internal/commands/completion.py,sha256=HT4lD0bgsflHq2IDgYfiEdp7IGGtE7s6MgI3xn0VQEw,4287
30
+ pip/_internal/commands/configuration.py,sha256=NB5uf8HIX8-li95YLoZO09nALIWlLCHDF5aifSKcBn8,9815
31
+ pip/_internal/commands/debug.py,sha256=L15rfN8DwORQln-QW3ihBaVdCfV7Iba-lwlcyw1f_Vk,6854
32
+ pip/_internal/commands/download.py,sha256=e4hw088zGo26WmJaMIRvCniLlLmoOjqolGyfHjsCkCQ,5335
33
+ pip/_internal/commands/freeze.py,sha256=2qjQrH9KWi5Roav0CuR7vc7hWm4uOi_0l6tp3ESKDHM,3172
34
+ pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703
35
+ pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132
36
+ pip/_internal/commands/index.py,sha256=cGQVSA5dAs7caQ9sz4kllYvaI4ZpGiq1WhCgaImXNSA,4793
37
+ pip/_internal/commands/inspect.py,sha256=2wSPt9yfr3r6g-s2S5L6PvRtaHNVyb4TuodMStJ39cw,3188
38
+ pip/_internal/commands/install.py,sha256=KTHT8EASlPfbNx428tcvnGhN8D9jlfBwcRa5lxEhFsA,28920
39
+ pip/_internal/commands/list.py,sha256=7wRUUmdyyOknl-WZYbO_LtFQxHlWod3pjOY9yYH435o,12450
40
+ pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697
41
+ pip/_internal/commands/show.py,sha256=t5jia4zcYJRJZy4U_Von7zMl03hJmmcofj6oDNTnj7Y,6419
42
+ pip/_internal/commands/uninstall.py,sha256=OIqO9tqadY8kM4HwhFf1Q62fUIp7v8KDrTRo8yWMz7Y,3886
43
+ pip/_internal/commands/wheel.py,sha256=CSnX8Pmf1oPCnd7j7bn1_f58G9KHNiAblvVJ5zykN-A,6476
44
+ pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858
45
+ pip/_internal/distributions/base.py,sha256=oRSEvnv2ZjBnargamnv2fcJa1n6gUDKaW0g6CWSEpWs,1743
46
+ pip/_internal/distributions/installed.py,sha256=QinHFbWAQ8oE0pbD8MFZWkwlnfU1QYTccA1vnhrlYOU,842
47
+ pip/_internal/distributions/sdist.py,sha256=4K3V0VNMllHbBzCJibjwd_tylUKpmIdu2AQyhplvCQo,6709
48
+ pip/_internal/distributions/wheel.py,sha256=-ma3sOtUQj0AxXCEb6_Fhmjl3nh4k3A0HC2taAb2N-4,1277
49
+ pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30
50
+ pip/_internal/index/collector.py,sha256=3OmYZ3tCoRPGOrELSgQWG-03M-bQHa2-VCA3R_nJAaU,16504
51
+ pip/_internal/index/package_finder.py,sha256=uA354-mHjHvTwxDmk9HvpAkq_7KyGvEd7_9aZFqu0HY,37889
52
+ pip/_internal/index/sources.py,sha256=7jw9XSeeQA5K-H4I5a5034Ks2gkQqm4zPXjrhwnP1S4,6556
53
+ pip/_internal/locations/__init__.py,sha256=Dh8LJWG8LRlDK4JIj9sfRF96TREzE--N_AIlx7Tqoe4,15365
54
+ pip/_internal/locations/_distutils.py,sha256=DXL6H3xERLF76BjcYanV4j-4Sw-qcPdO2qeZhLN30WQ,6102
55
+ pip/_internal/locations/_sysconfig.py,sha256=jyNVtUfMIf0mtyY-Xp1m9yQ8iwECozSVVFmjkN9a2yw,7680
56
+ pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556
57
+ pip/_internal/metadata/__init__.py,sha256=9pU3W3s-6HtjFuYhWcLTYVmSaziklPv7k2x8p7X1GmA,4339
58
+ pip/_internal/metadata/_json.py,sha256=BTkWfFDrWFwuSodImjtbAh8wCL3isecbnjTb5E6UUDI,2595
59
+ pip/_internal/metadata/base.py,sha256=l3Wgku4xlgr8s4p6fS-3qQ4QKOpPbWLRwi5d9omEFG4,25907
60
+ pip/_internal/metadata/pkg_resources.py,sha256=opjw4IBSqHvie6sXJ_cbT42meygoPEUfNURJuWZY7sk,10035
61
+ pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135
62
+ pip/_internal/metadata/importlib/_compat.py,sha256=GAe_prIfCE4iUylrnr_2dJRlkkBVRUbOidEoID7LPoE,1882
63
+ pip/_internal/metadata/importlib/_dists.py,sha256=UPl1wUujFqiwiltRJ1tMF42WRINO1sSpNNlYQ2mX0mk,8297
64
+ pip/_internal/metadata/importlib/_envs.py,sha256=XTaFIYERP2JF0QUZuPx2ETiugXbPEcZ8q8ZKeht6Lpc,7456
65
+ pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63
66
+ pip/_internal/models/candidate.py,sha256=6pcABsaR7CfIHlbJbr2_kMkVJFL_yrYjTx6SVWUnCPQ,990
67
+ pip/_internal/models/direct_url.py,sha256=EepBxI97j7wSZ3AmRETYyVTmR9NoTas15vc8popxVTg,6931
68
+ pip/_internal/models/format_control.py,sha256=DJpMYjxeYKKQdwNcML2_F0vtAh-qnKTYe-CpTxQe-4g,2520
69
+ pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030
70
+ pip/_internal/models/installation_report.py,sha256=zRVZoaz-2vsrezj_H3hLOhMZCK9c7TbzWgC-jOalD00,2818
71
+ pip/_internal/models/link.py,sha256=6OEk3bt41WU7QZoiyuoVPGsKOU-J_BbDDhouKbIXm0Y,20819
72
+ pip/_internal/models/scheme.py,sha256=3EFQp_ICu_shH1-TBqhl0QAusKCPDFOlgHFeN4XowWs,738
73
+ pip/_internal/models/search_scope.py,sha256=ASVyyZxiJILw7bTIVVpJx8J293M3Hk5F33ilGn0e80c,4643
74
+ pip/_internal/models/selection_prefs.py,sha256=KZdi66gsR-_RUXUr9uejssk3rmTHrQVJWeNA2sV-VSY,1907
75
+ pip/_internal/models/target_python.py,sha256=34EkorrMuRvRp-bjqHKJ-bOO71m9xdjN2b8WWFEC2HU,4272
76
+ pip/_internal/models/wheel.py,sha256=YqazoIZyma_Q1ejFa1C7NHKQRRWlvWkdK96VRKmDBeI,3600
77
+ pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50
78
+ pip/_internal/network/auth.py,sha256=TC-OcW2KU4W6R1hU4qPgQXvVH54adACpZz6sWq-R9NA,20541
79
+ pip/_internal/network/cache.py,sha256=48A971qCzKNFvkb57uGEk7-0xaqPS0HWj2711QNTxkU,3935
80
+ pip/_internal/network/download.py,sha256=HvDDq9bVqaN3jcS3DyVJHP7uTqFzbShdkf7NFSoHfkw,6096
81
+ pip/_internal/network/lazy_wheel.py,sha256=2PXVduYZPCPZkkQFe1J1GbfHJWeCU--FXonGyIfw9eU,7638
82
+ pip/_internal/network/session.py,sha256=uhovd4J7abd0Yr2g426yC4aC6Uw1VKrQfpzalsEBEMw,18607
83
+ pip/_internal/network/utils.py,sha256=6A5SrUJEEUHxbGtbscwU2NpCyz-3ztiDlGWHpRRhsJ8,4073
84
+ pip/_internal/network/xmlrpc.py,sha256=AzQgG4GgS152_cqmGr_Oz2MIXsCal-xfsis7fA7nmU0,1791
85
+ pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
+ pip/_internal/operations/check.py,sha256=Hgz0wQJ4fGi8aAVfmdShviNc7XM_2j8oMQJUsVv6AqY,6806
87
+ pip/_internal/operations/freeze.py,sha256=uqoeTAf6HOYVMR2UgAT8N85UZoGEVEoQdan_Ao6SOfk,9816
88
+ pip/_internal/operations/prepare.py,sha256=NWkGkNOjrnnUbHgJPTms_5usKF0M8JlaHL3nyIHABMk,28155
89
+ pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
+ pip/_internal/operations/build/build_tracker.py,sha256=z-H5DOknZdBa3dh2Vq6VBMY5qLYIKmlj2p6CGZK5Lc8,4832
91
+ pip/_internal/operations/build/metadata.py,sha256=9S0CUD8U3QqZeXp-Zyt8HxwU90lE4QrnYDgrqZDzBnc,1422
92
+ pip/_internal/operations/build/metadata_editable.py,sha256=VLL7LvntKE8qxdhUdEJhcotFzUsOSI8NNS043xULKew,1474
93
+ pip/_internal/operations/build/metadata_legacy.py,sha256=o-eU21As175hDC7dluM1fJJ_FqokTIShyWpjKaIpHZw,2198
94
+ pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075
95
+ pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417
96
+ pip/_internal/operations/build/wheel_legacy.py,sha256=C9j6rukgQI1n_JeQLoZGuDdfUwzCXShyIdPTp6edbMQ,3064
97
+ pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51
98
+ pip/_internal/operations/install/editable_legacy.py,sha256=YeR0KadWXw_ZheC1NtAG1qVIEkOgRGHc23x-YtGW7NU,1282
99
+ pip/_internal/operations/install/wheel.py,sha256=a5KnguJ9uQRo7Ikq4YJEno0fFltXYlud-0DpRj3zLr0,27457
100
+ pip/_internal/req/__init__.py,sha256=TELFgZOof3lhMmaICVWL9U7PlhXo9OufokbMAJ6J2GI,2738
101
+ pip/_internal/req/constructors.py,sha256=PgLoQlsZ_ErZORw5M1mgnxW5V4mKZC0-gyj_3k4hCe0,19028
102
+ pip/_internal/req/req_file.py,sha256=5PCO4GnDEnUENiFj4vD_1QmAMjHNtvN6HXbETZ9UGok,17872
103
+ pip/_internal/req/req_install.py,sha256=XvoTWTF7STk9EUqIphdOI0ZtQOplw44PIl9TCb-HtXw,35130
104
+ pip/_internal/req/req_set.py,sha256=nM-CetUtESEH31fdugrOl20GV5-pCUYAvu65FwYDJeI,4704
105
+ pip/_internal/req/req_uninstall.py,sha256=m9GlbQ3rzLORTSa6NPFFCmONmC5zTw2lY_0fLOkLYCk,24676
106
+ pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
+ pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583
108
+ pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
109
+ pip/_internal/resolution/legacy/resolver.py,sha256=th-eTPIvbecfJaUsdrbH1aHQvDV2yCE-RhrrpsJhKbE,24128
110
+ pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
+ pip/_internal/resolution/resolvelib/base.py,sha256=jg5COmHLhmBIKOR-4spdJD3jyULYa1BdsqiBu2YJnJ4,5173
112
+ pip/_internal/resolution/resolvelib/candidates.py,sha256=IAcXcBj-LLzJwwfBXFGyhpxir42CMBW64oCc4zEgLYo,21320
113
+ pip/_internal/resolution/resolvelib/factory.py,sha256=FIOXvrdEGo6DMtLF9gqhUd4IQphPUkAYUe8ZIQ0ThMY,31317
114
+ pip/_internal/resolution/resolvelib/found_candidates.py,sha256=hvL3Hoa9VaYo-qEOZkBi2Iqw251UDxPz-uMHVaWmLpE,5705
115
+ pip/_internal/resolution/resolvelib/provider.py,sha256=4t23ivjruqM6hKBX1KpGiTt-M4HGhRcZnGLV0c01K7U,9824
116
+ pip/_internal/resolution/resolvelib/reporter.py,sha256=YFm9hQvz4DFCbjZeFTQ56hTz3Ac-mDBnHkeNRVvMHLY,3100
117
+ pip/_internal/resolution/resolvelib/requirements.py,sha256=SZh98hbSVbHiHBkgjrSLtdrrZB1zqRIUqFdXptS-aVY,6030
118
+ pip/_internal/resolution/resolvelib/resolver.py,sha256=nLJOsVMEVi2gQUVJoUFKMZAeu2f7GRMjGMvNSWyz0Bc,12592
119
+ pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
120
+ pip/_internal/utils/_jaraco_text.py,sha256=yvDGelTVugRayPaOF2k4ab0Ky4d3uOkAfuOQjASjImY,3351
121
+ pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015
122
+ pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665
123
+ pip/_internal/utils/compat.py,sha256=ACyBfLgj3_XG-iA5omEDrXqDM0cQKzi8h8HRBInzG6Q,1884
124
+ pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377
125
+ pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242
126
+ pip/_internal/utils/deprecation.py,sha256=NKo8VqLioJ4nnXXGmW4KdasxF90EFHkZaHeX1fT08C8,3627
127
+ pip/_internal/utils/direct_url_helpers.py,sha256=6F1tc2rcKaCZmgfVwsE6ObIe_Pux23mUVYA-2D9wCFc,3206
128
+ pip/_internal/utils/egg_link.py,sha256=ZryCchR_yQSCsdsMkCpxQjjLbQxObA5GDtLG0RR5mGc,2118
129
+ pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169
130
+ pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064
131
+ pip/_internal/utils/filesystem.py,sha256=RhMIXUaNVMGjc3rhsDahWQ4MavvEQDdqXqgq-F6fpw8,5122
132
+ pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716
133
+ pip/_internal/utils/glibc.py,sha256=Mesxxgg3BLxheLZx-dSf30b6gKpOgdVXw6W--uHSszQ,3113
134
+ pip/_internal/utils/hashes.py,sha256=MjOigC75z6qoRMkgHiHqot7eqxfwDZSrEflJMPm-bHE,5118
135
+ pip/_internal/utils/logging.py,sha256=fdtuZJ-AKkqwDTANDvGcBEpssL8el7T1jnwk1CnZl3Y,11603
136
+ pip/_internal/utils/misc.py,sha256=96DVNJQIeMi0vWrNp0C0v3xjk2r7Zcay5yDoruIm_Js,23739
137
+ pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193
138
+ pip/_internal/utils/packaging.py,sha256=5Wm6_x7lKrlqVjPI5MBN_RurcRHwVYoQ7Ksrs84de7s,2108
139
+ pip/_internal/utils/setuptools_build.py,sha256=ouXpud-jeS8xPyTPsXJ-m34NPvK5os45otAzdSV_IJE,4435
140
+ pip/_internal/utils/subprocess.py,sha256=zzdimb75jVLE1GU4WlTZ055gczhD7n1y1xTcNc7vNZQ,9207
141
+ pip/_internal/utils/temp_dir.py,sha256=DUAw22uFruQdK43i2L2K53C-CDjRCPeAsBKJpu-rHQ4,9312
142
+ pip/_internal/utils/unpacking.py,sha256=SBb2iV1crb89MDRTEKY86R4A_UOWApTQn9VQVcMDOlE,8821
143
+ pip/_internal/utils/urls.py,sha256=AhaesUGl-9it6uvG6fsFPOr9ynFpGaTMk4t5XTX7Z_Q,1759
144
+ pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456
145
+ pip/_internal/utils/wheel.py,sha256=lXOgZyTlOm5HmK8tw5iw0A3_5A6wRzsXHOaQkIvvloU,4549
146
+ pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596
147
+ pip/_internal/vcs/bazaar.py,sha256=j0oin0fpGRHcCFCxEcpPCQoFEvA-DMLULKdGP8Nv76o,3519
148
+ pip/_internal/vcs/git.py,sha256=CeKBGJnl6uskvvjkAUXrJVxbHJrpS_B_pyfFdjL3CRc,18121
149
+ pip/_internal/vcs/mercurial.py,sha256=ytRnzmP5CkLM2RfdiS4mVJx4jQcmB3FjXeLOPPFEjG8,5246
150
+ pip/_internal/vcs/subversion.py,sha256=vhZs8L-TNggXqM1bbhl-FpbxE3TrIB6Tgnx8fh3S2HE,11729
151
+ pip/_internal/vcs/versioncontrol.py,sha256=KUOc-hN51em9jrqxKwUR3JnkgSE-xSOqMiiJcSaL6B8,22811
152
+ pip/_vendor/__init__.py,sha256=U51NPwXdA-wXOiANIQncYjcMp6txgeOL5nHxksJeyas,4993
153
+ pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549
154
+ pip/_vendor/typing_extensions.py,sha256=EWpcpyQnVmc48E9fSyPGs-vXgHcAk9tQABQIxmMsCGk,111130
155
+ pip/_vendor/vendor.txt,sha256=epuLpe-n1shCqP5BzC97iMIAIeOeDHdtNKFgcxax-9A,493
156
+ pip/_vendor/cachecontrol/__init__.py,sha256=ctHagMhQXuvQDdm4TirZrwDOT5H8oBNAJqzdKI6sovk,676
157
+ pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737
158
+ pip/_vendor/cachecontrol/adapter.py,sha256=_CcWvUP9048qAZjsNqViaHbdcLs9mmFNixVfpO7oebE,6392
159
+ pip/_vendor/cachecontrol/cache.py,sha256=OTQj72tUf8C1uEgczdl3Gc8vkldSzsTITKtDGKMx4z8,1952
160
+ pip/_vendor/cachecontrol/controller.py,sha256=keCFA3ZaNVaWTwHd6F1zqWhb4vyvNx_UvZuo5iIYMfo,18384
161
+ pip/_vendor/cachecontrol/filewrapper.py,sha256=STttGmIPBvZzt2b51dUOwoWX5crcMCpKZOisM3f5BNc,4292
162
+ pip/_vendor/cachecontrol/heuristics.py,sha256=fdFbk9W8IeLrjteIz_fK4mj2HD_Y7COXF2Uc8TgjT1c,4828
163
+ pip/_vendor/cachecontrol/serialize.py,sha256=0dHeMaDwysVAAnGVlhMOP4tDliohgNK0Jxk_zsOiWxw,7173
164
+ pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417
165
+ pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303
166
+ pip/_vendor/cachecontrol/caches/file_cache.py,sha256=3z8AWKD-vfKeiJqIzLmJyIYtR2yd6Tsh3u1TyLRQoIQ,5352
167
+ pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386
168
+ pip/_vendor/certifi/__init__.py,sha256=L_j-d0kYuA_MzA2_2hraF1ovf6KT6DTquRdV3paQwOk,94
169
+ pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
170
+ pip/_vendor/certifi/cacert.pem,sha256=eU0Dn_3yd8BH4m8sfVj4Glhl2KDrcCSg-sEWT-pNJ88,281617
171
+ pip/_vendor/certifi/core.py,sha256=ZwiOsv-sD_ouU1ft8wy_xZ3LQ7UbcVzyqj2XNyrsZis,4279
172
+ pip/_vendor/chardet/__init__.py,sha256=57R-HSxj0PWmILMN0GFmUNqEMfrEVSamXyjD-W6_fbs,4797
173
+ pip/_vendor/chardet/big5freq.py,sha256=ltcfP-3PjlNHCoo5e4a7C4z-2DhBTXRfY6jbMbB7P30,31274
174
+ pip/_vendor/chardet/big5prober.py,sha256=lPMfwCX6v2AaPgvFh_cSWZcgLDbWiFCHLZ_p9RQ9uxE,1763
175
+ pip/_vendor/chardet/chardistribution.py,sha256=13B8XUG4oXDuLdXvfbIWwLFeR-ZU21AqTS1zcdON8bU,10032
176
+ pip/_vendor/chardet/charsetgroupprober.py,sha256=UKK3SaIZB2PCdKSIS0gnvMtLR9JJX62M-fZJu3OlWyg,3915
177
+ pip/_vendor/chardet/charsetprober.py,sha256=L3t8_wIOov8em-vZWOcbkdsrwe43N6_gqNh5pH7WPd4,5420
178
+ pip/_vendor/chardet/codingstatemachine.py,sha256=K7k69sw3jY5DmTXoSJQVsUtFIQKYPQVOSJJhBuGv_yE,3732
179
+ pip/_vendor/chardet/codingstatemachinedict.py,sha256=0GY3Hi2qIZvDrOOJ3AtqppM1RsYxr_66ER4EHjuMiMc,542
180
+ pip/_vendor/chardet/cp949prober.py,sha256=0jKRV7fECuWI16rNnks0ZECKA1iZYCIEaP8A1ZvjUSI,1860
181
+ pip/_vendor/chardet/enums.py,sha256=TzECiZoCKNMqgwU76cPCeKWFBqaWvAdLMev5_bCkhY8,1683
182
+ pip/_vendor/chardet/escprober.py,sha256=Kho48X65xE0scFylIdeJjM2bcbvRvv0h0WUbMWrJD3A,4006
183
+ pip/_vendor/chardet/escsm.py,sha256=AqyXpA2FQFD7k-buBty_7itGEYkhmVa8X09NLRul3QM,12176
184
+ pip/_vendor/chardet/eucjpprober.py,sha256=5KYaM9fsxkRYzw1b5k0fL-j_-ezIw-ij9r97a9MHxLY,3934
185
+ pip/_vendor/chardet/euckrfreq.py,sha256=3mHuRvXfsq_QcQysDQFb8qSudvTiol71C6Ic2w57tKM,13566
186
+ pip/_vendor/chardet/euckrprober.py,sha256=hiFT6wM174GIwRvqDsIcuOc-dDsq2uPKMKbyV8-1Xnc,1753
187
+ pip/_vendor/chardet/euctwfreq.py,sha256=2alILE1Lh5eqiFJZjzRkMQXolNJRHY5oBQd-vmZYFFM,36913
188
+ pip/_vendor/chardet/euctwprober.py,sha256=NxbpNdBtU0VFI0bKfGfDkpP7S2_8_6FlO87dVH0ogws,1753
189
+ pip/_vendor/chardet/gb2312freq.py,sha256=49OrdXzD-HXqwavkqjo8Z7gvs58hONNzDhAyMENNkvY,20735
190
+ pip/_vendor/chardet/gb2312prober.py,sha256=KPEBueaSLSvBpFeINMu0D6TgHcR90e5PaQawifzF4o0,1759
191
+ pip/_vendor/chardet/hebrewprober.py,sha256=96T_Lj_OmW-fK7JrSHojYjyG3fsGgbzkoTNleZ3kfYE,14537
192
+ pip/_vendor/chardet/jisfreq.py,sha256=mm8tfrwqhpOd3wzZKS4NJqkYBQVcDfTM2JiQ5aW932E,25796
193
+ pip/_vendor/chardet/johabfreq.py,sha256=dBpOYG34GRX6SL8k_LbS9rxZPMjLjoMlgZ03Pz5Hmqc,42498
194
+ pip/_vendor/chardet/johabprober.py,sha256=O1Qw9nVzRnun7vZp4UZM7wvJSv9W941mEU9uDMnY3DU,1752
195
+ pip/_vendor/chardet/jpcntx.py,sha256=uhHrYWkLxE_rF5OkHKInm0HUsrjgKHHVQvtt3UcvotA,27055
196
+ pip/_vendor/chardet/langbulgarianmodel.py,sha256=vmbvYFP8SZkSxoBvLkFqKiH1sjma5ihk3PTpdy71Rr4,104562
197
+ pip/_vendor/chardet/langgreekmodel.py,sha256=JfB7bupjjJH2w3X_mYnQr9cJA_7EuITC2cRW13fUjeI,98484
198
+ pip/_vendor/chardet/langhebrewmodel.py,sha256=3HXHaLQPNAGcXnJjkIJfozNZLTvTJmf4W5Awi6zRRKc,98196
199
+ pip/_vendor/chardet/langhungarianmodel.py,sha256=WxbeQIxkv8YtApiNqxQcvj-tMycsoI4Xy-fwkDHpP_Y,101363
200
+ pip/_vendor/chardet/langrussianmodel.py,sha256=s395bTZ87ESTrZCOdgXbEjZ9P1iGPwCl_8xSsac_DLY,128035
201
+ pip/_vendor/chardet/langthaimodel.py,sha256=7bJlQitRpTnVGABmbSznHnJwOHDy3InkTvtFUx13WQI,102774
202
+ pip/_vendor/chardet/langturkishmodel.py,sha256=XY0eGdTIy4eQ9Xg1LVPZacb-UBhHBR-cq0IpPVHowKc,95372
203
+ pip/_vendor/chardet/latin1prober.py,sha256=p15EEmFbmQUwbKLC7lOJVGHEZwcG45ubEZYTGu01J5g,5380
204
+ pip/_vendor/chardet/macromanprober.py,sha256=9anfzmY6TBfUPDyBDOdY07kqmTHpZ1tK0jL-p1JWcOY,6077
205
+ pip/_vendor/chardet/mbcharsetprober.py,sha256=Wr04WNI4F3X_VxEverNG-H25g7u-MDDKlNt-JGj-_uU,3715
206
+ pip/_vendor/chardet/mbcsgroupprober.py,sha256=iRpaNBjV0DNwYPu_z6TiHgRpwYahiM7ztI_4kZ4Uz9A,2131
207
+ pip/_vendor/chardet/mbcssm.py,sha256=hUtPvDYgWDaA2dWdgLsshbwRfm3Q5YRlRogdmeRUNQw,30391
208
+ pip/_vendor/chardet/resultdict.py,sha256=ez4FRvN5KaSosJeJ2WzUyKdDdg35HDy_SSLPXKCdt5M,402
209
+ pip/_vendor/chardet/sbcharsetprober.py,sha256=-nd3F90i7GpXLjehLVHqVBE0KlWzGvQUPETLBNn4o6U,6400
210
+ pip/_vendor/chardet/sbcsgroupprober.py,sha256=gcgI0fOfgw_3YTClpbra_MNxwyEyJ3eUXraoLHYb59E,4137
211
+ pip/_vendor/chardet/sjisprober.py,sha256=aqQufMzRw46ZpFlzmYaYeT2-nzmKb-hmcrApppJ862k,4007
212
+ pip/_vendor/chardet/universaldetector.py,sha256=xYBrg4x0dd9WnT8qclfADVD9ondrUNkqPmvte1pa520,14848
213
+ pip/_vendor/chardet/utf1632prober.py,sha256=pw1epGdMj1hDGiCu1AHqqzOEfjX8MVdiW7O1BlT8-eQ,8505
214
+ pip/_vendor/chardet/utf8prober.py,sha256=8m08Ub5490H4jQ6LYXvFysGtgKoKsHUd2zH_i8_TnVw,2812
215
+ pip/_vendor/chardet/version.py,sha256=lGtJcxGM44Qz4Cbk4rbbmrKxnNr1-97U25TameLehZw,244
216
+ pip/_vendor/chardet/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
217
+ pip/_vendor/chardet/cli/chardetect.py,sha256=zibMVg5RpKb-ME9_7EYG4ZM2Sf07NHcQzZ12U-rYJho,3242
218
+ pip/_vendor/chardet/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
219
+ pip/_vendor/chardet/metadata/languages.py,sha256=FhvBIdZFxRQ-dTwkb_0madRKgVBCaUMQz9I5xqjE5iQ,13560
220
+ pip/_vendor/colorama/__init__.py,sha256=wePQA4U20tKgYARySLEC047ucNX-g8pRLpYBuiHlLb8,266
221
+ pip/_vendor/colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522
222
+ pip/_vendor/colorama/ansitowin32.py,sha256=vPNYa3OZbxjbuFyaVo0Tmhmy1FZ1lKMWCnT7odXpItk,11128
223
+ pip/_vendor/colorama/initialise.py,sha256=-hIny86ClXo39ixh5iSCfUIa2f_h_bgKRDW7gqs-KLU,3325
224
+ pip/_vendor/colorama/win32.py,sha256=YQOKwMTwtGBbsY4dL5HYTvwTeP9wIQra5MvPNddpxZs,6181
225
+ pip/_vendor/colorama/winterm.py,sha256=XCQFDHjPi6AHYNdZwy0tA02H-Jh48Jp-HvCjeLeLp3U,7134
226
+ pip/_vendor/colorama/tests/__init__.py,sha256=MkgPAEzGQd-Rq0w0PZXSX2LadRWhUECcisJY8lSrm4Q,75
227
+ pip/_vendor/colorama/tests/ansi_test.py,sha256=FeViDrUINIZcr505PAxvU4AjXz1asEiALs9GXMhwRaE,2839
228
+ pip/_vendor/colorama/tests/ansitowin32_test.py,sha256=RN7AIhMJ5EqDsYaCjVo-o4u8JzDD4ukJbmevWKS70rY,10678
229
+ pip/_vendor/colorama/tests/initialise_test.py,sha256=BbPy-XfyHwJ6zKozuQOvNvQZzsx9vdb_0bYXn7hsBTc,6741
230
+ pip/_vendor/colorama/tests/isatty_test.py,sha256=Pg26LRpv0yQDB5Ac-sxgVXG7hsA1NYvapFgApZfYzZg,1866
231
+ pip/_vendor/colorama/tests/utils.py,sha256=1IIRylG39z5-dzq09R_ngufxyPZxgldNbrxKxUGwGKE,1079
232
+ pip/_vendor/colorama/tests/winterm_test.py,sha256=qoWFPEjym5gm2RuMwpf3pOis3a5r_PJZFCzK254JL8A,3709
233
+ pip/_vendor/distlib/__init__.py,sha256=acgfseOC55dNrVAzaBKpUiH3Z6V7Q1CaxsiQ3K7pC-E,581
234
+ pip/_vendor/distlib/compat.py,sha256=tfoMrj6tujk7G4UC2owL6ArgDuCKabgBxuJRGZSmpko,41259
235
+ pip/_vendor/distlib/database.py,sha256=o_mw0fAr93NDAHHHfqG54Y1Hi9Rkfrp2BX15XWZYK50,51697
236
+ pip/_vendor/distlib/index.py,sha256=HFiDG7LMoaBs829WuotrfIwcErOOExUOR_AeBtw_TCU,20834
237
+ pip/_vendor/distlib/locators.py,sha256=wNzG-zERzS_XGls-nBPVVyLRHa2skUlkn0-5n0trMWA,51991
238
+ pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811
239
+ pip/_vendor/distlib/markers.py,sha256=TpHHHLgkzyT7YHbwj-2i6weRaq-Ivy2-MUnrDkjau-U,5058
240
+ pip/_vendor/distlib/metadata.py,sha256=g_DIiu8nBXRzA-mWPRpatHGbmFZqaFoss7z9TG7QSUU,39801
241
+ pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
242
+ pip/_vendor/distlib/scripts.py,sha256=BmkTKmiTk4m2cj-iueliatwz3ut_9SsABBW51vnQnZU,18102
243
+ pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792
244
+ pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784
245
+ pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032
246
+ pip/_vendor/distlib/util.py,sha256=31dPXn3Rfat0xZLeVoFpuniyhe6vsbl9_QN-qd9Lhlk,66262
247
+ pip/_vendor/distlib/version.py,sha256=WG__LyAa2GwmA6qSoEJtvJE8REA1LZpbSizy8WvhJLk,23513
248
+ pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648
249
+ pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448
250
+ pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888
251
+ pip/_vendor/distlib/wheel.py,sha256=Rgqs658VsJ3R2845qwnZD8XQryV2CzWw2mghwLvxxsI,43898
252
+ pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
253
+ pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64
254
+ pip/_vendor/distro/distro.py,sha256=UZO1LjIhtFCMdlbiz39gj3raV-Amf3SBwzGzfApiMHw,49330
255
+ pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849
256
+ pip/_vendor/idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374
257
+ pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321
258
+ pip/_vendor/idna/core.py,sha256=1JxchwKzkxBSn7R_oCE12oBu3eVux0VzdxolmIad24M,12950
259
+ pip/_vendor/idna/idnadata.py,sha256=xUjqKqiJV8Ho_XzBpAtv5JFoVPSupK-SUXvtjygUHqw,44375
260
+ pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881
261
+ pip/_vendor/idna/package_data.py,sha256=C_jHJzmX8PI4xq0jpzmcTMxpb5lDsq4o5VyxQzlVrZE,21
262
+ pip/_vendor/idna/uts46data.py,sha256=zvjZU24s58_uAS850Mcd0NnD0X7_gCMAMjzWNIeUJdc,206539
263
+ pip/_vendor/msgpack/__init__.py,sha256=hyGhlnmcJkxryJBKC3X5FnEph375kQoL_mG8LZUuXgY,1132
264
+ pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081
265
+ pip/_vendor/msgpack/ext.py,sha256=C5MK8JhVYGYFWPvxsORsqZAnvOXefYQ57m1Ym0luW5M,6079
266
+ pip/_vendor/msgpack/fallback.py,sha256=tvNBHyxxFbuVlC8GZShETClJxjLiDMOja4XwwyvNm2g,34544
267
+ pip/_vendor/packaging/__about__.py,sha256=ugASIO2w1oUyH8_COqQ2X_s0rDhjbhQC3yJocD03h2c,661
268
+ pip/_vendor/packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497
269
+ pip/_vendor/packaging/_manylinux.py,sha256=XcbiXB-qcjv3bcohp6N98TMpOP4_j3m-iOA8ptK2GWY,11488
270
+ pip/_vendor/packaging/_musllinux.py,sha256=_KGgY_qc7vhMGpoqss25n2hiLCNKRtvz9mCrS7gkqyc,4378
271
+ pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431
272
+ pip/_vendor/packaging/markers.py,sha256=AJBOcY8Oq0kYc570KuuPTkvuqjAlhufaE2c9sCUbm64,8487
273
+ pip/_vendor/packaging/requirements.py,sha256=NtDlPBtojpn1IUC85iMjPNsUmufjpSlwnNA-Xb4m5NA,4676
274
+ pip/_vendor/packaging/specifiers.py,sha256=LRQ0kFsHrl5qfcFNEEJrIFYsnIHQUJXY9fIsakTrrqE,30110
275
+ pip/_vendor/packaging/tags.py,sha256=lmsnGNiJ8C4D_Pf9PbM0qgbZvD9kmB9lpZBQUZa3R_Y,15699
276
+ pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200
277
+ pip/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665
278
+ pip/_vendor/pkg_resources/__init__.py,sha256=hTAeJCNYb7dJseIDVsYK3mPQep_gphj4tQh-bspX8bg,109364
279
+ pip/_vendor/platformdirs/__init__.py,sha256=SkhEYVyC_HUHC6KX7n4M_6coyRMtEB38QMyOYIAX6Yk,20155
280
+ pip/_vendor/platformdirs/__main__.py,sha256=fVvSiTzr2-RM6IsjWjj4fkaOtDOgDhUWv6sA99do4CQ,1476
281
+ pip/_vendor/platformdirs/android.py,sha256=y_EEMKwYl2-bzYBDovksSn8m76on0Lda8eyJksVQE9U,7211
282
+ pip/_vendor/platformdirs/api.py,sha256=jWtX06jAJytYrkJDOqEls97mCkyHRSZkoqUlbMK5Qew,7132
283
+ pip/_vendor/platformdirs/macos.py,sha256=LueVOoVgGWDBwQb8OFwXkVKfVn33CM1Lkwf1-A86tRQ,3678
284
+ pip/_vendor/platformdirs/unix.py,sha256=22JhR8ZY0aLxSVCFnKrc6f1iz6Gv42K24Daj7aTjfSg,8809
285
+ pip/_vendor/platformdirs/version.py,sha256=mavZTQIJIXfdewEaSTn7EWrNfPZWeRofb-74xqW5f2M,160
286
+ pip/_vendor/platformdirs/windows.py,sha256=4TtbPGoWG2PRgI11uquDa7eRk8TcxvnUNuuMGZItnXc,9573
287
+ pip/_vendor/pygments/__init__.py,sha256=6AuDljQtvf89DTNUyWM7k3oUlP_lq70NU-INKKteOBY,2983
288
+ pip/_vendor/pygments/__main__.py,sha256=es8EKMvXj5yToIfQ-pf3Dv5TnIeeM6sME0LW-n4ecHo,353
289
+ pip/_vendor/pygments/cmdline.py,sha256=byxYJp9gnjVeyhRlZ3UTMgo_LhkXh1afvN8wJBtAcc8,23685
290
+ pip/_vendor/pygments/console.py,sha256=2wZ5W-U6TudJD1_NLUwjclMpbomFM91lNv11_60sfGY,1697
291
+ pip/_vendor/pygments/filter.py,sha256=j5aLM9a9wSx6eH1oy473oSkJ02hGWNptBlVo4s1g_30,1938
292
+ pip/_vendor/pygments/formatter.py,sha256=J9OL9hXLJKZk7moUgKwpjW9HNf4WlJFg_o_-Z_S_tTY,4178
293
+ pip/_vendor/pygments/lexer.py,sha256=2BpqLlT2ExvOOi7vnjK5nB4Fp-m52ldiPaXMox5uwug,34618
294
+ pip/_vendor/pygments/modeline.py,sha256=eF2vO4LpOGoPvIKKkbPfnyut8hT4UiebZPpb-BYGQdI,986
295
+ pip/_vendor/pygments/plugin.py,sha256=j1Fh310RbV2DQ9nvkmkqvlj38gdyuYKllLnGxbc8sJM,2591
296
+ pip/_vendor/pygments/regexopt.py,sha256=jg1ALogcYGU96TQS9isBl6dCrvw5y5--BP_K-uFk_8s,3072
297
+ pip/_vendor/pygments/scanner.py,sha256=b_nu5_f3HCgSdp5S_aNRBQ1MSCm4ZjDwec2OmTRickw,3092
298
+ pip/_vendor/pygments/sphinxext.py,sha256=wBFYm180qea9JKt__UzhRlNRNhczPDFDaqGD21sbuso,6882
299
+ pip/_vendor/pygments/style.py,sha256=C4qyoJrUTkq-OV3iO-8Vz3UtWYpJwSTdh5_vlGCGdNQ,6257
300
+ pip/_vendor/pygments/token.py,sha256=seNsmcch9OEHXYirh8Ool7w8xDhfNTbLj5rHAC-gc_o,6184
301
+ pip/_vendor/pygments/unistring.py,sha256=FaUfG14NBJEKLQoY9qj6JYeXrpYcLmKulghdxOGFaOc,63223
302
+ pip/_vendor/pygments/util.py,sha256=AEVY0qonyyEMgv4Do2dINrrqUAwUk2XYSqHM650uzek,10230
303
+ pip/_vendor/pygments/filters/__init__.py,sha256=h_koYkUFo-FFUxjs564JHUAz7O3yJpVwI6fKN3MYzG0,40386
304
+ pip/_vendor/pygments/formatters/__init__.py,sha256=_xgAcdFKr0QNYwh_i98AU9hvfP3X2wAkhElFcRRF3Uo,5424
305
+ pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176
306
+ pip/_vendor/pygments/formatters/bbcode.py,sha256=r1b7wzWTJouADDLh-Z11iRi4iQxD0JKJ1qHl6mOYxsA,3314
307
+ pip/_vendor/pygments/formatters/groff.py,sha256=xy8Zf3tXOo6MWrXh7yPGWx3lVEkg_DhY4CxmsDb0IVo,5094
308
+ pip/_vendor/pygments/formatters/html.py,sha256=PIzAyilNqaTzSSP2slDG2VDLE3qNioWy2rgtSSoviuI,35610
309
+ pip/_vendor/pygments/formatters/img.py,sha256=XKXmg2_XONrR4mtq2jfEU8XCsoln3VSGTw-UYiEokys,21938
310
+ pip/_vendor/pygments/formatters/irc.py,sha256=Ep-m8jd3voFO6Fv57cUGFmz6JVA67IEgyiBOwv0N4a0,4981
311
+ pip/_vendor/pygments/formatters/latex.py,sha256=FGzJ-YqSTE8z_voWPdzvLY5Tq8jE_ygjGjM6dXZJ8-k,19351
312
+ pip/_vendor/pygments/formatters/other.py,sha256=gPxkk5BdAzWTCgbEHg1lpLi-1F6ZPh5A_aotgLXHnzg,5073
313
+ pip/_vendor/pygments/formatters/pangomarkup.py,sha256=6LKnQc8yh49f802bF0sPvbzck4QivMYqqoXAPaYP8uU,2212
314
+ pip/_vendor/pygments/formatters/rtf.py,sha256=aA0v_psW6KZI3N18TKDifxeL6mcF8EDXcPXDWI4vhVQ,5014
315
+ pip/_vendor/pygments/formatters/svg.py,sha256=dQONWypbzfvzGCDtdp3M_NJawScJvM2DiHbx1k-ww7g,7335
316
+ pip/_vendor/pygments/formatters/terminal.py,sha256=FG-rpjRpFmNpiGB4NzIucvxq6sQIXB3HOTo2meTKtrU,4674
317
+ pip/_vendor/pygments/formatters/terminal256.py,sha256=13SJ3D5pFdqZ9zROE6HbWnBDwHvOGE8GlsmqGhprRp4,11753
318
+ pip/_vendor/pygments/lexers/__init__.py,sha256=j5KEi5O_VQ5GS59H49l-10gzUOkWKxlwGeVMlGO2MMk,12130
319
+ pip/_vendor/pygments/lexers/_mapping.py,sha256=Hts4r_ZQ8icftGM7gkBPeED5lyVSv4affFgXYE6Ap04,72281
320
+ pip/_vendor/pygments/lexers/python.py,sha256=c7jnmKFU9DLxTJW0UbwXt6Z9FJqbBlVsWA1Qr9xSA_w,53424
321
+ pip/_vendor/pygments/styles/__init__.py,sha256=he7HjQx7sC0d2kfTVLjUs0J15mtToJM6M1brwIm9--Q,3700
322
+ pip/_vendor/pyparsing/__init__.py,sha256=9m1JbE2JTLdBG0Mb6B0lEaZj181Wx5cuPXZpsbHEYgE,9116
323
+ pip/_vendor/pyparsing/actions.py,sha256=05uaIPOznJPQ7VgRdmGCmG4sDnUPtwgv5qOYIqbL2UY,6567
324
+ pip/_vendor/pyparsing/common.py,sha256=p-3c83E5-DjlkF35G0O9-kjQRpoejP-2_z0hxZ-eol4,13387
325
+ pip/_vendor/pyparsing/core.py,sha256=yvuRlLpXSF8mgk-QhiW3OVLqD9T0rsj9tbibhRH4Yaw,224445
326
+ pip/_vendor/pyparsing/exceptions.py,sha256=6Jc6W1eDZBzyFu1J0YrcdNFVBC-RINujZmveSnB8Rxw,9523
327
+ pip/_vendor/pyparsing/helpers.py,sha256=BZJHCA8SS0pYio30KGQTc9w2qMOaK4YpZ7hcvHbnTgk,38646
328
+ pip/_vendor/pyparsing/results.py,sha256=9dyqQ-w3MjfmxWbFt8KEPU6IfXeyRdoWp2Og802rUQY,26692
329
+ pip/_vendor/pyparsing/testing.py,sha256=eJncg0p83zm1FTPvM9auNT6oavIvXaibmRFDf1qmwkY,13488
330
+ pip/_vendor/pyparsing/unicode.py,sha256=fAPdsJiARFbkPAih6NkYry0dpj4jPqelGVMlE4wWFW8,10646
331
+ pip/_vendor/pyparsing/util.py,sha256=vTMzTdwSDyV8d_dSgquUTdWgBFoA_W30nfxEJDsshRQ,8670
332
+ pip/_vendor/pyparsing/diagram/__init__.py,sha256=nxmDOoYF9NXuLaGYy01tKFjkNReWJlrGFuJNWEiTo84,24215
333
+ pip/_vendor/pyproject_hooks/__init__.py,sha256=kCehmy0UaBa9oVMD7ZIZrnswfnP3LXZ5lvnNJAL5JBM,491
334
+ pip/_vendor/pyproject_hooks/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138
335
+ pip/_vendor/pyproject_hooks/_impl.py,sha256=61GJxzQip0IInhuO69ZI5GbNQ82XEDUB_1Gg5_KtUoc,11920
336
+ pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=9gQATptbFkelkIy0OfWFEACzqxXJMQDWCH9rBOAZVwQ,546
337
+ pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=m2b34c917IW5o-Q_6TYIHlsK9lSUlNiyrITTUH_zwew,10927
338
+ pip/_vendor/requests/__init__.py,sha256=owujob4dk45Siy4EYtbCKR6wcFph7E04a_v_OuAacBA,5169
339
+ pip/_vendor/requests/__version__.py,sha256=ssI3Ezt7PaxgkOW45GhtwPUclo_SO_ygtIm4A74IOfw,435
340
+ pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495
341
+ pip/_vendor/requests/adapters.py,sha256=idj6cZcId3L5xNNeJ7ieOLtw3awJk5A64xUfetHwq3M,19697
342
+ pip/_vendor/requests/api.py,sha256=q61xcXq4tmiImrvcSVLTbFyCiD2F-L_-hWKGbz4y8vg,6449
343
+ pip/_vendor/requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187
344
+ pip/_vendor/requests/certs.py,sha256=PVPooB0jP5hkZEULSCwC074532UFbR2Ptgu0I5zwmCs,575
345
+ pip/_vendor/requests/compat.py,sha256=IhK9quyX0RRuWTNcg6d2JGSAOUbM6mym2p_2XjLTwf4,1286
346
+ pip/_vendor/requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560
347
+ pip/_vendor/requests/exceptions.py,sha256=FA-_kVwBZ2jhXauRctN_ewHVK25b-fj0Azyz1THQ0Kk,3823
348
+ pip/_vendor/requests/help.py,sha256=FnAAklv8MGm_qb2UilDQgS6l0cUttiCFKUjx0zn2XNA,3879
349
+ pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733
350
+ pip/_vendor/requests/models.py,sha256=dDZ-iThotky-Noq9yy97cUEJhr3wnY6mv-xR_ePg_lk,35288
351
+ pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695
352
+ pip/_vendor/requests/sessions.py,sha256=-LvTzrPtetSTrR3buxu4XhdgMrJFLB1q5D7P--L2Xhw,30373
353
+ pip/_vendor/requests/status_codes.py,sha256=FvHmT5uH-_uimtRz5hH9VCbt7VV-Nei2J9upbej6j8g,4235
354
+ pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912
355
+ pip/_vendor/requests/utils.py,sha256=kOPn0qYD6xRTzaxbqTdYiSInBZHl6379AJsyIgzYGLY,33460
356
+ pip/_vendor/resolvelib/__init__.py,sha256=h509TdEcpb5-44JonaU3ex2TM15GVBLjM9CNCPwnTTs,537
357
+ pip/_vendor/resolvelib/providers.py,sha256=fuuvVrCetu5gsxPB43ERyjfO8aReS3rFQHpDgiItbs4,5871
358
+ pip/_vendor/resolvelib/reporters.py,sha256=TSbRmWzTc26w0ggsV1bxVpeWDB8QNIre6twYl7GIZBE,1601
359
+ pip/_vendor/resolvelib/resolvers.py,sha256=G8rsLZSq64g5VmIq-lB7UcIJ1gjAxIQJmTF4REZleQ0,20511
360
+ pip/_vendor/resolvelib/structs.py,sha256=0_1_XO8z_CLhegP3Vpf9VJ3zJcfLm0NOHRM-i0Ykz3o,4963
361
+ pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
362
+ pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156
363
+ pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090
364
+ pip/_vendor/rich/__main__.py,sha256=TT8sb9PTnsnKhhrGuHkLN0jdN0dtKhtPkEr9CidDbPM,8478
365
+ pip/_vendor/rich/_cell_widths.py,sha256=2n4EiJi3X9sqIq0O16kUZ_zy6UYMd3xFfChlKfnW1Hc,10096
366
+ pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235
367
+ pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064
368
+ pip/_vendor/rich/_export_format.py,sha256=qxgV3nKnXQu1hfbnRVswPYy-AwIg1X0LSC47cK5s8jk,2100
369
+ pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265
370
+ pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799
371
+ pip/_vendor/rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695
372
+ pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225
373
+ pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236
374
+ pip/_vendor/rich/_null_file.py,sha256=tGSXk_v-IZmbj1GAzHit8A3kYIQMiCpVsCFfsC-_KJ4,1387
375
+ pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063
376
+ pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423
377
+ pip/_vendor/rich/_ratio.py,sha256=2lLSliL025Y-YMfdfGbutkQDevhcyDqc-DtUYW9mU70,5472
378
+ pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919
379
+ pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351
380
+ pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417
381
+ pip/_vendor/rich/_win32_console.py,sha256=P0vxI2fcndym1UU1S37XAzQzQnkyY7YqAKmxm24_gug,22820
382
+ pip/_vendor/rich/_windows.py,sha256=dvNl9TmfPzNVxiKk5WDFihErZ5796g2UC9-KGGyfXmk,1926
383
+ pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783
384
+ pip/_vendor/rich/_wrap.py,sha256=xfV_9t0Sg6rzimmrDru8fCVmUlalYAcHLDfrJZnbbwQ,1840
385
+ pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890
386
+ pip/_vendor/rich/align.py,sha256=Ji-Yokfkhnfe_xMmr4ISjZB07TJXggBCOYoYa-HDAr8,10368
387
+ pip/_vendor/rich/ansi.py,sha256=iD6532QYqnBm6hADulKjrV8l8kFJ-9fEVooHJHH3hMg,6906
388
+ pip/_vendor/rich/bar.py,sha256=a7UD303BccRCrEhGjfMElpv5RFYIinaAhAuqYqhUvmw,3264
389
+ pip/_vendor/rich/box.py,sha256=FJ6nI3jD7h2XNFU138bJUt2HYmWOlRbltoCEuIAZhew,9842
390
+ pip/_vendor/rich/cells.py,sha256=627ztJs9zOL-38HJ7kXBerR-gT8KBfYC8UzEwMJDYYo,4509
391
+ pip/_vendor/rich/color.py,sha256=9Gh958U3f75WVdLTeC0U9nkGTn2n0wnojKpJ6jQEkIE,18224
392
+ pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054
393
+ pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131
394
+ pip/_vendor/rich/console.py,sha256=pDvkbLkvtZIMIwQx_jkZ-seyNl4zGBLviXoWXte9fwg,99218
395
+ pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288
396
+ pip/_vendor/rich/containers.py,sha256=aKgm5UDHn5Nmui6IJaKdsZhbHClh_X7D-_Wg8Ehrr7s,5497
397
+ pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630
398
+ pip/_vendor/rich/default_styles.py,sha256=-Fe318kMVI_IwciK5POpThcO0-9DYJ67TZAN6DlmlmM,8082
399
+ pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972
400
+ pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501
401
+ pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642
402
+ pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683
403
+ pip/_vendor/rich/filesize.py,sha256=9fTLAPCAwHmBXdRv7KZU194jSgNrRb6Wx7RIoBgqeKY,2508
404
+ pip/_vendor/rich/highlighter.py,sha256=p3C1g4QYzezFKdR7NF9EhPbzQDvdPUhGRgSyGGEmPko,9584
405
+ pip/_vendor/rich/json.py,sha256=EYp9ucj-nDjYDkHCV6Mk1ve8nUOpuFLaW76X50Mis2M,5032
406
+ pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252
407
+ pip/_vendor/rich/layout.py,sha256=RFYL6HdCFsHf9WRpcvi3w-fpj-8O5dMZ8W96VdKNdbI,14007
408
+ pip/_vendor/rich/live.py,sha256=vZzYvu7fqwlv3Gthl2xiw1Dc_O80VlGcCV0DOHwCyDM,14273
409
+ pip/_vendor/rich/live_render.py,sha256=zElm3PrfSIvjOce28zETHMIUf9pFYSUA5o0AflgUP64,3667
410
+ pip/_vendor/rich/logging.py,sha256=uB-cB-3Q4bmXDLLpbOWkmFviw-Fde39zyMV6tKJ2WHQ,11903
411
+ pip/_vendor/rich/markup.py,sha256=xzF4uAafiEeEYDJYt_vUnJOGoTU8RrH-PH7WcWYXjCg,8198
412
+ pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305
413
+ pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970
414
+ pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828
415
+ pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396
416
+ pip/_vendor/rich/panel.py,sha256=wGMe40J8KCGgQoM0LyjRErmGIkv2bsYA71RCXThD0xE,10574
417
+ pip/_vendor/rich/pretty.py,sha256=eLEYN9xVaMNuA6EJVYm4li7HdOHxCqmVKvnOqJpyFt0,35852
418
+ pip/_vendor/rich/progress.py,sha256=n4KF9vky8_5iYeXcyZPEvzyLplWlDvFLkM5JI0Bs08A,59706
419
+ pip/_vendor/rich/progress_bar.py,sha256=cEoBfkc3lLwqba4XKsUpy4vSQKDh2QQ5J2J94-ACFoo,8165
420
+ pip/_vendor/rich/prompt.py,sha256=x0mW-pIPodJM4ry6grgmmLrl8VZp99kqcmdnBe70YYA,11303
421
+ pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391
422
+ pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166
423
+ pip/_vendor/rich/repr.py,sha256=9Z8otOmM-tyxnyTodvXlectP60lwahjGiDTrbrxPSTg,4431
424
+ pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602
425
+ pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843
426
+ pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591
427
+ pip/_vendor/rich/segment.py,sha256=XLnJEFvcV3bjaVzMNUJiem3n8lvvI9TJ5PTu-IG2uTg,24247
428
+ pip/_vendor/rich/spinner.py,sha256=15koCmF0DQeD8-k28Lpt6X_zJQUlzEhgo_6A6uy47lc,4339
429
+ pip/_vendor/rich/status.py,sha256=gJsIXIZeSo3urOyxRUjs6VrhX5CZrA0NxIQ-dxhCnwo,4425
430
+ pip/_vendor/rich/style.py,sha256=3hiocH_4N8vwRm3-8yFWzM7tSwjjEven69XqWasSQwM,27073
431
+ pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258
432
+ pip/_vendor/rich/syntax.py,sha256=jgDiVCK6cpR0NmBOpZmIu-Ud4eaW7fHvjJZkDbjpcSA,35173
433
+ pip/_vendor/rich/table.py,sha256=-WzesL-VJKsaiDU3uyczpJMHy6VCaSewBYJwx8RudI8,39684
434
+ pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370
435
+ pip/_vendor/rich/text.py,sha256=_8JBlSau0c2z8ENOZMi1hJ7M1ZGY408E4-hXjHyyg1A,45525
436
+ pip/_vendor/rich/theme.py,sha256=belFJogzA0W0HysQabKaHOc3RWH2ko3fQAJhoN-AFdo,3777
437
+ pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102
438
+ pip/_vendor/rich/traceback.py,sha256=yCLVrCtyoFNENd9mkm2xeG3KmqkTwH9xpFOO7p2Bq0A,29604
439
+ pip/_vendor/rich/tree.py,sha256=BMbUYNjS9uodNPfvtY_odmU09GA5QzcMbQ5cJZhllQI,9169
440
+ pip/_vendor/tenacity/__init__.py,sha256=3kvAL6KClq8GFo2KFhmOzskRKSDQI-ubrlfZ8AQEEI0,20493
441
+ pip/_vendor/tenacity/_asyncio.py,sha256=Qi6wgQsGa9MQibYRy3OXqcDQswIZZ00dLOoSUGN-6o8,3551
442
+ pip/_vendor/tenacity/_utils.py,sha256=ubs6a7sxj3JDNRKWCyCU2j5r1CB7rgyONgZzYZq6D_4,2179
443
+ pip/_vendor/tenacity/after.py,sha256=S5NCISScPeIrKwIeXRwdJl3kV9Q4nqZfnNPDx6Hf__g,1682
444
+ pip/_vendor/tenacity/before.py,sha256=dIZE9gmBTffisfwNkK0F1xFwGPV41u5GK70UY4Pi5Kc,1562
445
+ pip/_vendor/tenacity/before_sleep.py,sha256=YmpgN9Y7HGlH97U24vvq_YWb5deaK4_DbiD8ZuFmy-E,2372
446
+ pip/_vendor/tenacity/nap.py,sha256=fRWvnz1aIzbIq9Ap3gAkAZgDH6oo5zxMrU6ZOVByq0I,1383
447
+ pip/_vendor/tenacity/retry.py,sha256=jrzD_mxA5mSTUEdiYB7SHpxltjhPSYZSnSRATb-ggRc,8746
448
+ pip/_vendor/tenacity/stop.py,sha256=YMJs7ZgZfND65PRLqlGB_agpfGXlemx_5Hm4PKnBqpQ,3086
449
+ pip/_vendor/tenacity/tornadoweb.py,sha256=po29_F1Mt8qZpsFjX7EVwAT0ydC_NbVia9gVi7R_wXA,2142
450
+ pip/_vendor/tenacity/wait.py,sha256=3FcBJoCDgym12_dN6xfK8C1gROY0Hn4NSI2u8xv50uE,8024
451
+ pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396
452
+ pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633
453
+ pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943
454
+ pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
455
+ pip/_vendor/truststore/__init__.py,sha256=qzTLSH8PvAkY1fr6QQ2vV-KwE_M83wdXugtpJaP_AbM,403
456
+ pip/_vendor/truststore/_api.py,sha256=xjuEu_rlH4hcdJTROImEyOEqdw-F8t5vO2H2BToY0Ro,9893
457
+ pip/_vendor/truststore/_macos.py,sha256=BjvAKoAjXhdIPuxpY124HJIFswDb0pq8DjynzJOVwqc,17694
458
+ pip/_vendor/truststore/_openssl.py,sha256=LLUZ7ZGaio-i5dpKKjKCSeSufmn6T8pi9lDcFnvSyq0,2324
459
+ pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130
460
+ pip/_vendor/truststore/_windows.py,sha256=1x_EhROeJ9QK1sMAjfnZC7awYI8UnBJYL-TjACUYI4A,17468
461
+ pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
462
+ pip/_vendor/urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811
463
+ pip/_vendor/urllib3/_version.py,sha256=azoM7M7BUADl2kBhMVR6PPf2GhBDI90me1fcnzTwdcw,64
464
+ pip/_vendor/urllib3/connection.py,sha256=92k9td_y4PEiTIjNufCUa1NzMB3J3w0LEdyokYgXnW8,20300
465
+ pip/_vendor/urllib3/connectionpool.py,sha256=ItVDasDnPRPP9R8bNxY7tPBlC724nJ9nlxVgXG_SLbI,39990
466
+ pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217
467
+ pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579
468
+ pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440
469
+ pip/_vendor/urllib3/poolmanager.py,sha256=0i8cJgrqupza67IBPZ_u9jXvnSxr5UBlVEiUqdkPtYI,19752
470
+ pip/_vendor/urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691
471
+ pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641
472
+ pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
473
+ pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957
474
+ pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036
475
+ pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528
476
+ pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081
477
+ pip/_vendor/urllib3/contrib/securetransport.py,sha256=yhZdmVjY6PI6EeFbp7qYOp6-vp1Rkv2NMuOGaEj7pmc,34448
478
+ pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
479
+ pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
480
+ pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632
481
+ pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
482
+ pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
483
+ pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
484
+ pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
485
+ pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417
486
+ pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343
487
+ pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
488
+ pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901
489
+ pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605
490
+ pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
491
+ pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997
492
+ pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
493
+ pip/_vendor/urllib3/util/retry.py,sha256=Z6WEf518eTOXP5jr5QSQ9gqJI0DVYt3Xs3EKnYaTmus,22013
494
+ pip/_vendor/urllib3/util/ssl_.py,sha256=X4-AqW91aYPhPx6-xbf66yHFQKbqqfC_5Zt4WkLX1Hc,17177
495
+ pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758
496
+ pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895
497
+ pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168
498
+ pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296
499
+ pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
500
+ pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579
501
+ pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979
502
+ pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305
503
+ pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563
504
+ pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307
505
+ pip-23.3.1.dist-info/AUTHORS.txt,sha256=HOVK0m4Fk7uZrqt9MhiBlBTdmUbMIxXJziTWeMc_Jxc,10253
506
+ pip-23.3.1.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
507
+ pip-23.3.1.dist-info/METADATA,sha256=ePd4oJwtCOg7e5hjeRczRRgaxHUSasxlmRPNHMtKToE,3540
508
+ pip-23.3.1.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
509
+ pip-23.3.1.dist-info/entry_points.txt,sha256=xg35gOct0aY8S3ftLtweJ0uw3KBAIVyW4k-0Jx1rkNE,125
510
+ pip-23.3.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
511
+ pip-23.3.1.dist-info/RECORD,,
512
+ pip/_vendor/urllib3/util/url.cpython-310.pyc,,
513
+ pip/_vendor/idna/uts46data.cpython-310.pyc,,
514
+ pip/_vendor/rich/syntax.cpython-310.pyc,,
515
+ pip/_internal/locations/_distutils.cpython-310.pyc,,
516
+ pip/_internal/utils/direct_url_helpers.cpython-310.pyc,,
517
+ pip/_internal/metadata/pkg_resources.cpython-310.pyc,,
518
+ pip/_internal/vcs/git.cpython-310.pyc,,
519
+ pip/_internal/cache.cpython-310.pyc,,
520
+ pip/_internal/cli/base_command.cpython-310.pyc,,
521
+ pip/_vendor/rich/_cell_widths.cpython-310.pyc,,
522
+ pip/_vendor/cachecontrol/wrapper.cpython-310.pyc,,
523
+ pip/_internal/operations/build/build_tracker.cpython-310.pyc,,
524
+ pip/_vendor/chardet/euctwprober.cpython-310.pyc,,
525
+ pip/_vendor/tenacity/after.cpython-310.pyc,,
526
+ pip/_vendor/urllib3/poolmanager.cpython-310.pyc,,
527
+ pip/_vendor/urllib3/contrib/__init__.cpython-310.pyc,,
528
+ pip/_vendor/rich/text.cpython-310.pyc,,
529
+ pip/_vendor/rich/pager.cpython-310.pyc,,
530
+ pip/_vendor/chardet/metadata/__init__.cpython-310.pyc,,
531
+ pip/_vendor/pyparsing/diagram/__pycache__,,
532
+ pip/_vendor/rich/measure.cpython-310.pyc,,
533
+ pip/_internal/utils/filetypes.cpython-310.pyc,,
534
+ pip/_vendor/certifi/__main__.cpython-310.pyc,,
535
+ pip/_internal/utils/misc.cpython-310.pyc,,
536
+ pip/_vendor/rich/_windows_renderer.cpython-310.pyc,,
537
+ pip/_vendor/pygments/cmdline.cpython-310.pyc,,
538
+ pip/_vendor/rich/_loop.cpython-310.pyc,,
539
+ pip/_vendor/rich/__main__.cpython-310.pyc,,
540
+ pip/_vendor/urllib3/_version.cpython-310.pyc,,
541
+ pip/_internal/resolution/resolvelib/__init__.cpython-310.pyc,,
542
+ pip/_vendor/rich/console.cpython-310.pyc,,
543
+ pip/_vendor/urllib3/packages/__init__.cpython-310.pyc,,
544
+ pip/_vendor/pygments/styles/__init__.cpython-310.pyc,,
545
+ pip/_vendor/tomli/_types.cpython-310.pyc,,
546
+ pip/_vendor/rich/_windows.cpython-310.pyc,,
547
+ pip/_internal/models/__pycache__,,
548
+ pip/_vendor/pygments/sphinxext.cpython-310.pyc,,
549
+ pip/_internal/distributions/installed.cpython-310.pyc,,
550
+ pip/_internal/resolution/resolvelib/reporter.cpython-310.pyc,,
551
+ pip/_vendor/rich/table.cpython-310.pyc,,
552
+ pip/_internal/cli/autocompletion.cpython-310.pyc,,
553
+ pip/_internal/locations/base.cpython-310.pyc,,
554
+ pip/_vendor/cachecontrol/caches/__init__.cpython-310.pyc,,
555
+ pip/_vendor/chardet/latin1prober.cpython-310.pyc,,
556
+ pip/_vendor/urllib3/packages/backports/makefile.cpython-310.pyc,,
557
+ pip/_internal/metadata/__pycache__,,
558
+ pip/_internal/distributions/sdist.cpython-310.pyc,,
559
+ pip/_vendor/rich/theme.cpython-310.pyc,,
560
+ pip/_internal/self_outdated_check.cpython-310.pyc,,
561
+ pip/_internal/operations/prepare.cpython-310.pyc,,
562
+ pip/_vendor/truststore/_macos.cpython-310.pyc,,
563
+ pip/_vendor/pygments/formatters/__pycache__,,
564
+ pip/_vendor/rich/_null_file.cpython-310.pyc,,
565
+ pip/_vendor/chardet/langturkishmodel.cpython-310.pyc,,
566
+ pip/_internal/resolution/base.cpython-310.pyc,,
567
+ pip/_internal/resolution/legacy/__pycache__,,
568
+ pip/_internal/vcs/__init__.cpython-310.pyc,,
569
+ pip/_vendor/chardet/macromanprober.cpython-310.pyc,,
570
+ pip/_vendor/cachecontrol/serialize.cpython-310.pyc,,
571
+ pip/_vendor/urllib3/contrib/pyopenssl.cpython-310.pyc,,
572
+ pip/_vendor/resolvelib/providers.cpython-310.pyc,,
573
+ pip/_vendor/requests/adapters.cpython-310.pyc,,
574
+ pip/_vendor/distlib/__pycache__,,
575
+ pip/_vendor/pygments/filters/__init__.cpython-310.pyc,,
576
+ pip/_vendor/pkg_resources/__init__.cpython-310.pyc,,
577
+ pip/_vendor/idna/package_data.cpython-310.pyc,,
578
+ pip/_internal/operations/__pycache__,,
579
+ pip/_vendor/colorama/tests/ansi_test.cpython-310.pyc,,
580
+ pip/_internal/req/__init__.cpython-310.pyc,,
581
+ pip/_internal/index/__init__.cpython-310.pyc,,
582
+ pip/_vendor/chardet/euckrfreq.cpython-310.pyc,,
583
+ pip/_internal/utils/unpacking.cpython-310.pyc,,
584
+ pip/_vendor/urllib3/contrib/_securetransport/bindings.cpython-310.pyc,,
585
+ pip/_vendor/chardet/big5freq.cpython-310.pyc,,
586
+ pip/_internal/commands/download.cpython-310.pyc,,
587
+ pip/_vendor/urllib3/contrib/ntlmpool.cpython-310.pyc,,
588
+ pip/_vendor/pygments/formatters/latex.cpython-310.pyc,,
589
+ pip/_vendor/rich/repr.cpython-310.pyc,,
590
+ pip/_internal/commands/__pycache__,,
591
+ pip/_vendor/tomli/__init__.cpython-310.pyc,,
592
+ pip/_vendor/pygments/lexers/_mapping.cpython-310.pyc,,
593
+ pip/_internal/utils/egg_link.cpython-310.pyc,,
594
+ pip/_internal/cli/req_command.cpython-310.pyc,,
595
+ pip/_internal/network/__init__.cpython-310.pyc,,
596
+ pip/_vendor/pygments/formatters/bbcode.cpython-310.pyc,,
597
+ pip/_internal/operations/install/wheel.cpython-310.pyc,,
598
+ pip/_vendor/cachecontrol/__init__.cpython-310.pyc,,
599
+ pip/_internal/cli/progress_bars.cpython-310.pyc,,
600
+ pip/_vendor/platformdirs/__pycache__,,
601
+ pip/_vendor/urllib3/util/__pycache__,,
602
+ pip/_internal/distributions/base.cpython-310.pyc,,
603
+ pip/_internal/commands/configuration.cpython-310.pyc,,
604
+ pip/_vendor/urllib3/contrib/_securetransport/__init__.cpython-310.pyc,,
605
+ pip/_vendor/urllib3/fields.cpython-310.pyc,,
606
+ pip/_internal/commands/list.cpython-310.pyc,,
607
+ pip/_internal/vcs/mercurial.cpython-310.pyc,,
608
+ pip/_vendor/cachecontrol/_cmd.cpython-310.pyc,,
609
+ pip/_internal/models/selection_prefs.cpython-310.pyc,,
610
+ pip/_vendor/chardet/hebrewprober.cpython-310.pyc,,
611
+ pip/_vendor/pyparsing/__pycache__,,
612
+ pip/_vendor/packaging/_musllinux.cpython-310.pyc,,
613
+ pip/_vendor/rich/themes.cpython-310.pyc,,
614
+ pip/_internal/metadata/importlib/_envs.cpython-310.pyc,,
615
+ pip/_vendor/requests/hooks.cpython-310.pyc,,
616
+ pip/_internal/resolution/resolvelib/requirements.cpython-310.pyc,,
617
+ pip/_vendor/pyparsing/exceptions.cpython-310.pyc,,
618
+ pip/_internal/commands/debug.cpython-310.pyc,,
619
+ pip/_internal/build_env.cpython-310.pyc,,
620
+ pip/_internal/req/req_file.cpython-310.pyc,,
621
+ pip/_vendor/chardet/cli/__init__.cpython-310.pyc,,
622
+ pip/_vendor/resolvelib/__init__.cpython-310.pyc,,
623
+ pip/_vendor/rich/columns.cpython-310.pyc,,
624
+ pip/_internal/vcs/subversion.cpython-310.pyc,,
625
+ pip/_vendor/requests/structures.cpython-310.pyc,,
626
+ pip/_vendor/platformdirs/windows.cpython-310.pyc,,
627
+ pip/_vendor/distlib/resources.cpython-310.pyc,,
628
+ pip/_internal/index/sources.cpython-310.pyc,,
629
+ pip/_vendor/resolvelib/compat/__pycache__,,
630
+ pip/_vendor/packaging/__about__.cpython-310.pyc,,
631
+ pip/_vendor/urllib3/contrib/socks.cpython-310.pyc,,
632
+ pip/_internal/distributions/wheel.cpython-310.pyc,,
633
+ pip/_internal/utils/filesystem.cpython-310.pyc,,
634
+ pip/_vendor/chardet/version.cpython-310.pyc,,
635
+ pip/_vendor/cachecontrol/caches/file_cache.cpython-310.pyc,,
636
+ pip/_vendor/chardet/eucjpprober.cpython-310.pyc,,
637
+ pip/_vendor/rich/terminal_theme.cpython-310.pyc,,
638
+ pip/_vendor/rich/_pick.cpython-310.pyc,,
639
+ pip/_vendor/pygments/__main__.cpython-310.pyc,,
640
+ pip/_vendor/distlib/wheel.cpython-310.pyc,,
641
+ pip/_internal/commands/inspect.cpython-310.pyc,,
642
+ pip/_vendor/pygments/console.cpython-310.pyc,,
643
+ pip/_vendor/rich/spinner.cpython-310.pyc,,
644
+ pip/_vendor/rich/screen.cpython-310.pyc,,
645
+ pip/_vendor/requests/__pycache__,,
646
+ pip/_vendor/urllib3/contrib/securetransport.cpython-310.pyc,,
647
+ pip/_vendor/chardet/langbulgarianmodel.cpython-310.pyc,,
648
+ pip/_vendor/urllib3/packages/six.cpython-310.pyc,,
649
+ pip/_vendor/colorama/winterm.cpython-310.pyc,,
650
+ pip/_vendor/pygments/formatters/img.cpython-310.pyc,,
651
+ pip/_vendor/urllib3/util/ssltransport.cpython-310.pyc,,
652
+ pip/_vendor/chardet/langhebrewmodel.cpython-310.pyc,,
653
+ pip/_vendor/rich/pretty.cpython-310.pyc,,
654
+ pip/_internal/utils/hashes.cpython-310.pyc,,
655
+ pip/_vendor/idna/codec.cpython-310.pyc,,
656
+ pip/_vendor/colorama/initialise.cpython-310.pyc,,
657
+ pip/_vendor/chardet/langhungarianmodel.cpython-310.pyc,,
658
+ pip/_internal/operations/check.cpython-310.pyc,,
659
+ pip/_vendor/requests/help.cpython-310.pyc,,
660
+ pip/_internal/metadata/__init__.cpython-310.pyc,,
661
+ pip/_vendor/pygments/lexer.cpython-310.pyc,,
662
+ pip/_internal/utils/_jaraco_text.cpython-310.pyc,,
663
+ pip/_vendor/rich/bar.cpython-310.pyc,,
664
+ pip-23.3.1.dist-info/INSTALLER,,
665
+ pip/_vendor/requests/sessions.cpython-310.pyc,,
666
+ pip/_internal/locations/_sysconfig.cpython-310.pyc,,
667
+ pip/_vendor/tenacity/before.cpython-310.pyc,,
668
+ pip/_vendor/pyparsing/actions.cpython-310.pyc,,
669
+ pip/_vendor/urllib3/response.cpython-310.pyc,,
670
+ pip/_vendor/chardet/euckrprober.cpython-310.pyc,,
671
+ pip/_internal/vcs/bazaar.cpython-310.pyc,,
672
+ pip/_vendor/colorama/win32.cpython-310.pyc,,
673
+ pip/_internal/operations/__init__.cpython-310.pyc,,
674
+ pip/_vendor/pyproject_hooks/__pycache__,,
675
+ pip/_vendor/pygments/formatters/svg.cpython-310.pyc,,
676
+ pip/_vendor/resolvelib/structs.cpython-310.pyc,,
677
+ pip/_vendor/colorama/tests/ansitowin32_test.cpython-310.pyc,,
678
+ pip/_vendor/rich/color_triplet.cpython-310.pyc,,
679
+ pip/_vendor/chardet/big5prober.cpython-310.pyc,,
680
+ pip/_internal/operations/build/metadata_editable.cpython-310.pyc,,
681
+ pip/_vendor/certifi/__pycache__,,
682
+ pip/_vendor/truststore/_api.cpython-310.pyc,,
683
+ pip/_vendor/pyparsing/helpers.cpython-310.pyc,,
684
+ pip/_vendor/chardet/gb2312freq.cpython-310.pyc,,
685
+ pip/_vendor/chardet/__init__.cpython-310.pyc,,
686
+ pip/_vendor/colorama/ansi.cpython-310.pyc,,
687
+ pip/_vendor/urllib3/filepost.cpython-310.pyc,,
688
+ pip/_vendor/tenacity/__pycache__,,
689
+ pip/_vendor/rich/__pycache__,,
690
+ pip/_vendor/cachecontrol/heuristics.cpython-310.pyc,,
691
+ pip/_internal/utils/wheel.cpython-310.pyc,,
692
+ pip/_vendor/chardet/universaldetector.cpython-310.pyc,,
693
+ pip/_internal/resolution/resolvelib/base.cpython-310.pyc,,
694
+ pip/_internal/commands/__init__.cpython-310.pyc,,
695
+ pip/_vendor/pygments/token.cpython-310.pyc,,
696
+ pip/_internal/cli/status_codes.cpython-310.pyc,,
697
+ pip/_vendor/msgpack/ext.cpython-310.pyc,,
698
+ pip/_vendor/truststore/_openssl.cpython-310.pyc,,
699
+ pip/_vendor/rich/live.cpython-310.pyc,,
700
+ pip/_vendor/chardet/jpcntx.cpython-310.pyc,,
701
+ pip/_vendor/platformdirs/__init__.cpython-310.pyc,,
702
+ pip/_vendor/rich/padding.cpython-310.pyc,,
703
+ pip/_internal/cli/main_parser.cpython-310.pyc,,
704
+ pip/_internal/network/auth.cpython-310.pyc,,
705
+ pip/_vendor/pyparsing/__init__.cpython-310.pyc,,
706
+ pip/_internal/operations/install/__pycache__,,
707
+ pip/_vendor/rich/status.cpython-310.pyc,,
708
+ pip/_vendor/resolvelib/compat/collections_abc.cpython-310.pyc,,
709
+ pip/__pip-runner__.cpython-310.pyc,,
710
+ pip/_vendor/rich/_fileno.cpython-310.pyc,,
711
+ pip/_vendor/rich/_ratio.cpython-310.pyc,,
712
+ pip/_vendor/chardet/sjisprober.cpython-310.pyc,,
713
+ pip/_vendor/rich/layout.cpython-310.pyc,,
714
+ pip/_vendor/requests/api.cpython-310.pyc,,
715
+ pip/_vendor/pyparsing/results.cpython-310.pyc,,
716
+ pip/_vendor/idna/compat.cpython-310.pyc,,
717
+ pip/_vendor/urllib3/util/proxy.cpython-310.pyc,,
718
+ pip/_vendor/msgpack/__pycache__,,
719
+ pip/_vendor/tomli/_re.cpython-310.pyc,,
720
+ pip/_vendor/msgpack/exceptions.cpython-310.pyc,,
721
+ pip/_internal/req/req_uninstall.cpython-310.pyc,,
722
+ pip/_internal/commands/show.cpython-310.pyc,,
723
+ pip/_vendor/pygments/lexers/python.cpython-310.pyc,,
724
+ pip/_vendor/resolvelib/compat/__init__.cpython-310.pyc,,
725
+ pip/__main__.cpython-310.pyc,,
726
+ pip/_vendor/__init__.cpython-310.pyc,,
727
+ pip/_internal/models/target_python.cpython-310.pyc,,
728
+ pip/_vendor/rich/errors.cpython-310.pyc,,
729
+ pip/_vendor/distlib/compat.cpython-310.pyc,,
730
+ pip/_internal/utils/entrypoints.cpython-310.pyc,,
731
+ pip/_vendor/platformdirs/unix.cpython-310.pyc,,
732
+ pip/_vendor/rich/_stack.cpython-310.pyc,,
733
+ pip/_internal/commands/index.cpython-310.pyc,,
734
+ pip/_vendor/webencodings/__pycache__,,
735
+ pip/_vendor/rich/_extension.cpython-310.pyc,,
736
+ pip/_vendor/idna/__pycache__,,
737
+ pip/_internal/__pycache__,,
738
+ pip/_internal/exceptions.cpython-310.pyc,,
739
+ pip/_internal/distributions/__pycache__,,
740
+ pip/_vendor/cachecontrol/adapter.cpython-310.pyc,,
741
+ pip/_vendor/chardet/utf8prober.cpython-310.pyc,,
742
+ pip/_vendor/colorama/tests/isatty_test.cpython-310.pyc,,
743
+ pip/_vendor/rich/_wrap.cpython-310.pyc,,
744
+ pip/_vendor/rich/filesize.cpython-310.pyc,,
745
+ pip/_vendor/requests/utils.cpython-310.pyc,,
746
+ pip-23.3.1.dist-info/__pycache__,,
747
+ pip/_vendor/chardet/mbcssm.cpython-310.pyc,,
748
+ pip/_internal/cli/__init__.cpython-310.pyc,,
749
+ pip/_internal/configuration.cpython-310.pyc,,
750
+ pip/_vendor/rich/live_render.cpython-310.pyc,,
751
+ pip/_internal/network/lazy_wheel.cpython-310.pyc,,
752
+ pip/_vendor/rich/_export_format.cpython-310.pyc,,
753
+ pip/_vendor/distlib/metadata.cpython-310.pyc,,
754
+ pip/_vendor/pygments/formatters/groff.cpython-310.pyc,,
755
+ pip/_internal/commands/install.cpython-310.pyc,,
756
+ pip/_internal/index/package_finder.cpython-310.pyc,,
757
+ ../../../bin/pip-3.10,,
758
+ pip/_vendor/resolvelib/reporters.cpython-310.pyc,,
759
+ pip/_internal/operations/build/metadata_legacy.cpython-310.pyc,,
760
+ pip/_vendor/rich/_palettes.cpython-310.pyc,,
761
+ pip/_internal/metadata/importlib/_dists.cpython-310.pyc,,
762
+ pip/_internal/operations/build/wheel_editable.cpython-310.pyc,,
763
+ pip/_vendor/colorama/tests/__pycache__,,
764
+ pip/_vendor/chardet/cli/chardetect.cpython-310.pyc,,
765
+ pip/_vendor/rich/constrain.cpython-310.pyc,,
766
+ pip/_vendor/rich/jupyter.cpython-310.pyc,,
767
+ pip/_vendor/pyparsing/util.cpython-310.pyc,,
768
+ pip/_vendor/webencodings/tests.cpython-310.pyc,,
769
+ pip/_vendor/tenacity/_utils.cpython-310.pyc,,
770
+ pip/_vendor/packaging/_structures.cpython-310.pyc,,
771
+ pip/_vendor/chardet/cp949prober.cpython-310.pyc,,
772
+ pip/_internal/resolution/resolvelib/candidates.cpython-310.pyc,,
773
+ pip/_vendor/pyparsing/common.cpython-310.pyc,,
774
+ pip/_vendor/chardet/sbcsgroupprober.cpython-310.pyc,,
775
+ pip/_vendor/certifi/__init__.cpython-310.pyc,,
776
+ pip/_vendor/pygments/__pycache__,,
777
+ pip/_internal/utils/compat.cpython-310.pyc,,
778
+ pip/_vendor/pygments/scanner.cpython-310.pyc,,
779
+ pip/_internal/utils/appdirs.cpython-310.pyc,,
780
+ pip/_vendor/pygments/filter.cpython-310.pyc,,
781
+ pip/_internal/resolution/resolvelib/provider.cpython-310.pyc,,
782
+ pip/_internal/cli/parser.cpython-310.pyc,,
783
+ pip/_vendor/rich/__init__.cpython-310.pyc,,
784
+ pip/_vendor/chardet/enums.cpython-310.pyc,,
785
+ pip/_vendor/urllib3/__pycache__,,
786
+ pip/_vendor/urllib3/exceptions.cpython-310.pyc,,
787
+ pip/_vendor/platformdirs/macos.cpython-310.pyc,,
788
+ pip/_vendor/rich/prompt.cpython-310.pyc,,
789
+ pip/_vendor/distro/__main__.cpython-310.pyc,,
790
+ pip/_vendor/chardet/johabprober.cpython-310.pyc,,
791
+ pip/_vendor/chardet/johabfreq.cpython-310.pyc,,
792
+ pip/_vendor/distlib/version.cpython-310.pyc,,
793
+ pip/_vendor/requests/certs.cpython-310.pyc,,
794
+ pip/_internal/models/search_scope.cpython-310.pyc,,
795
+ pip/_internal/operations/install/editable_legacy.cpython-310.pyc,,
796
+ pip/_vendor/urllib3/contrib/_appengine_environ.cpython-310.pyc,,
797
+ pip/_internal/utils/__pycache__,,
798
+ pip/_vendor/requests/compat.cpython-310.pyc,,
799
+ pip/_vendor/pygments/regexopt.cpython-310.pyc,,
800
+ pip/_internal/metadata/base.cpython-310.pyc,,
801
+ pip/_vendor/urllib3/contrib/__pycache__,,
802
+ pip/_vendor/pyproject_hooks/_in_process/__pycache__,,
803
+ pip/_internal/resolution/resolvelib/resolver.cpython-310.pyc,,
804
+ pip/_vendor/urllib3/packages/backports/weakref_finalize.cpython-310.pyc,,
805
+ pip/_vendor/webencodings/mklabels.cpython-310.pyc,,
806
+ pip/_vendor/pyparsing/diagram/__init__.cpython-310.pyc,,
807
+ pip/_internal/utils/_log.cpython-310.pyc,,
808
+ pip/_vendor/chardet/escsm.cpython-310.pyc,,
809
+ pip/_internal/models/direct_url.cpython-310.pyc,,
810
+ pip/_internal/commands/uninstall.cpython-310.pyc,,
811
+ pip/_vendor/chardet/langrussianmodel.cpython-310.pyc,,
812
+ pip/_vendor/rich/markup.cpython-310.pyc,,
813
+ pip/_internal/req/constructors.cpython-310.pyc,,
814
+ pip/_vendor/colorama/__pycache__,,
815
+ pip/_internal/network/xmlrpc.cpython-310.pyc,,
816
+ pip/_vendor/requests/exceptions.cpython-310.pyc,,
817
+ pip/_vendor/msgpack/__init__.cpython-310.pyc,,
818
+ pip/_vendor/urllib3/contrib/_securetransport/low_level.cpython-310.pyc,,
819
+ pip/_vendor/truststore/_windows.cpython-310.pyc,,
820
+ pip/_vendor/rich/palette.cpython-310.pyc,,
821
+ pip/_internal/models/__init__.cpython-310.pyc,,
822
+ pip/_vendor/platformdirs/version.cpython-310.pyc,,
823
+ pip/_internal/utils/packaging.cpython-310.pyc,,
824
+ pip/_vendor/six.cpython-310.pyc,,
825
+ pip/_vendor/urllib3/util/request.cpython-310.pyc,,
826
+ pip/_vendor/distlib/manifest.cpython-310.pyc,,
827
+ pip/_internal/metadata/_json.cpython-310.pyc,,
828
+ pip/_internal/models/candidate.cpython-310.pyc,,
829
+ pip/_vendor/urllib3/util/connection.cpython-310.pyc,,
830
+ pip/_internal/utils/compatibility_tags.cpython-310.pyc,,
831
+ pip/_vendor/webencodings/__init__.cpython-310.pyc,,
832
+ pip/_vendor/idna/__init__.cpython-310.pyc,,
833
+ pip/_internal/__init__.cpython-310.pyc,,
834
+ pip/_vendor/chardet/escprober.cpython-310.pyc,,
835
+ pip/_vendor/cachecontrol/caches/__pycache__,,
836
+ pip/_vendor/rich/color.cpython-310.pyc,,
837
+ pip/_vendor/rich/_win32_console.cpython-310.pyc,,
838
+ pip/_vendor/urllib3/_collections.cpython-310.pyc,,
839
+ pip/_internal/utils/glibc.cpython-310.pyc,,
840
+ pip/_vendor/urllib3/request.cpython-310.pyc,,
841
+ pip/_vendor/pygments/formatters/__init__.cpython-310.pyc,,
842
+ pip/_internal/network/cache.cpython-310.pyc,,
843
+ pip/_vendor/urllib3/packages/backports/__pycache__,,
844
+ pip/_internal/resolution/legacy/__init__.cpython-310.pyc,,
845
+ pip/_vendor/urllib3/connection.cpython-310.pyc,,
846
+ pip/_vendor/rich/tree.cpython-310.pyc,,
847
+ pip/_vendor/cachecontrol/cache.cpython-310.pyc,,
848
+ pip/_vendor/chardet/mbcsgroupprober.cpython-310.pyc,,
849
+ pip/_internal/utils/setuptools_build.cpython-310.pyc,,
850
+ pip/_internal/operations/build/wheel.cpython-310.pyc,,
851
+ pip/_vendor/packaging/__pycache__,,
852
+ pip/_vendor/pygments/plugin.cpython-310.pyc,,
853
+ pip/_vendor/distlib/database.cpython-310.pyc,,
854
+ pip/_vendor/pygments/formatters/terminal256.cpython-310.pyc,,
855
+ pip/_internal/commands/check.cpython-310.pyc,,
856
+ pip/_vendor/distlib/__init__.cpython-310.pyc,,
857
+ pip/_vendor/requests/auth.cpython-310.pyc,,
858
+ pip/_internal/models/installation_report.cpython-310.pyc,,
859
+ pip/_vendor/rich/progress_bar.cpython-310.pyc,,
860
+ pip/_vendor/pyparsing/unicode.cpython-310.pyc,,
861
+ pip/_internal/metadata/importlib/__pycache__,,
862
+ pip/_vendor/rich/_spinners.cpython-310.pyc,,
863
+ pip/_vendor/pygments/formatters/terminal.cpython-310.pyc,,
864
+ pip/_vendor/pygments/unistring.cpython-310.pyc,,
865
+ pip/_vendor/pkg_resources/__pycache__,,
866
+ pip/_vendor/chardet/codingstatemachinedict.cpython-310.pyc,,
867
+ ../../../bin/pip3.10,,
868
+ pip/_vendor/cachecontrol/filewrapper.cpython-310.pyc,,
869
+ pip/_vendor/pygments/formatters/pangomarkup.cpython-310.pyc,,
870
+ pip/_internal/locations/__pycache__,,
871
+ pip/_vendor/resolvelib/resolvers.cpython-310.pyc,,
872
+ pip/_vendor/colorama/tests/__init__.cpython-310.pyc,,
873
+ pip/_vendor/rich/style.cpython-310.pyc,,
874
+ pip/_internal/models/index.cpython-310.pyc,,
875
+ pip/_internal/index/__pycache__,,
876
+ pip/_vendor/colorama/tests/utils.cpython-310.pyc,,
877
+ pip/_vendor/requests/status_codes.cpython-310.pyc,,
878
+ pip/_vendor/rich/cells.cpython-310.pyc,,
879
+ pip/__pycache__,,
880
+ pip/_internal/resolution/__pycache__,,
881
+ pip/_vendor/colorama/tests/initialise_test.cpython-310.pyc,,
882
+ pip/_internal/models/link.cpython-310.pyc,,
883
+ pip/_vendor/tomli/__pycache__,,
884
+ pip/_vendor/tenacity/tornadoweb.cpython-310.pyc,,
885
+ pip/_vendor/idna/intranges.cpython-310.pyc,,
886
+ pip/_vendor/urllib3/util/__init__.cpython-310.pyc,,
887
+ pip/_vendor/webencodings/x_user_defined.cpython-310.pyc,,
888
+ pip/_vendor/pygments/__init__.cpython-310.pyc,,
889
+ pip/_internal/cli/cmdoptions.cpython-310.pyc,,
890
+ pip/_vendor/cachecontrol/__pycache__,,
891
+ pip/_vendor/pygments/formatters/rtf.cpython-310.pyc,,
892
+ pip/_vendor/rich/logging.cpython-310.pyc,,
893
+ pip/_vendor/rich/emoji.cpython-310.pyc,,
894
+ pip/_internal/commands/search.cpython-310.pyc,,
895
+ pip/_internal/utils/datetime.cpython-310.pyc,,
896
+ pip/_vendor/urllib3/__init__.cpython-310.pyc,,
897
+ pip/_vendor/distlib/index.cpython-310.pyc,,
898
+ pip/_internal/cli/main.cpython-310.pyc,,
899
+ pip/_internal/commands/completion.cpython-310.pyc,,
900
+ pip/_vendor/rich/diagnose.cpython-310.pyc,,
901
+ pip/_vendor/rich/file_proxy.cpython-310.pyc,,
902
+ pip/_internal/operations/build/wheel_legacy.cpython-310.pyc,,
903
+ pip/_vendor/urllib3/util/timeout.cpython-310.pyc,,
904
+ pip/_vendor/rich/segment.cpython-310.pyc,,
905
+ pip/_vendor/chardet/utf1632prober.cpython-310.pyc,,
906
+ pip/_vendor/chardet/mbcharsetprober.cpython-310.pyc,,
907
+ pip/_vendor/resolvelib/__pycache__,,
908
+ pip/_vendor/chardet/cli/__pycache__,,
909
+ pip/_internal/utils/__init__.cpython-310.pyc,,
910
+ pip/_vendor/rich/panel.cpython-310.pyc,,
911
+ pip/_vendor/tenacity/before_sleep.cpython-310.pyc,,
912
+ pip/_internal/utils/virtualenv.cpython-310.pyc,,
913
+ pip/_vendor/rich/_emoji_codes.cpython-310.pyc,,
914
+ pip/_vendor/pyproject_hooks/_in_process/__init__.cpython-310.pyc,,
915
+ pip/_vendor/rich/rule.cpython-310.pyc,,
916
+ pip/_vendor/cachecontrol/caches/redis_cache.cpython-310.pyc,,
917
+ pip/_vendor/rich/abc.cpython-310.pyc,,
918
+ pip/_vendor/pyproject_hooks/_in_process/_in_process.cpython-310.pyc,,
919
+ pip/_vendor/distlib/util.cpython-310.pyc,,
920
+ pip/_vendor/urllib3/util/retry.cpython-310.pyc,,
921
+ pip/_vendor/colorama/__init__.cpython-310.pyc,,
922
+ pip/_vendor/packaging/version.cpython-310.pyc,,
923
+ pip/_vendor/requests/__init__.cpython-310.pyc,,
924
+ pip/_vendor/urllib3/util/queue.cpython-310.pyc,,
925
+ pip/_internal/pyproject.cpython-310.pyc,,
926
+ pip/_vendor/distlib/markers.cpython-310.pyc,,
927
+ pip/_vendor/pygments/lexers/__pycache__,,
928
+ pip/_internal/models/format_control.cpython-310.pyc,,
929
+ pip/_vendor/pyparsing/core.cpython-310.pyc,,
930
+ pip/_internal/network/session.cpython-310.pyc,,
931
+ pip/_vendor/rich/_inspect.cpython-310.pyc,,
932
+ pip/_internal/resolution/legacy/resolver.cpython-310.pyc,,
933
+ pip/_vendor/colorama/tests/winterm_test.cpython-310.pyc,,
934
+ pip/_vendor/rich/styled.cpython-310.pyc,,
935
+ pip/_internal/commands/cache.cpython-310.pyc,,
936
+ pip/_internal/req/req_install.cpython-310.pyc,,
937
+ pip/_vendor/typing_extensions.cpython-310.pyc,,
938
+ pip/_vendor/pygments/formatters/other.cpython-310.pyc,,
939
+ pip/_vendor/rich/ansi.cpython-310.pyc,,
940
+ pip/_vendor/urllib3/packages/backports/__init__.cpython-310.pyc,,
941
+ pip/_vendor/distro/__pycache__,,
942
+ pip/_internal/vcs/versioncontrol.cpython-310.pyc,,
943
+ pip/_vendor/packaging/__init__.cpython-310.pyc,,
944
+ pip/_vendor/pygments/modeline.cpython-310.pyc,,
945
+ pip/_vendor/chardet/euctwfreq.cpython-310.pyc,,
946
+ pip/_vendor/packaging/utils.cpython-310.pyc,,
947
+ pip/_vendor/pygments/util.cpython-310.pyc,,
948
+ pip/_internal/wheel_builder.cpython-310.pyc,,
949
+ pip/_vendor/cachecontrol/controller.cpython-310.pyc,,
950
+ pip/_vendor/urllib3/util/wait.cpython-310.pyc,,
951
+ pip/_internal/operations/build/__pycache__,,
952
+ pip/_vendor/pyproject_hooks/__init__.cpython-310.pyc,,
953
+ pip/_vendor/rich/_log_render.cpython-310.pyc,,
954
+ pip/_internal/utils/urls.cpython-310.pyc,,
955
+ pip/_vendor/chardet/langgreekmodel.cpython-310.pyc,,
956
+ pip/_internal/utils/encoding.cpython-310.pyc,,
957
+ pip/_internal/metadata/importlib/__init__.cpython-310.pyc,,
958
+ pip/_vendor/urllib3/connectionpool.cpython-310.pyc,,
959
+ pip/_vendor/pyproject_hooks/_impl.cpython-310.pyc,,
960
+ pip/_internal/operations/build/metadata.cpython-310.pyc,,
961
+ pip/_vendor/webencodings/labels.cpython-310.pyc,,
962
+ pip/_vendor/pygments/style.cpython-310.pyc,,
963
+ pip/_vendor/msgpack/fallback.cpython-310.pyc,,
964
+ pip/_vendor/rich/json.cpython-310.pyc,,
965
+ pip/_vendor/tomli/_parser.cpython-310.pyc,,
966
+ pip/_vendor/tenacity/__init__.cpython-310.pyc,,
967
+ pip/_internal/index/collector.cpython-310.pyc,,
968
+ pip/_internal/utils/models.cpython-310.pyc,,
969
+ pip/_internal/locations/__init__.cpython-310.pyc,,
970
+ pip/_vendor/truststore/__pycache__,,
971
+ pip/_vendor/idna/idnadata.cpython-310.pyc,,
972
+ pip/_internal/utils/subprocess.cpython-310.pyc,,
973
+ pip/_vendor/pyproject_hooks/_compat.cpython-310.pyc,,
974
+ pip/_internal/resolution/resolvelib/factory.cpython-310.pyc,,
975
+ pip/_vendor/chardet/__pycache__,,
976
+ pip/_vendor/urllib3/util/ssl_match_hostname.cpython-310.pyc,,
977
+ pip/_internal/metadata/importlib/_compat.cpython-310.pyc,,
978
+ pip/_vendor/rich/progress.cpython-310.pyc,,
979
+ pip/_internal/operations/freeze.cpython-310.pyc,,
980
+ pip/_vendor/pygments/formatters/_mapping.cpython-310.pyc,,
981
+ pip/__init__.cpython-310.pyc,,
982
+ pip/_vendor/rich/traceback.cpython-310.pyc,,
983
+ pip/_internal/resolution/__init__.cpython-310.pyc,,
984
+ pip/_vendor/pygments/formatters/irc.cpython-310.pyc,,
985
+ pip/_vendor/rich/_timer.cpython-310.pyc,,
986
+ pip/_vendor/rich/align.cpython-310.pyc,,
987
+ pip/_vendor/rich/scope.cpython-310.pyc,,
988
+ pip/_internal/main.cpython-310.pyc,,
989
+ pip/_vendor/chardet/jisfreq.cpython-310.pyc,,
990
+ pip/_vendor/requests/models.cpython-310.pyc,,
991
+ pip/_internal/cli/command_context.cpython-310.pyc,,
992
+ pip/_internal/network/utils.cpython-310.pyc,,
993
+ pip/_vendor/rich/_emoji_replace.cpython-310.pyc,,
994
+ pip/_internal/operations/install/__init__.cpython-310.pyc,,
995
+ pip/_vendor/chardet/metadata/__pycache__,,
996
+ pip/_internal/commands/freeze.cpython-310.pyc,,
997
+ pip/_internal/commands/help.cpython-310.pyc,,
998
+ ../../../bin/pip,,
999
+ pip/_vendor/pygments/formatters/html.cpython-310.pyc,,
1000
+ pip/_vendor/certifi/core.cpython-310.pyc,,
1001
+ pip/_vendor/distlib/locators.cpython-310.pyc,,
1002
+ pip/_internal/utils/logging.cpython-310.pyc,,
1003
+ pip/_vendor/tenacity/retry.cpython-310.pyc,,
1004
+ pip/_internal/models/wheel.cpython-310.pyc,,
1005
+ pip/_vendor/packaging/specifiers.cpython-310.pyc,,
1006
+ pip/_vendor/rich/protocol.cpython-310.pyc,,
1007
+ pip/_internal/resolution/resolvelib/__pycache__,,
1008
+ pip/_vendor/requests/__version__.cpython-310.pyc,,
1009
+ pip/_vendor/chardet/resultdict.cpython-310.pyc,,
1010
+ pip/_vendor/rich/region.cpython-310.pyc,,
1011
+ pip/_vendor/pygments/styles/__pycache__,,
1012
+ pip/_vendor/urllib3/packages/__pycache__,,
1013
+ pip/_vendor/rich/box.cpython-310.pyc,,
1014
+ pip/_internal/utils/deprecation.cpython-310.pyc,,
1015
+ pip/_vendor/packaging/requirements.cpython-310.pyc,,
1016
+ pip/_vendor/__pycache__,,
1017
+ pip/_vendor/truststore/_ssl_constants.cpython-310.pyc,,
1018
+ pip/_vendor/distlib/scripts.cpython-310.pyc,,
1019
+ pip/_vendor/chardet/metadata/languages.cpython-310.pyc,,
1020
+ pip/_internal/distributions/__init__.cpython-310.pyc,,
1021
+ pip/_vendor/packaging/markers.cpython-310.pyc,,
1022
+ pip/_vendor/tenacity/_asyncio.cpython-310.pyc,,
1023
+ pip/_vendor/tenacity/nap.cpython-310.pyc,,
1024
+ pip/_vendor/platformdirs/__main__.cpython-310.pyc,,
1025
+ pip/_vendor/requests/_internal_utils.cpython-310.pyc,,
1026
+ pip/_internal/req/req_set.cpython-310.pyc,,
1027
+ pip/_vendor/requests/cookies.cpython-310.pyc,,
1028
+ pip/_vendor/pygments/lexers/__init__.cpython-310.pyc,,
1029
+ pip/_vendor/packaging/_manylinux.cpython-310.pyc,,
1030
+ pip/_internal/commands/hash.cpython-310.pyc,,
1031
+ pip/_internal/vcs/__pycache__,,
1032
+ pip/_internal/cli/__pycache__,,
1033
+ pip/_vendor/chardet/codingstatemachine.cpython-310.pyc,,
1034
+ pip/_vendor/colorama/ansitowin32.cpython-310.pyc,,
1035
+ pip/_vendor/pygments/filters/__pycache__,,
1036
+ pip/_vendor/tenacity/wait.cpython-310.pyc,,
1037
+ pip/_vendor/rich/control.cpython-310.pyc,,
1038
+ pip/_internal/resolution/resolvelib/found_candidates.cpython-310.pyc,,
1039
+ pip/_vendor/platformdirs/android.cpython-310.pyc,,
1040
+ pip/_vendor/chardet/langthaimodel.cpython-310.pyc,,
1041
+ pip/_vendor/pyparsing/testing.cpython-310.pyc,,
1042
+ pip/_vendor/packaging/tags.cpython-310.pyc,,
1043
+ pip/_vendor/distro/__init__.cpython-310.pyc,,
1044
+ pip/_vendor/chardet/charsetgroupprober.cpython-310.pyc,,
1045
+ pip/_vendor/urllib3/util/response.cpython-310.pyc,,
1046
+ pip/_vendor/rich/highlighter.cpython-310.pyc,,
1047
+ pip/_vendor/rich/default_styles.cpython-310.pyc,,
1048
+ pip/_internal/req/__pycache__,,
1049
+ pip/_internal/commands/wheel.cpython-310.pyc,,
1050
+ pip/_vendor/chardet/chardistribution.cpython-310.pyc,,
1051
+ pip/_vendor/tenacity/stop.cpython-310.pyc,,
1052
+ pip/_vendor/chardet/gb2312prober.cpython-310.pyc,,
1053
+ pip/_vendor/pygments/formatter.cpython-310.pyc,,
1054
+ pip/_vendor/idna/core.cpython-310.pyc,,
1055
+ pip/_internal/operations/build/__init__.cpython-310.pyc,,
1056
+ pip/_vendor/urllib3/util/ssl_.cpython-310.pyc,,
1057
+ pip/_vendor/distro/distro.cpython-310.pyc,,
1058
+ pip/_internal/network/download.cpython-310.pyc,,
1059
+ pip/_vendor/urllib3/contrib/appengine.cpython-310.pyc,,
1060
+ pip/_vendor/chardet/charsetprober.cpython-310.pyc,,
1061
+ pip/_internal/network/__pycache__,,
1062
+ pip/_vendor/rich/containers.cpython-310.pyc,,
1063
+ pip/_vendor/platformdirs/api.cpython-310.pyc,,
1064
+ pip/_vendor/requests/packages.cpython-310.pyc,,
1065
+ pip/_internal/models/scheme.cpython-310.pyc,,
1066
+ pip/_internal/cli/spinners.cpython-310.pyc,,
1067
+ pip/_vendor/truststore/__init__.cpython-310.pyc,,
1068
+ pip/_vendor/urllib3/contrib/_securetransport/__pycache__,,
1069
+ pip/_internal/utils/temp_dir.cpython-310.pyc,,
1070
+ ../../../bin/pip3,,
1071
+ pip/_vendor/chardet/sbcharsetprober.cpython-310.pyc,,
1072
+ pip-23.3.1.virtualenv,,
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.dist-info/WHEEL ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ Wheel-Version: 1.0
2
+ Generator: bdist_wheel (0.41.2)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.dist-info/entry_points.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ [console_scripts]
2
+ pip = pip._internal.cli.main:main
3
+ pip3 = pip._internal.cli.main:main
4
+ pip3.11 = pip._internal.cli.main:main
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.dist-info/top_level.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip-23.3.1.virtualenv ADDED
File without changes
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/__init__.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import List, Optional
2
+
3
+ __version__ = "23.3.1"
4
+
5
+
6
+ def main(args: Optional[List[str]] = None) -> int:
7
+ """This is an internal API only meant for use by pip's own console scripts.
8
+
9
+ For additional details, see https://github.com/pypa/pip/issues/7498.
10
+ """
11
+ from pip._internal.utils.entrypoints import _wrapper
12
+
13
+ return _wrapper(args)
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/__main__.py ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+
4
+ # Remove '' and current working directory from the first entry
5
+ # of sys.path, if present to avoid using current directory
6
+ # in pip commands check, freeze, install, list and show,
7
+ # when invoked as python -m pip <command>
8
+ if sys.path[0] in ("", os.getcwd()):
9
+ sys.path.pop(0)
10
+
11
+ # If we are running from a wheel, add the wheel to sys.path
12
+ # This allows the usage python pip-*.whl/pip install pip-*.whl
13
+ if __package__ == "":
14
+ # __file__ is pip-*.whl/pip/__main__.py
15
+ # first dirname call strips of '/__main__.py', second strips off '/pip'
16
+ # Resulting path is the name of the wheel itself
17
+ # Add that to sys.path so we can import pip
18
+ path = os.path.dirname(os.path.dirname(__file__))
19
+ sys.path.insert(0, path)
20
+
21
+ if __name__ == "__main__":
22
+ from pip._internal.cli.main import main as _main
23
+
24
+ sys.exit(_main())
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/__pip-runner__.py ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Execute exactly this copy of pip, within a different environment.
2
+
3
+ This file is named as it is, to ensure that this module can't be imported via
4
+ an import statement.
5
+ """
6
+
7
+ # /!\ This version compatibility check section must be Python 2 compatible. /!\
8
+
9
+ import sys
10
+
11
+ # Copied from setup.py
12
+ PYTHON_REQUIRES = (3, 7)
13
+
14
+
15
+ def version_str(version): # type: ignore
16
+ return ".".join(str(v) for v in version)
17
+
18
+
19
+ if sys.version_info[:2] < PYTHON_REQUIRES:
20
+ raise SystemExit(
21
+ "This version of pip does not support python {} (requires >={}).".format(
22
+ version_str(sys.version_info[:2]), version_str(PYTHON_REQUIRES)
23
+ )
24
+ )
25
+
26
+ # From here on, we can use Python 3 features, but the syntax must remain
27
+ # Python 2 compatible.
28
+
29
+ import runpy # noqa: E402
30
+ from importlib.machinery import PathFinder # noqa: E402
31
+ from os.path import dirname # noqa: E402
32
+
33
+ PIP_SOURCES_ROOT = dirname(dirname(__file__))
34
+
35
+
36
+ class PipImportRedirectingFinder:
37
+ @classmethod
38
+ def find_spec(self, fullname, path=None, target=None): # type: ignore
39
+ if fullname != "pip":
40
+ return None
41
+
42
+ spec = PathFinder.find_spec(fullname, [PIP_SOURCES_ROOT], target)
43
+ assert spec, (PIP_SOURCES_ROOT, fullname)
44
+ return spec
45
+
46
+
47
+ sys.meta_path.insert(0, PipImportRedirectingFinder())
48
+
49
+ assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module"
50
+ runpy.run_module("pip", run_name="__main__", alter_sys=True)
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/__init__.py ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import List, Optional
2
+
3
+ from pip._internal.utils import _log
4
+
5
+ # init_logging() must be called before any call to logging.getLogger()
6
+ # which happens at import of most modules.
7
+ _log.init_logging()
8
+
9
+
10
+ def main(args: (Optional[List[str]]) = None) -> int:
11
+ """This is preserved for old console scripts that may still be referencing
12
+ it.
13
+
14
+ For additional details, see https://github.com/pypa/pip/issues/7498.
15
+ """
16
+ from pip._internal.utils.entrypoints import _wrapper
17
+
18
+ return _wrapper(args)
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/build_env.py ADDED
@@ -0,0 +1,311 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Build Environment used for isolation during sdist building
2
+ """
3
+
4
+ import logging
5
+ import os
6
+ import pathlib
7
+ import site
8
+ import sys
9
+ import textwrap
10
+ from collections import OrderedDict
11
+ from types import TracebackType
12
+ from typing import TYPE_CHECKING, Iterable, List, Optional, Set, Tuple, Type, Union
13
+
14
+ from pip._vendor.certifi import where
15
+ from pip._vendor.packaging.requirements import Requirement
16
+ from pip._vendor.packaging.version import Version
17
+
18
+ from pip import __file__ as pip_location
19
+ from pip._internal.cli.spinners import open_spinner
20
+ from pip._internal.locations import get_platlib, get_purelib, get_scheme
21
+ from pip._internal.metadata import get_default_environment, get_environment
22
+ from pip._internal.utils.subprocess import call_subprocess
23
+ from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
24
+
25
+ if TYPE_CHECKING:
26
+ from pip._internal.index.package_finder import PackageFinder
27
+
28
+ logger = logging.getLogger(__name__)
29
+
30
+
31
+ def _dedup(a: str, b: str) -> Union[Tuple[str], Tuple[str, str]]:
32
+ return (a, b) if a != b else (a,)
33
+
34
+
35
+ class _Prefix:
36
+ def __init__(self, path: str) -> None:
37
+ self.path = path
38
+ self.setup = False
39
+ scheme = get_scheme("", prefix=path)
40
+ self.bin_dir = scheme.scripts
41
+ self.lib_dirs = _dedup(scheme.purelib, scheme.platlib)
42
+
43
+
44
+ def get_runnable_pip() -> str:
45
+ """Get a file to pass to a Python executable, to run the currently-running pip.
46
+
47
+ This is used to run a pip subprocess, for installing requirements into the build
48
+ environment.
49
+ """
50
+ source = pathlib.Path(pip_location).resolve().parent
51
+
52
+ if not source.is_dir():
53
+ # This would happen if someone is using pip from inside a zip file. In that
54
+ # case, we can use that directly.
55
+ return str(source)
56
+
57
+ return os.fsdecode(source / "__pip-runner__.py")
58
+
59
+
60
+ def _get_system_sitepackages() -> Set[str]:
61
+ """Get system site packages
62
+
63
+ Usually from site.getsitepackages,
64
+ but fallback on `get_purelib()/get_platlib()` if unavailable
65
+ (e.g. in a virtualenv created by virtualenv<20)
66
+
67
+ Returns normalized set of strings.
68
+ """
69
+ if hasattr(site, "getsitepackages"):
70
+ system_sites = site.getsitepackages()
71
+ else:
72
+ # virtualenv < 20 overwrites site.py without getsitepackages
73
+ # fallback on get_purelib/get_platlib.
74
+ # this is known to miss things, but shouldn't in the cases
75
+ # where getsitepackages() has been removed (inside a virtualenv)
76
+ system_sites = [get_purelib(), get_platlib()]
77
+ return {os.path.normcase(path) for path in system_sites}
78
+
79
+
80
+ class BuildEnvironment:
81
+ """Creates and manages an isolated environment to install build deps"""
82
+
83
+ def __init__(self) -> None:
84
+ temp_dir = TempDirectory(kind=tempdir_kinds.BUILD_ENV, globally_managed=True)
85
+
86
+ self._prefixes = OrderedDict(
87
+ (name, _Prefix(os.path.join(temp_dir.path, name)))
88
+ for name in ("normal", "overlay")
89
+ )
90
+
91
+ self._bin_dirs: List[str] = []
92
+ self._lib_dirs: List[str] = []
93
+ for prefix in reversed(list(self._prefixes.values())):
94
+ self._bin_dirs.append(prefix.bin_dir)
95
+ self._lib_dirs.extend(prefix.lib_dirs)
96
+
97
+ # Customize site to:
98
+ # - ensure .pth files are honored
99
+ # - prevent access to system site packages
100
+ system_sites = _get_system_sitepackages()
101
+
102
+ self._site_dir = os.path.join(temp_dir.path, "site")
103
+ if not os.path.exists(self._site_dir):
104
+ os.mkdir(self._site_dir)
105
+ with open(
106
+ os.path.join(self._site_dir, "sitecustomize.py"), "w", encoding="utf-8"
107
+ ) as fp:
108
+ fp.write(
109
+ textwrap.dedent(
110
+ """
111
+ import os, site, sys
112
+
113
+ # First, drop system-sites related paths.
114
+ original_sys_path = sys.path[:]
115
+ known_paths = set()
116
+ for path in {system_sites!r}:
117
+ site.addsitedir(path, known_paths=known_paths)
118
+ system_paths = set(
119
+ os.path.normcase(path)
120
+ for path in sys.path[len(original_sys_path):]
121
+ )
122
+ original_sys_path = [
123
+ path for path in original_sys_path
124
+ if os.path.normcase(path) not in system_paths
125
+ ]
126
+ sys.path = original_sys_path
127
+
128
+ # Second, add lib directories.
129
+ # ensuring .pth file are processed.
130
+ for path in {lib_dirs!r}:
131
+ assert not path in sys.path
132
+ site.addsitedir(path)
133
+ """
134
+ ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)
135
+ )
136
+
137
+ def __enter__(self) -> None:
138
+ self._save_env = {
139
+ name: os.environ.get(name, None)
140
+ for name in ("PATH", "PYTHONNOUSERSITE", "PYTHONPATH")
141
+ }
142
+
143
+ path = self._bin_dirs[:]
144
+ old_path = self._save_env["PATH"]
145
+ if old_path:
146
+ path.extend(old_path.split(os.pathsep))
147
+
148
+ pythonpath = [self._site_dir]
149
+
150
+ os.environ.update(
151
+ {
152
+ "PATH": os.pathsep.join(path),
153
+ "PYTHONNOUSERSITE": "1",
154
+ "PYTHONPATH": os.pathsep.join(pythonpath),
155
+ }
156
+ )
157
+
158
+ def __exit__(
159
+ self,
160
+ exc_type: Optional[Type[BaseException]],
161
+ exc_val: Optional[BaseException],
162
+ exc_tb: Optional[TracebackType],
163
+ ) -> None:
164
+ for varname, old_value in self._save_env.items():
165
+ if old_value is None:
166
+ os.environ.pop(varname, None)
167
+ else:
168
+ os.environ[varname] = old_value
169
+
170
+ def check_requirements(
171
+ self, reqs: Iterable[str]
172
+ ) -> Tuple[Set[Tuple[str, str]], Set[str]]:
173
+ """Return 2 sets:
174
+ - conflicting requirements: set of (installed, wanted) reqs tuples
175
+ - missing requirements: set of reqs
176
+ """
177
+ missing = set()
178
+ conflicting = set()
179
+ if reqs:
180
+ env = (
181
+ get_environment(self._lib_dirs)
182
+ if hasattr(self, "_lib_dirs")
183
+ else get_default_environment()
184
+ )
185
+ for req_str in reqs:
186
+ req = Requirement(req_str)
187
+ # We're explicitly evaluating with an empty extra value, since build
188
+ # environments are not provided any mechanism to select specific extras.
189
+ if req.marker is not None and not req.marker.evaluate({"extra": ""}):
190
+ continue
191
+ dist = env.get_distribution(req.name)
192
+ if not dist:
193
+ missing.add(req_str)
194
+ continue
195
+ if isinstance(dist.version, Version):
196
+ installed_req_str = f"{req.name}=={dist.version}"
197
+ else:
198
+ installed_req_str = f"{req.name}==={dist.version}"
199
+ if not req.specifier.contains(dist.version, prereleases=True):
200
+ conflicting.add((installed_req_str, req_str))
201
+ # FIXME: Consider direct URL?
202
+ return conflicting, missing
203
+
204
+ def install_requirements(
205
+ self,
206
+ finder: "PackageFinder",
207
+ requirements: Iterable[str],
208
+ prefix_as_string: str,
209
+ *,
210
+ kind: str,
211
+ ) -> None:
212
+ prefix = self._prefixes[prefix_as_string]
213
+ assert not prefix.setup
214
+ prefix.setup = True
215
+ if not requirements:
216
+ return
217
+ self._install_requirements(
218
+ get_runnable_pip(),
219
+ finder,
220
+ requirements,
221
+ prefix,
222
+ kind=kind,
223
+ )
224
+
225
+ @staticmethod
226
+ def _install_requirements(
227
+ pip_runnable: str,
228
+ finder: "PackageFinder",
229
+ requirements: Iterable[str],
230
+ prefix: _Prefix,
231
+ *,
232
+ kind: str,
233
+ ) -> None:
234
+ args: List[str] = [
235
+ sys.executable,
236
+ pip_runnable,
237
+ "install",
238
+ "--ignore-installed",
239
+ "--no-user",
240
+ "--prefix",
241
+ prefix.path,
242
+ "--no-warn-script-location",
243
+ ]
244
+ if logger.getEffectiveLevel() <= logging.DEBUG:
245
+ args.append("-v")
246
+ for format_control in ("no_binary", "only_binary"):
247
+ formats = getattr(finder.format_control, format_control)
248
+ args.extend(
249
+ (
250
+ "--" + format_control.replace("_", "-"),
251
+ ",".join(sorted(formats or {":none:"})),
252
+ )
253
+ )
254
+
255
+ index_urls = finder.index_urls
256
+ if index_urls:
257
+ args.extend(["-i", index_urls[0]])
258
+ for extra_index in index_urls[1:]:
259
+ args.extend(["--extra-index-url", extra_index])
260
+ else:
261
+ args.append("--no-index")
262
+ for link in finder.find_links:
263
+ args.extend(["--find-links", link])
264
+
265
+ for host in finder.trusted_hosts:
266
+ args.extend(["--trusted-host", host])
267
+ if finder.allow_all_prereleases:
268
+ args.append("--pre")
269
+ if finder.prefer_binary:
270
+ args.append("--prefer-binary")
271
+ args.append("--")
272
+ args.extend(requirements)
273
+ extra_environ = {"_PIP_STANDALONE_CERT": where()}
274
+ with open_spinner(f"Installing {kind}") as spinner:
275
+ call_subprocess(
276
+ args,
277
+ command_desc=f"pip subprocess to install {kind}",
278
+ spinner=spinner,
279
+ extra_environ=extra_environ,
280
+ )
281
+
282
+
283
+ class NoOpBuildEnvironment(BuildEnvironment):
284
+ """A no-op drop-in replacement for BuildEnvironment"""
285
+
286
+ def __init__(self) -> None:
287
+ pass
288
+
289
+ def __enter__(self) -> None:
290
+ pass
291
+
292
+ def __exit__(
293
+ self,
294
+ exc_type: Optional[Type[BaseException]],
295
+ exc_val: Optional[BaseException],
296
+ exc_tb: Optional[TracebackType],
297
+ ) -> None:
298
+ pass
299
+
300
+ def cleanup(self) -> None:
301
+ pass
302
+
303
+ def install_requirements(
304
+ self,
305
+ finder: "PackageFinder",
306
+ requirements: Iterable[str],
307
+ prefix_as_string: str,
308
+ *,
309
+ kind: str,
310
+ ) -> None:
311
+ raise NotImplementedError()
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cache.py ADDED
@@ -0,0 +1,290 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Cache Management
2
+ """
3
+
4
+ import hashlib
5
+ import json
6
+ import logging
7
+ import os
8
+ from pathlib import Path
9
+ from typing import Any, Dict, List, Optional
10
+
11
+ from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version
12
+ from pip._vendor.packaging.utils import canonicalize_name
13
+
14
+ from pip._internal.exceptions import InvalidWheelFilename
15
+ from pip._internal.models.direct_url import DirectUrl
16
+ from pip._internal.models.link import Link
17
+ from pip._internal.models.wheel import Wheel
18
+ from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
19
+ from pip._internal.utils.urls import path_to_url
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+ ORIGIN_JSON_NAME = "origin.json"
24
+
25
+
26
+ def _hash_dict(d: Dict[str, str]) -> str:
27
+ """Return a stable sha224 of a dictionary."""
28
+ s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True)
29
+ return hashlib.sha224(s.encode("ascii")).hexdigest()
30
+
31
+
32
+ class Cache:
33
+ """An abstract class - provides cache directories for data from links
34
+
35
+ :param cache_dir: The root of the cache.
36
+ """
37
+
38
+ def __init__(self, cache_dir: str) -> None:
39
+ super().__init__()
40
+ assert not cache_dir or os.path.isabs(cache_dir)
41
+ self.cache_dir = cache_dir or None
42
+
43
+ def _get_cache_path_parts(self, link: Link) -> List[str]:
44
+ """Get parts of part that must be os.path.joined with cache_dir"""
45
+
46
+ # We want to generate an url to use as our cache key, we don't want to
47
+ # just re-use the URL because it might have other items in the fragment
48
+ # and we don't care about those.
49
+ key_parts = {"url": link.url_without_fragment}
50
+ if link.hash_name is not None and link.hash is not None:
51
+ key_parts[link.hash_name] = link.hash
52
+ if link.subdirectory_fragment:
53
+ key_parts["subdirectory"] = link.subdirectory_fragment
54
+
55
+ # Include interpreter name, major and minor version in cache key
56
+ # to cope with ill-behaved sdists that build a different wheel
57
+ # depending on the python version their setup.py is being run on,
58
+ # and don't encode the difference in compatibility tags.
59
+ # https://github.com/pypa/pip/issues/7296
60
+ key_parts["interpreter_name"] = interpreter_name()
61
+ key_parts["interpreter_version"] = interpreter_version()
62
+
63
+ # Encode our key url with sha224, we'll use this because it has similar
64
+ # security properties to sha256, but with a shorter total output (and
65
+ # thus less secure). However the differences don't make a lot of
66
+ # difference for our use case here.
67
+ hashed = _hash_dict(key_parts)
68
+
69
+ # We want to nest the directories some to prevent having a ton of top
70
+ # level directories where we might run out of sub directories on some
71
+ # FS.
72
+ parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]]
73
+
74
+ return parts
75
+
76
+ def _get_candidates(self, link: Link, canonical_package_name: str) -> List[Any]:
77
+ can_not_cache = not self.cache_dir or not canonical_package_name or not link
78
+ if can_not_cache:
79
+ return []
80
+
81
+ path = self.get_path_for_link(link)
82
+ if os.path.isdir(path):
83
+ return [(candidate, path) for candidate in os.listdir(path)]
84
+ return []
85
+
86
+ def get_path_for_link(self, link: Link) -> str:
87
+ """Return a directory to store cached items in for link."""
88
+ raise NotImplementedError()
89
+
90
+ def get(
91
+ self,
92
+ link: Link,
93
+ package_name: Optional[str],
94
+ supported_tags: List[Tag],
95
+ ) -> Link:
96
+ """Returns a link to a cached item if it exists, otherwise returns the
97
+ passed link.
98
+ """
99
+ raise NotImplementedError()
100
+
101
+
102
+ class SimpleWheelCache(Cache):
103
+ """A cache of wheels for future installs."""
104
+
105
+ def __init__(self, cache_dir: str) -> None:
106
+ super().__init__(cache_dir)
107
+
108
+ def get_path_for_link(self, link: Link) -> str:
109
+ """Return a directory to store cached wheels for link
110
+
111
+ Because there are M wheels for any one sdist, we provide a directory
112
+ to cache them in, and then consult that directory when looking up
113
+ cache hits.
114
+
115
+ We only insert things into the cache if they have plausible version
116
+ numbers, so that we don't contaminate the cache with things that were
117
+ not unique. E.g. ./package might have dozens of installs done for it
118
+ and build a version of 0.0...and if we built and cached a wheel, we'd
119
+ end up using the same wheel even if the source has been edited.
120
+
121
+ :param link: The link of the sdist for which this will cache wheels.
122
+ """
123
+ parts = self._get_cache_path_parts(link)
124
+ assert self.cache_dir
125
+ # Store wheels within the root cache_dir
126
+ return os.path.join(self.cache_dir, "wheels", *parts)
127
+
128
+ def get(
129
+ self,
130
+ link: Link,
131
+ package_name: Optional[str],
132
+ supported_tags: List[Tag],
133
+ ) -> Link:
134
+ candidates = []
135
+
136
+ if not package_name:
137
+ return link
138
+
139
+ canonical_package_name = canonicalize_name(package_name)
140
+ for wheel_name, wheel_dir in self._get_candidates(link, canonical_package_name):
141
+ try:
142
+ wheel = Wheel(wheel_name)
143
+ except InvalidWheelFilename:
144
+ continue
145
+ if canonicalize_name(wheel.name) != canonical_package_name:
146
+ logger.debug(
147
+ "Ignoring cached wheel %s for %s as it "
148
+ "does not match the expected distribution name %s.",
149
+ wheel_name,
150
+ link,
151
+ package_name,
152
+ )
153
+ continue
154
+ if not wheel.supported(supported_tags):
155
+ # Built for a different python/arch/etc
156
+ continue
157
+ candidates.append(
158
+ (
159
+ wheel.support_index_min(supported_tags),
160
+ wheel_name,
161
+ wheel_dir,
162
+ )
163
+ )
164
+
165
+ if not candidates:
166
+ return link
167
+
168
+ _, wheel_name, wheel_dir = min(candidates)
169
+ return Link(path_to_url(os.path.join(wheel_dir, wheel_name)))
170
+
171
+
172
+ class EphemWheelCache(SimpleWheelCache):
173
+ """A SimpleWheelCache that creates it's own temporary cache directory"""
174
+
175
+ def __init__(self) -> None:
176
+ self._temp_dir = TempDirectory(
177
+ kind=tempdir_kinds.EPHEM_WHEEL_CACHE,
178
+ globally_managed=True,
179
+ )
180
+
181
+ super().__init__(self._temp_dir.path)
182
+
183
+
184
+ class CacheEntry:
185
+ def __init__(
186
+ self,
187
+ link: Link,
188
+ persistent: bool,
189
+ ):
190
+ self.link = link
191
+ self.persistent = persistent
192
+ self.origin: Optional[DirectUrl] = None
193
+ origin_direct_url_path = Path(self.link.file_path).parent / ORIGIN_JSON_NAME
194
+ if origin_direct_url_path.exists():
195
+ try:
196
+ self.origin = DirectUrl.from_json(
197
+ origin_direct_url_path.read_text(encoding="utf-8")
198
+ )
199
+ except Exception as e:
200
+ logger.warning(
201
+ "Ignoring invalid cache entry origin file %s for %s (%s)",
202
+ origin_direct_url_path,
203
+ link.filename,
204
+ e,
205
+ )
206
+
207
+
208
+ class WheelCache(Cache):
209
+ """Wraps EphemWheelCache and SimpleWheelCache into a single Cache
210
+
211
+ This Cache allows for gracefully degradation, using the ephem wheel cache
212
+ when a certain link is not found in the simple wheel cache first.
213
+ """
214
+
215
+ def __init__(self, cache_dir: str) -> None:
216
+ super().__init__(cache_dir)
217
+ self._wheel_cache = SimpleWheelCache(cache_dir)
218
+ self._ephem_cache = EphemWheelCache()
219
+
220
+ def get_path_for_link(self, link: Link) -> str:
221
+ return self._wheel_cache.get_path_for_link(link)
222
+
223
+ def get_ephem_path_for_link(self, link: Link) -> str:
224
+ return self._ephem_cache.get_path_for_link(link)
225
+
226
+ def get(
227
+ self,
228
+ link: Link,
229
+ package_name: Optional[str],
230
+ supported_tags: List[Tag],
231
+ ) -> Link:
232
+ cache_entry = self.get_cache_entry(link, package_name, supported_tags)
233
+ if cache_entry is None:
234
+ return link
235
+ return cache_entry.link
236
+
237
+ def get_cache_entry(
238
+ self,
239
+ link: Link,
240
+ package_name: Optional[str],
241
+ supported_tags: List[Tag],
242
+ ) -> Optional[CacheEntry]:
243
+ """Returns a CacheEntry with a link to a cached item if it exists or
244
+ None. The cache entry indicates if the item was found in the persistent
245
+ or ephemeral cache.
246
+ """
247
+ retval = self._wheel_cache.get(
248
+ link=link,
249
+ package_name=package_name,
250
+ supported_tags=supported_tags,
251
+ )
252
+ if retval is not link:
253
+ return CacheEntry(retval, persistent=True)
254
+
255
+ retval = self._ephem_cache.get(
256
+ link=link,
257
+ package_name=package_name,
258
+ supported_tags=supported_tags,
259
+ )
260
+ if retval is not link:
261
+ return CacheEntry(retval, persistent=False)
262
+
263
+ return None
264
+
265
+ @staticmethod
266
+ def record_download_origin(cache_dir: str, download_info: DirectUrl) -> None:
267
+ origin_path = Path(cache_dir) / ORIGIN_JSON_NAME
268
+ if origin_path.exists():
269
+ try:
270
+ origin = DirectUrl.from_json(origin_path.read_text(encoding="utf-8"))
271
+ except Exception as e:
272
+ logger.warning(
273
+ "Could not read origin file %s in cache entry (%s). "
274
+ "Will attempt to overwrite it.",
275
+ origin_path,
276
+ e,
277
+ )
278
+ else:
279
+ # TODO: use DirectUrl.equivalent when
280
+ # https://github.com/pypa/pip/pull/10564 is merged.
281
+ if origin.url != download_info.url:
282
+ logger.warning(
283
+ "Origin URL %s in cache entry %s does not match download URL "
284
+ "%s. This is likely a pip bug or a cache corruption issue. "
285
+ "Will overwrite it with the new value.",
286
+ origin.url,
287
+ cache_dir,
288
+ download_info.url,
289
+ )
290
+ origin_path.write_text(download_info.to_json(), encoding="utf-8")
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/__init__.py ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ """Subpackage containing all of pip's command line interface related code
2
+ """
3
+
4
+ # This file intentionally does not import submodules
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/autocompletion.py ADDED
@@ -0,0 +1,172 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Logic that powers autocompletion installed by ``pip completion``.
2
+ """
3
+
4
+ import optparse
5
+ import os
6
+ import sys
7
+ from itertools import chain
8
+ from typing import Any, Iterable, List, Optional
9
+
10
+ from pip._internal.cli.main_parser import create_main_parser
11
+ from pip._internal.commands import commands_dict, create_command
12
+ from pip._internal.metadata import get_default_environment
13
+
14
+
15
+ def autocomplete() -> None:
16
+ """Entry Point for completion of main and subcommand options."""
17
+ # Don't complete if user hasn't sourced bash_completion file.
18
+ if "PIP_AUTO_COMPLETE" not in os.environ:
19
+ return
20
+ cwords = os.environ["COMP_WORDS"].split()[1:]
21
+ cword = int(os.environ["COMP_CWORD"])
22
+ try:
23
+ current = cwords[cword - 1]
24
+ except IndexError:
25
+ current = ""
26
+
27
+ parser = create_main_parser()
28
+ subcommands = list(commands_dict)
29
+ options = []
30
+
31
+ # subcommand
32
+ subcommand_name: Optional[str] = None
33
+ for word in cwords:
34
+ if word in subcommands:
35
+ subcommand_name = word
36
+ break
37
+ # subcommand options
38
+ if subcommand_name is not None:
39
+ # special case: 'help' subcommand has no options
40
+ if subcommand_name == "help":
41
+ sys.exit(1)
42
+ # special case: list locally installed dists for show and uninstall
43
+ should_list_installed = not current.startswith("-") and subcommand_name in [
44
+ "show",
45
+ "uninstall",
46
+ ]
47
+ if should_list_installed:
48
+ env = get_default_environment()
49
+ lc = current.lower()
50
+ installed = [
51
+ dist.canonical_name
52
+ for dist in env.iter_installed_distributions(local_only=True)
53
+ if dist.canonical_name.startswith(lc)
54
+ and dist.canonical_name not in cwords[1:]
55
+ ]
56
+ # if there are no dists installed, fall back to option completion
57
+ if installed:
58
+ for dist in installed:
59
+ print(dist)
60
+ sys.exit(1)
61
+
62
+ should_list_installables = (
63
+ not current.startswith("-") and subcommand_name == "install"
64
+ )
65
+ if should_list_installables:
66
+ for path in auto_complete_paths(current, "path"):
67
+ print(path)
68
+ sys.exit(1)
69
+
70
+ subcommand = create_command(subcommand_name)
71
+
72
+ for opt in subcommand.parser.option_list_all:
73
+ if opt.help != optparse.SUPPRESS_HELP:
74
+ options += [
75
+ (opt_str, opt.nargs) for opt_str in opt._long_opts + opt._short_opts
76
+ ]
77
+
78
+ # filter out previously specified options from available options
79
+ prev_opts = [x.split("=")[0] for x in cwords[1 : cword - 1]]
80
+ options = [(x, v) for (x, v) in options if x not in prev_opts]
81
+ # filter options by current input
82
+ options = [(k, v) for k, v in options if k.startswith(current)]
83
+ # get completion type given cwords and available subcommand options
84
+ completion_type = get_path_completion_type(
85
+ cwords,
86
+ cword,
87
+ subcommand.parser.option_list_all,
88
+ )
89
+ # get completion files and directories if ``completion_type`` is
90
+ # ``<file>``, ``<dir>`` or ``<path>``
91
+ if completion_type:
92
+ paths = auto_complete_paths(current, completion_type)
93
+ options = [(path, 0) for path in paths]
94
+ for option in options:
95
+ opt_label = option[0]
96
+ # append '=' to options which require args
97
+ if option[1] and option[0][:2] == "--":
98
+ opt_label += "="
99
+ print(opt_label)
100
+ else:
101
+ # show main parser options only when necessary
102
+
103
+ opts = [i.option_list for i in parser.option_groups]
104
+ opts.append(parser.option_list)
105
+ flattened_opts = chain.from_iterable(opts)
106
+ if current.startswith("-"):
107
+ for opt in flattened_opts:
108
+ if opt.help != optparse.SUPPRESS_HELP:
109
+ subcommands += opt._long_opts + opt._short_opts
110
+ else:
111
+ # get completion type given cwords and all available options
112
+ completion_type = get_path_completion_type(cwords, cword, flattened_opts)
113
+ if completion_type:
114
+ subcommands = list(auto_complete_paths(current, completion_type))
115
+
116
+ print(" ".join([x for x in subcommands if x.startswith(current)]))
117
+ sys.exit(1)
118
+
119
+
120
+ def get_path_completion_type(
121
+ cwords: List[str], cword: int, opts: Iterable[Any]
122
+ ) -> Optional[str]:
123
+ """Get the type of path completion (``file``, ``dir``, ``path`` or None)
124
+
125
+ :param cwords: same as the environmental variable ``COMP_WORDS``
126
+ :param cword: same as the environmental variable ``COMP_CWORD``
127
+ :param opts: The available options to check
128
+ :return: path completion type (``file``, ``dir``, ``path`` or None)
129
+ """
130
+ if cword < 2 or not cwords[cword - 2].startswith("-"):
131
+ return None
132
+ for opt in opts:
133
+ if opt.help == optparse.SUPPRESS_HELP:
134
+ continue
135
+ for o in str(opt).split("/"):
136
+ if cwords[cword - 2].split("=")[0] == o:
137
+ if not opt.metavar or any(
138
+ x in ("path", "file", "dir") for x in opt.metavar.split("/")
139
+ ):
140
+ return opt.metavar
141
+ return None
142
+
143
+
144
+ def auto_complete_paths(current: str, completion_type: str) -> Iterable[str]:
145
+ """If ``completion_type`` is ``file`` or ``path``, list all regular files
146
+ and directories starting with ``current``; otherwise only list directories
147
+ starting with ``current``.
148
+
149
+ :param current: The word to be completed
150
+ :param completion_type: path completion type(``file``, ``path`` or ``dir``)
151
+ :return: A generator of regular files and/or directories
152
+ """
153
+ directory, filename = os.path.split(current)
154
+ current_path = os.path.abspath(directory)
155
+ # Don't complete paths if they can't be accessed
156
+ if not os.access(current_path, os.R_OK):
157
+ return
158
+ filename = os.path.normcase(filename)
159
+ # list all files that start with ``filename``
160
+ file_list = (
161
+ x for x in os.listdir(current_path) if os.path.normcase(x).startswith(filename)
162
+ )
163
+ for f in file_list:
164
+ opt = os.path.join(current_path, f)
165
+ comp_file = os.path.normcase(os.path.join(directory, f))
166
+ # complete regular files when there is not ``<dir>`` after option
167
+ # complete directories when there is ``<file>``, ``<path>`` or
168
+ # ``<dir>``after option
169
+ if completion_type != "dir" and os.path.isfile(opt):
170
+ yield comp_file
171
+ elif os.path.isdir(opt):
172
+ yield os.path.join(comp_file, "")
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/base_command.py ADDED
@@ -0,0 +1,236 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Base Command class, and related routines"""
2
+
3
+ import functools
4
+ import logging
5
+ import logging.config
6
+ import optparse
7
+ import os
8
+ import sys
9
+ import traceback
10
+ from optparse import Values
11
+ from typing import Any, Callable, List, Optional, Tuple
12
+
13
+ from pip._vendor.rich import traceback as rich_traceback
14
+
15
+ from pip._internal.cli import cmdoptions
16
+ from pip._internal.cli.command_context import CommandContextMixIn
17
+ from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
18
+ from pip._internal.cli.status_codes import (
19
+ ERROR,
20
+ PREVIOUS_BUILD_DIR_ERROR,
21
+ UNKNOWN_ERROR,
22
+ VIRTUALENV_NOT_FOUND,
23
+ )
24
+ from pip._internal.exceptions import (
25
+ BadCommand,
26
+ CommandError,
27
+ DiagnosticPipError,
28
+ InstallationError,
29
+ NetworkConnectionError,
30
+ PreviousBuildDirError,
31
+ UninstallationError,
32
+ )
33
+ from pip._internal.utils.filesystem import check_path_owner
34
+ from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging
35
+ from pip._internal.utils.misc import get_prog, normalize_path
36
+ from pip._internal.utils.temp_dir import TempDirectoryTypeRegistry as TempDirRegistry
37
+ from pip._internal.utils.temp_dir import global_tempdir_manager, tempdir_registry
38
+ from pip._internal.utils.virtualenv import running_under_virtualenv
39
+
40
+ __all__ = ["Command"]
41
+
42
+ logger = logging.getLogger(__name__)
43
+
44
+
45
+ class Command(CommandContextMixIn):
46
+ usage: str = ""
47
+ ignore_require_venv: bool = False
48
+
49
+ def __init__(self, name: str, summary: str, isolated: bool = False) -> None:
50
+ super().__init__()
51
+
52
+ self.name = name
53
+ self.summary = summary
54
+ self.parser = ConfigOptionParser(
55
+ usage=self.usage,
56
+ prog=f"{get_prog()} {name}",
57
+ formatter=UpdatingDefaultsHelpFormatter(),
58
+ add_help_option=False,
59
+ name=name,
60
+ description=self.__doc__,
61
+ isolated=isolated,
62
+ )
63
+
64
+ self.tempdir_registry: Optional[TempDirRegistry] = None
65
+
66
+ # Commands should add options to this option group
67
+ optgroup_name = f"{self.name.capitalize()} Options"
68
+ self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name)
69
+
70
+ # Add the general options
71
+ gen_opts = cmdoptions.make_option_group(
72
+ cmdoptions.general_group,
73
+ self.parser,
74
+ )
75
+ self.parser.add_option_group(gen_opts)
76
+
77
+ self.add_options()
78
+
79
+ def add_options(self) -> None:
80
+ pass
81
+
82
+ def handle_pip_version_check(self, options: Values) -> None:
83
+ """
84
+ This is a no-op so that commands by default do not do the pip version
85
+ check.
86
+ """
87
+ # Make sure we do the pip version check if the index_group options
88
+ # are present.
89
+ assert not hasattr(options, "no_index")
90
+
91
+ def run(self, options: Values, args: List[str]) -> int:
92
+ raise NotImplementedError
93
+
94
+ def parse_args(self, args: List[str]) -> Tuple[Values, List[str]]:
95
+ # factored out for testability
96
+ return self.parser.parse_args(args)
97
+
98
+ def main(self, args: List[str]) -> int:
99
+ try:
100
+ with self.main_context():
101
+ return self._main(args)
102
+ finally:
103
+ logging.shutdown()
104
+
105
+ def _main(self, args: List[str]) -> int:
106
+ # We must initialize this before the tempdir manager, otherwise the
107
+ # configuration would not be accessible by the time we clean up the
108
+ # tempdir manager.
109
+ self.tempdir_registry = self.enter_context(tempdir_registry())
110
+ # Intentionally set as early as possible so globally-managed temporary
111
+ # directories are available to the rest of the code.
112
+ self.enter_context(global_tempdir_manager())
113
+
114
+ options, args = self.parse_args(args)
115
+
116
+ # Set verbosity so that it can be used elsewhere.
117
+ self.verbosity = options.verbose - options.quiet
118
+
119
+ level_number = setup_logging(
120
+ verbosity=self.verbosity,
121
+ no_color=options.no_color,
122
+ user_log_file=options.log,
123
+ )
124
+
125
+ always_enabled_features = set(options.features_enabled) & set(
126
+ cmdoptions.ALWAYS_ENABLED_FEATURES
127
+ )
128
+ if always_enabled_features:
129
+ logger.warning(
130
+ "The following features are always enabled: %s. ",
131
+ ", ".join(sorted(always_enabled_features)),
132
+ )
133
+
134
+ # Make sure that the --python argument isn't specified after the
135
+ # subcommand. We can tell, because if --python was specified,
136
+ # we should only reach this point if we're running in the created
137
+ # subprocess, which has the _PIP_RUNNING_IN_SUBPROCESS environment
138
+ # variable set.
139
+ if options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ:
140
+ logger.critical(
141
+ "The --python option must be placed before the pip subcommand name"
142
+ )
143
+ sys.exit(ERROR)
144
+
145
+ # TODO: Try to get these passing down from the command?
146
+ # without resorting to os.environ to hold these.
147
+ # This also affects isolated builds and it should.
148
+
149
+ if options.no_input:
150
+ os.environ["PIP_NO_INPUT"] = "1"
151
+
152
+ if options.exists_action:
153
+ os.environ["PIP_EXISTS_ACTION"] = " ".join(options.exists_action)
154
+
155
+ if options.require_venv and not self.ignore_require_venv:
156
+ # If a venv is required check if it can really be found
157
+ if not running_under_virtualenv():
158
+ logger.critical("Could not find an activated virtualenv (required).")
159
+ sys.exit(VIRTUALENV_NOT_FOUND)
160
+
161
+ if options.cache_dir:
162
+ options.cache_dir = normalize_path(options.cache_dir)
163
+ if not check_path_owner(options.cache_dir):
164
+ logger.warning(
165
+ "The directory '%s' or its parent directory is not owned "
166
+ "or is not writable by the current user. The cache "
167
+ "has been disabled. Check the permissions and owner of "
168
+ "that directory. If executing pip with sudo, you should "
169
+ "use sudo's -H flag.",
170
+ options.cache_dir,
171
+ )
172
+ options.cache_dir = None
173
+
174
+ def intercepts_unhandled_exc(
175
+ run_func: Callable[..., int]
176
+ ) -> Callable[..., int]:
177
+ @functools.wraps(run_func)
178
+ def exc_logging_wrapper(*args: Any) -> int:
179
+ try:
180
+ status = run_func(*args)
181
+ assert isinstance(status, int)
182
+ return status
183
+ except DiagnosticPipError as exc:
184
+ logger.error("%s", exc, extra={"rich": True})
185
+ logger.debug("Exception information:", exc_info=True)
186
+
187
+ return ERROR
188
+ except PreviousBuildDirError as exc:
189
+ logger.critical(str(exc))
190
+ logger.debug("Exception information:", exc_info=True)
191
+
192
+ return PREVIOUS_BUILD_DIR_ERROR
193
+ except (
194
+ InstallationError,
195
+ UninstallationError,
196
+ BadCommand,
197
+ NetworkConnectionError,
198
+ ) as exc:
199
+ logger.critical(str(exc))
200
+ logger.debug("Exception information:", exc_info=True)
201
+
202
+ return ERROR
203
+ except CommandError as exc:
204
+ logger.critical("%s", exc)
205
+ logger.debug("Exception information:", exc_info=True)
206
+
207
+ return ERROR
208
+ except BrokenStdoutLoggingError:
209
+ # Bypass our logger and write any remaining messages to
210
+ # stderr because stdout no longer works.
211
+ print("ERROR: Pipe to stdout was broken", file=sys.stderr)
212
+ if level_number <= logging.DEBUG:
213
+ traceback.print_exc(file=sys.stderr)
214
+
215
+ return ERROR
216
+ except KeyboardInterrupt:
217
+ logger.critical("Operation cancelled by user")
218
+ logger.debug("Exception information:", exc_info=True)
219
+
220
+ return ERROR
221
+ except BaseException:
222
+ logger.critical("Exception:", exc_info=True)
223
+
224
+ return UNKNOWN_ERROR
225
+
226
+ return exc_logging_wrapper
227
+
228
+ try:
229
+ if not options.debug_mode:
230
+ run = intercepts_unhandled_exc(self.run)
231
+ else:
232
+ run = self.run
233
+ rich_traceback.install(show_locals=True)
234
+ return run(options, args)
235
+ finally:
236
+ self.handle_pip_version_check(options)
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/cmdoptions.py ADDED
@@ -0,0 +1,1077 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ shared options and groups
3
+
4
+ The principle here is to define options once, but *not* instantiate them
5
+ globally. One reason being that options with action='append' can carry state
6
+ between parses. pip parses general options twice internally, and shouldn't
7
+ pass on state. To be consistent, all options will follow this design.
8
+ """
9
+
10
+ # The following comment should be removed at some point in the future.
11
+ # mypy: strict-optional=False
12
+
13
+ import importlib.util
14
+ import logging
15
+ import os
16
+ import textwrap
17
+ from functools import partial
18
+ from optparse import SUPPRESS_HELP, Option, OptionGroup, OptionParser, Values
19
+ from textwrap import dedent
20
+ from typing import Any, Callable, Dict, Optional, Tuple
21
+
22
+ from pip._vendor.packaging.utils import canonicalize_name
23
+
24
+ from pip._internal.cli.parser import ConfigOptionParser
25
+ from pip._internal.exceptions import CommandError
26
+ from pip._internal.locations import USER_CACHE_DIR, get_src_prefix
27
+ from pip._internal.models.format_control import FormatControl
28
+ from pip._internal.models.index import PyPI
29
+ from pip._internal.models.target_python import TargetPython
30
+ from pip._internal.utils.hashes import STRONG_HASHES
31
+ from pip._internal.utils.misc import strtobool
32
+
33
+ logger = logging.getLogger(__name__)
34
+
35
+
36
+ def raise_option_error(parser: OptionParser, option: Option, msg: str) -> None:
37
+ """
38
+ Raise an option parsing error using parser.error().
39
+
40
+ Args:
41
+ parser: an OptionParser instance.
42
+ option: an Option instance.
43
+ msg: the error text.
44
+ """
45
+ msg = f"{option} error: {msg}"
46
+ msg = textwrap.fill(" ".join(msg.split()))
47
+ parser.error(msg)
48
+
49
+
50
+ def make_option_group(group: Dict[str, Any], parser: ConfigOptionParser) -> OptionGroup:
51
+ """
52
+ Return an OptionGroup object
53
+ group -- assumed to be dict with 'name' and 'options' keys
54
+ parser -- an optparse Parser
55
+ """
56
+ option_group = OptionGroup(parser, group["name"])
57
+ for option in group["options"]:
58
+ option_group.add_option(option())
59
+ return option_group
60
+
61
+
62
+ def check_dist_restriction(options: Values, check_target: bool = False) -> None:
63
+ """Function for determining if custom platform options are allowed.
64
+
65
+ :param options: The OptionParser options.
66
+ :param check_target: Whether or not to check if --target is being used.
67
+ """
68
+ dist_restriction_set = any(
69
+ [
70
+ options.python_version,
71
+ options.platforms,
72
+ options.abis,
73
+ options.implementation,
74
+ ]
75
+ )
76
+
77
+ binary_only = FormatControl(set(), {":all:"})
78
+ sdist_dependencies_allowed = (
79
+ options.format_control != binary_only and not options.ignore_dependencies
80
+ )
81
+
82
+ # Installations or downloads using dist restrictions must not combine
83
+ # source distributions and dist-specific wheels, as they are not
84
+ # guaranteed to be locally compatible.
85
+ if dist_restriction_set and sdist_dependencies_allowed:
86
+ raise CommandError(
87
+ "When restricting platform and interpreter constraints using "
88
+ "--python-version, --platform, --abi, or --implementation, "
89
+ "either --no-deps must be set, or --only-binary=:all: must be "
90
+ "set and --no-binary must not be set (or must be set to "
91
+ ":none:)."
92
+ )
93
+
94
+ if check_target:
95
+ if not options.dry_run and dist_restriction_set and not options.target_dir:
96
+ raise CommandError(
97
+ "Can not use any platform or abi specific options unless "
98
+ "installing via '--target' or using '--dry-run'"
99
+ )
100
+
101
+
102
+ def _path_option_check(option: Option, opt: str, value: str) -> str:
103
+ return os.path.expanduser(value)
104
+
105
+
106
+ def _package_name_option_check(option: Option, opt: str, value: str) -> str:
107
+ return canonicalize_name(value)
108
+
109
+
110
+ class PipOption(Option):
111
+ TYPES = Option.TYPES + ("path", "package_name")
112
+ TYPE_CHECKER = Option.TYPE_CHECKER.copy()
113
+ TYPE_CHECKER["package_name"] = _package_name_option_check
114
+ TYPE_CHECKER["path"] = _path_option_check
115
+
116
+
117
+ ###########
118
+ # options #
119
+ ###########
120
+
121
+ help_: Callable[..., Option] = partial(
122
+ Option,
123
+ "-h",
124
+ "--help",
125
+ dest="help",
126
+ action="help",
127
+ help="Show help.",
128
+ )
129
+
130
+ debug_mode: Callable[..., Option] = partial(
131
+ Option,
132
+ "--debug",
133
+ dest="debug_mode",
134
+ action="store_true",
135
+ default=False,
136
+ help=(
137
+ "Let unhandled exceptions propagate outside the main subroutine, "
138
+ "instead of logging them to stderr."
139
+ ),
140
+ )
141
+
142
+ isolated_mode: Callable[..., Option] = partial(
143
+ Option,
144
+ "--isolated",
145
+ dest="isolated_mode",
146
+ action="store_true",
147
+ default=False,
148
+ help=(
149
+ "Run pip in an isolated mode, ignoring environment variables and user "
150
+ "configuration."
151
+ ),
152
+ )
153
+
154
+ require_virtualenv: Callable[..., Option] = partial(
155
+ Option,
156
+ "--require-virtualenv",
157
+ "--require-venv",
158
+ dest="require_venv",
159
+ action="store_true",
160
+ default=False,
161
+ help=(
162
+ "Allow pip to only run in a virtual environment; "
163
+ "exit with an error otherwise."
164
+ ),
165
+ )
166
+
167
+ override_externally_managed: Callable[..., Option] = partial(
168
+ Option,
169
+ "--break-system-packages",
170
+ dest="override_externally_managed",
171
+ action="store_true",
172
+ help="Allow pip to modify an EXTERNALLY-MANAGED Python installation",
173
+ )
174
+
175
+ python: Callable[..., Option] = partial(
176
+ Option,
177
+ "--python",
178
+ dest="python",
179
+ help="Run pip with the specified Python interpreter.",
180
+ )
181
+
182
+ verbose: Callable[..., Option] = partial(
183
+ Option,
184
+ "-v",
185
+ "--verbose",
186
+ dest="verbose",
187
+ action="count",
188
+ default=0,
189
+ help="Give more output. Option is additive, and can be used up to 3 times.",
190
+ )
191
+
192
+ no_color: Callable[..., Option] = partial(
193
+ Option,
194
+ "--no-color",
195
+ dest="no_color",
196
+ action="store_true",
197
+ default=False,
198
+ help="Suppress colored output.",
199
+ )
200
+
201
+ version: Callable[..., Option] = partial(
202
+ Option,
203
+ "-V",
204
+ "--version",
205
+ dest="version",
206
+ action="store_true",
207
+ help="Show version and exit.",
208
+ )
209
+
210
+ quiet: Callable[..., Option] = partial(
211
+ Option,
212
+ "-q",
213
+ "--quiet",
214
+ dest="quiet",
215
+ action="count",
216
+ default=0,
217
+ help=(
218
+ "Give less output. Option is additive, and can be used up to 3"
219
+ " times (corresponding to WARNING, ERROR, and CRITICAL logging"
220
+ " levels)."
221
+ ),
222
+ )
223
+
224
+ progress_bar: Callable[..., Option] = partial(
225
+ Option,
226
+ "--progress-bar",
227
+ dest="progress_bar",
228
+ type="choice",
229
+ choices=["on", "off"],
230
+ default="on",
231
+ help="Specify whether the progress bar should be used [on, off] (default: on)",
232
+ )
233
+
234
+ log: Callable[..., Option] = partial(
235
+ PipOption,
236
+ "--log",
237
+ "--log-file",
238
+ "--local-log",
239
+ dest="log",
240
+ metavar="path",
241
+ type="path",
242
+ help="Path to a verbose appending log.",
243
+ )
244
+
245
+ no_input: Callable[..., Option] = partial(
246
+ Option,
247
+ # Don't ask for input
248
+ "--no-input",
249
+ dest="no_input",
250
+ action="store_true",
251
+ default=False,
252
+ help="Disable prompting for input.",
253
+ )
254
+
255
+ keyring_provider: Callable[..., Option] = partial(
256
+ Option,
257
+ "--keyring-provider",
258
+ dest="keyring_provider",
259
+ choices=["auto", "disabled", "import", "subprocess"],
260
+ default="auto",
261
+ help=(
262
+ "Enable the credential lookup via the keyring library if user input is allowed."
263
+ " Specify which mechanism to use [disabled, import, subprocess]."
264
+ " (default: disabled)"
265
+ ),
266
+ )
267
+
268
+ proxy: Callable[..., Option] = partial(
269
+ Option,
270
+ "--proxy",
271
+ dest="proxy",
272
+ type="str",
273
+ default="",
274
+ help="Specify a proxy in the form scheme://[user:passwd@]proxy.server:port.",
275
+ )
276
+
277
+ retries: Callable[..., Option] = partial(
278
+ Option,
279
+ "--retries",
280
+ dest="retries",
281
+ type="int",
282
+ default=5,
283
+ help="Maximum number of retries each connection should attempt "
284
+ "(default %default times).",
285
+ )
286
+
287
+ timeout: Callable[..., Option] = partial(
288
+ Option,
289
+ "--timeout",
290
+ "--default-timeout",
291
+ metavar="sec",
292
+ dest="timeout",
293
+ type="float",
294
+ default=15,
295
+ help="Set the socket timeout (default %default seconds).",
296
+ )
297
+
298
+
299
+ def exists_action() -> Option:
300
+ return Option(
301
+ # Option when path already exist
302
+ "--exists-action",
303
+ dest="exists_action",
304
+ type="choice",
305
+ choices=["s", "i", "w", "b", "a"],
306
+ default=[],
307
+ action="append",
308
+ metavar="action",
309
+ help="Default action when a path already exists: "
310
+ "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.",
311
+ )
312
+
313
+
314
+ cert: Callable[..., Option] = partial(
315
+ PipOption,
316
+ "--cert",
317
+ dest="cert",
318
+ type="path",
319
+ metavar="path",
320
+ help=(
321
+ "Path to PEM-encoded CA certificate bundle. "
322
+ "If provided, overrides the default. "
323
+ "See 'SSL Certificate Verification' in pip documentation "
324
+ "for more information."
325
+ ),
326
+ )
327
+
328
+ client_cert: Callable[..., Option] = partial(
329
+ PipOption,
330
+ "--client-cert",
331
+ dest="client_cert",
332
+ type="path",
333
+ default=None,
334
+ metavar="path",
335
+ help="Path to SSL client certificate, a single file containing the "
336
+ "private key and the certificate in PEM format.",
337
+ )
338
+
339
+ index_url: Callable[..., Option] = partial(
340
+ Option,
341
+ "-i",
342
+ "--index-url",
343
+ "--pypi-url",
344
+ dest="index_url",
345
+ metavar="URL",
346
+ default=PyPI.simple_url,
347
+ help="Base URL of the Python Package Index (default %default). "
348
+ "This should point to a repository compliant with PEP 503 "
349
+ "(the simple repository API) or a local directory laid out "
350
+ "in the same format.",
351
+ )
352
+
353
+
354
+ def extra_index_url() -> Option:
355
+ return Option(
356
+ "--extra-index-url",
357
+ dest="extra_index_urls",
358
+ metavar="URL",
359
+ action="append",
360
+ default=[],
361
+ help="Extra URLs of package indexes to use in addition to "
362
+ "--index-url. Should follow the same rules as "
363
+ "--index-url.",
364
+ )
365
+
366
+
367
+ no_index: Callable[..., Option] = partial(
368
+ Option,
369
+ "--no-index",
370
+ dest="no_index",
371
+ action="store_true",
372
+ default=False,
373
+ help="Ignore package index (only looking at --find-links URLs instead).",
374
+ )
375
+
376
+
377
+ def find_links() -> Option:
378
+ return Option(
379
+ "-f",
380
+ "--find-links",
381
+ dest="find_links",
382
+ action="append",
383
+ default=[],
384
+ metavar="url",
385
+ help="If a URL or path to an html file, then parse for links to "
386
+ "archives such as sdist (.tar.gz) or wheel (.whl) files. "
387
+ "If a local path or file:// URL that's a directory, "
388
+ "then look for archives in the directory listing. "
389
+ "Links to VCS project URLs are not supported.",
390
+ )
391
+
392
+
393
+ def trusted_host() -> Option:
394
+ return Option(
395
+ "--trusted-host",
396
+ dest="trusted_hosts",
397
+ action="append",
398
+ metavar="HOSTNAME",
399
+ default=[],
400
+ help="Mark this host or host:port pair as trusted, even though it "
401
+ "does not have valid or any HTTPS.",
402
+ )
403
+
404
+
405
+ def constraints() -> Option:
406
+ return Option(
407
+ "-c",
408
+ "--constraint",
409
+ dest="constraints",
410
+ action="append",
411
+ default=[],
412
+ metavar="file",
413
+ help="Constrain versions using the given constraints file. "
414
+ "This option can be used multiple times.",
415
+ )
416
+
417
+
418
+ def requirements() -> Option:
419
+ return Option(
420
+ "-r",
421
+ "--requirement",
422
+ dest="requirements",
423
+ action="append",
424
+ default=[],
425
+ metavar="file",
426
+ help="Install from the given requirements file. "
427
+ "This option can be used multiple times.",
428
+ )
429
+
430
+
431
+ def editable() -> Option:
432
+ return Option(
433
+ "-e",
434
+ "--editable",
435
+ dest="editables",
436
+ action="append",
437
+ default=[],
438
+ metavar="path/url",
439
+ help=(
440
+ "Install a project in editable mode (i.e. setuptools "
441
+ '"develop mode") from a local project path or a VCS url.'
442
+ ),
443
+ )
444
+
445
+
446
+ def _handle_src(option: Option, opt_str: str, value: str, parser: OptionParser) -> None:
447
+ value = os.path.abspath(value)
448
+ setattr(parser.values, option.dest, value)
449
+
450
+
451
+ src: Callable[..., Option] = partial(
452
+ PipOption,
453
+ "--src",
454
+ "--source",
455
+ "--source-dir",
456
+ "--source-directory",
457
+ dest="src_dir",
458
+ type="path",
459
+ metavar="dir",
460
+ default=get_src_prefix(),
461
+ action="callback",
462
+ callback=_handle_src,
463
+ help="Directory to check out editable projects into. "
464
+ 'The default in a virtualenv is "<venv path>/src". '
465
+ 'The default for global installs is "<current dir>/src".',
466
+ )
467
+
468
+
469
+ def _get_format_control(values: Values, option: Option) -> Any:
470
+ """Get a format_control object."""
471
+ return getattr(values, option.dest)
472
+
473
+
474
+ def _handle_no_binary(
475
+ option: Option, opt_str: str, value: str, parser: OptionParser
476
+ ) -> None:
477
+ existing = _get_format_control(parser.values, option)
478
+ FormatControl.handle_mutual_excludes(
479
+ value,
480
+ existing.no_binary,
481
+ existing.only_binary,
482
+ )
483
+
484
+
485
+ def _handle_only_binary(
486
+ option: Option, opt_str: str, value: str, parser: OptionParser
487
+ ) -> None:
488
+ existing = _get_format_control(parser.values, option)
489
+ FormatControl.handle_mutual_excludes(
490
+ value,
491
+ existing.only_binary,
492
+ existing.no_binary,
493
+ )
494
+
495
+
496
+ def no_binary() -> Option:
497
+ format_control = FormatControl(set(), set())
498
+ return Option(
499
+ "--no-binary",
500
+ dest="format_control",
501
+ action="callback",
502
+ callback=_handle_no_binary,
503
+ type="str",
504
+ default=format_control,
505
+ help="Do not use binary packages. Can be supplied multiple times, and "
506
+ 'each time adds to the existing value. Accepts either ":all:" to '
507
+ 'disable all binary packages, ":none:" to empty the set (notice '
508
+ "the colons), or one or more package names with commas between "
509
+ "them (no colons). Note that some packages are tricky to compile "
510
+ "and may fail to install when this option is used on them.",
511
+ )
512
+
513
+
514
+ def only_binary() -> Option:
515
+ format_control = FormatControl(set(), set())
516
+ return Option(
517
+ "--only-binary",
518
+ dest="format_control",
519
+ action="callback",
520
+ callback=_handle_only_binary,
521
+ type="str",
522
+ default=format_control,
523
+ help="Do not use source packages. Can be supplied multiple times, and "
524
+ 'each time adds to the existing value. Accepts either ":all:" to '
525
+ 'disable all source packages, ":none:" to empty the set, or one '
526
+ "or more package names with commas between them. Packages "
527
+ "without binary distributions will fail to install when this "
528
+ "option is used on them.",
529
+ )
530
+
531
+
532
+ platforms: Callable[..., Option] = partial(
533
+ Option,
534
+ "--platform",
535
+ dest="platforms",
536
+ metavar="platform",
537
+ action="append",
538
+ default=None,
539
+ help=(
540
+ "Only use wheels compatible with <platform>. Defaults to the "
541
+ "platform of the running system. Use this option multiple times to "
542
+ "specify multiple platforms supported by the target interpreter."
543
+ ),
544
+ )
545
+
546
+
547
+ # This was made a separate function for unit-testing purposes.
548
+ def _convert_python_version(value: str) -> Tuple[Tuple[int, ...], Optional[str]]:
549
+ """
550
+ Convert a version string like "3", "37", or "3.7.3" into a tuple of ints.
551
+
552
+ :return: A 2-tuple (version_info, error_msg), where `error_msg` is
553
+ non-None if and only if there was a parsing error.
554
+ """
555
+ if not value:
556
+ # The empty string is the same as not providing a value.
557
+ return (None, None)
558
+
559
+ parts = value.split(".")
560
+ if len(parts) > 3:
561
+ return ((), "at most three version parts are allowed")
562
+
563
+ if len(parts) == 1:
564
+ # Then we are in the case of "3" or "37".
565
+ value = parts[0]
566
+ if len(value) > 1:
567
+ parts = [value[0], value[1:]]
568
+
569
+ try:
570
+ version_info = tuple(int(part) for part in parts)
571
+ except ValueError:
572
+ return ((), "each version part must be an integer")
573
+
574
+ return (version_info, None)
575
+
576
+
577
+ def _handle_python_version(
578
+ option: Option, opt_str: str, value: str, parser: OptionParser
579
+ ) -> None:
580
+ """
581
+ Handle a provided --python-version value.
582
+ """
583
+ version_info, error_msg = _convert_python_version(value)
584
+ if error_msg is not None:
585
+ msg = "invalid --python-version value: {!r}: {}".format(
586
+ value,
587
+ error_msg,
588
+ )
589
+ raise_option_error(parser, option=option, msg=msg)
590
+
591
+ parser.values.python_version = version_info
592
+
593
+
594
+ python_version: Callable[..., Option] = partial(
595
+ Option,
596
+ "--python-version",
597
+ dest="python_version",
598
+ metavar="python_version",
599
+ action="callback",
600
+ callback=_handle_python_version,
601
+ type="str",
602
+ default=None,
603
+ help=dedent(
604
+ """\
605
+ The Python interpreter version to use for wheel and "Requires-Python"
606
+ compatibility checks. Defaults to a version derived from the running
607
+ interpreter. The version can be specified using up to three dot-separated
608
+ integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor
609
+ version can also be given as a string without dots (e.g. "37" for 3.7.0).
610
+ """
611
+ ),
612
+ )
613
+
614
+
615
+ implementation: Callable[..., Option] = partial(
616
+ Option,
617
+ "--implementation",
618
+ dest="implementation",
619
+ metavar="implementation",
620
+ default=None,
621
+ help=(
622
+ "Only use wheels compatible with Python "
623
+ "implementation <implementation>, e.g. 'pp', 'jy', 'cp', "
624
+ " or 'ip'. If not specified, then the current "
625
+ "interpreter implementation is used. Use 'py' to force "
626
+ "implementation-agnostic wheels."
627
+ ),
628
+ )
629
+
630
+
631
+ abis: Callable[..., Option] = partial(
632
+ Option,
633
+ "--abi",
634
+ dest="abis",
635
+ metavar="abi",
636
+ action="append",
637
+ default=None,
638
+ help=(
639
+ "Only use wheels compatible with Python abi <abi>, e.g. 'pypy_41'. "
640
+ "If not specified, then the current interpreter abi tag is used. "
641
+ "Use this option multiple times to specify multiple abis supported "
642
+ "by the target interpreter. Generally you will need to specify "
643
+ "--implementation, --platform, and --python-version when using this "
644
+ "option."
645
+ ),
646
+ )
647
+
648
+
649
+ def add_target_python_options(cmd_opts: OptionGroup) -> None:
650
+ cmd_opts.add_option(platforms())
651
+ cmd_opts.add_option(python_version())
652
+ cmd_opts.add_option(implementation())
653
+ cmd_opts.add_option(abis())
654
+
655
+
656
+ def make_target_python(options: Values) -> TargetPython:
657
+ target_python = TargetPython(
658
+ platforms=options.platforms,
659
+ py_version_info=options.python_version,
660
+ abis=options.abis,
661
+ implementation=options.implementation,
662
+ )
663
+
664
+ return target_python
665
+
666
+
667
+ def prefer_binary() -> Option:
668
+ return Option(
669
+ "--prefer-binary",
670
+ dest="prefer_binary",
671
+ action="store_true",
672
+ default=False,
673
+ help=(
674
+ "Prefer binary packages over source packages, even if the "
675
+ "source packages are newer."
676
+ ),
677
+ )
678
+
679
+
680
+ cache_dir: Callable[..., Option] = partial(
681
+ PipOption,
682
+ "--cache-dir",
683
+ dest="cache_dir",
684
+ default=USER_CACHE_DIR,
685
+ metavar="dir",
686
+ type="path",
687
+ help="Store the cache data in <dir>.",
688
+ )
689
+
690
+
691
+ def _handle_no_cache_dir(
692
+ option: Option, opt: str, value: str, parser: OptionParser
693
+ ) -> None:
694
+ """
695
+ Process a value provided for the --no-cache-dir option.
696
+
697
+ This is an optparse.Option callback for the --no-cache-dir option.
698
+ """
699
+ # The value argument will be None if --no-cache-dir is passed via the
700
+ # command-line, since the option doesn't accept arguments. However,
701
+ # the value can be non-None if the option is triggered e.g. by an
702
+ # environment variable, like PIP_NO_CACHE_DIR=true.
703
+ if value is not None:
704
+ # Then parse the string value to get argument error-checking.
705
+ try:
706
+ strtobool(value)
707
+ except ValueError as exc:
708
+ raise_option_error(parser, option=option, msg=str(exc))
709
+
710
+ # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool()
711
+ # converted to 0 (like "false" or "no") caused cache_dir to be disabled
712
+ # rather than enabled (logic would say the latter). Thus, we disable
713
+ # the cache directory not just on values that parse to True, but (for
714
+ # backwards compatibility reasons) also on values that parse to False.
715
+ # In other words, always set it to False if the option is provided in
716
+ # some (valid) form.
717
+ parser.values.cache_dir = False
718
+
719
+
720
+ no_cache: Callable[..., Option] = partial(
721
+ Option,
722
+ "--no-cache-dir",
723
+ dest="cache_dir",
724
+ action="callback",
725
+ callback=_handle_no_cache_dir,
726
+ help="Disable the cache.",
727
+ )
728
+
729
+ no_deps: Callable[..., Option] = partial(
730
+ Option,
731
+ "--no-deps",
732
+ "--no-dependencies",
733
+ dest="ignore_dependencies",
734
+ action="store_true",
735
+ default=False,
736
+ help="Don't install package dependencies.",
737
+ )
738
+
739
+ ignore_requires_python: Callable[..., Option] = partial(
740
+ Option,
741
+ "--ignore-requires-python",
742
+ dest="ignore_requires_python",
743
+ action="store_true",
744
+ help="Ignore the Requires-Python information.",
745
+ )
746
+
747
+ no_build_isolation: Callable[..., Option] = partial(
748
+ Option,
749
+ "--no-build-isolation",
750
+ dest="build_isolation",
751
+ action="store_false",
752
+ default=True,
753
+ help="Disable isolation when building a modern source distribution. "
754
+ "Build dependencies specified by PEP 518 must be already installed "
755
+ "if this option is used.",
756
+ )
757
+
758
+ check_build_deps: Callable[..., Option] = partial(
759
+ Option,
760
+ "--check-build-dependencies",
761
+ dest="check_build_deps",
762
+ action="store_true",
763
+ default=False,
764
+ help="Check the build dependencies when PEP517 is used.",
765
+ )
766
+
767
+
768
+ def _handle_no_use_pep517(
769
+ option: Option, opt: str, value: str, parser: OptionParser
770
+ ) -> None:
771
+ """
772
+ Process a value provided for the --no-use-pep517 option.
773
+
774
+ This is an optparse.Option callback for the no_use_pep517 option.
775
+ """
776
+ # Since --no-use-pep517 doesn't accept arguments, the value argument
777
+ # will be None if --no-use-pep517 is passed via the command-line.
778
+ # However, the value can be non-None if the option is triggered e.g.
779
+ # by an environment variable, for example "PIP_NO_USE_PEP517=true".
780
+ if value is not None:
781
+ msg = """A value was passed for --no-use-pep517,
782
+ probably using either the PIP_NO_USE_PEP517 environment variable
783
+ or the "no-use-pep517" config file option. Use an appropriate value
784
+ of the PIP_USE_PEP517 environment variable or the "use-pep517"
785
+ config file option instead.
786
+ """
787
+ raise_option_error(parser, option=option, msg=msg)
788
+
789
+ # If user doesn't wish to use pep517, we check if setuptools and wheel are installed
790
+ # and raise error if it is not.
791
+ packages = ("setuptools", "wheel")
792
+ if not all(importlib.util.find_spec(package) for package in packages):
793
+ msg = (
794
+ f"It is not possible to use --no-use-pep517 "
795
+ f"without {' and '.join(packages)} installed."
796
+ )
797
+ raise_option_error(parser, option=option, msg=msg)
798
+
799
+ # Otherwise, --no-use-pep517 was passed via the command-line.
800
+ parser.values.use_pep517 = False
801
+
802
+
803
+ use_pep517: Any = partial(
804
+ Option,
805
+ "--use-pep517",
806
+ dest="use_pep517",
807
+ action="store_true",
808
+ default=None,
809
+ help="Use PEP 517 for building source distributions "
810
+ "(use --no-use-pep517 to force legacy behaviour).",
811
+ )
812
+
813
+ no_use_pep517: Any = partial(
814
+ Option,
815
+ "--no-use-pep517",
816
+ dest="use_pep517",
817
+ action="callback",
818
+ callback=_handle_no_use_pep517,
819
+ default=None,
820
+ help=SUPPRESS_HELP,
821
+ )
822
+
823
+
824
+ def _handle_config_settings(
825
+ option: Option, opt_str: str, value: str, parser: OptionParser
826
+ ) -> None:
827
+ key, sep, val = value.partition("=")
828
+ if sep != "=":
829
+ parser.error(f"Arguments to {opt_str} must be of the form KEY=VAL")
830
+ dest = getattr(parser.values, option.dest)
831
+ if dest is None:
832
+ dest = {}
833
+ setattr(parser.values, option.dest, dest)
834
+ if key in dest:
835
+ if isinstance(dest[key], list):
836
+ dest[key].append(val)
837
+ else:
838
+ dest[key] = [dest[key], val]
839
+ else:
840
+ dest[key] = val
841
+
842
+
843
+ config_settings: Callable[..., Option] = partial(
844
+ Option,
845
+ "-C",
846
+ "--config-settings",
847
+ dest="config_settings",
848
+ type=str,
849
+ action="callback",
850
+ callback=_handle_config_settings,
851
+ metavar="settings",
852
+ help="Configuration settings to be passed to the PEP 517 build backend. "
853
+ "Settings take the form KEY=VALUE. Use multiple --config-settings options "
854
+ "to pass multiple keys to the backend.",
855
+ )
856
+
857
+ build_options: Callable[..., Option] = partial(
858
+ Option,
859
+ "--build-option",
860
+ dest="build_options",
861
+ metavar="options",
862
+ action="append",
863
+ help="Extra arguments to be supplied to 'setup.py bdist_wheel'.",
864
+ )
865
+
866
+ global_options: Callable[..., Option] = partial(
867
+ Option,
868
+ "--global-option",
869
+ dest="global_options",
870
+ action="append",
871
+ metavar="options",
872
+ help="Extra global options to be supplied to the setup.py "
873
+ "call before the install or bdist_wheel command.",
874
+ )
875
+
876
+ no_clean: Callable[..., Option] = partial(
877
+ Option,
878
+ "--no-clean",
879
+ action="store_true",
880
+ default=False,
881
+ help="Don't clean up build directories.",
882
+ )
883
+
884
+ pre: Callable[..., Option] = partial(
885
+ Option,
886
+ "--pre",
887
+ action="store_true",
888
+ default=False,
889
+ help="Include pre-release and development versions. By default, "
890
+ "pip only finds stable versions.",
891
+ )
892
+
893
+ disable_pip_version_check: Callable[..., Option] = partial(
894
+ Option,
895
+ "--disable-pip-version-check",
896
+ dest="disable_pip_version_check",
897
+ action="store_true",
898
+ default=False,
899
+ help="Don't periodically check PyPI to determine whether a new version "
900
+ "of pip is available for download. Implied with --no-index.",
901
+ )
902
+
903
+ root_user_action: Callable[..., Option] = partial(
904
+ Option,
905
+ "--root-user-action",
906
+ dest="root_user_action",
907
+ default="warn",
908
+ choices=["warn", "ignore"],
909
+ help="Action if pip is run as a root user. By default, a warning message is shown.",
910
+ )
911
+
912
+
913
+ def _handle_merge_hash(
914
+ option: Option, opt_str: str, value: str, parser: OptionParser
915
+ ) -> None:
916
+ """Given a value spelled "algo:digest", append the digest to a list
917
+ pointed to in a dict by the algo name."""
918
+ if not parser.values.hashes:
919
+ parser.values.hashes = {}
920
+ try:
921
+ algo, digest = value.split(":", 1)
922
+ except ValueError:
923
+ parser.error(
924
+ "Arguments to {} must be a hash name "
925
+ "followed by a value, like --hash=sha256:"
926
+ "abcde...".format(opt_str)
927
+ )
928
+ if algo not in STRONG_HASHES:
929
+ parser.error(
930
+ "Allowed hash algorithms for {} are {}.".format(
931
+ opt_str, ", ".join(STRONG_HASHES)
932
+ )
933
+ )
934
+ parser.values.hashes.setdefault(algo, []).append(digest)
935
+
936
+
937
+ hash: Callable[..., Option] = partial(
938
+ Option,
939
+ "--hash",
940
+ # Hash values eventually end up in InstallRequirement.hashes due to
941
+ # __dict__ copying in process_line().
942
+ dest="hashes",
943
+ action="callback",
944
+ callback=_handle_merge_hash,
945
+ type="string",
946
+ help="Verify that the package's archive matches this "
947
+ "hash before installing. Example: --hash=sha256:abcdef...",
948
+ )
949
+
950
+
951
+ require_hashes: Callable[..., Option] = partial(
952
+ Option,
953
+ "--require-hashes",
954
+ dest="require_hashes",
955
+ action="store_true",
956
+ default=False,
957
+ help="Require a hash to check each requirement against, for "
958
+ "repeatable installs. This option is implied when any package in a "
959
+ "requirements file has a --hash option.",
960
+ )
961
+
962
+
963
+ list_path: Callable[..., Option] = partial(
964
+ PipOption,
965
+ "--path",
966
+ dest="path",
967
+ type="path",
968
+ action="append",
969
+ help="Restrict to the specified installation path for listing "
970
+ "packages (can be used multiple times).",
971
+ )
972
+
973
+
974
+ def check_list_path_option(options: Values) -> None:
975
+ if options.path and (options.user or options.local):
976
+ raise CommandError("Cannot combine '--path' with '--user' or '--local'")
977
+
978
+
979
+ list_exclude: Callable[..., Option] = partial(
980
+ PipOption,
981
+ "--exclude",
982
+ dest="excludes",
983
+ action="append",
984
+ metavar="package",
985
+ type="package_name",
986
+ help="Exclude specified package from the output",
987
+ )
988
+
989
+
990
+ no_python_version_warning: Callable[..., Option] = partial(
991
+ Option,
992
+ "--no-python-version-warning",
993
+ dest="no_python_version_warning",
994
+ action="store_true",
995
+ default=False,
996
+ help="Silence deprecation warnings for upcoming unsupported Pythons.",
997
+ )
998
+
999
+
1000
+ # Features that are now always on. A warning is printed if they are used.
1001
+ ALWAYS_ENABLED_FEATURES = [
1002
+ "no-binary-enable-wheel-cache", # always on since 23.1
1003
+ ]
1004
+
1005
+ use_new_feature: Callable[..., Option] = partial(
1006
+ Option,
1007
+ "--use-feature",
1008
+ dest="features_enabled",
1009
+ metavar="feature",
1010
+ action="append",
1011
+ default=[],
1012
+ choices=[
1013
+ "fast-deps",
1014
+ "truststore",
1015
+ ]
1016
+ + ALWAYS_ENABLED_FEATURES,
1017
+ help="Enable new functionality, that may be backward incompatible.",
1018
+ )
1019
+
1020
+ use_deprecated_feature: Callable[..., Option] = partial(
1021
+ Option,
1022
+ "--use-deprecated",
1023
+ dest="deprecated_features_enabled",
1024
+ metavar="feature",
1025
+ action="append",
1026
+ default=[],
1027
+ choices=[
1028
+ "legacy-resolver",
1029
+ ],
1030
+ help=("Enable deprecated functionality, that will be removed in the future."),
1031
+ )
1032
+
1033
+
1034
+ ##########
1035
+ # groups #
1036
+ ##########
1037
+
1038
+ general_group: Dict[str, Any] = {
1039
+ "name": "General Options",
1040
+ "options": [
1041
+ help_,
1042
+ debug_mode,
1043
+ isolated_mode,
1044
+ require_virtualenv,
1045
+ python,
1046
+ verbose,
1047
+ version,
1048
+ quiet,
1049
+ log,
1050
+ no_input,
1051
+ keyring_provider,
1052
+ proxy,
1053
+ retries,
1054
+ timeout,
1055
+ exists_action,
1056
+ trusted_host,
1057
+ cert,
1058
+ client_cert,
1059
+ cache_dir,
1060
+ no_cache,
1061
+ disable_pip_version_check,
1062
+ no_color,
1063
+ no_python_version_warning,
1064
+ use_new_feature,
1065
+ use_deprecated_feature,
1066
+ ],
1067
+ }
1068
+
1069
+ index_group: Dict[str, Any] = {
1070
+ "name": "Package Index Options",
1071
+ "options": [
1072
+ index_url,
1073
+ extra_index_url,
1074
+ no_index,
1075
+ find_links,
1076
+ ],
1077
+ }
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/command_context.py ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from contextlib import ExitStack, contextmanager
2
+ from typing import ContextManager, Generator, TypeVar
3
+
4
+ _T = TypeVar("_T", covariant=True)
5
+
6
+
7
+ class CommandContextMixIn:
8
+ def __init__(self) -> None:
9
+ super().__init__()
10
+ self._in_main_context = False
11
+ self._main_context = ExitStack()
12
+
13
+ @contextmanager
14
+ def main_context(self) -> Generator[None, None, None]:
15
+ assert not self._in_main_context
16
+
17
+ self._in_main_context = True
18
+ try:
19
+ with self._main_context:
20
+ yield
21
+ finally:
22
+ self._in_main_context = False
23
+
24
+ def enter_context(self, context_provider: ContextManager[_T]) -> _T:
25
+ assert self._in_main_context
26
+
27
+ return self._main_context.enter_context(context_provider)
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/main.py ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Primary application entrypoint.
2
+ """
3
+ import locale
4
+ import logging
5
+ import os
6
+ import sys
7
+ import warnings
8
+ from typing import List, Optional
9
+
10
+ from pip._internal.cli.autocompletion import autocomplete
11
+ from pip._internal.cli.main_parser import parse_command
12
+ from pip._internal.commands import create_command
13
+ from pip._internal.exceptions import PipError
14
+ from pip._internal.utils import deprecation
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+
19
+ # Do not import and use main() directly! Using it directly is actively
20
+ # discouraged by pip's maintainers. The name, location and behavior of
21
+ # this function is subject to change, so calling it directly is not
22
+ # portable across different pip versions.
23
+
24
+ # In addition, running pip in-process is unsupported and unsafe. This is
25
+ # elaborated in detail at
26
+ # https://pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program.
27
+ # That document also provides suggestions that should work for nearly
28
+ # all users that are considering importing and using main() directly.
29
+
30
+ # However, we know that certain users will still want to invoke pip
31
+ # in-process. If you understand and accept the implications of using pip
32
+ # in an unsupported manner, the best approach is to use runpy to avoid
33
+ # depending on the exact location of this entry point.
34
+
35
+ # The following example shows how to use runpy to invoke pip in that
36
+ # case:
37
+ #
38
+ # sys.argv = ["pip", your, args, here]
39
+ # runpy.run_module("pip", run_name="__main__")
40
+ #
41
+ # Note that this will exit the process after running, unlike a direct
42
+ # call to main. As it is not safe to do any processing after calling
43
+ # main, this should not be an issue in practice.
44
+
45
+
46
+ def main(args: Optional[List[str]] = None) -> int:
47
+ if args is None:
48
+ args = sys.argv[1:]
49
+
50
+ # Suppress the pkg_resources deprecation warning
51
+ # Note - we use a module of .*pkg_resources to cover
52
+ # the normal case (pip._vendor.pkg_resources) and the
53
+ # devendored case (a bare pkg_resources)
54
+ warnings.filterwarnings(
55
+ action="ignore", category=DeprecationWarning, module=".*pkg_resources"
56
+ )
57
+
58
+ # Configure our deprecation warnings to be sent through loggers
59
+ deprecation.install_warning_logger()
60
+
61
+ autocomplete()
62
+
63
+ try:
64
+ cmd_name, cmd_args = parse_command(args)
65
+ except PipError as exc:
66
+ sys.stderr.write(f"ERROR: {exc}")
67
+ sys.stderr.write(os.linesep)
68
+ sys.exit(1)
69
+
70
+ # Needed for locale.getpreferredencoding(False) to work
71
+ # in pip._internal.utils.encoding.auto_decode
72
+ try:
73
+ locale.setlocale(locale.LC_ALL, "")
74
+ except locale.Error as e:
75
+ # setlocale can apparently crash if locale are uninitialized
76
+ logger.debug("Ignoring error %s when setting locale", e)
77
+ command = create_command(cmd_name, isolated=("--isolated" in cmd_args))
78
+
79
+ return command.main(cmd_args)
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/main_parser.py ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """A single place for constructing and exposing the main parser
2
+ """
3
+
4
+ import os
5
+ import subprocess
6
+ import sys
7
+ from typing import List, Optional, Tuple
8
+
9
+ from pip._internal.build_env import get_runnable_pip
10
+ from pip._internal.cli import cmdoptions
11
+ from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
12
+ from pip._internal.commands import commands_dict, get_similar_commands
13
+ from pip._internal.exceptions import CommandError
14
+ from pip._internal.utils.misc import get_pip_version, get_prog
15
+
16
+ __all__ = ["create_main_parser", "parse_command"]
17
+
18
+
19
+ def create_main_parser() -> ConfigOptionParser:
20
+ """Creates and returns the main parser for pip's CLI"""
21
+
22
+ parser = ConfigOptionParser(
23
+ usage="\n%prog <command> [options]",
24
+ add_help_option=False,
25
+ formatter=UpdatingDefaultsHelpFormatter(),
26
+ name="global",
27
+ prog=get_prog(),
28
+ )
29
+ parser.disable_interspersed_args()
30
+
31
+ parser.version = get_pip_version()
32
+
33
+ # add the general options
34
+ gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser)
35
+ parser.add_option_group(gen_opts)
36
+
37
+ # so the help formatter knows
38
+ parser.main = True # type: ignore
39
+
40
+ # create command listing for description
41
+ description = [""] + [
42
+ f"{name:27} {command_info.summary}"
43
+ for name, command_info in commands_dict.items()
44
+ ]
45
+ parser.description = "\n".join(description)
46
+
47
+ return parser
48
+
49
+
50
+ def identify_python_interpreter(python: str) -> Optional[str]:
51
+ # If the named file exists, use it.
52
+ # If it's a directory, assume it's a virtual environment and
53
+ # look for the environment's Python executable.
54
+ if os.path.exists(python):
55
+ if os.path.isdir(python):
56
+ # bin/python for Unix, Scripts/python.exe for Windows
57
+ # Try both in case of odd cases like cygwin.
58
+ for exe in ("bin/python", "Scripts/python.exe"):
59
+ py = os.path.join(python, exe)
60
+ if os.path.exists(py):
61
+ return py
62
+ else:
63
+ return python
64
+
65
+ # Could not find the interpreter specified
66
+ return None
67
+
68
+
69
+ def parse_command(args: List[str]) -> Tuple[str, List[str]]:
70
+ parser = create_main_parser()
71
+
72
+ # Note: parser calls disable_interspersed_args(), so the result of this
73
+ # call is to split the initial args into the general options before the
74
+ # subcommand and everything else.
75
+ # For example:
76
+ # args: ['--timeout=5', 'install', '--user', 'INITools']
77
+ # general_options: ['--timeout==5']
78
+ # args_else: ['install', '--user', 'INITools']
79
+ general_options, args_else = parser.parse_args(args)
80
+
81
+ # --python
82
+ if general_options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ:
83
+ # Re-invoke pip using the specified Python interpreter
84
+ interpreter = identify_python_interpreter(general_options.python)
85
+ if interpreter is None:
86
+ raise CommandError(
87
+ f"Could not locate Python interpreter {general_options.python}"
88
+ )
89
+
90
+ pip_cmd = [
91
+ interpreter,
92
+ get_runnable_pip(),
93
+ ]
94
+ pip_cmd.extend(args)
95
+
96
+ # Set a flag so the child doesn't re-invoke itself, causing
97
+ # an infinite loop.
98
+ os.environ["_PIP_RUNNING_IN_SUBPROCESS"] = "1"
99
+ returncode = 0
100
+ try:
101
+ proc = subprocess.run(pip_cmd)
102
+ returncode = proc.returncode
103
+ except (subprocess.SubprocessError, OSError) as exc:
104
+ raise CommandError(f"Failed to run pip under {interpreter}: {exc}")
105
+ sys.exit(returncode)
106
+
107
+ # --version
108
+ if general_options.version:
109
+ sys.stdout.write(parser.version)
110
+ sys.stdout.write(os.linesep)
111
+ sys.exit()
112
+
113
+ # pip || pip help -> print_help()
114
+ if not args_else or (args_else[0] == "help" and len(args_else) == 1):
115
+ parser.print_help()
116
+ sys.exit()
117
+
118
+ # the subcommand name
119
+ cmd_name = args_else[0]
120
+
121
+ if cmd_name not in commands_dict:
122
+ guess = get_similar_commands(cmd_name)
123
+
124
+ msg = [f'unknown command "{cmd_name}"']
125
+ if guess:
126
+ msg.append(f'maybe you meant "{guess}"')
127
+
128
+ raise CommandError(" - ".join(msg))
129
+
130
+ # all the args without the subcommand
131
+ cmd_args = args[:]
132
+ cmd_args.remove(cmd_name)
133
+
134
+ return cmd_name, cmd_args
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/parser.py ADDED
@@ -0,0 +1,294 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Base option parser setup"""
2
+
3
+ import logging
4
+ import optparse
5
+ import shutil
6
+ import sys
7
+ import textwrap
8
+ from contextlib import suppress
9
+ from typing import Any, Dict, Generator, List, Tuple
10
+
11
+ from pip._internal.cli.status_codes import UNKNOWN_ERROR
12
+ from pip._internal.configuration import Configuration, ConfigurationError
13
+ from pip._internal.utils.misc import redact_auth_from_url, strtobool
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ class PrettyHelpFormatter(optparse.IndentedHelpFormatter):
19
+ """A prettier/less verbose help formatter for optparse."""
20
+
21
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
22
+ # help position must be aligned with __init__.parseopts.description
23
+ kwargs["max_help_position"] = 30
24
+ kwargs["indent_increment"] = 1
25
+ kwargs["width"] = shutil.get_terminal_size()[0] - 2
26
+ super().__init__(*args, **kwargs)
27
+
28
+ def format_option_strings(self, option: optparse.Option) -> str:
29
+ return self._format_option_strings(option)
30
+
31
+ def _format_option_strings(
32
+ self, option: optparse.Option, mvarfmt: str = " <{}>", optsep: str = ", "
33
+ ) -> str:
34
+ """
35
+ Return a comma-separated list of option strings and metavars.
36
+
37
+ :param option: tuple of (short opt, long opt), e.g: ('-f', '--format')
38
+ :param mvarfmt: metavar format string
39
+ :param optsep: separator
40
+ """
41
+ opts = []
42
+
43
+ if option._short_opts:
44
+ opts.append(option._short_opts[0])
45
+ if option._long_opts:
46
+ opts.append(option._long_opts[0])
47
+ if len(opts) > 1:
48
+ opts.insert(1, optsep)
49
+
50
+ if option.takes_value():
51
+ assert option.dest is not None
52
+ metavar = option.metavar or option.dest.lower()
53
+ opts.append(mvarfmt.format(metavar.lower()))
54
+
55
+ return "".join(opts)
56
+
57
+ def format_heading(self, heading: str) -> str:
58
+ if heading == "Options":
59
+ return ""
60
+ return heading + ":\n"
61
+
62
+ def format_usage(self, usage: str) -> str:
63
+ """
64
+ Ensure there is only one newline between usage and the first heading
65
+ if there is no description.
66
+ """
67
+ msg = "\nUsage: {}\n".format(self.indent_lines(textwrap.dedent(usage), " "))
68
+ return msg
69
+
70
+ def format_description(self, description: str) -> str:
71
+ # leave full control over description to us
72
+ if description:
73
+ if hasattr(self.parser, "main"):
74
+ label = "Commands"
75
+ else:
76
+ label = "Description"
77
+ # some doc strings have initial newlines, some don't
78
+ description = description.lstrip("\n")
79
+ # some doc strings have final newlines and spaces, some don't
80
+ description = description.rstrip()
81
+ # dedent, then reindent
82
+ description = self.indent_lines(textwrap.dedent(description), " ")
83
+ description = f"{label}:\n{description}\n"
84
+ return description
85
+ else:
86
+ return ""
87
+
88
+ def format_epilog(self, epilog: str) -> str:
89
+ # leave full control over epilog to us
90
+ if epilog:
91
+ return epilog
92
+ else:
93
+ return ""
94
+
95
+ def indent_lines(self, text: str, indent: str) -> str:
96
+ new_lines = [indent + line for line in text.split("\n")]
97
+ return "\n".join(new_lines)
98
+
99
+
100
+ class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter):
101
+ """Custom help formatter for use in ConfigOptionParser.
102
+
103
+ This is updates the defaults before expanding them, allowing
104
+ them to show up correctly in the help listing.
105
+
106
+ Also redact auth from url type options
107
+ """
108
+
109
+ def expand_default(self, option: optparse.Option) -> str:
110
+ default_values = None
111
+ if self.parser is not None:
112
+ assert isinstance(self.parser, ConfigOptionParser)
113
+ self.parser._update_defaults(self.parser.defaults)
114
+ assert option.dest is not None
115
+ default_values = self.parser.defaults.get(option.dest)
116
+ help_text = super().expand_default(option)
117
+
118
+ if default_values and option.metavar == "URL":
119
+ if isinstance(default_values, str):
120
+ default_values = [default_values]
121
+
122
+ # If its not a list, we should abort and just return the help text
123
+ if not isinstance(default_values, list):
124
+ default_values = []
125
+
126
+ for val in default_values:
127
+ help_text = help_text.replace(val, redact_auth_from_url(val))
128
+
129
+ return help_text
130
+
131
+
132
+ class CustomOptionParser(optparse.OptionParser):
133
+ def insert_option_group(
134
+ self, idx: int, *args: Any, **kwargs: Any
135
+ ) -> optparse.OptionGroup:
136
+ """Insert an OptionGroup at a given position."""
137
+ group = self.add_option_group(*args, **kwargs)
138
+
139
+ self.option_groups.pop()
140
+ self.option_groups.insert(idx, group)
141
+
142
+ return group
143
+
144
+ @property
145
+ def option_list_all(self) -> List[optparse.Option]:
146
+ """Get a list of all options, including those in option groups."""
147
+ res = self.option_list[:]
148
+ for i in self.option_groups:
149
+ res.extend(i.option_list)
150
+
151
+ return res
152
+
153
+
154
+ class ConfigOptionParser(CustomOptionParser):
155
+ """Custom option parser which updates its defaults by checking the
156
+ configuration files and environmental variables"""
157
+
158
+ def __init__(
159
+ self,
160
+ *args: Any,
161
+ name: str,
162
+ isolated: bool = False,
163
+ **kwargs: Any,
164
+ ) -> None:
165
+ self.name = name
166
+ self.config = Configuration(isolated)
167
+
168
+ assert self.name
169
+ super().__init__(*args, **kwargs)
170
+
171
+ def check_default(self, option: optparse.Option, key: str, val: Any) -> Any:
172
+ try:
173
+ return option.check_value(key, val)
174
+ except optparse.OptionValueError as exc:
175
+ print(f"An error occurred during configuration: {exc}")
176
+ sys.exit(3)
177
+
178
+ def _get_ordered_configuration_items(
179
+ self,
180
+ ) -> Generator[Tuple[str, Any], None, None]:
181
+ # Configuration gives keys in an unordered manner. Order them.
182
+ override_order = ["global", self.name, ":env:"]
183
+
184
+ # Pool the options into different groups
185
+ section_items: Dict[str, List[Tuple[str, Any]]] = {
186
+ name: [] for name in override_order
187
+ }
188
+ for section_key, val in self.config.items():
189
+ # ignore empty values
190
+ if not val:
191
+ logger.debug(
192
+ "Ignoring configuration key '%s' as it's value is empty.",
193
+ section_key,
194
+ )
195
+ continue
196
+
197
+ section, key = section_key.split(".", 1)
198
+ if section in override_order:
199
+ section_items[section].append((key, val))
200
+
201
+ # Yield each group in their override order
202
+ for section in override_order:
203
+ for key, val in section_items[section]:
204
+ yield key, val
205
+
206
+ def _update_defaults(self, defaults: Dict[str, Any]) -> Dict[str, Any]:
207
+ """Updates the given defaults with values from the config files and
208
+ the environ. Does a little special handling for certain types of
209
+ options (lists)."""
210
+
211
+ # Accumulate complex default state.
212
+ self.values = optparse.Values(self.defaults)
213
+ late_eval = set()
214
+ # Then set the options with those values
215
+ for key, val in self._get_ordered_configuration_items():
216
+ # '--' because configuration supports only long names
217
+ option = self.get_option("--" + key)
218
+
219
+ # Ignore options not present in this parser. E.g. non-globals put
220
+ # in [global] by users that want them to apply to all applicable
221
+ # commands.
222
+ if option is None:
223
+ continue
224
+
225
+ assert option.dest is not None
226
+
227
+ if option.action in ("store_true", "store_false"):
228
+ try:
229
+ val = strtobool(val)
230
+ except ValueError:
231
+ self.error(
232
+ "{} is not a valid value for {} option, "
233
+ "please specify a boolean value like yes/no, "
234
+ "true/false or 1/0 instead.".format(val, key)
235
+ )
236
+ elif option.action == "count":
237
+ with suppress(ValueError):
238
+ val = strtobool(val)
239
+ with suppress(ValueError):
240
+ val = int(val)
241
+ if not isinstance(val, int) or val < 0:
242
+ self.error(
243
+ "{} is not a valid value for {} option, "
244
+ "please instead specify either a non-negative integer "
245
+ "or a boolean value like yes/no or false/true "
246
+ "which is equivalent to 1/0.".format(val, key)
247
+ )
248
+ elif option.action == "append":
249
+ val = val.split()
250
+ val = [self.check_default(option, key, v) for v in val]
251
+ elif option.action == "callback":
252
+ assert option.callback is not None
253
+ late_eval.add(option.dest)
254
+ opt_str = option.get_opt_string()
255
+ val = option.convert_value(opt_str, val)
256
+ # From take_action
257
+ args = option.callback_args or ()
258
+ kwargs = option.callback_kwargs or {}
259
+ option.callback(option, opt_str, val, self, *args, **kwargs)
260
+ else:
261
+ val = self.check_default(option, key, val)
262
+
263
+ defaults[option.dest] = val
264
+
265
+ for key in late_eval:
266
+ defaults[key] = getattr(self.values, key)
267
+ self.values = None
268
+ return defaults
269
+
270
+ def get_default_values(self) -> optparse.Values:
271
+ """Overriding to make updating the defaults after instantiation of
272
+ the option parser possible, _update_defaults() does the dirty work."""
273
+ if not self.process_default_values:
274
+ # Old, pre-Optik 1.5 behaviour.
275
+ return optparse.Values(self.defaults)
276
+
277
+ # Load the configuration, or error out in case of an error
278
+ try:
279
+ self.config.load()
280
+ except ConfigurationError as err:
281
+ self.exit(UNKNOWN_ERROR, str(err))
282
+
283
+ defaults = self._update_defaults(self.defaults.copy()) # ours
284
+ for option in self._get_all_options():
285
+ assert option.dest is not None
286
+ default = defaults.get(option.dest)
287
+ if isinstance(default, str):
288
+ opt_str = option.get_opt_string()
289
+ defaults[option.dest] = option.check_value(opt_str, default)
290
+ return optparse.Values(defaults)
291
+
292
+ def error(self, msg: str) -> None:
293
+ self.print_usage(sys.stderr)
294
+ self.exit(UNKNOWN_ERROR, f"{msg}\n")
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/progress_bars.py ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import functools
2
+ from typing import Callable, Generator, Iterable, Iterator, Optional, Tuple
3
+
4
+ from pip._vendor.rich.progress import (
5
+ BarColumn,
6
+ DownloadColumn,
7
+ FileSizeColumn,
8
+ Progress,
9
+ ProgressColumn,
10
+ SpinnerColumn,
11
+ TextColumn,
12
+ TimeElapsedColumn,
13
+ TimeRemainingColumn,
14
+ TransferSpeedColumn,
15
+ )
16
+
17
+ from pip._internal.utils.logging import get_indentation
18
+
19
+ DownloadProgressRenderer = Callable[[Iterable[bytes]], Iterator[bytes]]
20
+
21
+
22
+ def _rich_progress_bar(
23
+ iterable: Iterable[bytes],
24
+ *,
25
+ bar_type: str,
26
+ size: int,
27
+ ) -> Generator[bytes, None, None]:
28
+ assert bar_type == "on", "This should only be used in the default mode."
29
+
30
+ if not size:
31
+ total = float("inf")
32
+ columns: Tuple[ProgressColumn, ...] = (
33
+ TextColumn("[progress.description]{task.description}"),
34
+ SpinnerColumn("line", speed=1.5),
35
+ FileSizeColumn(),
36
+ TransferSpeedColumn(),
37
+ TimeElapsedColumn(),
38
+ )
39
+ else:
40
+ total = size
41
+ columns = (
42
+ TextColumn("[progress.description]{task.description}"),
43
+ BarColumn(),
44
+ DownloadColumn(),
45
+ TransferSpeedColumn(),
46
+ TextColumn("eta"),
47
+ TimeRemainingColumn(),
48
+ )
49
+
50
+ progress = Progress(*columns, refresh_per_second=30)
51
+ task_id = progress.add_task(" " * (get_indentation() + 2), total=total)
52
+ with progress:
53
+ for chunk in iterable:
54
+ yield chunk
55
+ progress.update(task_id, advance=len(chunk))
56
+
57
+
58
+ def get_download_progress_renderer(
59
+ *, bar_type: str, size: Optional[int] = None
60
+ ) -> DownloadProgressRenderer:
61
+ """Get an object that can be used to render the download progress.
62
+
63
+ Returns a callable, that takes an iterable to "wrap".
64
+ """
65
+ if bar_type == "on":
66
+ return functools.partial(_rich_progress_bar, bar_type=bar_type, size=size)
67
+ else:
68
+ return iter # no-op, when passed an iterator
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/req_command.py ADDED
@@ -0,0 +1,505 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Contains the Command base classes that depend on PipSession.
2
+
3
+ The classes in this module are in a separate module so the commands not
4
+ needing download / PackageFinder capability don't unnecessarily import the
5
+ PackageFinder machinery and all its vendored dependencies, etc.
6
+ """
7
+
8
+ import logging
9
+ import os
10
+ import sys
11
+ from functools import partial
12
+ from optparse import Values
13
+ from typing import TYPE_CHECKING, Any, List, Optional, Tuple
14
+
15
+ from pip._internal.cache import WheelCache
16
+ from pip._internal.cli import cmdoptions
17
+ from pip._internal.cli.base_command import Command
18
+ from pip._internal.cli.command_context import CommandContextMixIn
19
+ from pip._internal.exceptions import CommandError, PreviousBuildDirError
20
+ from pip._internal.index.collector import LinkCollector
21
+ from pip._internal.index.package_finder import PackageFinder
22
+ from pip._internal.models.selection_prefs import SelectionPreferences
23
+ from pip._internal.models.target_python import TargetPython
24
+ from pip._internal.network.session import PipSession
25
+ from pip._internal.operations.build.build_tracker import BuildTracker
26
+ from pip._internal.operations.prepare import RequirementPreparer
27
+ from pip._internal.req.constructors import (
28
+ install_req_from_editable,
29
+ install_req_from_line,
30
+ install_req_from_parsed_requirement,
31
+ install_req_from_req_string,
32
+ )
33
+ from pip._internal.req.req_file import parse_requirements
34
+ from pip._internal.req.req_install import InstallRequirement
35
+ from pip._internal.resolution.base import BaseResolver
36
+ from pip._internal.self_outdated_check import pip_self_version_check
37
+ from pip._internal.utils.temp_dir import (
38
+ TempDirectory,
39
+ TempDirectoryTypeRegistry,
40
+ tempdir_kinds,
41
+ )
42
+ from pip._internal.utils.virtualenv import running_under_virtualenv
43
+
44
+ if TYPE_CHECKING:
45
+ from ssl import SSLContext
46
+
47
+ logger = logging.getLogger(__name__)
48
+
49
+
50
+ def _create_truststore_ssl_context() -> Optional["SSLContext"]:
51
+ if sys.version_info < (3, 10):
52
+ raise CommandError("The truststore feature is only available for Python 3.10+")
53
+
54
+ try:
55
+ import ssl
56
+ except ImportError:
57
+ logger.warning("Disabling truststore since ssl support is missing")
58
+ return None
59
+
60
+ try:
61
+ from pip._vendor import truststore
62
+ except ImportError as e:
63
+ raise CommandError(f"The truststore feature is unavailable: {e}")
64
+
65
+ return truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
66
+
67
+
68
+ class SessionCommandMixin(CommandContextMixIn):
69
+
70
+ """
71
+ A class mixin for command classes needing _build_session().
72
+ """
73
+
74
+ def __init__(self) -> None:
75
+ super().__init__()
76
+ self._session: Optional[PipSession] = None
77
+
78
+ @classmethod
79
+ def _get_index_urls(cls, options: Values) -> Optional[List[str]]:
80
+ """Return a list of index urls from user-provided options."""
81
+ index_urls = []
82
+ if not getattr(options, "no_index", False):
83
+ url = getattr(options, "index_url", None)
84
+ if url:
85
+ index_urls.append(url)
86
+ urls = getattr(options, "extra_index_urls", None)
87
+ if urls:
88
+ index_urls.extend(urls)
89
+ # Return None rather than an empty list
90
+ return index_urls or None
91
+
92
+ def get_default_session(self, options: Values) -> PipSession:
93
+ """Get a default-managed session."""
94
+ if self._session is None:
95
+ self._session = self.enter_context(self._build_session(options))
96
+ # there's no type annotation on requests.Session, so it's
97
+ # automatically ContextManager[Any] and self._session becomes Any,
98
+ # then https://github.com/python/mypy/issues/7696 kicks in
99
+ assert self._session is not None
100
+ return self._session
101
+
102
+ def _build_session(
103
+ self,
104
+ options: Values,
105
+ retries: Optional[int] = None,
106
+ timeout: Optional[int] = None,
107
+ fallback_to_certifi: bool = False,
108
+ ) -> PipSession:
109
+ cache_dir = options.cache_dir
110
+ assert not cache_dir or os.path.isabs(cache_dir)
111
+
112
+ if "truststore" in options.features_enabled:
113
+ try:
114
+ ssl_context = _create_truststore_ssl_context()
115
+ except Exception:
116
+ if not fallback_to_certifi:
117
+ raise
118
+ ssl_context = None
119
+ else:
120
+ ssl_context = None
121
+
122
+ session = PipSession(
123
+ cache=os.path.join(cache_dir, "http-v2") if cache_dir else None,
124
+ retries=retries if retries is not None else options.retries,
125
+ trusted_hosts=options.trusted_hosts,
126
+ index_urls=self._get_index_urls(options),
127
+ ssl_context=ssl_context,
128
+ )
129
+
130
+ # Handle custom ca-bundles from the user
131
+ if options.cert:
132
+ session.verify = options.cert
133
+
134
+ # Handle SSL client certificate
135
+ if options.client_cert:
136
+ session.cert = options.client_cert
137
+
138
+ # Handle timeouts
139
+ if options.timeout or timeout:
140
+ session.timeout = timeout if timeout is not None else options.timeout
141
+
142
+ # Handle configured proxies
143
+ if options.proxy:
144
+ session.proxies = {
145
+ "http": options.proxy,
146
+ "https": options.proxy,
147
+ }
148
+
149
+ # Determine if we can prompt the user for authentication or not
150
+ session.auth.prompting = not options.no_input
151
+ session.auth.keyring_provider = options.keyring_provider
152
+
153
+ return session
154
+
155
+
156
+ class IndexGroupCommand(Command, SessionCommandMixin):
157
+
158
+ """
159
+ Abstract base class for commands with the index_group options.
160
+
161
+ This also corresponds to the commands that permit the pip version check.
162
+ """
163
+
164
+ def handle_pip_version_check(self, options: Values) -> None:
165
+ """
166
+ Do the pip version check if not disabled.
167
+
168
+ This overrides the default behavior of not doing the check.
169
+ """
170
+ # Make sure the index_group options are present.
171
+ assert hasattr(options, "no_index")
172
+
173
+ if options.disable_pip_version_check or options.no_index:
174
+ return
175
+
176
+ # Otherwise, check if we're using the latest version of pip available.
177
+ session = self._build_session(
178
+ options,
179
+ retries=0,
180
+ timeout=min(5, options.timeout),
181
+ # This is set to ensure the function does not fail when truststore is
182
+ # specified in use-feature but cannot be loaded. This usually raises a
183
+ # CommandError and shows a nice user-facing error, but this function is not
184
+ # called in that try-except block.
185
+ fallback_to_certifi=True,
186
+ )
187
+ with session:
188
+ pip_self_version_check(session, options)
189
+
190
+
191
+ KEEPABLE_TEMPDIR_TYPES = [
192
+ tempdir_kinds.BUILD_ENV,
193
+ tempdir_kinds.EPHEM_WHEEL_CACHE,
194
+ tempdir_kinds.REQ_BUILD,
195
+ ]
196
+
197
+
198
+ def warn_if_run_as_root() -> None:
199
+ """Output a warning for sudo users on Unix.
200
+
201
+ In a virtual environment, sudo pip still writes to virtualenv.
202
+ On Windows, users may run pip as Administrator without issues.
203
+ This warning only applies to Unix root users outside of virtualenv.
204
+ """
205
+ if running_under_virtualenv():
206
+ return
207
+ if not hasattr(os, "getuid"):
208
+ return
209
+ # On Windows, there are no "system managed" Python packages. Installing as
210
+ # Administrator via pip is the correct way of updating system environments.
211
+ #
212
+ # We choose sys.platform over utils.compat.WINDOWS here to enable Mypy platform
213
+ # checks: https://mypy.readthedocs.io/en/stable/common_issues.html
214
+ if sys.platform == "win32" or sys.platform == "cygwin":
215
+ return
216
+
217
+ if os.getuid() != 0:
218
+ return
219
+
220
+ logger.warning(
221
+ "Running pip as the 'root' user can result in broken permissions and "
222
+ "conflicting behaviour with the system package manager. "
223
+ "It is recommended to use a virtual environment instead: "
224
+ "https://pip.pypa.io/warnings/venv"
225
+ )
226
+
227
+
228
+ def with_cleanup(func: Any) -> Any:
229
+ """Decorator for common logic related to managing temporary
230
+ directories.
231
+ """
232
+
233
+ def configure_tempdir_registry(registry: TempDirectoryTypeRegistry) -> None:
234
+ for t in KEEPABLE_TEMPDIR_TYPES:
235
+ registry.set_delete(t, False)
236
+
237
+ def wrapper(
238
+ self: RequirementCommand, options: Values, args: List[Any]
239
+ ) -> Optional[int]:
240
+ assert self.tempdir_registry is not None
241
+ if options.no_clean:
242
+ configure_tempdir_registry(self.tempdir_registry)
243
+
244
+ try:
245
+ return func(self, options, args)
246
+ except PreviousBuildDirError:
247
+ # This kind of conflict can occur when the user passes an explicit
248
+ # build directory with a pre-existing folder. In that case we do
249
+ # not want to accidentally remove it.
250
+ configure_tempdir_registry(self.tempdir_registry)
251
+ raise
252
+
253
+ return wrapper
254
+
255
+
256
+ class RequirementCommand(IndexGroupCommand):
257
+ def __init__(self, *args: Any, **kw: Any) -> None:
258
+ super().__init__(*args, **kw)
259
+
260
+ self.cmd_opts.add_option(cmdoptions.no_clean())
261
+
262
+ @staticmethod
263
+ def determine_resolver_variant(options: Values) -> str:
264
+ """Determines which resolver should be used, based on the given options."""
265
+ if "legacy-resolver" in options.deprecated_features_enabled:
266
+ return "legacy"
267
+
268
+ return "resolvelib"
269
+
270
+ @classmethod
271
+ def make_requirement_preparer(
272
+ cls,
273
+ temp_build_dir: TempDirectory,
274
+ options: Values,
275
+ build_tracker: BuildTracker,
276
+ session: PipSession,
277
+ finder: PackageFinder,
278
+ use_user_site: bool,
279
+ download_dir: Optional[str] = None,
280
+ verbosity: int = 0,
281
+ ) -> RequirementPreparer:
282
+ """
283
+ Create a RequirementPreparer instance for the given parameters.
284
+ """
285
+ temp_build_dir_path = temp_build_dir.path
286
+ assert temp_build_dir_path is not None
287
+ legacy_resolver = False
288
+
289
+ resolver_variant = cls.determine_resolver_variant(options)
290
+ if resolver_variant == "resolvelib":
291
+ lazy_wheel = "fast-deps" in options.features_enabled
292
+ if lazy_wheel:
293
+ logger.warning(
294
+ "pip is using lazily downloaded wheels using HTTP "
295
+ "range requests to obtain dependency information. "
296
+ "This experimental feature is enabled through "
297
+ "--use-feature=fast-deps and it is not ready for "
298
+ "production."
299
+ )
300
+ else:
301
+ legacy_resolver = True
302
+ lazy_wheel = False
303
+ if "fast-deps" in options.features_enabled:
304
+ logger.warning(
305
+ "fast-deps has no effect when used with the legacy resolver."
306
+ )
307
+
308
+ return RequirementPreparer(
309
+ build_dir=temp_build_dir_path,
310
+ src_dir=options.src_dir,
311
+ download_dir=download_dir,
312
+ build_isolation=options.build_isolation,
313
+ check_build_deps=options.check_build_deps,
314
+ build_tracker=build_tracker,
315
+ session=session,
316
+ progress_bar=options.progress_bar,
317
+ finder=finder,
318
+ require_hashes=options.require_hashes,
319
+ use_user_site=use_user_site,
320
+ lazy_wheel=lazy_wheel,
321
+ verbosity=verbosity,
322
+ legacy_resolver=legacy_resolver,
323
+ )
324
+
325
+ @classmethod
326
+ def make_resolver(
327
+ cls,
328
+ preparer: RequirementPreparer,
329
+ finder: PackageFinder,
330
+ options: Values,
331
+ wheel_cache: Optional[WheelCache] = None,
332
+ use_user_site: bool = False,
333
+ ignore_installed: bool = True,
334
+ ignore_requires_python: bool = False,
335
+ force_reinstall: bool = False,
336
+ upgrade_strategy: str = "to-satisfy-only",
337
+ use_pep517: Optional[bool] = None,
338
+ py_version_info: Optional[Tuple[int, ...]] = None,
339
+ ) -> BaseResolver:
340
+ """
341
+ Create a Resolver instance for the given parameters.
342
+ """
343
+ make_install_req = partial(
344
+ install_req_from_req_string,
345
+ isolated=options.isolated_mode,
346
+ use_pep517=use_pep517,
347
+ )
348
+ resolver_variant = cls.determine_resolver_variant(options)
349
+ # The long import name and duplicated invocation is needed to convince
350
+ # Mypy into correctly typechecking. Otherwise it would complain the
351
+ # "Resolver" class being redefined.
352
+ if resolver_variant == "resolvelib":
353
+ import pip._internal.resolution.resolvelib.resolver
354
+
355
+ return pip._internal.resolution.resolvelib.resolver.Resolver(
356
+ preparer=preparer,
357
+ finder=finder,
358
+ wheel_cache=wheel_cache,
359
+ make_install_req=make_install_req,
360
+ use_user_site=use_user_site,
361
+ ignore_dependencies=options.ignore_dependencies,
362
+ ignore_installed=ignore_installed,
363
+ ignore_requires_python=ignore_requires_python,
364
+ force_reinstall=force_reinstall,
365
+ upgrade_strategy=upgrade_strategy,
366
+ py_version_info=py_version_info,
367
+ )
368
+ import pip._internal.resolution.legacy.resolver
369
+
370
+ return pip._internal.resolution.legacy.resolver.Resolver(
371
+ preparer=preparer,
372
+ finder=finder,
373
+ wheel_cache=wheel_cache,
374
+ make_install_req=make_install_req,
375
+ use_user_site=use_user_site,
376
+ ignore_dependencies=options.ignore_dependencies,
377
+ ignore_installed=ignore_installed,
378
+ ignore_requires_python=ignore_requires_python,
379
+ force_reinstall=force_reinstall,
380
+ upgrade_strategy=upgrade_strategy,
381
+ py_version_info=py_version_info,
382
+ )
383
+
384
+ def get_requirements(
385
+ self,
386
+ args: List[str],
387
+ options: Values,
388
+ finder: PackageFinder,
389
+ session: PipSession,
390
+ ) -> List[InstallRequirement]:
391
+ """
392
+ Parse command-line arguments into the corresponding requirements.
393
+ """
394
+ requirements: List[InstallRequirement] = []
395
+ for filename in options.constraints:
396
+ for parsed_req in parse_requirements(
397
+ filename,
398
+ constraint=True,
399
+ finder=finder,
400
+ options=options,
401
+ session=session,
402
+ ):
403
+ req_to_add = install_req_from_parsed_requirement(
404
+ parsed_req,
405
+ isolated=options.isolated_mode,
406
+ user_supplied=False,
407
+ )
408
+ requirements.append(req_to_add)
409
+
410
+ for req in args:
411
+ req_to_add = install_req_from_line(
412
+ req,
413
+ comes_from=None,
414
+ isolated=options.isolated_mode,
415
+ use_pep517=options.use_pep517,
416
+ user_supplied=True,
417
+ config_settings=getattr(options, "config_settings", None),
418
+ )
419
+ requirements.append(req_to_add)
420
+
421
+ for req in options.editables:
422
+ req_to_add = install_req_from_editable(
423
+ req,
424
+ user_supplied=True,
425
+ isolated=options.isolated_mode,
426
+ use_pep517=options.use_pep517,
427
+ config_settings=getattr(options, "config_settings", None),
428
+ )
429
+ requirements.append(req_to_add)
430
+
431
+ # NOTE: options.require_hashes may be set if --require-hashes is True
432
+ for filename in options.requirements:
433
+ for parsed_req in parse_requirements(
434
+ filename, finder=finder, options=options, session=session
435
+ ):
436
+ req_to_add = install_req_from_parsed_requirement(
437
+ parsed_req,
438
+ isolated=options.isolated_mode,
439
+ use_pep517=options.use_pep517,
440
+ user_supplied=True,
441
+ config_settings=parsed_req.options.get("config_settings")
442
+ if parsed_req.options
443
+ else None,
444
+ )
445
+ requirements.append(req_to_add)
446
+
447
+ # If any requirement has hash options, enable hash checking.
448
+ if any(req.has_hash_options for req in requirements):
449
+ options.require_hashes = True
450
+
451
+ if not (args or options.editables or options.requirements):
452
+ opts = {"name": self.name}
453
+ if options.find_links:
454
+ raise CommandError(
455
+ "You must give at least one requirement to {name} "
456
+ '(maybe you meant "pip {name} {links}"?)'.format(
457
+ **dict(opts, links=" ".join(options.find_links))
458
+ )
459
+ )
460
+ else:
461
+ raise CommandError(
462
+ "You must give at least one requirement to {name} "
463
+ '(see "pip help {name}")'.format(**opts)
464
+ )
465
+
466
+ return requirements
467
+
468
+ @staticmethod
469
+ def trace_basic_info(finder: PackageFinder) -> None:
470
+ """
471
+ Trace basic information about the provided objects.
472
+ """
473
+ # Display where finder is looking for packages
474
+ search_scope = finder.search_scope
475
+ locations = search_scope.get_formatted_locations()
476
+ if locations:
477
+ logger.info(locations)
478
+
479
+ def _build_package_finder(
480
+ self,
481
+ options: Values,
482
+ session: PipSession,
483
+ target_python: Optional[TargetPython] = None,
484
+ ignore_requires_python: Optional[bool] = None,
485
+ ) -> PackageFinder:
486
+ """
487
+ Create a package finder appropriate to this requirement command.
488
+
489
+ :param ignore_requires_python: Whether to ignore incompatible
490
+ "Requires-Python" values in links. Defaults to False.
491
+ """
492
+ link_collector = LinkCollector.create(session, options=options)
493
+ selection_prefs = SelectionPreferences(
494
+ allow_yanked=True,
495
+ format_control=options.format_control,
496
+ allow_all_prereleases=options.pre,
497
+ prefer_binary=options.prefer_binary,
498
+ ignore_requires_python=ignore_requires_python,
499
+ )
500
+
501
+ return PackageFinder.create(
502
+ link_collector=link_collector,
503
+ selection_prefs=selection_prefs,
504
+ target_python=target_python,
505
+ )
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/spinners.py ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import contextlib
2
+ import itertools
3
+ import logging
4
+ import sys
5
+ import time
6
+ from typing import IO, Generator, Optional
7
+
8
+ from pip._internal.utils.compat import WINDOWS
9
+ from pip._internal.utils.logging import get_indentation
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class SpinnerInterface:
15
+ def spin(self) -> None:
16
+ raise NotImplementedError()
17
+
18
+ def finish(self, final_status: str) -> None:
19
+ raise NotImplementedError()
20
+
21
+
22
+ class InteractiveSpinner(SpinnerInterface):
23
+ def __init__(
24
+ self,
25
+ message: str,
26
+ file: Optional[IO[str]] = None,
27
+ spin_chars: str = "-\\|/",
28
+ # Empirically, 8 updates/second looks nice
29
+ min_update_interval_seconds: float = 0.125,
30
+ ):
31
+ self._message = message
32
+ if file is None:
33
+ file = sys.stdout
34
+ self._file = file
35
+ self._rate_limiter = RateLimiter(min_update_interval_seconds)
36
+ self._finished = False
37
+
38
+ self._spin_cycle = itertools.cycle(spin_chars)
39
+
40
+ self._file.write(" " * get_indentation() + self._message + " ... ")
41
+ self._width = 0
42
+
43
+ def _write(self, status: str) -> None:
44
+ assert not self._finished
45
+ # Erase what we wrote before by backspacing to the beginning, writing
46
+ # spaces to overwrite the old text, and then backspacing again
47
+ backup = "\b" * self._width
48
+ self._file.write(backup + " " * self._width + backup)
49
+ # Now we have a blank slate to add our status
50
+ self._file.write(status)
51
+ self._width = len(status)
52
+ self._file.flush()
53
+ self._rate_limiter.reset()
54
+
55
+ def spin(self) -> None:
56
+ if self._finished:
57
+ return
58
+ if not self._rate_limiter.ready():
59
+ return
60
+ self._write(next(self._spin_cycle))
61
+
62
+ def finish(self, final_status: str) -> None:
63
+ if self._finished:
64
+ return
65
+ self._write(final_status)
66
+ self._file.write("\n")
67
+ self._file.flush()
68
+ self._finished = True
69
+
70
+
71
+ # Used for dumb terminals, non-interactive installs (no tty), etc.
72
+ # We still print updates occasionally (once every 60 seconds by default) to
73
+ # act as a keep-alive for systems like Travis-CI that take lack-of-output as
74
+ # an indication that a task has frozen.
75
+ class NonInteractiveSpinner(SpinnerInterface):
76
+ def __init__(self, message: str, min_update_interval_seconds: float = 60.0) -> None:
77
+ self._message = message
78
+ self._finished = False
79
+ self._rate_limiter = RateLimiter(min_update_interval_seconds)
80
+ self._update("started")
81
+
82
+ def _update(self, status: str) -> None:
83
+ assert not self._finished
84
+ self._rate_limiter.reset()
85
+ logger.info("%s: %s", self._message, status)
86
+
87
+ def spin(self) -> None:
88
+ if self._finished:
89
+ return
90
+ if not self._rate_limiter.ready():
91
+ return
92
+ self._update("still running...")
93
+
94
+ def finish(self, final_status: str) -> None:
95
+ if self._finished:
96
+ return
97
+ self._update(f"finished with status '{final_status}'")
98
+ self._finished = True
99
+
100
+
101
+ class RateLimiter:
102
+ def __init__(self, min_update_interval_seconds: float) -> None:
103
+ self._min_update_interval_seconds = min_update_interval_seconds
104
+ self._last_update: float = 0
105
+
106
+ def ready(self) -> bool:
107
+ now = time.time()
108
+ delta = now - self._last_update
109
+ return delta >= self._min_update_interval_seconds
110
+
111
+ def reset(self) -> None:
112
+ self._last_update = time.time()
113
+
114
+
115
+ @contextlib.contextmanager
116
+ def open_spinner(message: str) -> Generator[SpinnerInterface, None, None]:
117
+ # Interactive spinner goes directly to sys.stdout rather than being routed
118
+ # through the logging system, but it acts like it has level INFO,
119
+ # i.e. it's only displayed if we're at level INFO or better.
120
+ # Non-interactive spinner goes through the logging system, so it is always
121
+ # in sync with logging configuration.
122
+ if sys.stdout.isatty() and logger.getEffectiveLevel() <= logging.INFO:
123
+ spinner: SpinnerInterface = InteractiveSpinner(message)
124
+ else:
125
+ spinner = NonInteractiveSpinner(message)
126
+ try:
127
+ with hidden_cursor(sys.stdout):
128
+ yield spinner
129
+ except KeyboardInterrupt:
130
+ spinner.finish("canceled")
131
+ raise
132
+ except Exception:
133
+ spinner.finish("error")
134
+ raise
135
+ else:
136
+ spinner.finish("done")
137
+
138
+
139
+ HIDE_CURSOR = "\x1b[?25l"
140
+ SHOW_CURSOR = "\x1b[?25h"
141
+
142
+
143
+ @contextlib.contextmanager
144
+ def hidden_cursor(file: IO[str]) -> Generator[None, None, None]:
145
+ # The Windows terminal does not support the hide/show cursor ANSI codes,
146
+ # even via colorama. So don't even try.
147
+ if WINDOWS:
148
+ yield
149
+ # We don't want to clutter the output with control characters if we're
150
+ # writing to a file, or if the user is running with --quiet.
151
+ # See https://github.com/pypa/pip/issues/3418
152
+ elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO:
153
+ yield
154
+ else:
155
+ file.write(HIDE_CURSOR)
156
+ try:
157
+ yield
158
+ finally:
159
+ file.write(SHOW_CURSOR)
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/cli/status_codes.py ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ SUCCESS = 0
2
+ ERROR = 1
3
+ UNKNOWN_ERROR = 2
4
+ VIRTUALENV_NOT_FOUND = 3
5
+ PREVIOUS_BUILD_DIR_ERROR = 4
6
+ NO_MATCHES_FOUND = 23
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/__init__.py ADDED
@@ -0,0 +1,132 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Package containing all pip commands
3
+ """
4
+
5
+ import importlib
6
+ from collections import namedtuple
7
+ from typing import Any, Dict, Optional
8
+
9
+ from pip._internal.cli.base_command import Command
10
+
11
+ CommandInfo = namedtuple("CommandInfo", "module_path, class_name, summary")
12
+
13
+ # This dictionary does a bunch of heavy lifting for help output:
14
+ # - Enables avoiding additional (costly) imports for presenting `--help`.
15
+ # - The ordering matters for help display.
16
+ #
17
+ # Even though the module path starts with the same "pip._internal.commands"
18
+ # prefix, the full path makes testing easier (specifically when modifying
19
+ # `commands_dict` in test setup / teardown).
20
+ commands_dict: Dict[str, CommandInfo] = {
21
+ "install": CommandInfo(
22
+ "pip._internal.commands.install",
23
+ "InstallCommand",
24
+ "Install packages.",
25
+ ),
26
+ "download": CommandInfo(
27
+ "pip._internal.commands.download",
28
+ "DownloadCommand",
29
+ "Download packages.",
30
+ ),
31
+ "uninstall": CommandInfo(
32
+ "pip._internal.commands.uninstall",
33
+ "UninstallCommand",
34
+ "Uninstall packages.",
35
+ ),
36
+ "freeze": CommandInfo(
37
+ "pip._internal.commands.freeze",
38
+ "FreezeCommand",
39
+ "Output installed packages in requirements format.",
40
+ ),
41
+ "inspect": CommandInfo(
42
+ "pip._internal.commands.inspect",
43
+ "InspectCommand",
44
+ "Inspect the python environment.",
45
+ ),
46
+ "list": CommandInfo(
47
+ "pip._internal.commands.list",
48
+ "ListCommand",
49
+ "List installed packages.",
50
+ ),
51
+ "show": CommandInfo(
52
+ "pip._internal.commands.show",
53
+ "ShowCommand",
54
+ "Show information about installed packages.",
55
+ ),
56
+ "check": CommandInfo(
57
+ "pip._internal.commands.check",
58
+ "CheckCommand",
59
+ "Verify installed packages have compatible dependencies.",
60
+ ),
61
+ "config": CommandInfo(
62
+ "pip._internal.commands.configuration",
63
+ "ConfigurationCommand",
64
+ "Manage local and global configuration.",
65
+ ),
66
+ "search": CommandInfo(
67
+ "pip._internal.commands.search",
68
+ "SearchCommand",
69
+ "Search PyPI for packages.",
70
+ ),
71
+ "cache": CommandInfo(
72
+ "pip._internal.commands.cache",
73
+ "CacheCommand",
74
+ "Inspect and manage pip's wheel cache.",
75
+ ),
76
+ "index": CommandInfo(
77
+ "pip._internal.commands.index",
78
+ "IndexCommand",
79
+ "Inspect information available from package indexes.",
80
+ ),
81
+ "wheel": CommandInfo(
82
+ "pip._internal.commands.wheel",
83
+ "WheelCommand",
84
+ "Build wheels from your requirements.",
85
+ ),
86
+ "hash": CommandInfo(
87
+ "pip._internal.commands.hash",
88
+ "HashCommand",
89
+ "Compute hashes of package archives.",
90
+ ),
91
+ "completion": CommandInfo(
92
+ "pip._internal.commands.completion",
93
+ "CompletionCommand",
94
+ "A helper command used for command completion.",
95
+ ),
96
+ "debug": CommandInfo(
97
+ "pip._internal.commands.debug",
98
+ "DebugCommand",
99
+ "Show information useful for debugging.",
100
+ ),
101
+ "help": CommandInfo(
102
+ "pip._internal.commands.help",
103
+ "HelpCommand",
104
+ "Show help for commands.",
105
+ ),
106
+ }
107
+
108
+
109
+ def create_command(name: str, **kwargs: Any) -> Command:
110
+ """
111
+ Create an instance of the Command class with the given name.
112
+ """
113
+ module_path, class_name, summary = commands_dict[name]
114
+ module = importlib.import_module(module_path)
115
+ command_class = getattr(module, class_name)
116
+ command = command_class(name=name, summary=summary, **kwargs)
117
+
118
+ return command
119
+
120
+
121
+ def get_similar_commands(name: str) -> Optional[str]:
122
+ """Command name auto-correct."""
123
+ from difflib import get_close_matches
124
+
125
+ name = name.lower()
126
+
127
+ close_commands = get_close_matches(name, commands_dict.keys())
128
+
129
+ if close_commands:
130
+ return close_commands[0]
131
+ else:
132
+ return None
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/cache.py ADDED
@@ -0,0 +1,225 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import textwrap
3
+ from optparse import Values
4
+ from typing import Any, List
5
+
6
+ from pip._internal.cli.base_command import Command
7
+ from pip._internal.cli.status_codes import ERROR, SUCCESS
8
+ from pip._internal.exceptions import CommandError, PipError
9
+ from pip._internal.utils import filesystem
10
+ from pip._internal.utils.logging import getLogger
11
+
12
+ logger = getLogger(__name__)
13
+
14
+
15
+ class CacheCommand(Command):
16
+ """
17
+ Inspect and manage pip's wheel cache.
18
+
19
+ Subcommands:
20
+
21
+ - dir: Show the cache directory.
22
+ - info: Show information about the cache.
23
+ - list: List filenames of packages stored in the cache.
24
+ - remove: Remove one or more package from the cache.
25
+ - purge: Remove all items from the cache.
26
+
27
+ ``<pattern>`` can be a glob expression or a package name.
28
+ """
29
+
30
+ ignore_require_venv = True
31
+ usage = """
32
+ %prog dir
33
+ %prog info
34
+ %prog list [<pattern>] [--format=[human, abspath]]
35
+ %prog remove <pattern>
36
+ %prog purge
37
+ """
38
+
39
+ def add_options(self) -> None:
40
+ self.cmd_opts.add_option(
41
+ "--format",
42
+ action="store",
43
+ dest="list_format",
44
+ default="human",
45
+ choices=("human", "abspath"),
46
+ help="Select the output format among: human (default) or abspath",
47
+ )
48
+
49
+ self.parser.insert_option_group(0, self.cmd_opts)
50
+
51
+ def run(self, options: Values, args: List[str]) -> int:
52
+ handlers = {
53
+ "dir": self.get_cache_dir,
54
+ "info": self.get_cache_info,
55
+ "list": self.list_cache_items,
56
+ "remove": self.remove_cache_items,
57
+ "purge": self.purge_cache,
58
+ }
59
+
60
+ if not options.cache_dir:
61
+ logger.error("pip cache commands can not function since cache is disabled.")
62
+ return ERROR
63
+
64
+ # Determine action
65
+ if not args or args[0] not in handlers:
66
+ logger.error(
67
+ "Need an action (%s) to perform.",
68
+ ", ".join(sorted(handlers)),
69
+ )
70
+ return ERROR
71
+
72
+ action = args[0]
73
+
74
+ # Error handling happens here, not in the action-handlers.
75
+ try:
76
+ handlers[action](options, args[1:])
77
+ except PipError as e:
78
+ logger.error(e.args[0])
79
+ return ERROR
80
+
81
+ return SUCCESS
82
+
83
+ def get_cache_dir(self, options: Values, args: List[Any]) -> None:
84
+ if args:
85
+ raise CommandError("Too many arguments")
86
+
87
+ logger.info(options.cache_dir)
88
+
89
+ def get_cache_info(self, options: Values, args: List[Any]) -> None:
90
+ if args:
91
+ raise CommandError("Too many arguments")
92
+
93
+ num_http_files = len(self._find_http_files(options))
94
+ num_packages = len(self._find_wheels(options, "*"))
95
+
96
+ http_cache_location = self._cache_dir(options, "http-v2")
97
+ old_http_cache_location = self._cache_dir(options, "http")
98
+ wheels_cache_location = self._cache_dir(options, "wheels")
99
+ http_cache_size = filesystem.format_size(
100
+ filesystem.directory_size(http_cache_location)
101
+ + filesystem.directory_size(old_http_cache_location)
102
+ )
103
+ wheels_cache_size = filesystem.format_directory_size(wheels_cache_location)
104
+
105
+ message = (
106
+ textwrap.dedent(
107
+ """
108
+ Package index page cache location (pip v23.3+): {http_cache_location}
109
+ Package index page cache location (older pips): {old_http_cache_location}
110
+ Package index page cache size: {http_cache_size}
111
+ Number of HTTP files: {num_http_files}
112
+ Locally built wheels location: {wheels_cache_location}
113
+ Locally built wheels size: {wheels_cache_size}
114
+ Number of locally built wheels: {package_count}
115
+ """ # noqa: E501
116
+ )
117
+ .format(
118
+ http_cache_location=http_cache_location,
119
+ old_http_cache_location=old_http_cache_location,
120
+ http_cache_size=http_cache_size,
121
+ num_http_files=num_http_files,
122
+ wheels_cache_location=wheels_cache_location,
123
+ package_count=num_packages,
124
+ wheels_cache_size=wheels_cache_size,
125
+ )
126
+ .strip()
127
+ )
128
+
129
+ logger.info(message)
130
+
131
+ def list_cache_items(self, options: Values, args: List[Any]) -> None:
132
+ if len(args) > 1:
133
+ raise CommandError("Too many arguments")
134
+
135
+ if args:
136
+ pattern = args[0]
137
+ else:
138
+ pattern = "*"
139
+
140
+ files = self._find_wheels(options, pattern)
141
+ if options.list_format == "human":
142
+ self.format_for_human(files)
143
+ else:
144
+ self.format_for_abspath(files)
145
+
146
+ def format_for_human(self, files: List[str]) -> None:
147
+ if not files:
148
+ logger.info("No locally built wheels cached.")
149
+ return
150
+
151
+ results = []
152
+ for filename in files:
153
+ wheel = os.path.basename(filename)
154
+ size = filesystem.format_file_size(filename)
155
+ results.append(f" - {wheel} ({size})")
156
+ logger.info("Cache contents:\n")
157
+ logger.info("\n".join(sorted(results)))
158
+
159
+ def format_for_abspath(self, files: List[str]) -> None:
160
+ if files:
161
+ logger.info("\n".join(sorted(files)))
162
+
163
+ def remove_cache_items(self, options: Values, args: List[Any]) -> None:
164
+ if len(args) > 1:
165
+ raise CommandError("Too many arguments")
166
+
167
+ if not args:
168
+ raise CommandError("Please provide a pattern")
169
+
170
+ files = self._find_wheels(options, args[0])
171
+
172
+ no_matching_msg = "No matching packages"
173
+ if args[0] == "*":
174
+ # Only fetch http files if no specific pattern given
175
+ files += self._find_http_files(options)
176
+ else:
177
+ # Add the pattern to the log message
178
+ no_matching_msg += ' for pattern "{}"'.format(args[0])
179
+
180
+ if not files:
181
+ logger.warning(no_matching_msg)
182
+
183
+ for filename in files:
184
+ os.unlink(filename)
185
+ logger.verbose("Removed %s", filename)
186
+ logger.info("Files removed: %s", len(files))
187
+
188
+ def purge_cache(self, options: Values, args: List[Any]) -> None:
189
+ if args:
190
+ raise CommandError("Too many arguments")
191
+
192
+ return self.remove_cache_items(options, ["*"])
193
+
194
+ def _cache_dir(self, options: Values, subdir: str) -> str:
195
+ return os.path.join(options.cache_dir, subdir)
196
+
197
+ def _find_http_files(self, options: Values) -> List[str]:
198
+ old_http_dir = self._cache_dir(options, "http")
199
+ new_http_dir = self._cache_dir(options, "http-v2")
200
+ return filesystem.find_files(old_http_dir, "*") + filesystem.find_files(
201
+ new_http_dir, "*"
202
+ )
203
+
204
+ def _find_wheels(self, options: Values, pattern: str) -> List[str]:
205
+ wheel_dir = self._cache_dir(options, "wheels")
206
+
207
+ # The wheel filename format, as specified in PEP 427, is:
208
+ # {distribution}-{version}(-{build})?-{python}-{abi}-{platform}.whl
209
+ #
210
+ # Additionally, non-alphanumeric values in the distribution are
211
+ # normalized to underscores (_), meaning hyphens can never occur
212
+ # before `-{version}`.
213
+ #
214
+ # Given that information:
215
+ # - If the pattern we're given contains a hyphen (-), the user is
216
+ # providing at least the version. Thus, we can just append `*.whl`
217
+ # to match the rest of it.
218
+ # - If the pattern we're given doesn't contain a hyphen (-), the
219
+ # user is only providing the name. Thus, we append `-*.whl` to
220
+ # match the hyphen before the version, followed by anything else.
221
+ #
222
+ # PEP 427: https://www.python.org/dev/peps/pep-0427/
223
+ pattern = pattern + ("*.whl" if "-" in pattern else "-*.whl")
224
+
225
+ return filesystem.find_files(wheel_dir, pattern)
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/check.py ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ from optparse import Values
3
+ from typing import List
4
+
5
+ from pip._internal.cli.base_command import Command
6
+ from pip._internal.cli.status_codes import ERROR, SUCCESS
7
+ from pip._internal.operations.check import (
8
+ check_package_set,
9
+ create_package_set_from_installed,
10
+ warn_legacy_versions_and_specifiers,
11
+ )
12
+ from pip._internal.utils.misc import write_output
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class CheckCommand(Command):
18
+ """Verify installed packages have compatible dependencies."""
19
+
20
+ usage = """
21
+ %prog [options]"""
22
+
23
+ def run(self, options: Values, args: List[str]) -> int:
24
+ package_set, parsing_probs = create_package_set_from_installed()
25
+ warn_legacy_versions_and_specifiers(package_set)
26
+ missing, conflicting = check_package_set(package_set)
27
+
28
+ for project_name in missing:
29
+ version = package_set[project_name].version
30
+ for dependency in missing[project_name]:
31
+ write_output(
32
+ "%s %s requires %s, which is not installed.",
33
+ project_name,
34
+ version,
35
+ dependency[0],
36
+ )
37
+
38
+ for project_name in conflicting:
39
+ version = package_set[project_name].version
40
+ for dep_name, dep_version, req in conflicting[project_name]:
41
+ write_output(
42
+ "%s %s has requirement %s, but you have %s %s.",
43
+ project_name,
44
+ version,
45
+ req,
46
+ dep_name,
47
+ dep_version,
48
+ )
49
+
50
+ if missing or conflicting or parsing_probs:
51
+ return ERROR
52
+ else:
53
+ write_output("No broken requirements found.")
54
+ return SUCCESS
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/completion.py ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sys
2
+ import textwrap
3
+ from optparse import Values
4
+ from typing import List
5
+
6
+ from pip._internal.cli.base_command import Command
7
+ from pip._internal.cli.status_codes import SUCCESS
8
+ from pip._internal.utils.misc import get_prog
9
+
10
+ BASE_COMPLETION = """
11
+ # pip {shell} completion start{script}# pip {shell} completion end
12
+ """
13
+
14
+ COMPLETION_SCRIPTS = {
15
+ "bash": """
16
+ _pip_completion()
17
+ {{
18
+ COMPREPLY=( $( COMP_WORDS="${{COMP_WORDS[*]}}" \\
19
+ COMP_CWORD=$COMP_CWORD \\
20
+ PIP_AUTO_COMPLETE=1 $1 2>/dev/null ) )
21
+ }}
22
+ complete -o default -F _pip_completion {prog}
23
+ """,
24
+ "zsh": """
25
+ #compdef -P pip[0-9.]#
26
+ __pip() {{
27
+ compadd $( COMP_WORDS="$words[*]" \\
28
+ COMP_CWORD=$((CURRENT-1)) \\
29
+ PIP_AUTO_COMPLETE=1 $words[1] 2>/dev/null )
30
+ }}
31
+ if [[ $zsh_eval_context[-1] == loadautofunc ]]; then
32
+ # autoload from fpath, call function directly
33
+ __pip "$@"
34
+ else
35
+ # eval/source/. command, register function for later
36
+ compdef __pip -P 'pip[0-9.]#'
37
+ fi
38
+ """,
39
+ "fish": """
40
+ function __fish_complete_pip
41
+ set -lx COMP_WORDS (commandline -o) ""
42
+ set -lx COMP_CWORD ( \\
43
+ math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\
44
+ )
45
+ set -lx PIP_AUTO_COMPLETE 1
46
+ string split \\ -- (eval $COMP_WORDS[1])
47
+ end
48
+ complete -fa "(__fish_complete_pip)" -c {prog}
49
+ """,
50
+ "powershell": """
51
+ if ((Test-Path Function:\\TabExpansion) -and -not `
52
+ (Test-Path Function:\\_pip_completeBackup)) {{
53
+ Rename-Item Function:\\TabExpansion _pip_completeBackup
54
+ }}
55
+ function TabExpansion($line, $lastWord) {{
56
+ $lastBlock = [regex]::Split($line, '[|;]')[-1].TrimStart()
57
+ if ($lastBlock.StartsWith("{prog} ")) {{
58
+ $Env:COMP_WORDS=$lastBlock
59
+ $Env:COMP_CWORD=$lastBlock.Split().Length - 1
60
+ $Env:PIP_AUTO_COMPLETE=1
61
+ (& {prog}).Split()
62
+ Remove-Item Env:COMP_WORDS
63
+ Remove-Item Env:COMP_CWORD
64
+ Remove-Item Env:PIP_AUTO_COMPLETE
65
+ }}
66
+ elseif (Test-Path Function:\\_pip_completeBackup) {{
67
+ # Fall back on existing tab expansion
68
+ _pip_completeBackup $line $lastWord
69
+ }}
70
+ }}
71
+ """,
72
+ }
73
+
74
+
75
+ class CompletionCommand(Command):
76
+ """A helper command to be used for command completion."""
77
+
78
+ ignore_require_venv = True
79
+
80
+ def add_options(self) -> None:
81
+ self.cmd_opts.add_option(
82
+ "--bash",
83
+ "-b",
84
+ action="store_const",
85
+ const="bash",
86
+ dest="shell",
87
+ help="Emit completion code for bash",
88
+ )
89
+ self.cmd_opts.add_option(
90
+ "--zsh",
91
+ "-z",
92
+ action="store_const",
93
+ const="zsh",
94
+ dest="shell",
95
+ help="Emit completion code for zsh",
96
+ )
97
+ self.cmd_opts.add_option(
98
+ "--fish",
99
+ "-f",
100
+ action="store_const",
101
+ const="fish",
102
+ dest="shell",
103
+ help="Emit completion code for fish",
104
+ )
105
+ self.cmd_opts.add_option(
106
+ "--powershell",
107
+ "-p",
108
+ action="store_const",
109
+ const="powershell",
110
+ dest="shell",
111
+ help="Emit completion code for powershell",
112
+ )
113
+
114
+ self.parser.insert_option_group(0, self.cmd_opts)
115
+
116
+ def run(self, options: Values, args: List[str]) -> int:
117
+ """Prints the completion code of the given shell"""
118
+ shells = COMPLETION_SCRIPTS.keys()
119
+ shell_options = ["--" + shell for shell in sorted(shells)]
120
+ if options.shell in shells:
121
+ script = textwrap.dedent(
122
+ COMPLETION_SCRIPTS.get(options.shell, "").format(prog=get_prog())
123
+ )
124
+ print(BASE_COMPLETION.format(script=script, shell=options.shell))
125
+ return SUCCESS
126
+ else:
127
+ sys.stderr.write(
128
+ "ERROR: You must pass {}\n".format(" or ".join(shell_options))
129
+ )
130
+ return SUCCESS
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/configuration.py ADDED
@@ -0,0 +1,282 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ import os
3
+ import subprocess
4
+ from optparse import Values
5
+ from typing import Any, List, Optional
6
+
7
+ from pip._internal.cli.base_command import Command
8
+ from pip._internal.cli.status_codes import ERROR, SUCCESS
9
+ from pip._internal.configuration import (
10
+ Configuration,
11
+ Kind,
12
+ get_configuration_files,
13
+ kinds,
14
+ )
15
+ from pip._internal.exceptions import PipError
16
+ from pip._internal.utils.logging import indent_log
17
+ from pip._internal.utils.misc import get_prog, write_output
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ class ConfigurationCommand(Command):
23
+ """
24
+ Manage local and global configuration.
25
+
26
+ Subcommands:
27
+
28
+ - list: List the active configuration (or from the file specified)
29
+ - edit: Edit the configuration file in an editor
30
+ - get: Get the value associated with command.option
31
+ - set: Set the command.option=value
32
+ - unset: Unset the value associated with command.option
33
+ - debug: List the configuration files and values defined under them
34
+
35
+ Configuration keys should be dot separated command and option name,
36
+ with the special prefix "global" affecting any command. For example,
37
+ "pip config set global.index-url https://example.org/" would configure
38
+ the index url for all commands, but "pip config set download.timeout 10"
39
+ would configure a 10 second timeout only for "pip download" commands.
40
+
41
+ If none of --user, --global and --site are passed, a virtual
42
+ environment configuration file is used if one is active and the file
43
+ exists. Otherwise, all modifications happen to the user file by
44
+ default.
45
+ """
46
+
47
+ ignore_require_venv = True
48
+ usage = """
49
+ %prog [<file-option>] list
50
+ %prog [<file-option>] [--editor <editor-path>] edit
51
+
52
+ %prog [<file-option>] get command.option
53
+ %prog [<file-option>] set command.option value
54
+ %prog [<file-option>] unset command.option
55
+ %prog [<file-option>] debug
56
+ """
57
+
58
+ def add_options(self) -> None:
59
+ self.cmd_opts.add_option(
60
+ "--editor",
61
+ dest="editor",
62
+ action="store",
63
+ default=None,
64
+ help=(
65
+ "Editor to use to edit the file. Uses VISUAL or EDITOR "
66
+ "environment variables if not provided."
67
+ ),
68
+ )
69
+
70
+ self.cmd_opts.add_option(
71
+ "--global",
72
+ dest="global_file",
73
+ action="store_true",
74
+ default=False,
75
+ help="Use the system-wide configuration file only",
76
+ )
77
+
78
+ self.cmd_opts.add_option(
79
+ "--user",
80
+ dest="user_file",
81
+ action="store_true",
82
+ default=False,
83
+ help="Use the user configuration file only",
84
+ )
85
+
86
+ self.cmd_opts.add_option(
87
+ "--site",
88
+ dest="site_file",
89
+ action="store_true",
90
+ default=False,
91
+ help="Use the current environment configuration file only",
92
+ )
93
+
94
+ self.parser.insert_option_group(0, self.cmd_opts)
95
+
96
+ def run(self, options: Values, args: List[str]) -> int:
97
+ handlers = {
98
+ "list": self.list_values,
99
+ "edit": self.open_in_editor,
100
+ "get": self.get_name,
101
+ "set": self.set_name_value,
102
+ "unset": self.unset_name,
103
+ "debug": self.list_config_values,
104
+ }
105
+
106
+ # Determine action
107
+ if not args or args[0] not in handlers:
108
+ logger.error(
109
+ "Need an action (%s) to perform.",
110
+ ", ".join(sorted(handlers)),
111
+ )
112
+ return ERROR
113
+
114
+ action = args[0]
115
+
116
+ # Determine which configuration files are to be loaded
117
+ # Depends on whether the command is modifying.
118
+ try:
119
+ load_only = self._determine_file(
120
+ options, need_value=(action in ["get", "set", "unset", "edit"])
121
+ )
122
+ except PipError as e:
123
+ logger.error(e.args[0])
124
+ return ERROR
125
+
126
+ # Load a new configuration
127
+ self.configuration = Configuration(
128
+ isolated=options.isolated_mode, load_only=load_only
129
+ )
130
+ self.configuration.load()
131
+
132
+ # Error handling happens here, not in the action-handlers.
133
+ try:
134
+ handlers[action](options, args[1:])
135
+ except PipError as e:
136
+ logger.error(e.args[0])
137
+ return ERROR
138
+
139
+ return SUCCESS
140
+
141
+ def _determine_file(self, options: Values, need_value: bool) -> Optional[Kind]:
142
+ file_options = [
143
+ key
144
+ for key, value in (
145
+ (kinds.USER, options.user_file),
146
+ (kinds.GLOBAL, options.global_file),
147
+ (kinds.SITE, options.site_file),
148
+ )
149
+ if value
150
+ ]
151
+
152
+ if not file_options:
153
+ if not need_value:
154
+ return None
155
+ # Default to user, unless there's a site file.
156
+ elif any(
157
+ os.path.exists(site_config_file)
158
+ for site_config_file in get_configuration_files()[kinds.SITE]
159
+ ):
160
+ return kinds.SITE
161
+ else:
162
+ return kinds.USER
163
+ elif len(file_options) == 1:
164
+ return file_options[0]
165
+
166
+ raise PipError(
167
+ "Need exactly one file to operate upon "
168
+ "(--user, --site, --global) to perform."
169
+ )
170
+
171
+ def list_values(self, options: Values, args: List[str]) -> None:
172
+ self._get_n_args(args, "list", n=0)
173
+
174
+ for key, value in sorted(self.configuration.items()):
175
+ write_output("%s=%r", key, value)
176
+
177
+ def get_name(self, options: Values, args: List[str]) -> None:
178
+ key = self._get_n_args(args, "get [name]", n=1)
179
+ value = self.configuration.get_value(key)
180
+
181
+ write_output("%s", value)
182
+
183
+ def set_name_value(self, options: Values, args: List[str]) -> None:
184
+ key, value = self._get_n_args(args, "set [name] [value]", n=2)
185
+ self.configuration.set_value(key, value)
186
+
187
+ self._save_configuration()
188
+
189
+ def unset_name(self, options: Values, args: List[str]) -> None:
190
+ key = self._get_n_args(args, "unset [name]", n=1)
191
+ self.configuration.unset_value(key)
192
+
193
+ self._save_configuration()
194
+
195
+ def list_config_values(self, options: Values, args: List[str]) -> None:
196
+ """List config key-value pairs across different config files"""
197
+ self._get_n_args(args, "debug", n=0)
198
+
199
+ self.print_env_var_values()
200
+ # Iterate over config files and print if they exist, and the
201
+ # key-value pairs present in them if they do
202
+ for variant, files in sorted(self.configuration.iter_config_files()):
203
+ write_output("%s:", variant)
204
+ for fname in files:
205
+ with indent_log():
206
+ file_exists = os.path.exists(fname)
207
+ write_output("%s, exists: %r", fname, file_exists)
208
+ if file_exists:
209
+ self.print_config_file_values(variant)
210
+
211
+ def print_config_file_values(self, variant: Kind) -> None:
212
+ """Get key-value pairs from the file of a variant"""
213
+ for name, value in self.configuration.get_values_in_config(variant).items():
214
+ with indent_log():
215
+ write_output("%s: %s", name, value)
216
+
217
+ def print_env_var_values(self) -> None:
218
+ """Get key-values pairs present as environment variables"""
219
+ write_output("%s:", "env_var")
220
+ with indent_log():
221
+ for key, value in sorted(self.configuration.get_environ_vars()):
222
+ env_var = f"PIP_{key.upper()}"
223
+ write_output("%s=%r", env_var, value)
224
+
225
+ def open_in_editor(self, options: Values, args: List[str]) -> None:
226
+ editor = self._determine_editor(options)
227
+
228
+ fname = self.configuration.get_file_to_edit()
229
+ if fname is None:
230
+ raise PipError("Could not determine appropriate file.")
231
+ elif '"' in fname:
232
+ # This shouldn't happen, unless we see a username like that.
233
+ # If that happens, we'd appreciate a pull request fixing this.
234
+ raise PipError(
235
+ f'Can not open an editor for a file name containing "\n{fname}'
236
+ )
237
+
238
+ try:
239
+ subprocess.check_call(f'{editor} "{fname}"', shell=True)
240
+ except FileNotFoundError as e:
241
+ if not e.filename:
242
+ e.filename = editor
243
+ raise
244
+ except subprocess.CalledProcessError as e:
245
+ raise PipError(
246
+ "Editor Subprocess exited with exit code {}".format(e.returncode)
247
+ )
248
+
249
+ def _get_n_args(self, args: List[str], example: str, n: int) -> Any:
250
+ """Helper to make sure the command got the right number of arguments"""
251
+ if len(args) != n:
252
+ msg = (
253
+ "Got unexpected number of arguments, expected {}. "
254
+ '(example: "{} config {}")'
255
+ ).format(n, get_prog(), example)
256
+ raise PipError(msg)
257
+
258
+ if n == 1:
259
+ return args[0]
260
+ else:
261
+ return args
262
+
263
+ def _save_configuration(self) -> None:
264
+ # We successfully ran a modifying command. Need to save the
265
+ # configuration.
266
+ try:
267
+ self.configuration.save()
268
+ except Exception:
269
+ logger.exception(
270
+ "Unable to save configuration. Please report this as a bug."
271
+ )
272
+ raise PipError("Internal Error.")
273
+
274
+ def _determine_editor(self, options: Values) -> str:
275
+ if options.editor is not None:
276
+ return options.editor
277
+ elif "VISUAL" in os.environ:
278
+ return os.environ["VISUAL"]
279
+ elif "EDITOR" in os.environ:
280
+ return os.environ["EDITOR"]
281
+ else:
282
+ raise PipError("Could not determine editor to use.")
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/debug.py ADDED
@@ -0,0 +1,203 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import importlib.resources
2
+ import locale
3
+ import logging
4
+ import os
5
+ import sys
6
+ from optparse import Values
7
+ from types import ModuleType
8
+ from typing import Any, Dict, List, Optional
9
+
10
+ import pip._vendor
11
+ from pip._vendor.certifi import where
12
+ from pip._vendor.packaging.version import parse as parse_version
13
+
14
+ from pip._internal.cli import cmdoptions
15
+ from pip._internal.cli.base_command import Command
16
+ from pip._internal.cli.cmdoptions import make_target_python
17
+ from pip._internal.cli.status_codes import SUCCESS
18
+ from pip._internal.configuration import Configuration
19
+ from pip._internal.metadata import get_environment
20
+ from pip._internal.utils.logging import indent_log
21
+ from pip._internal.utils.misc import get_pip_version
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ def show_value(name: str, value: Any) -> None:
27
+ logger.info("%s: %s", name, value)
28
+
29
+
30
+ def show_sys_implementation() -> None:
31
+ logger.info("sys.implementation:")
32
+ implementation_name = sys.implementation.name
33
+ with indent_log():
34
+ show_value("name", implementation_name)
35
+
36
+
37
+ def create_vendor_txt_map() -> Dict[str, str]:
38
+ with importlib.resources.open_text("pip._vendor", "vendor.txt") as f:
39
+ # Purge non version specifying lines.
40
+ # Also, remove any space prefix or suffixes (including comments).
41
+ lines = [
42
+ line.strip().split(" ", 1)[0] for line in f.readlines() if "==" in line
43
+ ]
44
+
45
+ # Transform into "module" -> version dict.
46
+ return dict(line.split("==", 1) for line in lines)
47
+
48
+
49
+ def get_module_from_module_name(module_name: str) -> Optional[ModuleType]:
50
+ # Module name can be uppercase in vendor.txt for some reason...
51
+ module_name = module_name.lower().replace("-", "_")
52
+ # PATCH: setuptools is actually only pkg_resources.
53
+ if module_name == "setuptools":
54
+ module_name = "pkg_resources"
55
+
56
+ try:
57
+ __import__(f"pip._vendor.{module_name}", globals(), locals(), level=0)
58
+ return getattr(pip._vendor, module_name)
59
+ except ImportError:
60
+ # We allow 'truststore' to fail to import due
61
+ # to being unavailable on Python 3.9 and earlier.
62
+ if module_name == "truststore" and sys.version_info < (3, 10):
63
+ return None
64
+ raise
65
+
66
+
67
+ def get_vendor_version_from_module(module_name: str) -> Optional[str]:
68
+ module = get_module_from_module_name(module_name)
69
+ version = getattr(module, "__version__", None)
70
+
71
+ if module and not version:
72
+ # Try to find version in debundled module info.
73
+ assert module.__file__ is not None
74
+ env = get_environment([os.path.dirname(module.__file__)])
75
+ dist = env.get_distribution(module_name)
76
+ if dist:
77
+ version = str(dist.version)
78
+
79
+ return version
80
+
81
+
82
+ def show_actual_vendor_versions(vendor_txt_versions: Dict[str, str]) -> None:
83
+ """Log the actual version and print extra info if there is
84
+ a conflict or if the actual version could not be imported.
85
+ """
86
+ for module_name, expected_version in vendor_txt_versions.items():
87
+ extra_message = ""
88
+ actual_version = get_vendor_version_from_module(module_name)
89
+ if not actual_version:
90
+ extra_message = (
91
+ " (Unable to locate actual module version, using"
92
+ " vendor.txt specified version)"
93
+ )
94
+ actual_version = expected_version
95
+ elif parse_version(actual_version) != parse_version(expected_version):
96
+ extra_message = (
97
+ " (CONFLICT: vendor.txt suggests version should"
98
+ " be {})".format(expected_version)
99
+ )
100
+ logger.info("%s==%s%s", module_name, actual_version, extra_message)
101
+
102
+
103
+ def show_vendor_versions() -> None:
104
+ logger.info("vendored library versions:")
105
+
106
+ vendor_txt_versions = create_vendor_txt_map()
107
+ with indent_log():
108
+ show_actual_vendor_versions(vendor_txt_versions)
109
+
110
+
111
+ def show_tags(options: Values) -> None:
112
+ tag_limit = 10
113
+
114
+ target_python = make_target_python(options)
115
+ tags = target_python.get_sorted_tags()
116
+
117
+ # Display the target options that were explicitly provided.
118
+ formatted_target = target_python.format_given()
119
+ suffix = ""
120
+ if formatted_target:
121
+ suffix = f" (target: {formatted_target})"
122
+
123
+ msg = "Compatible tags: {}{}".format(len(tags), suffix)
124
+ logger.info(msg)
125
+
126
+ if options.verbose < 1 and len(tags) > tag_limit:
127
+ tags_limited = True
128
+ tags = tags[:tag_limit]
129
+ else:
130
+ tags_limited = False
131
+
132
+ with indent_log():
133
+ for tag in tags:
134
+ logger.info(str(tag))
135
+
136
+ if tags_limited:
137
+ msg = (
138
+ "...\n[First {tag_limit} tags shown. Pass --verbose to show all.]"
139
+ ).format(tag_limit=tag_limit)
140
+ logger.info(msg)
141
+
142
+
143
+ def ca_bundle_info(config: Configuration) -> str:
144
+ levels = {key.split(".", 1)[0] for key, _ in config.items()}
145
+ if not levels:
146
+ return "Not specified"
147
+
148
+ levels_that_override_global = ["install", "wheel", "download"]
149
+ global_overriding_level = [
150
+ level for level in levels if level in levels_that_override_global
151
+ ]
152
+ if not global_overriding_level:
153
+ return "global"
154
+
155
+ if "global" in levels:
156
+ levels.remove("global")
157
+ return ", ".join(levels)
158
+
159
+
160
+ class DebugCommand(Command):
161
+ """
162
+ Display debug information.
163
+ """
164
+
165
+ usage = """
166
+ %prog <options>"""
167
+ ignore_require_venv = True
168
+
169
+ def add_options(self) -> None:
170
+ cmdoptions.add_target_python_options(self.cmd_opts)
171
+ self.parser.insert_option_group(0, self.cmd_opts)
172
+ self.parser.config.load()
173
+
174
+ def run(self, options: Values, args: List[str]) -> int:
175
+ logger.warning(
176
+ "This command is only meant for debugging. "
177
+ "Do not use this with automation for parsing and getting these "
178
+ "details, since the output and options of this command may "
179
+ "change without notice."
180
+ )
181
+ show_value("pip version", get_pip_version())
182
+ show_value("sys.version", sys.version)
183
+ show_value("sys.executable", sys.executable)
184
+ show_value("sys.getdefaultencoding", sys.getdefaultencoding())
185
+ show_value("sys.getfilesystemencoding", sys.getfilesystemencoding())
186
+ show_value(
187
+ "locale.getpreferredencoding",
188
+ locale.getpreferredencoding(),
189
+ )
190
+ show_value("sys.platform", sys.platform)
191
+ show_sys_implementation()
192
+
193
+ show_value("'cert' config value", ca_bundle_info(self.parser.config))
194
+ show_value("REQUESTS_CA_BUNDLE", os.environ.get("REQUESTS_CA_BUNDLE"))
195
+ show_value("CURL_CA_BUNDLE", os.environ.get("CURL_CA_BUNDLE"))
196
+ show_value("pip._vendor.certifi.where()", where())
197
+ show_value("pip._vendor.DEBUNDLED", pip._vendor.DEBUNDLED)
198
+
199
+ show_vendor_versions()
200
+
201
+ show_tags(options)
202
+
203
+ return SUCCESS
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/download.py ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ import os
3
+ from optparse import Values
4
+ from typing import List
5
+
6
+ from pip._internal.cli import cmdoptions
7
+ from pip._internal.cli.cmdoptions import make_target_python
8
+ from pip._internal.cli.req_command import RequirementCommand, with_cleanup
9
+ from pip._internal.cli.status_codes import SUCCESS
10
+ from pip._internal.operations.build.build_tracker import get_build_tracker
11
+ from pip._internal.req.req_install import check_legacy_setup_py_options
12
+ from pip._internal.utils.misc import ensure_dir, normalize_path, write_output
13
+ from pip._internal.utils.temp_dir import TempDirectory
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ class DownloadCommand(RequirementCommand):
19
+ """
20
+ Download packages from:
21
+
22
+ - PyPI (and other indexes) using requirement specifiers.
23
+ - VCS project urls.
24
+ - Local project directories.
25
+ - Local or remote source archives.
26
+
27
+ pip also supports downloading from "requirements files", which provide
28
+ an easy way to specify a whole environment to be downloaded.
29
+ """
30
+
31
+ usage = """
32
+ %prog [options] <requirement specifier> [package-index-options] ...
33
+ %prog [options] -r <requirements file> [package-index-options] ...
34
+ %prog [options] <vcs project url> ...
35
+ %prog [options] <local project path> ...
36
+ %prog [options] <archive url/path> ..."""
37
+
38
+ def add_options(self) -> None:
39
+ self.cmd_opts.add_option(cmdoptions.constraints())
40
+ self.cmd_opts.add_option(cmdoptions.requirements())
41
+ self.cmd_opts.add_option(cmdoptions.no_deps())
42
+ self.cmd_opts.add_option(cmdoptions.global_options())
43
+ self.cmd_opts.add_option(cmdoptions.no_binary())
44
+ self.cmd_opts.add_option(cmdoptions.only_binary())
45
+ self.cmd_opts.add_option(cmdoptions.prefer_binary())
46
+ self.cmd_opts.add_option(cmdoptions.src())
47
+ self.cmd_opts.add_option(cmdoptions.pre())
48
+ self.cmd_opts.add_option(cmdoptions.require_hashes())
49
+ self.cmd_opts.add_option(cmdoptions.progress_bar())
50
+ self.cmd_opts.add_option(cmdoptions.no_build_isolation())
51
+ self.cmd_opts.add_option(cmdoptions.use_pep517())
52
+ self.cmd_opts.add_option(cmdoptions.no_use_pep517())
53
+ self.cmd_opts.add_option(cmdoptions.check_build_deps())
54
+ self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
55
+
56
+ self.cmd_opts.add_option(
57
+ "-d",
58
+ "--dest",
59
+ "--destination-dir",
60
+ "--destination-directory",
61
+ dest="download_dir",
62
+ metavar="dir",
63
+ default=os.curdir,
64
+ help="Download packages into <dir>.",
65
+ )
66
+
67
+ cmdoptions.add_target_python_options(self.cmd_opts)
68
+
69
+ index_opts = cmdoptions.make_option_group(
70
+ cmdoptions.index_group,
71
+ self.parser,
72
+ )
73
+
74
+ self.parser.insert_option_group(0, index_opts)
75
+ self.parser.insert_option_group(0, self.cmd_opts)
76
+
77
+ @with_cleanup
78
+ def run(self, options: Values, args: List[str]) -> int:
79
+ options.ignore_installed = True
80
+ # editable doesn't really make sense for `pip download`, but the bowels
81
+ # of the RequirementSet code require that property.
82
+ options.editables = []
83
+
84
+ cmdoptions.check_dist_restriction(options)
85
+
86
+ options.download_dir = normalize_path(options.download_dir)
87
+ ensure_dir(options.download_dir)
88
+
89
+ session = self.get_default_session(options)
90
+
91
+ target_python = make_target_python(options)
92
+ finder = self._build_package_finder(
93
+ options=options,
94
+ session=session,
95
+ target_python=target_python,
96
+ ignore_requires_python=options.ignore_requires_python,
97
+ )
98
+
99
+ build_tracker = self.enter_context(get_build_tracker())
100
+
101
+ directory = TempDirectory(
102
+ delete=not options.no_clean,
103
+ kind="download",
104
+ globally_managed=True,
105
+ )
106
+
107
+ reqs = self.get_requirements(args, options, finder, session)
108
+ check_legacy_setup_py_options(options, reqs)
109
+
110
+ preparer = self.make_requirement_preparer(
111
+ temp_build_dir=directory,
112
+ options=options,
113
+ build_tracker=build_tracker,
114
+ session=session,
115
+ finder=finder,
116
+ download_dir=options.download_dir,
117
+ use_user_site=False,
118
+ verbosity=self.verbosity,
119
+ )
120
+
121
+ resolver = self.make_resolver(
122
+ preparer=preparer,
123
+ finder=finder,
124
+ options=options,
125
+ ignore_requires_python=options.ignore_requires_python,
126
+ use_pep517=options.use_pep517,
127
+ py_version_info=options.python_version,
128
+ )
129
+
130
+ self.trace_basic_info(finder)
131
+
132
+ requirement_set = resolver.resolve(reqs, check_supported_wheels=True)
133
+
134
+ downloaded: List[str] = []
135
+ for req in requirement_set.requirements.values():
136
+ if req.satisfied_by is None:
137
+ assert req.name is not None
138
+ preparer.save_linked_requirement(req)
139
+ downloaded.append(req.name)
140
+
141
+ preparer.prepare_linked_requirements_more(requirement_set.requirements.values())
142
+ requirement_set.warn_legacy_versions_and_specifiers()
143
+
144
+ if downloaded:
145
+ write_output("Successfully downloaded %s", " ".join(downloaded))
146
+
147
+ return SUCCESS
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/freeze.py ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import sys
2
+ from optparse import Values
3
+ from typing import AbstractSet, List
4
+
5
+ from pip._internal.cli import cmdoptions
6
+ from pip._internal.cli.base_command import Command
7
+ from pip._internal.cli.status_codes import SUCCESS
8
+ from pip._internal.operations.freeze import freeze
9
+ from pip._internal.utils.compat import stdlib_pkgs
10
+
11
+
12
+ def _should_suppress_build_backends() -> bool:
13
+ return sys.version_info < (3, 12)
14
+
15
+
16
+ def _dev_pkgs() -> AbstractSet[str]:
17
+ pkgs = {"pip"}
18
+
19
+ if _should_suppress_build_backends():
20
+ pkgs |= {"setuptools", "distribute", "wheel"}
21
+
22
+ return pkgs
23
+
24
+
25
+ class FreezeCommand(Command):
26
+ """
27
+ Output installed packages in requirements format.
28
+
29
+ packages are listed in a case-insensitive sorted order.
30
+ """
31
+
32
+ usage = """
33
+ %prog [options]"""
34
+ log_streams = ("ext://sys.stderr", "ext://sys.stderr")
35
+
36
+ def add_options(self) -> None:
37
+ self.cmd_opts.add_option(
38
+ "-r",
39
+ "--requirement",
40
+ dest="requirements",
41
+ action="append",
42
+ default=[],
43
+ metavar="file",
44
+ help=(
45
+ "Use the order in the given requirements file and its "
46
+ "comments when generating output. This option can be "
47
+ "used multiple times."
48
+ ),
49
+ )
50
+ self.cmd_opts.add_option(
51
+ "-l",
52
+ "--local",
53
+ dest="local",
54
+ action="store_true",
55
+ default=False,
56
+ help=(
57
+ "If in a virtualenv that has global access, do not output "
58
+ "globally-installed packages."
59
+ ),
60
+ )
61
+ self.cmd_opts.add_option(
62
+ "--user",
63
+ dest="user",
64
+ action="store_true",
65
+ default=False,
66
+ help="Only output packages installed in user-site.",
67
+ )
68
+ self.cmd_opts.add_option(cmdoptions.list_path())
69
+ self.cmd_opts.add_option(
70
+ "--all",
71
+ dest="freeze_all",
72
+ action="store_true",
73
+ help=(
74
+ "Do not skip these packages in the output:"
75
+ " {}".format(", ".join(_dev_pkgs()))
76
+ ),
77
+ )
78
+ self.cmd_opts.add_option(
79
+ "--exclude-editable",
80
+ dest="exclude_editable",
81
+ action="store_true",
82
+ help="Exclude editable package from output.",
83
+ )
84
+ self.cmd_opts.add_option(cmdoptions.list_exclude())
85
+
86
+ self.parser.insert_option_group(0, self.cmd_opts)
87
+
88
+ def run(self, options: Values, args: List[str]) -> int:
89
+ skip = set(stdlib_pkgs)
90
+ if not options.freeze_all:
91
+ skip.update(_dev_pkgs())
92
+
93
+ if options.excludes:
94
+ skip.update(options.excludes)
95
+
96
+ cmdoptions.check_list_path_option(options)
97
+
98
+ for line in freeze(
99
+ requirement=options.requirements,
100
+ local_only=options.local,
101
+ user_only=options.user,
102
+ paths=options.path,
103
+ isolated=options.isolated_mode,
104
+ skip=skip,
105
+ exclude_editable=options.exclude_editable,
106
+ ):
107
+ sys.stdout.write(line + "\n")
108
+ return SUCCESS
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/hash.py ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import hashlib
2
+ import logging
3
+ import sys
4
+ from optparse import Values
5
+ from typing import List
6
+
7
+ from pip._internal.cli.base_command import Command
8
+ from pip._internal.cli.status_codes import ERROR, SUCCESS
9
+ from pip._internal.utils.hashes import FAVORITE_HASH, STRONG_HASHES
10
+ from pip._internal.utils.misc import read_chunks, write_output
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ class HashCommand(Command):
16
+ """
17
+ Compute a hash of a local package archive.
18
+
19
+ These can be used with --hash in a requirements file to do repeatable
20
+ installs.
21
+ """
22
+
23
+ usage = "%prog [options] <file> ..."
24
+ ignore_require_venv = True
25
+
26
+ def add_options(self) -> None:
27
+ self.cmd_opts.add_option(
28
+ "-a",
29
+ "--algorithm",
30
+ dest="algorithm",
31
+ choices=STRONG_HASHES,
32
+ action="store",
33
+ default=FAVORITE_HASH,
34
+ help="The hash algorithm to use: one of {}".format(
35
+ ", ".join(STRONG_HASHES)
36
+ ),
37
+ )
38
+ self.parser.insert_option_group(0, self.cmd_opts)
39
+
40
+ def run(self, options: Values, args: List[str]) -> int:
41
+ if not args:
42
+ self.parser.print_usage(sys.stderr)
43
+ return ERROR
44
+
45
+ algorithm = options.algorithm
46
+ for path in args:
47
+ write_output(
48
+ "%s:\n--hash=%s:%s", path, algorithm, _hash_of_file(path, algorithm)
49
+ )
50
+ return SUCCESS
51
+
52
+
53
+ def _hash_of_file(path: str, algorithm: str) -> str:
54
+ """Return the hash digest of a file."""
55
+ with open(path, "rb") as archive:
56
+ hash = hashlib.new(algorithm)
57
+ for chunk in read_chunks(archive):
58
+ hash.update(chunk)
59
+ return hash.hexdigest()
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/help.py ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from optparse import Values
2
+ from typing import List
3
+
4
+ from pip._internal.cli.base_command import Command
5
+ from pip._internal.cli.status_codes import SUCCESS
6
+ from pip._internal.exceptions import CommandError
7
+
8
+
9
+ class HelpCommand(Command):
10
+ """Show help for commands"""
11
+
12
+ usage = """
13
+ %prog <command>"""
14
+ ignore_require_venv = True
15
+
16
+ def run(self, options: Values, args: List[str]) -> int:
17
+ from pip._internal.commands import (
18
+ commands_dict,
19
+ create_command,
20
+ get_similar_commands,
21
+ )
22
+
23
+ try:
24
+ # 'pip help' with no args is handled by pip.__init__.parseopt()
25
+ cmd_name = args[0] # the command we need help for
26
+ except IndexError:
27
+ return SUCCESS
28
+
29
+ if cmd_name not in commands_dict:
30
+ guess = get_similar_commands(cmd_name)
31
+
32
+ msg = [f'unknown command "{cmd_name}"']
33
+ if guess:
34
+ msg.append(f'maybe you meant "{guess}"')
35
+
36
+ raise CommandError(" - ".join(msg))
37
+
38
+ command = create_command(cmd_name)
39
+ command.parser.print_help()
40
+
41
+ return SUCCESS
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/index.py ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ from optparse import Values
3
+ from typing import Any, Iterable, List, Optional, Union
4
+
5
+ from pip._vendor.packaging.version import LegacyVersion, Version
6
+
7
+ from pip._internal.cli import cmdoptions
8
+ from pip._internal.cli.req_command import IndexGroupCommand
9
+ from pip._internal.cli.status_codes import ERROR, SUCCESS
10
+ from pip._internal.commands.search import print_dist_installation_info
11
+ from pip._internal.exceptions import CommandError, DistributionNotFound, PipError
12
+ from pip._internal.index.collector import LinkCollector
13
+ from pip._internal.index.package_finder import PackageFinder
14
+ from pip._internal.models.selection_prefs import SelectionPreferences
15
+ from pip._internal.models.target_python import TargetPython
16
+ from pip._internal.network.session import PipSession
17
+ from pip._internal.utils.misc import write_output
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ class IndexCommand(IndexGroupCommand):
23
+ """
24
+ Inspect information available from package indexes.
25
+ """
26
+
27
+ ignore_require_venv = True
28
+ usage = """
29
+ %prog versions <package>
30
+ """
31
+
32
+ def add_options(self) -> None:
33
+ cmdoptions.add_target_python_options(self.cmd_opts)
34
+
35
+ self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
36
+ self.cmd_opts.add_option(cmdoptions.pre())
37
+ self.cmd_opts.add_option(cmdoptions.no_binary())
38
+ self.cmd_opts.add_option(cmdoptions.only_binary())
39
+
40
+ index_opts = cmdoptions.make_option_group(
41
+ cmdoptions.index_group,
42
+ self.parser,
43
+ )
44
+
45
+ self.parser.insert_option_group(0, index_opts)
46
+ self.parser.insert_option_group(0, self.cmd_opts)
47
+
48
+ def run(self, options: Values, args: List[str]) -> int:
49
+ handlers = {
50
+ "versions": self.get_available_package_versions,
51
+ }
52
+
53
+ logger.warning(
54
+ "pip index is currently an experimental command. "
55
+ "It may be removed/changed in a future release "
56
+ "without prior warning."
57
+ )
58
+
59
+ # Determine action
60
+ if not args or args[0] not in handlers:
61
+ logger.error(
62
+ "Need an action (%s) to perform.",
63
+ ", ".join(sorted(handlers)),
64
+ )
65
+ return ERROR
66
+
67
+ action = args[0]
68
+
69
+ # Error handling happens here, not in the action-handlers.
70
+ try:
71
+ handlers[action](options, args[1:])
72
+ except PipError as e:
73
+ logger.error(e.args[0])
74
+ return ERROR
75
+
76
+ return SUCCESS
77
+
78
+ def _build_package_finder(
79
+ self,
80
+ options: Values,
81
+ session: PipSession,
82
+ target_python: Optional[TargetPython] = None,
83
+ ignore_requires_python: Optional[bool] = None,
84
+ ) -> PackageFinder:
85
+ """
86
+ Create a package finder appropriate to the index command.
87
+ """
88
+ link_collector = LinkCollector.create(session, options=options)
89
+
90
+ # Pass allow_yanked=False to ignore yanked versions.
91
+ selection_prefs = SelectionPreferences(
92
+ allow_yanked=False,
93
+ allow_all_prereleases=options.pre,
94
+ ignore_requires_python=ignore_requires_python,
95
+ )
96
+
97
+ return PackageFinder.create(
98
+ link_collector=link_collector,
99
+ selection_prefs=selection_prefs,
100
+ target_python=target_python,
101
+ )
102
+
103
+ def get_available_package_versions(self, options: Values, args: List[Any]) -> None:
104
+ if len(args) != 1:
105
+ raise CommandError("You need to specify exactly one argument")
106
+
107
+ target_python = cmdoptions.make_target_python(options)
108
+ query = args[0]
109
+
110
+ with self._build_session(options) as session:
111
+ finder = self._build_package_finder(
112
+ options=options,
113
+ session=session,
114
+ target_python=target_python,
115
+ ignore_requires_python=options.ignore_requires_python,
116
+ )
117
+
118
+ versions: Iterable[Union[LegacyVersion, Version]] = (
119
+ candidate.version for candidate in finder.find_all_candidates(query)
120
+ )
121
+
122
+ if not options.pre:
123
+ # Remove prereleases
124
+ versions = (
125
+ version for version in versions if not version.is_prerelease
126
+ )
127
+ versions = set(versions)
128
+
129
+ if not versions:
130
+ raise DistributionNotFound(
131
+ "No matching distribution found for {}".format(query)
132
+ )
133
+
134
+ formatted_versions = [str(ver) for ver in sorted(versions, reverse=True)]
135
+ latest = formatted_versions[0]
136
+
137
+ write_output("{} ({})".format(query, latest))
138
+ write_output("Available versions: {}".format(", ".join(formatted_versions)))
139
+ print_dist_installation_info(query, latest)
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/inspect.py ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ from optparse import Values
3
+ from typing import Any, Dict, List
4
+
5
+ from pip._vendor.packaging.markers import default_environment
6
+ from pip._vendor.rich import print_json
7
+
8
+ from pip import __version__
9
+ from pip._internal.cli import cmdoptions
10
+ from pip._internal.cli.req_command import Command
11
+ from pip._internal.cli.status_codes import SUCCESS
12
+ from pip._internal.metadata import BaseDistribution, get_environment
13
+ from pip._internal.utils.compat import stdlib_pkgs
14
+ from pip._internal.utils.urls import path_to_url
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+
19
+ class InspectCommand(Command):
20
+ """
21
+ Inspect the content of a Python environment and produce a report in JSON format.
22
+ """
23
+
24
+ ignore_require_venv = True
25
+ usage = """
26
+ %prog [options]"""
27
+
28
+ def add_options(self) -> None:
29
+ self.cmd_opts.add_option(
30
+ "--local",
31
+ action="store_true",
32
+ default=False,
33
+ help=(
34
+ "If in a virtualenv that has global access, do not list "
35
+ "globally-installed packages."
36
+ ),
37
+ )
38
+ self.cmd_opts.add_option(
39
+ "--user",
40
+ dest="user",
41
+ action="store_true",
42
+ default=False,
43
+ help="Only output packages installed in user-site.",
44
+ )
45
+ self.cmd_opts.add_option(cmdoptions.list_path())
46
+ self.parser.insert_option_group(0, self.cmd_opts)
47
+
48
+ def run(self, options: Values, args: List[str]) -> int:
49
+ cmdoptions.check_list_path_option(options)
50
+ dists = get_environment(options.path).iter_installed_distributions(
51
+ local_only=options.local,
52
+ user_only=options.user,
53
+ skip=set(stdlib_pkgs),
54
+ )
55
+ output = {
56
+ "version": "1",
57
+ "pip_version": __version__,
58
+ "installed": [self._dist_to_dict(dist) for dist in dists],
59
+ "environment": default_environment(),
60
+ # TODO tags? scheme?
61
+ }
62
+ print_json(data=output)
63
+ return SUCCESS
64
+
65
+ def _dist_to_dict(self, dist: BaseDistribution) -> Dict[str, Any]:
66
+ res: Dict[str, Any] = {
67
+ "metadata": dist.metadata_dict,
68
+ "metadata_location": dist.info_location,
69
+ }
70
+ # direct_url. Note that we don't have download_info (as in the installation
71
+ # report) since it is not recorded in installed metadata.
72
+ direct_url = dist.direct_url
73
+ if direct_url is not None:
74
+ res["direct_url"] = direct_url.to_dict()
75
+ else:
76
+ # Emulate direct_url for legacy editable installs.
77
+ editable_project_location = dist.editable_project_location
78
+ if editable_project_location is not None:
79
+ res["direct_url"] = {
80
+ "url": path_to_url(editable_project_location),
81
+ "dir_info": {
82
+ "editable": True,
83
+ },
84
+ }
85
+ # installer
86
+ installer = dist.installer
87
+ if dist.installer:
88
+ res["installer"] = installer
89
+ # requested
90
+ if dist.installed_with_dist_info:
91
+ res["requested"] = dist.requested
92
+ return res
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/install.py ADDED
@@ -0,0 +1,778 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import errno
2
+ import json
3
+ import operator
4
+ import os
5
+ import shutil
6
+ import site
7
+ from optparse import SUPPRESS_HELP, Values
8
+ from typing import List, Optional
9
+
10
+ from pip._vendor.rich import print_json
11
+
12
+ from pip._internal.cache import WheelCache
13
+ from pip._internal.cli import cmdoptions
14
+ from pip._internal.cli.cmdoptions import make_target_python
15
+ from pip._internal.cli.req_command import (
16
+ RequirementCommand,
17
+ warn_if_run_as_root,
18
+ with_cleanup,
19
+ )
20
+ from pip._internal.cli.status_codes import ERROR, SUCCESS
21
+ from pip._internal.exceptions import CommandError, InstallationError
22
+ from pip._internal.locations import get_scheme
23
+ from pip._internal.metadata import get_environment
24
+ from pip._internal.models.installation_report import InstallationReport
25
+ from pip._internal.operations.build.build_tracker import get_build_tracker
26
+ from pip._internal.operations.check import ConflictDetails, check_install_conflicts
27
+ from pip._internal.req import install_given_reqs
28
+ from pip._internal.req.req_install import (
29
+ InstallRequirement,
30
+ check_legacy_setup_py_options,
31
+ )
32
+ from pip._internal.utils.compat import WINDOWS
33
+ from pip._internal.utils.filesystem import test_writable_dir
34
+ from pip._internal.utils.logging import getLogger
35
+ from pip._internal.utils.misc import (
36
+ check_externally_managed,
37
+ ensure_dir,
38
+ get_pip_version,
39
+ protect_pip_from_modification_on_windows,
40
+ write_output,
41
+ )
42
+ from pip._internal.utils.temp_dir import TempDirectory
43
+ from pip._internal.utils.virtualenv import (
44
+ running_under_virtualenv,
45
+ virtualenv_no_global,
46
+ )
47
+ from pip._internal.wheel_builder import build, should_build_for_install_command
48
+
49
+ logger = getLogger(__name__)
50
+
51
+
52
+ class InstallCommand(RequirementCommand):
53
+ """
54
+ Install packages from:
55
+
56
+ - PyPI (and other indexes) using requirement specifiers.
57
+ - VCS project urls.
58
+ - Local project directories.
59
+ - Local or remote source archives.
60
+
61
+ pip also supports installing from "requirements files", which provide
62
+ an easy way to specify a whole environment to be installed.
63
+ """
64
+
65
+ usage = """
66
+ %prog [options] <requirement specifier> [package-index-options] ...
67
+ %prog [options] -r <requirements file> [package-index-options] ...
68
+ %prog [options] [-e] <vcs project url> ...
69
+ %prog [options] [-e] <local project path> ...
70
+ %prog [options] <archive url/path> ..."""
71
+
72
+ def add_options(self) -> None:
73
+ self.cmd_opts.add_option(cmdoptions.requirements())
74
+ self.cmd_opts.add_option(cmdoptions.constraints())
75
+ self.cmd_opts.add_option(cmdoptions.no_deps())
76
+ self.cmd_opts.add_option(cmdoptions.pre())
77
+
78
+ self.cmd_opts.add_option(cmdoptions.editable())
79
+ self.cmd_opts.add_option(
80
+ "--dry-run",
81
+ action="store_true",
82
+ dest="dry_run",
83
+ default=False,
84
+ help=(
85
+ "Don't actually install anything, just print what would be. "
86
+ "Can be used in combination with --ignore-installed "
87
+ "to 'resolve' the requirements."
88
+ ),
89
+ )
90
+ self.cmd_opts.add_option(
91
+ "-t",
92
+ "--target",
93
+ dest="target_dir",
94
+ metavar="dir",
95
+ default=None,
96
+ help=(
97
+ "Install packages into <dir>. "
98
+ "By default this will not replace existing files/folders in "
99
+ "<dir>. Use --upgrade to replace existing packages in <dir> "
100
+ "with new versions."
101
+ ),
102
+ )
103
+ cmdoptions.add_target_python_options(self.cmd_opts)
104
+
105
+ self.cmd_opts.add_option(
106
+ "--user",
107
+ dest="use_user_site",
108
+ action="store_true",
109
+ help=(
110
+ "Install to the Python user install directory for your "
111
+ "platform. Typically ~/.local/, or %APPDATA%\\Python on "
112
+ "Windows. (See the Python documentation for site.USER_BASE "
113
+ "for full details.)"
114
+ ),
115
+ )
116
+ self.cmd_opts.add_option(
117
+ "--no-user",
118
+ dest="use_user_site",
119
+ action="store_false",
120
+ help=SUPPRESS_HELP,
121
+ )
122
+ self.cmd_opts.add_option(
123
+ "--root",
124
+ dest="root_path",
125
+ metavar="dir",
126
+ default=None,
127
+ help="Install everything relative to this alternate root directory.",
128
+ )
129
+ self.cmd_opts.add_option(
130
+ "--prefix",
131
+ dest="prefix_path",
132
+ metavar="dir",
133
+ default=None,
134
+ help=(
135
+ "Installation prefix where lib, bin and other top-level "
136
+ "folders are placed. Note that the resulting installation may "
137
+ "contain scripts and other resources which reference the "
138
+ "Python interpreter of pip, and not that of ``--prefix``. "
139
+ "See also the ``--python`` option if the intention is to "
140
+ "install packages into another (possibly pip-free) "
141
+ "environment."
142
+ ),
143
+ )
144
+
145
+ self.cmd_opts.add_option(cmdoptions.src())
146
+
147
+ self.cmd_opts.add_option(
148
+ "-U",
149
+ "--upgrade",
150
+ dest="upgrade",
151
+ action="store_true",
152
+ help=(
153
+ "Upgrade all specified packages to the newest available "
154
+ "version. The handling of dependencies depends on the "
155
+ "upgrade-strategy used."
156
+ ),
157
+ )
158
+
159
+ self.cmd_opts.add_option(
160
+ "--upgrade-strategy",
161
+ dest="upgrade_strategy",
162
+ default="only-if-needed",
163
+ choices=["only-if-needed", "eager"],
164
+ help=(
165
+ "Determines how dependency upgrading should be handled "
166
+ "[default: %default]. "
167
+ '"eager" - dependencies are upgraded regardless of '
168
+ "whether the currently installed version satisfies the "
169
+ "requirements of the upgraded package(s). "
170
+ '"only-if-needed" - are upgraded only when they do not '
171
+ "satisfy the requirements of the upgraded package(s)."
172
+ ),
173
+ )
174
+
175
+ self.cmd_opts.add_option(
176
+ "--force-reinstall",
177
+ dest="force_reinstall",
178
+ action="store_true",
179
+ help="Reinstall all packages even if they are already up-to-date.",
180
+ )
181
+
182
+ self.cmd_opts.add_option(
183
+ "-I",
184
+ "--ignore-installed",
185
+ dest="ignore_installed",
186
+ action="store_true",
187
+ help=(
188
+ "Ignore the installed packages, overwriting them. "
189
+ "This can break your system if the existing package "
190
+ "is of a different version or was installed "
191
+ "with a different package manager!"
192
+ ),
193
+ )
194
+
195
+ self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
196
+ self.cmd_opts.add_option(cmdoptions.no_build_isolation())
197
+ self.cmd_opts.add_option(cmdoptions.use_pep517())
198
+ self.cmd_opts.add_option(cmdoptions.no_use_pep517())
199
+ self.cmd_opts.add_option(cmdoptions.check_build_deps())
200
+ self.cmd_opts.add_option(cmdoptions.override_externally_managed())
201
+
202
+ self.cmd_opts.add_option(cmdoptions.config_settings())
203
+ self.cmd_opts.add_option(cmdoptions.global_options())
204
+
205
+ self.cmd_opts.add_option(
206
+ "--compile",
207
+ action="store_true",
208
+ dest="compile",
209
+ default=True,
210
+ help="Compile Python source files to bytecode",
211
+ )
212
+
213
+ self.cmd_opts.add_option(
214
+ "--no-compile",
215
+ action="store_false",
216
+ dest="compile",
217
+ help="Do not compile Python source files to bytecode",
218
+ )
219
+
220
+ self.cmd_opts.add_option(
221
+ "--no-warn-script-location",
222
+ action="store_false",
223
+ dest="warn_script_location",
224
+ default=True,
225
+ help="Do not warn when installing scripts outside PATH",
226
+ )
227
+ self.cmd_opts.add_option(
228
+ "--no-warn-conflicts",
229
+ action="store_false",
230
+ dest="warn_about_conflicts",
231
+ default=True,
232
+ help="Do not warn about broken dependencies",
233
+ )
234
+ self.cmd_opts.add_option(cmdoptions.no_binary())
235
+ self.cmd_opts.add_option(cmdoptions.only_binary())
236
+ self.cmd_opts.add_option(cmdoptions.prefer_binary())
237
+ self.cmd_opts.add_option(cmdoptions.require_hashes())
238
+ self.cmd_opts.add_option(cmdoptions.progress_bar())
239
+ self.cmd_opts.add_option(cmdoptions.root_user_action())
240
+
241
+ index_opts = cmdoptions.make_option_group(
242
+ cmdoptions.index_group,
243
+ self.parser,
244
+ )
245
+
246
+ self.parser.insert_option_group(0, index_opts)
247
+ self.parser.insert_option_group(0, self.cmd_opts)
248
+
249
+ self.cmd_opts.add_option(
250
+ "--report",
251
+ dest="json_report_file",
252
+ metavar="file",
253
+ default=None,
254
+ help=(
255
+ "Generate a JSON file describing what pip did to install "
256
+ "the provided requirements. "
257
+ "Can be used in combination with --dry-run and --ignore-installed "
258
+ "to 'resolve' the requirements. "
259
+ "When - is used as file name it writes to stdout. "
260
+ "When writing to stdout, please combine with the --quiet option "
261
+ "to avoid mixing pip logging output with JSON output."
262
+ ),
263
+ )
264
+
265
+ @with_cleanup
266
+ def run(self, options: Values, args: List[str]) -> int:
267
+ if options.use_user_site and options.target_dir is not None:
268
+ raise CommandError("Can not combine '--user' and '--target'")
269
+
270
+ # Check whether the environment we're installing into is externally
271
+ # managed, as specified in PEP 668. Specifying --root, --target, or
272
+ # --prefix disables the check, since there's no reliable way to locate
273
+ # the EXTERNALLY-MANAGED file for those cases. An exception is also
274
+ # made specifically for "--dry-run --report" for convenience.
275
+ installing_into_current_environment = (
276
+ not (options.dry_run and options.json_report_file)
277
+ and options.root_path is None
278
+ and options.target_dir is None
279
+ and options.prefix_path is None
280
+ )
281
+ if (
282
+ installing_into_current_environment
283
+ and not options.override_externally_managed
284
+ ):
285
+ check_externally_managed()
286
+
287
+ upgrade_strategy = "to-satisfy-only"
288
+ if options.upgrade:
289
+ upgrade_strategy = options.upgrade_strategy
290
+
291
+ cmdoptions.check_dist_restriction(options, check_target=True)
292
+
293
+ logger.verbose("Using %s", get_pip_version())
294
+ options.use_user_site = decide_user_install(
295
+ options.use_user_site,
296
+ prefix_path=options.prefix_path,
297
+ target_dir=options.target_dir,
298
+ root_path=options.root_path,
299
+ isolated_mode=options.isolated_mode,
300
+ )
301
+
302
+ target_temp_dir: Optional[TempDirectory] = None
303
+ target_temp_dir_path: Optional[str] = None
304
+ if options.target_dir:
305
+ options.ignore_installed = True
306
+ options.target_dir = os.path.abspath(options.target_dir)
307
+ if (
308
+ # fmt: off
309
+ os.path.exists(options.target_dir) and
310
+ not os.path.isdir(options.target_dir)
311
+ # fmt: on
312
+ ):
313
+ raise CommandError(
314
+ "Target path exists but is not a directory, will not continue."
315
+ )
316
+
317
+ # Create a target directory for using with the target option
318
+ target_temp_dir = TempDirectory(kind="target")
319
+ target_temp_dir_path = target_temp_dir.path
320
+ self.enter_context(target_temp_dir)
321
+
322
+ global_options = options.global_options or []
323
+
324
+ session = self.get_default_session(options)
325
+
326
+ target_python = make_target_python(options)
327
+ finder = self._build_package_finder(
328
+ options=options,
329
+ session=session,
330
+ target_python=target_python,
331
+ ignore_requires_python=options.ignore_requires_python,
332
+ )
333
+ build_tracker = self.enter_context(get_build_tracker())
334
+
335
+ directory = TempDirectory(
336
+ delete=not options.no_clean,
337
+ kind="install",
338
+ globally_managed=True,
339
+ )
340
+
341
+ try:
342
+ reqs = self.get_requirements(args, options, finder, session)
343
+ check_legacy_setup_py_options(options, reqs)
344
+
345
+ wheel_cache = WheelCache(options.cache_dir)
346
+
347
+ # Only when installing is it permitted to use PEP 660.
348
+ # In other circumstances (pip wheel, pip download) we generate
349
+ # regular (i.e. non editable) metadata and wheels.
350
+ for req in reqs:
351
+ req.permit_editable_wheels = True
352
+
353
+ preparer = self.make_requirement_preparer(
354
+ temp_build_dir=directory,
355
+ options=options,
356
+ build_tracker=build_tracker,
357
+ session=session,
358
+ finder=finder,
359
+ use_user_site=options.use_user_site,
360
+ verbosity=self.verbosity,
361
+ )
362
+ resolver = self.make_resolver(
363
+ preparer=preparer,
364
+ finder=finder,
365
+ options=options,
366
+ wheel_cache=wheel_cache,
367
+ use_user_site=options.use_user_site,
368
+ ignore_installed=options.ignore_installed,
369
+ ignore_requires_python=options.ignore_requires_python,
370
+ force_reinstall=options.force_reinstall,
371
+ upgrade_strategy=upgrade_strategy,
372
+ use_pep517=options.use_pep517,
373
+ )
374
+
375
+ self.trace_basic_info(finder)
376
+
377
+ requirement_set = resolver.resolve(
378
+ reqs, check_supported_wheels=not options.target_dir
379
+ )
380
+
381
+ if options.json_report_file:
382
+ report = InstallationReport(requirement_set.requirements_to_install)
383
+ if options.json_report_file == "-":
384
+ print_json(data=report.to_dict())
385
+ else:
386
+ with open(options.json_report_file, "w", encoding="utf-8") as f:
387
+ json.dump(report.to_dict(), f, indent=2, ensure_ascii=False)
388
+
389
+ if options.dry_run:
390
+ # In non dry-run mode, the legacy versions and specifiers check
391
+ # will be done as part of conflict detection.
392
+ requirement_set.warn_legacy_versions_and_specifiers()
393
+ would_install_items = sorted(
394
+ (r.metadata["name"], r.metadata["version"])
395
+ for r in requirement_set.requirements_to_install
396
+ )
397
+ if would_install_items:
398
+ write_output(
399
+ "Would install %s",
400
+ " ".join("-".join(item) for item in would_install_items),
401
+ )
402
+ return SUCCESS
403
+
404
+ try:
405
+ pip_req = requirement_set.get_requirement("pip")
406
+ except KeyError:
407
+ modifying_pip = False
408
+ else:
409
+ # If we're not replacing an already installed pip,
410
+ # we're not modifying it.
411
+ modifying_pip = pip_req.satisfied_by is None
412
+ protect_pip_from_modification_on_windows(modifying_pip=modifying_pip)
413
+
414
+ reqs_to_build = [
415
+ r
416
+ for r in requirement_set.requirements.values()
417
+ if should_build_for_install_command(r)
418
+ ]
419
+
420
+ _, build_failures = build(
421
+ reqs_to_build,
422
+ wheel_cache=wheel_cache,
423
+ verify=True,
424
+ build_options=[],
425
+ global_options=global_options,
426
+ )
427
+
428
+ if build_failures:
429
+ raise InstallationError(
430
+ "Could not build wheels for {}, which is required to "
431
+ "install pyproject.toml-based projects".format(
432
+ ", ".join(r.name for r in build_failures) # type: ignore
433
+ )
434
+ )
435
+
436
+ to_install = resolver.get_installation_order(requirement_set)
437
+
438
+ # Check for conflicts in the package set we're installing.
439
+ conflicts: Optional[ConflictDetails] = None
440
+ should_warn_about_conflicts = (
441
+ not options.ignore_dependencies and options.warn_about_conflicts
442
+ )
443
+ if should_warn_about_conflicts:
444
+ conflicts = self._determine_conflicts(to_install)
445
+
446
+ # Don't warn about script install locations if
447
+ # --target or --prefix has been specified
448
+ warn_script_location = options.warn_script_location
449
+ if options.target_dir or options.prefix_path:
450
+ warn_script_location = False
451
+
452
+ installed = install_given_reqs(
453
+ to_install,
454
+ global_options,
455
+ root=options.root_path,
456
+ home=target_temp_dir_path,
457
+ prefix=options.prefix_path,
458
+ warn_script_location=warn_script_location,
459
+ use_user_site=options.use_user_site,
460
+ pycompile=options.compile,
461
+ )
462
+
463
+ lib_locations = get_lib_location_guesses(
464
+ user=options.use_user_site,
465
+ home=target_temp_dir_path,
466
+ root=options.root_path,
467
+ prefix=options.prefix_path,
468
+ isolated=options.isolated_mode,
469
+ )
470
+ env = get_environment(lib_locations)
471
+
472
+ installed.sort(key=operator.attrgetter("name"))
473
+ items = []
474
+ for result in installed:
475
+ item = result.name
476
+ try:
477
+ installed_dist = env.get_distribution(item)
478
+ if installed_dist is not None:
479
+ item = f"{item}-{installed_dist.version}"
480
+ except Exception:
481
+ pass
482
+ items.append(item)
483
+
484
+ if conflicts is not None:
485
+ self._warn_about_conflicts(
486
+ conflicts,
487
+ resolver_variant=self.determine_resolver_variant(options),
488
+ )
489
+
490
+ installed_desc = " ".join(items)
491
+ if installed_desc:
492
+ write_output(
493
+ "Successfully installed %s",
494
+ installed_desc,
495
+ )
496
+ except OSError as error:
497
+ show_traceback = self.verbosity >= 1
498
+
499
+ message = create_os_error_message(
500
+ error,
501
+ show_traceback,
502
+ options.use_user_site,
503
+ )
504
+ logger.error(message, exc_info=show_traceback)
505
+
506
+ return ERROR
507
+
508
+ if options.target_dir:
509
+ assert target_temp_dir
510
+ self._handle_target_dir(
511
+ options.target_dir, target_temp_dir, options.upgrade
512
+ )
513
+ if options.root_user_action == "warn":
514
+ warn_if_run_as_root()
515
+ return SUCCESS
516
+
517
+ def _handle_target_dir(
518
+ self, target_dir: str, target_temp_dir: TempDirectory, upgrade: bool
519
+ ) -> None:
520
+ ensure_dir(target_dir)
521
+
522
+ # Checking both purelib and platlib directories for installed
523
+ # packages to be moved to target directory
524
+ lib_dir_list = []
525
+
526
+ # Checking both purelib and platlib directories for installed
527
+ # packages to be moved to target directory
528
+ scheme = get_scheme("", home=target_temp_dir.path)
529
+ purelib_dir = scheme.purelib
530
+ platlib_dir = scheme.platlib
531
+ data_dir = scheme.data
532
+
533
+ if os.path.exists(purelib_dir):
534
+ lib_dir_list.append(purelib_dir)
535
+ if os.path.exists(platlib_dir) and platlib_dir != purelib_dir:
536
+ lib_dir_list.append(platlib_dir)
537
+ if os.path.exists(data_dir):
538
+ lib_dir_list.append(data_dir)
539
+
540
+ for lib_dir in lib_dir_list:
541
+ for item in os.listdir(lib_dir):
542
+ if lib_dir == data_dir:
543
+ ddir = os.path.join(data_dir, item)
544
+ if any(s.startswith(ddir) for s in lib_dir_list[:-1]):
545
+ continue
546
+ target_item_dir = os.path.join(target_dir, item)
547
+ if os.path.exists(target_item_dir):
548
+ if not upgrade:
549
+ logger.warning(
550
+ "Target directory %s already exists. Specify "
551
+ "--upgrade to force replacement.",
552
+ target_item_dir,
553
+ )
554
+ continue
555
+ if os.path.islink(target_item_dir):
556
+ logger.warning(
557
+ "Target directory %s already exists and is "
558
+ "a link. pip will not automatically replace "
559
+ "links, please remove if replacement is "
560
+ "desired.",
561
+ target_item_dir,
562
+ )
563
+ continue
564
+ if os.path.isdir(target_item_dir):
565
+ shutil.rmtree(target_item_dir)
566
+ else:
567
+ os.remove(target_item_dir)
568
+
569
+ shutil.move(os.path.join(lib_dir, item), target_item_dir)
570
+
571
+ def _determine_conflicts(
572
+ self, to_install: List[InstallRequirement]
573
+ ) -> Optional[ConflictDetails]:
574
+ try:
575
+ return check_install_conflicts(to_install)
576
+ except Exception:
577
+ logger.exception(
578
+ "Error while checking for conflicts. Please file an issue on "
579
+ "pip's issue tracker: https://github.com/pypa/pip/issues/new"
580
+ )
581
+ return None
582
+
583
+ def _warn_about_conflicts(
584
+ self, conflict_details: ConflictDetails, resolver_variant: str
585
+ ) -> None:
586
+ package_set, (missing, conflicting) = conflict_details
587
+ if not missing and not conflicting:
588
+ return
589
+
590
+ parts: List[str] = []
591
+ if resolver_variant == "legacy":
592
+ parts.append(
593
+ "pip's legacy dependency resolver does not consider dependency "
594
+ "conflicts when selecting packages. This behaviour is the "
595
+ "source of the following dependency conflicts."
596
+ )
597
+ else:
598
+ assert resolver_variant == "resolvelib"
599
+ parts.append(
600
+ "pip's dependency resolver does not currently take into account "
601
+ "all the packages that are installed. This behaviour is the "
602
+ "source of the following dependency conflicts."
603
+ )
604
+
605
+ # NOTE: There is some duplication here, with commands/check.py
606
+ for project_name in missing:
607
+ version = package_set[project_name][0]
608
+ for dependency in missing[project_name]:
609
+ message = (
610
+ "{name} {version} requires {requirement}, "
611
+ "which is not installed."
612
+ ).format(
613
+ name=project_name,
614
+ version=version,
615
+ requirement=dependency[1],
616
+ )
617
+ parts.append(message)
618
+
619
+ for project_name in conflicting:
620
+ version = package_set[project_name][0]
621
+ for dep_name, dep_version, req in conflicting[project_name]:
622
+ message = (
623
+ "{name} {version} requires {requirement}, but {you} have "
624
+ "{dep_name} {dep_version} which is incompatible."
625
+ ).format(
626
+ name=project_name,
627
+ version=version,
628
+ requirement=req,
629
+ dep_name=dep_name,
630
+ dep_version=dep_version,
631
+ you=("you" if resolver_variant == "resolvelib" else "you'll"),
632
+ )
633
+ parts.append(message)
634
+
635
+ logger.critical("\n".join(parts))
636
+
637
+
638
+ def get_lib_location_guesses(
639
+ user: bool = False,
640
+ home: Optional[str] = None,
641
+ root: Optional[str] = None,
642
+ isolated: bool = False,
643
+ prefix: Optional[str] = None,
644
+ ) -> List[str]:
645
+ scheme = get_scheme(
646
+ "",
647
+ user=user,
648
+ home=home,
649
+ root=root,
650
+ isolated=isolated,
651
+ prefix=prefix,
652
+ )
653
+ return [scheme.purelib, scheme.platlib]
654
+
655
+
656
+ def site_packages_writable(root: Optional[str], isolated: bool) -> bool:
657
+ return all(
658
+ test_writable_dir(d)
659
+ for d in set(get_lib_location_guesses(root=root, isolated=isolated))
660
+ )
661
+
662
+
663
+ def decide_user_install(
664
+ use_user_site: Optional[bool],
665
+ prefix_path: Optional[str] = None,
666
+ target_dir: Optional[str] = None,
667
+ root_path: Optional[str] = None,
668
+ isolated_mode: bool = False,
669
+ ) -> bool:
670
+ """Determine whether to do a user install based on the input options.
671
+
672
+ If use_user_site is False, no additional checks are done.
673
+ If use_user_site is True, it is checked for compatibility with other
674
+ options.
675
+ If use_user_site is None, the default behaviour depends on the environment,
676
+ which is provided by the other arguments.
677
+ """
678
+ # In some cases (config from tox), use_user_site can be set to an integer
679
+ # rather than a bool, which 'use_user_site is False' wouldn't catch.
680
+ if (use_user_site is not None) and (not use_user_site):
681
+ logger.debug("Non-user install by explicit request")
682
+ return False
683
+
684
+ if use_user_site:
685
+ if prefix_path:
686
+ raise CommandError(
687
+ "Can not combine '--user' and '--prefix' as they imply "
688
+ "different installation locations"
689
+ )
690
+ if virtualenv_no_global():
691
+ raise InstallationError(
692
+ "Can not perform a '--user' install. User site-packages "
693
+ "are not visible in this virtualenv."
694
+ )
695
+ logger.debug("User install by explicit request")
696
+ return True
697
+
698
+ # If we are here, user installs have not been explicitly requested/avoided
699
+ assert use_user_site is None
700
+
701
+ # user install incompatible with --prefix/--target
702
+ if prefix_path or target_dir:
703
+ logger.debug("Non-user install due to --prefix or --target option")
704
+ return False
705
+
706
+ # If user installs are not enabled, choose a non-user install
707
+ if not site.ENABLE_USER_SITE:
708
+ logger.debug("Non-user install because user site-packages disabled")
709
+ return False
710
+
711
+ # If we have permission for a non-user install, do that,
712
+ # otherwise do a user install.
713
+ if site_packages_writable(root=root_path, isolated=isolated_mode):
714
+ logger.debug("Non-user install because site-packages writeable")
715
+ return False
716
+
717
+ logger.info(
718
+ "Defaulting to user installation because normal site-packages "
719
+ "is not writeable"
720
+ )
721
+ return True
722
+
723
+
724
+ def create_os_error_message(
725
+ error: OSError, show_traceback: bool, using_user_site: bool
726
+ ) -> str:
727
+ """Format an error message for an OSError
728
+
729
+ It may occur anytime during the execution of the install command.
730
+ """
731
+ parts = []
732
+
733
+ # Mention the error if we are not going to show a traceback
734
+ parts.append("Could not install packages due to an OSError")
735
+ if not show_traceback:
736
+ parts.append(": ")
737
+ parts.append(str(error))
738
+ else:
739
+ parts.append(".")
740
+
741
+ # Spilt the error indication from a helper message (if any)
742
+ parts[-1] += "\n"
743
+
744
+ # Suggest useful actions to the user:
745
+ # (1) using user site-packages or (2) verifying the permissions
746
+ if error.errno == errno.EACCES:
747
+ user_option_part = "Consider using the `--user` option"
748
+ permissions_part = "Check the permissions"
749
+
750
+ if not running_under_virtualenv() and not using_user_site:
751
+ parts.extend(
752
+ [
753
+ user_option_part,
754
+ " or ",
755
+ permissions_part.lower(),
756
+ ]
757
+ )
758
+ else:
759
+ parts.append(permissions_part)
760
+ parts.append(".\n")
761
+
762
+ # Suggest the user to enable Long Paths if path length is
763
+ # more than 260
764
+ if (
765
+ WINDOWS
766
+ and error.errno == errno.ENOENT
767
+ and error.filename
768
+ and len(error.filename) > 260
769
+ ):
770
+ parts.append(
771
+ "HINT: This error might have occurred since "
772
+ "this system does not have Windows Long Path "
773
+ "support enabled. You can find information on "
774
+ "how to enable this at "
775
+ "https://pip.pypa.io/warnings/enable-long-paths\n"
776
+ )
777
+
778
+ return "".join(parts).strip() + "\n"
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/list.py ADDED
@@ -0,0 +1,368 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import logging
3
+ from optparse import Values
4
+ from typing import TYPE_CHECKING, Generator, List, Optional, Sequence, Tuple, cast
5
+
6
+ from pip._vendor.packaging.utils import canonicalize_name
7
+
8
+ from pip._internal.cli import cmdoptions
9
+ from pip._internal.cli.req_command import IndexGroupCommand
10
+ from pip._internal.cli.status_codes import SUCCESS
11
+ from pip._internal.exceptions import CommandError
12
+ from pip._internal.index.collector import LinkCollector
13
+ from pip._internal.index.package_finder import PackageFinder
14
+ from pip._internal.metadata import BaseDistribution, get_environment
15
+ from pip._internal.models.selection_prefs import SelectionPreferences
16
+ from pip._internal.network.session import PipSession
17
+ from pip._internal.utils.compat import stdlib_pkgs
18
+ from pip._internal.utils.misc import tabulate, write_output
19
+
20
+ if TYPE_CHECKING:
21
+ from pip._internal.metadata.base import DistributionVersion
22
+
23
+ class _DistWithLatestInfo(BaseDistribution):
24
+ """Give the distribution object a couple of extra fields.
25
+
26
+ These will be populated during ``get_outdated()``. This is dirty but
27
+ makes the rest of the code much cleaner.
28
+ """
29
+
30
+ latest_version: DistributionVersion
31
+ latest_filetype: str
32
+
33
+ _ProcessedDists = Sequence[_DistWithLatestInfo]
34
+
35
+
36
+ logger = logging.getLogger(__name__)
37
+
38
+
39
+ class ListCommand(IndexGroupCommand):
40
+ """
41
+ List installed packages, including editables.
42
+
43
+ Packages are listed in a case-insensitive sorted order.
44
+ """
45
+
46
+ ignore_require_venv = True
47
+ usage = """
48
+ %prog [options]"""
49
+
50
+ def add_options(self) -> None:
51
+ self.cmd_opts.add_option(
52
+ "-o",
53
+ "--outdated",
54
+ action="store_true",
55
+ default=False,
56
+ help="List outdated packages",
57
+ )
58
+ self.cmd_opts.add_option(
59
+ "-u",
60
+ "--uptodate",
61
+ action="store_true",
62
+ default=False,
63
+ help="List uptodate packages",
64
+ )
65
+ self.cmd_opts.add_option(
66
+ "-e",
67
+ "--editable",
68
+ action="store_true",
69
+ default=False,
70
+ help="List editable projects.",
71
+ )
72
+ self.cmd_opts.add_option(
73
+ "-l",
74
+ "--local",
75
+ action="store_true",
76
+ default=False,
77
+ help=(
78
+ "If in a virtualenv that has global access, do not list "
79
+ "globally-installed packages."
80
+ ),
81
+ )
82
+ self.cmd_opts.add_option(
83
+ "--user",
84
+ dest="user",
85
+ action="store_true",
86
+ default=False,
87
+ help="Only output packages installed in user-site.",
88
+ )
89
+ self.cmd_opts.add_option(cmdoptions.list_path())
90
+ self.cmd_opts.add_option(
91
+ "--pre",
92
+ action="store_true",
93
+ default=False,
94
+ help=(
95
+ "Include pre-release and development versions. By default, "
96
+ "pip only finds stable versions."
97
+ ),
98
+ )
99
+
100
+ self.cmd_opts.add_option(
101
+ "--format",
102
+ action="store",
103
+ dest="list_format",
104
+ default="columns",
105
+ choices=("columns", "freeze", "json"),
106
+ help=(
107
+ "Select the output format among: columns (default), freeze, or json. "
108
+ "The 'freeze' format cannot be used with the --outdated option."
109
+ ),
110
+ )
111
+
112
+ self.cmd_opts.add_option(
113
+ "--not-required",
114
+ action="store_true",
115
+ dest="not_required",
116
+ help="List packages that are not dependencies of installed packages.",
117
+ )
118
+
119
+ self.cmd_opts.add_option(
120
+ "--exclude-editable",
121
+ action="store_false",
122
+ dest="include_editable",
123
+ help="Exclude editable package from output.",
124
+ )
125
+ self.cmd_opts.add_option(
126
+ "--include-editable",
127
+ action="store_true",
128
+ dest="include_editable",
129
+ help="Include editable package from output.",
130
+ default=True,
131
+ )
132
+ self.cmd_opts.add_option(cmdoptions.list_exclude())
133
+ index_opts = cmdoptions.make_option_group(cmdoptions.index_group, self.parser)
134
+
135
+ self.parser.insert_option_group(0, index_opts)
136
+ self.parser.insert_option_group(0, self.cmd_opts)
137
+
138
+ def _build_package_finder(
139
+ self, options: Values, session: PipSession
140
+ ) -> PackageFinder:
141
+ """
142
+ Create a package finder appropriate to this list command.
143
+ """
144
+ link_collector = LinkCollector.create(session, options=options)
145
+
146
+ # Pass allow_yanked=False to ignore yanked versions.
147
+ selection_prefs = SelectionPreferences(
148
+ allow_yanked=False,
149
+ allow_all_prereleases=options.pre,
150
+ )
151
+
152
+ return PackageFinder.create(
153
+ link_collector=link_collector,
154
+ selection_prefs=selection_prefs,
155
+ )
156
+
157
+ def run(self, options: Values, args: List[str]) -> int:
158
+ if options.outdated and options.uptodate:
159
+ raise CommandError("Options --outdated and --uptodate cannot be combined.")
160
+
161
+ if options.outdated and options.list_format == "freeze":
162
+ raise CommandError(
163
+ "List format 'freeze' cannot be used with the --outdated option."
164
+ )
165
+
166
+ cmdoptions.check_list_path_option(options)
167
+
168
+ skip = set(stdlib_pkgs)
169
+ if options.excludes:
170
+ skip.update(canonicalize_name(n) for n in options.excludes)
171
+
172
+ packages: "_ProcessedDists" = [
173
+ cast("_DistWithLatestInfo", d)
174
+ for d in get_environment(options.path).iter_installed_distributions(
175
+ local_only=options.local,
176
+ user_only=options.user,
177
+ editables_only=options.editable,
178
+ include_editables=options.include_editable,
179
+ skip=skip,
180
+ )
181
+ ]
182
+
183
+ # get_not_required must be called firstly in order to find and
184
+ # filter out all dependencies correctly. Otherwise a package
185
+ # can't be identified as requirement because some parent packages
186
+ # could be filtered out before.
187
+ if options.not_required:
188
+ packages = self.get_not_required(packages, options)
189
+
190
+ if options.outdated:
191
+ packages = self.get_outdated(packages, options)
192
+ elif options.uptodate:
193
+ packages = self.get_uptodate(packages, options)
194
+
195
+ self.output_package_listing(packages, options)
196
+ return SUCCESS
197
+
198
+ def get_outdated(
199
+ self, packages: "_ProcessedDists", options: Values
200
+ ) -> "_ProcessedDists":
201
+ return [
202
+ dist
203
+ for dist in self.iter_packages_latest_infos(packages, options)
204
+ if dist.latest_version > dist.version
205
+ ]
206
+
207
+ def get_uptodate(
208
+ self, packages: "_ProcessedDists", options: Values
209
+ ) -> "_ProcessedDists":
210
+ return [
211
+ dist
212
+ for dist in self.iter_packages_latest_infos(packages, options)
213
+ if dist.latest_version == dist.version
214
+ ]
215
+
216
+ def get_not_required(
217
+ self, packages: "_ProcessedDists", options: Values
218
+ ) -> "_ProcessedDists":
219
+ dep_keys = {
220
+ canonicalize_name(dep.name)
221
+ for dist in packages
222
+ for dep in (dist.iter_dependencies() or ())
223
+ }
224
+
225
+ # Create a set to remove duplicate packages, and cast it to a list
226
+ # to keep the return type consistent with get_outdated and
227
+ # get_uptodate
228
+ return list({pkg for pkg in packages if pkg.canonical_name not in dep_keys})
229
+
230
+ def iter_packages_latest_infos(
231
+ self, packages: "_ProcessedDists", options: Values
232
+ ) -> Generator["_DistWithLatestInfo", None, None]:
233
+ with self._build_session(options) as session:
234
+ finder = self._build_package_finder(options, session)
235
+
236
+ def latest_info(
237
+ dist: "_DistWithLatestInfo",
238
+ ) -> Optional["_DistWithLatestInfo"]:
239
+ all_candidates = finder.find_all_candidates(dist.canonical_name)
240
+ if not options.pre:
241
+ # Remove prereleases
242
+ all_candidates = [
243
+ candidate
244
+ for candidate in all_candidates
245
+ if not candidate.version.is_prerelease
246
+ ]
247
+
248
+ evaluator = finder.make_candidate_evaluator(
249
+ project_name=dist.canonical_name,
250
+ )
251
+ best_candidate = evaluator.sort_best_candidate(all_candidates)
252
+ if best_candidate is None:
253
+ return None
254
+
255
+ remote_version = best_candidate.version
256
+ if best_candidate.link.is_wheel:
257
+ typ = "wheel"
258
+ else:
259
+ typ = "sdist"
260
+ dist.latest_version = remote_version
261
+ dist.latest_filetype = typ
262
+ return dist
263
+
264
+ for dist in map(latest_info, packages):
265
+ if dist is not None:
266
+ yield dist
267
+
268
+ def output_package_listing(
269
+ self, packages: "_ProcessedDists", options: Values
270
+ ) -> None:
271
+ packages = sorted(
272
+ packages,
273
+ key=lambda dist: dist.canonical_name,
274
+ )
275
+ if options.list_format == "columns" and packages:
276
+ data, header = format_for_columns(packages, options)
277
+ self.output_package_listing_columns(data, header)
278
+ elif options.list_format == "freeze":
279
+ for dist in packages:
280
+ if options.verbose >= 1:
281
+ write_output(
282
+ "%s==%s (%s)", dist.raw_name, dist.version, dist.location
283
+ )
284
+ else:
285
+ write_output("%s==%s", dist.raw_name, dist.version)
286
+ elif options.list_format == "json":
287
+ write_output(format_for_json(packages, options))
288
+
289
+ def output_package_listing_columns(
290
+ self, data: List[List[str]], header: List[str]
291
+ ) -> None:
292
+ # insert the header first: we need to know the size of column names
293
+ if len(data) > 0:
294
+ data.insert(0, header)
295
+
296
+ pkg_strings, sizes = tabulate(data)
297
+
298
+ # Create and add a separator.
299
+ if len(data) > 0:
300
+ pkg_strings.insert(1, " ".join("-" * x for x in sizes))
301
+
302
+ for val in pkg_strings:
303
+ write_output(val)
304
+
305
+
306
+ def format_for_columns(
307
+ pkgs: "_ProcessedDists", options: Values
308
+ ) -> Tuple[List[List[str]], List[str]]:
309
+ """
310
+ Convert the package data into something usable
311
+ by output_package_listing_columns.
312
+ """
313
+ header = ["Package", "Version"]
314
+
315
+ running_outdated = options.outdated
316
+ if running_outdated:
317
+ header.extend(["Latest", "Type"])
318
+
319
+ has_editables = any(x.editable for x in pkgs)
320
+ if has_editables:
321
+ header.append("Editable project location")
322
+
323
+ if options.verbose >= 1:
324
+ header.append("Location")
325
+ if options.verbose >= 1:
326
+ header.append("Installer")
327
+
328
+ data = []
329
+ for proj in pkgs:
330
+ # if we're working on the 'outdated' list, separate out the
331
+ # latest_version and type
332
+ row = [proj.raw_name, str(proj.version)]
333
+
334
+ if running_outdated:
335
+ row.append(str(proj.latest_version))
336
+ row.append(proj.latest_filetype)
337
+
338
+ if has_editables:
339
+ row.append(proj.editable_project_location or "")
340
+
341
+ if options.verbose >= 1:
342
+ row.append(proj.location or "")
343
+ if options.verbose >= 1:
344
+ row.append(proj.installer)
345
+
346
+ data.append(row)
347
+
348
+ return data, header
349
+
350
+
351
+ def format_for_json(packages: "_ProcessedDists", options: Values) -> str:
352
+ data = []
353
+ for dist in packages:
354
+ info = {
355
+ "name": dist.raw_name,
356
+ "version": str(dist.version),
357
+ }
358
+ if options.verbose >= 1:
359
+ info["location"] = dist.location or ""
360
+ info["installer"] = dist.installer
361
+ if options.outdated:
362
+ info["latest_version"] = str(dist.latest_version)
363
+ info["latest_filetype"] = dist.latest_filetype
364
+ editable_project_location = dist.editable_project_location
365
+ if editable_project_location:
366
+ info["editable_project_location"] = editable_project_location
367
+ data.append(info)
368
+ return json.dumps(data)
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/search.py ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ import shutil
3
+ import sys
4
+ import textwrap
5
+ import xmlrpc.client
6
+ from collections import OrderedDict
7
+ from optparse import Values
8
+ from typing import TYPE_CHECKING, Dict, List, Optional
9
+
10
+ from pip._vendor.packaging.version import parse as parse_version
11
+
12
+ from pip._internal.cli.base_command import Command
13
+ from pip._internal.cli.req_command import SessionCommandMixin
14
+ from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS
15
+ from pip._internal.exceptions import CommandError
16
+ from pip._internal.metadata import get_default_environment
17
+ from pip._internal.models.index import PyPI
18
+ from pip._internal.network.xmlrpc import PipXmlrpcTransport
19
+ from pip._internal.utils.logging import indent_log
20
+ from pip._internal.utils.misc import write_output
21
+
22
+ if TYPE_CHECKING:
23
+ from typing import TypedDict
24
+
25
+ class TransformedHit(TypedDict):
26
+ name: str
27
+ summary: str
28
+ versions: List[str]
29
+
30
+
31
+ logger = logging.getLogger(__name__)
32
+
33
+
34
+ class SearchCommand(Command, SessionCommandMixin):
35
+ """Search for PyPI packages whose name or summary contains <query>."""
36
+
37
+ usage = """
38
+ %prog [options] <query>"""
39
+ ignore_require_venv = True
40
+
41
+ def add_options(self) -> None:
42
+ self.cmd_opts.add_option(
43
+ "-i",
44
+ "--index",
45
+ dest="index",
46
+ metavar="URL",
47
+ default=PyPI.pypi_url,
48
+ help="Base URL of Python Package Index (default %default)",
49
+ )
50
+
51
+ self.parser.insert_option_group(0, self.cmd_opts)
52
+
53
+ def run(self, options: Values, args: List[str]) -> int:
54
+ if not args:
55
+ raise CommandError("Missing required argument (search query).")
56
+ query = args
57
+ pypi_hits = self.search(query, options)
58
+ hits = transform_hits(pypi_hits)
59
+
60
+ terminal_width = None
61
+ if sys.stdout.isatty():
62
+ terminal_width = shutil.get_terminal_size()[0]
63
+
64
+ print_results(hits, terminal_width=terminal_width)
65
+ if pypi_hits:
66
+ return SUCCESS
67
+ return NO_MATCHES_FOUND
68
+
69
+ def search(self, query: List[str], options: Values) -> List[Dict[str, str]]:
70
+ index_url = options.index
71
+
72
+ session = self.get_default_session(options)
73
+
74
+ transport = PipXmlrpcTransport(index_url, session)
75
+ pypi = xmlrpc.client.ServerProxy(index_url, transport)
76
+ try:
77
+ hits = pypi.search({"name": query, "summary": query}, "or")
78
+ except xmlrpc.client.Fault as fault:
79
+ message = "XMLRPC request failed [code: {code}]\n{string}".format(
80
+ code=fault.faultCode,
81
+ string=fault.faultString,
82
+ )
83
+ raise CommandError(message)
84
+ assert isinstance(hits, list)
85
+ return hits
86
+
87
+
88
+ def transform_hits(hits: List[Dict[str, str]]) -> List["TransformedHit"]:
89
+ """
90
+ The list from pypi is really a list of versions. We want a list of
91
+ packages with the list of versions stored inline. This converts the
92
+ list from pypi into one we can use.
93
+ """
94
+ packages: Dict[str, "TransformedHit"] = OrderedDict()
95
+ for hit in hits:
96
+ name = hit["name"]
97
+ summary = hit["summary"]
98
+ version = hit["version"]
99
+
100
+ if name not in packages.keys():
101
+ packages[name] = {
102
+ "name": name,
103
+ "summary": summary,
104
+ "versions": [version],
105
+ }
106
+ else:
107
+ packages[name]["versions"].append(version)
108
+
109
+ # if this is the highest version, replace summary and score
110
+ if version == highest_version(packages[name]["versions"]):
111
+ packages[name]["summary"] = summary
112
+
113
+ return list(packages.values())
114
+
115
+
116
+ def print_dist_installation_info(name: str, latest: str) -> None:
117
+ env = get_default_environment()
118
+ dist = env.get_distribution(name)
119
+ if dist is not None:
120
+ with indent_log():
121
+ if dist.version == latest:
122
+ write_output("INSTALLED: %s (latest)", dist.version)
123
+ else:
124
+ write_output("INSTALLED: %s", dist.version)
125
+ if parse_version(latest).pre:
126
+ write_output(
127
+ "LATEST: %s (pre-release; install"
128
+ " with `pip install --pre`)",
129
+ latest,
130
+ )
131
+ else:
132
+ write_output("LATEST: %s", latest)
133
+
134
+
135
+ def print_results(
136
+ hits: List["TransformedHit"],
137
+ name_column_width: Optional[int] = None,
138
+ terminal_width: Optional[int] = None,
139
+ ) -> None:
140
+ if not hits:
141
+ return
142
+ if name_column_width is None:
143
+ name_column_width = (
144
+ max(
145
+ [
146
+ len(hit["name"]) + len(highest_version(hit.get("versions", ["-"])))
147
+ for hit in hits
148
+ ]
149
+ )
150
+ + 4
151
+ )
152
+
153
+ for hit in hits:
154
+ name = hit["name"]
155
+ summary = hit["summary"] or ""
156
+ latest = highest_version(hit.get("versions", ["-"]))
157
+ if terminal_width is not None:
158
+ target_width = terminal_width - name_column_width - 5
159
+ if target_width > 10:
160
+ # wrap and indent summary to fit terminal
161
+ summary_lines = textwrap.wrap(summary, target_width)
162
+ summary = ("\n" + " " * (name_column_width + 3)).join(summary_lines)
163
+
164
+ name_latest = f"{name} ({latest})"
165
+ line = f"{name_latest:{name_column_width}} - {summary}"
166
+ try:
167
+ write_output(line)
168
+ print_dist_installation_info(name, latest)
169
+ except UnicodeEncodeError:
170
+ pass
171
+
172
+
173
+ def highest_version(versions: List[str]) -> str:
174
+ return max(versions, key=parse_version)
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/show.py ADDED
@@ -0,0 +1,189 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ from optparse import Values
3
+ from typing import Generator, Iterable, Iterator, List, NamedTuple, Optional
4
+
5
+ from pip._vendor.packaging.utils import canonicalize_name
6
+
7
+ from pip._internal.cli.base_command import Command
8
+ from pip._internal.cli.status_codes import ERROR, SUCCESS
9
+ from pip._internal.metadata import BaseDistribution, get_default_environment
10
+ from pip._internal.utils.misc import write_output
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+
15
+ class ShowCommand(Command):
16
+ """
17
+ Show information about one or more installed packages.
18
+
19
+ The output is in RFC-compliant mail header format.
20
+ """
21
+
22
+ usage = """
23
+ %prog [options] <package> ..."""
24
+ ignore_require_venv = True
25
+
26
+ def add_options(self) -> None:
27
+ self.cmd_opts.add_option(
28
+ "-f",
29
+ "--files",
30
+ dest="files",
31
+ action="store_true",
32
+ default=False,
33
+ help="Show the full list of installed files for each package.",
34
+ )
35
+
36
+ self.parser.insert_option_group(0, self.cmd_opts)
37
+
38
+ def run(self, options: Values, args: List[str]) -> int:
39
+ if not args:
40
+ logger.warning("ERROR: Please provide a package name or names.")
41
+ return ERROR
42
+ query = args
43
+
44
+ results = search_packages_info(query)
45
+ if not print_results(
46
+ results, list_files=options.files, verbose=options.verbose
47
+ ):
48
+ return ERROR
49
+ return SUCCESS
50
+
51
+
52
+ class _PackageInfo(NamedTuple):
53
+ name: str
54
+ version: str
55
+ location: str
56
+ editable_project_location: Optional[str]
57
+ requires: List[str]
58
+ required_by: List[str]
59
+ installer: str
60
+ metadata_version: str
61
+ classifiers: List[str]
62
+ summary: str
63
+ homepage: str
64
+ project_urls: List[str]
65
+ author: str
66
+ author_email: str
67
+ license: str
68
+ entry_points: List[str]
69
+ files: Optional[List[str]]
70
+
71
+
72
+ def search_packages_info(query: List[str]) -> Generator[_PackageInfo, None, None]:
73
+ """
74
+ Gather details from installed distributions. Print distribution name,
75
+ version, location, and installed files. Installed files requires a
76
+ pip generated 'installed-files.txt' in the distributions '.egg-info'
77
+ directory.
78
+ """
79
+ env = get_default_environment()
80
+
81
+ installed = {dist.canonical_name: dist for dist in env.iter_all_distributions()}
82
+ query_names = [canonicalize_name(name) for name in query]
83
+ missing = sorted(
84
+ [name for name, pkg in zip(query, query_names) if pkg not in installed]
85
+ )
86
+ if missing:
87
+ logger.warning("Package(s) not found: %s", ", ".join(missing))
88
+
89
+ def _get_requiring_packages(current_dist: BaseDistribution) -> Iterator[str]:
90
+ return (
91
+ dist.metadata["Name"] or "UNKNOWN"
92
+ for dist in installed.values()
93
+ if current_dist.canonical_name
94
+ in {canonicalize_name(d.name) for d in dist.iter_dependencies()}
95
+ )
96
+
97
+ for query_name in query_names:
98
+ try:
99
+ dist = installed[query_name]
100
+ except KeyError:
101
+ continue
102
+
103
+ requires = sorted((req.name for req in dist.iter_dependencies()), key=str.lower)
104
+ required_by = sorted(_get_requiring_packages(dist), key=str.lower)
105
+
106
+ try:
107
+ entry_points_text = dist.read_text("entry_points.txt")
108
+ entry_points = entry_points_text.splitlines(keepends=False)
109
+ except FileNotFoundError:
110
+ entry_points = []
111
+
112
+ files_iter = dist.iter_declared_entries()
113
+ if files_iter is None:
114
+ files: Optional[List[str]] = None
115
+ else:
116
+ files = sorted(files_iter)
117
+
118
+ metadata = dist.metadata
119
+
120
+ yield _PackageInfo(
121
+ name=dist.raw_name,
122
+ version=str(dist.version),
123
+ location=dist.location or "",
124
+ editable_project_location=dist.editable_project_location,
125
+ requires=requires,
126
+ required_by=required_by,
127
+ installer=dist.installer,
128
+ metadata_version=dist.metadata_version or "",
129
+ classifiers=metadata.get_all("Classifier", []),
130
+ summary=metadata.get("Summary", ""),
131
+ homepage=metadata.get("Home-page", ""),
132
+ project_urls=metadata.get_all("Project-URL", []),
133
+ author=metadata.get("Author", ""),
134
+ author_email=metadata.get("Author-email", ""),
135
+ license=metadata.get("License", ""),
136
+ entry_points=entry_points,
137
+ files=files,
138
+ )
139
+
140
+
141
+ def print_results(
142
+ distributions: Iterable[_PackageInfo],
143
+ list_files: bool,
144
+ verbose: bool,
145
+ ) -> bool:
146
+ """
147
+ Print the information from installed distributions found.
148
+ """
149
+ results_printed = False
150
+ for i, dist in enumerate(distributions):
151
+ results_printed = True
152
+ if i > 0:
153
+ write_output("---")
154
+
155
+ write_output("Name: %s", dist.name)
156
+ write_output("Version: %s", dist.version)
157
+ write_output("Summary: %s", dist.summary)
158
+ write_output("Home-page: %s", dist.homepage)
159
+ write_output("Author: %s", dist.author)
160
+ write_output("Author-email: %s", dist.author_email)
161
+ write_output("License: %s", dist.license)
162
+ write_output("Location: %s", dist.location)
163
+ if dist.editable_project_location is not None:
164
+ write_output(
165
+ "Editable project location: %s", dist.editable_project_location
166
+ )
167
+ write_output("Requires: %s", ", ".join(dist.requires))
168
+ write_output("Required-by: %s", ", ".join(dist.required_by))
169
+
170
+ if verbose:
171
+ write_output("Metadata-Version: %s", dist.metadata_version)
172
+ write_output("Installer: %s", dist.installer)
173
+ write_output("Classifiers:")
174
+ for classifier in dist.classifiers:
175
+ write_output(" %s", classifier)
176
+ write_output("Entry-points:")
177
+ for entry in dist.entry_points:
178
+ write_output(" %s", entry.strip())
179
+ write_output("Project-URLs:")
180
+ for project_url in dist.project_urls:
181
+ write_output(" %s", project_url)
182
+ if list_files:
183
+ write_output("Files:")
184
+ if dist.files is None:
185
+ write_output("Cannot locate RECORD or installed-files.txt")
186
+ else:
187
+ for line in dist.files:
188
+ write_output(" %s", line.strip())
189
+ return results_printed
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/uninstall.py ADDED
@@ -0,0 +1,113 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ from optparse import Values
3
+ from typing import List
4
+
5
+ from pip._vendor.packaging.utils import canonicalize_name
6
+
7
+ from pip._internal.cli import cmdoptions
8
+ from pip._internal.cli.base_command import Command
9
+ from pip._internal.cli.req_command import SessionCommandMixin, warn_if_run_as_root
10
+ from pip._internal.cli.status_codes import SUCCESS
11
+ from pip._internal.exceptions import InstallationError
12
+ from pip._internal.req import parse_requirements
13
+ from pip._internal.req.constructors import (
14
+ install_req_from_line,
15
+ install_req_from_parsed_requirement,
16
+ )
17
+ from pip._internal.utils.misc import (
18
+ check_externally_managed,
19
+ protect_pip_from_modification_on_windows,
20
+ )
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+ class UninstallCommand(Command, SessionCommandMixin):
26
+ """
27
+ Uninstall packages.
28
+
29
+ pip is able to uninstall most installed packages. Known exceptions are:
30
+
31
+ - Pure distutils packages installed with ``python setup.py install``, which
32
+ leave behind no metadata to determine what files were installed.
33
+ - Script wrappers installed by ``python setup.py develop``.
34
+ """
35
+
36
+ usage = """
37
+ %prog [options] <package> ...
38
+ %prog [options] -r <requirements file> ..."""
39
+
40
+ def add_options(self) -> None:
41
+ self.cmd_opts.add_option(
42
+ "-r",
43
+ "--requirement",
44
+ dest="requirements",
45
+ action="append",
46
+ default=[],
47
+ metavar="file",
48
+ help=(
49
+ "Uninstall all the packages listed in the given requirements "
50
+ "file. This option can be used multiple times."
51
+ ),
52
+ )
53
+ self.cmd_opts.add_option(
54
+ "-y",
55
+ "--yes",
56
+ dest="yes",
57
+ action="store_true",
58
+ help="Don't ask for confirmation of uninstall deletions.",
59
+ )
60
+ self.cmd_opts.add_option(cmdoptions.root_user_action())
61
+ self.cmd_opts.add_option(cmdoptions.override_externally_managed())
62
+ self.parser.insert_option_group(0, self.cmd_opts)
63
+
64
+ def run(self, options: Values, args: List[str]) -> int:
65
+ session = self.get_default_session(options)
66
+
67
+ reqs_to_uninstall = {}
68
+ for name in args:
69
+ req = install_req_from_line(
70
+ name,
71
+ isolated=options.isolated_mode,
72
+ )
73
+ if req.name:
74
+ reqs_to_uninstall[canonicalize_name(req.name)] = req
75
+ else:
76
+ logger.warning(
77
+ "Invalid requirement: %r ignored -"
78
+ " the uninstall command expects named"
79
+ " requirements.",
80
+ name,
81
+ )
82
+ for filename in options.requirements:
83
+ for parsed_req in parse_requirements(
84
+ filename, options=options, session=session
85
+ ):
86
+ req = install_req_from_parsed_requirement(
87
+ parsed_req, isolated=options.isolated_mode
88
+ )
89
+ if req.name:
90
+ reqs_to_uninstall[canonicalize_name(req.name)] = req
91
+ if not reqs_to_uninstall:
92
+ raise InstallationError(
93
+ f"You must give at least one requirement to {self.name} (see "
94
+ f'"pip help {self.name}")'
95
+ )
96
+
97
+ if not options.override_externally_managed:
98
+ check_externally_managed()
99
+
100
+ protect_pip_from_modification_on_windows(
101
+ modifying_pip="pip" in reqs_to_uninstall
102
+ )
103
+
104
+ for req in reqs_to_uninstall.values():
105
+ uninstall_pathset = req.uninstall(
106
+ auto_confirm=options.yes,
107
+ verbose=self.verbosity > 0,
108
+ )
109
+ if uninstall_pathset:
110
+ uninstall_pathset.commit()
111
+ if options.root_user_action == "warn":
112
+ warn_if_run_as_root()
113
+ return SUCCESS
.local/share/virtualenv/wheel/3.10/image/1/CopyPipInstall/pip-23.3.1-py3-none-any/pip/_internal/commands/wheel.py ADDED
@@ -0,0 +1,183 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ import os
3
+ import shutil
4
+ from optparse import Values
5
+ from typing import List
6
+
7
+ from pip._internal.cache import WheelCache
8
+ from pip._internal.cli import cmdoptions
9
+ from pip._internal.cli.req_command import RequirementCommand, with_cleanup
10
+ from pip._internal.cli.status_codes import SUCCESS
11
+ from pip._internal.exceptions import CommandError
12
+ from pip._internal.operations.build.build_tracker import get_build_tracker
13
+ from pip._internal.req.req_install import (
14
+ InstallRequirement,
15
+ check_legacy_setup_py_options,
16
+ )
17
+ from pip._internal.utils.misc import ensure_dir, normalize_path
18
+ from pip._internal.utils.temp_dir import TempDirectory
19
+ from pip._internal.wheel_builder import build, should_build_for_wheel_command
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+
24
+ class WheelCommand(RequirementCommand):
25
+ """
26
+ Build Wheel archives for your requirements and dependencies.
27
+
28
+ Wheel is a built-package format, and offers the advantage of not
29
+ recompiling your software during every install. For more details, see the
30
+ wheel docs: https://wheel.readthedocs.io/en/latest/
31
+
32
+ 'pip wheel' uses the build system interface as described here:
33
+ https://pip.pypa.io/en/stable/reference/build-system/
34
+
35
+ """
36
+
37
+ usage = """
38
+ %prog [options] <requirement specifier> ...
39
+ %prog [options] -r <requirements file> ...
40
+ %prog [options] [-e] <vcs project url> ...
41
+ %prog [options] [-e] <local project path> ...
42
+ %prog [options] <archive url/path> ..."""
43
+
44
+ def add_options(self) -> None:
45
+ self.cmd_opts.add_option(
46
+ "-w",
47
+ "--wheel-dir",
48
+ dest="wheel_dir",
49
+ metavar="dir",
50
+ default=os.curdir,
51
+ help=(
52
+ "Build wheels into <dir>, where the default is the "
53
+ "current working directory."
54
+ ),
55
+ )
56
+ self.cmd_opts.add_option(cmdoptions.no_binary())
57
+ self.cmd_opts.add_option(cmdoptions.only_binary())
58
+ self.cmd_opts.add_option(cmdoptions.prefer_binary())
59
+ self.cmd_opts.add_option(cmdoptions.no_build_isolation())
60
+ self.cmd_opts.add_option(cmdoptions.use_pep517())
61
+ self.cmd_opts.add_option(cmdoptions.no_use_pep517())
62
+ self.cmd_opts.add_option(cmdoptions.check_build_deps())
63
+ self.cmd_opts.add_option(cmdoptions.constraints())
64
+ self.cmd_opts.add_option(cmdoptions.editable())
65
+ self.cmd_opts.add_option(cmdoptions.requirements())
66
+ self.cmd_opts.add_option(cmdoptions.src())
67
+ self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
68
+ self.cmd_opts.add_option(cmdoptions.no_deps())
69
+ self.cmd_opts.add_option(cmdoptions.progress_bar())
70
+
71
+ self.cmd_opts.add_option(
72
+ "--no-verify",
73
+ dest="no_verify",
74
+ action="store_true",
75
+ default=False,
76
+ help="Don't verify if built wheel is valid.",
77
+ )
78
+
79
+ self.cmd_opts.add_option(cmdoptions.config_settings())
80
+ self.cmd_opts.add_option(cmdoptions.build_options())
81
+ self.cmd_opts.add_option(cmdoptions.global_options())
82
+
83
+ self.cmd_opts.add_option(
84
+ "--pre",
85
+ action="store_true",
86
+ default=False,
87
+ help=(
88
+ "Include pre-release and development versions. By default, "
89
+ "pip only finds stable versions."
90
+ ),
91
+ )
92
+
93
+ self.cmd_opts.add_option(cmdoptions.require_hashes())
94
+
95
+ index_opts = cmdoptions.make_option_group(
96
+ cmdoptions.index_group,
97
+ self.parser,
98
+ )
99
+
100
+ self.parser.insert_option_group(0, index_opts)
101
+ self.parser.insert_option_group(0, self.cmd_opts)
102
+
103
+ @with_cleanup
104
+ def run(self, options: Values, args: List[str]) -> int:
105
+ session = self.get_default_session(options)
106
+
107
+ finder = self._build_package_finder(options, session)
108
+
109
+ options.wheel_dir = normalize_path(options.wheel_dir)
110
+ ensure_dir(options.wheel_dir)
111
+
112
+ build_tracker = self.enter_context(get_build_tracker())
113
+
114
+ directory = TempDirectory(
115
+ delete=not options.no_clean,
116
+ kind="wheel",
117
+ globally_managed=True,
118
+ )
119
+
120
+ reqs = self.get_requirements(args, options, finder, session)
121
+ check_legacy_setup_py_options(options, reqs)
122
+
123
+ wheel_cache = WheelCache(options.cache_dir)
124
+
125
+ preparer = self.make_requirement_preparer(
126
+ temp_build_dir=directory,
127
+ options=options,
128
+ build_tracker=build_tracker,
129
+ session=session,
130
+ finder=finder,
131
+ download_dir=options.wheel_dir,
132
+ use_user_site=False,
133
+ verbosity=self.verbosity,
134
+ )
135
+
136
+ resolver = self.make_resolver(
137
+ preparer=preparer,
138
+ finder=finder,
139
+ options=options,
140
+ wheel_cache=wheel_cache,
141
+ ignore_requires_python=options.ignore_requires_python,
142
+ use_pep517=options.use_pep517,
143
+ )
144
+
145
+ self.trace_basic_info(finder)
146
+
147
+ requirement_set = resolver.resolve(reqs, check_supported_wheels=True)
148
+
149
+ reqs_to_build: List[InstallRequirement] = []
150
+ for req in requirement_set.requirements.values():
151
+ if req.is_wheel:
152
+ preparer.save_linked_requirement(req)
153
+ elif should_build_for_wheel_command(req):
154
+ reqs_to_build.append(req)
155
+
156
+ preparer.prepare_linked_requirements_more(requirement_set.requirements.values())
157
+ requirement_set.warn_legacy_versions_and_specifiers()
158
+
159
+ # build wheels
160
+ build_successes, build_failures = build(
161
+ reqs_to_build,
162
+ wheel_cache=wheel_cache,
163
+ verify=(not options.no_verify),
164
+ build_options=options.build_options or [],
165
+ global_options=options.global_options or [],
166
+ )
167
+ for req in build_successes:
168
+ assert req.link and req.link.is_wheel
169
+ assert req.local_file_path
170
+ # copy from cache to target directory
171
+ try:
172
+ shutil.copy(req.local_file_path, options.wheel_dir)
173
+ except OSError as e:
174
+ logger.warning(
175
+ "Building wheel for %s failed: %s",
176
+ req.name,
177
+ e,
178
+ )
179
+ build_failures.append(req)
180
+ if len(build_failures) != 0:
181
+ raise CommandError("Failed to build one or more wheels")
182
+
183
+ return SUCCESS