gaialive commited on
Commit
9493ea5
·
verified ·
1 Parent(s): 643d16d

Upload 525 files

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 +31 -0
  2. .idea/.gitignore +3 -0
  3. .idea/ESG3in1.iml +11 -0
  4. .idea/inspectionProfiles/Project_Default.xml +22 -0
  5. .idea/inspectionProfiles/profiles_settings.xml +6 -0
  6. .idea/misc.xml +10 -0
  7. .idea/modules.xml +8 -0
  8. .idea/workspace.xml +70 -0
  9. .streamlit/secrets.toml +2 -0
  10. .venv/.gitignore +2 -0
  11. .venv/CACHEDIR.TAG +4 -0
  12. .venv/Lib/site-packages/__pycache__/_virtualenv.cpython-314.pyc +0 -0
  13. .venv/Lib/site-packages/_virtualenv.pth +3 -0
  14. .venv/Lib/site-packages/_virtualenv.py +103 -0
  15. .venv/Lib/site-packages/pip-25.1.1.dist-info/INSTALLER +1 -0
  16. .venv/Lib/site-packages/pip-25.1.1.dist-info/METADATA +90 -0
  17. .venv/Lib/site-packages/pip-25.1.1.dist-info/RECORD +912 -0
  18. .venv/Lib/site-packages/pip-25.1.1.dist-info/WHEEL +5 -0
  19. .venv/Lib/site-packages/pip-25.1.1.dist-info/entry_points.txt +3 -0
  20. .venv/Lib/site-packages/pip-25.1.1.dist-info/licenses/AUTHORS.txt +821 -0
  21. .venv/Lib/site-packages/pip-25.1.1.dist-info/licenses/LICENSE.txt +20 -0
  22. .venv/Lib/site-packages/pip-25.1.1.dist-info/top_level.txt +1 -0
  23. .venv/Lib/site-packages/pip-25.1.1.virtualenv +0 -0
  24. .venv/Lib/site-packages/pip/__init__.py +13 -0
  25. .venv/Lib/site-packages/pip/__main__.py +24 -0
  26. .venv/Lib/site-packages/pip/__pip-runner__.py +50 -0
  27. .venv/Lib/site-packages/pip/_internal/__init__.py +18 -0
  28. .venv/Lib/site-packages/pip/_internal/build_env.py +325 -0
  29. .venv/Lib/site-packages/pip/_internal/cache.py +289 -0
  30. .venv/Lib/site-packages/pip/_internal/cli/__init__.py +3 -0
  31. .venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +175 -0
  32. .venv/Lib/site-packages/pip/_internal/cli/base_command.py +233 -0
  33. .venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +1133 -0
  34. .venv/Lib/site-packages/pip/_internal/cli/command_context.py +27 -0
  35. .venv/Lib/site-packages/pip/_internal/cli/index_command.py +173 -0
  36. .venv/Lib/site-packages/pip/_internal/cli/main.py +79 -0
  37. .venv/Lib/site-packages/pip/_internal/cli/main_parser.py +133 -0
  38. .venv/Lib/site-packages/pip/_internal/cli/parser.py +294 -0
  39. .venv/Lib/site-packages/pip/_internal/cli/progress_bars.py +144 -0
  40. .venv/Lib/site-packages/pip/_internal/cli/req_command.py +347 -0
  41. .venv/Lib/site-packages/pip/_internal/cli/spinners.py +159 -0
  42. .venv/Lib/site-packages/pip/_internal/cli/status_codes.py +6 -0
  43. .venv/Lib/site-packages/pip/_internal/commands/__init__.py +137 -0
  44. .venv/Lib/site-packages/pip/_internal/commands/cache.py +228 -0
  45. .venv/Lib/site-packages/pip/_internal/commands/check.py +67 -0
  46. .venv/Lib/site-packages/pip/_internal/commands/completion.py +136 -0
  47. .venv/Lib/site-packages/pip/_internal/commands/configuration.py +280 -0
  48. .venv/Lib/site-packages/pip/_internal/commands/debug.py +201 -0
  49. .venv/Lib/site-packages/pip/_internal/commands/download.py +146 -0
  50. .venv/Lib/site-packages/pip/_internal/commands/freeze.py +108 -0
.gitattributes CHANGED
@@ -33,3 +33,34 @@ 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
+ .venv/Lib/site-packages/pip/_vendor/distlib/t64-arm.exe filter=lfs diff=lfs merge=lfs -text
37
+ .venv/Lib/site-packages/pip/_vendor/distlib/t64.exe filter=lfs diff=lfs merge=lfs -text
38
+ .venv/Lib/site-packages/pip/_vendor/distlib/w64-arm.exe filter=lfs diff=lfs merge=lfs -text
39
+ .venv/Lib/site-packages/pip/_vendor/distlib/w64.exe filter=lfs diff=lfs merge=lfs -text
40
+ .venv/Scripts/_ctypes_test.pyd filter=lfs diff=lfs merge=lfs -text
41
+ .venv/Scripts/_ctypes.pyd filter=lfs diff=lfs merge=lfs -text
42
+ .venv/Scripts/_decimal.pyd filter=lfs diff=lfs merge=lfs -text
43
+ .venv/Scripts/_elementtree.pyd filter=lfs diff=lfs merge=lfs -text
44
+ .venv/Scripts/_lzma.pyd filter=lfs diff=lfs merge=lfs -text
45
+ .venv/Scripts/_sqlite3.pyd filter=lfs diff=lfs merge=lfs -text
46
+ .venv/Scripts/_ssl.pyd filter=lfs diff=lfs merge=lfs -text
47
+ .venv/Scripts/_testcapi.pyd filter=lfs diff=lfs merge=lfs -text
48
+ .venv/Scripts/_testclinic.pyd filter=lfs diff=lfs merge=lfs -text
49
+ .venv/Scripts/_testlimitedcapi.pyd filter=lfs diff=lfs merge=lfs -text
50
+ .venv/Scripts/_zstd.pyd filter=lfs diff=lfs merge=lfs -text
51
+ .venv/Scripts/libcrypto-3.dll filter=lfs diff=lfs merge=lfs -text
52
+ .venv/Scripts/libssl-3.dll filter=lfs diff=lfs merge=lfs -text
53
+ .venv/Scripts/pip-3.14.exe filter=lfs diff=lfs merge=lfs -text
54
+ .venv/Scripts/pip.exe filter=lfs diff=lfs merge=lfs -text
55
+ .venv/Scripts/pip3.14.exe filter=lfs diff=lfs merge=lfs -text
56
+ .venv/Scripts/pip3.exe filter=lfs diff=lfs merge=lfs -text
57
+ .venv/Scripts/pyexpat.pyd filter=lfs diff=lfs merge=lfs -text
58
+ .venv/Scripts/python.exe filter=lfs diff=lfs merge=lfs -text
59
+ .venv/Scripts/python314.dll filter=lfs diff=lfs merge=lfs -text
60
+ .venv/Scripts/pythonw.exe filter=lfs diff=lfs merge=lfs -text
61
+ .venv/Scripts/sqlite3.dll filter=lfs diff=lfs merge=lfs -text
62
+ .venv/Scripts/tcl86t.dll filter=lfs diff=lfs merge=lfs -text
63
+ .venv/Scripts/tk86t.dll filter=lfs diff=lfs merge=lfs -text
64
+ .venv/Scripts/unicodedata.pyd filter=lfs diff=lfs merge=lfs -text
65
+ .venv/Scripts/vcruntime140.dll filter=lfs diff=lfs merge=lfs -text
66
+ .venv/Scripts/zlib1.dll filter=lfs diff=lfs merge=lfs -text
.idea/.gitignore ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ # Default ignored files
2
+ /shelf/
3
+ /workspace.xml
.idea/ESG3in1.iml ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="PYTHON_MODULE" version="4">
3
+ <component name="NewModuleRootManager">
4
+ <content url="file://$MODULE_DIR$">
5
+ <excludeFolder url="file://$MODULE_DIR$/.venv" />
6
+ <excludeFolder url="file://$MODULE_DIR$/.venv1" />
7
+ </content>
8
+ <orderEntry type="jdk" jdkName="Python 3.13" jdkType="Python SDK" />
9
+ <orderEntry type="sourceFolder" forTests="false" />
10
+ </component>
11
+ </module>
.idea/inspectionProfiles/Project_Default.xml ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <component name="InspectionProjectProfileManager">
2
+ <profile version="1.0">
3
+ <option name="myName" value="Project Default" />
4
+ <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
5
+ <inspection_tool class="PyCompatibilityInspection" enabled="true" level="WARNING" enabled_by_default="true">
6
+ <option name="ourVersions">
7
+ <value>
8
+ <list size="8">
9
+ <item index="0" class="java.lang.String" itemvalue="2.7" />
10
+ <item index="1" class="java.lang.String" itemvalue="3.13" />
11
+ <item index="2" class="java.lang.String" itemvalue="3.6" />
12
+ <item index="3" class="java.lang.String" itemvalue="3.5" />
13
+ <item index="4" class="java.lang.String" itemvalue="3.12" />
14
+ <item index="5" class="java.lang.String" itemvalue="3.11" />
15
+ <item index="6" class="java.lang.String" itemvalue="3.10" />
16
+ <item index="7" class="java.lang.String" itemvalue="3.9" />
17
+ </list>
18
+ </value>
19
+ </option>
20
+ </inspection_tool>
21
+ </profile>
22
+ </component>
.idea/inspectionProfiles/profiles_settings.xml ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ <component name="InspectionProjectProfileManager">
2
+ <settings>
3
+ <option name="USE_PROJECT_PROFILE" value="false" />
4
+ <version value="1.0" />
5
+ </settings>
6
+ </component>
.idea/misc.xml ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="Black">
4
+ <option name="sdkName" value="Python 3.13" />
5
+ </component>
6
+ <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.13" project-jdk-type="Python SDK" />
7
+ <component name="PythonCompatibilityInspectionAdvertiser">
8
+ <option name="version" value="3" />
9
+ </component>
10
+ </project>
.idea/modules.xml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/ESG3in1.iml" filepath="$PROJECT_DIR$/.idea/ESG3in1.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
.idea/workspace.xml ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="AutoImportSettings">
4
+ <option name="autoReloadType" value="SELECTIVE" />
5
+ </component>
6
+ <component name="ChangeListManager">
7
+ <list default="true" id="58b490ad-ae76-43d7-ac0b-902c68f09c63" name="Changes" comment="" />
8
+ <option name="SHOW_DIALOG" value="false" />
9
+ <option name="HIGHLIGHT_CONFLICTS" value="true" />
10
+ <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
11
+ <option name="LAST_RESOLUTION" value="IGNORE" />
12
+ </component>
13
+ <component name="FileTemplateManagerImpl">
14
+ <option name="RECENT_TEMPLATES">
15
+ <list>
16
+ <option value="Python Script" />
17
+ </list>
18
+ </option>
19
+ </component>
20
+ <component name="ProjectColorInfo">{
21
+ &quot;associatedIndex&quot;: 8
22
+ }</component>
23
+ <component name="ProjectId" id="30jjNP5eqVP6cfuxZjUcOyUgjPT" />
24
+ <component name="ProjectViewState">
25
+ <option name="hideEmptyMiddlePackages" value="true" />
26
+ <option name="showLibraryContents" value="true" />
27
+ </component>
28
+ <component name="PropertiesComponent"><![CDATA[{
29
+ "keyToString": {
30
+ "ModuleVcsDetector.initialDetectionPerformed": "true",
31
+ "RunOnceActivity.ShowReadmeOnStart": "true",
32
+ "junie.onboarding.icon.badge.shown": "true",
33
+ "last_opened_file_path": "D:/Projects/ESG3in1",
34
+ "node.js.detected.package.eslint": "true",
35
+ "node.js.detected.package.tslint": "true",
36
+ "node.js.selected.package.eslint": "(autodetect)",
37
+ "node.js.selected.package.tslint": "(autodetect)",
38
+ "nodejs_package_manager_path": "npm",
39
+ "settings.editor.selected.configurable": "reference.idesettings.debugger.python",
40
+ "to.speed.mode.migration.done": "true",
41
+ "vue.rearranger.settings.migration": "true"
42
+ }
43
+ }]]></component>
44
+ <component name="SharedIndexes">
45
+ <attachedChunks>
46
+ <set>
47
+ <option value="bundled-python-sdk-7e47963ff851-f0eec537fc84-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-252.23892.515" />
48
+ </set>
49
+ </attachedChunks>
50
+ </component>
51
+ <component name="TaskManager">
52
+ <task active="true" id="Default" summary="Default task">
53
+ <changelist id="58b490ad-ae76-43d7-ac0b-902c68f09c63" name="Changes" comment="" />
54
+ <created>1754147835391</created>
55
+ <option name="number" value="Default" />
56
+ <option name="presentableId" value="Default" />
57
+ <updated>1754147835391</updated>
58
+ <workItem from="1754148715710" duration="1798000" />
59
+ <workItem from="1754187381448" duration="396000" />
60
+ <workItem from="1754188185684" duration="8091000" />
61
+ <workItem from="1754213222339" duration="1469000" />
62
+ <workItem from="1754230488275" duration="2217000" />
63
+ <workItem from="1754445789390" duration="14000" />
64
+ </task>
65
+ <servers />
66
+ </component>
67
+ <component name="TypeScriptGeneratedFilesManager">
68
+ <option name="version" value="3" />
69
+ </component>
70
+ </project>
.streamlit/secrets.toml ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ [openrouter]
2
+ api_key = "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"
.venv/.gitignore ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ # created by virtualenv automatically
2
+ *
.venv/CACHEDIR.TAG ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ Signature: 8a477f597d28d172789f06886806bc55
2
+ # This file is a cache directory tag created by Python virtualenv.
3
+ # For information about cache directory tags, see:
4
+ # https://bford.info/cachedir/
.venv/Lib/site-packages/__pycache__/_virtualenv.cpython-314.pyc ADDED
Binary file (4.31 kB). View file
 
