pex 2.54.2__py2.py3-none-any.whl → 2.69.0__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of pex might be problematic. Click here for more details.

Files changed (180) hide show
  1. pex/auth.py +1 -1
  2. pex/bin/pex.py +15 -2
  3. pex/build_backend/configuration.py +5 -5
  4. pex/build_backend/wrap.py +27 -23
  5. pex/build_system/pep_517.py +4 -1
  6. pex/cache/dirs.py +17 -12
  7. pex/cli/commands/lock.py +302 -165
  8. pex/cli/commands/pip/core.py +4 -12
  9. pex/cli/commands/pip/wheel.py +1 -1
  10. pex/cli/commands/run.py +13 -20
  11. pex/cli/commands/venv.py +85 -16
  12. pex/cli/pex.py +11 -4
  13. pex/common.py +57 -7
  14. pex/compatibility.py +1 -1
  15. pex/dependency_configuration.py +87 -15
  16. pex/dist_metadata.py +143 -25
  17. pex/docs/html/_pagefind/fragment/en_4250138.pf_fragment +0 -0
  18. pex/docs/html/_pagefind/fragment/en_7125dad.pf_fragment +0 -0
  19. pex/docs/html/_pagefind/fragment/en_785d562.pf_fragment +0 -0
  20. pex/docs/html/_pagefind/fragment/en_8e94bb8.pf_fragment +0 -0
  21. pex/docs/html/_pagefind/fragment/en_a0396bb.pf_fragment +0 -0
  22. pex/docs/html/_pagefind/fragment/en_a8a3588.pf_fragment +0 -0
  23. pex/docs/html/_pagefind/fragment/en_c07d988.pf_fragment +0 -0
  24. pex/docs/html/_pagefind/fragment/en_d718411.pf_fragment +0 -0
  25. pex/docs/html/_pagefind/index/en_a2e3c5e.pf_index +0 -0
  26. pex/docs/html/_pagefind/pagefind-entry.json +1 -1
  27. pex/docs/html/_pagefind/pagefind.en_4ce1afa9e3.pf_meta +0 -0
  28. pex/docs/html/_static/documentation_options.js +1 -1
  29. pex/docs/html/_static/pygments.css +164 -146
  30. pex/docs/html/_static/styles/furo.css +1 -1
  31. pex/docs/html/_static/styles/furo.css.map +1 -1
  32. pex/docs/html/api/vars.html +25 -34
  33. pex/docs/html/buildingpex.html +25 -34
  34. pex/docs/html/genindex.html +24 -33
  35. pex/docs/html/index.html +25 -34
  36. pex/docs/html/recipes.html +25 -34
  37. pex/docs/html/scie.html +25 -34
  38. pex/docs/html/search.html +24 -33
  39. pex/docs/html/whatispex.html +25 -34
  40. pex/entry_points_txt.py +98 -0
  41. pex/environment.py +54 -33
  42. pex/finders.py +1 -1
  43. pex/hashing.py +71 -9
  44. pex/installed_wheel.py +141 -0
  45. pex/interpreter.py +41 -38
  46. pex/interpreter_constraints.py +25 -25
  47. pex/interpreter_implementation.py +40 -0
  48. pex/jobs.py +13 -6
  49. pex/pep_376.py +68 -384
  50. pex/pep_425.py +11 -2
  51. pex/pep_427.py +937 -205
  52. pex/pep_508.py +4 -5
  53. pex/pex_builder.py +5 -8
  54. pex/pex_info.py +14 -9
  55. pex/pip/dependencies/__init__.py +85 -13
  56. pex/pip/dependencies/requires.py +38 -3
  57. pex/pip/foreign_platform/__init__.py +4 -3
  58. pex/pip/installation.py +2 -2
  59. pex/pip/local_project.py +6 -14
  60. pex/pip/package_repositories/__init__.py +78 -0
  61. pex/pip/package_repositories/link_collector.py +96 -0
  62. pex/pip/tool.py +139 -33
  63. pex/pip/vcs.py +109 -43
  64. pex/pip/version.py +8 -1
  65. pex/requirements.py +121 -16
  66. pex/resolve/config.py +5 -1
  67. pex/resolve/configured_resolve.py +32 -10
  68. pex/resolve/configured_resolver.py +10 -39
  69. pex/resolve/downloads.py +4 -3
  70. pex/resolve/lock_downloader.py +16 -23
  71. pex/resolve/lock_resolver.py +41 -51
  72. pex/resolve/locked_resolve.py +89 -32
  73. pex/resolve/locker.py +145 -101
  74. pex/resolve/locker_patches.py +123 -197
  75. pex/resolve/lockfile/create.py +232 -87
  76. pex/resolve/lockfile/download_manager.py +5 -1
  77. pex/resolve/lockfile/json_codec.py +103 -28
  78. pex/resolve/lockfile/model.py +13 -35
  79. pex/resolve/lockfile/pep_751.py +117 -98
  80. pex/resolve/lockfile/requires_dist.py +17 -262
  81. pex/resolve/lockfile/subset.py +11 -0
  82. pex/resolve/lockfile/targets.py +445 -0
  83. pex/resolve/lockfile/updater.py +22 -10
  84. pex/resolve/package_repository.py +406 -0
  85. pex/resolve/pex_repository_resolver.py +1 -1
  86. pex/resolve/pre_resolved_resolver.py +19 -16
  87. pex/resolve/project.py +233 -47
  88. pex/resolve/requirement_configuration.py +28 -10
  89. pex/resolve/resolver_configuration.py +18 -32
  90. pex/resolve/resolver_options.py +234 -28
  91. pex/resolve/resolvers.py +3 -12
  92. pex/resolve/target_options.py +18 -2
  93. pex/resolve/target_system.py +908 -0
  94. pex/resolve/venv_resolver.py +670 -0
  95. pex/resolver.py +673 -209
  96. pex/scie/__init__.py +40 -1
  97. pex/scie/model.py +2 -0
  98. pex/scie/science.py +25 -3
  99. pex/sdist.py +219 -0
  100. pex/sh_boot.py +24 -21
  101. pex/sysconfig.py +5 -3
  102. pex/targets.py +31 -10
  103. pex/third_party/__init__.py +1 -1
  104. pex/tools/commands/repository.py +48 -25
  105. pex/vendor/__init__.py +4 -9
  106. pex/vendor/__main__.py +65 -41
  107. pex/vendor/_vendored/ansicolors/.layout.json +1 -1
  108. pex/vendor/_vendored/ansicolors/ansicolors-1.1.8.dist-info/RECORD +11 -0
  109. pex/vendor/_vendored/ansicolors/ansicolors-1.1.8.pex-info/original-whl-info.json +1 -0
  110. pex/vendor/_vendored/appdirs/.layout.json +1 -1
  111. pex/vendor/_vendored/appdirs/appdirs-1.4.4.dist-info/RECORD +7 -0
  112. pex/vendor/_vendored/appdirs/appdirs-1.4.4.pex-info/original-whl-info.json +1 -0
  113. pex/vendor/_vendored/attrs/.layout.json +1 -1
  114. pex/vendor/_vendored/attrs/attrs-21.5.0.dev0.dist-info/RECORD +37 -0
  115. pex/vendor/_vendored/attrs/attrs-21.5.0.dev0.pex-info/original-whl-info.json +1 -0
  116. pex/vendor/_vendored/packaging_20_9/.layout.json +1 -1
  117. pex/vendor/_vendored/packaging_20_9/packaging-20.9.dist-info/RECORD +20 -0
  118. pex/vendor/_vendored/packaging_20_9/packaging-20.9.pex-info/original-whl-info.json +1 -0
  119. pex/vendor/_vendored/packaging_20_9/pyparsing-2.4.7.dist-info/RECORD +7 -0
  120. pex/vendor/_vendored/packaging_20_9/pyparsing-2.4.7.pex-info/original-whl-info.json +1 -0
  121. pex/vendor/_vendored/packaging_21_3/.layout.json +1 -1
  122. pex/vendor/_vendored/packaging_21_3/packaging-21.3.dist-info/RECORD +20 -0
  123. pex/vendor/_vendored/packaging_21_3/packaging-21.3.pex-info/original-whl-info.json +1 -0
  124. pex/vendor/_vendored/packaging_21_3/pyparsing-3.0.7.dist-info/RECORD +18 -0
  125. pex/vendor/_vendored/packaging_21_3/pyparsing-3.0.7.pex-info/original-whl-info.json +1 -0
  126. pex/vendor/_vendored/packaging_24_0/.layout.json +1 -1
  127. pex/vendor/_vendored/packaging_24_0/packaging-24.0.dist-info/RECORD +22 -0
  128. pex/vendor/_vendored/packaging_24_0/packaging-24.0.pex-info/original-whl-info.json +1 -0
  129. pex/vendor/_vendored/packaging_25_0/.layout.json +1 -1
  130. pex/vendor/_vendored/packaging_25_0/packaging-25.0.dist-info/RECORD +24 -0
  131. pex/vendor/_vendored/packaging_25_0/packaging-25.0.pex-info/original-whl-info.json +1 -0
  132. pex/vendor/_vendored/pip/.layout.json +1 -1
  133. pex/vendor/_vendored/pip/pip/_vendor/certifi/cacert.pem +63 -1
  134. pex/vendor/_vendored/pip/pip-20.3.4.dist-info/RECORD +388 -0
  135. pex/vendor/_vendored/pip/pip-20.3.4.pex-info/original-whl-info.json +1 -0
  136. pex/vendor/_vendored/setuptools/.layout.json +1 -1
  137. pex/vendor/_vendored/setuptools/setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.dist-info/RECORD +107 -0
  138. pex/vendor/_vendored/setuptools/setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.pex-info/original-whl-info.json +1 -0
  139. pex/vendor/_vendored/toml/.layout.json +1 -1
  140. pex/vendor/_vendored/toml/toml-0.10.2.dist-info/RECORD +11 -0
  141. pex/vendor/_vendored/toml/toml-0.10.2.pex-info/original-whl-info.json +1 -0
  142. pex/vendor/_vendored/tomli/.layout.json +1 -1
  143. pex/vendor/_vendored/tomli/tomli-2.0.1.dist-info/RECORD +10 -0
  144. pex/vendor/_vendored/tomli/tomli-2.0.1.pex-info/original-whl-info.json +1 -0
  145. pex/venv/installer.py +46 -19
  146. pex/venv/venv_pex.py +6 -3
  147. pex/version.py +1 -1
  148. pex/wheel.py +188 -40
  149. pex/whl.py +67 -0
  150. pex/windows/__init__.py +14 -11
  151. {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/METADATA +6 -5
  152. {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/RECORD +157 -133
  153. {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/entry_points.txt +1 -0
  154. {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/pylock/pylock.toml +1 -1
  155. pex/docs/html/_pagefind/fragment/en_42c9d8c.pf_fragment +0 -0
  156. pex/docs/html/_pagefind/fragment/en_45dd5a2.pf_fragment +0 -0
  157. pex/docs/html/_pagefind/fragment/en_4ca74d2.pf_fragment +0 -0
  158. pex/docs/html/_pagefind/fragment/en_77273d5.pf_fragment +0 -0
  159. pex/docs/html/_pagefind/fragment/en_87a59c5.pf_fragment +0 -0
  160. pex/docs/html/_pagefind/fragment/en_8dc89b5.pf_fragment +0 -0
  161. pex/docs/html/_pagefind/fragment/en_9d1319b.pf_fragment +0 -0
  162. pex/docs/html/_pagefind/fragment/en_e55df9d.pf_fragment +0 -0
  163. pex/docs/html/_pagefind/index/en_1e98c6f.pf_index +0 -0
  164. pex/docs/html/_pagefind/pagefind.en_d1c488ecae.pf_meta +0 -0
  165. pex/vendor/_vendored/ansicolors/ansicolors-1.1.8.dist-info/INSTALLER +0 -1
  166. pex/vendor/_vendored/appdirs/appdirs-1.4.4.dist-info/INSTALLER +0 -1
  167. pex/vendor/_vendored/attrs/attrs-21.5.0.dev0.dist-info/INSTALLER +0 -1
  168. pex/vendor/_vendored/packaging_20_9/packaging-20.9.dist-info/INSTALLER +0 -1
  169. pex/vendor/_vendored/packaging_20_9/pyparsing-2.4.7.dist-info/INSTALLER +0 -1
  170. pex/vendor/_vendored/packaging_21_3/packaging-21.3.dist-info/INSTALLER +0 -1
  171. pex/vendor/_vendored/packaging_21_3/pyparsing-3.0.7.dist-info/INSTALLER +0 -1
  172. pex/vendor/_vendored/packaging_24_0/packaging-24.0.dist-info/INSTALLER +0 -1
  173. pex/vendor/_vendored/packaging_25_0/packaging-25.0.dist-info/INSTALLER +0 -1
  174. pex/vendor/_vendored/pip/pip-20.3.4.dist-info/INSTALLER +0 -1
  175. pex/vendor/_vendored/setuptools/setuptools-44.0.0+3acb925dd708430aeaf197ea53ac8a752f7c1863.dist-info/INSTALLER +0 -1
  176. pex/vendor/_vendored/toml/toml-0.10.2.dist-info/INSTALLER +0 -1
  177. pex/vendor/_vendored/tomli/tomli-2.0.1.dist-info/INSTALLER +0 -1
  178. {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/WHEEL +0 -0
  179. {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/licenses/LICENSE +0 -0
  180. {pex-2.54.2.dist-info → pex-2.69.0.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,7 @@
1
1
  # Copyright 2021 Pex project contributors.
2
2
  # Licensed under the Apache License, Version 2.0 (see LICENSE).
3
3
 
4
- from __future__ import absolute_import
4
+ from __future__ import absolute_import, print_function
5
5
 
6
6
  import functools
7
7
  import logging
@@ -18,12 +18,14 @@ from pex import dist_metadata
18
18
  from pex.atomic_directory import atomic_directory
19
19
  from pex.cache.dirs import CacheDir
20
20
  from pex.commands.command import JsonMixin, OutputMixin
21
- from pex.common import REPRODUCIBLE_BUILDS_ENV, pluralize, safe_mkdir, safe_mkdtemp, safe_open
21
+ from pex.common import pluralize, safe_mkdir, safe_mkdtemp, safe_open
22
22
  from pex.compatibility import Queue
23
23
  from pex.dist_metadata import Distribution
24
24
  from pex.environment import PEXEnvironment
25
+ from pex.installed_wheel import InstalledWheel
25
26
  from pex.interpreter import PythonInterpreter
26
- from pex.jobs import Job, Retain, SpawnedJob, execute_parallel
27
+ from pex.jobs import Job, iter_map_parallel
28
+ from pex.pep_427 import WheelInstallError, repack
27
29
  from pex.pex import PEX
28
30
  from pex.result import Error, Ok, Result
29
31
  from pex.tools.command import PEXCommand
@@ -31,7 +33,7 @@ from pex.typing import TYPE_CHECKING, cast
31
33
  from pex.venv.virtualenv import InstallationChoice, Virtualenv
32
34
 
33
35
  if TYPE_CHECKING:
34
- from typing import IO, Any, Callable, Iterable, Iterator, List, Text, Tuple
36
+ from typing import IO, Any, Callable, Iterable, Iterator, List, Tuple
35
37
 
36
38
  import attr # vendor:skip
37
39
 
@@ -121,6 +123,29 @@ class FindLinksRepo(object):
121
123
  self._server_process.kill()
122
124
 
123
125
 
126
+ def _extract_wheel(
127
+ distribution, # type: Distribution
128
+ dest_dir, # type: str
129
+ use_system_time=False, # type: bool
130
+ ):
131
+ # type: (...) -> Tuple[Distribution, Result]
132
+
133
+ try:
134
+ whl = repack(
135
+ installed_wheel=InstalledWheel.load(distribution.location),
136
+ dest_dir=dest_dir,
137
+ use_system_time=use_system_time,
138
+ )
139
+ except (InstalledWheel.LoadError, WheelInstallError) as e:
140
+ result = Error(str(e)) # type: Result
141
+ else:
142
+ result = Ok(
143
+ "{distribution}: Repacked wheel as {whl}".format(distribution=distribution, whl=whl)
144
+ )
145
+
146
+ return distribution, result
147
+
148
+
124
149
  class Repository(JsonMixin, OutputMixin, PEXCommand):
125
150
  """Interact with the Python distribution repository contained in a PEX file."""
126
151
 
@@ -270,36 +295,23 @@ class Repository(JsonMixin, OutputMixin, PEXCommand):
270
295
  if self.options.sources:
271
296
  self._extract_sdist(pex, dest_dir)
272
297
 
273
- def spawn_extract(distribution):
274
- # type: (Distribution) -> SpawnedJob[Text]
275
- env = os.environ.copy()
276
- if not self.options.use_system_time:
277
- env.update(REPRODUCIBLE_BUILDS_ENV)
278
- job = spawn_python_job_with_setuptools_and_wheel(
279
- args=["-m", "wheel", "pack", "--dest-dir", dest_dir, distribution.location],
280
- interpreter=pex.interpreter,
281
- stdout=subprocess.PIPE,
282
- env=env,
283
- )
284
- return SpawnedJob.stdout(
285
- job, result_func=lambda out: "{}: {}".format(distribution, out.decode())
286
- )
287
-
288
298
  with self._distributions_output(pex) as (distributions, output):
289
299
  errors = [] # type: List[Distribution]
290
- for result in execute_parallel(
291
- distributions, spawn_extract, error_handler=Retain[Distribution]()
300
+ for distribution, result in iter_map_parallel(
301
+ distributions,
302
+ functools.partial(
303
+ _extract_wheel, dest_dir=dest_dir, use_system_time=self.options.use_system_time
304
+ ),
292
305
  ):
293
- if isinstance(result, tuple):
294
- distribution, error = result
306
+ if isinstance(result, Error):
295
307
  errors.append(distribution)
296
308
  output.write(
297
309
  "Failed to build a wheel for {distribution}: {error}\n".format(
298
- distribution=distribution, error=error
310
+ distribution=distribution, error=result
299
311
  )
300
312
  )
301
313
  else:
302
- output.write(result)
314
+ print(result, file=output)
303
315
  if errors:
304
316
  return Error(
305
317
  "Failed to build wheels for {count} {distributions}.".format(
@@ -435,6 +447,17 @@ class Repository(JsonMixin, OutputMixin, PEXCommand):
435
447
  with open(os.path.join(chroot, "setup.py"), "w") as fp:
436
448
  fp.write("import setuptools; setuptools.setup()")
437
449
 
450
+ with open(os.path.join(chroot, "pyproject.toml"), "w") as fp:
451
+ fp.write(
452
+ dedent(
453
+ """\
454
+ [build-system]
455
+ requires = ["setuptools"]
456
+ backend = "setuptools.build_meta"
457
+ """
458
+ )
459
+ )
460
+
438
461
  spawn_python_job_with_setuptools_and_wheel(
439
462
  args=["setup.py", "sdist", "--dist-dir", dest_dir],
440
463
  interpreter=pex.interpreter,
pex/vendor/__init__.py CHANGED
@@ -201,9 +201,11 @@ class VendorSpec(
201
201
  # Automated update of Pip's vendored certifi's cacert.pem to that from certifi 2025.7.14.
202
202
  # 12.) https://github.com/pex-tool/pip/commit/21a4058f77f9864151510b725419206a2e5645ae
203
203
  # Automated update of Pip's vendored certifi's cacert.pem to that from certifi 2025.8.3.
204
+ # 13.) https://github.com/pex-tool/pip/commit/cef23bb7153ec49037d963e84fcad0f08880fbc5
205
+ # Automated update of Pip's vendored certifi's cacert.pem to that from certifi 2025.10.5.
204
206
  PIP_SPEC = VendorSpec.git(
205
207
  repo="https://github.com/pex-tool/pip",
206
- commit="21a4058f77f9864151510b725419206a2e5645ae",
208
+ commit="cef23bb7153ec49037d963e84fcad0f08880fbc5",
207
209
  project_name="pip",
208
210
  rewrite=False,
209
211
  )
@@ -316,7 +318,6 @@ def vendor_runtime(
316
318
  dest_basedir, # type: str
317
319
  label, # type: str
318
320
  root_module_names, # type: Iterable[str]
319
- include_dist_info=(), # type: Iterable[str]
320
321
  ):
321
322
  # type: (...) -> Set[str]
322
323
  """Includes portions of vendored distributions in a chroot.
@@ -329,7 +330,6 @@ def vendor_runtime(
329
330
  :param dest_basedir: The prefix to store the vendored code under in the ``chroot``.
330
331
  :param label: The chroot label for the vendored code fileset.
331
332
  :param root_module_names: The names of the root vendored modules to include in the chroot.
332
- :param include_dist_info: Include the .dist-info dirs associated with these root module names.
333
333
  :returns: The set of absolute paths of the source files that were vendored.
334
334
  :raise: :class:`ValueError` if any of the given ``root_module_names`` could not be found amongst
335
335
  the vendored code and added to the chroot.
@@ -368,12 +368,7 @@ def vendor_runtime(
368
368
  vendor_module_names[name] = True
369
369
  TRACER.log("Vendoring {} from {} @ {}".format(name, spec, spec.target_dir), V=3)
370
370
 
371
- dirs[:] = packages + [
372
- d
373
- for project in include_dist_info
374
- for d in dirs
375
- if d.startswith(project) and d.endswith(".dist-info")
376
- ]
371
+ dirs[:] = packages
377
372
  files[:] = modules
378
373
 
379
374
  # We copy over sources and data only; no pyc files.
pex/vendor/__main__.py CHANGED
@@ -6,11 +6,12 @@ from __future__ import absolute_import, print_function
6
6
  import glob
7
7
  import os
8
8
  import pkgutil
9
- import re
10
9
  import subprocess
11
10
  import sys
11
+ import zipfile
12
12
  from argparse import ArgumentParser
13
13
  from collections import OrderedDict, defaultdict
14
+ from contextlib import closing
14
15
  from typing import FrozenSet, Iterator, List
15
16
 
16
17
  import libcst
@@ -36,7 +37,15 @@ from libcst import (
36
37
  SimpleString,
37
38
  )
38
39
 
39
- from pex.common import safe_delete, safe_mkdir, safe_mkdtemp, safe_open, safe_rmtree
40
+ from pex.common import (
41
+ REPRODUCIBLE_BUILDS_ENV,
42
+ safe_delete,
43
+ safe_mkdir,
44
+ safe_mkdtemp,
45
+ safe_open,
46
+ safe_rmtree,
47
+ )
48
+ from pex.pep_427 import ZipMetadata
40
49
  from pex.typing import TYPE_CHECKING
41
50
  from pex.vendor import VendorSpec, iter_vendor_specs
42
51
 
@@ -362,10 +371,10 @@ def vendorize(root_dir, vendor_specs, prefix, update):
362
371
  # importable code must lie at the top of its vendored chroot. Although
363
372
  # `pex.pep_472.install_wheel_chroot` encodes the logic to achieve this layout, we can't run
364
373
  # that without 1st approximating that layout!. We take the tack of performing an importable
365
- # installation using `pip wheel ...` + `wheel unpack ...`. Although simply un-packing a wheel
374
+ # installation using `pip wheel ...` + `unzip ...`. Although simply unzipping a wheel
366
375
  # does not make it importable in general, it works for our pure-python vendored code.
367
376
 
368
- unpacked_wheel_chroots_by_vendor_spec = defaultdict(list)
377
+ unzipped_wheel_chroots_by_vendor_spec = defaultdict(list)
369
378
  for vendor_spec in vendor_specs:
370
379
  # NB: We set --no-build-isolation to prevent pip from installing the requirements listed in
371
380
  # its [build-system] config in its pyproject.toml.
@@ -387,6 +396,7 @@ def vendorize(root_dir, vendor_specs, prefix, update):
387
396
  cmd = [
388
397
  "pip",
389
398
  "wheel",
399
+ "--prefer-binary",
390
400
  "--no-build-isolation",
391
401
  "--no-cache-dir",
392
402
  "--wheel-dir",
@@ -408,7 +418,9 @@ def vendorize(root_dir, vendor_specs, prefix, update):
408
418
  if os.path.isfile(constraints_file):
409
419
  cmd.extend(["--constraint", constraints_file])
410
420
 
411
- result = subprocess.call(cmd)
421
+ env = os.environ.copy()
422
+ env.update(REPRODUCIBLE_BUILDS_ENV)
423
+ result = subprocess.call(cmd, env=env)
412
424
  if result != 0:
413
425
  raise VendorizeError("Failed to vendor {!r}".format(vendor_spec))
414
426
 
@@ -416,22 +428,17 @@ def vendorize(root_dir, vendor_specs, prefix, update):
416
428
  # later.
417
429
  safe_mkdir(vendor_spec.target_dir)
418
430
  for wheel_file in glob.glob(os.path.join(wheels_dir, "*.whl")):
419
- extract_dir = os.path.join(wheels_dir, ".extracted")
420
- output = subprocess.check_output(
421
- ["wheel", "unpack", "--dest", extract_dir, wheel_file]
422
- ).decode("utf-8")
423
- match = re.match(r"^Unpacking to: (?P<unpack_dir>.+)\.\.\.OK$", output)
424
- assert match is not None, (
425
- "Failed to determine {wheel_file} unpack dir from wheel unpack output:\n"
426
- "{output}".format(wheel_file=wheel_file, output=output)
431
+ unzipped_wheel_dir = os.path.join(
432
+ wheels_dir, ".extracted", os.path.basename(wheel_file)
433
+ )
434
+ with closing(zipfile.ZipFile(wheel_file)) as zf:
435
+ zf.extractall(unzipped_wheel_dir)
436
+ unzipped_wheel_chroots_by_vendor_spec[vendor_spec].append(
437
+ (unzipped_wheel_dir, wheel_file)
427
438
  )
428
- unpacked_to_dir = os.path.join(extract_dir, match["unpack_dir"])
429
- unpacked_wheel_dir = os.path.join(extract_dir, os.path.basename(wheel_file))
430
- os.rename(unpacked_to_dir, unpacked_wheel_dir)
431
- unpacked_wheel_chroots_by_vendor_spec[vendor_spec].append(unpacked_wheel_dir)
432
- for path in os.listdir(unpacked_wheel_dir):
439
+ for path in os.listdir(unzipped_wheel_dir):
433
440
  os.symlink(
434
- os.path.join(unpacked_wheel_dir, path),
441
+ os.path.join(unzipped_wheel_dir, path),
435
442
  os.path.join(vendor_spec.target_dir, path),
436
443
  )
437
444
 
@@ -484,7 +491,8 @@ def vendorize(root_dir, vendor_specs, prefix, update):
484
491
  # Import all code needed below now before we move any vendored bits it depends on temporarily
485
492
  # back to the prefix site-packages dir.
486
493
  from pex.dist_metadata import ProjectNameAndVersion, Requirement
487
- from pex.pep_427 import install_wheel_chroot
494
+ from pex.pep_427 import InstallableWheel, InstallPaths, install_wheel_chroot
495
+ from pex.wheel import Wheel
488
496
 
489
497
  for vendor_spec in vendor_specs:
490
498
  print(
@@ -512,29 +520,43 @@ def vendorize(root_dir, vendor_specs, prefix, update):
512
520
  # We want the primary artifact to own any special Pex wheel chroot metadata; so we arrange
513
521
  # a list of installs that place it last.
514
522
  primary_project = Requirement.parse(vendor_spec.requirement).project_name
515
- wheel_chroots_by_project_name = {
516
- ProjectNameAndVersion.from_filename(
517
- wheel_chroot
518
- ).canonicalized_project_name: wheel_chroot
519
- for wheel_chroot in unpacked_wheel_chroots_by_vendor_spec[vendor_spec]
520
- }
521
- primary_wheel_chroot = wheel_chroots_by_project_name.pop(primary_project)
523
+ wheel_chroots_by_project_name = OrderedDict()
524
+ for wheel_chroot, wheel_file in unzipped_wheel_chroots_by_vendor_spec[vendor_spec]:
525
+ pnav = ProjectNameAndVersion.from_filename(wheel_chroot)
526
+ wheel_chroots_by_project_name[pnav.canonicalized_project_name] = (
527
+ pnav.canonicalized_project_name,
528
+ pnav.canonicalized_version,
529
+ wheel_chroot,
530
+ wheel_file,
531
+ )
532
+
533
+ (
534
+ project_name,
535
+ version,
536
+ primary_wheel_chroot,
537
+ primary_wheel_file,
538
+ ) = wheel_chroots_by_project_name.pop(primary_project)
522
539
  wheels_chroots_to_install = list(wheel_chroots_by_project_name.values())
523
- wheels_chroots_to_install.append(primary_wheel_chroot)
524
-
525
- for wheel_chroot in wheels_chroots_to_install:
526
- dest_dir = safe_mkdtemp()
527
- subprocess.check_call(["wheel", "pack", "--dest-dir", dest_dir, wheel_chroot])
528
- wheel_files = glob.glob(os.path.join(dest_dir, "*.whl"))
529
- assert len(wheel_files) == 1, (
530
- "Expected re-packing {wheel_chroot} to produce one `.whl` file but found {count}:\n"
531
- "{wheel_files}"
532
- ).format(
533
- wheel_chroot=wheel_chroot,
534
- count=len(wheel_files),
535
- wheel_files="\n".join(os.path.basename(wheel_file) for wheel_file in wheel_files),
540
+ wheels_chroots_to_install.append(
541
+ (project_name, version, primary_wheel_chroot, primary_wheel_file)
542
+ )
543
+
544
+ for project_name, version, wheel_chroot, wheel_file in wheels_chroots_to_install:
545
+ with closing(zipfile.ZipFile(wheel_file)) as zf:
546
+ zip_metadata = ZipMetadata.from_zip(filename=wheel_file, info_list=zf.infolist())
547
+ vendored_wheel = Wheel.load(wheel_chroot)
548
+ install_wheel_chroot(
549
+ wheel=InstallableWheel(
550
+ wheel=vendored_wheel,
551
+ install_paths=InstallPaths.wheel(
552
+ destination=wheel_chroot, wheel=vendored_wheel
553
+ ),
554
+ zip_metadata=zip_metadata,
555
+ ),
556
+ destination=vendor_spec.target_dir,
557
+ # N.B.: We potentially re-wrote imports; so the file needs to be re-hashed.
558
+ re_hash=True,
536
559
  )
537
- install_wheel_chroot(wheel_path=wheel_files[0], destination=vendor_spec.target_dir)
538
560
 
539
561
 
540
562
  if __name__ == "__main__":
@@ -551,6 +573,8 @@ if __name__ == "__main__":
551
573
  root_directory = VendorSpec.ROOT
552
574
  try:
553
575
  safe_rmtree(VendorSpec.vendor_root())
576
+ # Stabilize our umask to get the same file perms on any run.
577
+ os.umask(0o022)
554
578
  vendorize(
555
579
  root_dir=root_directory,
556
580
  vendor_specs=list(iter_vendor_specs()),
@@ -1 +1 @@
1
- {"fingerprint": "a175b8cdfaabde6458bf70a07cf4ea1a51d4a8edf2502dff5777a049b610f354", "record_relpath": "ansicolors-1.1.8.dist-info/RECORD", "root_is_purelib": true, "stash_dir": ".prefix"}
1
+ {"fingerprint":"93bbf4f9990c23d7f074400fbc7b72699025043cff2ba03c34196ad876cc265c","record_relpath":"ansicolors-1.1.8.dist-info/RECORD","root_is_purelib":true,"stash_dir":".prefix","sys_path_entries":["."]}
@@ -0,0 +1,11 @@
1
+ ansicolors-1.1.8.dist-info/DESCRIPTION.rst,sha256=hgL3qWOqDdnS5m7OGbUJvvZ_gOnggqyKN0LzedMq3o4,7900
2
+ ansicolors-1.1.8.dist-info/METADATA,sha256=91m-dxXKkt0Fg_Zv_HA7Zlxx2f1bGDFRn0cMD-6YkvI,9006
3
+ ansicolors-1.1.8.dist-info/RECORD,,
4
+ ansicolors-1.1.8.dist-info/WHEEL,sha256=o2k-Qa-RMNIJmUdIc7KU6VWR_ErNRbWNlxDIpl7lm34,110
5
+ ansicolors-1.1.8.dist-info/metadata.json,sha256=jEvYWhL1nvf1IOuhZN76kIr3cS4QQN9_aql483E8Sd8,1181
6
+ ansicolors-1.1.8.dist-info/top_level.txt,sha256=igtcW1b_UlN1_x_2Ooi1-5-0ZZzr7UbkgT0OyOkOz1A,7
7
+ colors/__init__.py,sha256=7UV3RlAaU9ihmC33l1KnlJ19mV79q9knPrayzG0LA4g,119
8
+ colors/colors.py,sha256=VNM8dhjwb51Q3rbNFLhAfl-Xi3vd88NLnLT8BavVpXg,5603
9
+ colors/csscolors.py,sha256=pYW3Yisj3bGz-ocg23jxmqQ7YjNFoaZuLW38Lrqd8pg,6584
10
+ colors/version.py,sha256=1AmxhanHVlK7-ylUJmxvVmAhH674NXaZPyMgOYTXThQ,22
11
+ ansicolors-1.1.8.pex-info/original-whl-info.json,sha256=HbV2rpplaYIBPX3BXgmvHbJ3jE4Kai_UN1AI0iFOiAg,717
@@ -0,0 +1 @@
1
+ {"entries":[["colors/__init__.py",[2017,5,17,21,12,12],2175008768],["colors/colors.py",[2017,6,2,20,55,34],2175008768],["colors/csscolors.py",[2017,6,2,19,55,26],2175008768],["colors/version.py",[2017,6,2,21,17,26],2175008768],["ansicolors-1.1.8.dist-info/DESCRIPTION.rst",[2017,6,2,21,22,12],2175008768],["ansicolors-1.1.8.dist-info/metadata.json",[2017,6,2,21,22,12],2175008768],["ansicolors-1.1.8.dist-info/top_level.txt",[2017,6,2,21,22,12],2175008768],["ansicolors-1.1.8.dist-info/WHEEL",[2017,6,2,21,22,12],2175008768],["ansicolors-1.1.8.dist-info/METADATA",[2017,6,2,21,22,12],2175008768],["ansicolors-1.1.8.dist-info/RECORD",[2017,6,2,21,22,12],2175008768]],"filename":"ansicolors-1.1.8-py2.py3-none-any.whl"}
@@ -1 +1 @@
1
- {"fingerprint": "383339ca0d10d6c4144fc79e24b2c65304bdfcfbebabcf10c8ec6e9b73ee64fd", "record_relpath": "appdirs-1.4.4.dist-info/RECORD", "root_is_purelib": true, "stash_dir": ".prefix"}
1
+ {"fingerprint":"24fd20ba81e67b247f15013f7f14f1932d342923d2f07d3a2cc73f264d01ca28","record_relpath":"appdirs-1.4.4.dist-info/RECORD","root_is_purelib":true,"stash_dir":".prefix","sys_path_entries":["."]}
@@ -0,0 +1,7 @@
1
+ appdirs.py,sha256=g99s2sXhnvTEm79oj4bWI0Toapc-_SmKKNXvOXHkVic,24720
2
+ appdirs-1.4.4.dist-info/LICENSE.txt,sha256=Nt200KdFqTqyAyA9cZCBSxuJcn0lTK_0jHp6-71HAAs,1097
3
+ appdirs-1.4.4.dist-info/METADATA,sha256=k5TVfXMNKGHTfp2wm6EJKTuGwGNuoQR5TqQgH8iwG8M,8981
4
+ appdirs-1.4.4.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
5
+ appdirs-1.4.4.dist-info/top_level.txt,sha256=nKncE8CUqZERJ6VuQWL4_bkunSPDNfn7KZqb4Tr5YEM,8
6
+ appdirs-1.4.4.dist-info/RECORD,,
7
+ appdirs-1.4.4.pex-info/original-whl-info.json,sha256=JGLXb1lcQ1mCmCous2iCwcoSL-PRXEU0XwIvlUrxRqU,449
@@ -0,0 +1 @@
1
+ {"entries":[["appdirs.py",[2020,5,10,23,54,42],2175008768],["appdirs-1.4.4.dist-info/LICENSE.txt",[2020,5,11,7,49,18],2175008768],["appdirs-1.4.4.dist-info/METADATA",[2020,5,11,7,49,18],2175008768],["appdirs-1.4.4.dist-info/WHEEL",[2020,5,11,7,49,18],2175008768],["appdirs-1.4.4.dist-info/top_level.txt",[2020,5,11,7,49,18],2175008768],["appdirs-1.4.4.dist-info/RECORD",[2020,5,11,7,49,18],28573696]],"filename":"appdirs-1.4.4-py2.py3-none-any.whl"}
@@ -1 +1 @@
1
- {"fingerprint": "f827748f286aa52ec78b7f6d7f0ae069555adff917b19b0097afa8b7ea45389a", "record_relpath": "attrs-21.5.0.dev0.dist-info/RECORD", "root_is_purelib": true, "stash_dir": ".prefix"}
1
+ {"fingerprint":"60e0467569716898b2972fe5a3d4c9949a86cabb361124271abdc4fda2aabc8c","record_relpath":"attrs-21.5.0.dev0.dist-info/RECORD","root_is_purelib":true,"stash_dir":".prefix","sys_path_entries":["."]}
@@ -0,0 +1,37 @@
1
+ attr/__init__.py,sha256=HLLlMhzttVknGFFJ3WtFVf5aZB2LE3IRGWm46Cl0_Is,1672
2
+ attr/__init__.pyi,sha256=ubRkstoRHPpQN17iA0OCh8waIwZ5NeJgbz0lwI8XUjY,15100
3
+ attr/_cmp.py,sha256=JP0N7OIyTqIR3prUDfMZOR4DV4tlV_xXf39-bQg7xOo,4165
4
+ attr/_cmp.pyi,sha256=oyjJVytrwwkUJOoe332IiYzp6pCVZEKKcKveH-ev604,317
5
+ attr/_compat.py,sha256=i8u27AAK_4SzQnmTf3aliGV27UdYbJxdZ-O0tOHbLU8,8396
6
+ attr/_config.py,sha256=aj1Lh8t2CuVa5nSxgCrLQtg_ZSdO8ZKeNJQd6RvpIp8,892
7
+ attr/_funcs.py,sha256=sm_D12y2IyRW_bCnR7M-O7U5qHaieXr0BzINwJ7_K38,14753
8
+ attr/_make.py,sha256=3sBkj8T3EkP-Jb_1HOzzEWeq59rK0uHOZzfoX35kB74,102691
9
+ attr/_next_gen.py,sha256=kZVQUsM4hhs26s--kwKcKOky8oevJvXpagnZ0xzAnbc,5728
10
+ attr/_version_info.py,sha256=sxD9yNai0jGbur_-RGEQHbgV2YX5_5G9PhrhBA5pA54,2194
11
+ attr/_version_info.pyi,sha256=x_M3L3WuB7r_ULXAWjx959udKQ4HLB8l-hsc1FDGNvk,209
12
+ attr/converters.py,sha256=uiiWTz8GLJe8I1Ty7UICK1DegVUnqHTXbOSnar7g7Nk,4078
13
+ attr/converters.pyi,sha256=MQo7iEzPNVoFpKqD30sVwgVpdNoIeSCF2nsXvoxLZ-Y,416
14
+ attr/exceptions.py,sha256=BMg7AljkJnvG-irMwL2TBHYlaLBXhSKnzoEWo4e42Zw,1981
15
+ attr/exceptions.pyi,sha256=zZq8bCUnKAy9mDtBEw42ZhPhAUIHoTKedDQInJD883M,539
16
+ attr/filters.py,sha256=JGZgvPGkdOfttkoL6XhXS6ZCoaVV5nZ8GCYeZNUN_mE,1124
17
+ attr/filters.pyi,sha256=_Sm80jGySETX_Clzdkon5NHVjQWRl3Y3liQKZX1czXc,215
18
+ attr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
+ attr/setters.py,sha256=rH_UtQuHgQEC7hfZyMO_SJW0R1Gus7-a83U8igZfqs8,1466
20
+ attr/setters.pyi,sha256=7dM10rqpQVDW0y-iJUnq8rabdO5Wx2Sbo5LwNa0IXl0,573
21
+ attr/validators.py,sha256=jVE9roaSOmTf0dJNSLHNaQNilkrlzc3pNNBKmv0g7pk,15966
22
+ attr/validators.pyi,sha256=adn6rNbIXmRXlg_FKrTmWj0dOX0vKTsGG82Jd3YcJbQ,2268
23
+ attrs/__init__.py,sha256=aX2i9JFdrtqLG9y6EYU_T5WB6Q_wRdQSCz3oSYo4vjs,1787
24
+ attrs/__init__.pyi,sha256=57aCxUJukK9lZlrUgk9RuWiBiPY5DzDKJAJkhbrStYw,1982
25
+ attrs/converters.py,sha256=Qest7tYhZchJXF5lqfLGkUhEYYT4NmKg8Ril1_g0Ooo,216
26
+ attrs/exceptions.py,sha256=0bGHmll9g3D8T0q6FCer3NWlaNFwY2nKJeO4Y6GK-0M,216
27
+ attrs/filters.py,sha256=nXj6QjEP-gY_2d0oR7njS_jXJ82wEVdd9P5xXf46eW0,210
28
+ attrs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
+ attrs/setters.py,sha256=pDIk-WAal-Qk05-porL8BAmd8AoP1PL6yLiyZMHg7RM,210
30
+ attrs/validators.py,sha256=wM1oQrUTrlyY9_bey9ivrdUXk9mELYbwwwU_USDQYTo,216
31
+ attrs-21.5.0.dev0.dist-info/AUTHORS.rst,sha256=wsqCNbGz_mklcJrt54APIZHZpoTIJLkXqEhhn4Nd8hc,752
32
+ attrs-21.5.0.dev0.dist-info/LICENSE,sha256=v2WaKLSSQGAvVrvfSQy-LsUJsVuY-Z17GaUsdA4yeGM,1082
33
+ attrs-21.5.0.dev0.dist-info/METADATA,sha256=-t3LVgMrh0oyIepApHAVYSGj-Yoj1ROrr3UsX0XZt0I,9810
34
+ attrs-21.5.0.dev0.dist-info/WHEEL,sha256=ADKeyaGyKF5DwBNE0sRE5pvW-bSkFMJfBuhzZ3rceP4,110
35
+ attrs-21.5.0.dev0.dist-info/top_level.txt,sha256=AGbmKnOtYpdkLRsDRQVSBIwfL32pAQ6BSo1mt-BxI7M,11
36
+ attrs-21.5.0.dev0.dist-info/RECORD,,
37
+ attrs-21.5.0.dev0.pex-info/original-whl-info.json,sha256=tci_1h9VD9j8cIrPFSQd8qGT7aM-uL1UXofO4PR2Mmo,1968
@@ -0,0 +1 @@
1
+ {"entries":[["attr/__init__.py",[1980,1,1,0,0,0],2175008768],["attr/__init__.pyi",[1980,1,1,0,0,0],2175008768],["attr/_cmp.py",[1980,1,1,0,0,0],2175008768],["attr/_cmp.pyi",[1980,1,1,0,0,0],2175008768],["attr/_compat.py",[1980,1,1,0,0,0],2175008768],["attr/_config.py",[1980,1,1,0,0,0],2175008768],["attr/_funcs.py",[1980,1,1,0,0,0],2175008768],["attr/_make.py",[1980,1,1,0,0,0],2175008768],["attr/_next_gen.py",[1980,1,1,0,0,0],2175008768],["attr/_version_info.py",[1980,1,1,0,0,0],2175008768],["attr/_version_info.pyi",[1980,1,1,0,0,0],2175008768],["attr/converters.py",[1980,1,1,0,0,0],2175008768],["attr/converters.pyi",[1980,1,1,0,0,0],2175008768],["attr/exceptions.py",[1980,1,1,0,0,0],2175008768],["attr/exceptions.pyi",[1980,1,1,0,0,0],2175008768],["attr/filters.py",[1980,1,1,0,0,0],2175008768],["attr/filters.pyi",[1980,1,1,0,0,0],2175008768],["attr/py.typed",[1980,1,1,0,0,0],2175008768],["attr/setters.py",[1980,1,1,0,0,0],2175008768],["attr/setters.pyi",[1980,1,1,0,0,0],2175008768],["attr/validators.py",[1980,1,1,0,0,0],2175008768],["attr/validators.pyi",[1980,1,1,0,0,0],2175008768],["attrs/__init__.py",[1980,1,1,0,0,0],2175008768],["attrs/__init__.pyi",[1980,1,1,0,0,0],2175008768],["attrs/converters.py",[1980,1,1,0,0,0],2175008768],["attrs/exceptions.py",[1980,1,1,0,0,0],2175008768],["attrs/filters.py",[1980,1,1,0,0,0],2175008768],["attrs/py.typed",[1980,1,1,0,0,0],2175008768],["attrs/setters.py",[1980,1,1,0,0,0],2175008768],["attrs/validators.py",[1980,1,1,0,0,0],2175008768],["attrs-21.5.0.dev0.dist-info/AUTHORS.rst",[1980,1,1,0,0,0],2175008768],["attrs-21.5.0.dev0.dist-info/LICENSE",[1980,1,1,0,0,0],2175008768],["attrs-21.5.0.dev0.dist-info/METADATA",[1980,1,1,0,0,0],2175008768],["attrs-21.5.0.dev0.dist-info/WHEEL",[1980,1,1,0,0,0],2175008768],["attrs-21.5.0.dev0.dist-info/top_level.txt",[1980,1,1,0,0,0],2175008768],["attrs-21.5.0.dev0.dist-info/RECORD",[1980,1,1,0,0,0],28573696]],"filename":"attrs-21.5.0.dev0-py2.py3-none-any.whl"}
@@ -1 +1 @@
1
- {"fingerprint": "3946db78a8f564b5e0f20648918e6352f64be213519585fe08750b080a1a21c3", "record_relpath": "packaging-20.9.dist-info/RECORD", "root_is_purelib": true, "stash_dir": ".prefix"}
1
+ {"fingerprint":"fb91f8df1ae86fdd0ebd7287158df23cf6d56791475d93841e7d3a76ec4eb23f","record_relpath":"packaging-20.9.dist-info/RECORD","root_is_purelib":true,"stash_dir":".prefix","sys_path_entries":["."]}
@@ -0,0 +1,20 @@
1
+ packaging/__about__.py,sha256=j4B7IMMSqpUnYzcYd5H5WZlILXevD7Zm_n9lj_TROTw,726
2
+ packaging/__init__.py,sha256=6enbp5XgRfjBjsI9-bn00HjHf5TH21PDMOKkJW8xw-w,562
3
+ packaging/_compat.py,sha256=MXdsGpSE_W-ZrHoC87andI4LV2FAwU7HLL-eHe_CjhU,1128
4
+ packaging/_structures.py,sha256=ozkCX8Q8f2qE1Eic3YiQ4buDVfgz2iYevY9e7R2y3iY,2022
5
+ packaging/_typing.py,sha256=x59EhQ57TMT-kTRyLZV25HZvYGGwbucTo6iKh_O0tMw,1812
6
+ packaging/markers.py,sha256=4ZyE7J0_j6Vj-3A13sKdirWa6ZIwQfOhXk9GsEtbuvw,9766
7
+ packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ packaging/requirements.py,sha256=mltyb1A8XamaZeRtKuzVn0Rk5q7gMPG3V-lvv_cXwDA,5413
9
+ packaging/specifiers.py,sha256=RaxQ-JKyCqI5QBm6gDvboZ2K6jjLVd-pxq0kvYf28kc,32208
10
+ packaging/tags.py,sha256=BMEL_3W3E8nXK_AXAWqmlYccsvoznFKkTBkTPR48DB8,29561
11
+ packaging/utils.py,sha256=5vUxwCVYSmaNJFgd7KaCBpxHXQN89KIvRLvCsDzao0k,4385
12
+ packaging/version.py,sha256=t7FpsZKmDncMn6EG28dEu_5NBZUa9_HVoiG-fsDo3oc,15974
13
+ packaging-20.9.dist-info/LICENSE,sha256=ytHvW9NA1z4HS6YU0m996spceUDD2MNIUuZcSQlobEg,197
14
+ packaging-20.9.dist-info/LICENSE.APACHE,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174
15
+ packaging-20.9.dist-info/LICENSE.BSD,sha256=tw5-m3QvHMb5SLNMFqo5_-zpQZY2S8iP8NIYDwAo-sU,1344
16
+ packaging-20.9.dist-info/METADATA,sha256=rLxNembuaMRrFbibyM7Twl76eRsNmPlHYPm2URn1o0s,13299
17
+ packaging-20.9.dist-info/WHEEL,sha256=Z-nyYpwrcSqxfdux5Mbn_DQ525iP7J2DG3JgGvOYyTQ,110
18
+ packaging-20.9.dist-info/top_level.txt,sha256=zFdHrhWnPslzsiP455HutQsqPB6v0KCtNUMtUtrefDw,10
19
+ packaging-20.9.dist-info/RECORD,,
20
+ packaging-20.9.pex-info/original-whl-info.json,sha256=LfxX9D2qg_rTtBO9M27q1I086FpdjJ4Vq_fBWUpIrbE,1237
@@ -0,0 +1 @@
1
+ {"entries":[["packaging/__about__.py",[2021,1,29,20,22,48],2175008768],["packaging/__init__.py",[2020,12,11,23,44,40],2175008768],["packaging/_compat.py",[2020,5,2,17,34,34],2175008768],["packaging/_structures.py",[2019,10,5,0,21,0],2175008768],["packaging/_typing.py",[2020,5,2,17,34,34],2175008768],["packaging/markers.py",[2021,1,25,2,19,6],2175008768],["packaging/py.typed",[2019,11,8,18,53,20],2175008768],["packaging/requirements.py",[2021,1,25,2,19,6],2175008768],["packaging/specifiers.py",[2021,1,25,2,19,6],2175008768],["packaging/tags.py",[2021,1,25,2,19,6],2175008768],["packaging/utils.py",[2021,1,29,3,13,40],2175008768],["packaging/version.py",[2020,11,14,0,44,2],2175008768],["packaging-20.9.dist-info/LICENSE",[2021,1,29,20,22,56],2175008768],["packaging-20.9.dist-info/LICENSE.APACHE",[2021,1,29,20,22,56],2175008768],["packaging-20.9.dist-info/LICENSE.BSD",[2021,1,29,20,22,56],2175008768],["packaging-20.9.dist-info/METADATA",[2021,1,29,20,22,56],2175008768],["packaging-20.9.dist-info/WHEEL",[2021,1,29,20,22,56],2175008768],["packaging-20.9.dist-info/top_level.txt",[2021,1,29,20,22,56],2175008768],["packaging-20.9.dist-info/RECORD",[2021,1,29,20,22,56],28573696]],"filename":"packaging-20.9-py2.py3-none-any.whl"}
@@ -0,0 +1,7 @@
1
+ pyparsing.py,sha256=oxX_ZOz8t-eros-UWY7nJgcdUgD-rQ53Ck0qp7_v3Ig,273365
2
+ pyparsing-2.4.7.dist-info/LICENSE,sha256=ENUSChaAWAT_2otojCIL-06POXQbVzIGBNRVowngGXI,1023
3
+ pyparsing-2.4.7.dist-info/METADATA,sha256=Ry40soZZiZrAkSMQT_KU1_1REe6FKa5UWzbT6YA8Mxs,3636
4
+ pyparsing-2.4.7.dist-info/WHEEL,sha256=kGT74LWyRUZrL4VgLh6_g12IeVl_9u9ZVhadrgXZUEY,110
5
+ pyparsing-2.4.7.dist-info/top_level.txt,sha256=eUOjGzJVhlQ3WS2rFAy2mN3LX_7FKTM5GSJ04jfnLmU,10
6
+ pyparsing-2.4.7.dist-info/RECORD,,
7
+ pyparsing-2.4.7.pex-info/original-whl-info.json,sha256=u4VqXTrVJm7IFikaLDH2Y39YxeWguQyq6K1iqnxk1HQ,458
@@ -0,0 +1 @@
1
+ {"entries":[["pyparsing.py",[2020,3,31,2,48,56],2176057344],["pyparsing-2.4.7.dist-info/LICENSE",[2020,4,5,22,19,32],2175008768],["pyparsing-2.4.7.dist-info/METADATA",[2020,4,5,22,19,32],2176057344],["pyparsing-2.4.7.dist-info/WHEEL",[2020,4,5,22,19,32],2176057344],["pyparsing-2.4.7.dist-info/top_level.txt",[2020,4,5,22,19,32],2175008768],["pyparsing-2.4.7.dist-info/RECORD",[2020,4,5,22,19,32],28573696]],"filename":"pyparsing-2.4.7-py2.py3-none-any.whl"}
@@ -1 +1 @@
1
- {"fingerprint": "84b4c176f8bac2d9fc042dd1618394580af666252a61e1d88544b4f6bbf66523", "record_relpath": "packaging-21.3.dist-info/RECORD", "root_is_purelib": true, "stash_dir": ".prefix"}
1
+ {"fingerprint":"cb292a10d66bc05830548f9ae6da7d06b33cda7955eccb68a065436b119fefac","record_relpath":"packaging-21.3.dist-info/RECORD","root_is_purelib":true,"stash_dir":".prefix","sys_path_entries":["."]}
@@ -0,0 +1,20 @@
1
+ packaging/__about__.py,sha256=ugASIO2w1oUyH8_COqQ2X_s0rDhjbhQC3yJocD03h2c,661
2
+ packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497
3
+ packaging/_manylinux.py,sha256=XcbiXB-qcjv3bcohp6N98TMpOP4_j3m-iOA8ptK2GWY,11488
4
+ packaging/_musllinux.py,sha256=_KGgY_qc7vhMGpoqss25n2hiLCNKRtvz9mCrS7gkqyc,4378
5
+ packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431
6
+ packaging/markers.py,sha256=DQY_Q3tWQ4FQSLQTa3oM40cxkivEDOHhDL7CfKFMRFw,8781
7
+ packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ packaging/requirements.py,sha256=NT4ek1vbyuC1yuYOrOK-tnpX-5b2oMWx2RRS9HsXyFw,4973
9
+ packaging/specifiers.py,sha256=LRQ0kFsHrl5qfcFNEEJrIFYsnIHQUJXY9fIsakTrrqE,30110
10
+ packaging/tags.py,sha256=lmsnGNiJ8C4D_Pf9PbM0qgbZvD9kmB9lpZBQUZa3R_Y,15699
11
+ packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200
12
+ packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665
13
+ packaging-21.3.dist-info/LICENSE,sha256=ytHvW9NA1z4HS6YU0m996spceUDD2MNIUuZcSQlobEg,197
14
+ packaging-21.3.dist-info/LICENSE.APACHE,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174
15
+ packaging-21.3.dist-info/LICENSE.BSD,sha256=tw5-m3QvHMb5SLNMFqo5_-zpQZY2S8iP8NIYDwAo-sU,1344
16
+ packaging-21.3.dist-info/METADATA,sha256=KuKIy6qDLP3svIt6ejCbxBDhvq11ebkgUN55MeyKFyc,15147
17
+ packaging-21.3.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92
18
+ packaging-21.3.dist-info/top_level.txt,sha256=zFdHrhWnPslzsiP455HutQsqPB6v0KCtNUMtUtrefDw,10
19
+ packaging-21.3.dist-info/RECORD,,
20
+ packaging-21.3.pex-info/original-whl-info.json,sha256=cHaQy2j4tTYmpq7kGSoHe5O1p3G4rSedLZ5ByxG_2zw,1244
@@ -0,0 +1 @@
1
+ {"entries":[["packaging/__about__.py",[2021,11,18,0,38,54],2175008768],["packaging/__init__.py",[2021,2,12,20,13,2],2175008768],["packaging/_manylinux.py",[2021,7,1,21,38,24],2175008768],["packaging/_musllinux.py",[2021,11,16,16,25,30],2175008768],["packaging/_structures.py",[2021,11,16,16,25,30],2175008768],["packaging/markers.py",[2021,2,12,20,13,2],2175008768],["packaging/py.typed",[2019,11,8,18,53,20],2175008768],["packaging/requirements.py",[2021,2,12,20,13,2],2175008768],["packaging/specifiers.py",[2021,11,16,16,25,30],2175008768],["packaging/tags.py",[2021,11,16,16,25,30],2175008768],["packaging/utils.py",[2021,6,19,18,45,38],2175008768],["packaging/version.py",[2021,2,12,20,13,2],2175008768],["packaging-21.3.dist-info/LICENSE",[2021,11,18,0,39,0],2175008768],["packaging-21.3.dist-info/LICENSE.APACHE",[2021,11,18,0,39,0],2175008768],["packaging-21.3.dist-info/LICENSE.BSD",[2021,11,18,0,39,0],2175008768],["packaging-21.3.dist-info/METADATA",[2021,11,18,0,39,0],2175008768],["packaging-21.3.dist-info/WHEEL",[2021,11,18,0,39,0],2175008768],["packaging-21.3.dist-info/top_level.txt",[2021,11,18,0,39,0],2175008768],["packaging-21.3.dist-info/RECORD",[2021,11,18,0,39,0],28573696]],"filename":"packaging-21.3-py3-none-any.whl"}
@@ -0,0 +1,18 @@
1
+ pyparsing/__init__.py,sha256=EguTHn-CBY6m15vm0jKxaGHdLgqIt7nwCIkVwbOfSbM,9095
2
+ pyparsing/actions.py,sha256=60v7mETOBzc01YPH_qQD5isavgcSJpAfIKpzgjM3vaU,6429
3
+ pyparsing/common.py,sha256=lFL97ooIeR75CmW5hjURZqwDCTgruqltcTCZ-ulLO2Q,12936
4
+ pyparsing/core.py,sha256=KQEemy1LU-uwf_8MRB-NhGqcSvW8iJqgYky2Ez5KmkI,212214
5
+ pyparsing/exceptions.py,sha256=H4D9gqMavqmAFSsdrU_J6bO-jA-T-A7yvtXWZpooIUA,9030
6
+ pyparsing/helpers.py,sha256=kqpIZFG-y0fQ3g_TmloYllo9we6YCYiewZMXIK0y5wc,38299
7
+ pyparsing/results.py,sha256=4D-oURF1cLeL7k0d3zMqUuWH_gTjop_OrZwik9O0HXU,25339
8
+ pyparsing/testing.py,sha256=szs8AKZREZMhL0y0vsMfaTVAnpqPHetg6VKJBNmc4QY,13388
9
+ pyparsing/unicode.py,sha256=IR-ioeGY29cZ49tG8Ts7ITPWWNP5G2DcZs58oa8zn44,10381
10
+ pyparsing/util.py,sha256=kq772O5YSeXOSdP-M31EWpbH_ayj7BMHImBYo9xPD5M,6805
11
+ pyparsing/diagram/__init__.py,sha256=HgXKfDWj11krDF6LhpP5pXPxjMT63M8G46rAOnn816w,22450
12
+ pyparsing/diagram/template.jinja2,sha256=SfQ8SLktSBqI5W1DGcUVH1vdflRD6x2sQBApxrcNg7s,589
13
+ pyparsing-3.0.7.dist-info/LICENSE,sha256=ENUSChaAWAT_2otojCIL-06POXQbVzIGBNRVowngGXI,1023
14
+ pyparsing-3.0.7.dist-info/METADATA,sha256=w1anBp3KPsXUNknLll-Sg-kL-qPowO-djCrONTvVkHA,4205
15
+ pyparsing-3.0.7.dist-info/WHEEL,sha256=OqRkF0eY5GHssMorFjlbTIq072vpHpF60fIQA6lS9xA,92
16
+ pyparsing-3.0.7.dist-info/top_level.txt,sha256=eUOjGzJVhlQ3WS2rFAy2mN3LX_7FKTM5GSJ04jfnLmU,10
17
+ pyparsing-3.0.7.dist-info/RECORD,,
18
+ pyparsing-3.0.7.pex-info/original-whl-info.json,sha256=hznFZyN7QJXBMZBH1g49eG-efp3XOqD08pLrRvX2Ibo,1103
@@ -0,0 +1 @@
1
+ {"entries":[["pyparsing/__init__.py",[2022,1,20,22,11,34],2176057344],["pyparsing/actions.py",[2021,10,2,5,27,50],2176057344],["pyparsing/common.py",[2021,10,23,2,39,52],2176057344],["pyparsing/core.py",[2022,1,20,22,11,34],2176057344],["pyparsing/exceptions.py",[2021,11,7,17,32,54],2176057344],["pyparsing/helpers.py",[2022,1,20,22,11,34],2176057344],["pyparsing/results.py",[2022,1,20,22,11,34],2176057344],["pyparsing/testing.py",[2021,10,30,8,26,30],2176057344],["pyparsing/unicode.py",[2022,1,20,22,11,34],2176057344],["pyparsing/util.py",[2022,1,20,22,11,34],2176057344],["pyparsing/diagram/__init__.py",[2021,10,30,8,26,30],2176057344],["pyparsing/diagram/template.jinja2",[2020,12,23,3,53,56],2176057344],["pyparsing-3.0.7.dist-info/LICENSE",[2022,1,21,4,9,38],2176057344],["pyparsing-3.0.7.dist-info/METADATA",[2022,1,21,4,9,38],2176057344],["pyparsing-3.0.7.dist-info/WHEEL",[2022,1,21,4,9,38],2176057344],["pyparsing-3.0.7.dist-info/top_level.txt",[2022,1,21,4,9,38],2176057344],["pyparsing-3.0.7.dist-info/RECORD",[2022,1,21,4,9,38],28573696]],"filename":"pyparsing-3.0.7-py3-none-any.whl"}
@@ -1 +1 @@
1
- {"fingerprint": "2752c146bc83b54ff1b8e075b9c0be67eb08afa19a3b140c4bd6455ea71fab5e", "record_relpath": "packaging-24.0.dist-info/RECORD", "root_is_purelib": true, "stash_dir": ".prefix"}
1
+ {"fingerprint":"2688e613bb54c0b61a1c101acb2aa489d06d2c524bfc9502c56768eedeb2f6eb","record_relpath":"packaging-24.0.dist-info/RECORD","root_is_purelib":true,"stash_dir":".prefix","sys_path_entries":["."]}
@@ -0,0 +1,22 @@
1
+ packaging/__init__.py,sha256=UzotcV07p8vcJzd80S-W0srhgY8NMVD_XvJcZ7JN-tA,496
2
+ packaging/_elffile.py,sha256=hbmK8OD6Z7fY6hwinHEUcD1by7czkGiNYu7ShnFEk2k,3266
3
+ packaging/_manylinux.py,sha256=1ng_TqyH49hY6s3W_zVHyoJIaogbJqbIF1jJ0fAehc4,9590
4
+ packaging/_musllinux.py,sha256=kgmBGLFybpy8609-KTvzmt2zChCPWYvhp5BWP4JX7dE,2676
5
+ packaging/_parser.py,sha256=zlsFB1FpMRjkUdQb6WLq7xON52ruQadxFpYsDXWhLb4,10347
6
+ packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431
7
+ packaging/_tokenizer.py,sha256=alCtbwXhOFAmFGZ6BQ-wCTSFoRAJ2z-ysIf7__MTJ_k,5292
8
+ packaging/markers.py,sha256=eH-txS2zq1HdNpTd9LcZUcVIwewAiNU0grmq5wjKnOk,8208
9
+ packaging/metadata.py,sha256=w7jPEg6mDf1FTZMn79aFxFuk4SKtynUJtxr2InTxlV4,33036
10
+ packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ packaging/requirements.py,sha256=dgoBeVprPu2YE6Q8nGfwOPTjATHbRa_ZGLyXhFEln6Q,2933
12
+ packaging/specifiers.py,sha256=dB2DwbmvSbEuVilEyiIQ382YfW5JfwzXTfRRPVtaENY,39784
13
+ packaging/tags.py,sha256=fedHXiOHkBxNZTXotXv8uXPmMFU9ae-TKBujgYHigcA,18950
14
+ packaging/utils.py,sha256=XgdmP3yx9-wQEFjO7OvMj9RjEf5JlR5HFFR69v7SQ9E,5268
15
+ packaging/version.py,sha256=XjRBLNK17UMDgLeP8UHnqwiY3TdSi03xFQURtec211A,16236
16
+ packaging-24.0.dist-info/LICENSE,sha256=ytHvW9NA1z4HS6YU0m996spceUDD2MNIUuZcSQlobEg,197
17
+ packaging-24.0.dist-info/LICENSE.APACHE,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174
18
+ packaging-24.0.dist-info/LICENSE.BSD,sha256=tw5-m3QvHMb5SLNMFqo5_-zpQZY2S8iP8NIYDwAo-sU,1344
19
+ packaging-24.0.dist-info/WHEEL,sha256=EZbGkh7Ie4PoZfRQ8I0ZuP9VklN_TvcZ6DSE5Uar4z4,81
20
+ packaging-24.0.dist-info/METADATA,sha256=0dESdhY_wHValuOrbgdebiEw04EbX4dkujlxPdEsFus,3203
21
+ packaging-24.0.dist-info/RECORD,,
22
+ packaging-24.0.pex-info/original-whl-info.json,sha256=Lo36t6W9UqFYPvWib0F-dHl5YKZzvKJxlUOOECsWWMM,1328
@@ -0,0 +1 @@
1
+ {"entries":[["packaging/__init__.py",[2024,3,10,9,38,56],2175008768],["packaging/_elffile.py",[2023,1,30,15,29,48],2175008768],["packaging/_manylinux.py",[2024,3,10,9,34,40],2175008768],["packaging/_musllinux.py",[2023,10,1,13,58,58],2175008768],["packaging/_parser.py",[2024,3,10,9,34,40],2175008768],["packaging/_structures.py",[2023,1,30,15,29,48],2175008768],["packaging/_tokenizer.py",[2023,4,12,17,5,6],2175008768],["packaging/markers.py",[2023,4,12,17,5,28],2175008768],["packaging/metadata.py",[2024,1,6,20,39,22],2175008768],["packaging/py.typed",[2023,1,30,15,29,48],2175008768],["packaging/requirements.py",[2024,3,10,9,34,40],2175008768],["packaging/specifiers.py",[2024,3,10,9,34,40],2175008768],["packaging/tags.py",[2024,1,6,20,39,22],2175008768],["packaging/utils.py",[2023,10,1,13,58,58],2175008768],["packaging/version.py",[2023,10,1,13,58,58],2175008768],["packaging-24.0.dist-info/LICENSE",[2021,7,23,8,28,26],2175008768],["packaging-24.0.dist-info/LICENSE.APACHE",[2021,7,23,8,28,26],2175008768],["packaging-24.0.dist-info/LICENSE.BSD",[2021,7,23,8,28,26],2175008768],["packaging-24.0.dist-info/WHEEL",[2016,1,1,0,0,0],2175008768],["packaging-24.0.dist-info/METADATA",[2016,1,1,0,0,0],2175008768],["packaging-24.0.dist-info/RECORD",[2016,1,1,0,0,0],2175008768]],"filename":"packaging-24.0-py3-none-any.whl"}
@@ -1 +1 @@
1
- {"fingerprint": "4390b6077435abbfa59ee50812f10d070650a9169b2bac4c0885764cbc6d2453", "record_relpath": "packaging-25.0.dist-info/RECORD", "root_is_purelib": true, "stash_dir": ".prefix"}
1
+ {"fingerprint":"c042647020954d0559e1bc7ae62bb4c2e5d6c586504b564a397a16b1fabd5f96","record_relpath":"packaging-25.0.dist-info/RECORD","root_is_purelib":true,"stash_dir":".prefix","sys_path_entries":["."]}
@@ -0,0 +1,24 @@
1
+ packaging/__init__.py,sha256=_0cDiPVf2S-bNfVmZguxxzmrIYWlyASxpqph4qsJWUc,494
2
+ packaging/_elffile.py,sha256=UkrbDtW7aeq3qqoAfU16ojyHZ1xsTvGke_WqMTKAKd0,3286
3
+ packaging/_manylinux.py,sha256=t4y_-dTOcfr36gLY-ztiOpxxJFGO2ikC11HgfysGxiM,9596
4
+ packaging/_musllinux.py,sha256=p9ZqNYiOItGee8KcZFeHF_YcdhVwGHdK6r-8lgixvGQ,2694
5
+ packaging/_parser.py,sha256=gYfnj0pRHflVc4RHZit13KNTyN9iiVcU2RUCGi22BwM,10221
6
+ packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431
7
+ packaging/_tokenizer.py,sha256=OYzt7qKxylOAJ-q0XyK1qAycyPRYLfMPdGQKRXkZWyI,5310
8
+ packaging/markers.py,sha256=P0we27jm1xUzgGMJxBjtUFCIWeBxTsMeJTOJ6chZmAY,12049
9
+ packaging/metadata.py,sha256=8IZErqQQnNm53dZZuYq4FGU4_dpyinMeH1QFBIWIkfE,34739
10
+ packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ packaging/requirements.py,sha256=gYyRSAdbrIyKDY66ugIDUQjRMvxkH2ALioTmX3tnL6o,2947
12
+ packaging/specifiers.py,sha256=gtPu5DTc-F9baLq3FTGEK6dPhHGCuwwZetaY0PSV2gs,40055
13
+ packaging/tags.py,sha256=41s97W9Zatrq2Ed7Rc3qeBDaHe8pKKvYq2mGjwahfXk,22745
14
+ packaging/utils.py,sha256=0F3Hh9OFuRgrhTgGZUl5K22Fv1YP2tZl1z_2gO6kJiA,5050
15
+ packaging/version.py,sha256=olfyuk_DPbflNkJ4wBWetXQ17c74x3DB501degUv7DY,16676
16
+ packaging/licenses/__init__.py,sha256=mMl06HTXljKnwrshid3C9pSh_5lSDsx2ArhVR66m1iI,5893
17
+ packaging/licenses/_spdx.py,sha256=oAm1ztPFwlsmCKe7lAAsv_OIOfS1cWDu9bNBkeu-2ns,48398
18
+ packaging-25.0.dist-info/licenses/LICENSE,sha256=ytHvW9NA1z4HS6YU0m996spceUDD2MNIUuZcSQlobEg,197
19
+ packaging-25.0.dist-info/licenses/LICENSE.APACHE,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174
20
+ packaging-25.0.dist-info/licenses/LICENSE.BSD,sha256=tw5-m3QvHMb5SLNMFqo5_-zpQZY2S8iP8NIYDwAo-sU,1344
21
+ packaging-25.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
22
+ packaging-25.0.dist-info/METADATA,sha256=W2EaYJw4_vw9YWv0XSCuyY-31T8kXayp4sMPyFx6woI,3281
23
+ packaging-25.0.dist-info/RECORD,,
24
+ packaging-25.0.pex-info/original-whl-info.json,sha256=uXOqEQcWzymvMM-zwg1pqwsx2d6SLLvxcQIEHu9DShI,1490
@@ -0,0 +1 @@
1
+ {"entries":[["packaging/__init__.py",[2025,4,19,12,48,36],2175008768],["packaging/_elffile.py",[2025,4,19,12,45,16],2175008768],["packaging/_manylinux.py",[2025,4,19,12,45,16],2175008768],["packaging/_musllinux.py",[2024,6,10,0,16,42],2175008768],["packaging/_parser.py",[2025,4,19,12,45,16],2175008768],["packaging/_structures.py",[2024,3,10,10,7,16],2175008768],["packaging/_tokenizer.py",[2025,4,19,12,45,16],2175008768],["packaging/markers.py",[2025,4,19,12,45,16],2175008768],["packaging/metadata.py",[2025,4,19,12,45,16],2175008768],["packaging/py.typed",[2023,1,30,15,29,48],2175008768],["packaging/requirements.py",[2024,6,10,0,16,42],2175008768],["packaging/specifiers.py",[2025,4,19,12,45,16],2175008768],["packaging/tags.py",[2025,4,19,12,45,16],2175008768],["packaging/utils.py",[2024,11,8,9,41,38],2175008768],["packaging/version.py",[2024,11,8,9,41,38],2175008768],["packaging/licenses/__init__.py",[2025,4,19,12,45,16],2175008768],["packaging/licenses/_spdx.py",[2024,11,8,9,41,38],2175008768],["packaging-25.0.dist-info/licenses/LICENSE",[2021,7,23,8,28,26],2175008768],["packaging-25.0.dist-info/licenses/LICENSE.APACHE",[2021,7,23,8,28,26],2175008768],["packaging-25.0.dist-info/licenses/LICENSE.BSD",[2021,7,23,8,28,26],2175008768],["packaging-25.0.dist-info/WHEEL",[2016,1,1,0,0,0],2175008768],["packaging-25.0.dist-info/METADATA",[2016,1,1,0,0,0],2175008768],["packaging-25.0.dist-info/RECORD",[2016,1,1,0,0,0],2175008768]],"filename":"packaging-25.0-py3-none-any.whl"}
@@ -1 +1 @@
1
- {"fingerprint": "41d61b8d13d898e82f6a921c03b5f6aa90a2e835922ed84a9d811cf61e1d364d", "record_relpath": "pip-20.3.4.dist-info/RECORD", "root_is_purelib": true, "stash_dir": ".prefix"}
1
+ {"fingerprint":"93065fed46b0a0db8737c4a33aa24819d527ace9c84e9cdb8f9e41e9e2bd926a","record_relpath":"pip-20.3.4.dist-info/RECORD","root_is_purelib":true,"stash_dir":".prefix","sys_path_entries":["."]}