.venv/Lib/site-packages/_virtualenv.pth ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:69ac3d8f27e679c81b94ab30b3b56e9cd138219b1ba94a1fa3606d5a76a1433d
3
+ size 18
.venv/Lib/site-packages/_virtualenv.py ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Patches that are applied at runtime to the virtual environment."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import sys
7
+
8
+ VIRTUALENV_PATCH_FILE = os.path.join(__file__)
9
+
10
+
11
+ def patch_dist(dist):
12
+ """
13
+ Distutils allows user to configure some arguments via a configuration file:
14
+ https://docs.python.org/3/install/index.html#distutils-configuration-files.
15
+
16
+ Some of this arguments though don't make sense in context of the virtual environment files, let's fix them up.
17
+ """ # noqa: D205
18
+ # we cannot allow some install config as that would get packages installed outside of the virtual environment
19
+ old_parse_config_files = dist.Distribution.parse_config_files
20
+
21
+ def parse_config_files(self, *args, **kwargs):
22
+ result = old_parse_config_files(self, *args, **kwargs)
23
+ install = self.get_option_dict("install")
24
+
25
+ if "prefix" in install: # the prefix governs where to install the libraries
26
+ install["prefix"] = VIRTUALENV_PATCH_FILE, os.path.abspath(sys.prefix)
27
+ for base in ("purelib", "platlib", "headers", "scripts", "data"):
28
+ key = f"install_{base}"
29
+ if key in install: # do not allow global configs to hijack venv paths
30
+ install.pop(key, None)
31
+ return result
32
+
33
+ dist.Distribution.parse_config_files = parse_config_files
34
+
35
+
36
+ # Import hook that patches some modules to ignore configuration values that break package installation in case
37
+ # of virtual environments.
38
+ _DISTUTILS_PATCH = "distutils.dist", "setuptools.dist"
39
+ # https://docs.python.org/3/library/importlib.html#setting-up-an-importer
40
+
41
+
42
+ class _Finder:
43
+ """A meta path finder that allows patching the imported distutils modules."""
44
+
45
+ fullname = None
46
+
47
+ # lock[0] is threading.Lock(), but initialized lazily to avoid importing threading very early at startup,
48
+ # because there are gevent-based applications that need to be first to import threading by themselves.
49
+ # See https://github.com/pypa/virtualenv/issues/1895 for details.
50
+ lock = [] # noqa: RUF012
51
+
52
+ def find_spec(self, fullname, path, target=None): # noqa: ARG002
53
+ if fullname in _DISTUTILS_PATCH and self.fullname is None: # noqa: PLR1702
54
+ # initialize lock[0] lazily
55
+ if len(self.lock) == 0:
56
+ import threading # noqa: PLC0415
57
+
58
+ lock = threading.Lock()
59
+ # there is possibility that two threads T1 and T2 are simultaneously running into find_spec,
60
+ # observing .lock as empty, and further going into hereby initialization. However due to the GIL,
61
+ # list.append() operation is atomic and this way only one of the threads will "win" to put the lock
62
+ # - that every thread will use - into .lock[0].
63
+ # https://docs.python.org/3/faq/library.html#what-kinds-of-global-value-mutation-are-thread-safe
64
+ self.lock.append(lock)
65
+
66
+ from functools import partial # noqa: PLC0415
67
+ from importlib.util import find_spec # noqa: PLC0415
68
+
69
+ with self.lock[0]:
70
+ self.fullname = fullname
71
+ try:
72
+ spec = find_spec(fullname, path)
73
+ if spec is not None:
74
+ # https://www.python.org/dev/peps/pep-0451/#how-loading-will-work
75
+ is_new_api = hasattr(spec.loader, "exec_module")
76
+ func_name = "exec_module" if is_new_api else "load_module"
77
+ old = getattr(spec.loader, func_name)
78
+ func = self.exec_module if is_new_api else self.load_module
79
+ if old is not func:
80
+ try: # noqa: SIM105
81
+ setattr(spec.loader, func_name, partial(func, old))
82
+ except AttributeError:
83
+ pass # C-Extension loaders are r/o such as zipimporter with <3.7
84
+ return spec
85
+ finally:
86
+ self.fullname = None
87
+ return None
88
+
89
+ @staticmethod
90
+ def exec_module(old, module):
91
+ old(module)
92
+ if module.__name__ in _DISTUTILS_PATCH:
93
+ patch_dist(module)
94
+
95
+ @staticmethod
96
+ def load_module(old, name):
97
+ module = old(name)
98
+ if module.__name__ in _DISTUTILS_PATCH:
99
+ patch_dist(module)
100
+ return module
101
+
102
+
103
+ sys.meta_path.insert(0, _Finder())
.venv/Lib/site-packages/pip-25.1.1.dist-info/INSTALLER ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
.venv/Lib/site-packages/pip-25.1.1.dist-info/METADATA ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Metadata-Version: 2.4
2
+ Name: pip
3
+ Version: 25.1.1
4
+ Summary: The PyPA recommended tool for installing Python packages.
5
+ Author-email: The pip developers <distutils-sig@python.org>
6
+ License: MIT
7
+ Project-URL: Homepage, https://pip.pypa.io/
8
+ Project-URL: Documentation, https://pip.pypa.io
9
+ Project-URL: Source, https://github.com/pypa/pip
10
+ Project-URL: Changelog, https://pip.pypa.io/en/stable/news/
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Topic :: Software Development :: Build Tools
15
+ Classifier: Programming Language :: Python
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3 :: Only
18
+ Classifier: Programming Language :: Python :: 3.9
19
+ Classifier: Programming Language :: Python :: 3.10
20
+ Classifier: Programming Language :: Python :: 3.11
21
+ Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
+ Classifier: Programming Language :: Python :: Implementation :: CPython
24
+ Classifier: Programming Language :: Python :: Implementation :: PyPy
25
+ Requires-Python: >=3.9
26
+ Description-Content-Type: text/x-rst
27
+ License-File: LICENSE.txt
28
+ License-File: AUTHORS.txt
29
+ Dynamic: license-file
30
+
31
+ pip - The Python Package Installer
32
+ ==================================
33
+
34
+ .. |pypi-version| image:: https://img.shields.io/pypi/v/pip.svg
35
+ :target: https://pypi.org/project/pip/
36
+ :alt: PyPI
37
+
38
+ .. |python-versions| image:: https://img.shields.io/pypi/pyversions/pip
39
+ :target: https://pypi.org/project/pip
40
+ :alt: PyPI - Python Version
41
+
42
+ .. |docs-badge| image:: https://readthedocs.org/projects/pip/badge/?version=latest
43
+ :target: https://pip.pypa.io/en/latest
44
+ :alt: Documentation
45
+
46
+ |pypi-version| |python-versions| |docs-badge|
47
+
48
+ pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.
49
+
50
+ Please take a look at our documentation for how to install and use pip:
51
+
52
+ * `Installation`_
53
+ * `Usage`_
54
+
55
+ We release updates regularly, with a new version every 3 months. Find more details in our documentation:
56
+
57
+ * `Release notes`_
58
+ * `Release process`_
59
+
60
+ If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms:
61
+
62
+ * `Issue tracking`_
63
+ * `Discourse channel`_
64
+ * `User IRC`_
65
+
66
+ 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:
67
+
68
+ * `GitHub page`_
69
+ * `Development documentation`_
70
+ * `Development IRC`_
71
+
72
+ Code of Conduct
73
+ ---------------
74
+
75
+ Everyone interacting in the pip project's codebases, issue trackers, chat
76
+ rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_.
77
+
78
+ .. _package installer: https://packaging.python.org/guides/tool-recommendations/
79
+ .. _Python Package Index: https://pypi.org
80
+ .. _Installation: https://pip.pypa.io/en/stable/installation/
81
+ .. _Usage: https://pip.pypa.io/en/stable/
82
+ .. _Release notes: https://pip.pypa.io/en/stable/news.html
83
+ .. _Release process: https://pip.pypa.io/en/latest/development/release-process/
84
+ .. _GitHub page: https://github.com/pypa/pip
85
+ .. _Development documentation: https://pip.pypa.io/en/latest/development
86
+ .. _Issue tracking: https://github.com/pypa/pip/issues
87
+ .. _Discourse channel: https://discuss.python.org/c/packaging
88
+ .. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa
89
+ .. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev
90
+ .. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md
.venv/Lib/site-packages/pip-25.1.1.dist-info/RECORD ADDED
@@ -0,0 +1,912 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ pip/__init__.py,sha256=zQQ7Na8YWi0IN86IUKEzDAJtyVpXdJXYDkQ536caUiQ,357
2
+ pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854
3
+ pip/__pip-runner__.py,sha256=JOoEZTwrtv7jRaXBkgSQKAE04yNyfFmGHxqpHiGHvL0,1450
4
+ pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286
5
+ pip/_internal/__init__.py,sha256=MfcoOluDZ8QMCFYal04IqOJ9q6m2V7a0aOsnI-WOxUo,513
6
+ pip/_internal/build_env.py,sha256=60_espLI9X3C2db3Ww2gIcyjNk2cAPNcc5gsVO4DOqg,10924
7
+ pip/_internal/cache.py,sha256=SjhJK1C6NbonrU4AyYXKTOH0CGOk5cJrYt60mRANnPM,10368
8
+ pip/_internal/configuration.py,sha256=-KOok6jh3hFzXMPQFPJ1_EFjBpAsge-RSreQuLHLmzo,14005
9
+ pip/_internal/exceptions.py,sha256=wpE11H0e4L9G6AH70sRG149z82X7wX530HK-9eA_DIQ,28464
10
+ pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340
11
+ pip/_internal/pyproject.py,sha256=GLJ6rWRS5_2noKdajohoLyDty57Z7QXhcUAYghmTnWc,7286
12
+ pip/_internal/self_outdated_check.py,sha256=1PFtttvLAeyCVR3tPoBq2sOlPD0IJ-KSqU6bc1HUk9c,8318
13
+ pip/_internal/wheel_builder.py,sha256=Z5Z2ANADbKdSHY9BHqw9zG5-1AxstO6YM6m9yLWe7Vw,11212
14
+ pip/_internal/cli/__init__.py,sha256=Iqg_tKA771XuMO1P4t_sDHnSKPzkUb9D0DqunAmw_ko,131
15
+ pip/_internal/cli/autocompletion.py,sha256=fs0Wy16Ga5tX1IZKvww5BDi7i5zyzfCPvu7cgXlgXys,6864
16
+ pip/_internal/cli/base_command.py,sha256=0A8YuJVJh2YyXU8pdW0eidLg1eklCW5cU01mpI-FAxA,8351
17
+ pip/_internal/cli/cmdoptions.py,sha256=-_V4gjMa0c3U8-vXKAyb5xVViJNzFAxBI3Zx_6Ds5-g,31909
18
+ pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774
19
+ pip/_internal/cli/index_command.py,sha256=kplkusUgCZy75jNCo-etaDmSG8UvqcR2W50ALDdm6dk,5720
20
+ pip/_internal/cli/main.py,sha256=1bXC7uL3tdb_EZlGVKs6_TgzC9tlKU7zhAZsbZA-IzY,2816
21
+ pip/_internal/cli/main_parser.py,sha256=chZqNmCuO_JYt8ynBCumh4crURaRoXBZ0RxoSYQIwCw,4337
22
+ pip/_internal/cli/parser.py,sha256=VCMtduzECUV87KaHNu-xJ-wLNL82yT3x16V4XBxOAqI,10825
23
+ pip/_internal/cli/progress_bars.py,sha256=r9BD4T2-egcInB1Uh9Jjw3EP9F3INy5kZhGwSePm9jo,4435
24
+ pip/_internal/cli/req_command.py,sha256=1yfssBvnUKNer8D7iT3OHqdJJNdCqRhwDqUFWgieppk,12934
25
+ pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118
26
+ pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
27
+ pip/_internal/commands/__init__.py,sha256=3405KyFv4l0ruxeF69oosFanxNQcC_fHBGv7Rpt0PXg,4009
28
+ pip/_internal/commands/cache.py,sha256=IOezTicHjGE5sWdBx2nwPVgbjuJHM3s-BZEkpZLemuY,8107
29
+ pip/_internal/commands/check.py,sha256=Hr_4eiMd9cgVDgEvjtIdw915NmL7ROIWW8enkr8slPQ,2268
30
+ pip/_internal/commands/completion.py,sha256=W9QFQTPLjy2tPACJ_y3g9EgB1pbsh7pvCUX8ocuIdPg,4554
31
+ pip/_internal/commands/configuration.py,sha256=n98enwp6y0b5G6fiRQjaZo43FlJKYve_daMhN-4BRNc,9766
32
+ pip/_internal/commands/debug.py,sha256=DNDRgE9YsKrbYzU0s3VKi8rHtKF4X13CJ_br_8PUXO0,6797
33
+ pip/_internal/commands/download.py,sha256=0qB0nys6ZEPsog451lDsjL5Bx7Z97t-B80oFZKhpzKM,5273
34
+ pip/_internal/commands/freeze.py,sha256=YW-aMmAzzOaBWWobo9g4DPKuWp0dTC32lWMqXzKFLzE,3144
35
+ pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703
36
+ pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132
37
+ pip/_internal/commands/index.py,sha256=8UucFVwx6FmM8cNbaPY8iI5kZdV3f6jhqDa-S8aGgpg,5068
38
+ pip/_internal/commands/inspect.py,sha256=PGrY9TRTRCM3y5Ml8Bdk8DEOXquWRfscr4DRo1LOTPc,3189
39
+ pip/_internal/commands/install.py,sha256=SRsiLpead7A8bLdxMqxTAJM3sUFHtgN9zgBT98UQz5E,29757
40
+ pip/_internal/commands/list.py,sha256=Rwtf8B0d0-WrkM7Qsv41-dWg8I_r9BLuZV30wSWnzgU,13274
41
+ pip/_internal/commands/lock.py,sha256=bUYrryKa769UXM61imojoeVVgc_1ZHK-9a0hIJmmlCg,5941
42
+ pip/_internal/commands/search.py,sha256=IrfvxcRCSoZY9A5XAlCF1wtl_y2HPcXslQdHcjzwMNk,5784
43
+ pip/_internal/commands/show.py,sha256=Yh5rGYhR2Io5TkL0fFCMWE1VqqM4xhPHjhbdS3QgEac,8028
44
+ pip/_internal/commands/uninstall.py,sha256=7pOR7enK76gimyxQbzxcG1OsyLXL3DvX939xmM8Fvtg,3892
45
+ pip/_internal/commands/wheel.py,sha256=NEfaVF4f41VBNSn93RL8gkfCEDmdGhbP9xu_dE6cdUk,6346
46
+ pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858
47
+ pip/_internal/distributions/base.py,sha256=QeB9qvKXDIjLdPBDE5fMgpfGqMMCr-govnuoQnGuiF8,1783
48
+ pip/_internal/distributions/installed.py,sha256=QinHFbWAQ8oE0pbD8MFZWkwlnfU1QYTccA1vnhrlYOU,842
49
+ pip/_internal/distributions/sdist.py,sha256=PlcP4a6-R6c98XnOM-b6Lkb3rsvh9iG4ok8shaanrzs,6751
50
+ pip/_internal/distributions/wheel.py,sha256=THBYfnv7VVt8mYhMYUtH13S1E7FDwtDyDfmUcl8ai0E,1317
51
+ pip/_internal/index/__init__.py,sha256=tzwMH_fhQeubwMqHdSivasg1cRgTSbNg2CiMVnzMmyU,29
52
+ pip/_internal/index/collector.py,sha256=RdPO0JLAlmyBWPAWYHPyRoGjz3GNAeTngCNkbGey_mE,16265
53
+ pip/_internal/index/package_finder.py,sha256=RohRzzLExoXl7QDdTiqyxIaQEcHUn6UNOr9KzC1vjL0,38446
54
+ pip/_internal/index/sources.py,sha256=lPBLK5Xiy8Q6IQMio26Wl7ocfZOKkgGklIBNyUJ23fI,8632
55
+ pip/_internal/locations/__init__.py,sha256=vvTMNxghT0aEXrSdqpNtuRDGx08bzJxfDAUUfQ0Vb0A,14309
56
+ pip/_internal/locations/_distutils.py,sha256=x6nyVLj7X11Y4khIdf-mFlxMl2FWadtVEgeb8upc_WI,6013
57
+ pip/_internal/locations/_sysconfig.py,sha256=IGzds60qsFneRogC-oeBaY7bEh3lPt_v47kMJChQXsU,7724
58
+ pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556
59
+ pip/_internal/metadata/__init__.py,sha256=nGWuZvjQlIHudlMz_-bsUs2LDA2ZKNPGevZoEGcd64Y,5723
60
+ pip/_internal/metadata/_json.py,sha256=ezrIYazHCINM2QUk1eA9wEAMj3aeGWeDVgGalgUzKpc,2707
61
+ pip/_internal/metadata/base.py,sha256=jCbzdIc8MgWnPR4rfrvSQhSVzSoOyKOXhj3xe8BoG8c,25467
62
+ pip/_internal/metadata/pkg_resources.py,sha256=U07ETAINSGeSRBfWUG93E4tZZbaW_f7PGzEqZN0hulc,10542
63
+ pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135
64
+ pip/_internal/metadata/importlib/_compat.py,sha256=c6av8sP8BBjAZuFSJow1iWfygUXNM3xRTCn5nqw6B9M,2796
65
+ pip/_internal/metadata/importlib/_dists.py,sha256=ftmYiyfUGUIjnVwt6W-Ijsimy5c28KgmXly5Q5IQ2P4,8279
66
+ pip/_internal/metadata/importlib/_envs.py,sha256=X63CkdAPJCYPhefYSLiQzPf9ijMXm5nL_A_Z68yp2-w,5297
67
+ pip/_internal/models/__init__.py,sha256=AjmCEBxX_MH9f_jVjIGNCFJKYCYeSEe18yyvNx4uRKQ,62
68
+ pip/_internal/models/candidate.py,sha256=zzgFRuw_kWPjKpGw7LC0ZUMD2CQ2EberUIYs8izjdCA,753
69
+ pip/_internal/models/direct_url.py,sha256=lJ1fIVTgk5UG5SzTNR0FpgSGAQjChlH-3otgiEJAhIs,6576
70
+ pip/_internal/models/format_control.py,sha256=wtsQqSK9HaUiNxQEuB-C62eVimw6G4_VQFxV9-_KDBE,2486
71
+ pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030
72
+ pip/_internal/models/installation_report.py,sha256=zRVZoaz-2vsrezj_H3hLOhMZCK9c7TbzWgC-jOalD00,2818
73
+ pip/_internal/models/link.py,sha256=wIAgxhiu05ycLhbtAibknXX5L6X9ju_PPLVnMcvh9B4,21511
74
+ pip/_internal/models/pylock.py,sha256=n3-I26bf2v-Kn6qcx4ATB_Zel2SLhaUxZBmsMeGgYAo,6196
75
+ pip/_internal/models/scheme.py,sha256=PakmHJM3e8OOWSZFtfz1Az7f1meONJnkGuQxFlt3wBE,575
76
+ pip/_internal/models/search_scope.py,sha256=67NEnsYY84784S-MM7ekQuo9KXLH-7MzFntXjapvAo0,4531
77
+ pip/_internal/models/selection_prefs.py,sha256=qaFfDs3ciqoXPg6xx45N1jPLqccLJw4N0s4P0PyHTQ8,2015
78
+ pip/_internal/models/target_python.py,sha256=2XaH2rZ5ZF-K5wcJbEMGEl7SqrTToDDNkrtQ2v_v_-Q,4271
79
+ pip/_internal/models/wheel.py,sha256=10NUTXIRjf2P8oe1Wzolv8oUv7-YurrOduVFUIaDhdM,5506
80
+ pip/_internal/network/__init__.py,sha256=FMy06P__y6jMjUc8z3ZcQdKF-pmZ2zM14_vBeHPGhUI,49
81
+ pip/_internal/network/auth.py,sha256=D4gASjUrqoDFlSt6gQ767KAAjv6PUyJU0puDlhXNVRE,20809
82
+ pip/_internal/network/cache.py,sha256=JGYT-BUaSMdEBwII_K1UE6qyBItz7hzGkyLl_JRzkBY,4613
83
+ pip/_internal/network/download.py,sha256=6IdZyoERWIsXXFUFL_h_e_xi8Z0G0UlpkodPy8qKv2U,11078
84
+ pip/_internal/network/lazy_wheel.py,sha256=PBdoMoNQQIA84Fhgne38jWF52W4x_KtsHjxgv4dkRKA,7622
85
+ pip/_internal/network/session.py,sha256=msM4es16LmmNEYNkrYyg8fTc7gAHbKFltawfKP27LOI,18771
86
+ pip/_internal/network/utils.py,sha256=Inaxel-NxBu4PQWkjyErdnfewsFCcgHph7dzR1-FboY,4088
87
+ pip/_internal/network/xmlrpc.py,sha256=jW9oDSWamMld3iZOO9RbonVC8ZStkHyppCszoevkuJg,1837
88
+ pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
+ pip/_internal/operations/check.py,sha256=4cnD_2eglsDe5s2CoYkxDt4HcRitTywzLMfTZ-tGQ4U,5911
90
+ pip/_internal/operations/freeze.py,sha256=1_M79jAQKnCxWr-KCCmHuVXOVFGaUJHmoWLfFzgh7K4,9843
91
+ pip/_internal/operations/prepare.py,sha256=-i9dYwwJJjN7h6sZTabcz84tizgn7EAsY0sHnLAfs3Q,28363
92
+ pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
+ pip/_internal/operations/build/build_tracker.py,sha256=-ARW_TcjHCOX7D2NUOGntB4Fgc6b4aolsXkAK6BWL7w,4774
94
+ pip/_internal/operations/build/metadata.py,sha256=INHaeiRfOiLYCXApfDNRo9Cw2xI4VwTc0KItvfdfOjk,1421
95
+ pip/_internal/operations/build/metadata_editable.py,sha256=oWudMsnjy4loO_Jy7g4N9nxsnaEX_iDlVRgCy7pu1rs,1509
96
+ pip/_internal/operations/build/metadata_legacy.py,sha256=wv8cFA0wTqF62Jlm9QwloYZsofOyQ7sWBBmvCcVvn1k,2189
97
+ pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075
98
+ pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417
99
+ pip/_internal/operations/build/wheel_legacy.py,sha256=KXpyGYoCQYcudXNZvohLXgWHaCk4Gf3z0dbS9ol4uu0,3620
100
+ pip/_internal/operations/install/__init__.py,sha256=ak-UETcQPKlFZaWoYKWu5QVXbpFBvg0sXc3i0O4vSYY,50
101
+ pip/_internal/operations/install/editable_legacy.py,sha256=TI6wT8sLqDTprWZLYEOBOe7a6-1B9uwKb7kTBxLIaWY,1282
102
+ pip/_internal/operations/install/wheel.py,sha256=4NYSQ9ypl69iiduh5gUPCK3WNYqouTHZ0rMXoVgkiZw,27553
103
+ pip/_internal/req/__init__.py,sha256=dX2QGlfDwEqE5pLjOeM-f2qEgXFn6f2Vdi_zIHAYy1k,3096
104
+ pip/_internal/req/constructors.py,sha256=v1qzCN1mIldwx-nCrPc8JO4lxkm3Fv8M5RWvt8LISjc,18430
105
+ pip/_internal/req/req_dependency_group.py,sha256=5PGuZidqwDeTHZkP4tnNrlPrasfvJBONd1B5S0146zs,2677
106
+ pip/_internal/req/req_file.py,sha256=eys82McgaICOGic2UZRHjD720piKJPwmeSYdXlWwl6w,20234
107
+ pip/_internal/req/req_install.py,sha256=gMoFak9zrhjHlHaOQxPFheHKtIobppFgq1WrKel_nTE,35788
108
+ pip/_internal/req/req_set.py,sha256=j3esG0s6SzoVReX9rWn4rpYNtyET_fwxbwJPRimvRxo,2858
109
+ pip/_internal/req/req_uninstall.py,sha256=PQ6SyocDycUYsLAsTpjkbdwO_qjdo-y8BvQfZ5Avdrw,24075
110
+ pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
+ pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583
112
+ pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
+ pip/_internal/resolution/legacy/resolver.py,sha256=3HZiJBRd1FTN6jQpI4qRO8-TbLYeIbUTS6PFvXnXs2w,24068
114
+ pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
+ pip/_internal/resolution/resolvelib/base.py,sha256=DCf669FsqyQY5uqXeePDHQY1e4QO-pBzWH8O0s9-K94,5023
116
+ pip/_internal/resolution/resolvelib/candidates.py,sha256=U3Qp83jhM_RiJviyrlPCijbps6wYO6VsTDaTnCf_B3o,20241
117
+ pip/_internal/resolution/resolvelib/factory.py,sha256=FCvHc9M8UJ_7iU63QtPiHuq_BmfdnBiMJ8WaDBJNFxk,32668
118
+ pip/_internal/resolution/resolvelib/found_candidates.py,sha256=6lAF_pLQ2_Z0CBOHIFxGp6NfvT1uwIpCui6e-GgI5tk,6000
119
+ pip/_internal/resolution/resolvelib/provider.py,sha256=8ptYOOjfa336D4FZ751EQHR0LDq8jJhIGJXDou8Cv8Y,11190
120
+ pip/_internal/resolution/resolvelib/reporter.py,sha256=EwJAHOjWZ8eTHQWss7zJjmQEj6ooP6oWSwwVXFtgpqQ,3260
121
+ pip/_internal/resolution/resolvelib/requirements.py,sha256=7JG4Z72e5Yk4vU0S5ulGvbqTy4FMQGYhY5zQhX9zTtY,8065
122
+ pip/_internal/resolution/resolvelib/resolver.py,sha256=9zcR4c7UZV1j2ILTmb68Ck_5HdvQvf4cmTBE2bWHkKg,12785
123
+ pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
124
+ pip/_internal/utils/_jaraco_text.py,sha256=M15uUPIh5NpP1tdUGBxRau6q1ZAEtI8-XyLEETscFfE,3350
125
+ pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015
126
+ pip/_internal/utils/appdirs.py,sha256=zrIISCn2QxlXYw-zJZZBTrFNTyy_0WNKiI-TOoN6wJo,1705
127
+ pip/_internal/utils/compat.py,sha256=ckkFveBiYQjRWjkNsajt_oWPS57tJvE8XxoC4OIYgCY,2399
128
+ pip/_internal/utils/compatibility_tags.py,sha256=q5W7IrNlqC5ke0AqWRG6aX5pimiqh--xuPCCNwCKPsU,6662
129
+ pip/_internal/utils/datetime.py,sha256=Gt29Ml4ToPSM88j54iu43WKtrU9A-moP4QmMiiqzedU,241
130
+ pip/_internal/utils/deprecation.py,sha256=k7Qg_UBAaaTdyq82YVARA6D7RmcGTXGv7fnfcgigj4Q,3707
131
+ pip/_internal/utils/direct_url_helpers.py,sha256=r2MRtkVDACv9AGqYODBUC9CjwgtsUU1s68hmgfCJMtA,3196
132
+ pip/_internal/utils/egg_link.py,sha256=0FePZoUYKv4RGQ2t6x7w5Z427wbA_Uo3WZnAkrgsuqo,2463
133
+ pip/_internal/utils/entrypoints.py,sha256=4CheZ81OBPPLb3Gn-X_WEPtllUibpwDVzlVQ4RFh7PM,3325
134
+ pip/_internal/utils/filesystem.py,sha256=ajvA-q4ocliW9kPp8Yquh-4vssXbu-UKbo5FV9V4X64,4950
135
+ pip/_internal/utils/filetypes.py,sha256=OCPzUxq3Aa6k_95MiI8DYgkOzutTs47fA-v-vYUJp9E,715
136
+ pip/_internal/utils/glibc.py,sha256=vUkWq_1pJuzcYNcGKLlQmABoUiisK8noYY1yc8Wq4w4,3734
137
+ pip/_internal/utils/hashes.py,sha256=XGGLL0AG8-RhWnyz87xF6MFZ--BKadHU35D47eApCKI,4972
138
+ pip/_internal/utils/logging.py,sha256=zMZK1NxfhM4QMGUyaU9q1grNuDhLSVbSkGCvZBKmaPw,12076
139
+ pip/_internal/utils/misc.py,sha256=DWnYxBUItjRp7hhxEg4ih6P6YpKrykM86dbi_EcU8SQ,23450
140
+ pip/_internal/utils/packaging.py,sha256=CjJOqLNENW-U88ojOllVL40f1ab2W2Bm3KHCavwNNfw,1603
141
+ pip/_internal/utils/retry.py,sha256=mhFbykXjhTnZfgzeuy-vl9c8nECnYn_CMtwNJX2tYzQ,1392
142
+ pip/_internal/utils/setuptools_build.py,sha256=J9EyRantVgu4V-xS_qfQy2mcPLVUM7A-227QdKGUZCA,4482
143
+ pip/_internal/utils/subprocess.py,sha256=EsvqSRiSMHF98T8Txmu6NLU3U--MpTTQjtNgKP0P--M,8988
144
+ pip/_internal/utils/temp_dir.py,sha256=5qOXe8M4JeY6vaFQM867d5zkp1bSwMZ-KT5jymmP0Zg,9310
145
+ pip/_internal/utils/unpacking.py,sha256=4yCqlRAI2zxl5tfxlnLoWLNcEn-k1c3vaet_oaJ42iI,11926
146
+ pip/_internal/utils/urls.py,sha256=qceSOZb5lbNDrHNsv7_S4L4Ytszja5NwPKUMnZHbYnM,1599
147
+ pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456
148
+ pip/_internal/utils/wheel.py,sha256=MHObYn6d7VyZL10i-W1xoJZ2hT5-wB1WkII70AsYUE8,4493
149
+ pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596
150
+ pip/_internal/vcs/bazaar.py,sha256=EKStcQaKpNu0NK4p5Q10Oc4xb3DUxFw024XrJy40bFQ,3528
151
+ pip/_internal/vcs/git.py,sha256=3KLPrKsDL9xZchmz4H1Obo8fM2Fh8ChrhtDHWjbkj-I,18591
152
+ pip/_internal/vcs/mercurial.py,sha256=oULOhzJ2Uie-06d1omkL-_Gc6meGaUkyogvqG9ZCyPs,5249
153
+ pip/_internal/vcs/subversion.py,sha256=ddTugHBqHzV3ebKlU5QXHPN4gUqlyXbOx8q8NgXKvs8,11735
154
+ pip/_internal/vcs/versioncontrol.py,sha256=cvf_-hnTAjQLXJ3d17FMNhQfcO1AcKWUF10tfrYyP-c,22440
155
+ pip/_vendor/__init__.py,sha256=WzusPTGWIMeQQWSVJ0h2rafGkVTa9WKJ2HT-2-EoZrU,4907
156
+ pip/_vendor/typing_extensions.py,sha256=ipKHUPtZCqL6c-HfvGl-9t0opsXcSL72y4GYjyJXs_g,172702
157
+ pip/_vendor/vendor.txt,sha256=Fym1hhuw75IJOl33NPi5nIJJc66DioBSUWrVRIVtRUE,373
158
+ pip/_vendor/cachecontrol/__init__.py,sha256=x9ecUkiwNvAGfE3g0eaRx3VrJZnZWAluA2LRcvab3HQ,677
159
+ pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737
160
+ pip/_vendor/cachecontrol/adapter.py,sha256=8y6rTPXOzVHmDKCW5CR9sivLVuDv-cpdGcZYdRWNaPw,6599
161
+ pip/_vendor/cachecontrol/cache.py,sha256=OXwv7Fn2AwnKNiahJHnjtvaKLndvVLv_-zO-ltlV9qI,1953
162
+ pip/_vendor/cachecontrol/controller.py,sha256=cx0Hl8xLZgUuXuy78Gih9AYjCtqurmYjVJxyA4yWt7w,19101
163
+ pip/_vendor/cachecontrol/filewrapper.py,sha256=2ktXNPE0KqnyzF24aOsKCA58HQq1xeC6l2g6_zwjghc,4291
164
+ pip/_vendor/cachecontrol/heuristics.py,sha256=gqMXU8w0gQuEQiSdu3Yg-0vd9kW7nrWKbLca75rheGE,4881
165
+ pip/_vendor/cachecontrol/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
166
+ pip/_vendor/cachecontrol/serialize.py,sha256=HQd2IllQ05HzPkVLMXTF2uX5mjEQjDBkxCqUJUODpZk,5163
167
+ pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417
168
+ pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303
169
+ pip/_vendor/cachecontrol/caches/file_cache.py,sha256=d8upFmy_zwaCmlbWEVBlLXFddt8Zw8c5SFpxeOZsdfw,4117
170
+ pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386
171
+ pip/_vendor/certifi/__init__.py,sha256=neIaAf7BM36ygmQCmy-ZsSyjnvjWghFeu13wwEAnjj0,94
172
+ pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
173
+ pip/_vendor/certifi/cacert.pem,sha256=xVsh-Qf3-G1IrdCTVS-1ZRdJ_1-GBQjMu0I9bB-9gMc,297255
174
+ pip/_vendor/certifi/core.py,sha256=2SRT5rIcQChFDbe37BQa-kULxAgJ8qN6l1jfqTp4HIs,4486
175
+ pip/_vendor/certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
176
+ pip/_vendor/dependency_groups/__init__.py,sha256=C3OFu0NGwDzQ4LOmmSOFPsRSvkbBn-mdd4j_5YqJw-s,250
177
+ pip/_vendor/dependency_groups/__main__.py,sha256=UNTM7P5mfVtT7wDi9kOTXWgV3fu3e8bTrt1Qp1jvjKo,1709
178
+ pip/_vendor/dependency_groups/_implementation.py,sha256=Gqb2DlQELRakeHlKf6QtQSW0M-bcEomxHw4JsvID1ls,8041
179
+ pip/_vendor/dependency_groups/_lint_dependency_groups.py,sha256=yp-DDqKXtbkDTNa0ifa-FmOA8ra24lPZEXftW-R5AuI,1710
180
+ pip/_vendor/dependency_groups/_pip_wrapper.py,sha256=nuVW_w_ntVxpE26ELEvngMY0N04sFLsijXRyZZROFG8,1865
181
+ pip/_vendor/dependency_groups/_toml_compat.py,sha256=BHnXnFacm3DeolsA35GjI6qkDApvua-1F20kv3BfZWE,285
182
+ pip/_vendor/dependency_groups/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
183
+ pip/_vendor/distlib/__init__.py,sha256=dcwgYGYGQqAEawBXPDtIx80DO_3cOmFv8HTc8JMzknQ,625
184
+ pip/_vendor/distlib/compat.py,sha256=2jRSjRI4o-vlXeTK2BCGIUhkc6e9ZGhSsacRM5oseTw,41467
185
+ pip/_vendor/distlib/database.py,sha256=mHy_LxiXIsIVRb-T0-idBrVLw3Ffij5teHCpbjmJ9YU,51160
186
+ pip/_vendor/distlib/index.py,sha256=lTbw268rRhj8dw1sib3VZ_0EhSGgoJO3FKJzSFMOaeA,20797
187
+ pip/_vendor/distlib/locators.py,sha256=oBeAZpFuPQSY09MgNnLfQGGAXXvVO96BFpZyKMuK4tM,51026
188
+ pip/_vendor/distlib/manifest.py,sha256=3qfmAmVwxRqU1o23AlfXrQGZzh6g_GGzTAP_Hb9C5zQ,14168
189
+ pip/_vendor/distlib/markers.py,sha256=X6sDvkFGcYS8gUW8hfsWuKEKAqhQZAJ7iXOMLxRYjYk,5164
190
+ pip/_vendor/distlib/metadata.py,sha256=zil3sg2EUfLXVigljY2d_03IJt-JSs7nX-73fECMX2s,38724
191
+ pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
192
+ pip/_vendor/distlib/scripts.py,sha256=BJliaDAZaVB7WAkwokgC3HXwLD2iWiHaVI50H7C6eG8,18608
193
+ pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792
194
+ pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784
195
+ pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032
196
+ pip/_vendor/distlib/util.py,sha256=vMPGvsS4j9hF6Y9k3Tyom1aaHLb0rFmZAEyzeAdel9w,66682
197
+ pip/_vendor/distlib/version.py,sha256=s5VIs8wBn0fxzGxWM_aA2ZZyx525HcZbMvcTlTyZ3Rg,23727
198
+ pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648
199
+ pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448
200
+ pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888
201
+ pip/_vendor/distlib/wheel.py,sha256=DFIVguEQHCdxnSdAO0dfFsgMcvVZitg7bCOuLwZ7A_s,43979
202
+ pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
203
+ pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64
204
+ pip/_vendor/distro/distro.py,sha256=XqbefacAhDT4zr_trnbA15eY8vdK4GTghgmvUGrEM_4,49430
205
+ pip/_vendor/distro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
206
+ pip/_vendor/idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868
207
+ pip/_vendor/idna/codec.py,sha256=PEew3ItwzjW4hymbasnty2N2OXvNcgHB-JjrBuxHPYY,3422
208
+ pip/_vendor/idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316
209
+ pip/_vendor/idna/core.py,sha256=YJYyAMnwiQEPjVC4-Fqu_p4CJ6yKKuDGmppBNQNQpFs,13239
210
+ pip/_vendor/idna/idnadata.py,sha256=W30GcIGvtOWYwAjZj4ZjuouUutC6ffgNuyjJy7fZ-lo,78306
211
+ pip/_vendor/idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898
212
+ pip/_vendor/idna/package_data.py,sha256=q59S3OXsc5VI8j6vSD0sGBMyk6zZ4vWFREE88yCJYKs,21
213
+ pip/_vendor/idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
214
+ pip/_vendor/idna/uts46data.py,sha256=rt90K9J40gUSwppDPCrhjgi5AA6pWM65dEGRSf6rIhM,239289
215
+ pip/_vendor/msgpack/__init__.py,sha256=reRaiOtEzSjPnr7TpxjgIvbfln5pV66FhricAs2eC-g,1109
216
+ pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081
217
+ pip/_vendor/msgpack/ext.py,sha256=kteJv03n9tYzd5oo3xYopVTo4vRaAxonBQQJhXohZZo,5726
218
+ pip/_vendor/msgpack/fallback.py,sha256=0g1Pzp0vtmBEmJ5w9F3s_-JMVURP8RS4G1cc5TRaAsI,32390
219
+ pip/_vendor/packaging/__init__.py,sha256=_0cDiPVf2S-bNfVmZguxxzmrIYWlyASxpqph4qsJWUc,494
220
+ pip/_vendor/packaging/_elffile.py,sha256=UkrbDtW7aeq3qqoAfU16ojyHZ1xsTvGke_WqMTKAKd0,3286
221
+ pip/_vendor/packaging/_manylinux.py,sha256=t4y_-dTOcfr36gLY-ztiOpxxJFGO2ikC11HgfysGxiM,9596
222
+ pip/_vendor/packaging/_musllinux.py,sha256=p9ZqNYiOItGee8KcZFeHF_YcdhVwGHdK6r-8lgixvGQ,2694
223
+ pip/_vendor/packaging/_parser.py,sha256=gYfnj0pRHflVc4RHZit13KNTyN9iiVcU2RUCGi22BwM,10221
224
+ pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431
225
+ pip/_vendor/packaging/_tokenizer.py,sha256=OYzt7qKxylOAJ-q0XyK1qAycyPRYLfMPdGQKRXkZWyI,5310
226
+ pip/_vendor/packaging/markers.py,sha256=P0we27jm1xUzgGMJxBjtUFCIWeBxTsMeJTOJ6chZmAY,12049
227
+ pip/_vendor/packaging/metadata.py,sha256=8IZErqQQnNm53dZZuYq4FGU4_dpyinMeH1QFBIWIkfE,34739
228
+ pip/_vendor/packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
229
+ pip/_vendor/packaging/requirements.py,sha256=gYyRSAdbrIyKDY66ugIDUQjRMvxkH2ALioTmX3tnL6o,2947
230
+ pip/_vendor/packaging/specifiers.py,sha256=yc9D_MycJEmwUpZvcs1OZL9HfiNFmyw0RZaeHRNHkPw,40079
231
+ pip/_vendor/packaging/tags.py,sha256=41s97W9Zatrq2Ed7Rc3qeBDaHe8pKKvYq2mGjwahfXk,22745
232
+ pip/_vendor/packaging/utils.py,sha256=0F3Hh9OFuRgrhTgGZUl5K22Fv1YP2tZl1z_2gO6kJiA,5050
233
+ pip/_vendor/packaging/version.py,sha256=oiHqzTUv_p12hpjgsLDVcaF5hT7pDaSOViUNMD4GTW0,16688
234
+ pip/_vendor/packaging/licenses/__init__.py,sha256=3bx-gryo4sRv5LsrwApouy65VIs3u6irSORJzALkrzU,5727
235
+ pip/_vendor/packaging/licenses/_spdx.py,sha256=oAm1ztPFwlsmCKe7lAAsv_OIOfS1cWDu9bNBkeu-2ns,48398
236
+ pip/_vendor/pkg_resources/__init__.py,sha256=jrhDRbOubP74QuPXxd7U7Po42PH2l-LZ2XfcO7llpZ4,124463
237
+ pip/_vendor/platformdirs/__init__.py,sha256=UfeSHWl8AeTtbOBOoHAxK4dODOWkZtfy-m_i7cWdJ8c,22344
238
+ pip/_vendor/platformdirs/__main__.py,sha256=jBJ8zb7Mpx5ebcqF83xrpO94MaeCpNGHVf9cvDN2JLg,1505
239
+ pip/_vendor/platformdirs/android.py,sha256=r0DshVBf-RO1jXJGX8C4Til7F1XWt-bkdWMgmvEiaYg,9013
240
+ pip/_vendor/platformdirs/api.py,sha256=U9EzI3EYxcXWUCtIGRllqrcN99i2LSY1mq2-GtsUwEQ,9277
241
+ pip/_vendor/platformdirs/macos.py,sha256=UlbyFZ8Rzu3xndCqQEHrfsYTeHwYdFap1Ioz-yxveT4,6154
242
+ pip/_vendor/platformdirs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
243
+ pip/_vendor/platformdirs/unix.py,sha256=WZmkUA--L3JNRGmz32s35YfoD3ica6xKIPdCV_HhLcs,10458
244
+ pip/_vendor/platformdirs/version.py,sha256=0fnw4ljascx7O5PfIeZ2yj6w3pAkqwp099vDcivxuvY,511
245
+ pip/_vendor/platformdirs/windows.py,sha256=IFpiohUBwxPtCzlyKwNtxyW4Jk8haa6W8o59mfrDXVo,10125
246
+ pip/_vendor/pygments/__init__.py,sha256=qMm7-KYqNpMrmjymZaqfH-_9iJtjnexAKodkb9G5D5g,2983
247
+ pip/_vendor/pygments/__main__.py,sha256=WrndpSe6i1ckX_SQ1KaxD9CTKGzD0EuCOFxcbwFpoLU,353
248
+ pip/_vendor/pygments/console.py,sha256=AagDWqwea2yBWf10KC9ptBgMpMjxKp8yABAmh-NQOVk,1718
249
+ pip/_vendor/pygments/filter.py,sha256=YLtpTnZiu07nY3oK9nfR6E9Y1FBHhP5PX8gvkJWcfag,1910
250
+ pip/_vendor/pygments/formatter.py,sha256=KZQMmyo_xkOIkQG8g66LYEkBh1bx7a0HyGCBcvhI9Ew,4390
251
+ pip/_vendor/pygments/lexer.py,sha256=_kBrOJ_NT5Tl0IVM0rA9c8eysP6_yrlGzEQI0eVYB-A,35349
252
+ pip/_vendor/pygments/modeline.py,sha256=K5eSkR8GS1r5OkXXTHOcV0aM_6xpk9eWNEIAW-OOJ2g,1005
253
+ pip/_vendor/pygments/plugin.py,sha256=tPx0rJCTIZ9ioRgLNYG4pifCbAwTRUZddvLw-NfAk2w,1891
254
+ pip/_vendor/pygments/regexopt.py,sha256=wXaP9Gjp_hKAdnICqoDkRxAOQJSc4v3X6mcxx3z-TNs,3072
255
+ pip/_vendor/pygments/scanner.py,sha256=nNcETRR1tRuiTaHmHSTTECVYFPcLf6mDZu1e4u91A9E,3092
256
+ pip/_vendor/pygments/sphinxext.py,sha256=5x7Zh9YlU6ISJ31dMwduiaanb5dWZnKg3MyEQsseNnQ,7981
257
+ pip/_vendor/pygments/style.py,sha256=PlOZqlsnTVd58RGy50vkA2cXQ_lP5bF5EGMEBTno6DA,6420
258
+ pip/_vendor/pygments/token.py,sha256=WbdWGhYm_Vosb0DDxW9lHNPgITXfWTsQmHt6cy9RbcM,6226
259
+ pip/_vendor/pygments/unistring.py,sha256=al-_rBemRuGvinsrM6atNsHTmJ6DUbw24q2O2Ru1cBc,63208
260
+ pip/_vendor/pygments/util.py,sha256=oRtSpiAo5jM9ulntkvVbgXUdiAW57jnuYGB7t9fYuhc,10031
261
+ pip/_vendor/pygments/filters/__init__.py,sha256=4U4jtA0X3iP83uQnB9-TI-HDSw8E8y8zMYHa0UjbbaI,40392
262
+ pip/_vendor/pygments/formatters/__init__.py,sha256=KTwBmnXlaopJhQDOemVHYHskiDghuq-08YtP6xPNJPg,5385
263
+ pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176
264
+ pip/_vendor/pygments/lexers/__init__.py,sha256=wbIME35GH7bI1B9rNPJFqWT-ij_RApZDYPUlZycaLzA,12115
265
+ pip/_vendor/pygments/lexers/_mapping.py,sha256=l4tCXM8e9aPC2BD6sjIr0deT-J-z5tHgCwL-p1fS0PE,77602
266
+ pip/_vendor/pygments/lexers/python.py,sha256=vxjn1cOHclIKJKxoyiBsQTY65GHbkZtZRuKQ2AVCKaw,53853
267
+ pip/_vendor/pygments/styles/__init__.py,sha256=x9ebctfyvCAFpMTlMJ5YxwcNYBzjgq6zJaKkNm78r4M,2042
268
+ pip/_vendor/pygments/styles/_mapping.py,sha256=6lovFUE29tz6EsV3XYY4hgozJ7q1JL7cfO3UOlgnS8w,3312
269
+ pip/_vendor/pyproject_hooks/__init__.py,sha256=cPB_a9LXz5xvsRbX1o2qyAdjLatZJdQ_Lc5McNX-X7Y,691
270
+ pip/_vendor/pyproject_hooks/_impl.py,sha256=jY-raxnmyRyB57ruAitrJRUzEexuAhGTpgMygqx67Z4,14936
271
+ pip/_vendor/pyproject_hooks/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
272
+ pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=MJNPpfIxcO-FghxpBbxkG1rFiQf6HOUbV4U5mq0HFns,557
273
+ pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=qcXMhmx__MIJq10gGHW3mA4Tl8dy8YzHMccwnNoKlw0,12216
274
+ pip/_vendor/requests/__init__.py,sha256=HlB_HzhrzGtfD_aaYUwUh1zWXLZ75_YCLyit75d0Vz8,5057
275
+ pip/_vendor/requests/__version__.py,sha256=FVfglgZmNQnmYPXpOohDU58F5EUb_-VnSTaAesS187g,435
276
+ pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495
277
+ pip/_vendor/requests/adapters.py,sha256=J7VeVxKBvawbtlX2DERVo05J9BXTcWYLMHNd1Baa-bk,27607
278
+ pip/_vendor/requests/api.py,sha256=_Zb9Oa7tzVIizTKwFrPjDEY9ejtm_OnSRERnADxGsQs,6449
279
+ pip/_vendor/requests/auth.py,sha256=kF75tqnLctZ9Mf_hm9TZIj4cQWnN5uxRz8oWsx5wmR0,10186
280
+ pip/_vendor/requests/certs.py,sha256=kHDlkK_beuHXeMPc5jta2wgl8gdKeUWt5f2nTDVrvt8,441
281
+ pip/_vendor/requests/compat.py,sha256=Mo9f9xZpefod8Zm-n9_StJcVTmwSukXR2p3IQyyVXvU,1485
282
+ pip/_vendor/requests/cookies.py,sha256=bNi-iqEj4NPZ00-ob-rHvzkvObzN3lEpgw3g6paS3Xw,18590
283
+ pip/_vendor/requests/exceptions.py,sha256=D1wqzYWne1mS2rU43tP9CeN1G7QAy7eqL9o1god6Ejw,4272
284
+ pip/_vendor/requests/help.py,sha256=hRKaf9u0G7fdwrqMHtF3oG16RKktRf6KiwtSq2Fo1_0,3813
285
+ pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733
286
+ pip/_vendor/requests/models.py,sha256=x4K4CmH-lC0l2Kb-iPfMN4dRXxHEcbOaEWBL_i09AwI,35483
287
+ pip/_vendor/requests/packages.py,sha256=_ZQDCJTJ8SP3kVWunSqBsRZNPzj2c1WFVqbdr08pz3U,1057
288
+ pip/_vendor/requests/sessions.py,sha256=ykTI8UWGSltOfH07HKollH7kTBGw4WhiBVaQGmckTw4,30495
289
+ pip/_vendor/requests/status_codes.py,sha256=iJUAeA25baTdw-6PfD0eF4qhpINDJRJI-yaMqxs4LEI,4322
290
+ pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912
291
+ pip/_vendor/requests/utils.py,sha256=L79vnFbzJ3SFLKtJwpoWe41Tozi3RlZv94pY1TFIyow,33631
292
+ pip/_vendor/resolvelib/__init__.py,sha256=4LcBWHMH317EKEkpV5XLVnqiU1lrmCiygjsADuCgz4s,541
293
+ pip/_vendor/resolvelib/providers.py,sha256=pIWJbIdJJ9GFtNbtwTH0Ia43Vj6hYCEJj2DOLue15FM,8914
294
+ pip/_vendor/resolvelib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
295
+ pip/_vendor/resolvelib/reporters.py,sha256=8BNa7G9cKW4Lie4BhDhd7Z57J_Vlb1CYPGSgVN2erMA,2038
296
+ pip/_vendor/resolvelib/structs.py,sha256=pu-EJiR2IBITr2SQeNPRa0rXhjlStfmO_GEgAhr3004,6420
297
+ pip/_vendor/resolvelib/resolvers/__init__.py,sha256=GMYuhrbSsYTIjOij0tuJKLvlk6UXmp3nXQetn2sOvpQ,640
298
+ pip/_vendor/resolvelib/resolvers/abstract.py,sha256=jZOBVigE4PUub9i3F-bTvBwaIXX8S9EU3CGASBvFqEU,1558
299
+ pip/_vendor/resolvelib/resolvers/criterion.py,sha256=lcmZGv5sKHOnFD_RzZwvlGSj19MeA-5rCMpdf2Sgw7Y,1768
300
+ pip/_vendor/resolvelib/resolvers/exceptions.py,sha256=ln_jaQtgLlRUSFY627yiHG2gD7AgaXzRKaElFVh7fDQ,1768
301
+ pip/_vendor/resolvelib/resolvers/resolution.py,sha256=yQegMuOmlzAElLLpgD-k6NbPDMCQf29rWhiFC26OdkM,20671
302
+ pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090
303
+ pip/_vendor/rich/__main__.py,sha256=eO7Cq8JnrgG8zVoeImiAs92q3hXNMIfp0w5lMsO7Q2Y,8477
304
+ pip/_vendor/rich/_cell_widths.py,sha256=fbmeyetEdHjzE_Vx2l1uK7tnPOhMs2X1lJfO3vsKDpA,10209
305
+ pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235
306
+ pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064
307
+ pip/_vendor/rich/_export_format.py,sha256=RI08pSrm5tBSzPMvnbTqbD9WIalaOoN5d4M1RTmLq1Y,2128
308
+ pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265
309
+ pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799
310
+ pip/_vendor/rich/_inspect.py,sha256=QM05lEFnFoTaFqpnbx-zBEI6k8oIKrD3cvjEOQNhKig,9655
311
+ pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225
312
+ pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236
313
+ pip/_vendor/rich/_null_file.py,sha256=ADGKp1yt-k70FMKV6tnqCqecB-rSJzp-WQsD7LPL-kg,1394
314
+ pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063
315
+ pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423
316
+ pip/_vendor/rich/_ratio.py,sha256=Zt58apszI6hAAcXPpgdWKpu3c31UBWebOeR4mbyptvU,5471
317
+ pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919
318
+ pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351
319
+ pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417
320
+ pip/_vendor/rich/_win32_console.py,sha256=BSaDRIMwBLITn_m0mTRLPqME5q-quGdSMuYMpYeYJwc,22755
321
+ pip/_vendor/rich/_windows.py,sha256=aBwaD_S56SbgopIvayVmpk0Y28uwY2C5Bab1wl3Bp-I,1925
322
+ pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783
323
+ pip/_vendor/rich/_wrap.py,sha256=FlSsom5EX0LVkA3KWy34yHnCfLtqX-ZIepXKh-70rpc,3404
324
+ pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890
325
+ pip/_vendor/rich/align.py,sha256=Rh-3adnDaN1Ao07EjR2PhgE62PGLPgO8SMwJBku1urQ,10469
326
+ pip/_vendor/rich/ansi.py,sha256=Avs1LHbSdcyOvDOdpELZUoULcBiYewY76eNBp6uFBhs,6921
327
+ pip/_vendor/rich/bar.py,sha256=ldbVHOzKJOnflVNuv1xS7g6dLX2E3wMnXkdPbpzJTcs,3263
328
+ pip/_vendor/rich/box.py,sha256=nr5fYIUghB_iUCEq6y0Z3LlCT8gFPDrzN9u2kn7tJl4,10831
329
+ pip/_vendor/rich/cells.py,sha256=KrQkj5-LghCCpJLSNQIyAZjndc4bnEqOEmi5YuZ9UCY,5130
330
+ pip/_vendor/rich/color.py,sha256=3HSULVDj7qQkXUdFWv78JOiSZzfy5y1nkcYhna296V0,18211
331
+ pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054
332
+ pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131
333
+ pip/_vendor/rich/console.py,sha256=_RJizBQIn9qxr4Ln7Q_SC5N9ekPWPAxH0KGVxsgg69Y,100565
334
+ pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288
335
+ pip/_vendor/rich/containers.py,sha256=c_56TxcedGYqDepHBMTuZdUIijitAQgnox-Qde0Z1qo,5502
336
+ pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630
337
+ pip/_vendor/rich/default_styles.py,sha256=khQFqqaoDs3bprMqWpHw8nO5UpG2DN6QtuTd6LzZwYc,8257
338
+ pip/_vendor/rich/diagnose.py,sha256=WNPjU2pEdrPICJ24KOaTD_hzP839qArpmF1JIM5x_EQ,998
339
+ pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501
340
+ pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642
341
+ pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683
342
+ pip/_vendor/rich/filesize.py,sha256=_iz9lIpRgvW7MNSeCZnLg-HwzbP4GETg543WqD8SFs0,2484
343
+ pip/_vendor/rich/highlighter.py,sha256=G_sn-8DKjM1sEjLG_oc4ovkWmiUpWvj8bXi0yed2LnY,9586
344
+ pip/_vendor/rich/json.py,sha256=vVEoKdawoJRjAFayPwXkMBPLy7RSTs-f44wSQDR2nJ0,5031
345
+ pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252
346
+ pip/_vendor/rich/layout.py,sha256=ajkSFAtEVv9EFTcFs-w4uZfft7nEXhNzL7ZVdgrT5rI,14004
347
+ pip/_vendor/rich/live.py,sha256=DhzAPEnjTxQuq9_0Y2xh2MUwQcP_aGPkenLfKETslwM,14270
348
+ pip/_vendor/rich/live_render.py,sha256=zJtB471jGziBtEwxc54x12wEQtH4BuQr1SA8v9kU82w,3666
349
+ pip/_vendor/rich/logging.py,sha256=ZgpKMMBY_BuMAI_BYzo-UtXak6t5oH9VK8m9Q2Lm0f4,12458
350
+ pip/_vendor/rich/markup.py,sha256=3euGKP5s41NCQwaSjTnJxus5iZMHjxpIM0W6fCxra38,8451
351
+ pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305
352
+ pip/_vendor/rich/padding.py,sha256=KVEI3tOwo9sgK1YNSuH__M1_jUWmLZwRVV_KmOtVzyM,4908
353
+ pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828
354
+ pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396
355
+ pip/_vendor/rich/panel.py,sha256=SUDaa3z4MU7vIjzvbi0SXuc6BslDzADwdY1AX4TbTdY,11225
356
+ pip/_vendor/rich/pretty.py,sha256=gy3S72u4FRg2ytoo7N1ZDWDIvB4unbzd5iUGdgm-8fc,36391
357
+ pip/_vendor/rich/progress.py,sha256=MtmCjTk5zYU_XtRHxRHTAEHG6hF9PeF7EMWbEPleIC0,60357
358
+ pip/_vendor/rich/progress_bar.py,sha256=mZTPpJUwcfcdgQCTTz3kyY-fc79ddLwtx6Ghhxfo064,8162
359
+ pip/_vendor/rich/prompt.py,sha256=l0RhQU-0UVTV9e08xW1BbIj0Jq2IXyChX4lC0lFNzt4,12447
360
+ pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391
361
+ pip/_vendor/rich/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
362
+ pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166
363
+ pip/_vendor/rich/repr.py,sha256=5MZJZmONgC6kud-QW-_m1okXwL2aR6u6y-pUcUCJz28,4431
364
+ pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602
365
+ pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843
366
+ pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591
367
+ pip/_vendor/rich/segment.py,sha256=otnKeKGEV-WRlQVosfJVeFDcDxAKHpvJ_hLzSu5lumM,24743
368
+ pip/_vendor/rich/spinner.py,sha256=PT5qgXPG3ZpqRj7n3EZQ6NW56mx3ldZqZCU7gEMyZk4,4364
369
+ pip/_vendor/rich/status.py,sha256=kkPph3YeAZBo-X-4wPp8gTqZyU466NLwZBA4PZTTewo,4424
370
+ pip/_vendor/rich/style.py,sha256=xpj4uMBZMtuNuNomfUiamigl3p1sDvTCZwrG1tcTVeg,27059
371
+ pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258
372
+ pip/_vendor/rich/syntax.py,sha256=qqAnEUZ4K57Po81_5RBxnsuU4KRzSdvDPAhKw8ma_3E,35763
373
+ pip/_vendor/rich/table.py,sha256=ZmT7V7MMCOYKw7TGY9SZLyYDf6JdM-WVf07FdVuVhTI,40049
374
+ pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370
375
+ pip/_vendor/rich/text.py,sha256=AO7JPCz6-gaN1thVLXMBntEmDPVYFgFNG1oM61_sanU,47552
376
+ pip/_vendor/rich/theme.py,sha256=oNyhXhGagtDlbDye3tVu3esWOWk0vNkuxFw-_unlaK0,3771
377
+ pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102
378
+ pip/_vendor/rich/traceback.py,sha256=ZA8Q67DyP5a_stpIh6GPf9IiXj_s3dAhDIr6Zbfkahk,35170
379
+ pip/_vendor/rich/tree.py,sha256=yWnQ6rAvRGJ3qZGqBrxS2SW2TKBTNrP0SdY8QxOFPuw,9451
380
+ pip/_vendor/tomli/__init__.py,sha256=PhNw_eyLgdn7McJ6nrAN8yIm3dXC75vr1sVGVVwDSpA,314
381
+ pip/_vendor/tomli/_parser.py,sha256=9w8LG0jB7fwmZZWB0vVXbeejDHcl4ANIJxB2scEnDlA,25591
382
+ pip/_vendor/tomli/_re.py,sha256=sh4sBDRgO94KJZwNIrgdcyV_qQast50YvzOAUGpRDKA,3171
383
+ pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
384
+ pip/_vendor/tomli/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
385
+ pip/_vendor/tomli_w/__init__.py,sha256=0F8yDtXx3Uunhm874KrAcP76srsM98y7WyHQwCulZbo,169
386
+ pip/_vendor/tomli_w/_writer.py,sha256=dsifFS2xYf1i76mmRyfz9y125xC7Z_HQ845ZKhJsYXs,6961
387
+ pip/_vendor/tomli_w/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
388
+ pip/_vendor/truststore/__init__.py,sha256=2wRSVijjRzPLVXUzWqvdZLNsEOhDfopKLd2EKAYLwKU,1320
389
+ pip/_vendor/truststore/_api.py,sha256=40I0ojO2DnITiHvOnUYvJ1bfQMBKHOkci14noNxEnCs,11246
390
+ pip/_vendor/truststore/_macos.py,sha256=nZlLkOmszUE0g6ryRwBVGY5COzPyudcsiJtDWarM5LQ,20503
391
+ pip/_vendor/truststore/_openssl.py,sha256=LLUZ7ZGaio-i5dpKKjKCSeSufmn6T8pi9lDcFnvSyq0,2324
392
+ pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130
393
+ pip/_vendor/truststore/_windows.py,sha256=rAHyKYD8M7t-bXfG8VgOVa3TpfhVhbt4rZQlO45YuP8,17993
394
+ pip/_vendor/truststore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
395
+ pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
396
+ pip/_vendor/urllib3/_collections.py,sha256=pyASJJhW7wdOpqJj9QJA8FyGRfr8E8uUUhqUvhF0728,11372
397
+ pip/_vendor/urllib3/_version.py,sha256=t9wGB6ooOTXXgiY66K1m6BZS1CJyXHAU8EoWDTe6Shk,64
398
+ pip/_vendor/urllib3/connection.py,sha256=ttIA909BrbTUzwkqEe_TzZVh4JOOj7g61Ysei2mrwGg,20314
399
+ pip/_vendor/urllib3/connectionpool.py,sha256=e2eiAwNbFNCKxj4bwDKNK-w7HIdSz3OmMxU_TIt-evQ,40408
400
+ pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217
401
+ pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579
402
+ pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440
403
+ pip/_vendor/urllib3/poolmanager.py,sha256=aWyhXRtNO4JUnCSVVqKTKQd8EXTvUm1VN9pgs2bcONo,19990
404
+ pip/_vendor/urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691
405
+ pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641
406
+ pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
407
+ pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957
408
+ pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036
409
+ pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528
410
+ pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081
411
+ pip/_vendor/urllib3/contrib/securetransport.py,sha256=Fef1IIUUFHqpevzXiDPbIGkDKchY2FVKeVeLGR1Qq3g,34446
412
+ pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
413
+ pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
414
+ pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632
415
+ pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
416
+ pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
417
+ pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
418
+ pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
419
+ pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417
420
+ pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343
421
+ pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
422
+ pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901
423
+ pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605
424
+ pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
425
+ pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997
426
+ pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
427
+ pip/_vendor/urllib3/util/retry.py,sha256=6ENvOZ8PBDzh8kgixpql9lIrb2dxH-k7ZmBanJF2Ng4,22050
428
+ pip/_vendor/urllib3/util/ssl_.py,sha256=QDuuTxPSCj1rYtZ4xpD7Ux-r20TD50aHyqKyhQ7Bq4A,17460
429
+ pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758
430
+ pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895
431
+ pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168
432
+ pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296
433
+ pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
434
+ pip-25.1.1.dist-info/licenses/AUTHORS.txt,sha256=YzDFTYpeYnwpmODDFTgyKZNKWcfdO10L5Ex_U6kJLRc,11223
435
+ pip-25.1.1.dist-info/licenses/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
436
+ pip-25.1.1.dist-info/METADATA,sha256=QFxj1tLpk8hGWrgQLRhJYUpwo_1FqBr43OT0srIZcmU,3649
437
+ pip-25.1.1.dist-info/WHEEL,sha256=pxyMxgL8-pra_rKaQ4drOZAegBVuX-G_4nRHjjgWbmo,91
438
+ pip-25.1.1.dist-info/entry_points.txt,sha256=eeIjuzfnfR2PrhbjnbzFU6MnSS70kZLxwaHHq6M-bD0,87
439
+ pip-25.1.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
440
+ pip-25.1.1.dist-info/RECORD,,
441
+ pip\_internal\utils\unpacking.cpython-314.pyc,,
442
+ pip\_vendor\urllib3\contrib\__init__.cpython-314.pyc,,
443
+ pip\_vendor\rich\logging.cpython-314.pyc,,
444
+ pip\_vendor\rich\file_proxy.cpython-314.pyc,,
445
+ pip\_vendor\resolvelib\resolvers\abstract.cpython-314.pyc,,
446
+ pip\_vendor\platformdirs\__init__.cpython-314.pyc,,
447
+ pip\_internal\operations\install\__init__.cpython-314.pyc,,
448
+ pip\_internal\utils\entrypoints.cpython-314.pyc,,
449
+ pip\_internal\req\req_file.cpython-314.pyc,,
450
+ pip\_vendor\packaging\markers.cpython-314.pyc,,
451
+ pip\_internal\cli\__pycache__,,
452
+ pip\_internal\models\format_control.cpython-314.pyc,,
453
+ pip\_vendor\requests\exceptions.cpython-314.pyc,,
454
+ pip\_vendor\packaging\_structures.cpython-314.pyc,,
455
+ pip\_vendor\requests\status_codes.cpython-314.pyc,,
456
+ pip\_internal\distributions\installed.cpython-314.pyc,,
457
+ pip\_vendor\dependency_groups\__init__.cpython-314.pyc,,
458
+ pip\_vendor\dependency_groups\_pip_wrapper.cpython-314.pyc,,
459
+ pip\_internal\utils\datetime.cpython-314.pyc,,
460
+ pip\_internal\models\target_python.cpython-314.pyc,,
461
+ pip\_internal\resolution\resolvelib\factory.cpython-314.pyc,,
462
+ pip\_vendor\idna\intranges.cpython-314.pyc,,
463
+ pip\_vendor\rich\syntax.cpython-314.pyc,,
464
+ pip\_vendor\rich\_spinners.cpython-314.pyc,,
465
+ pip\_vendor\cachecontrol\filewrapper.cpython-314.pyc,,
466
+ pip\_vendor\packaging\metadata.cpython-314.pyc,,
467
+ pip\_internal\operations\install\editable_legacy.cpython-314.pyc,,
468
+ pip-25.1.1.virtualenv,,
469
+ pip\_internal\operations\build\metadata_editable.cpython-314.pyc,,
470
+ pip\_vendor\distlib\__pycache__,,
471
+ pip\_internal\commands\help.cpython-314.pyc,,
472
+ pip\_vendor\rich\default_styles.cpython-314.pyc,,
473
+ pip\_internal\network\download.cpython-314.pyc,,
474
+ pip\_vendor\rich\theme.cpython-314.pyc,,
475
+ pip\_vendor\resolvelib\__init__.cpython-314.pyc,,
476
+ pip\_internal\vcs\git.cpython-314.pyc,,
477
+ pip\_internal\cli\index_command.cpython-314.pyc,,
478
+ pip\_internal\build_env.cpython-314.pyc,,
479
+ pip\_internal\req\req_install.cpython-314.pyc,,
480
+ pip\_vendor\truststore\_macos.cpython-314.pyc,,
481
+ pip\_internal\commands\lock.cpython-314.pyc,,
482
+ pip\_vendor\rich\segment.cpython-314.pyc,,
483
+ pip\_internal\vcs\__pycache__,,
484
+ pip\_vendor\pygments\style.cpython-314.pyc,,
485
+ pip\_vendor\platformdirs\api.cpython-314.pyc,,
486
+ pip\_vendor\urllib3\util\connection.cpython-314.pyc,,
487
+ pip\_vendor\rich\_export_format.cpython-314.pyc,,
488
+ pip\_internal\exceptions.cpython-314.pyc,,
489
+ pip\_internal\commands\uninstall.cpython-314.pyc,,
490
+ pip\_internal\network\auth.cpython-314.pyc,,
491
+ pip\_vendor\rich\table.cpython-314.pyc,,
492
+ pip\_internal\resolution\resolvelib\resolver.cpython-314.pyc,,
493
+ pip\_internal\models\link.cpython-314.pyc,,
494
+ pip\_internal\commands\show.cpython-314.pyc,,
495
+ pip\_internal\utils\compat.cpython-314.pyc,,
496
+ pip\_vendor\packaging\_parser.cpython-314.pyc,,
497
+ pip\_vendor\rich\_win32_console.cpython-314.pyc,,
498
+ pip\_vendor\packaging\licenses\__pycache__,,
499
+ pip\_vendor\urllib3\contrib\pyopenssl.cpython-314.pyc,,
500
+ pip\_internal\__init__.cpython-314.pyc,,
501
+ pip\_internal\main.cpython-314.pyc,,
502
+ pip\_internal\locations\_distutils.cpython-314.pyc,,
503
+ pip\_internal\models\wheel.cpython-314.pyc,,
504
+ pip\_internal\network\session.cpython-314.pyc,,
505
+ pip\_vendor\rich\padding.cpython-314.pyc,,
506
+ pip\_vendor\requests\api.cpython-314.pyc,,
507
+ pip\_vendor\urllib3\contrib\ntlmpool.cpython-314.pyc,,
508
+ pip\_internal\utils\logging.cpython-314.pyc,,
509
+ pip\_vendor\rich\pretty.cpython-314.pyc,,
510
+ pip\_internal\cli\progress_bars.cpython-314.pyc,,
511
+ pip\_vendor\rich\_ratio.cpython-314.pyc,,
512
+ pip\_internal\network\xmlrpc.cpython-314.pyc,,
513
+ pip\_internal\metadata\_json.cpython-314.pyc,,
514
+ pip\_vendor\rich\protocol.cpython-314.pyc,,
515
+ pip\_internal\models\index.cpython-314.pyc,,
516
+ pip\_vendor\packaging\__init__.cpython-314.pyc,,
517
+ pip\_vendor\urllib3\util\queue.cpython-314.pyc,,
518
+ pip\_vendor\dependency_groups\_toml_compat.cpython-314.pyc,,
519
+ pip\_vendor\dependency_groups\_lint_dependency_groups.cpython-314.pyc,,
520
+ pip\_internal\operations\build\wheel_editable.cpython-314.pyc,,
521
+ pip\_internal\network\cache.cpython-314.pyc,,
522
+ pip\_vendor\resolvelib\resolvers\criterion.cpython-314.pyc,,
523
+ pip\_vendor\resolvelib\resolvers\__init__.cpython-314.pyc,,
524
+ pip\_vendor\cachecontrol\caches\__init__.cpython-314.pyc,,
525
+ pip\_vendor\tomli_w\__init__.cpython-314.pyc,,
526
+ pip\_vendor\platformdirs\android.cpython-314.pyc,,
527
+ pip\_internal\wheel_builder.cpython-314.pyc,,
528
+ pip\_vendor\urllib3\util\wait.cpython-314.pyc,,
529
+ pip\_vendor\rich\_wrap.cpython-314.pyc,,
530
+ pip\_internal\cli\main_parser.cpython-314.pyc,,
531
+ pip\_vendor\rich\_cell_widths.cpython-314.pyc,,
532
+ pip\_vendor\rich\measure.cpython-314.pyc,,
533
+ pip\_vendor\tomli_w\__pycache__,,
534
+ pip\_vendor\pygments\styles\__pycache__,,
535
+ pip\_internal\commands\hash.cpython-314.pyc,,
536
+ pip\_vendor\rich\_inspect.cpython-314.pyc,,
537
+ pip\_vendor\rich\_loop.cpython-314.pyc,,
538
+ pip\_internal\operations\build\metadata_legacy.cpython-314.pyc,,
539
+ pip\_vendor\packaging\requirements.cpython-314.pyc,,
540
+ pip\_vendor\rich\columns.cpython-314.pyc,,
541
+ pip\_internal\index\sources.cpython-314.pyc,,
542
+ pip\_vendor\pyproject_hooks\_in_process\__pycache__,,
543
+ pip\_vendor\rich\_extension.cpython-314.pyc,,
544
+ pip\_internal\vcs\versioncontrol.cpython-314.pyc,,
545
+ pip\_vendor\idna\core.cpython-314.pyc,,
546
+ pip\_vendor\dependency_groups\_implementation.cpython-314.pyc,,
547
+ pip\_internal\commands\completion.cpython-314.pyc,,
548
+ pip\_vendor\packaging\_musllinux.cpython-314.pyc,,
549
+ pip\_vendor\requests\__version__.cpython-314.pyc,,
550
+ pip\_vendor\urllib3\packages\backports\weakref_finalize.cpython-314.pyc,,
551
+ pip\_internal\operations\build\metadata.cpython-314.pyc,,
552
+ pip\_vendor\pygments\console.cpython-314.pyc,,
553
+ pip\_internal\index\__pycache__,,
554
+ pip\_vendor\pygments\lexer.cpython-314.pyc,,
555
+ pip\_vendor\urllib3\util\ssl_.cpython-314.pyc,,
556
+ pip\_vendor\tomli\_parser.cpython-314.pyc,,
557
+ pip\_internal\network\lazy_wheel.cpython-314.pyc,,
558
+ pip\_vendor\urllib3\util\ssltransport.cpython-314.pyc,,
559
+ pip\_internal\cli\req_command.cpython-314.pyc,,
560
+ pip\_vendor\resolvelib\resolvers\__pycache__,,
561
+ pip\_vendor\pygments\filter.cpython-314.pyc,,
562
+ pip\_internal\index\collector.cpython-314.pyc,,
563
+ pip\_vendor\requests\certs.cpython-314.pyc,,
564
+ pip\_vendor\rich\highlighter.cpython-314.pyc,,
565
+ pip\_vendor\urllib3\connectionpool.cpython-314.pyc,,
566
+ pip\_vendor\requests\compat.cpython-314.pyc,,
567
+ pip\_internal\operations\build\wheel_legacy.cpython-314.pyc,,
568
+ pip\_vendor\requests\cookies.cpython-314.pyc,,
569
+ pip\_vendor\urllib3\packages\backports\makefile.cpython-314.pyc,,
570
+ pip\_vendor\requests\sessions.cpython-314.pyc,,
571
+ pip\_internal\pyproject.cpython-314.pyc,,
572
+ pip\_vendor\urllib3\__pycache__,,
573
+ pip\_vendor\platformdirs\__main__.cpython-314.pyc,,
574
+ pip\_internal\index\__init__.cpython-314.pyc,,
575
+ pip\_vendor\distlib\manifest.cpython-314.pyc,,
576
+ pip\_vendor\pygments\__pycache__,,
577
+ pip\_vendor\idna\__init__.cpython-314.pyc,,
578
+ pip\__init__.cpython-314.pyc,,
579
+ pip\_vendor\cachecontrol\adapter.cpython-314.pyc,,
580
+ pip\_vendor\rich\_windows_renderer.cpython-314.pyc,,
581
+ pip\_vendor\pyproject_hooks\_impl.cpython-314.pyc,,
582
+ pip\_internal\locations\__init__.cpython-314.pyc,,
583
+ pip\_vendor\rich\align.cpython-314.pyc,,
584
+ pip\_vendor\rich\screen.cpython-314.pyc,,
585
+ pip\_vendor\pygments\plugin.cpython-314.pyc,,
586
+ pip\_internal\models\selection_prefs.cpython-314.pyc,,
587
+ pip\_vendor\distlib\util.cpython-314.pyc,,
588
+ pip\_vendor\packaging\_manylinux.cpython-314.pyc,,
589
+ pip\_vendor\pyproject_hooks\__init__.cpython-314.pyc,,
590
+ pip\_internal\resolution\base.cpython-314.pyc,,
591
+ pip\_internal\utils\hashes.cpython-314.pyc,,
592
+ pip\_internal\utils\virtualenv.cpython-314.pyc,,
593
+ pip\_vendor\rich\filesize.cpython-314.pyc,,
594
+ pip\_internal\cli\__init__.cpython-314.pyc,,
595
+ pip\_internal\models\pylock.cpython-314.pyc,,
596
+ pip\_vendor\distlib\locators.cpython-314.pyc,,
597
+ pip\_internal\network\__pycache__,,
598
+ pip\_internal\cli\spinners.cpython-314.pyc,,
599
+ pip\_vendor\urllib3\response.cpython-314.pyc,,
600
+ pip\_internal\network\utils.cpython-314.pyc,,
601
+ pip\_vendor\urllib3\packages\__init__.cpython-314.pyc,,
602
+ pip\_internal\cli\command_context.cpython-314.pyc,,
603
+ pip\_internal\operations\__pycache__,,
604
+ pip\_vendor\msgpack\ext.cpython-314.pyc,,
605
+ pip\_vendor\distlib\__init__.cpython-314.pyc,,
606
+ pip\_vendor\idna\__pycache__,,
607
+ pip\_vendor\rich\spinner.cpython-314.pyc,,
608
+ pip\_internal\cache.cpython-314.pyc,,
609
+ pip\_vendor\rich\markup.cpython-314.pyc,,
610
+ pip\_vendor\tomli\_types.cpython-314.pyc,,
611
+ pip\_vendor\distlib\compat.cpython-314.pyc,,
612
+ pip\_vendor\distlib\version.cpython-314.pyc,,
613
+ pip\_internal\commands\list.cpython-314.pyc,,
614
+ pip\_vendor\idna\codec.cpython-314.pyc,,
615
+ pip\_vendor\rich\pager.cpython-314.pyc,,
616
+ pip\_vendor\rich\text.cpython-314.pyc,,
617
+ pip\_vendor\rich\color.cpython-314.pyc,,
618
+ pip\_vendor\dependency_groups\__pycache__,,
619
+ pip\_vendor\urllib3\contrib\_securetransport\low_level.cpython-314.pyc,,
620
+ pip\_internal\commands\inspect.cpython-314.pyc,,
621
+ pip\_vendor\requests\structures.cpython-314.pyc,,
622
+ pip\_vendor\rich\region.cpython-314.pyc,,
623
+ pip\_vendor\__init__.cpython-314.pyc,,
624
+ pip\_vendor\requests\utils.cpython-314.pyc,,
625
+ pip\_vendor\rich\progress.cpython-314.pyc,,
626
+ pip\_internal\utils\retry.cpython-314.pyc,,
627
+ pip-25.1.1.dist-info\INSTALLER,,
628
+ pip\_vendor\rich\_emoji_replace.cpython-314.pyc,,
629
+ pip\_vendor\urllib3\fields.cpython-314.pyc,,
630
+ pip\_vendor\urllib3\util\url.cpython-314.pyc,,
631
+ pip\_vendor\cachecontrol\_cmd.cpython-314.pyc,,
632
+ pip\_vendor\urllib3\packages\backports\__init__.cpython-314.pyc,,
633
+ pip\_internal\req\req_dependency_group.cpython-314.pyc,,
634
+ pip\_internal\operations\freeze.cpython-314.pyc,,
635
+ pip\_vendor\distlib\resources.cpython-314.pyc,,
636
+ pip\_vendor\rich\_emoji_codes.cpython-314.pyc,,
637
+ pip\_internal\operations\build\__pycache__,,
638
+ pip\_vendor\rich\tree.cpython-314.pyc,,
639
+ pip\_internal\utils\subprocess.cpython-314.pyc,,
640
+ pip\_internal\locations\__pycache__,,
641
+ pip\_vendor\rich\_palettes.cpython-314.pyc,,
642
+ pip\_vendor\urllib3\util\timeout.cpython-314.pyc,,
643
+ ..\..\Scripts\pip.exe,,
644
+ pip\_vendor\rich\rule.cpython-314.pyc,,
645
+ pip\_vendor\cachecontrol\wrapper.cpython-314.pyc,,
646
+ pip\_vendor\packaging\version.cpython-314.pyc,,
647
+ pip\_vendor\urllib3\contrib\securetransport.cpython-314.pyc,,
648
+ pip\_internal\metadata\importlib\_envs.cpython-314.pyc,,
649
+ pip\_vendor\pygments\unistring.cpython-314.pyc,,
650
+ pip\_vendor\rich\terminal_theme.cpython-314.pyc,,
651
+ pip\_internal\commands\search.cpython-314.pyc,,
652
+ pip\_internal\resolution\legacy\__init__.cpython-314.pyc,,
653
+ pip\_internal\commands\debug.cpython-314.pyc,,
654
+ pip\_internal\utils\filesystem.cpython-314.pyc,,
655
+ pip\_vendor\pygments\lexers\__init__.cpython-314.pyc,,
656
+ pip\_internal\commands\freeze.cpython-314.pyc,,
657
+ pip\_vendor\packaging\licenses\_spdx.cpython-314.pyc,,
658
+ pip\_internal\vcs\__init__.cpython-314.pyc,,
659
+ pip\_vendor\pygments\__init__.cpython-314.pyc,,
660
+ pip\_vendor\idna\compat.cpython-314.pyc,,
661
+ pip\_vendor\requests\packages.cpython-314.pyc,,
662
+ pip\_internal\vcs\subversion.cpython-314.pyc,,
663
+ pip\_vendor\certifi\__pycache__,,
664
+ pip\_internal\distributions\__pycache__,,
665
+ pip\_internal\utils\setuptools_build.cpython-314.pyc,,
666
+ pip\_internal\resolution\__pycache__,,
667
+ pip\_internal\utils\compatibility_tags.cpython-314.pyc,,
668
+ pip\_vendor\msgpack\fallback.cpython-314.pyc,,
669
+ pip\_vendor\pygments\scanner.cpython-314.pyc,,
670
+ pip\_vendor\resolvelib\structs.cpython-314.pyc,,
671
+ pip\_internal\network\__init__.cpython-314.pyc,,
672
+ pip\_vendor\rich\themes.cpython-314.pyc,,
673
+ pip\_internal\cli\cmdoptions.cpython-314.pyc,,
674
+ pip\_vendor\idna\idnadata.cpython-314.pyc,,
675
+ pip\_vendor\rich\errors.cpython-314.pyc,,
676
+ pip\_vendor\resolvelib\providers.cpython-314.pyc,,
677
+ pip\_vendor\rich\containers.cpython-314.pyc,,
678
+ pip\_vendor\tomli\_re.cpython-314.pyc,,
679
+ pip\_vendor\resolvelib\__pycache__,,
680
+ pip\_internal\req\req_uninstall.cpython-314.pyc,,
681
+ pip\_internal\models\installation_report.cpython-314.pyc,,
682
+ pip\_vendor\dependency_groups\__main__.cpython-314.pyc,,
683
+ pip\_internal\operations\install\__pycache__,,
684
+ pip\_vendor\platformdirs\version.cpython-314.pyc,,
685
+ pip\_internal\utils\_log.cpython-314.pyc,,
686
+ pip\_vendor\rich\__pycache__,,
687
+ pip\__pip-runner__.cpython-314.pyc,,
688
+ pip\_vendor\pkg_resources\__pycache__,,
689
+ pip\_vendor\rich\abc.cpython-314.pyc,,
690
+ pip\_internal\distributions\wheel.cpython-314.pyc,,
691
+ pip\_vendor\rich\ansi.cpython-314.pyc,,
692
+ pip\_internal\resolution\resolvelib\base.cpython-314.pyc,,
693
+ pip\_vendor\platformdirs\unix.cpython-314.pyc,,
694
+ pip\_vendor\distlib\metadata.cpython-314.pyc,,
695
+ pip\_vendor\urllib3\util\request.cpython-314.pyc,,
696
+ pip\_vendor\rich\constrain.cpython-314.pyc,,
697
+ pip\_internal\metadata\__pycache__,,
698
+ pip\_vendor\resolvelib\reporters.cpython-314.pyc,,
699
+ pip\_vendor\urllib3\contrib\_appengine_environ.cpython-314.pyc,,
700
+ pip\_vendor\urllib3\poolmanager.cpython-314.pyc,,
701
+ pip\_internal\utils\glibc.cpython-314.pyc,,
702
+ pip\_vendor\rich\_null_file.cpython-314.pyc,,
703
+ pip\_internal\commands\download.cpython-314.pyc,,
704
+ pip\_internal\resolution\resolvelib\requirements.cpython-314.pyc,,
705
+ pip\_vendor\platformdirs\macos.cpython-314.pyc,,
706
+ pip\_vendor\urllib3\contrib\appengine.cpython-314.pyc,,
707
+ pip\_vendor\truststore\_openssl.cpython-314.pyc,,
708
+ pip\_internal\utils\__pycache__,,
709
+ pip\_vendor\cachecontrol\caches\redis_cache.cpython-314.pyc,,
710
+ pip\_vendor\urllib3\packages\backports\__pycache__,,
711
+ pip\_vendor\msgpack\exceptions.cpython-314.pyc,,
712
+ pip\_vendor\resolvelib\resolvers\resolution.cpython-314.pyc,,
713
+ pip\_vendor\urllib3\_collections.cpython-314.pyc,,
714
+ pip\_internal\locations\base.cpython-314.pyc,,
715
+ ..\..\Scripts\pip3.14.exe,,
716
+ pip\_internal\metadata\importlib\_compat.cpython-314.pyc,,
717
+ pip\_internal\metadata\pkg_resources.cpython-314.pyc,,
718
+ pip\_internal\metadata\importlib\__init__.cpython-314.pyc,,
719
+ pip\_internal\utils\__init__.cpython-314.pyc,,
720
+ pip\_vendor\rich\_timer.cpython-314.pyc,,
721
+ pip\_internal\req\__pycache__,,
722
+ pip\_vendor\rich\__main__.cpython-314.pyc,,
723
+ pip\_vendor\rich\__init__.cpython-314.pyc,,
724
+ pip\_vendor\packaging\specifiers.cpython-314.pyc,,
725
+ pip\_vendor\packaging\_elffile.cpython-314.pyc,,
726
+ pip\_vendor\pygments\styles\__init__.cpython-314.pyc,,
727
+ pip\_internal\resolution\resolvelib\provider.cpython-314.pyc,,
728
+ pip\_vendor\rich\json.cpython-314.pyc,,
729
+ pip\_vendor\rich\color_triplet.cpython-314.pyc,,
730
+ pip\_internal\metadata\importlib\__pycache__,,
731
+ pip\_internal\utils\wheel.cpython-314.pyc,,
732
+ pip\_vendor\tomli_w\_writer.cpython-314.pyc,,
733
+ pip\_vendor\truststore\_ssl_constants.cpython-314.pyc,,
734
+ pip\_vendor\cachecontrol\caches\file_cache.cpython-314.pyc,,
735
+ pip\_vendor\pyproject_hooks\__pycache__,,
736
+ ..\..\Scripts\pip3.exe,,
737
+ pip\_vendor\distlib\database.cpython-314.pyc,,
738
+ pip\_vendor\rich\layout.cpython-314.pyc,,
739
+ pip\_vendor\requests\models.cpython-314.pyc,,
740
+ pip\_vendor\urllib3\util\__pycache__,,
741
+ pip\_vendor\urllib3\contrib\_securetransport\__init__.cpython-314.pyc,,
742
+ pip\_vendor\cachecontrol\heuristics.cpython-314.pyc,,
743
+ pip\_vendor\rich\bar.cpython-314.pyc,,
744
+ pip\_internal\cli\main.cpython-314.pyc,,
745
+ pip\_vendor\msgpack\__pycache__,,
746
+ pip\_vendor\rich\traceback.cpython-314.pyc,,
747
+ pip\_vendor\urllib3\contrib\_securetransport\bindings.cpython-314.pyc,,
748
+ pip\_internal\utils\egg_link.cpython-314.pyc,,
749
+ pip\_internal\metadata\__init__.cpython-314.pyc,,
750
+ pip\__main__.cpython-314.pyc,,
751
+ pip\_internal\models\scheme.cpython-314.pyc,,
752
+ pip\_vendor\cachecontrol\serialize.cpython-314.pyc,,
753
+ pip\_vendor\rich\panel.cpython-314.pyc,,
754
+ pip\_internal\models\candidate.cpython-314.pyc,,
755
+ pip\_internal\operations\install\wheel.cpython-314.pyc,,
756
+ pip\_vendor\cachecontrol\controller.cpython-314.pyc,,
757
+ pip\_vendor\urllib3\filepost.cpython-314.pyc,,
758
+ pip\_vendor\distro\distro.cpython-314.pyc,,
759
+ pip\_vendor\urllib3\util\__init__.cpython-314.pyc,,
760
+ pip\_internal\metadata\importlib\_dists.cpython-314.pyc,,
761
+ pip\_vendor\requests\__init__.cpython-314.pyc,,
762
+ pip\_internal\vcs\mercurial.cpython-314.pyc,,
763
+ pip\_vendor\rich\repr.cpython-314.pyc,,
764
+ pip\_internal\configuration.cpython-314.pyc,,
765
+ pip\_internal\commands\wheel.cpython-314.pyc,,
766
+ pip\_internal\utils\filetypes.cpython-314.pyc,,
767
+ pip\_vendor\rich\_windows.cpython-314.pyc,,
768
+ pip\_internal\operations\build\wheel.cpython-314.pyc,,
769
+ pip\_vendor\pygments\__main__.cpython-314.pyc,,
770
+ pip\_vendor\rich\status.cpython-314.pyc,,
771
+ pip\_internal\cli\status_codes.cpython-314.pyc,,
772
+ pip\_vendor\msgpack\__init__.cpython-314.pyc,,
773
+ pip\_vendor\pygments\modeline.cpython-314.pyc,,
774
+ pip\_internal\locations\_sysconfig.cpython-314.pyc,,
775
+ pip\_internal\resolution\__init__.cpython-314.pyc,,
776
+ pip\_internal\utils\misc.cpython-314.pyc,,
777
+ pip\_vendor\idna\uts46data.cpython-314.pyc,,
778
+ pip\_vendor\packaging\__pycache__,,
779
+ pip\_vendor\truststore\_windows.cpython-314.pyc,,
780
+ pip\_vendor\rich\live_render.cpython-314.pyc,,
781
+ pip\_vendor\idna\package_data.cpython-314.pyc,,
782
+ pip\_vendor\distro\__main__.cpython-314.pyc,,
783
+ pip\_vendor\urllib3\util\response.cpython-314.pyc,,
784
+ pip\_vendor\certifi\__main__.cpython-314.pyc,,
785
+ pip\_internal\vcs\bazaar.cpython-314.pyc,,
786
+ pip\_vendor\rich\_fileno.cpython-314.pyc,,
787
+ pip\_vendor\urllib3\util\proxy.cpython-314.pyc,,
788
+ pip\_vendor\distlib\markers.cpython-314.pyc,,
789
+ pip\_internal\resolution\resolvelib\reporter.cpython-314.pyc,,
790
+ pip\_vendor\cachecontrol\__pycache__,,
791
+ pip\_vendor\truststore\__pycache__,,
792
+ pip\_internal\utils\deprecation.cpython-314.pyc,,
793
+ pip\_vendor\requests\__pycache__,,
794
+ pip\_internal\commands\check.cpython-314.pyc,,
795
+ ..\..\Scripts\pip-3.14.exe,,
796
+ pip\_internal\req\req_set.cpython-314.pyc,,
797
+ pip\_vendor\packaging\licenses\__init__.cpython-314.pyc,,
798
+ pip\_vendor\pygments\lexers\python.cpython-314.pyc,,
799
+ pip\_internal\utils\urls.cpython-314.pyc,,
800
+ pip\_vendor\resolvelib\resolvers\exceptions.cpython-314.pyc,,
801
+ pip\_internal\models\direct_url.cpython-314.pyc,,
802
+ pip\_vendor\tomli\__pycache__,,
803
+ pip\_internal\commands\__pycache__,,
804
+ pip\_internal\cli\base_command.cpython-314.pyc,,
805
+ pip\_vendor\truststore\_api.cpython-314.pyc,,
806
+ pip\_internal\req\__init__.cpython-314.pyc,,
807
+ pip\_vendor\rich\box.cpython-314.pyc,,
808
+ pip\_vendor\distro\__pycache__,,
809
+ pip\_vendor\urllib3\packages\six.cpython-314.pyc,,
810
+ pip\_vendor\certifi\__init__.cpython-314.pyc,,
811
+ pip\_vendor\pygments\formatters\__pycache__,,
812
+ pip\_internal\commands\__init__.cpython-314.pyc,,
813
+ pip\_internal\resolution\legacy\resolver.cpython-314.pyc,,
814
+ pip\_vendor\rich\_pick.cpython-314.pyc,,
815
+ pip\_internal\commands\cache.cpython-314.pyc,,
816
+ pip\_internal\utils\_jaraco_text.cpython-314.pyc,,
817
+ pip\_vendor\tomli\__init__.cpython-314.pyc,,
818
+ pip\_internal\__pycache__,,
819
+ pip\_internal\resolution\resolvelib\__init__.cpython-314.pyc,,
820
+ pip\_vendor\distro\__init__.cpython-314.pyc,,
821
+ pip\_internal\models\__pycache__,,
822
+ pip\_internal\commands\configuration.cpython-314.pyc,,
823
+ pip\_internal\cli\autocompletion.cpython-314.pyc,,
824
+ pip\_vendor\rich\diagnose.cpython-314.pyc,,
825
+ pip-25.1.1.dist-info\__pycache__,,
826
+ pip\_vendor\rich\styled.cpython-314.pyc,,
827
+ pip\_internal\operations\prepare.cpython-314.pyc,,
828
+ pip\_internal\index\package_finder.cpython-314.pyc,,
829
+ pip\_vendor\pygments\lexers\_mapping.cpython-314.pyc,,
830
+ pip\_vendor\requests\hooks.cpython-314.pyc,,
831
+ pip\_internal\utils\direct_url_helpers.cpython-314.pyc,,
832
+ pip\_vendor\rich\jupyter.cpython-314.pyc,,
833
+ pip\_vendor\pygments\formatters\__init__.cpython-314.pyc,,
834
+ pip\_internal\utils\temp_dir.cpython-314.pyc,,
835
+ pip\_vendor\packaging\tags.cpython-314.pyc,,
836
+ pip\_internal\utils\appdirs.cpython-314.pyc,,
837
+ pip\_vendor\platformdirs\__pycache__,,
838
+ pip\_vendor\requests\auth.cpython-314.pyc,,
839
+ pip\_vendor\packaging\_tokenizer.cpython-314.pyc,,
840
+ pip\_vendor\rich\style.cpython-314.pyc,,
841
+ pip\_internal\utils\packaging.cpython-314.pyc,,
842
+ pip\_vendor\urllib3\contrib\__pycache__,,
843
+ pip\_vendor\urllib3\exceptions.cpython-314.pyc,,
844
+ pip\_vendor\packaging\utils.cpython-314.pyc,,
845
+ pip\_vendor\distlib\wheel.cpython-314.pyc,,
846
+ pip\_vendor\pyproject_hooks\_in_process\_in_process.cpython-314.pyc,,
847
+ pip\_vendor\certifi\core.cpython-314.pyc,,
848
+ pip\_vendor\pygments\token.cpython-314.pyc,,
849
+ pip\_vendor\pygments\formatter.cpython-314.pyc,,
850
+ pip\_internal\self_outdated_check.cpython-314.pyc,,
851
+ pip\_vendor\rich\cells.cpython-314.pyc,,
852
+ pip\_vendor\pkg_resources\__init__.cpython-314.pyc,,
853
+ pip\_internal\resolution\resolvelib\found_candidates.cpython-314.pyc,,
854
+ pip\_vendor\pygments\util.cpython-314.pyc,,
855
+ pip\_vendor\rich\progress_bar.cpython-314.pyc,,
856
+ pip\_vendor\urllib3\contrib\socks.cpython-314.pyc,,
857
+ pip\_vendor\urllib3\util\ssl_match_hostname.cpython-314.pyc,,
858
+ pip\_vendor\pygments\regexopt.cpython-314.pyc,,
859
+ pip\_vendor\pygments\filters\__pycache__,,
860
+ pip\_vendor\rich\emoji.cpython-314.pyc,,
861
+ pip\_vendor\truststore\__init__.cpython-314.pyc,,
862
+ pip\_vendor\rich\control.cpython-314.pyc,,
863
+ pip\_vendor\urllib3\_version.cpython-314.pyc,,
864
+ pip\_vendor\urllib3\contrib\_securetransport\__pycache__,,
865
+ pip\_internal\resolution\resolvelib\candidates.cpython-314.pyc,,
866
+ pip\_vendor\rich\scope.cpython-314.pyc,,
867
+ pip\_internal\models\search_scope.cpython-314.pyc,,
868
+ pip\_vendor\requests\help.cpython-314.pyc,,
869
+ pip\_vendor\pygments\styles\_mapping.cpython-314.pyc,,
870
+ pip\_vendor\pygments\lexers\__pycache__,,
871
+ pip\_internal\metadata\base.cpython-314.pyc,,
872
+ pip\_internal\operations\check.cpython-314.pyc,,
873
+ pip\_vendor\distlib\scripts.cpython-314.pyc,,
874
+ pip\_internal\resolution\resolvelib\__pycache__,,
875
+ pip\_internal\distributions\__init__.cpython-314.pyc,,
876
+ pip\_vendor\urllib3\request.cpython-314.pyc,,
877
+ pip\_vendor\cachecontrol\cache.cpython-314.pyc,,
878
+ pip\_vendor\rich\prompt.cpython-314.pyc,,
879
+ pip\_vendor\pyproject_hooks\_in_process\__init__.cpython-314.pyc,,
880
+ pip\_internal\resolution\legacy\__pycache__,,
881
+ pip\_vendor\rich\_stack.cpython-314.pyc,,
882
+ pip\_vendor\rich\palette.cpython-314.pyc,,
883
+ pip\_vendor\urllib3\packages\__pycache__,,
884
+ pip\_vendor\rich\live.cpython-314.pyc,,
885
+ pip\_vendor\urllib3\__init__.cpython-314.pyc,,
886
+ pip\_internal\req\constructors.cpython-314.pyc,,
887
+ pip\_internal\operations\build\__init__.cpython-314.pyc,,
888
+ pip\_internal\distributions\sdist.cpython-314.pyc,,
889
+ pip\_vendor\pygments\filters\__init__.cpython-314.pyc,,
890
+ pip\_vendor\typing_extensions.cpython-314.pyc,,
891
+ pip\_internal\commands\index.cpython-314.pyc,,
892
+ pip\_internal\commands\install.cpython-314.pyc,,
893
+ pip\_internal\operations\build\build_tracker.cpython-314.pyc,,
894
+ pip\_internal\cli\parser.cpython-314.pyc,,
895
+ pip\_internal\models\__init__.cpython-314.pyc,,
896
+ pip\_internal\operations\__init__.cpython-314.pyc,,
897
+ pip\_vendor\cachecontrol\__init__.cpython-314.pyc,,
898
+ pip\_vendor\cachecontrol\caches\__pycache__,,
899
+ pip\_vendor\pygments\sphinxext.cpython-314.pyc,,
900
+ pip\_vendor\rich\_log_render.cpython-314.pyc,,
901
+ pip\_vendor\urllib3\connection.cpython-314.pyc,,
902
+ pip\_vendor\urllib3\util\retry.cpython-314.pyc,,
903
+ pip-25.1.1.dist-info\licenses\__pycache__,,
904
+ pip\_vendor\distlib\index.cpython-314.pyc,,
905
+ pip\_internal\distributions\base.cpython-314.pyc,,
906
+ pip\_vendor\requests\adapters.cpython-314.pyc,,
907
+ pip\_vendor\__pycache__,,
908
+ pip\_vendor\requests\_internal_utils.cpython-314.pyc,,
909
+ pip\__pycache__,,
910
+ pip\_vendor\platformdirs\windows.cpython-314.pyc,,
911
+ pip\_vendor\pygments\formatters\_mapping.cpython-314.pyc,,
912
+ pip\_vendor\rich\console.cpython-314.pyc,,
.venv/Lib/site-packages/pip-25.1.1.dist-info/WHEEL ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (79.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
.venv/Lib/site-packages/pip-25.1.1.dist-info/entry_points.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ [console_scripts]
2
+ pip = pip._internal.cli.main:main
3
+ pip3 = pip._internal.cli.main:main
.venv/Lib/site-packages/pip-25.1.1.dist-info/licenses/AUTHORS.txt ADDED
@@ -0,0 +1,821 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 Turner
11
+ Adam Wentz
12
+ admin
13
+ Adolfo Ochagavía
14
+ Adrien Morison
15
+ Agus
16
+ ahayrapetyan
17
+ Ahilya
18
+ AinsworthK
19
+ Akash Srivastava
20
+ Alan Yee
21
+ Albert Tugushev
22
+ Albert-Guan
23
+ albertg
24
+ Alberto Sottile
25
+ Aleks Bunin
26
+ Ales Erjavec
27
+ Alethea Flowers
28
+ Alex Gaynor
29
+ Alex Grönholm
30
+ Alex Hedges
31
+ Alex Loosley
32
+ Alex Morega
33
+ Alex Stachowiak
34
+ Alexander Regueiro
35
+ Alexander Shtyrov
36
+ Alexandre Conrad
37
+ Alexey Popravka
38
+ Aleš Erjavec
39
+ Alli
40
+ Ami Fischman
41
+ Ananya Maiti
42
+ Anatoly Techtonik
43
+ Anders Kaseorg
44
+ Andre Aguiar
45
+ Andreas Lutro
46
+ Andrei Geacar
47
+ Andrew Gaul
48
+ Andrew Shymanel
49
+ Andrey Bienkowski
50
+ Andrey Bulgakov
51
+ Andrés Delfino
52
+ Andy Freeland
53
+ Andy Kluger
54
+ Ani Hayrapetyan
55
+ Aniruddha Basak
56
+ Anish Tambe
57
+ Anrs Hu
58
+ Anthony Sottile
59
+ Antoine Musso
60
+ Anton Ovchinnikov
61
+ Anton Patrushev
62
+ Anton Zelenov
63
+ Antonio Alvarado Hernandez
64
+ Antony Lee
65
+ Antti Kaihola
66
+ Anubhav Patel
67
+ Anudit Nagar
68
+ Anuj Godase
69
+ AQNOUCH Mohammed
70
+ AraHaan
71
+ arena
72
+ arenasys
73
+ Arindam Choudhury
74
+ Armin Ronacher
75
+ Arnon Yaari
76
+ Artem
77
+ Arun Babu Neelicattu
78
+ Ashley Manton
79
+ Ashwin Ramaswami
80
+ atse
81
+ Atsushi Odagiri
82
+ Avinash Karhana
83
+ Avner Cohen
84
+ Awit (Ah-Wit) Ghirmai
85
+ Baptiste Mispelon
86
+ Barney Gale
87
+ barneygale
88
+ Bartek Ogryczak
89
+ Bastian Venthur
90
+ Ben Bodenmiller
91
+ Ben Darnell
92
+ Ben Hoyt
93
+ Ben Mares
94
+ Ben Rosser
95
+ Bence Nagy
96
+ Benjamin Peterson
97
+ Benjamin VanEvery
98
+ Benoit Pierre
99
+ Berker Peksag
100
+ Bernard
101
+ Bernard Tyers
102
+ Bernardo B. Marques
103
+ Bernhard M. Wiedemann
104
+ Bertil Hatt
105
+ Bhavam Vidyarthi
106
+ Blazej Michalik
107
+ Bogdan Opanchuk
108
+ BorisZZZ
109
+ Brad Erickson
110
+ Bradley Ayers
111
+ Bradley Reynolds
112
+ Branch Vincent
113
+ Brandon L. Reiss
114
+ Brandt Bucher
115
+ Brannon Dorsey
116
+ Brett Randall
117
+ Brett Rosen
118
+ Brian Cristante
119
+ Brian Rosner
120
+ briantracy
121
+ BrownTruck
122
+ Bruno Oliveira
123
+ Bruno Renié
124
+ Bruno S
125
+ Bstrdsmkr
126
+ Buck Golemon
127
+ burrows
128
+ Bussonnier Matthias
129
+ bwoodsend
130
+ c22
131
+ Caleb Brown
132
+ Caleb Martinez
133
+ Calvin Smith
134
+ Carl Meyer
135
+ Carlos Liam
136
+ Carol Willing
137
+ Carter Thayer
138
+ Cass
139
+ Chandrasekhar Atina
140
+ Charlie Marsh
141
+ charwick
142
+ Chih-Hsuan Yen
143
+ Chris Brinker
144
+ Chris Hunt
145
+ Chris Jerdonek
146
+ Chris Kuehl
147
+ Chris Markiewicz
148
+ Chris McDonough
149
+ Chris Pawley
150
+ Chris Pryer
151
+ Chris Wolfe
152
+ Christian Clauss
153
+ Christian Heimes
154
+ Christian Oudard
155
+ Christoph Reiter
156
+ Christopher Hunt
157
+ Christopher Snyder
158
+ chrysle
159
+ cjc7373
160
+ Clark Boylan
161
+ Claudio Jolowicz
162
+ Clay McClure
163
+ Cody
164
+ Cody Soyland
165
+ Colin Watson
166
+ Collin Anderson
167
+ Connor Osborn
168
+ Cooper Lees
169
+ Cooper Ry Lees
170
+ Cory Benfield
171
+ Cory Wright
172
+ Craig Kerstiens
173
+ Cristian Sorinel
174
+ Cristina
175
+ Cristina Muñoz
176
+ ctg123
177
+ Curtis Doty
178
+ cytolentino
179
+ Daan De Meyer
180
+ Dale
181
+ Damian
182
+ Damian Quiroga
183
+ Damian Shaw
184
+ Dan Black
185
+ Dan Savilonis
186
+ Dan Sully
187
+ Dane Hillard
188
+ daniel
189
+ Daniel Collins
190
+ Daniel Hahler
191
+ Daniel Holth
192
+ Daniel Jost
193
+ Daniel Katz
194
+ Daniel Shaulov
195
+ Daniele Esposti
196
+ Daniele Nicolodi
197
+ Daniele Procida
198
+ Daniil Konovalenko
199
+ Danny Hermes
200
+ Danny McClanahan
201
+ Darren Kavanagh
202
+ Dav Clark
203
+ Dave Abrahams
204
+ Dave Jones
205
+ David Aguilar
206
+ David Black
207
+ David Bordeynik
208
+ David Caro
209
+ David D Lowe
210
+ David Evans
211
+ David Hewitt
212
+ David Linke
213
+ David Poggi
214
+ David Poznik
215
+ David Pursehouse
216
+ David Runge
217
+ David Tucker
218
+ David Wales
219
+ Davidovich
220
+ ddelange
221
+ Deepak Sharma
222
+ Deepyaman Datta
223
+ Denise Yu
224
+ dependabot[bot]
225
+ derwolfe
226
+ Desetude
227
+ developer
228
+ Devesh Kumar Singh
229
+ devsagul
230
+ Diego Caraballo
231
+ Diego Ramirez
232
+ DiegoCaraballo
233
+ Dimitri Merejkowsky
234
+ Dimitri Papadopoulos
235
+ Dimitri Papadopoulos Orfanos
236
+ Dirk Stolle
237
+ Dmitry Gladkov
238
+ Dmitry Volodin
239
+ Domen Kožar
240
+ Dominic Davis-Foster
241
+ Donald Stufft
242
+ Dongweiming
243
+ doron zarhi
244
+ Dos Moonen
245
+ Douglas Thor
246
+ DrFeathers
247
+ Dustin Ingram
248
+ Dustin Rodrigues
249
+ Dwayne Bailey
250
+ Ed Morley
251
+ Edgar Ramírez
252
+ Edgar Ramírez Mondragón
253
+ Ee Durbin
254
+ Efflam Lemaillet
255
+ efflamlemaillet
256
+ Eitan Adler
257
+ ekristina
258
+ elainechan
259
+ Eli Schwartz
260
+ Elisha Hollander
261
+ Ellen Marie Dash
262
+ Emil Burzo
263
+ Emil Styrke
264
+ Emmanuel Arias
265
+ Endoh Takanao
266
+ enoch
267
+ Erdinc Mutlu
268
+ Eric Cousineau
269
+ Eric Gillingham
270
+ Eric Hanchrow
271
+ Eric Hopper
272
+ Erik M. Bray
273
+ Erik Rose
274
+ Erwin Janssen
275
+ Eugene Vereshchagin
276
+ everdimension
277
+ Federico
278
+ Felipe Peter
279
+ Felix Yan
280
+ fiber-space
281
+ Filip Kokosiński
282
+ Filipe Laíns
283
+ Finn Womack
284
+ finnagin
285
+ Flavio Amurrio
286
+ Florian Briand
287
+ Florian Rathgeber
288
+ Francesco
289
+ Francesco Montesano
290
+ Fredrik Orderud
291
+ Fredrik Roubert
292
+ Frost Ming
293
+ Gabriel Curio
294
+ Gabriel de Perthuis
295
+ Garry Polley
296
+ gavin
297
+ gdanielson
298
+ Geoffrey Sneddon
299
+ George Margaritis
300
+ George Song
301
+ Georgi Valkov
302
+ Georgy Pchelkin
303
+ ghost
304
+ Giftlin Rajaiah
305
+ gizmoguy1
306
+ gkdoc
307
+ Godefroid Chapelle
308
+ Gopinath M
309
+ GOTO Hayato
310
+ gousaiyang
311
+ gpiks
312
+ Greg Roodt
313
+ Greg Ward
314
+ Guilherme Espada
315
+ Guillaume Seguin
316
+ gutsytechster
317
+ Guy Rozendorn
318
+ Guy Tuval
319
+ gzpan123
320
+ Hanjun Kim
321
+ Hari Charan
322
+ Harsh Vardhan
323
+ harupy
324
+ Harutaka Kawamura
325
+ hauntsaninja
326
+ Henrich Hartzer
327
+ Henry Schreiner
328
+ Herbert Pfennig
329
+ Holly Stotelmyer
330
+ Honnix
331
+ Hsiaoming Yang
332
+ Hugo Lopes Tavares
333
+ Hugo van Kemenade
334
+ Hugues Bruant
335
+ Hynek Schlawack
336
+ Ian Bicking
337
+ Ian Cordasco
338
+ Ian Lee
339
+ Ian Stapleton Cordasco
340
+ Ian Wienand
341
+ Igor Kuzmitshov
342
+ Igor Sobreira
343
+ Ikko Ashimine
344
+ Ilan Schnell
345
+ Illia Volochii
346
+ Ilya Baryshev
347
+ Inada Naoki
348
+ Ionel Cristian Mărieș
349
+ Ionel Maries Cristian
350
+ Itamar Turner-Trauring
351
+ iTrooz
352
+ Ivan Pozdeev
353
+ J. Nick Koston
354
+ Jacob Kim
355
+ Jacob Walls
356
+ Jaime Sanz
357
+ Jake Lishman
358
+ jakirkham
359
+ Jakub Kuczys
360
+ Jakub Stasiak
361
+ Jakub Vysoky
362
+ Jakub Wilk
363
+ James Cleveland
364
+ James Curtin
365
+ James Firth
366
+ James Gerity
367
+ James Polley
368
+ Jan Pokorný
369
+ Jannis Leidel
370
+ Jarek Potiuk
371
+ jarondl
372
+ Jason Curtis
373
+ Jason R. Coombs
374
+ JasonMo
375
+ JasonMo1
376
+ Jay Graves
377
+ Jean Abou Samra
378
+ Jean-Christophe Fillion-Robin
379
+ Jeff Barber
380
+ Jeff Dairiki
381
+ Jeff Widman
382
+ Jelmer Vernooij
383
+ jenix21
384
+ Jeremy Fleischman
385
+ Jeremy Stanley
386
+ Jeremy Zafran
387
+ Jesse Rittner
388
+ Jiashuo Li
389
+ Jim Fisher
390
+ Jim Garrison
391
+ Jinzhe Zeng
392
+ Jiun Bae
393
+ Jivan Amara
394
+ Joa
395
+ Joe Bylund
396
+ Joe Michelini
397
+ Johannes Altmanninger
398
+ John Paton
399
+ John Sirois
400
+ John T. Wodder II
401
+ John-Scott Atlakson
402
+ johnthagen
403
+ Jon Banafato
404
+ Jon Dufresne
405
+ Jon Parise
406
+ Jonas Nockert
407
+ Jonathan Herbert
408
+ Joonatan Partanen
409
+ Joost Molenaar
410
+ Jorge Niedbalski
411
+ Joseph Bylund
412
+ Joseph Long
413
+ Josh Bronson
414
+ Josh Cannon
415
+ Josh Hansen
416
+ Josh Schneier
417
+ Joshua
418
+ JoshuaPerdue
419
+ Juan Luis Cano Rodríguez
420
+ Juanjo Bazán
421
+ Judah Rand
422
+ Julian Berman
423
+ Julian Gethmann
424
+ Julien Demoor
425
+ July Tikhonov
426
+ Jussi Kukkonen
427
+ Justin van Heek
428
+ jwg4
429
+ Jyrki Pulliainen
430
+ Kai Chen
431
+ Kai Mueller
432
+ Kamal Bin Mustafa
433
+ Karolina Surma
434
+ kasium
435
+ kaustav haldar
436
+ keanemind
437
+ Keith Maxwell
438
+ Kelsey Hightower
439
+ Kenneth Belitzky
440
+ Kenneth Reitz
441
+ Kevin Burke
442
+ Kevin Carter
443
+ Kevin Frommelt
444
+ Kevin R Patterson
445
+ Kexuan Sun
446
+ Kit Randel
447
+ Klaas van Schelven
448
+ KOLANICH
449
+ konstin
450
+ kpinc
451
+ Krishan Bhasin
452
+ Krishna Oza
453
+ Kumar McMillan
454
+ Kuntal Majumder
455
+ Kurt McKee
456
+ Kyle Persohn
457
+ lakshmanaram
458
+ Laszlo Kiss-Kollar
459
+ Laurent Bristiel
460
+ Laurent LAPORTE
461
+ Laurie O
462
+ Laurie Opperman
463
+ layday
464
+ Leon Sasson
465
+ Lev Givon
466
+ Lincoln de Sousa
467
+ Lipis
468
+ lorddavidiii
469
+ Loren Carvalho
470
+ Lucas Cimon
471
+ Ludovic Gasc
472
+ Luis Medel
473
+ Lukas Geiger
474
+ Lukas Juhrich
475
+ Luke Macken
476
+ Luo Jiebin
477
+ luojiebin
478
+ luz.paz
479
+ László Kiss Kollár
480
+ M00nL1ght
481
+ Malcolm Smith
482
+ Marc Abramowitz
483
+ Marc Tamlyn
484
+ Marcus Smith
485
+ Mariatta
486
+ Mark Kohler
487
+ Mark McLoughlin
488
+ Mark Williams
489
+ Markus Hametner
490
+ Martey Dodoo
491
+ Martin Fischer
492
+ Martin Häcker
493
+ Martin Pavlasek
494
+ Masaki
495
+ Masklinn
496
+ Matej Stuchlik
497
+ Mathew Jennings
498
+ Mathieu Bridon
499
+ Mathieu Kniewallner
500
+ Matt Bacchi
501
+ Matt Good
502
+ Matt Maker
503
+ Matt Robenolt
504
+ Matt Wozniski
505
+ matthew
506
+ Matthew Einhorn
507
+ Matthew Feickert
508
+ Matthew Gilliard
509
+ Matthew Hughes
510
+ Matthew Iversen
511
+ Matthew Treinish
512
+ Matthew Trumbell
513
+ Matthew Willson
514
+ Matthias Bussonnier
515
+ mattip
516
+ Maurits van Rees
517
+ Max W Chase
518
+ Maxim Kurnikov
519
+ Maxime Rouyrre
520
+ mayeut
521
+ mbaluna
522
+ Md Sujauddin Sekh
523
+ mdebi
524
+ memoselyk
525
+ meowmeowcat
526
+ Michael
527
+ Michael Aquilina
528
+ Michael E. Karpeles
529
+ Michael Klich
530
+ Michael Mintz
531
+ Michael Williamson
532
+ michaelpacer
533
+ Michał Górny
534
+ Mickaël Schoentgen
535
+ Miguel Araujo Perez
536
+ Mihir Singh
537
+ Mike
538
+ Mike Hendricks
539
+ Min RK
540
+ MinRK
541
+ Miro Hrončok
542
+ Monica Baluna
543
+ montefra
544
+ Monty Taylor
545
+ morotti
546
+ mrKazzila
547
+ Muha Ajjan
548
+ Nadav Wexler
549
+ Nahuel Ambrosini
550
+ Nate Coraor
551
+ Nate Prewitt
552
+ Nathan Houghton
553
+ Nathaniel J. Smith
554
+ Nehal J Wani
555
+ Neil Botelho
556
+ Nguyễn Gia Phong
557
+ Nicholas Serra
558
+ Nick Coghlan
559
+ Nick Stenning
560
+ Nick Timkovich
561
+ Nicolas Bock
562
+ Nicole Harris
563
+ Nikhil Benesch
564
+ Nikhil Ladha
565
+ Nikita Chepanov
566
+ Nikolay Korolev
567
+ Nipunn Koorapati
568
+ Nitesh Sharma
569
+ Niyas Sait
570
+ Noah
571
+ Noah Gorny
572
+ Nowell Strite
573
+ NtaleGrey
574
+ nucccc
575
+ nvdv
576
+ OBITORASU
577
+ Ofek Lev
578
+ ofrinevo
579
+ Oleg Burnaev
580
+ Oliver Freund
581
+ Oliver Jeeves
582
+ Oliver Mannion
583
+ Oliver Tonnhofer
584
+ Olivier Girardot
585
+ Olivier Grisel
586
+ Ollie Rutherfurd
587
+ OMOTO Kenji
588
+ Omry Yadan
589
+ onlinejudge95
590
+ Oren Held
591
+ Oscar Benjamin
592
+ Oz N Tiram
593
+ Pachwenko
594
+ Patrick Dubroy
595
+ Patrick Jenkins
596
+ Patrick Lawson
597
+ patricktokeeffe
598
+ Patrik Kopkan
599
+ Paul Ganssle
600
+ Paul Kehrer
601
+ Paul Moore
602
+ Paul Nasrat
603
+ Paul Oswald
604
+ Paul van der Linden
605
+ Paulus Schoutsen
606
+ Pavel Safronov
607
+ Pavithra Eswaramoorthy
608
+ Pawel Jasinski
609
+ Paweł Szramowski
610
+ Pekka Klärck
611
+ Peter Gessler
612
+ Peter Lisák
613
+ Peter Shen
614
+ Peter Waller
615
+ Petr Viktorin
616
+ petr-tik
617
+ Phaneendra Chiruvella
618
+ Phil Elson
619
+ Phil Freo
620
+ Phil Pennock
621
+ Phil Whelan
622
+ Philip Jägenstedt
623
+ Philip Molloy
624
+ Philippe Ombredanne
625
+ Pi Delport
626
+ Pierre-Yves Rofes
627
+ Pieter Degroote
628
+ pip
629
+ Prabakaran Kumaresshan
630
+ Prabhjyotsing Surjit Singh Sodhi
631
+ Prabhu Marappan
632
+ Pradyun Gedam
633
+ Prashant Sharma
634
+ Pratik Mallya
635
+ pre-commit-ci[bot]
636
+ Preet Thakkar
637
+ Preston Holmes
638
+ Przemek Wrzos
639
+ Pulkit Goyal
640
+ q0w
641
+ Qiangning Hong
642
+ Qiming Xu
643
+ Quentin Lee
644
+ Quentin Pradet
645
+ R. David Murray
646
+ Rafael Caricio
647
+ Ralf Schmitt
648
+ Ran Benita
649
+ Randy Döring
650
+ Razzi Abuissa
651
+ rdb
652
+ Reece Dunham
653
+ Remi Rampin
654
+ Rene Dudfield
655
+ Riccardo Magliocchetti
656
+ Riccardo Schirone
657
+ Richard Jones
658
+ Richard Si
659
+ Ricky Ng-Adam
660
+ Rishi
661
+ rmorotti
662
+ RobberPhex
663
+ Robert Collins
664
+ Robert McGibbon
665
+ Robert Pollak
666
+ Robert T. McGibbon
667
+ robin elisha robinson
668
+ Roey Berman
669
+ Rohan Jain
670
+ Roman Bogorodskiy
671
+ Roman Donchenko
672
+ Romuald Brunet
673
+ ronaudinho
674
+ Ronny Pfannschmidt
675
+ Rory McCann
676
+ Ross Brattain
677
+ Roy Wellington Ⅳ
678
+ Ruairidh MacLeod
679
+ Russell Keith-Magee
680
+ Ryan Shepherd
681
+ Ryan Wooden
682
+ ryneeverett
683
+ S. Guliaev
684
+ Sachi King
685
+ Salvatore Rinchiera
686
+ sandeepkiran-js
687
+ Sander Van Balen
688
+ Savio Jomton
689
+ schlamar
690
+ Scott Kitterman
691
+ Sean
692
+ seanj
693
+ Sebastian Jordan
694
+ Sebastian Schaetz
695
+ Segev Finer
696
+ SeongSoo Cho
697
+ Sergey Vasilyev
698
+ Seth Michael Larson
699
+ Seth Woodworth
700
+ Shahar Epstein
701
+ Shantanu
702
+ shenxianpeng
703
+ shireenrao
704
+ Shivansh-007
705
+ Shixian Sheng
706
+ Shlomi Fish
707
+ Shovan Maity
708
+ Simeon Visser
709
+ Simon Cross
710
+ Simon Pichugin
711
+ sinoroc
712
+ sinscary
713
+ snook92
714
+ socketubs
715
+ Sorin Sbarnea
716
+ Srinivas Nyayapati
717
+ Srishti Hegde
718
+ Stavros Korokithakis
719
+ Stefan Scherfke
720
+ Stefano Rivera
721
+ Stephan Erb
722
+ Stephen Rosen
723
+ stepshal
724
+ Steve (Gadget) Barnes
725
+ Steve Barnes
726
+ Steve Dower
727
+ Steve Kowalik
728
+ Steven Myint
729
+ Steven Silvester
730
+ stonebig
731
+ studioj
732
+ Stéphane Bidoul
733
+ Stéphane Bidoul (ACSONE)
734
+ Stéphane Klein
735
+ Sumana Harihareswara
736
+ Surbhi Sharma
737
+ Sviatoslav Sydorenko
738
+ Sviatoslav Sydorenko (Святослав Сидоренко)
739
+ Swat009
740
+ Sylvain
741
+ Takayuki SHIMIZUKAWA
742
+ Taneli Hukkinen
743
+ tbeswick
744
+ Thiago
745
+ Thijs Triemstra
746
+ Thomas Fenzl
747
+ Thomas Grainger
748
+ Thomas Guettler
749
+ Thomas Johansson
750
+ Thomas Kluyver
751
+ Thomas Smith
752
+ Thomas VINCENT
753
+ Tim D. Smith
754
+ Tim Gates
755
+ Tim Harder
756
+ Tim Heap
757
+ tim smith
758
+ tinruufu
759
+ Tobias Hermann
760
+ Tom Forbes
761
+ Tom Freudenheim
762
+ Tom V
763
+ Tomas Hrnciar
764
+ Tomas Orsava
765
+ Tomer Chachamu
766
+ Tommi Enenkel | AnB
767
+ Tomáš Hrnčiar
768
+ Tony Beswick
769
+ Tony Narlock
770
+ Tony Zhaocheng Tan
771
+ TonyBeswick
772
+ toonarmycaptain
773
+ Toshio Kuratomi
774
+ toxinu
775
+ Travis Swicegood
776
+ Tushar Sadhwani
777
+ Tzu-ping Chung
778
+ Valentin Haenel
779
+ Victor Stinner
780
+ victorvpaulo
781
+ Vikram - Google
782
+ Viktor Szépe
783
+ Ville Skyttä
784
+ Vinay Sajip
785
+ Vincent Philippon
786
+ Vinicyus Macedo
787
+ Vipul Kumar
788
+ Vitaly Babiy
789
+ Vladimir Fokow
790
+ Vladimir Rutsky
791
+ W. Trevor King
792
+ Wil Tan
793
+ Wilfred Hughes
794
+ William Edwards
795
+ William ML Leslie
796
+ William T Olson
797
+ William Woodruff
798
+ Wilson Mo
799
+ wim glenn
800
+ Winson Luk
801
+ Wolfgang Maier
802
+ Wu Zhenyu
803
+ XAMES3
804
+ Xavier Fernandez
805
+ Xianpeng Shen
806
+ xoviat
807
+ xtreak
808
+ YAMAMOTO Takashi
809
+ Yen Chi Hsuan
810
+ Yeray Diaz Diaz
811
+ Yoval P
812
+ Yu Jian
813
+ Yuan Jing Vincent Yan
814
+ Yusuke Hayashi
815
+ Zearin
816
+ Zhiping Deng
817
+ ziebam
818
+ Zvezdan Petkovic
819
+ Łukasz Langa
820
+ Роман Донченко
821
+ Семён Марьясин
.venv/Lib/site-packages/pip-25.1.1.dist-info/licenses/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.
.venv/Lib/site-packages/pip-25.1.1.dist-info/top_level.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ pip
.venv/Lib/site-packages/pip-25.1.1.virtualenv ADDED
File without changes
.venv/Lib/site-packages/pip/__init__.py ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import List, Optional
2
+
3
+ __version__ = "25.1.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)
.venv/Lib/site-packages/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())
.venv/Lib/site-packages/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 pyproject.toml
12
+ PYTHON_REQUIRES = (3, 9)
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)
.venv/Lib/site-packages/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)
.venv/Lib/site-packages/pip/_internal/build_env.py ADDED
@@ -0,0 +1,325 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Build Environment used for isolation during sdist building"""
2
+
3
+ import logging
4
+ import os
5
+ import pathlib
6
+ import site
7
+ import sys
8
+ import textwrap
9
+ from collections import OrderedDict
10
+ from types import TracebackType
11
+ from typing import TYPE_CHECKING, Iterable, List, Optional, Set, Tuple, Type, Union
12
+
13
+ from pip._vendor.packaging.version import Version
14
+
15
+ from pip import __file__ as pip_location
16
+ from pip._internal.cli.spinners import open_spinner
17
+ from pip._internal.locations import get_platlib, get_purelib, get_scheme
18
+ from pip._internal.metadata import get_default_environment, get_environment
19
+ from pip._internal.utils.logging import VERBOSE
20
+ from pip._internal.utils.packaging import get_requirement
21
+ from pip._internal.utils.subprocess import call_subprocess
22
+ from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
23
+
24
+ if TYPE_CHECKING:
25
+ from pip._internal.index.package_finder import PackageFinder
26
+
27
+ logger = logging.getLogger(__name__)
28
+
29
+
30
+ def _dedup(a: str, b: str) -> Union[Tuple[str], Tuple[str, str]]:
31
+ return (a, b) if a != b else (a,)
32
+
33
+
34
+ class _Prefix:
35
+ def __init__(self, path: str) -> None:
36
+ self.path = path
37
+ self.setup = False
38
+ scheme = get_scheme("", prefix=path)
39
+ self.bin_dir = scheme.scripts
40
+ self.lib_dirs = _dedup(scheme.purelib, scheme.platlib)
41
+
42
+
43
+ def get_runnable_pip() -> str:
44
+ """Get a file to pass to a Python executable, to run the currently-running pip.
45
+
46
+ This is used to run a pip subprocess, for installing requirements into the build
47
+ environment.
48
+ """
49
+ source = pathlib.Path(pip_location).resolve().parent
50
+
51
+ if not source.is_dir():
52
+ # This would happen if someone is using pip from inside a zip file. In that
53
+ # case, we can use that directly.
54
+ return str(source)
55
+
56
+ return os.fsdecode(source / "__pip-runner__.py")
57
+
58
+
59
+ def _get_system_sitepackages() -> Set[str]:
60
+ """Get system site packages
61
+
62
+ Usually from site.getsitepackages,
63
+ but fallback on `get_purelib()/get_platlib()` if unavailable
64
+ (e.g. in a virtualenv created by virtualenv<20)
65
+
66
+ Returns normalized set of strings.
67
+ """
68
+ if hasattr(site, "getsitepackages"):
69
+ system_sites = site.getsitepackages()
70
+ else:
71
+ # virtualenv < 20 overwrites site.py without getsitepackages
72
+ # fallback on get_purelib/get_platlib.
73
+ # this is known to miss things, but shouldn't in the cases
74
+ # where getsitepackages() has been removed (inside a virtualenv)
75
+ system_sites = [get_purelib(), get_platlib()]
76
+ return {os.path.normcase(path) for path in system_sites}
77
+
78
+
79
+ class BuildEnvironment:
80
+ """Creates and manages an isolated environment to install build deps"""
81
+
82
+ def __init__(self) -> None:
83
+ temp_dir = TempDirectory(kind=tempdir_kinds.BUILD_ENV, globally_managed=True)
84
+
85
+ self._prefixes = OrderedDict(
86
+ (name, _Prefix(os.path.join(temp_dir.path, name)))
87
+ for name in ("normal", "overlay")
88
+ )
89
+
90
+ self._bin_dirs: List[str] = []
91
+ self._lib_dirs: List[str] = []
92
+ for prefix in reversed(list(self._prefixes.values())):
93
+ self._bin_dirs.append(prefix.bin_dir)
94
+ self._lib_dirs.extend(prefix.lib_dirs)
95
+
96
+ # Customize site to:
97
+ # - ensure .pth files are honored
98
+ # - prevent access to system site packages
99
+ system_sites = _get_system_sitepackages()
100
+
101
+ self._site_dir = os.path.join(temp_dir.path, "site")
102
+ if not os.path.exists(self._site_dir):
103
+ os.mkdir(self._site_dir)
104
+ with open(
105
+ os.path.join(self._site_dir, "sitecustomize.py"), "w", encoding="utf-8"
106
+ ) as fp:
107
+ fp.write(
108
+ textwrap.dedent(
109
+ """
110
+ import os, site, sys
111
+
112
+ # First, drop system-sites related paths.
113
+ original_sys_path = sys.path[:]
114
+ known_paths = set()
115
+ for path in {system_sites!r}:
116
+ site.addsitedir(path, known_paths=known_paths)
117
+ system_paths = set(
118
+ os.path.normcase(path)
119
+ for path in sys.path[len(original_sys_path):]
120
+ )
121
+ original_sys_path = [
122
+ path for path in original_sys_path
123
+ if os.path.normcase(path) not in system_paths
124
+ ]
125
+ sys.path = original_sys_path
126
+
127
+ # Second, add lib directories.
128
+ # ensuring .pth file are processed.
129
+ for path in {lib_dirs!r}:
130
+ assert not path in sys.path
131
+ site.addsitedir(path)
132
+ """
133
+ ).format(system_sites=system_sites, lib_dirs=self._lib_dirs)
134
+ )
135
+
136
+ def __enter__(self) -> None:
137
+ self._save_env = {
138
+ name: os.environ.get(name, None)
139
+ for name in ("PATH", "PYTHONNOUSERSITE", "PYTHONPATH")
140
+ }
141
+
142
+ path = self._bin_dirs[:]
143
+ old_path = self._save_env["PATH"]
144
+ if old_path:
145
+ path.extend(old_path.split(os.pathsep))
146
+
147
+ pythonpath = [self._site_dir]
148
+
149
+ os.environ.update(
150
+ {
151
+ "PATH": os.pathsep.join(path),
152
+ "PYTHONNOUSERSITE": "1",
153
+ "PYTHONPATH": os.pathsep.join(pythonpath),
154
+ }
155
+ )
156
+
157
+ def __exit__(
158
+ self,
159
+ exc_type: Optional[Type[BaseException]],
160
+ exc_val: Optional[BaseException],
161
+ exc_tb: Optional[TracebackType],
162
+ ) -> None:
163
+ for varname, old_value in self._save_env.items():
164
+ if old_value is None:
165
+ os.environ.pop(varname, None)
166
+ else:
167
+ os.environ[varname] = old_value
168
+
169
+ def check_requirements(
170
+ self, reqs: Iterable[str]
171
+ ) -> Tuple[Set[Tuple[str, str]], Set[str]]:
172
+ """Return 2 sets:
173
+ - conflicting requirements: set of (installed, wanted) reqs tuples
174
+ - missing requirements: set of reqs
175
+ """
176
+ missing = set()
177
+ conflicting = set()
178
+ if reqs:
179
+ env = (
180
+ get_environment(self._lib_dirs)
181
+ if hasattr(self, "_lib_dirs")
182
+ else get_default_environment()
183
+ )
184
+ for req_str in reqs:
185
+ req = get_requirement(req_str)
186
+ # We're explicitly evaluating with an empty extra value, since build
187
+ # environments are not provided any mechanism to select specific extras.
188
+ if req.marker is not None and not req.marker.evaluate({"extra": ""}):
189
+ continue
190
+ dist = env.get_distribution(req.name)
191
+ if not dist:
192
+ missing.add(req_str)
193
+ continue
194
+ if isinstance(dist.version, Version):
195
+ installed_req_str = f"{req.name}=={dist.version}"
196
+ else:
197
+ installed_req_str = f"{req.name}==={dist.version}"
198
+ if not req.specifier.contains(dist.version, prereleases=True):
199
+ conflicting.add((installed_req_str, req_str))
200
+ # FIXME: Consider direct URL?
201
+ return conflicting, missing
202
+
203
+ def install_requirements(
204
+ self,
205
+ finder: "PackageFinder",
206
+ requirements: Iterable[str],
207
+ prefix_as_string: str,
208
+ *,
209
+ kind: str,
210
+ ) -> None:
211
+ prefix = self._prefixes[prefix_as_string]
212
+ assert not prefix.setup
213
+ prefix.setup = True
214
+ if not requirements:
215
+ return
216
+ self._install_requirements(
217
+ get_runnable_pip(),
218
+ finder,
219
+ requirements,
220
+ prefix,
221
+ kind=kind,
222
+ )
223
+
224
+ @staticmethod
225
+ def _install_requirements(
226
+ pip_runnable: str,
227
+ finder: "PackageFinder",
228
+ requirements: Iterable[str],
229
+ prefix: _Prefix,
230
+ *,
231
+ kind: str,
232
+ ) -> None:
233
+ args: List[str] = [
234
+ sys.executable,
235
+ pip_runnable,
236
+ "install",
237
+ "--ignore-installed",
238
+ "--no-user",
239
+ "--prefix",
240
+ prefix.path,
241
+ "--no-warn-script-location",
242
+ "--disable-pip-version-check",
243
+ # As the build environment is ephemeral, it's wasteful to
244
+ # pre-compile everything, especially as not every Python
245
+ # module will be used/compiled in most cases.
246
+ "--no-compile",
247
+ # The prefix specified two lines above, thus
248
+ # target from config file or env var should be ignored
249
+ "--target",
250
+ "",
251
+ ]
252
+ if logger.getEffectiveLevel() <= logging.DEBUG:
253
+ args.append("-vv")
254
+ elif logger.getEffectiveLevel() <= VERBOSE:
255
+ args.append("-v")
256
+ for format_control in ("no_binary", "only_binary"):
257
+ formats = getattr(finder.format_control, format_control)
258
+ args.extend(
259
+ (
260
+ "--" + format_control.replace("_", "-"),
261
+ ",".join(sorted(formats or {":none:"})),
262
+ )
263
+ )
264
+
265
+ index_urls = finder.index_urls
266
+ if index_urls:
267
+ args.extend(["-i", index_urls[0]])
268
+ for extra_index in index_urls[1:]:
269
+ args.extend(["--extra-index-url", extra_index])
270
+ else:
271
+ args.append("--no-index")
272
+ for link in finder.find_links:
273
+ args.extend(["--find-links", link])
274
+
275
+ if finder.proxy:
276
+ args.extend(["--proxy", finder.proxy])
277
+ for host in finder.trusted_hosts:
278
+ args.extend(["--trusted-host", host])
279
+ if finder.custom_cert:
280
+ args.extend(["--cert", finder.custom_cert])
281
+ if finder.client_cert:
282
+ args.extend(["--client-cert", finder.client_cert])
283
+ if finder.allow_all_prereleases:
284
+ args.append("--pre")
285
+ if finder.prefer_binary:
286
+ args.append("--prefer-binary")
287
+ args.append("--")
288
+ args.extend(requirements)
289
+ with open_spinner(f"Installing {kind}") as spinner:
290
+ call_subprocess(
291
+ args,
292
+ command_desc=f"pip subprocess to install {kind}",
293
+ spinner=spinner,
294
+ )
295
+
296
+
297
+ class NoOpBuildEnvironment(BuildEnvironment):
298
+ """A no-op drop-in replacement for BuildEnvironment"""
299
+
300
+ def __init__(self) -> None:
301
+ pass
302
+
303
+ def __enter__(self) -> None:
304
+ pass
305
+
306
+ def __exit__(
307
+ self,
308
+ exc_type: Optional[Type[BaseException]],
309
+ exc_val: Optional[BaseException],
310
+ exc_tb: Optional[TracebackType],
311
+ ) -> None:
312
+ pass
313
+
314
+ def cleanup(self) -> None:
315
+ pass
316
+
317
+ def install_requirements(
318
+ self,
319
+ finder: "PackageFinder",
320
+ requirements: Iterable[str],
321
+ prefix_as_string: str,
322
+ *,
323
+ kind: str,
324
+ ) -> None:
325
+ raise NotImplementedError()
.venv/Lib/site-packages/pip/_internal/cache.py ADDED
@@ -0,0 +1,289 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Cache Management"""
2
+
3
+ import hashlib
4
+ import json
5
+ import logging
6
+ import os
7
+ from pathlib import Path
8
+ from typing import Any, Dict, List, Optional
9
+
10
+ from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version
11
+ from pip._vendor.packaging.utils import canonicalize_name
12
+
13
+ from pip._internal.exceptions import InvalidWheelFilename
14
+ from pip._internal.models.direct_url import DirectUrl
15
+ from pip._internal.models.link import Link
16
+ from pip._internal.models.wheel import Wheel
17
+ from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
18
+ from pip._internal.utils.urls import path_to_url
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+ ORIGIN_JSON_NAME = "origin.json"
23
+
24
+
25
+ def _hash_dict(d: Dict[str, str]) -> str:
26
+ """Return a stable sha224 of a dictionary."""
27
+ s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True)
28
+ return hashlib.sha224(s.encode("ascii")).hexdigest()
29
+
30
+
31
+ class Cache:
32
+ """An abstract class - provides cache directories for data from links
33
+
34
+ :param cache_dir: The root of the cache.
35
+ """
36
+
37
+ def __init__(self, cache_dir: str) -> None:
38
+ super().__init__()
39
+ assert not cache_dir or os.path.isabs(cache_dir)
40
+ self.cache_dir = cache_dir or None
41
+
42
+ def _get_cache_path_parts(self, link: Link) -> List[str]:
43
+ """Get parts of part that must be os.path.joined with cache_dir"""
44
+
45
+ # We want to generate an url to use as our cache key, we don't want to
46
+ # just reuse the URL because it might have other items in the fragment
47
+ # and we don't care about those.
48
+ key_parts = {"url": link.url_without_fragment}
49
+ if link.hash_name is not None and link.hash is not None:
50
+ key_parts[link.hash_name] = link.hash
51
+ if link.subdirectory_fragment:
52
+ key_parts["subdirectory"] = link.subdirectory_fragment
53
+
54
+ # Include interpreter name, major and minor version in cache key
55
+ # to cope with ill-behaved sdists that build a different wheel
56
+ # depending on the python version their setup.py is being run on,
57
+ # and don't encode the difference in compatibility tags.
58
+ # https://github.com/pypa/pip/issues/7296
59
+ key_parts["interpreter_name"] = interpreter_name()
60
+ key_parts["interpreter_version"] = interpreter_version()
61
+
62
+ # Encode our key url with sha224, we'll use this because it has similar
63
+ # security properties to sha256, but with a shorter total output (and
64
+ # thus less secure). However the differences don't make a lot of
65
+ # difference for our use case here.
66
+ hashed = _hash_dict(key_parts)
67
+
68
+ # We want to nest the directories some to prevent having a ton of top
69
+ # level directories where we might run out of sub directories on some
70
+ # FS.
71
+ parts = [hashed[:2], hashed[2:4], hashed[4:6], hashed[6:]]
72
+
73
+ return parts
74
+
75
+ def _get_candidates(self, link: Link, canonical_package_name: str) -> List[Any]:
76
+ can_not_cache = not self.cache_dir or not canonical_package_name or not link
77
+ if can_not_cache:
78
+ return []
79
+
80
+ path = self.get_path_for_link(link)
81
+ if os.path.isdir(path):
82
+ return [(candidate, path) for candidate in os.listdir(path)]
83
+ return []
84
+
85
+ def get_path_for_link(self, link: Link) -> str:
86
+ """Return a directory to store cached items in for link."""
87
+ raise NotImplementedError()
88
+
89
+ def get(
90
+ self,
91
+ link: Link,
92
+ package_name: Optional[str],
93
+ supported_tags: List[Tag],
94
+ ) -> Link:
95
+ """Returns a link to a cached item if it exists, otherwise returns the
96
+ passed link.
97
+ """
98
+ raise NotImplementedError()
99
+
100
+
101
+ class SimpleWheelCache(Cache):
102
+ """A cache of wheels for future installs."""
103
+
104
+ def __init__(self, cache_dir: str) -> None:
105
+ super().__init__(cache_dir)
106
+
107
+ def get_path_for_link(self, link: Link) -> str:
108
+ """Return a directory to store cached wheels for link
109
+
110
+ Because there are M wheels for any one sdist, we provide a directory
111
+ to cache them in, and then consult that directory when looking up
112
+ cache hits.
113
+
114
+ We only insert things into the cache if they have plausible version
115
+ numbers, so that we don't contaminate the cache with things that were
116
+ not unique. E.g. ./package might have dozens of installs done for it
117
+ and build a version of 0.0...and if we built and cached a wheel, we'd
118
+ end up using the same wheel even if the source has been edited.
119
+
120
+ :param link: The link of the sdist for which this will cache wheels.
121
+ """
122
+ parts = self._get_cache_path_parts(link)
123
+ assert self.cache_dir
124
+ # Store wheels within the root cache_dir
125
+ return os.path.join(self.cache_dir, "wheels", *parts)
126
+
127
+ def get(
128
+ self,
129
+ link: Link,
130
+ package_name: Optional[str],
131
+ supported_tags: List[Tag],
132
+ ) -> Link:
133
+ candidates = []
134
+
135
+ if not package_name:
136
+ return link
137
+
138
+ canonical_package_name = canonicalize_name(package_name)
139
+ for wheel_name, wheel_dir in self._get_candidates(link, canonical_package_name):
140
+ try:
141
+ wheel = Wheel(wheel_name)
142
+ except InvalidWheelFilename:
143
+ continue
144
+ if canonicalize_name(wheel.name) != canonical_package_name:
145
+ logger.debug(
146
+ "Ignoring cached wheel %s for %s as it "
147
+ "does not match the expected distribution name %s.",
148
+ wheel_name,
149
+ link,
150
+ package_name,
151
+ )
152
+ continue
153
+ if not wheel.supported(supported_tags):
154
+ # Built for a different python/arch/etc
155
+ continue
156
+ candidates.append(
157
+ (
158
+ wheel.support_index_min(supported_tags),
159
+ wheel_name,
160
+ wheel_dir,
161
+ )
162
+ )
163
+
164
+ if not candidates:
165
+ return link
166
+
167
+ _, wheel_name, wheel_dir = min(candidates)
168
+ return Link(path_to_url(os.path.join(wheel_dir, wheel_name)))
169
+
170
+
171
+ class EphemWheelCache(SimpleWheelCache):
172
+ """A SimpleWheelCache that creates it's own temporary cache directory"""
173
+
174
+ def __init__(self) -> None:
175
+ self._temp_dir = TempDirectory(
176
+ kind=tempdir_kinds.EPHEM_WHEEL_CACHE,
177
+ globally_managed=True,
178
+ )
179
+
180
+ super().__init__(self._temp_dir.path)
181
+
182
+
183
+ class CacheEntry:
184
+ def __init__(
185
+ self,
186
+ link: Link,
187
+ persistent: bool,
188
+ ):
189
+ self.link = link
190
+ self.persistent = persistent
191
+ self.origin: Optional[DirectUrl] = None
192
+ origin_direct_url_path = Path(self.link.file_path).parent / ORIGIN_JSON_NAME
193
+ if origin_direct_url_path.exists():
194
+ try:
195
+ self.origin = DirectUrl.from_json(
196
+ origin_direct_url_path.read_text(encoding="utf-8")
197
+ )
198
+ except Exception as e:
199
+ logger.warning(
200
+ "Ignoring invalid cache entry origin file %s for %s (%s)",
201
+ origin_direct_url_path,
202
+ link.filename,
203
+ e,
204
+ )
205
+
206
+
207
+ class WheelCache(Cache):
208
+ """Wraps EphemWheelCache and SimpleWheelCache into a single Cache
209
+
210
+ This Cache allows for gracefully degradation, using the ephem wheel cache
211
+ when a certain link is not found in the simple wheel cache first.
212
+ """
213
+
214
+ def __init__(self, cache_dir: str) -> None:
215
+ super().__init__(cache_dir)
216
+ self._wheel_cache = SimpleWheelCache(cache_dir)
217
+ self._ephem_cache = EphemWheelCache()
218
+
219
+ def get_path_for_link(self, link: Link) -> str:
220
+ return self._wheel_cache.get_path_for_link(link)
221
+
222
+ def get_ephem_path_for_link(self, link: Link) -> str:
223
+ return self._ephem_cache.get_path_for_link(link)
224
+
225
+ def get(
226
+ self,
227
+ link: Link,
228
+ package_name: Optional[str],
229
+ supported_tags: List[Tag],
230
+ ) -> Link:
231
+ cache_entry = self.get_cache_entry(link, package_name, supported_tags)
232
+ if cache_entry is None:
233
+ return link
234
+ return cache_entry.link
235
+
236
+ def get_cache_entry(
237
+ self,
238
+ link: Link,
239
+ package_name: Optional[str],
240
+ supported_tags: List[Tag],
241
+ ) -> Optional[CacheEntry]:
242
+ """Returns a CacheEntry with a link to a cached item if it exists or
243
+ None. The cache entry indicates if the item was found in the persistent
244
+ or ephemeral cache.
245
+ """
246
+ retval = self._wheel_cache.get(
247
+ link=link,
248
+ package_name=package_name,
249
+ supported_tags=supported_tags,
250
+ )
251
+ if retval is not link:
252
+ return CacheEntry(retval, persistent=True)
253
+
254
+ retval = self._ephem_cache.get(
255
+ link=link,
256
+ package_name=package_name,
257
+ supported_tags=supported_tags,
258
+ )
259
+ if retval is not link:
260
+ return CacheEntry(retval, persistent=False)
261
+
262
+ return None
263
+
264
+ @staticmethod
265
+ def record_download_origin(cache_dir: str, download_info: DirectUrl) -> None:
266
+ origin_path = Path(cache_dir) / ORIGIN_JSON_NAME
267
+ if origin_path.exists():
268
+ try:
269
+ origin = DirectUrl.from_json(origin_path.read_text(encoding="utf-8"))
270
+ except Exception as e:
271
+ logger.warning(
272
+ "Could not read origin file %s in cache entry (%s). "
273
+ "Will attempt to overwrite it.",
274
+ origin_path,
275
+ e,
276
+ )
277
+ else:
278
+ # TODO: use DirectUrl.equivalent when
279
+ # https://github.com/pypa/pip/pull/10564 is merged.
280
+ if origin.url != download_info.url:
281
+ logger.warning(
282
+ "Origin URL %s in cache entry %s does not match download URL "
283
+ "%s. This is likely a pip bug or a cache corruption issue. "
284
+ "Will overwrite it with the new value.",
285
+ origin.url,
286
+ cache_dir,
287
+ download_info.url,
288
+ )
289
+ origin_path.write_text(download_info.to_json(), encoding="utf-8")
.venv/Lib/site-packages/pip/_internal/cli/__init__.py ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ """Subpackage containing all of pip's command line interface related code"""
2
+
3
+ # This file intentionally does not import submodules
.venv/Lib/site-packages/pip/_internal/cli/autocompletion.py ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Logic that powers autocompletion installed by ``pip completion``."""
2
+
3
+ import optparse
4
+ import os
5
+ import sys
6
+ from itertools import chain
7
+ from typing import Any, Iterable, List, Optional
8
+
9
+ from pip._internal.cli.main_parser import create_main_parser
10
+ from pip._internal.commands import commands_dict, create_command
11
+ from pip._internal.metadata import get_default_environment
12
+
13
+
14
+ def autocomplete() -> None:
15
+ """Entry Point for completion of main and subcommand options."""
16
+ # Don't complete if user hasn't sourced bash_completion file.
17
+ if "PIP_AUTO_COMPLETE" not in os.environ:
18
+ return
19
+ # Don't complete if autocompletion environment variables
20
+ # are not present
21
+ if not os.environ.get("COMP_WORDS") or not os.environ.get("COMP_CWORD"):
22
+ return
23
+ cwords = os.environ["COMP_WORDS"].split()[1:]
24
+ cword = int(os.environ["COMP_CWORD"])
25
+ try:
26
+ current = cwords[cword - 1]
27
+ except IndexError:
28
+ current = ""
29
+
30
+ parser = create_main_parser()
31
+ subcommands = list(commands_dict)
32
+ options = []
33
+
34
+ # subcommand
35
+ subcommand_name: Optional[str] = None
36
+ for word in cwords:
37
+ if word in subcommands:
38
+ subcommand_name = word
39
+ break
40
+ # subcommand options
41
+ if subcommand_name is not None:
42
+ # special case: 'help' subcommand has no options
43
+ if subcommand_name == "help":
44
+ sys.exit(1)
45
+ # special case: list locally installed dists for show and uninstall
46
+ should_list_installed = not current.startswith("-") and subcommand_name in [
47
+ "show",
48
+ "uninstall",
49
+ ]
50
+ if should_list_installed:
51
+ env = get_default_environment()
52
+ lc = current.lower()
53
+ installed = [
54
+ dist.canonical_name
55
+ for dist in env.iter_installed_distributions(local_only=True)
56
+ if dist.canonical_name.startswith(lc)
57
+ and dist.canonical_name not in cwords[1:]
58
+ ]
59
+ # if there are no dists installed, fall back to option completion
60
+ if installed:
61
+ for dist in installed:
62
+ print(dist)
63
+ sys.exit(1)
64
+
65
+ should_list_installables = (
66
+ not current.startswith("-") and subcommand_name == "install"
67
+ )
68
+ if should_list_installables:
69
+ for path in auto_complete_paths(current, "path"):
70
+ print(path)
71
+ sys.exit(1)
72
+
73
+ subcommand = create_command(subcommand_name)
74
+
75
+ for opt in subcommand.parser.option_list_all:
76
+ if opt.help != optparse.SUPPRESS_HELP:
77
+ options += [
78
+ (opt_str, opt.nargs) for opt_str in opt._long_opts + opt._short_opts
79
+ ]
80
+
81
+ # filter out previously specified options from available options
82
+ prev_opts = [x.split("=")[0] for x in cwords[1 : cword - 1]]
83
+ options = [(x, v) for (x, v) in options if x not in prev_opts]
84
+ # filter options by current input
85
+ options = [(k, v) for k, v in options if k.startswith(current)]
86
+ # get completion type given cwords and available subcommand options
87
+ completion_type = get_path_completion_type(
88
+ cwords,
89
+ cword,
90
+ subcommand.parser.option_list_all,
91
+ )
92
+ # get completion files and directories if ``completion_type`` is
93
+ # ``<file>``, ``<dir>`` or ``<path>``
94
+ if completion_type:
95
+ paths = auto_complete_paths(current, completion_type)
96
+ options = [(path, 0) for path in paths]
97
+ for option in options:
98
+ opt_label = option[0]
99
+ # append '=' to options which require args
100
+ if option[1] and option[0][:2] == "--":
101
+ opt_label += "="
102
+ print(opt_label)
103
+ else:
104
+ # show main parser options only when necessary
105
+
106
+ opts = [i.option_list for i in parser.option_groups]
107
+ opts.append(parser.option_list)
108
+ flattened_opts = chain.from_iterable(opts)
109
+ if current.startswith("-"):
110
+ for opt in flattened_opts:
111
+ if opt.help != optparse.SUPPRESS_HELP:
112
+ subcommands += opt._long_opts + opt._short_opts
113
+ else:
114
+ # get completion type given cwords and all available options
115
+ completion_type = get_path_completion_type(cwords, cword, flattened_opts)
116
+ if completion_type:
117
+ subcommands = list(auto_complete_paths(current, completion_type))
118
+
119
+ print(" ".join([x for x in subcommands if x.startswith(current)]))
120
+ sys.exit(1)
121
+
122
+
123
+ def get_path_completion_type(
124
+ cwords: List[str], cword: int, opts: Iterable[Any]
125
+ ) -> Optional[str]:
126
+ """Get the type of path completion (``file``, ``dir``, ``path`` or None)
127
+
128
+ :param cwords: same as the environmental variable ``COMP_WORDS``
129
+ :param cword: same as the environmental variable ``COMP_CWORD``
130
+ :param opts: The available options to check
131
+ :return: path completion type (``file``, ``dir``, ``path`` or None)
132
+ """
133
+ if cword < 2 or not cwords[cword - 2].startswith("-"):
134
+ return None
135
+ for opt in opts:
136
+ if opt.help == optparse.SUPPRESS_HELP:
137
+ continue
138
+ for o in str(opt).split("/"):
139
+ if cwords[cword - 2].split("=")[0] == o:
140
+ if not opt.metavar or any(
141
+ x in ("path", "file", "dir") for x in opt.metavar.split("/")
142
+ ):
143
+ return opt.metavar
144
+ return None
145
+
146
+
147
+ def auto_complete_paths(current: str, completion_type: str) -> Iterable[str]:
148
+ """If ``completion_type`` is ``file`` or ``path``, list all regular files
149
+ and directories starting with ``current``; otherwise only list directories
150
+ starting with ``current``.
151
+
152
+ :param current: The word to be completed
153
+ :param completion_type: path completion type(``file``, ``path`` or ``dir``)
154
+ :return: A generator of regular files and/or directories
155
+ """
156
+ directory, filename = os.path.split(current)
157
+ current_path = os.path.abspath(directory)
158
+ # Don't complete paths if they can't be accessed
159
+ if not os.access(current_path, os.R_OK):
160
+ return
161
+ filename = os.path.normcase(filename)
162
+ # list all files that start with ``filename``
163
+ file_list = (
164
+ x for x in os.listdir(current_path) if os.path.normcase(x).startswith(filename)
165
+ )
166
+ for f in file_list:
167
+ opt = os.path.join(current_path, f)
168
+ comp_file = os.path.normcase(os.path.join(directory, f))
169
+ # complete regular files when there is not ``<dir>`` after option
170
+ # complete directories when there is ``<file>``, ``<path>`` or
171
+ # ``<dir>``after option
172
+ if completion_type != "dir" and os.path.isfile(opt):
173
+ yield comp_file
174
+ elif os.path.isdir(opt):
175
+ yield os.path.join(comp_file, "")
.venv/Lib/site-packages/pip/_internal/cli/base_command.py ADDED
@@ -0,0 +1,233 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Base Command class, and related routines"""
2
+
3
+ import logging
4
+ import logging.config
5
+ import optparse
6
+ import os
7
+ import sys
8
+ import traceback
9
+ from optparse import Values
10
+ from typing import List, Optional, Tuple
11
+
12
+ from pip._vendor.rich import reconfigure
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
+ )
32
+ from pip._internal.utils.filesystem import check_path_owner
33
+ from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging
34
+ from pip._internal.utils.misc import get_prog, normalize_path
35
+ from pip._internal.utils.temp_dir import TempDirectoryTypeRegistry as TempDirRegistry
36
+ from pip._internal.utils.temp_dir import global_tempdir_manager, tempdir_registry
37
+ from pip._internal.utils.virtualenv import running_under_virtualenv
38
+
39
+ __all__ = ["Command"]
40
+
41
+ logger = logging.getLogger(__name__)
42
+
43
+
44
+ class Command(CommandContextMixIn):
45
+ usage: str = ""
46
+ ignore_require_venv: bool = False
47
+
48
+ def __init__(self, name: str, summary: str, isolated: bool = False) -> None:
49
+ super().__init__()
50
+
51
+ self.name = name
52
+ self.summary = summary
53
+ self.parser = ConfigOptionParser(
54
+ usage=self.usage,
55
+ prog=f"{get_prog()} {name}",
56
+ formatter=UpdatingDefaultsHelpFormatter(),
57
+ add_help_option=False,
58
+ name=name,
59
+ description=self.__doc__,
60
+ isolated=isolated,
61
+ )
62
+
63
+ self.tempdir_registry: Optional[TempDirRegistry] = None
64
+
65
+ # Commands should add options to this option group
66
+ optgroup_name = f"{self.name.capitalize()} Options"
67
+ self.cmd_opts = optparse.OptionGroup(self.parser, optgroup_name)
68
+
69
+ # Add the general options
70
+ gen_opts = cmdoptions.make_option_group(
71
+ cmdoptions.general_group,
72
+ self.parser,
73
+ )
74
+ self.parser.add_option_group(gen_opts)
75
+
76
+ self.add_options()
77
+
78
+ def add_options(self) -> None:
79
+ pass
80
+
81
+ def handle_pip_version_check(self, options: Values) -> None:
82
+ """
83
+ This is a no-op so that commands by default do not do the pip version
84
+ check.
85
+ """
86
+ # Make sure we do the pip version check if the index_group options
87
+ # are present.
88
+ assert not hasattr(options, "no_index")
89
+
90
+ def run(self, options: Values, args: List[str]) -> int:
91
+ raise NotImplementedError
92
+
93
+ def _run_wrapper(self, level_number: int, options: Values, args: List[str]) -> int:
94
+ def _inner_run() -> int:
95
+ try:
96
+ return self.run(options, args)
97
+ finally:
98
+ self.handle_pip_version_check(options)
99
+
100
+ if options.debug_mode:
101
+ rich_traceback.install(show_locals=True)
102
+ return _inner_run()
103
+
104
+ try:
105
+ status = _inner_run()
106
+ assert isinstance(status, int)
107
+ return status
108
+ except DiagnosticPipError as exc:
109
+ logger.error("%s", exc, extra={"rich": True})
110
+ logger.debug("Exception information:", exc_info=True)
111
+
112
+ return ERROR
113
+ except PreviousBuildDirError as exc:
114
+ logger.critical(str(exc))
115
+ logger.debug("Exception information:", exc_info=True)
116
+
117
+ return PREVIOUS_BUILD_DIR_ERROR
118
+ except (
119
+ InstallationError,
120
+ BadCommand,
121
+ NetworkConnectionError,
122
+ ) as exc:
123
+ logger.critical(str(exc))
124
+ logger.debug("Exception information:", exc_info=True)
125
+
126
+ return ERROR
127
+ except CommandError as exc:
128
+ logger.critical("%s", exc)
129
+ logger.debug("Exception information:", exc_info=True)
130
+
131
+ return ERROR
132
+ except BrokenStdoutLoggingError:
133
+ # Bypass our logger and write any remaining messages to
134
+ # stderr because stdout no longer works.
135
+ print("ERROR: Pipe to stdout was broken", file=sys.stderr)
136
+ if level_number <= logging.DEBUG:
137
+ traceback.print_exc(file=sys.stderr)
138
+
139
+ return ERROR
140
+ except KeyboardInterrupt:
141
+ logger.critical("Operation cancelled by user")
142
+ logger.debug("Exception information:", exc_info=True)
143
+
144
+ return ERROR
145
+ except BaseException:
146
+ logger.critical("Exception:", exc_info=True)
147
+
148
+ return UNKNOWN_ERROR
149
+
150
+ def parse_args(self, args: List[str]) -> Tuple[Values, List[str]]:
151
+ # factored out for testability
152
+ return self.parser.parse_args(args)
153
+
154
+ def main(self, args: List[str]) -> int:
155
+ try:
156
+ with self.main_context():
157
+ return self._main(args)
158
+ finally:
159
+ logging.shutdown()
160
+
161
+ def _main(self, args: List[str]) -> int:
162
+ # We must initialize this before the tempdir manager, otherwise the
163
+ # configuration would not be accessible by the time we clean up the
164
+ # tempdir manager.
165
+ self.tempdir_registry = self.enter_context(tempdir_registry())
166
+ # Intentionally set as early as possible so globally-managed temporary
167
+ # directories are available to the rest of the code.
168
+ self.enter_context(global_tempdir_manager())
169
+
170
+ options, args = self.parse_args(args)
171
+
172
+ # Set verbosity so that it can be used elsewhere.
173
+ self.verbosity = options.verbose - options.quiet
174
+ if options.debug_mode:
175
+ self.verbosity = 2
176
+
177
+ reconfigure(no_color=options.no_color)
178
+ level_number = setup_logging(
179
+ verbosity=self.verbosity,
180
+ no_color=options.no_color,
181
+ user_log_file=options.log,
182
+ )
183
+
184
+ always_enabled_features = set(options.features_enabled) & set(
185
+ cmdoptions.ALWAYS_ENABLED_FEATURES
186
+ )
187
+ if always_enabled_features:
188
+ logger.warning(
189
+ "The following features are always enabled: %s. ",
190
+ ", ".join(sorted(always_enabled_features)),
191
+ )
192
+
193
+ # Make sure that the --python argument isn't specified after the
194
+ # subcommand. We can tell, because if --python was specified,
195
+ # we should only reach this point if we're running in the created
196
+ # subprocess, which has the _PIP_RUNNING_IN_SUBPROCESS environment
197
+ # variable set.
198
+ if options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ:
199
+ logger.critical(
200
+ "The --python option must be placed before the pip subcommand name"
201
+ )
202
+ sys.exit(ERROR)
203
+
204
+ # TODO: Try to get these passing down from the command?
205
+ # without resorting to os.environ to hold these.
206
+ # This also affects isolated builds and it should.
207
+
208
+ if options.no_input:
209
+ os.environ["PIP_NO_INPUT"] = "1"
210
+
211
+ if options.exists_action:
212
+ os.environ["PIP_EXISTS_ACTION"] = " ".join(options.exists_action)
213
+
214
+ if options.require_venv and not self.ignore_require_venv:
215
+ # If a venv is required check if it can really be found
216
+ if not running_under_virtualenv():
217
+ logger.critical("Could not find an activated virtualenv (required).")
218
+ sys.exit(VIRTUALENV_NOT_FOUND)
219
+
220
+ if options.cache_dir:
221
+ options.cache_dir = normalize_path(options.cache_dir)
222
+ if not check_path_owner(options.cache_dir):
223
+ logger.warning(
224
+ "The directory '%s' or its parent directory is not owned "
225
+ "or is not writable by the current user. The cache "
226
+ "has been disabled. Check the permissions and owner of "
227
+ "that directory. If executing pip with sudo, you should "
228
+ "use sudo's -H flag.",
229
+ options.cache_dir,
230
+ )
231
+ options.cache_dir = None
232
+
233
+ return self._run_wrapper(level_number, options, args)
.venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py ADDED
@@ -0,0 +1,1133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 pathlib
17
+ import textwrap
18
+ from functools import partial
19
+ from optparse import SUPPRESS_HELP, Option, OptionGroup, OptionParser, Values
20
+ from textwrap import dedent
21
+ from typing import Any, Callable, Dict, Optional, Tuple
22
+
23
+ from pip._vendor.packaging.utils import canonicalize_name
24
+
25
+ from pip._internal.cli.parser import ConfigOptionParser
26
+ from pip._internal.exceptions import CommandError
27
+ from pip._internal.locations import USER_CACHE_DIR, get_src_prefix
28
+ from pip._internal.models.format_control import FormatControl
29
+ from pip._internal.models.index import PyPI
30
+ from pip._internal.models.target_python import TargetPython
31
+ from pip._internal.utils.hashes import STRONG_HASHES
32
+ from pip._internal.utils.misc import strtobool
33
+
34
+ logger = logging.getLogger(__name__)
35
+
36
+
37
+ def raise_option_error(parser: OptionParser, option: Option, msg: str) -> None:
38
+ """
39
+ Raise an option parsing error using parser.error().
40
+
41
+ Args:
42
+ parser: an OptionParser instance.
43
+ option: an Option instance.
44
+ msg: the error text.
45
+ """
46
+ msg = f"{option} error: {msg}"
47
+ msg = textwrap.fill(" ".join(msg.split()))
48
+ parser.error(msg)
49
+
50
+
51
+ def make_option_group(group: Dict[str, Any], parser: ConfigOptionParser) -> OptionGroup:
52
+ """
53
+ Return an OptionGroup object
54
+ group -- assumed to be dict with 'name' and 'options' keys
55
+ parser -- an optparse Parser
56
+ """
57
+ option_group = OptionGroup(parser, group["name"])
58
+ for option in group["options"]:
59
+ option_group.add_option(option())
60
+ return option_group
61
+
62
+
63
+ def check_dist_restriction(options: Values, check_target: bool = False) -> None:
64
+ """Function for determining if custom platform options are allowed.
65
+
66
+ :param options: The OptionParser options.
67
+ :param check_target: Whether or not to check if --target is being used.
68
+ """
69
+ dist_restriction_set = any(
70
+ [
71
+ options.python_version,
72
+ options.platforms,
73
+ options.abis,
74
+ options.implementation,
75
+ ]
76
+ )
77
+
78
+ binary_only = FormatControl(set(), {":all:"})
79
+ sdist_dependencies_allowed = (
80
+ options.format_control != binary_only and not options.ignore_dependencies
81
+ )
82
+
83
+ # Installations or downloads using dist restrictions must not combine
84
+ # source distributions and dist-specific wheels, as they are not
85
+ # guaranteed to be locally compatible.
86
+ if dist_restriction_set and sdist_dependencies_allowed:
87
+ raise CommandError(
88
+ "When restricting platform and interpreter constraints using "
89
+ "--python-version, --platform, --abi, or --implementation, "
90
+ "either --no-deps must be set, or --only-binary=:all: must be "
91
+ "set and --no-binary must not be set (or must be set to "
92
+ ":none:)."
93
+ )
94
+
95
+ if check_target:
96
+ if not options.dry_run and dist_restriction_set and not options.target_dir:
97
+ raise CommandError(
98
+ "Can not use any platform or abi specific options unless "
99
+ "installing via '--target' or using '--dry-run'"
100
+ )
101
+
102
+
103
+ def _path_option_check(option: Option, opt: str, value: str) -> str:
104
+ return os.path.expanduser(value)
105
+
106
+
107
+ def _package_name_option_check(option: Option, opt: str, value: str) -> str:
108
+ return canonicalize_name(value)
109
+
110
+
111
+ class PipOption(Option):
112
+ TYPES = Option.TYPES + ("path", "package_name")
113
+ TYPE_CHECKER = Option.TYPE_CHECKER.copy()
114
+ TYPE_CHECKER["package_name"] = _package_name_option_check
115
+ TYPE_CHECKER["path"] = _path_option_check
116
+
117
+
118
+ ###########
119
+ # options #
120
+ ###########
121
+
122
+ help_: Callable[..., Option] = partial(
123
+ Option,
124
+ "-h",
125
+ "--help",
126
+ dest="help",
127
+ action="help",
128
+ help="Show help.",
129
+ )
130
+
131
+ debug_mode: Callable[..., Option] = partial(
132
+ Option,
133
+ "--debug",
134
+ dest="debug_mode",
135
+ action="store_true",
136
+ default=False,
137
+ help=(
138
+ "Let unhandled exceptions propagate outside the main subroutine, "
139
+ "instead of logging them to stderr."
140
+ ),
141
+ )
142
+
143
+ isolated_mode: Callable[..., Option] = partial(
144
+ Option,
145
+ "--isolated",
146
+ dest="isolated_mode",
147
+ action="store_true",
148
+ default=False,
149
+ help=(
150
+ "Run pip in an isolated mode, ignoring environment variables and user "
151
+ "configuration."
152
+ ),
153
+ )
154
+
155
+ require_virtualenv: Callable[..., Option] = partial(
156
+ Option,
157
+ "--require-virtualenv",
158
+ "--require-venv",
159
+ dest="require_venv",
160
+ action="store_true",
161
+ default=False,
162
+ help=(
163
+ "Allow pip to only run in a virtual environment; "
164
+ "exit with an error otherwise."
165
+ ),
166
+ )
167
+
168
+ override_externally_managed: Callable[..., Option] = partial(
169
+ Option,
170
+ "--break-system-packages",
171
+ dest="override_externally_managed",
172
+ action="store_true",
173
+ help="Allow pip to modify an EXTERNALLY-MANAGED Python installation",
174
+ )
175
+
176
+ python: Callable[..., Option] = partial(
177
+ Option,
178
+ "--python",
179
+ dest="python",
180
+ help="Run pip with the specified Python interpreter.",
181
+ )
182
+
183
+ verbose: Callable[..., Option] = partial(
184
+ Option,
185
+ "-v",
186
+ "--verbose",
187
+ dest="verbose",
188
+ action="count",
189
+ default=0,
190
+ help="Give more output. Option is additive, and can be used up to 3 times.",
191
+ )
192
+
193
+ no_color: Callable[..., Option] = partial(
194
+ Option,
195
+ "--no-color",
196
+ dest="no_color",
197
+ action="store_true",
198
+ default=False,
199
+ help="Suppress colored output.",
200
+ )
201
+
202
+ version: Callable[..., Option] = partial(
203
+ Option,
204
+ "-V",
205
+ "--version",
206
+ dest="version",
207
+ action="store_true",
208
+ help="Show version and exit.",
209
+ )
210
+
211
+ quiet: Callable[..., Option] = partial(
212
+ Option,
213
+ "-q",
214
+ "--quiet",
215
+ dest="quiet",
216
+ action="count",
217
+ default=0,
218
+ help=(
219
+ "Give less output. Option is additive, and can be used up to 3"
220
+ " times (corresponding to WARNING, ERROR, and CRITICAL logging"
221
+ " levels)."
222
+ ),
223
+ )
224
+
225
+ progress_bar: Callable[..., Option] = partial(
226
+ Option,
227
+ "--progress-bar",
228
+ dest="progress_bar",
229
+ type="choice",
230
+ choices=["on", "off", "raw"],
231
+ default="on",
232
+ help="Specify whether the progress bar should be used [on, off, raw] (default: on)",
233
+ )
234
+
235
+ log: Callable[..., Option] = partial(
236
+ PipOption,
237
+ "--log",
238
+ "--log-file",
239
+ "--local-log",
240
+ dest="log",
241
+ metavar="path",
242
+ type="path",
243
+ help="Path to a verbose appending log.",
244
+ )
245
+
246
+ no_input: Callable[..., Option] = partial(
247
+ Option,
248
+ # Don't ask for input
249
+ "--no-input",
250
+ dest="no_input",
251
+ action="store_true",
252
+ default=False,
253
+ help="Disable prompting for input.",
254
+ )
255
+
256
+ keyring_provider: Callable[..., Option] = partial(
257
+ Option,
258
+ "--keyring-provider",
259
+ dest="keyring_provider",
260
+ choices=["auto", "disabled", "import", "subprocess"],
261
+ default="auto",
262
+ help=(
263
+ "Enable the credential lookup via the keyring library if user input is allowed."
264
+ " Specify which mechanism to use [auto, disabled, import, subprocess]."
265
+ " (default: %default)"
266
+ ),
267
+ )
268
+
269
+ proxy: Callable[..., Option] = partial(
270
+ Option,
271
+ "--proxy",
272
+ dest="proxy",
273
+ type="str",
274
+ default="",
275
+ help="Specify a proxy in the form scheme://[user:passwd@]proxy.server:port.",
276
+ )
277
+
278
+ retries: Callable[..., Option] = partial(
279
+ Option,
280
+ "--retries",
281
+ dest="retries",
282
+ type="int",
283
+ default=5,
284
+ help="Maximum attempts to establish a new HTTP connection. (default: %default)",
285
+ )
286
+
287
+ resume_retries: Callable[..., Option] = partial(
288
+ Option,
289
+ "--resume-retries",
290
+ dest="resume_retries",
291
+ type="int",
292
+ default=0,
293
+ help="Maximum attempts to resume or restart an incomplete download. "
294
+ "(default: %default)",
295
+ )
296
+
297
+ timeout: Callable[..., Option] = partial(
298
+ Option,
299
+ "--timeout",
300
+ "--default-timeout",
301
+ metavar="sec",
302
+ dest="timeout",
303
+ type="float",
304
+ default=15,
305
+ help="Set the socket timeout (default %default seconds).",
306
+ )
307
+
308
+
309
+ def exists_action() -> Option:
310
+ return Option(
311
+ # Option when path already exist
312
+ "--exists-action",
313
+ dest="exists_action",
314
+ type="choice",
315
+ choices=["s", "i", "w", "b", "a"],
316
+ default=[],
317
+ action="append",
318
+ metavar="action",
319
+ help="Default action when a path already exists: "
320
+ "(s)witch, (i)gnore, (w)ipe, (b)ackup, (a)bort.",
321
+ )
322
+
323
+
324
+ cert: Callable[..., Option] = partial(
325
+ PipOption,
326
+ "--cert",
327
+ dest="cert",
328
+ type="path",
329
+ metavar="path",
330
+ help=(
331
+ "Path to PEM-encoded CA certificate bundle. "
332
+ "If provided, overrides the default. "
333
+ "See 'SSL Certificate Verification' in pip documentation "
334
+ "for more information."
335
+ ),
336
+ )
337
+
338
+ client_cert: Callable[..., Option] = partial(
339
+ PipOption,
340
+ "--client-cert",
341
+ dest="client_cert",
342
+ type="path",
343
+ default=None,
344
+ metavar="path",
345
+ help="Path to SSL client certificate, a single file containing the "
346
+ "private key and the certificate in PEM format.",
347
+ )
348
+
349
+ index_url: Callable[..., Option] = partial(
350
+ Option,
351
+ "-i",
352
+ "--index-url",
353
+ "--pypi-url",
354
+ dest="index_url",
355
+ metavar="URL",
356
+ default=PyPI.simple_url,
357
+ help="Base URL of the Python Package Index (default %default). "
358
+ "This should point to a repository compliant with PEP 503 "
359
+ "(the simple repository API) or a local directory laid out "
360
+ "in the same format.",
361
+ )
362
+
363
+
364
+ def extra_index_url() -> Option:
365
+ return Option(
366
+ "--extra-index-url",
367
+ dest="extra_index_urls",
368
+ metavar="URL",
369
+ action="append",
370
+ default=[],
371
+ help="Extra URLs of package indexes to use in addition to "
372
+ "--index-url. Should follow the same rules as "
373
+ "--index-url.",
374
+ )
375
+
376
+
377
+ no_index: Callable[..., Option] = partial(
378
+ Option,
379
+ "--no-index",
380
+ dest="no_index",
381
+ action="store_true",
382
+ default=False,
383
+ help="Ignore package index (only looking at --find-links URLs instead).",
384
+ )
385
+
386
+
387
+ def find_links() -> Option:
388
+ return Option(
389
+ "-f",
390
+ "--find-links",
391
+ dest="find_links",
392
+ action="append",
393
+ default=[],
394
+ metavar="url",
395
+ help="If a URL or path to an html file, then parse for links to "
396
+ "archives such as sdist (.tar.gz) or wheel (.whl) files. "
397
+ "If a local path or file:// URL that's a directory, "
398
+ "then look for archives in the directory listing. "
399
+ "Links to VCS project URLs are not supported.",
400
+ )
401
+
402
+
403
+ def trusted_host() -> Option:
404
+ return Option(
405
+ "--trusted-host",
406
+ dest="trusted_hosts",
407
+ action="append",
408
+ metavar="HOSTNAME",
409
+ default=[],
410
+ help="Mark this host or host:port pair as trusted, even though it "
411
+ "does not have valid or any HTTPS.",
412
+ )
413
+
414
+
415
+ def constraints() -> Option:
416
+ return Option(
417
+ "-c",
418
+ "--constraint",
419
+ dest="constraints",
420
+ action="append",
421
+ default=[],
422
+ metavar="file",
423
+ help="Constrain versions using the given constraints file. "
424
+ "This option can be used multiple times.",
425
+ )
426
+
427
+
428
+ def requirements() -> Option:
429
+ return Option(
430
+ "-r",
431
+ "--requirement",
432
+ dest="requirements",
433
+ action="append",
434
+ default=[],
435
+ metavar="file",
436
+ help="Install from the given requirements file. "
437
+ "This option can be used multiple times.",
438
+ )
439
+
440
+
441
+ def editable() -> Option:
442
+ return Option(
443
+ "-e",
444
+ "--editable",
445
+ dest="editables",
446
+ action="append",
447
+ default=[],
448
+ metavar="path/url",
449
+ help=(
450
+ "Install a project in editable mode (i.e. setuptools "
451
+ '"develop mode") from a local project path or a VCS url.'
452
+ ),
453
+ )
454
+
455
+
456
+ def _handle_src(option: Option, opt_str: str, value: str, parser: OptionParser) -> None:
457
+ value = os.path.abspath(value)
458
+ setattr(parser.values, option.dest, value)
459
+
460
+
461
+ src: Callable[..., Option] = partial(
462
+ PipOption,
463
+ "--src",
464
+ "--source",
465
+ "--source-dir",
466
+ "--source-directory",
467
+ dest="src_dir",
468
+ type="path",
469
+ metavar="dir",
470
+ default=get_src_prefix(),
471
+ action="callback",
472
+ callback=_handle_src,
473
+ help="Directory to check out editable projects into. "
474
+ 'The default in a virtualenv is "<venv path>/src". '
475
+ 'The default for global installs is "<current dir>/src".',
476
+ )
477
+
478
+
479
+ def _get_format_control(values: Values, option: Option) -> Any:
480
+ """Get a format_control object."""
481
+ return getattr(values, option.dest)
482
+
483
+
484
+ def _handle_no_binary(
485
+ option: Option, opt_str: str, value: str, parser: OptionParser
486
+ ) -> None:
487
+ existing = _get_format_control(parser.values, option)
488
+ FormatControl.handle_mutual_excludes(
489
+ value,
490
+ existing.no_binary,
491
+ existing.only_binary,
492
+ )
493
+
494
+
495
+ def _handle_only_binary(
496
+ option: Option, opt_str: str, value: str, parser: OptionParser
497
+ ) -> None:
498
+ existing = _get_format_control(parser.values, option)
499
+ FormatControl.handle_mutual_excludes(
500
+ value,
501
+ existing.only_binary,
502
+ existing.no_binary,
503
+ )
504
+
505
+
506
+ def no_binary() -> Option:
507
+ format_control = FormatControl(set(), set())
508
+ return Option(
509
+ "--no-binary",
510
+ dest="format_control",
511
+ action="callback",
512
+ callback=_handle_no_binary,
513
+ type="str",
514
+ default=format_control,
515
+ help="Do not use binary packages. Can be supplied multiple times, and "
516
+ 'each time adds to the existing value. Accepts either ":all:" to '
517
+ 'disable all binary packages, ":none:" to empty the set (notice '
518
+ "the colons), or one or more package names with commas between "
519
+ "them (no colons). Note that some packages are tricky to compile "
520
+ "and may fail to install when this option is used on them.",
521
+ )
522
+
523
+
524
+ def only_binary() -> Option:
525
+ format_control = FormatControl(set(), set())
526
+ return Option(
527
+ "--only-binary",
528
+ dest="format_control",
529
+ action="callback",
530
+ callback=_handle_only_binary,
531
+ type="str",
532
+ default=format_control,
533
+ help="Do not use source packages. Can be supplied multiple times, and "
534
+ 'each time adds to the existing value. Accepts either ":all:" to '
535
+ 'disable all source packages, ":none:" to empty the set, or one '
536
+ "or more package names with commas between them. Packages "
537
+ "without binary distributions will fail to install when this "
538
+ "option is used on them.",
539
+ )
540
+
541
+
542
+ platforms: Callable[..., Option] = partial(
543
+ Option,
544
+ "--platform",
545
+ dest="platforms",
546
+ metavar="platform",
547
+ action="append",
548
+ default=None,
549
+ help=(
550
+ "Only use wheels compatible with <platform>. Defaults to the "
551
+ "platform of the running system. Use this option multiple times to "
552
+ "specify multiple platforms supported by the target interpreter."
553
+ ),
554
+ )
555
+
556
+
557
+ # This was made a separate function for unit-testing purposes.
558
+ def _convert_python_version(value: str) -> Tuple[Tuple[int, ...], Optional[str]]:
559
+ """
560
+ Convert a version string like "3", "37", or "3.7.3" into a tuple of ints.
561
+
562
+ :return: A 2-tuple (version_info, error_msg), where `error_msg` is
563
+ non-None if and only if there was a parsing error.
564
+ """
565
+ if not value:
566
+ # The empty string is the same as not providing a value.
567
+ return (None, None)
568
+
569
+ parts = value.split(".")
570
+ if len(parts) > 3:
571
+ return ((), "at most three version parts are allowed")
572
+
573
+ if len(parts) == 1:
574
+ # Then we are in the case of "3" or "37".
575
+ value = parts[0]
576
+ if len(value) > 1:
577
+ parts = [value[0], value[1:]]
578
+
579
+ try:
580
+ version_info = tuple(int(part) for part in parts)
581
+ except ValueError:
582
+ return ((), "each version part must be an integer")
583
+
584
+ return (version_info, None)
585
+
586
+
587
+ def _handle_python_version(
588
+ option: Option, opt_str: str, value: str, parser: OptionParser
589
+ ) -> None:
590
+ """
591
+ Handle a provided --python-version value.
592
+ """
593
+ version_info, error_msg = _convert_python_version(value)
594
+ if error_msg is not None:
595
+ msg = f"invalid --python-version value: {value!r}: {error_msg}"
596
+ raise_option_error(parser, option=option, msg=msg)
597
+
598
+ parser.values.python_version = version_info
599
+
600
+
601
+ python_version: Callable[..., Option] = partial(
602
+ Option,
603
+ "--python-version",
604
+ dest="python_version",
605
+ metavar="python_version",
606
+ action="callback",
607
+ callback=_handle_python_version,
608
+ type="str",
609
+ default=None,
610
+ help=dedent(
611
+ """\
612
+ The Python interpreter version to use for wheel and "Requires-Python"
613
+ compatibility checks. Defaults to a version derived from the running
614
+ interpreter. The version can be specified using up to three dot-separated
615
+ integers (e.g. "3" for 3.0.0, "3.7" for 3.7.0, or "3.7.3"). A major-minor
616
+ version can also be given as a string without dots (e.g. "37" for 3.7.0).
617
+ """
618
+ ),
619
+ )
620
+
621
+
622
+ implementation: Callable[..., Option] = partial(
623
+ Option,
624
+ "--implementation",
625
+ dest="implementation",
626
+ metavar="implementation",
627
+ default=None,
628
+ help=(
629
+ "Only use wheels compatible with Python "
630
+ "implementation <implementation>, e.g. 'pp', 'jy', 'cp', "
631
+ " or 'ip'. If not specified, then the current "
632
+ "interpreter implementation is used. Use 'py' to force "
633
+ "implementation-agnostic wheels."
634
+ ),
635
+ )
636
+
637
+
638
+ abis: Callable[..., Option] = partial(
639
+ Option,
640
+ "--abi",
641
+ dest="abis",
642
+ metavar="abi",
643
+ action="append",
644
+ default=None,
645
+ help=(
646
+ "Only use wheels compatible with Python abi <abi>, e.g. 'pypy_41'. "
647
+ "If not specified, then the current interpreter abi tag is used. "
648
+ "Use this option multiple times to specify multiple abis supported "
649
+ "by the target interpreter. Generally you will need to specify "
650
+ "--implementation, --platform, and --python-version when using this "
651
+ "option."
652
+ ),
653
+ )
654
+
655
+
656
+ def add_target_python_options(cmd_opts: OptionGroup) -> None:
657
+ cmd_opts.add_option(platforms())
658
+ cmd_opts.add_option(python_version())
659
+ cmd_opts.add_option(implementation())
660
+ cmd_opts.add_option(abis())
661
+
662
+
663
+ def make_target_python(options: Values) -> TargetPython:
664
+ target_python = TargetPython(
665
+ platforms=options.platforms,
666
+ py_version_info=options.python_version,
667
+ abis=options.abis,
668
+ implementation=options.implementation,
669
+ )
670
+
671
+ return target_python
672
+
673
+
674
+ def prefer_binary() -> Option:
675
+ return Option(
676
+ "--prefer-binary",
677
+ dest="prefer_binary",
678
+ action="store_true",
679
+ default=False,
680
+ help=(
681
+ "Prefer binary packages over source packages, even if the "
682
+ "source packages are newer."
683
+ ),
684
+ )
685
+
686
+
687
+ cache_dir: Callable[..., Option] = partial(
688
+ PipOption,
689
+ "--cache-dir",
690
+ dest="cache_dir",
691
+ default=USER_CACHE_DIR,
692
+ metavar="dir",
693
+ type="path",
694
+ help="Store the cache data in <dir>.",
695
+ )
696
+
697
+
698
+ def _handle_no_cache_dir(
699
+ option: Option, opt: str, value: str, parser: OptionParser
700
+ ) -> None:
701
+ """
702
+ Process a value provided for the --no-cache-dir option.
703
+
704
+ This is an optparse.Option callback for the --no-cache-dir option.
705
+ """
706
+ # The value argument will be None if --no-cache-dir is passed via the
707
+ # command-line, since the option doesn't accept arguments. However,
708
+ # the value can be non-None if the option is triggered e.g. by an
709
+ # environment variable, like PIP_NO_CACHE_DIR=true.
710
+ if value is not None:
711
+ # Then parse the string value to get argument error-checking.
712
+ try:
713
+ strtobool(value)
714
+ except ValueError as exc:
715
+ raise_option_error(parser, option=option, msg=str(exc))
716
+
717
+ # Originally, setting PIP_NO_CACHE_DIR to a value that strtobool()
718
+ # converted to 0 (like "false" or "no") caused cache_dir to be disabled
719
+ # rather than enabled (logic would say the latter). Thus, we disable
720
+ # the cache directory not just on values that parse to True, but (for
721
+ # backwards compatibility reasons) also on values that parse to False.
722
+ # In other words, always set it to False if the option is provided in
723
+ # some (valid) form.
724
+ parser.values.cache_dir = False
725
+
726
+
727
+ no_cache: Callable[..., Option] = partial(
728
+ Option,
729
+ "--no-cache-dir",
730
+ dest="cache_dir",
731
+ action="callback",
732
+ callback=_handle_no_cache_dir,
733
+ help="Disable the cache.",
734
+ )
735
+
736
+ no_deps: Callable[..., Option] = partial(
737
+ Option,
738
+ "--no-deps",
739
+ "--no-dependencies",
740
+ dest="ignore_dependencies",
741
+ action="store_true",
742
+ default=False,
743
+ help="Don't install package dependencies.",
744
+ )
745
+
746
+
747
+ def _handle_dependency_group(
748
+ option: Option, opt: str, value: str, parser: OptionParser
749
+ ) -> None:
750
+ """
751
+ Process a value provided for the --group option.
752
+
753
+ Splits on the rightmost ":", and validates that the path (if present) ends
754
+ in `pyproject.toml`. Defaults the path to `pyproject.toml` when one is not given.
755
+
756
+ `:` cannot appear in dependency group names, so this is a safe and simple parse.
757
+
758
+ This is an optparse.Option callback for the dependency_groups option.
759
+ """
760
+ path, sep, groupname = value.rpartition(":")
761
+ if not sep:
762
+ path = "pyproject.toml"
763
+ else:
764
+ # check for 'pyproject.toml' filenames using pathlib
765
+ if pathlib.PurePath(path).name != "pyproject.toml":
766
+ msg = "group paths use 'pyproject.toml' filenames"
767
+ raise_option_error(parser, option=option, msg=msg)
768
+
769
+ parser.values.dependency_groups.append((path, groupname))
770
+
771
+
772
+ dependency_groups: Callable[..., Option] = partial(
773
+ Option,
774
+ "--group",
775
+ dest="dependency_groups",
776
+ default=[],
777
+ type=str,
778
+ action="callback",
779
+ callback=_handle_dependency_group,
780
+ metavar="[path:]group",
781
+ help='Install a named dependency-group from a "pyproject.toml" file. '
782
+ 'If a path is given, the name of the file must be "pyproject.toml". '
783
+ 'Defaults to using "pyproject.toml" in the current directory.',
784
+ )
785
+
786
+ ignore_requires_python: Callable[..., Option] = partial(
787
+ Option,
788
+ "--ignore-requires-python",
789
+ dest="ignore_requires_python",
790
+ action="store_true",
791
+ help="Ignore the Requires-Python information.",
792
+ )
793
+
794
+ no_build_isolation: Callable[..., Option] = partial(
795
+ Option,
796
+ "--no-build-isolation",
797
+ dest="build_isolation",
798
+ action="store_false",
799
+ default=True,
800
+ help="Disable isolation when building a modern source distribution. "
801
+ "Build dependencies specified by PEP 518 must be already installed "
802
+ "if this option is used.",
803
+ )
804
+
805
+ check_build_deps: Callable[..., Option] = partial(
806
+ Option,
807
+ "--check-build-dependencies",
808
+ dest="check_build_deps",
809
+ action="store_true",
810
+ default=False,
811
+ help="Check the build dependencies when PEP517 is used.",
812
+ )
813
+
814
+
815
+ def _handle_no_use_pep517(
816
+ option: Option, opt: str, value: str, parser: OptionParser
817
+ ) -> None:
818
+ """
819
+ Process a value provided for the --no-use-pep517 option.
820
+
821
+ This is an optparse.Option callback for the no_use_pep517 option.
822
+ """
823
+ # Since --no-use-pep517 doesn't accept arguments, the value argument
824
+ # will be None if --no-use-pep517 is passed via the command-line.
825
+ # However, the value can be non-None if the option is triggered e.g.
826
+ # by an environment variable, for example "PIP_NO_USE_PEP517=true".
827
+ if value is not None:
828
+ msg = """A value was passed for --no-use-pep517,
829
+ probably using either the PIP_NO_USE_PEP517 environment variable
830
+ or the "no-use-pep517" config file option. Use an appropriate value
831
+ of the PIP_USE_PEP517 environment variable or the "use-pep517"
832
+ config file option instead.
833
+ """
834
+ raise_option_error(parser, option=option, msg=msg)
835
+
836
+ # If user doesn't wish to use pep517, we check if setuptools is installed
837
+ # and raise error if it is not.
838
+ packages = ("setuptools",)
839
+ if not all(importlib.util.find_spec(package) for package in packages):
840
+ msg = (
841
+ f"It is not possible to use --no-use-pep517 "
842
+ f"without {' and '.join(packages)} installed."
843
+ )
844
+ raise_option_error(parser, option=option, msg=msg)
845
+
846
+ # Otherwise, --no-use-pep517 was passed via the command-line.
847
+ parser.values.use_pep517 = False
848
+
849
+
850
+ use_pep517: Any = partial(
851
+ Option,
852
+ "--use-pep517",
853
+ dest="use_pep517",
854
+ action="store_true",
855
+ default=None,
856
+ help="Use PEP 517 for building source distributions "
857
+ "(use --no-use-pep517 to force legacy behaviour).",
858
+ )
859
+
860
+ no_use_pep517: Any = partial(
861
+ Option,
862
+ "--no-use-pep517",
863
+ dest="use_pep517",
864
+ action="callback",
865
+ callback=_handle_no_use_pep517,
866
+ default=None,
867
+ help=SUPPRESS_HELP,
868
+ )
869
+
870
+
871
+ def _handle_config_settings(
872
+ option: Option, opt_str: str, value: str, parser: OptionParser
873
+ ) -> None:
874
+ key, sep, val = value.partition("=")
875
+ if sep != "=":
876
+ parser.error(f"Arguments to {opt_str} must be of the form KEY=VAL")
877
+ dest = getattr(parser.values, option.dest)
878
+ if dest is None:
879
+ dest = {}
880
+ setattr(parser.values, option.dest, dest)
881
+ if key in dest:
882
+ if isinstance(dest[key], list):
883
+ dest[key].append(val)
884
+ else:
885
+ dest[key] = [dest[key], val]
886
+ else:
887
+ dest[key] = val
888
+
889
+
890
+ config_settings: Callable[..., Option] = partial(
891
+ Option,
892
+ "-C",
893
+ "--config-settings",
894
+ dest="config_settings",
895
+ type=str,
896
+ action="callback",
897
+ callback=_handle_config_settings,
898
+ metavar="settings",
899
+ help="Configuration settings to be passed to the PEP 517 build backend. "
900
+ "Settings take the form KEY=VALUE. Use multiple --config-settings options "
901
+ "to pass multiple keys to the backend.",
902
+ )
903
+
904
+ build_options: Callable[..., Option] = partial(
905
+ Option,
906
+ "--build-option",
907
+ dest="build_options",
908
+ metavar="options",
909
+ action="append",
910
+ help="Extra arguments to be supplied to 'setup.py bdist_wheel'.",
911
+ )
912
+
913
+ global_options: Callable[..., Option] = partial(
914
+ Option,
915
+ "--global-option",
916
+ dest="global_options",
917
+ action="append",
918
+ metavar="options",
919
+ help="Extra global options to be supplied to the setup.py "
920
+ "call before the install or bdist_wheel command.",
921
+ )
922
+
923
+ no_clean: Callable[..., Option] = partial(
924
+ Option,
925
+ "--no-clean",
926
+ action="store_true",
927
+ default=False,
928
+ help="Don't clean up build directories.",
929
+ )
930
+
931
+ pre: Callable[..., Option] = partial(
932
+ Option,
933
+ "--pre",
934
+ action="store_true",
935
+ default=False,
936
+ help="Include pre-release and development versions. By default, "
937
+ "pip only finds stable versions.",
938
+ )
939
+
940
+ json: Callable[..., Option] = partial(
941
+ Option,
942
+ "--json",
943
+ action="store_true",
944
+ default=False,
945
+ help="Output data in a machine-readable JSON format.",
946
+ )
947
+
948
+ disable_pip_version_check: Callable[..., Option] = partial(
949
+ Option,
950
+ "--disable-pip-version-check",
951
+ dest="disable_pip_version_check",
952
+ action="store_true",
953
+ default=False,
954
+ help="Don't periodically check PyPI to determine whether a new version "
955
+ "of pip is available for download. Implied with --no-index.",
956
+ )
957
+
958
+ root_user_action: Callable[..., Option] = partial(
959
+ Option,
960
+ "--root-user-action",
961
+ dest="root_user_action",
962
+ default="warn",
963
+ choices=["warn", "ignore"],
964
+ help="Action if pip is run as a root user [warn, ignore] (default: warn)",
965
+ )
966
+
967
+
968
+ def _handle_merge_hash(
969
+ option: Option, opt_str: str, value: str, parser: OptionParser
970
+ ) -> None:
971
+ """Given a value spelled "algo:digest", append the digest to a list
972
+ pointed to in a dict by the algo name."""
973
+ if not parser.values.hashes:
974
+ parser.values.hashes = {}
975
+ try:
976
+ algo, digest = value.split(":", 1)
977
+ except ValueError:
978
+ parser.error(
979
+ f"Arguments to {opt_str} must be a hash name "
980
+ "followed by a value, like --hash=sha256:"
981
+ "abcde..."
982
+ )
983
+ if algo not in STRONG_HASHES:
984
+ parser.error(
985
+ "Allowed hash algorithms for {} are {}.".format(
986
+ opt_str, ", ".join(STRONG_HASHES)
987
+ )
988
+ )
989
+ parser.values.hashes.setdefault(algo, []).append(digest)
990
+
991
+
992
+ hash: Callable[..., Option] = partial(
993
+ Option,
994
+ "--hash",
995
+ # Hash values eventually end up in InstallRequirement.hashes due to
996
+ # __dict__ copying in process_line().
997
+ dest="hashes",
998
+ action="callback",
999
+ callback=_handle_merge_hash,
1000
+ type="string",
1001
+ help="Verify that the package's archive matches this "
1002
+ "hash before installing. Example: --hash=sha256:abcdef...",
1003
+ )
1004
+
1005
+
1006
+ require_hashes: Callable[..., Option] = partial(
1007
+ Option,
1008
+ "--require-hashes",
1009
+ dest="require_hashes",
1010
+ action="store_true",
1011
+ default=False,
1012
+ help="Require a hash to check each requirement against, for "
1013
+ "repeatable installs. This option is implied when any package in a "
1014
+ "requirements file has a --hash option.",
1015
+ )
1016
+
1017
+
1018
+ list_path: Callable[..., Option] = partial(
1019
+ PipOption,
1020
+ "--path",
1021
+ dest="path",
1022
+ type="path",
1023
+ action="append",
1024
+ help="Restrict to the specified installation path for listing "
1025
+ "packages (can be used multiple times).",
1026
+ )
1027
+
1028
+
1029
+ def check_list_path_option(options: Values) -> None:
1030
+ if options.path and (options.user or options.local):
1031
+ raise CommandError("Cannot combine '--path' with '--user' or '--local'")
1032
+
1033
+
1034
+ list_exclude: Callable[..., Option] = partial(
1035
+ PipOption,
1036
+ "--exclude",
1037
+ dest="excludes",
1038
+ action="append",
1039
+ metavar="package",
1040
+ type="package_name",
1041
+ help="Exclude specified package from the output",
1042
+ )
1043
+
1044
+
1045
+ no_python_version_warning: Callable[..., Option] = partial(
1046
+ Option,
1047
+ "--no-python-version-warning",
1048
+ dest="no_python_version_warning",
1049
+ action="store_true",
1050
+ default=False,
1051
+ help=SUPPRESS_HELP, # No-op, a hold-over from the Python 2->3 transition.
1052
+ )
1053
+
1054
+
1055
+ # Features that are now always on. A warning is printed if they are used.
1056
+ ALWAYS_ENABLED_FEATURES = [
1057
+ "truststore", # always on since 24.2
1058
+ "no-binary-enable-wheel-cache", # always on since 23.1
1059
+ ]
1060
+
1061
+ use_new_feature: Callable[..., Option] = partial(
1062
+ Option,
1063
+ "--use-feature",
1064
+ dest="features_enabled",
1065
+ metavar="feature",
1066
+ action="append",
1067
+ default=[],
1068
+ choices=[
1069
+ "fast-deps",
1070
+ ]
1071
+ + ALWAYS_ENABLED_FEATURES,
1072
+ help="Enable new functionality, that may be backward incompatible.",
1073
+ )
1074
+
1075
+ use_deprecated_feature: Callable[..., Option] = partial(
1076
+ Option,
1077
+ "--use-deprecated",
1078
+ dest="deprecated_features_enabled",
1079
+ metavar="feature",
1080
+ action="append",
1081
+ default=[],
1082
+ choices=[
1083
+ "legacy-resolver",
1084
+ "legacy-certs",
1085
+ ],
1086
+ help=("Enable deprecated functionality, that will be removed in the future."),
1087
+ )
1088
+
1089
+ ##########
1090
+ # groups #
1091
+ ##########
1092
+
1093
+ general_group: Dict[str, Any] = {
1094
+ "name": "General Options",
1095
+ "options": [
1096
+ help_,
1097
+ debug_mode,
1098
+ isolated_mode,
1099
+ require_virtualenv,
1100
+ python,
1101
+ verbose,
1102
+ version,
1103
+ quiet,
1104
+ log,
1105
+ no_input,
1106
+ keyring_provider,
1107
+ proxy,
1108
+ retries,
1109
+ timeout,
1110
+ exists_action,
1111
+ trusted_host,
1112
+ cert,
1113
+ client_cert,
1114
+ cache_dir,
1115
+ no_cache,
1116
+ disable_pip_version_check,
1117
+ no_color,
1118
+ no_python_version_warning,
1119
+ use_new_feature,
1120
+ use_deprecated_feature,
1121
+ resume_retries,
1122
+ ],
1123
+ }
1124
+
1125
+ index_group: Dict[str, Any] = {
1126
+ "name": "Package Index Options",
1127
+ "options": [
1128
+ index_url,
1129
+ extra_index_url,
1130
+ no_index,
1131
+ find_links,
1132
+ ],
1133
+ }
.venv/Lib/site-packages/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)
.venv/Lib/site-packages/pip/_internal/cli/index_command.py ADDED
@@ -0,0 +1,173 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Contains command classes which may interact with an index / the network.
3
+
4
+ Unlike its sister module, req_command, this module still uses lazy imports
5
+ so commands which don't always hit the network (e.g. list w/o --outdated or
6
+ --uptodate) don't need waste time importing PipSession and friends.
7
+ """
8
+
9
+ import logging
10
+ import os
11
+ import sys
12
+ from functools import lru_cache
13
+ from optparse import Values
14
+ from typing import TYPE_CHECKING, List, Optional
15
+
16
+ from pip._vendor import certifi
17
+
18
+ from pip._internal.cli.base_command import Command
19
+ from pip._internal.cli.command_context import CommandContextMixIn
20
+
21
+ if TYPE_CHECKING:
22
+ from ssl import SSLContext
23
+
24
+ from pip._internal.network.session import PipSession
25
+
26
+ logger = logging.getLogger(__name__)
27
+
28
+
29
+ @lru_cache
30
+ def _create_truststore_ssl_context() -> Optional["SSLContext"]:
31
+ if sys.version_info < (3, 10):
32
+ logger.debug("Disabling truststore because Python version isn't 3.10+")
33
+ return None
34
+
35
+ try:
36
+ import ssl
37
+ except ImportError:
38
+ logger.warning("Disabling truststore since ssl support is missing")
39
+ return None
40
+
41
+ try:
42
+ from pip._vendor import truststore
43
+ except ImportError:
44
+ logger.warning("Disabling truststore because platform isn't supported")
45
+ return None
46
+
47
+ ctx = truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
48
+ ctx.load_verify_locations(certifi.where())
49
+ return ctx
50
+
51
+
52
+ class SessionCommandMixin(CommandContextMixIn):
53
+ """
54
+ A class mixin for command classes needing _build_session().
55
+ """
56
+
57
+ def __init__(self) -> None:
58
+ super().__init__()
59
+ self._session: Optional[PipSession] = None
60
+
61
+ @classmethod
62
+ def _get_index_urls(cls, options: Values) -> Optional[List[str]]:
63
+ """Return a list of index urls from user-provided options."""
64
+ index_urls = []
65
+ if not getattr(options, "no_index", False):
66
+ url = getattr(options, "index_url", None)
67
+ if url:
68
+ index_urls.append(url)
69
+ urls = getattr(options, "extra_index_urls", None)
70
+ if urls:
71
+ index_urls.extend(urls)
72
+ # Return None rather than an empty list
73
+ return index_urls or None
74
+
75
+ def get_default_session(self, options: Values) -> "PipSession":
76
+ """Get a default-managed session."""
77
+ if self._session is None:
78
+ self._session = self.enter_context(self._build_session(options))
79
+ # there's no type annotation on requests.Session, so it's
80
+ # automatically ContextManager[Any] and self._session becomes Any,
81
+ # then https://github.com/python/mypy/issues/7696 kicks in
82
+ assert self._session is not None
83
+ return self._session
84
+
85
+ def _build_session(
86
+ self,
87
+ options: Values,
88
+ retries: Optional[int] = None,
89
+ timeout: Optional[int] = None,
90
+ ) -> "PipSession":
91
+ from pip._internal.network.session import PipSession
92
+
93
+ cache_dir = options.cache_dir
94
+ assert not cache_dir or os.path.isabs(cache_dir)
95
+
96
+ if "legacy-certs" not in options.deprecated_features_enabled:
97
+ ssl_context = _create_truststore_ssl_context()
98
+ else:
99
+ ssl_context = None
100
+
101
+ session = PipSession(
102
+ cache=os.path.join(cache_dir, "http-v2") if cache_dir else None,
103
+ retries=retries if retries is not None else options.retries,
104
+ trusted_hosts=options.trusted_hosts,
105
+ index_urls=self._get_index_urls(options),
106
+ ssl_context=ssl_context,
107
+ )
108
+
109
+ # Handle custom ca-bundles from the user
110
+ if options.cert:
111
+ session.verify = options.cert
112
+
113
+ # Handle SSL client certificate
114
+ if options.client_cert:
115
+ session.cert = options.client_cert
116
+
117
+ # Handle timeouts
118
+ if options.timeout or timeout:
119
+ session.timeout = timeout if timeout is not None else options.timeout
120
+
121
+ # Handle configured proxies
122
+ if options.proxy:
123
+ session.proxies = {
124
+ "http": options.proxy,
125
+ "https": options.proxy,
126
+ }
127
+ session.trust_env = False
128
+ session.pip_proxy = options.proxy
129
+
130
+ # Determine if we can prompt the user for authentication or not
131
+ session.auth.prompting = not options.no_input
132
+ session.auth.keyring_provider = options.keyring_provider
133
+
134
+ return session
135
+
136
+
137
+ def _pip_self_version_check(session: "PipSession", options: Values) -> None:
138
+ from pip._internal.self_outdated_check import pip_self_version_check as check
139
+
140
+ check(session, options)
141
+
142
+
143
+ class IndexGroupCommand(Command, SessionCommandMixin):
144
+ """
145
+ Abstract base class for commands with the index_group options.
146
+
147
+ This also corresponds to the commands that permit the pip version check.
148
+ """
149
+
150
+ def handle_pip_version_check(self, options: Values) -> None:
151
+ """
152
+ Do the pip version check if not disabled.
153
+
154
+ This overrides the default behavior of not doing the check.
155
+ """
156
+ # Make sure the index_group options are present.
157
+ assert hasattr(options, "no_index")
158
+
159
+ if options.disable_pip_version_check or options.no_index:
160
+ return
161
+
162
+ try:
163
+ # Otherwise, check if we're using the latest version of pip available.
164
+ session = self._build_session(
165
+ options,
166
+ retries=0,
167
+ timeout=min(5, options.timeout),
168
+ )
169
+ with session:
170
+ _pip_self_version_check(session, options)
171
+ except Exception:
172
+ logger.warning("There was an error checking the latest version of pip.")
173
+ logger.debug("See below for error", exc_info=True)
.venv/Lib/site-packages/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)
.venv/Lib/site-packages/pip/_internal/cli/main_parser.py ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """A single place for constructing and exposing the main parser"""
2
+
3
+ import os
4
+ import subprocess
5
+ import sys
6
+ from typing import List, Optional, Tuple
7
+
8
+ from pip._internal.build_env import get_runnable_pip
9
+ from pip._internal.cli import cmdoptions
10
+ from pip._internal.cli.parser import ConfigOptionParser, UpdatingDefaultsHelpFormatter
11
+ from pip._internal.commands import commands_dict, get_similar_commands
12
+ from pip._internal.exceptions import CommandError
13
+ from pip._internal.utils.misc import get_pip_version, get_prog
14
+
15
+ __all__ = ["create_main_parser", "parse_command"]
16
+
17
+
18
+ def create_main_parser() -> ConfigOptionParser:
19
+ """Creates and returns the main parser for pip's CLI"""
20
+
21
+ parser = ConfigOptionParser(
22
+ usage="\n%prog <command> [options]",
23
+ add_help_option=False,
24
+ formatter=UpdatingDefaultsHelpFormatter(),
25
+ name="global",
26
+ prog=get_prog(),
27
+ )
28
+ parser.disable_interspersed_args()
29
+
30
+ parser.version = get_pip_version()
31
+
32
+ # add the general options
33
+ gen_opts = cmdoptions.make_option_group(cmdoptions.general_group, parser)
34
+ parser.add_option_group(gen_opts)
35
+
36
+ # so the help formatter knows
37
+ parser.main = True # type: ignore
38
+
39
+ # create command listing for description
40
+ description = [""] + [
41
+ f"{name:27} {command_info.summary}"
42
+ for name, command_info in commands_dict.items()
43
+ ]
44
+ parser.description = "\n".join(description)
45
+
46
+ return parser
47
+
48
+
49
+ def identify_python_interpreter(python: str) -> Optional[str]:
50
+ # If the named file exists, use it.
51
+ # If it's a directory, assume it's a virtual environment and
52
+ # look for the environment's Python executable.
53
+ if os.path.exists(python):
54
+ if os.path.isdir(python):
55
+ # bin/python for Unix, Scripts/python.exe for Windows
56
+ # Try both in case of odd cases like cygwin.
57
+ for exe in ("bin/python", "Scripts/python.exe"):
58
+ py = os.path.join(python, exe)
59
+ if os.path.exists(py):
60
+ return py
61
+ else:
62
+ return python
63
+
64
+ # Could not find the interpreter specified
65
+ return None
66
+
67
+
68
+ def parse_command(args: List[str]) -> Tuple[str, List[str]]:
69
+ parser = create_main_parser()
70
+
71
+ # Note: parser calls disable_interspersed_args(), so the result of this
72
+ # call is to split the initial args into the general options before the
73
+ # subcommand and everything else.
74
+ # For example:
75
+ # args: ['--timeout=5', 'install', '--user', 'INITools']
76
+ # general_options: ['--timeout==5']
77
+ # args_else: ['install', '--user', 'INITools']
78
+ general_options, args_else = parser.parse_args(args)
79
+
80
+ # --python
81
+ if general_options.python and "_PIP_RUNNING_IN_SUBPROCESS" not in os.environ:
82
+ # Re-invoke pip using the specified Python interpreter
83
+ interpreter = identify_python_interpreter(general_options.python)
84
+ if interpreter is None:
85
+ raise CommandError(
86
+ f"Could not locate Python interpreter {general_options.python}"
87
+ )
88
+
89
+ pip_cmd = [
90
+ interpreter,
91
+ get_runnable_pip(),
92
+ ]
93
+ pip_cmd.extend(args)
94
+
95
+ # Set a flag so the child doesn't re-invoke itself, causing
96
+ # an infinite loop.
97
+ os.environ["_PIP_RUNNING_IN_SUBPROCESS"] = "1"
98
+ returncode = 0
99
+ try:
100
+ proc = subprocess.run(pip_cmd)
101
+ returncode = proc.returncode
102
+ except (subprocess.SubprocessError, OSError) as exc:
103
+ raise CommandError(f"Failed to run pip under {interpreter}: {exc}")
104
+ sys.exit(returncode)
105
+
106
+ # --version
107
+ if general_options.version:
108
+ sys.stdout.write(parser.version)
109
+ sys.stdout.write(os.linesep)
110
+ sys.exit()
111
+
112
+ # pip || pip help -> print_help()
113
+ if not args_else or (args_else[0] == "help" and len(args_else) == 1):
114
+ parser.print_help()
115
+ sys.exit()
116
+
117
+ # the subcommand name
118
+ cmd_name = args_else[0]
119
+
120
+ if cmd_name not in commands_dict:
121
+ guess = get_similar_commands(cmd_name)
122
+
123
+ msg = [f'unknown command "{cmd_name}"']
124
+ if guess:
125
+ msg.append(f'maybe you meant "{guess}"')
126
+
127
+ raise CommandError(" - ".join(msg))
128
+
129
+ # all the args without the subcommand
130
+ cmd_args = args[:]
131
+ cmd_args.remove(cmd_name)
132
+
133
+ return cmd_name, cmd_args
.venv/Lib/site-packages/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, NoReturn, Optional, 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: Optional[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: Optional[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
+ f"{val} is not a valid value for {key} option, "
233
+ "please specify a boolean value like yes/no, "
234
+ "true/false or 1/0 instead."
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
+ f"{val} is not a valid value for {key} 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."
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) -> NoReturn:
293
+ self.print_usage(sys.stderr)
294
+ self.exit(UNKNOWN_ERROR, f"{msg}\n")
.venv/Lib/site-packages/pip/_internal/cli/progress_bars.py ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import functools
2
+ import sys
3
+ from typing import Callable, Generator, Iterable, Iterator, Optional, Tuple, TypeVar
4
+
5
+ from pip._vendor.rich.progress import (
6
+ BarColumn,
7
+ DownloadColumn,
8
+ FileSizeColumn,
9
+ MofNCompleteColumn,
10
+ Progress,
11
+ ProgressColumn,
12
+ SpinnerColumn,
13
+ TextColumn,
14
+ TimeElapsedColumn,
15
+ TimeRemainingColumn,
16
+ TransferSpeedColumn,
17
+ )
18
+
19
+ from pip._internal.cli.spinners import RateLimiter
20
+ from pip._internal.req.req_install import InstallRequirement
21
+ from pip._internal.utils.logging import get_console, get_indentation
22
+
23
+ T = TypeVar("T")
24
+ ProgressRenderer = Callable[[Iterable[T]], Iterator[T]]
25
+
26
+
27
+ def _rich_download_progress_bar(
28
+ iterable: Iterable[bytes],
29
+ *,
30
+ bar_type: str,
31
+ size: Optional[int],
32
+ initial_progress: Optional[int] = None,
33
+ ) -> Generator[bytes, None, None]:
34
+ assert bar_type == "on", "This should only be used in the default mode."
35
+
36
+ if not size:
37
+ total = float("inf")
38
+ columns: Tuple[ProgressColumn, ...] = (
39
+ TextColumn("[progress.description]{task.description}"),
40
+ SpinnerColumn("line", speed=1.5),
41
+ FileSizeColumn(),
42
+ TransferSpeedColumn(),
43
+ TimeElapsedColumn(),
44
+ )
45
+ else:
46
+ total = size
47
+ columns = (
48
+ TextColumn("[progress.description]{task.description}"),
49
+ BarColumn(),
50
+ DownloadColumn(),
51
+ TransferSpeedColumn(),
52
+ TextColumn("eta"),
53
+ TimeRemainingColumn(),
54
+ )
55
+
56
+ progress = Progress(*columns, refresh_per_second=5)
57
+ task_id = progress.add_task(" " * (get_indentation() + 2), total=total)
58
+ if initial_progress is not None:
59
+ progress.update(task_id, advance=initial_progress)
60
+ with progress:
61
+ for chunk in iterable:
62
+ yield chunk
63
+ progress.update(task_id, advance=len(chunk))
64
+
65
+
66
+ def _rich_install_progress_bar(
67
+ iterable: Iterable[InstallRequirement], *, total: int
68
+ ) -> Iterator[InstallRequirement]:
69
+ columns = (
70
+ TextColumn("{task.fields[indent]}"),
71
+ BarColumn(),
72
+ MofNCompleteColumn(),
73
+ TextColumn("{task.description}"),
74
+ )
75
+ console = get_console()
76
+
77
+ bar = Progress(*columns, refresh_per_second=6, console=console, transient=True)
78
+ # Hiding the progress bar at initialization forces a refresh cycle to occur
79
+ # until the bar appears, avoiding very short flashes.
80
+ task = bar.add_task("", total=total, indent=" " * get_indentation(), visible=False)
81
+ with bar:
82
+ for req in iterable:
83
+ bar.update(task, description=rf"\[{req.name}]", visible=True)
84
+ yield req
85
+ bar.advance(task)
86
+
87
+
88
+ def _raw_progress_bar(
89
+ iterable: Iterable[bytes],
90
+ *,
91
+ size: Optional[int],
92
+ initial_progress: Optional[int] = None,
93
+ ) -> Generator[bytes, None, None]:
94
+ def write_progress(current: int, total: int) -> None:
95
+ sys.stdout.write(f"Progress {current} of {total}\n")
96
+ sys.stdout.flush()
97
+
98
+ current = initial_progress or 0
99
+ total = size or 0
100
+ rate_limiter = RateLimiter(0.25)
101
+
102
+ write_progress(current, total)
103
+ for chunk in iterable:
104
+ current += len(chunk)
105
+ if rate_limiter.ready() or current == total:
106
+ write_progress(current, total)
107
+ rate_limiter.reset()
108
+ yield chunk
109
+
110
+
111
+ def get_download_progress_renderer(
112
+ *, bar_type: str, size: Optional[int] = None, initial_progress: Optional[int] = None
113
+ ) -> ProgressRenderer[bytes]:
114
+ """Get an object that can be used to render the download progress.
115
+
116
+ Returns a callable, that takes an iterable to "wrap".
117
+ """
118
+ if bar_type == "on":
119
+ return functools.partial(
120
+ _rich_download_progress_bar,
121
+ bar_type=bar_type,
122
+ size=size,
123
+ initial_progress=initial_progress,
124
+ )
125
+ elif bar_type == "raw":
126
+ return functools.partial(
127
+ _raw_progress_bar,
128
+ size=size,
129
+ initial_progress=initial_progress,
130
+ )
131
+ else:
132
+ return iter # no-op, when passed an iterator
133
+
134
+
135
+ def get_install_progress_renderer(
136
+ *, bar_type: str, total: int
137
+ ) -> ProgressRenderer[InstallRequirement]:
138
+ """Get an object that can be used to render the install progress.
139
+ Returns a callable, that takes an iterable to "wrap".
140
+ """
141
+ if bar_type == "on":
142
+ return functools.partial(_rich_install_progress_bar, total=total)
143
+ else:
144
+ return iter
.venv/Lib/site-packages/pip/_internal/cli/req_command.py ADDED
@@ -0,0 +1,347 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Contains the RequirementCommand base class.
2
+
3
+ This class is in a separate module so the commands that do not always
4
+ need PackageFinder capability don't unnecessarily import the
5
+ PackageFinder machinery and all its vendored dependencies, etc.
6
+ """
7
+
8
+ import logging
9
+ from functools import partial
10
+ from optparse import Values
11
+ from typing import Any, List, Optional, Tuple
12
+
13
+ from pip._internal.cache import WheelCache
14
+ from pip._internal.cli import cmdoptions
15
+ from pip._internal.cli.index_command import IndexGroupCommand
16
+ from pip._internal.cli.index_command import SessionCommandMixin as SessionCommandMixin
17
+ from pip._internal.exceptions import CommandError, PreviousBuildDirError
18
+ from pip._internal.index.collector import LinkCollector
19
+ from pip._internal.index.package_finder import PackageFinder
20
+ from pip._internal.models.selection_prefs import SelectionPreferences
21
+ from pip._internal.models.target_python import TargetPython
22
+ from pip._internal.network.session import PipSession
23
+ from pip._internal.operations.build.build_tracker import BuildTracker
24
+ from pip._internal.operations.prepare import RequirementPreparer
25
+ from pip._internal.req.constructors import (
26
+ install_req_from_editable,
27
+ install_req_from_line,
28
+ install_req_from_parsed_requirement,
29
+ install_req_from_req_string,
30
+ )
31
+ from pip._internal.req.req_dependency_group import parse_dependency_groups
32
+ from pip._internal.req.req_file import parse_requirements
33
+ from pip._internal.req.req_install import InstallRequirement
34
+ from pip._internal.resolution.base import BaseResolver
35
+ from pip._internal.utils.temp_dir import (
36
+ TempDirectory,
37
+ TempDirectoryTypeRegistry,
38
+ tempdir_kinds,
39
+ )
40
+
41
+ logger = logging.getLogger(__name__)
42
+
43
+
44
+ KEEPABLE_TEMPDIR_TYPES = [
45
+ tempdir_kinds.BUILD_ENV,
46
+ tempdir_kinds.EPHEM_WHEEL_CACHE,
47
+ tempdir_kinds.REQ_BUILD,
48
+ ]
49
+
50
+
51
+ def with_cleanup(func: Any) -> Any:
52
+ """Decorator for common logic related to managing temporary
53
+ directories.
54
+ """
55
+
56
+ def configure_tempdir_registry(registry: TempDirectoryTypeRegistry) -> None:
57
+ for t in KEEPABLE_TEMPDIR_TYPES:
58
+ registry.set_delete(t, False)
59
+
60
+ def wrapper(
61
+ self: RequirementCommand, options: Values, args: List[Any]
62
+ ) -> Optional[int]:
63
+ assert self.tempdir_registry is not None
64
+ if options.no_clean:
65
+ configure_tempdir_registry(self.tempdir_registry)
66
+
67
+ try:
68
+ return func(self, options, args)
69
+ except PreviousBuildDirError:
70
+ # This kind of conflict can occur when the user passes an explicit
71
+ # build directory with a pre-existing folder. In that case we do
72
+ # not want to accidentally remove it.
73
+ configure_tempdir_registry(self.tempdir_registry)
74
+ raise
75
+
76
+ return wrapper
77
+
78
+
79
+ class RequirementCommand(IndexGroupCommand):
80
+ def __init__(self, *args: Any, **kw: Any) -> None:
81
+ super().__init__(*args, **kw)
82
+
83
+ self.cmd_opts.add_option(cmdoptions.dependency_groups())
84
+ self.cmd_opts.add_option(cmdoptions.no_clean())
85
+
86
+ @staticmethod
87
+ def determine_resolver_variant(options: Values) -> str:
88
+ """Determines which resolver should be used, based on the given options."""
89
+ if "legacy-resolver" in options.deprecated_features_enabled:
90
+ return "legacy"
91
+
92
+ return "resolvelib"
93
+
94
+ @classmethod
95
+ def make_requirement_preparer(
96
+ cls,
97
+ temp_build_dir: TempDirectory,
98
+ options: Values,
99
+ build_tracker: BuildTracker,
100
+ session: PipSession,
101
+ finder: PackageFinder,
102
+ use_user_site: bool,
103
+ download_dir: Optional[str] = None,
104
+ verbosity: int = 0,
105
+ ) -> RequirementPreparer:
106
+ """
107
+ Create a RequirementPreparer instance for the given parameters.
108
+ """
109
+ temp_build_dir_path = temp_build_dir.path
110
+ assert temp_build_dir_path is not None
111
+ legacy_resolver = False
112
+
113
+ resolver_variant = cls.determine_resolver_variant(options)
114
+ if resolver_variant == "resolvelib":
115
+ lazy_wheel = "fast-deps" in options.features_enabled
116
+ if lazy_wheel:
117
+ logger.warning(
118
+ "pip is using lazily downloaded wheels using HTTP "
119
+ "range requests to obtain dependency information. "
120
+ "This experimental feature is enabled through "
121
+ "--use-feature=fast-deps and it is not ready for "
122
+ "production."
123
+ )
124
+ else:
125
+ legacy_resolver = True
126
+ lazy_wheel = False
127
+ if "fast-deps" in options.features_enabled:
128
+ logger.warning(
129
+ "fast-deps has no effect when used with the legacy resolver."
130
+ )
131
+
132
+ return RequirementPreparer(
133
+ build_dir=temp_build_dir_path,
134
+ src_dir=options.src_dir,
135
+ download_dir=download_dir,
136
+ build_isolation=options.build_isolation,
137
+ check_build_deps=options.check_build_deps,
138
+ build_tracker=build_tracker,
139
+ session=session,
140
+ progress_bar=options.progress_bar,
141
+ finder=finder,
142
+ require_hashes=options.require_hashes,
143
+ use_user_site=use_user_site,
144
+ lazy_wheel=lazy_wheel,
145
+ verbosity=verbosity,
146
+ legacy_resolver=legacy_resolver,
147
+ resume_retries=options.resume_retries,
148
+ )
149
+
150
+ @classmethod
151
+ def make_resolver(
152
+ cls,
153
+ preparer: RequirementPreparer,
154
+ finder: PackageFinder,
155
+ options: Values,
156
+ wheel_cache: Optional[WheelCache] = None,
157
+ use_user_site: bool = False,
158
+ ignore_installed: bool = True,
159
+ ignore_requires_python: bool = False,
160
+ force_reinstall: bool = False,
161
+ upgrade_strategy: str = "to-satisfy-only",
162
+ use_pep517: Optional[bool] = None,
163
+ py_version_info: Optional[Tuple[int, ...]] = None,
164
+ ) -> BaseResolver:
165
+ """
166
+ Create a Resolver instance for the given parameters.
167
+ """
168
+ make_install_req = partial(
169
+ install_req_from_req_string,
170
+ isolated=options.isolated_mode,
171
+ use_pep517=use_pep517,
172
+ )
173
+ resolver_variant = cls.determine_resolver_variant(options)
174
+ # The long import name and duplicated invocation is needed to convince
175
+ # Mypy into correctly typechecking. Otherwise it would complain the
176
+ # "Resolver" class being redefined.
177
+ if resolver_variant == "resolvelib":
178
+ import pip._internal.resolution.resolvelib.resolver
179
+
180
+ return pip._internal.resolution.resolvelib.resolver.Resolver(
181
+ preparer=preparer,
182
+ finder=finder,
183
+ wheel_cache=wheel_cache,
184
+ make_install_req=make_install_req,
185
+ use_user_site=use_user_site,
186
+ ignore_dependencies=options.ignore_dependencies,
187
+ ignore_installed=ignore_installed,
188
+ ignore_requires_python=ignore_requires_python,
189
+ force_reinstall=force_reinstall,
190
+ upgrade_strategy=upgrade_strategy,
191
+ py_version_info=py_version_info,
192
+ )
193
+ import pip._internal.resolution.legacy.resolver
194
+
195
+ return pip._internal.resolution.legacy.resolver.Resolver(
196
+ preparer=preparer,
197
+ finder=finder,
198
+ wheel_cache=wheel_cache,
199
+ make_install_req=make_install_req,
200
+ use_user_site=use_user_site,
201
+ ignore_dependencies=options.ignore_dependencies,
202
+ ignore_installed=ignore_installed,
203
+ ignore_requires_python=ignore_requires_python,
204
+ force_reinstall=force_reinstall,
205
+ upgrade_strategy=upgrade_strategy,
206
+ py_version_info=py_version_info,
207
+ )
208
+
209
+ def get_requirements(
210
+ self,
211
+ args: List[str],
212
+ options: Values,
213
+ finder: PackageFinder,
214
+ session: PipSession,
215
+ ) -> List[InstallRequirement]:
216
+ """
217
+ Parse command-line arguments into the corresponding requirements.
218
+ """
219
+ requirements: List[InstallRequirement] = []
220
+ for filename in options.constraints:
221
+ for parsed_req in parse_requirements(
222
+ filename,
223
+ constraint=True,
224
+ finder=finder,
225
+ options=options,
226
+ session=session,
227
+ ):
228
+ req_to_add = install_req_from_parsed_requirement(
229
+ parsed_req,
230
+ isolated=options.isolated_mode,
231
+ user_supplied=False,
232
+ )
233
+ requirements.append(req_to_add)
234
+
235
+ for req in args:
236
+ req_to_add = install_req_from_line(
237
+ req,
238
+ comes_from=None,
239
+ isolated=options.isolated_mode,
240
+ use_pep517=options.use_pep517,
241
+ user_supplied=True,
242
+ config_settings=getattr(options, "config_settings", None),
243
+ )
244
+ requirements.append(req_to_add)
245
+
246
+ if options.dependency_groups:
247
+ for req in parse_dependency_groups(options.dependency_groups):
248
+ req_to_add = install_req_from_req_string(
249
+ req,
250
+ isolated=options.isolated_mode,
251
+ use_pep517=options.use_pep517,
252
+ user_supplied=True,
253
+ )
254
+ requirements.append(req_to_add)
255
+
256
+ for req in options.editables:
257
+ req_to_add = install_req_from_editable(
258
+ req,
259
+ user_supplied=True,
260
+ isolated=options.isolated_mode,
261
+ use_pep517=options.use_pep517,
262
+ config_settings=getattr(options, "config_settings", None),
263
+ )
264
+ requirements.append(req_to_add)
265
+
266
+ # NOTE: options.require_hashes may be set if --require-hashes is True
267
+ for filename in options.requirements:
268
+ for parsed_req in parse_requirements(
269
+ filename, finder=finder, options=options, session=session
270
+ ):
271
+ req_to_add = install_req_from_parsed_requirement(
272
+ parsed_req,
273
+ isolated=options.isolated_mode,
274
+ use_pep517=options.use_pep517,
275
+ user_supplied=True,
276
+ config_settings=(
277
+ parsed_req.options.get("config_settings")
278
+ if parsed_req.options
279
+ else None
280
+ ),
281
+ )
282
+ requirements.append(req_to_add)
283
+
284
+ # If any requirement has hash options, enable hash checking.
285
+ if any(req.has_hash_options for req in requirements):
286
+ options.require_hashes = True
287
+
288
+ if not (
289
+ args
290
+ or options.editables
291
+ or options.requirements
292
+ or options.dependency_groups
293
+ ):
294
+ opts = {"name": self.name}
295
+ if options.find_links:
296
+ raise CommandError(
297
+ "You must give at least one requirement to {name} "
298
+ '(maybe you meant "pip {name} {links}"?)'.format(
299
+ **dict(opts, links=" ".join(options.find_links))
300
+ )
301
+ )
302
+ else:
303
+ raise CommandError(
304
+ "You must give at least one requirement to {name} "
305
+ '(see "pip help {name}")'.format(**opts)
306
+ )
307
+
308
+ return requirements
309
+
310
+ @staticmethod
311
+ def trace_basic_info(finder: PackageFinder) -> None:
312
+ """
313
+ Trace basic information about the provided objects.
314
+ """
315
+ # Display where finder is looking for packages
316
+ search_scope = finder.search_scope
317
+ locations = search_scope.get_formatted_locations()
318
+ if locations:
319
+ logger.info(locations)
320
+
321
+ def _build_package_finder(
322
+ self,
323
+ options: Values,
324
+ session: PipSession,
325
+ target_python: Optional[TargetPython] = None,
326
+ ignore_requires_python: Optional[bool] = None,
327
+ ) -> PackageFinder:
328
+ """
329
+ Create a package finder appropriate to this requirement command.
330
+
331
+ :param ignore_requires_python: Whether to ignore incompatible
332
+ "Requires-Python" values in links. Defaults to False.
333
+ """
334
+ link_collector = LinkCollector.create(session, options=options)
335
+ selection_prefs = SelectionPreferences(
336
+ allow_yanked=True,
337
+ format_control=options.format_control,
338
+ allow_all_prereleases=options.pre,
339
+ prefer_binary=options.prefer_binary,
340
+ ignore_requires_python=ignore_requires_python,
341
+ )
342
+
343
+ return PackageFinder.create(
344
+ link_collector=link_collector,
345
+ selection_prefs=selection_prefs,
346
+ target_python=target_python,
347
+ )
.venv/Lib/site-packages/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)
.venv/Lib/site-packages/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
.venv/Lib/site-packages/pip/_internal/commands/__init__.py ADDED
@@ -0,0 +1,137 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ "lock": CommandInfo(
27
+ "pip._internal.commands.lock",
28
+ "LockCommand",
29
+ "Generate a lock file.",
30
+ ),
31
+ "download": CommandInfo(
32
+ "pip._internal.commands.download",
33
+ "DownloadCommand",
34
+ "Download packages.",
35
+ ),
36
+ "uninstall": CommandInfo(
37
+ "pip._internal.commands.uninstall",
38
+ "UninstallCommand",
39
+ "Uninstall packages.",
40
+ ),
41
+ "freeze": CommandInfo(
42
+ "pip._internal.commands.freeze",
43
+ "FreezeCommand",
44
+ "Output installed packages in requirements format.",
45
+ ),
46
+ "inspect": CommandInfo(
47
+ "pip._internal.commands.inspect",
48
+ "InspectCommand",
49
+ "Inspect the python environment.",
50
+ ),
51
+ "list": CommandInfo(
52
+ "pip._internal.commands.list",
53
+ "ListCommand",
54
+ "List installed packages.",
55
+ ),
56
+ "show": CommandInfo(
57
+ "pip._internal.commands.show",
58
+ "ShowCommand",
59
+ "Show information about installed packages.",
60
+ ),
61
+ "check": CommandInfo(
62
+ "pip._internal.commands.check",
63
+ "CheckCommand",
64
+ "Verify installed packages have compatible dependencies.",
65
+ ),
66
+ "config": CommandInfo(
67
+ "pip._internal.commands.configuration",
68
+ "ConfigurationCommand",
69
+ "Manage local and global configuration.",
70
+ ),
71
+ "search": CommandInfo(
72
+ "pip._internal.commands.search",
73
+ "SearchCommand",
74
+ "Search PyPI for packages.",
75
+ ),
76
+ "cache": CommandInfo(
77
+ "pip._internal.commands.cache",
78
+ "CacheCommand",
79
+ "Inspect and manage pip's wheel cache.",
80
+ ),
81
+ "index": CommandInfo(
82
+ "pip._internal.commands.index",
83
+ "IndexCommand",
84
+ "Inspect information available from package indexes.",
85
+ ),
86
+ "wheel": CommandInfo(
87
+ "pip._internal.commands.wheel",
88
+ "WheelCommand",
89
+ "Build wheels from your requirements.",
90
+ ),
91
+ "hash": CommandInfo(
92
+ "pip._internal.commands.hash",
93
+ "HashCommand",
94
+ "Compute hashes of package archives.",
95
+ ),
96
+ "completion": CommandInfo(
97
+ "pip._internal.commands.completion",
98
+ "CompletionCommand",
99
+ "A helper command used for command completion.",
100
+ ),
101
+ "debug": CommandInfo(
102
+ "pip._internal.commands.debug",
103
+ "DebugCommand",
104
+ "Show information useful for debugging.",
105
+ ),
106
+ "help": CommandInfo(
107
+ "pip._internal.commands.help",
108
+ "HelpCommand",
109
+ "Show help for commands.",
110
+ ),
111
+ }
112
+
113
+
114
+ def create_command(name: str, **kwargs: Any) -> Command:
115
+ """
116
+ Create an instance of the Command class with the given name.
117
+ """
118
+ module_path, class_name, summary = commands_dict[name]
119
+ module = importlib.import_module(module_path)
120
+ command_class = getattr(module, class_name)
121
+ command = command_class(name=name, summary=summary, **kwargs)
122
+
123
+ return command
124
+
125
+
126
+ def get_similar_commands(name: str) -> Optional[str]:
127
+ """Command name auto-correct."""
128
+ from difflib import get_close_matches
129
+
130
+ name = name.lower()
131
+
132
+ close_commands = get_close_matches(name, commands_dict.keys())
133
+
134
+ if close_commands:
135
+ return close_commands[0]
136
+ else:
137
+ return None
.venv/Lib/site-packages/pip/_internal/commands/cache.py ADDED
@@ -0,0 +1,228 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ from pip._internal.utils.misc import format_size
12
+
13
+ logger = getLogger(__name__)
14
+
15
+
16
+ class CacheCommand(Command):
17
+ """
18
+ Inspect and manage pip's wheel cache.
19
+
20
+ Subcommands:
21
+
22
+ - dir: Show the cache directory.
23
+ - info: Show information about the cache.
24
+ - list: List filenames of packages stored in the cache.
25
+ - remove: Remove one or more package from the cache.
26
+ - purge: Remove all items from the cache.
27
+
28
+ ``<pattern>`` can be a glob expression or a package name.
29
+ """
30
+
31
+ ignore_require_venv = True
32
+ usage = """
33
+ %prog dir
34
+ %prog info
35
+ %prog list [<pattern>] [--format=[human, abspath]]
36
+ %prog remove <pattern>
37
+ %prog purge
38
+ """
39
+
40
+ def add_options(self) -> None:
41
+ self.cmd_opts.add_option(
42
+ "--format",
43
+ action="store",
44
+ dest="list_format",
45
+ default="human",
46
+ choices=("human", "abspath"),
47
+ help="Select the output format among: human (default) or abspath",
48
+ )
49
+
50
+ self.parser.insert_option_group(0, self.cmd_opts)
51
+
52
+ def run(self, options: Values, args: List[str]) -> int:
53
+ handlers = {
54
+ "dir": self.get_cache_dir,
55
+ "info": self.get_cache_info,
56
+ "list": self.list_cache_items,
57
+ "remove": self.remove_cache_items,
58
+ "purge": self.purge_cache,
59
+ }
60
+
61
+ if not options.cache_dir:
62
+ logger.error("pip cache commands can not function since cache is disabled.")
63
+ return ERROR
64
+
65
+ # Determine action
66
+ if not args or args[0] not in handlers:
67
+ logger.error(
68
+ "Need an action (%s) to perform.",
69
+ ", ".join(sorted(handlers)),
70
+ )
71
+ return ERROR
72
+
73
+ action = args[0]
74
+
75
+ # Error handling happens here, not in the action-handlers.
76
+ try:
77
+ handlers[action](options, args[1:])
78
+ except PipError as e:
79
+ logger.error(e.args[0])
80
+ return ERROR
81
+
82
+ return SUCCESS
83
+
84
+ def get_cache_dir(self, options: Values, args: List[Any]) -> None:
85
+ if args:
86
+ raise CommandError("Too many arguments")
87
+
88
+ logger.info(options.cache_dir)
89
+
90
+ def get_cache_info(self, options: Values, args: List[Any]) -> None:
91
+ if args:
92
+ raise CommandError("Too many arguments")
93
+
94
+ num_http_files = len(self._find_http_files(options))
95
+ num_packages = len(self._find_wheels(options, "*"))
96
+
97
+ http_cache_location = self._cache_dir(options, "http-v2")
98
+ old_http_cache_location = self._cache_dir(options, "http")
99
+ wheels_cache_location = self._cache_dir(options, "wheels")
100
+ http_cache_size = filesystem.format_size(
101
+ filesystem.directory_size(http_cache_location)
102
+ + filesystem.directory_size(old_http_cache_location)
103
+ )
104
+ wheels_cache_size = filesystem.format_directory_size(wheels_cache_location)
105
+
106
+ message = (
107
+ textwrap.dedent(
108
+ """
109
+ Package index page cache location (pip v23.3+): {http_cache_location}
110
+ Package index page cache location (older pips): {old_http_cache_location}
111
+ Package index page cache size: {http_cache_size}
112
+ Number of HTTP files: {num_http_files}
113
+ Locally built wheels location: {wheels_cache_location}
114
+ Locally built wheels size: {wheels_cache_size}
115
+ Number of locally built wheels: {package_count}
116
+ """ # noqa: E501
117
+ )
118
+ .format(
119
+ http_cache_location=http_cache_location,
120
+ old_http_cache_location=old_http_cache_location,
121
+ http_cache_size=http_cache_size,
122
+ num_http_files=num_http_files,
123
+ wheels_cache_location=wheels_cache_location,
124
+ package_count=num_packages,
125
+ wheels_cache_size=wheels_cache_size,
126
+ )
127
+ .strip()
128
+ )
129
+
130
+ logger.info(message)
131
+
132
+ def list_cache_items(self, options: Values, args: List[Any]) -> None:
133
+ if len(args) > 1:
134
+ raise CommandError("Too many arguments")
135
+
136
+ if args:
137
+ pattern = args[0]
138
+ else:
139
+ pattern = "*"
140
+
141
+ files = self._find_wheels(options, pattern)
142
+ if options.list_format == "human":
143
+ self.format_for_human(files)
144
+ else:
145
+ self.format_for_abspath(files)
146
+
147
+ def format_for_human(self, files: List[str]) -> None:
148
+ if not files:
149
+ logger.info("No locally built wheels cached.")
150
+ return
151
+
152
+ results = []
153
+ for filename in files:
154
+ wheel = os.path.basename(filename)
155
+ size = filesystem.format_file_size(filename)
156
+ results.append(f" - {wheel} ({size})")
157
+ logger.info("Cache contents:\n")
158
+ logger.info("\n".join(sorted(results)))
159
+
160
+ def format_for_abspath(self, files: List[str]) -> None:
161
+ if files:
162
+ logger.info("\n".join(sorted(files)))
163
+
164
+ def remove_cache_items(self, options: Values, args: List[Any]) -> None:
165
+ if len(args) > 1:
166
+ raise CommandError("Too many arguments")
167
+
168
+ if not args:
169
+ raise CommandError("Please provide a pattern")
170
+
171
+ files = self._find_wheels(options, args[0])
172
+
173
+ no_matching_msg = "No matching packages"
174
+ if args[0] == "*":
175
+ # Only fetch http files if no specific pattern given
176
+ files += self._find_http_files(options)
177
+ else:
178
+ # Add the pattern to the log message
179
+ no_matching_msg += f' for pattern "{args[0]}"'
180
+
181
+ if not files:
182
+ logger.warning(no_matching_msg)
183
+
184
+ bytes_removed = 0
185
+ for filename in files:
186
+ bytes_removed += os.stat(filename).st_size
187
+ os.unlink(filename)
188
+ logger.verbose("Removed %s", filename)
189
+ logger.info("Files removed: %s (%s)", len(files), format_size(bytes_removed))
190
+
191
+ def purge_cache(self, options: Values, args: List[Any]) -> None:
192
+ if args:
193
+ raise CommandError("Too many arguments")
194
+
195
+ return self.remove_cache_items(options, ["*"])
196
+
197
+ def _cache_dir(self, options: Values, subdir: str) -> str:
198
+ return os.path.join(options.cache_dir, subdir)
199
+
200
+ def _find_http_files(self, options: Values) -> List[str]:
201
+ old_http_dir = self._cache_dir(options, "http")
202
+ new_http_dir = self._cache_dir(options, "http-v2")
203
+ return filesystem.find_files(old_http_dir, "*") + filesystem.find_files(
204
+ new_http_dir, "*"
205
+ )
206
+
207
+ def _find_wheels(self, options: Values, pattern: str) -> List[str]:
208
+ wheel_dir = self._cache_dir(options, "wheels")
209
+
210
+ # The wheel filename format, as specified in PEP 427, is:
211
+ # {distribution}-{version}(-{build})?-{python}-{abi}-{platform}.whl
212
+ #
213
+ # Additionally, non-alphanumeric values in the distribution are
214
+ # normalized to underscores (_), meaning hyphens can never occur
215
+ # before `-{version}`.
216
+ #
217
+ # Given that information:
218
+ # - If the pattern we're given contains a hyphen (-), the user is
219
+ # providing at least the version. Thus, we can just append `*.whl`
220
+ # to match the rest of it.
221
+ # - If the pattern we're given doesn't contain a hyphen (-), the
222
+ # user is only providing the name. Thus, we append `-*.whl` to
223
+ # match the hyphen before the version, followed by anything else.
224
+ #
225
+ # PEP 427: https://www.python.org/dev/peps/pep-0427/
226
+ pattern = pattern + ("*.whl" if "-" in pattern else "-*.whl")
227
+
228
+ return filesystem.find_files(wheel_dir, pattern)
.venv/Lib/site-packages/pip/_internal/commands/check.py ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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.metadata import get_default_environment
8
+ from pip._internal.operations.check import (
9
+ check_package_set,
10
+ check_unsupported,
11
+ create_package_set_from_installed,
12
+ )
13
+ from pip._internal.utils.compatibility_tags import get_supported
14
+ from pip._internal.utils.misc import write_output
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+
19
+ class CheckCommand(Command):
20
+ """Verify installed packages have compatible dependencies."""
21
+
22
+ ignore_require_venv = True
23
+ usage = """
24
+ %prog [options]"""
25
+
26
+ def run(self, options: Values, args: List[str]) -> int:
27
+ package_set, parsing_probs = create_package_set_from_installed()
28
+ missing, conflicting = check_package_set(package_set)
29
+ unsupported = list(
30
+ check_unsupported(
31
+ get_default_environment().iter_installed_distributions(),
32
+ get_supported(),
33
+ )
34
+ )
35
+
36
+ for project_name in missing:
37
+ version = package_set[project_name].version
38
+ for dependency in missing[project_name]:
39
+ write_output(
40
+ "%s %s requires %s, which is not installed.",
41
+ project_name,
42
+ version,
43
+ dependency[0],
44
+ )
45
+
46
+ for project_name in conflicting:
47
+ version = package_set[project_name].version
48
+ for dep_name, dep_version, req in conflicting[project_name]:
49
+ write_output(
50
+ "%s %s has requirement %s, but you have %s %s.",
51
+ project_name,
52
+ version,
53
+ req,
54
+ dep_name,
55
+ dep_version,
56
+ )
57
+ for package in unsupported:
58
+ write_output(
59
+ "%s %s is not supported on this platform",
60
+ package.raw_name,
61
+ package.version,
62
+ )
63
+ if missing or conflicting or parsing_probs or unsupported:
64
+ return ERROR
65
+ else:
66
+ write_output("No broken requirements found.")
67
+ return SUCCESS
.venv/Lib/site-packages/pip/_internal/commands/completion.py ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 \\
42
+ (commandline --current-process --tokenize --cut-at-cursor) \\
43
+ (commandline --current-token --cut-at-cursor)
44
+ set -lx COMP_CWORD (math (count $COMP_WORDS) - 1)
45
+ set -lx PIP_AUTO_COMPLETE 1
46
+ set -l completions
47
+ if string match -q '2.*' $version
48
+ set completions (eval $COMP_WORDS[1])
49
+ else
50
+ set completions ($COMP_WORDS[1])
51
+ end
52
+ string split \\ -- $completions
53
+ end
54
+ complete -fa "(__fish_complete_pip)" -c {prog}
55
+ """,
56
+ "powershell": """
57
+ if ((Test-Path Function:\\TabExpansion) -and -not `
58
+ (Test-Path Function:\\_pip_completeBackup)) {{
59
+ Rename-Item Function:\\TabExpansion _pip_completeBackup
60
+ }}
61
+ function TabExpansion($line, $lastWord) {{
62
+ $lastBlock = [regex]::Split($line, '[|;]')[-1].TrimStart()
63
+ if ($lastBlock.StartsWith("{prog} ")) {{
64
+ $Env:COMP_WORDS=$lastBlock
65
+ $Env:COMP_CWORD=$lastBlock.Split().Length - 1
66
+ $Env:PIP_AUTO_COMPLETE=1
67
+ (& {prog}).Split()
68
+ Remove-Item Env:COMP_WORDS
69
+ Remove-Item Env:COMP_CWORD
70
+ Remove-Item Env:PIP_AUTO_COMPLETE
71
+ }}
72
+ elseif (Test-Path Function:\\_pip_completeBackup) {{
73
+ # Fall back on existing tab expansion
74
+ _pip_completeBackup $line $lastWord
75
+ }}
76
+ }}
77
+ """,
78
+ }
79
+
80
+
81
+ class CompletionCommand(Command):
82
+ """A helper command to be used for command completion."""
83
+
84
+ ignore_require_venv = True
85
+
86
+ def add_options(self) -> None:
87
+ self.cmd_opts.add_option(
88
+ "--bash",
89
+ "-b",
90
+ action="store_const",
91
+ const="bash",
92
+ dest="shell",
93
+ help="Emit completion code for bash",
94
+ )
95
+ self.cmd_opts.add_option(
96
+ "--zsh",
97
+ "-z",
98
+ action="store_const",
99
+ const="zsh",
100
+ dest="shell",
101
+ help="Emit completion code for zsh",
102
+ )
103
+ self.cmd_opts.add_option(
104
+ "--fish",
105
+ "-f",
106
+ action="store_const",
107
+ const="fish",
108
+ dest="shell",
109
+ help="Emit completion code for fish",
110
+ )
111
+ self.cmd_opts.add_option(
112
+ "--powershell",
113
+ "-p",
114
+ action="store_const",
115
+ const="powershell",
116
+ dest="shell",
117
+ help="Emit completion code for powershell",
118
+ )
119
+
120
+ self.parser.insert_option_group(0, self.cmd_opts)
121
+
122
+ def run(self, options: Values, args: List[str]) -> int:
123
+ """Prints the completion code of the given shell"""
124
+ shells = COMPLETION_SCRIPTS.keys()
125
+ shell_options = ["--" + shell for shell in sorted(shells)]
126
+ if options.shell in shells:
127
+ script = textwrap.dedent(
128
+ COMPLETION_SCRIPTS.get(options.shell, "").format(prog=get_prog())
129
+ )
130
+ print(BASE_COMPLETION.format(script=script, shell=options.shell))
131
+ return SUCCESS
132
+ else:
133
+ sys.stderr.write(
134
+ "ERROR: You must pass {}\n".format(" or ".join(shell_options))
135
+ )
136
+ return SUCCESS
.venv/Lib/site-packages/pip/_internal/commands/configuration.py ADDED
@@ -0,0 +1,280 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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(f"Editor Subprocess exited with exit code {e.returncode}")
246
+
247
+ def _get_n_args(self, args: List[str], example: str, n: int) -> Any:
248
+ """Helper to make sure the command got the right number of arguments"""
249
+ if len(args) != n:
250
+ msg = (
251
+ f"Got unexpected number of arguments, expected {n}. "
252
+ f'(example: "{get_prog()} config {example}")'
253
+ )
254
+ raise PipError(msg)
255
+
256
+ if n == 1:
257
+ return args[0]
258
+ else:
259
+ return args
260
+
261
+ def _save_configuration(self) -> None:
262
+ # We successfully ran a modifying command. Need to save the
263
+ # configuration.
264
+ try:
265
+ self.configuration.save()
266
+ except Exception:
267
+ logger.exception(
268
+ "Unable to save configuration. Please report this as a bug."
269
+ )
270
+ raise PipError("Internal Error.")
271
+
272
+ def _determine_editor(self, options: Values) -> str:
273
+ if options.editor is not None:
274
+ return options.editor
275
+ elif "VISUAL" in os.environ:
276
+ return os.environ["VISUAL"]
277
+ elif "EDITOR" in os.environ:
278
+ return os.environ["EDITOR"]
279
+ else:
280
+ raise PipError("Could not determine editor to use.")
.venv/Lib/site-packages/pip/_internal/commands/debug.py ADDED
@@ -0,0 +1,201 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import locale
2
+ import logging
3
+ import os
4
+ import sys
5
+ from optparse import Values
6
+ from types import ModuleType
7
+ from typing import Any, Dict, List, Optional
8
+
9
+ import pip._vendor
10
+ from pip._vendor.certifi import where
11
+ from pip._vendor.packaging.version import parse as parse_version
12
+
13
+ from pip._internal.cli import cmdoptions
14
+ from pip._internal.cli.base_command import Command
15
+ from pip._internal.cli.cmdoptions import make_target_python
16
+ from pip._internal.cli.status_codes import SUCCESS
17
+ from pip._internal.configuration import Configuration
18
+ from pip._internal.metadata import get_environment
19
+ from pip._internal.utils.compat import open_text_resource
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 open_text_resource("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
+ f" be {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 = f"Compatible tags: {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 = f"...\n[First {tag_limit} tags shown. Pass --verbose to show all.]"
138
+ logger.info(msg)
139
+
140
+
141
+ def ca_bundle_info(config: Configuration) -> str:
142
+ levels = {key.split(".", 1)[0] for key, _ in config.items()}
143
+ if not levels:
144
+ return "Not specified"
145
+
146
+ levels_that_override_global = ["install", "wheel", "download"]
147
+ global_overriding_level = [
148
+ level for level in levels if level in levels_that_override_global
149
+ ]
150
+ if not global_overriding_level:
151
+ return "global"
152
+
153
+ if "global" in levels:
154
+ levels.remove("global")
155
+ return ", ".join(levels)
156
+
157
+
158
+ class DebugCommand(Command):
159
+ """
160
+ Display debug information.
161
+ """
162
+
163
+ usage = """
164
+ %prog <options>"""
165
+ ignore_require_venv = True
166
+
167
+ def add_options(self) -> None:
168
+ cmdoptions.add_target_python_options(self.cmd_opts)
169
+ self.parser.insert_option_group(0, self.cmd_opts)
170
+ self.parser.config.load()
171
+
172
+ def run(self, options: Values, args: List[str]) -> int:
173
+ logger.warning(
174
+ "This command is only meant for debugging. "
175
+ "Do not use this with automation for parsing and getting these "
176
+ "details, since the output and options of this command may "
177
+ "change without notice."
178
+ )
179
+ show_value("pip version", get_pip_version())
180
+ show_value("sys.version", sys.version)
181
+ show_value("sys.executable", sys.executable)
182
+ show_value("sys.getdefaultencoding", sys.getdefaultencoding())
183
+ show_value("sys.getfilesystemencoding", sys.getfilesystemencoding())
184
+ show_value(
185
+ "locale.getpreferredencoding",
186
+ locale.getpreferredencoding(),
187
+ )
188
+ show_value("sys.platform", sys.platform)
189
+ show_sys_implementation()
190
+
191
+ show_value("'cert' config value", ca_bundle_info(self.parser.config))
192
+ show_value("REQUESTS_CA_BUNDLE", os.environ.get("REQUESTS_CA_BUNDLE"))
193
+ show_value("CURL_CA_BUNDLE", os.environ.get("CURL_CA_BUNDLE"))
194
+ show_value("pip._vendor.certifi.where()", where())
195
+ show_value("pip._vendor.DEBUNDLED", pip._vendor.DEBUNDLED)
196
+
197
+ show_vendor_versions()
198
+
199
+ show_tags(options)
200
+
201
+ return SUCCESS
.venv/Lib/site-packages/pip/_internal/commands/download.py ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+
143
+ if downloaded:
144
+ write_output("Successfully downloaded %s", " ".join(downloaded))
145
+
146
+ return SUCCESS
.venv/Lib/site-packages/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
+ ignore_require_venv = True
33
+ usage = """
34
+ %prog [options]"""
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