pex 2.61.1__py2.py3-none-any.whl → 2.62.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 (44) hide show
  1. pex/docs/html/_pagefind/fragment/en_19d749c.pf_fragment +0 -0
  2. pex/docs/html/_pagefind/fragment/en_358f3c1.pf_fragment +0 -0
  3. pex/docs/html/_pagefind/fragment/{en_bf32fcd.pf_fragment → en_4a62b9a.pf_fragment} +0 -0
  4. pex/docs/html/_pagefind/fragment/{en_c9714ee.pf_fragment → en_5c1928c.pf_fragment} +0 -0
  5. pex/docs/html/_pagefind/fragment/en_a6b0f05.pf_fragment +0 -0
  6. pex/docs/html/_pagefind/fragment/en_a77f515.pf_fragment +0 -0
  7. pex/docs/html/_pagefind/fragment/en_ed65506.pf_fragment +0 -0
  8. pex/docs/html/_pagefind/fragment/en_f5aab8f.pf_fragment +0 -0
  9. pex/docs/html/_pagefind/index/en_856ae3c.pf_index +0 -0
  10. pex/docs/html/_pagefind/pagefind-entry.json +1 -1
  11. pex/docs/html/_pagefind/pagefind.en_92d55346bf.pf_meta +0 -0
  12. pex/docs/html/_static/documentation_options.js +1 -1
  13. pex/docs/html/api/vars.html +5 -5
  14. pex/docs/html/buildingpex.html +5 -5
  15. pex/docs/html/genindex.html +5 -5
  16. pex/docs/html/index.html +5 -5
  17. pex/docs/html/recipes.html +5 -5
  18. pex/docs/html/scie.html +5 -5
  19. pex/docs/html/search.html +5 -5
  20. pex/docs/html/whatispex.html +5 -5
  21. pex/resolve/locker.py +6 -51
  22. pex/resolve/locker_patches.py +123 -209
  23. pex/resolve/lockfile/create.py +9 -10
  24. pex/resolve/lockfile/targets.py +292 -26
  25. pex/resolve/requirement_configuration.py +15 -8
  26. pex/resolve/target_system.py +512 -119
  27. pex/resolver.py +181 -90
  28. pex/venv/venv_pex.py +1 -1
  29. pex/version.py +1 -1
  30. {pex-2.61.1.dist-info → pex-2.62.0.dist-info}/METADATA +4 -4
  31. {pex-2.61.1.dist-info → pex-2.62.0.dist-info}/RECORD +36 -36
  32. pex/docs/html/_pagefind/fragment/en_245699a.pf_fragment +0 -0
  33. pex/docs/html/_pagefind/fragment/en_4695b51.pf_fragment +0 -0
  34. pex/docs/html/_pagefind/fragment/en_57f2ab1.pf_fragment +0 -0
  35. pex/docs/html/_pagefind/fragment/en_aefc110.pf_fragment +0 -0
  36. pex/docs/html/_pagefind/fragment/en_b7fad62.pf_fragment +0 -0
  37. pex/docs/html/_pagefind/fragment/en_e6c0aae.pf_fragment +0 -0
  38. pex/docs/html/_pagefind/index/en_7e57d09.pf_index +0 -0
  39. pex/docs/html/_pagefind/pagefind.en_c578c4b677.pf_meta +0 -0
  40. {pex-2.61.1.dist-info → pex-2.62.0.dist-info}/WHEEL +0 -0
  41. {pex-2.61.1.dist-info → pex-2.62.0.dist-info}/entry_points.txt +0 -0
  42. {pex-2.61.1.dist-info → pex-2.62.0.dist-info}/licenses/LICENSE +0 -0
  43. {pex-2.61.1.dist-info → pex-2.62.0.dist-info}/pylock/pylock.toml +0 -0
  44. {pex-2.61.1.dist-info → pex-2.62.0.dist-info}/top_level.txt +0 -0
pex/resolver.py CHANGED
@@ -150,9 +150,9 @@ class DownloadTarget(object):
150
150
  return self.target.id
151
151
 
152
152
 
153
- def _uniqued_targets(targets=None):
154
- # type: (Optional[Iterable[DownloadTarget]]) -> Tuple[DownloadTarget, ...]
155
- return tuple(OrderedSet(targets)) if targets is not None else ()
153
+ def _uniqued_download_requests(requests=None):
154
+ # type: (Optional[Iterable[DownloadRequest]]) -> Tuple[DownloadRequest, ...]
155
+ return tuple(OrderedSet(requests)) if requests is not None else ()
156
156
 
157
157
 
158
158
  @attr.s(frozen=True)
@@ -239,12 +239,9 @@ class PipLogManager(object):
239
239
 
240
240
 
241
241
  @attr.s(frozen=True)
242
- class DownloadRequest(object):
243
- download_targets = attr.ib(converter=_uniqued_targets) # type: Tuple[DownloadTarget, ...]
242
+ class _DownloadSession(object):
243
+ requests = attr.ib(converter=_uniqued_download_requests) # type: Tuple[DownloadRequest, ...]
244
244
  direct_requirements = attr.ib() # type: Iterable[ParsedRequirement]
245
- requirements = attr.ib(default=None) # type: Optional[Iterable[str]]
246
- requirement_files = attr.ib(default=None) # type: Optional[Iterable[str]]
247
- constraint_files = attr.ib(default=None) # type: Optional[Iterable[str]]
248
245
  allow_prereleases = attr.ib(default=False) # type: bool
249
246
  transitive = attr.ib(default=True) # type: bool
250
247
  package_index_configuration = attr.ib(default=None) # type: Optional[PackageIndexConfiguration]
@@ -261,9 +258,9 @@ class DownloadRequest(object):
261
258
  # type: () -> Iterator[BuildRequest]
262
259
  for requirement in self.direct_requirements:
263
260
  if isinstance(requirement, LocalProjectRequirement):
264
- for download_target in self.download_targets:
261
+ for request in self.requests:
265
262
  yield BuildRequest.for_directory(
266
- target=download_target.target,
263
+ target=request.target,
267
264
  source_path=requirement.path,
268
265
  resolver=self.resolver,
269
266
  pip_version=self.pip_version,
@@ -271,7 +268,7 @@ class DownloadRequest(object):
271
268
 
272
269
  def download_distributions(self, dest=None, max_parallel_jobs=None):
273
270
  # type: (...) -> List[DownloadResult]
274
- if not self.requirements and not self.requirement_files:
271
+ if not self.requests or not any(request.has_requirements for request in self.requests):
275
272
  # Nothing to resolve.
276
273
  return []
277
274
 
@@ -279,48 +276,32 @@ class DownloadRequest(object):
279
276
  prefix="resolver_download.", dir=safe_mkdir(CacheDir.DOWNLOADS.path(".tmp"))
280
277
  )
281
278
 
282
- log_manager = PipLogManager.create(self.pip_log, self.download_targets)
279
+ log_manager = PipLogManager.create(
280
+ self.pip_log,
281
+ download_targets=tuple(request.download_target for request in self.requests),
282
+ )
283
283
  if self.pip_log and not self.pip_log.user_specified:
284
284
  TRACER.log(
285
285
  "Preserving `pip download` log at {log_path}".format(log_path=self.pip_log.path),
286
286
  V=ENV.PEX_VERBOSE,
287
287
  )
288
288
 
289
- requirement_config = RequirementConfiguration(
290
- requirements=self.requirements,
291
- requirement_files=self.requirement_files,
292
- constraint_files=self.constraint_files,
293
- )
294
- network_configuration = (
295
- self.package_index_configuration.network_configuration
296
- if self.package_index_configuration
297
- else None
298
- )
299
- subdirectory_by_filename = {} # type: Dict[str, str]
300
- for parsed_requirement in requirement_config.parse_requirements(network_configuration):
301
- if not isinstance(parsed_requirement, URLRequirement):
302
- continue
303
- subdirectory = parsed_requirement.subdirectory
304
- if subdirectory:
305
- subdirectory_by_filename[parsed_requirement.filename] = subdirectory
306
-
307
289
  spawn_download = functools.partial(
308
290
  self._spawn_download,
309
291
  resolved_dists_dir=dest,
310
292
  log_manager=log_manager,
311
- subdirectory_by_filename=subdirectory_by_filename,
312
293
  )
313
294
  with TRACER.timed(
314
295
  "Resolving for:\n {}".format(
315
- "\n ".join(target.render_description() for target in self.download_targets)
296
+ "\n ".join(request.render_description() for request in self.requests)
316
297
  )
317
298
  ):
318
299
  try:
319
300
  return list(
320
301
  execute_parallel(
321
- inputs=self.download_targets,
302
+ inputs=self.requests,
322
303
  spawn_func=spawn_download,
323
- error_handler=Raise[DownloadTarget, DownloadResult](Unsatisfiable),
304
+ error_handler=Raise[DownloadRequest, DownloadResult](Unsatisfiable),
324
305
  max_jobs=max_parallel_jobs,
325
306
  )
326
307
  )
@@ -329,13 +310,31 @@ class DownloadRequest(object):
329
310
 
330
311
  def _spawn_download(
331
312
  self,
332
- download_target, # type: DownloadTarget
313
+ request, # type: DownloadRequest
333
314
  resolved_dists_dir, # type: str
334
315
  log_manager, # type: PipLogManager
335
- subdirectory_by_filename, # type: Mapping[str, str]
336
316
  ):
337
317
  # type: (...) -> SpawnedJob[DownloadResult]
338
318
 
319
+ requirement_config = RequirementConfiguration(
320
+ requirements=request.requirements,
321
+ requirement_files=request.requirement_files,
322
+ constraint_files=request.constraint_files,
323
+ )
324
+ network_configuration = (
325
+ self.package_index_configuration.network_configuration
326
+ if self.package_index_configuration
327
+ else None
328
+ )
329
+ subdirectory_by_filename = {} # type: Dict[str, str]
330
+ for parsed_requirement in requirement_config.parse_requirements(network_configuration):
331
+ if not isinstance(parsed_requirement, URLRequirement):
332
+ continue
333
+ subdirectory = parsed_requirement.subdirectory
334
+ if subdirectory:
335
+ subdirectory_by_filename[parsed_requirement.filename] = subdirectory
336
+
337
+ download_target = request.download_target
339
338
  download_dir = os.path.join(resolved_dists_dir, download_target.id(complete=True))
340
339
  observer = (
341
340
  self.observer.observe_download(
@@ -358,9 +357,9 @@ class DownloadRequest(object):
358
357
  ),
359
358
  ).spawn_download_distributions(
360
359
  download_dir=download_dir,
361
- requirements=self.requirements,
362
- requirement_files=self.requirement_files,
363
- constraint_files=self.constraint_files,
360
+ requirements=request.requirements,
361
+ requirement_files=request.requirement_files,
362
+ constraint_files=request.constraint_files,
364
363
  allow_prereleases=self.allow_prereleases,
365
364
  transitive=self.transitive,
366
365
  target=target,
@@ -1315,7 +1314,7 @@ def _parse_reqs(
1315
1314
  requirement_files=None, # type: Optional[Iterable[str]]
1316
1315
  network_configuration=None, # type: Optional[NetworkConfiguration]
1317
1316
  ):
1318
- # type: (...) -> Iterable[ParsedRequirement]
1317
+ # type: (...) -> Tuple[ParsedRequirement, ...]
1319
1318
  requirement_configuration = RequirementConfiguration(
1320
1319
  requirements=requirements, requirement_files=requirement_files
1321
1320
  )
@@ -1382,6 +1381,23 @@ def resolve(
1382
1381
  :raises ValueError: If `build=False` and `use_wheel=False`.
1383
1382
  """
1384
1383
 
1384
+ if not build_configuration.allow_wheels:
1385
+ foreign_targets = [
1386
+ target
1387
+ for target in targets.unique_targets()
1388
+ if not isinstance(target, LocalInterpreter)
1389
+ ]
1390
+ if foreign_targets:
1391
+ raise ValueError(
1392
+ "Cannot ignore wheels (use_wheel=False) when resolving for foreign {platforms}: "
1393
+ "{foreign_platforms}".format(
1394
+ platforms=pluralize(foreign_targets, "platform"),
1395
+ foreign_platforms=", ".join(
1396
+ target.render_description() for target in foreign_targets
1397
+ ),
1398
+ )
1399
+ )
1400
+
1385
1401
  # A resolve happens in four stages broken into two phases:
1386
1402
  # 1. Download phase: resolves sdists and wheels in a single operation per distribution target.
1387
1403
  # 2. Install phase:
@@ -1423,29 +1439,19 @@ def resolve(
1423
1439
  keyring_provider=keyring_provider,
1424
1440
  )
1425
1441
 
1426
- if not build_configuration.allow_wheels:
1427
- foreign_targets = [
1428
- target
1429
- for target in targets.unique_targets()
1430
- if not isinstance(target, LocalInterpreter)
1431
- ]
1432
- if foreign_targets:
1433
- raise ValueError(
1434
- "Cannot ignore wheels (use_wheel=False) when resolving for foreign {platforms}: "
1435
- "{foreign_platforms}".format(
1436
- platforms=pluralize(foreign_targets, "platform"),
1437
- foreign_platforms=", ".join(
1438
- target.render_description() for target in foreign_targets
1439
- ),
1440
- )
1441
- )
1442
+ requests = tuple(
1443
+ DownloadRequest(
1444
+ download_target=DownloadTarget(target=target),
1445
+ requirements=requirements,
1446
+ requirement_files=requirement_files,
1447
+ constraint_files=constraint_files,
1448
+ )
1449
+ for target in targets.unique_targets()
1450
+ )
1442
1451
 
1443
1452
  build_requests, download_results = _download_internal(
1444
- targets=targets,
1453
+ requests=requests,
1445
1454
  direct_requirements=direct_requirements,
1446
- requirements=requirements,
1447
- requirement_files=requirement_files,
1448
- constraint_files=constraint_files,
1449
1455
  allow_prereleases=allow_prereleases,
1450
1456
  transitive=transitive,
1451
1457
  package_index_configuration=package_index_configuration,
@@ -1493,11 +1499,8 @@ def resolve(
1493
1499
 
1494
1500
 
1495
1501
  def _download_internal(
1496
- targets, # type: Targets
1502
+ requests, # type: Tuple[DownloadRequest, ...]
1497
1503
  direct_requirements, # type: Iterable[ParsedRequirement]
1498
- requirements=None, # type: Optional[Iterable[str]]
1499
- requirement_files=None, # type: Optional[Iterable[str]]
1500
- constraint_files=None, # type: Optional[Iterable[str]]
1501
1504
  allow_prereleases=False, # type: bool
1502
1505
  transitive=True, # type: bool
1503
1506
  package_index_configuration=None, # type: Optional[PackageIndexConfiguration]
@@ -1509,27 +1512,12 @@ def _download_internal(
1509
1512
  pip_version=None, # type: Optional[PipVersionValue]
1510
1513
  resolver=None, # type: Optional[Resolver]
1511
1514
  dependency_configuration=DependencyConfiguration(), # type: DependencyConfiguration
1512
- universal_targets=(), # type: Iterable[UniversalTarget]
1513
1515
  ):
1514
1516
  # type: (...) -> Tuple[List[BuildRequest], List[DownloadResult]]
1515
1517
 
1516
- unique_targets = targets.unique_targets()
1517
- if universal_targets:
1518
- production_assert(len(unique_targets) == 1)
1519
- target = unique_targets.pop()
1520
- download_targets = tuple(
1521
- DownloadTarget(target, universal_target=universal_target)
1522
- for universal_target in universal_targets
1523
- )
1524
- else:
1525
- download_targets = tuple(DownloadTarget(target) for target in unique_targets)
1526
-
1527
- download_request = DownloadRequest(
1528
- download_targets=download_targets,
1518
+ download_session = _DownloadSession(
1519
+ requests=requests,
1529
1520
  direct_requirements=direct_requirements,
1530
- requirements=requirements,
1531
- requirement_files=requirement_files,
1532
- constraint_files=constraint_files,
1533
1521
  allow_prereleases=allow_prereleases,
1534
1522
  transitive=transitive,
1535
1523
  package_index_configuration=package_index_configuration,
@@ -1541,8 +1529,8 @@ def _download_internal(
1541
1529
  dependency_configuration=dependency_configuration,
1542
1530
  )
1543
1531
 
1544
- local_projects = list(download_request.iter_local_projects())
1545
- download_results = download_request.download_distributions(
1532
+ local_projects = list(download_session.iter_local_projects())
1533
+ download_results = download_session.download_distributions(
1546
1534
  dest=dest, max_parallel_jobs=max_parallel_jobs
1547
1535
  )
1548
1536
  return local_projects, download_results
@@ -1602,7 +1590,6 @@ def download(
1602
1590
  extra_pip_requirements=(), # type: Tuple[Requirement, ...]
1603
1591
  keyring_provider=None, # type: Optional[str]
1604
1592
  dependency_configuration=DependencyConfiguration(), # type: DependencyConfiguration
1605
- universal_targets=(), # type: Iterable[UniversalTarget]
1606
1593
  ):
1607
1594
  # type: (...) -> Downloaded
1608
1595
  """Downloads all distributions needed to meet requirements for multiple distribution targets.
@@ -1632,7 +1619,114 @@ def download(
1632
1619
  :raises ValueError: If a foreign platform was provided in `platforms`, and `use_wheel=False`.
1633
1620
  :raises ValueError: If `build=False` and `use_wheel=False`.
1634
1621
  """
1635
- direct_requirements = _parse_reqs(requirements, requirement_files, network_configuration)
1622
+ return download_requests(
1623
+ requests=tuple(
1624
+ DownloadRequest(
1625
+ download_target=DownloadTarget(target),
1626
+ requirements=requirements,
1627
+ requirement_files=requirement_files,
1628
+ constraint_files=constraint_files,
1629
+ )
1630
+ for target in targets.unique_targets()
1631
+ ),
1632
+ direct_requirements=_parse_reqs(requirements, requirement_files, network_configuration),
1633
+ allow_prereleases=allow_prereleases,
1634
+ transitive=transitive,
1635
+ repos_configuration=repos_configuration,
1636
+ resolver_version=resolver_version,
1637
+ network_configuration=network_configuration,
1638
+ build_configuration=build_configuration,
1639
+ dest=dest,
1640
+ max_parallel_jobs=max_parallel_jobs,
1641
+ observer=observer,
1642
+ pip_log=pip_log,
1643
+ pip_version=pip_version,
1644
+ resolver=resolver,
1645
+ use_pip_config=use_pip_config,
1646
+ extra_pip_requirements=extra_pip_requirements,
1647
+ keyring_provider=keyring_provider,
1648
+ dependency_configuration=dependency_configuration,
1649
+ )
1650
+
1651
+
1652
+ def _as_str_tuple(items):
1653
+ # type: (Optional[Iterable[str]]) -> Tuple[str, ...]
1654
+ if not items:
1655
+ return ()
1656
+ return items if isinstance(items, tuple) else tuple(items)
1657
+
1658
+
1659
+ @attr.s(frozen=True)
1660
+ class DownloadRequest(object):
1661
+ @classmethod
1662
+ def create(
1663
+ cls,
1664
+ target, # type: Target
1665
+ universal_target=None, # type: Optional[UniversalTarget]
1666
+ requirement_configuration=RequirementConfiguration(), # type: RequirementConfiguration
1667
+ provenance=None, # type: Optional[str]
1668
+ ):
1669
+ # type: (...) -> DownloadRequest
1670
+ return cls(
1671
+ download_target=DownloadTarget(target=target, universal_target=universal_target),
1672
+ requirements=requirement_configuration.requirements,
1673
+ requirement_files=requirement_configuration.requirement_files,
1674
+ constraint_files=requirement_configuration.constraint_files,
1675
+ provenance=provenance,
1676
+ )
1677
+
1678
+ download_target = attr.ib() # type: DownloadTarget
1679
+ requirements = attr.ib(default=(), converter=_as_str_tuple) # type: Tuple[str, ...]
1680
+ requirement_files = attr.ib(default=(), converter=_as_str_tuple) # type: Tuple[str, ...]
1681
+ constraint_files = attr.ib(default=(), converter=_as_str_tuple) # type: Tuple[str, ...]
1682
+ provenance = attr.ib(default=None) # type: Optional[str]
1683
+
1684
+ def render_description(self):
1685
+ # type: () -> str
1686
+ description = self.download_target.render_description()
1687
+ if not self.provenance:
1688
+ return description
1689
+ return "{description} from {provenance}".format(
1690
+ description=description, provenance=self.provenance
1691
+ )
1692
+
1693
+ @property
1694
+ def target(self):
1695
+ # type: () -> Target
1696
+ return self.download_target.target
1697
+
1698
+ @property
1699
+ def universal_target(self):
1700
+ # type: () -> Optional[UniversalTarget]
1701
+ return self.download_target.universal_target
1702
+
1703
+ @property
1704
+ def has_requirements(self):
1705
+ return bool(self.requirements) or bool(self.requirement_files)
1706
+
1707
+
1708
+ def download_requests(
1709
+ requests, # type: Tuple[DownloadRequest, ...]
1710
+ direct_requirements, # type: Tuple[ParsedRequirement, ...]
1711
+ allow_prereleases=False, # type: bool
1712
+ transitive=True, # type: bool
1713
+ repos_configuration=ReposConfiguration(), # type: ReposConfiguration
1714
+ resolver_version=None, # type: Optional[ResolverVersion.Value]
1715
+ network_configuration=None, # type: Optional[NetworkConfiguration]
1716
+ build_configuration=BuildConfiguration(), # type: BuildConfiguration
1717
+ dest=None, # type: Optional[str]
1718
+ max_parallel_jobs=None, # type: Optional[int]
1719
+ observer=None, # type: Optional[ResolveObserver]
1720
+ pip_log=None, # type: Optional[PipLog]
1721
+ pip_version=None, # type: Optional[PipVersionValue]
1722
+ resolver=None, # type: Optional[Resolver]
1723
+ use_pip_config=False, # type: bool
1724
+ extra_pip_requirements=(), # type: Tuple[Requirement, ...]
1725
+ keyring_provider=None, # type: Optional[str]
1726
+ dependency_configuration=DependencyConfiguration(), # type: DependencyConfiguration
1727
+ ):
1728
+ # type: (...) -> Downloaded
1729
+
1636
1730
  package_index_configuration = PackageIndexConfiguration.create(
1637
1731
  pip_version=pip_version,
1638
1732
  resolver_version=resolver_version,
@@ -1642,12 +1736,10 @@ def download(
1642
1736
  extra_pip_requirements=extra_pip_requirements,
1643
1737
  keyring_provider=keyring_provider,
1644
1738
  )
1739
+
1645
1740
  build_requests, download_results = _download_internal(
1646
- targets=targets,
1741
+ requests=requests,
1647
1742
  direct_requirements=direct_requirements,
1648
- requirements=requirements,
1649
- requirement_files=requirement_files,
1650
- constraint_files=constraint_files,
1651
1743
  allow_prereleases=allow_prereleases,
1652
1744
  transitive=transitive,
1653
1745
  package_index_configuration=package_index_configuration,
@@ -1659,7 +1751,6 @@ def download(
1659
1751
  pip_version=pip_version,
1660
1752
  resolver=resolver,
1661
1753
  dependency_configuration=dependency_configuration,
1662
- universal_targets=universal_targets,
1663
1754
  )
1664
1755
 
1665
1756
  local_distributions = []
pex/venv/venv_pex.py CHANGED
@@ -186,7 +186,7 @@ def boot(
186
186
  "_PEX_PATCHED_TAGS_FILE",
187
187
  # These are used by Pex's Pip venv to implement universal locks.
188
188
  "_PEX_PYTHON_VERSIONS_FILE",
189
- "_PEX_TARGET_SYSTEMS_FILE",
189
+ "_PEX_UNIVERSAL_TARGET_FILE",
190
190
  # This is used to implement Pex --exclude and --override support.
191
191
  "_PEX_DEP_CONFIG_FILE",
192
192
  # This is used to implement --source support.
pex/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # Copyright 2015 Pex project contributors.
2
2
  # Licensed under the Apache License, Version 2.0 (see LICENSE).
3
3
 
4
- __version__ = "2.61.1"
4
+ __version__ = "2.62.0"
@@ -1,15 +1,15 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pex
3
- Version: 2.61.1
3
+ Version: 2.62.0
4
4
  Summary: The PEX packaging toolchain.
5
5
  Home-page: https://github.com/pex-tool/pex
6
- Download-URL: https://github.com/pex-tool/pex/releases/download/v2.61.1/pex
6
+ Download-URL: https://github.com/pex-tool/pex/releases/download/v2.62.0/pex
7
7
  Author: The PEX developers
8
8
  Author-email: developers@pex-tool.org
9
9
  License-Expression: Apache-2.0
10
- Project-URL: Changelog, https://github.com/pex-tool/pex/blob/v2.61.1/CHANGES.md
10
+ Project-URL: Changelog, https://github.com/pex-tool/pex/blob/v2.62.0/CHANGES.md
11
11
  Project-URL: Documentation, https://docs.pex-tool.org/
12
- Project-URL: Source, https://github.com/pex-tool/pex/tree/v2.61.1
12
+ Project-URL: Source, https://github.com/pex-tool/pex/tree/v2.62.0
13
13
  Keywords: package,executable,virtualenv,lock,freeze
14
14
  Classifier: Development Status :: 5 - Production/Stable
15
15
  Classifier: Intended Audience :: Developers
@@ -56,7 +56,7 @@ pex/pth.py,sha256=YGiWmW99vPvPm5-iU_Kbvbu1NTtJyyTp32ilHyAJ_VQ,3402
56
56
  pex/pyenv.py,sha256=O5_Ec26J8GQpa5Xt_TtSB0A9rV62vYgciIwBlW4aiZ8,9276
57
57
  pex/rank.py,sha256=dNFi6Y7bBe8gwcKSon81EOs9Jw4uhUzoHgRnIDYV8lU,3901
58
58
  pex/requirements.py,sha256=NpseoFVrUfTDSd0JAoOnVstbvYC140ecDgiHeb39b3s,29007
59
- pex/resolver.py,sha256=eukMYKET7WIgtibUaCJpXuIOuBRIayn83S22mQsjdzU,70551
59
+ pex/resolver.py,sha256=B6hRLzbTPRID8OXq-2Pph15yfU8axuYTbl8KIdAbOqY,73662
60
60
  pex/result.py,sha256=VTE_n-IffLf-FD4ENNbRvq_ebahh-IDYAna1y5Iw1WI,3090
61
61
  pex/sh_boot.py,sha256=mTB7aYc26GymgmbN5-QCiC_sbi3GBL5NZAiwXCsNL1w,11433
62
62
  pex/sorted_tuple.py,sha256=L_49iVoVZ57J-q44nVRO-boT0bc8ynhJlhS_yUp2xeo,2371
@@ -69,7 +69,7 @@ pex/tracer.py,sha256=nob_hNooCYWZev7_ABhAVyO4HBZ8Q_OajQUvNnr82Rc,4481
69
69
  pex/typing.py,sha256=J1JTB1V48zIWmhWRHEMDHWMaFPMzsEonWJ9s57Ev43Q,3050
70
70
  pex/util.py,sha256=TxTxpdDmrDTLVXt9e2XuRq9c3N6jRYNCce87QBFkCVo,5491
71
71
  pex/variables.py,sha256=h3-JeMzXfRzEsWqTYsoU-6vt5W4Kr0VvbfSDAYtuZOU,34728
72
- pex/version.py,sha256=DVGzV17TaWSHmL1bfNNRS6IRog4wDUQCCCM-hrIFk5U,131
72
+ pex/version.py,sha256=xIQBpD4BUCrxLErRWz7lG6vv4440DA6lhcm77J3M7Qc,131
73
73
  pex/wheel.py,sha256=R9jPWwzla_c3xUbeYjaQMrKC0ly8UexKMLfuRDhP054,11146
74
74
  pex/whl.py,sha256=0Nh1d6kmAaRANCygoVZZi0zii6j_elRQc7N6yDHTuMY,2513
75
75
  pex/ziputils.py,sha256=thUrto9vEdG9mFCIJ59Js3d1y6bSfFdl7pb1lSb7KAQ,9620
@@ -113,33 +113,33 @@ pex/distutils/commands/__init__.py,sha256=uASB5OU996Jax-h3kMmeZjG5Jdy9BYDR6A1swk
113
113
  pex/distutils/commands/bdist_pex.py,sha256=SLwBj0ALpArhKQT94X0niKWfyLaySjOZuZrGXG332K0,5117
114
114
  pex/docs/__init__.py,sha256=u9hPOij1fpo1yPBLTQTdSCnSIUuRCSXHomCkEAaCciA,439
115
115
  pex/docs/command.py,sha256=uQyD8bO_DBNIlkPd6F7SFZbZUVh1Xn6gT8OmVxP4qxk,3046
116
- pex/docs/html/buildingpex.html,sha256=gjV5rD3l0Y1-K-iujEqlnMhDhTtienKUYIGcp1PgdyI,57407
117
- pex/docs/html/genindex.html,sha256=kdwy_KfjuxFzOYn1SDrTgWsovV8e5712dQ9Juva9ldk,17198
118
- pex/docs/html/index.html,sha256=7bvXLU3ECXSjtlpbnJvE_OfgRrGs4rlMSXvY3-LceBI,25028
119
- pex/docs/html/recipes.html,sha256=SqB5YxLmHY5nP78O3SI46RuhFlqB5jqrTpUMAE13KJQ,35192
120
- pex/docs/html/scie.html,sha256=u4CYp633KX4Qb0r3-iG6-dsNegVSuVe9OCLeDz6PrmA,62182
121
- pex/docs/html/search.html,sha256=McU7HndhHG-89KuKB4ABrknh687fqSCib3gc5Y_vMAc,18169
116
+ pex/docs/html/buildingpex.html,sha256=JbEdqLur32EPyt8IWwxtwpH4q-27_EZQmhQo1ob6LZs,57407
117
+ pex/docs/html/genindex.html,sha256=gqRh5rS0iVazJdky1OwDIh6umdQyNqHUmkkRLnPOy-Q,17198
118
+ pex/docs/html/index.html,sha256=8RQCzndps4I9e9EuUpw-o5WmOFGdrM7M_CCJ2Uv4QhQ,25028
119
+ pex/docs/html/recipes.html,sha256=iWIGk74DOUv51dj4kHavS6o4er0C7pLarD7V1t89-t4,35192
120
+ pex/docs/html/scie.html,sha256=-hgEgrto-j0K76KydkqzPzOX9HzUsgp8-5o-aZKZH-E,62182
121
+ pex/docs/html/search.html,sha256=QTfDdthVRkAuAtfJD4Vs4zSKgKhufxEuLUmD0EK3M48,18169
122
122
  pex/docs/html/searchindex.js,sha256=R_L6Oveik_wlK5CmaE7YwRvmu81r6fd7jtnZUjfk1sA,18009
123
- pex/docs/html/whatispex.html,sha256=29EdaqIZ3w1deo91Tqtedk9WkcGcEbzDijK3PdbzH4g,22754
124
- pex/docs/html/_pagefind/pagefind-entry.json,sha256=odqFrS5dNehTjb-yKUYlpRJfaS4U_BLLOTY9ul09Bsg,90
123
+ pex/docs/html/whatispex.html,sha256=N1fHU7o1rErB3Oh9DxO1Vneoii_hkH5Lv3gW39o36TY,22754
124
+ pex/docs/html/_pagefind/pagefind-entry.json,sha256=vEEeHYUQp8hEPBSYOWY6xQzrN73F0R2tbPjN99f8U4o,90
125
125
  pex/docs/html/_pagefind/pagefind-highlight.js,sha256=5hRyi7gOMY9tlTe-tbmDrVJpoxbnYxhbJeoGwtmCfXA,43944
126
126
  pex/docs/html/_pagefind/pagefind-modular-ui.css,sha256=ZTqynk3lYp9t319vzfXSs-tTmowH__ila4ziFWpXB4g,7336
127
127
  pex/docs/html/_pagefind/pagefind-modular-ui.js,sha256=-DCEOJ2cInrvjEGZFxCuYy81EMWbKHhMu4wivlJmUzE,14486
128
128
  pex/docs/html/_pagefind/pagefind-ui.css,sha256=GL61nVezuyVA4ynNRJejhEwUBxhBtx4rDYVlAgI_W1U,14486
129
129
  pex/docs/html/_pagefind/pagefind-ui.js,sha256=WQ3yec_CMkBKswl16Ig5N_zJzeCgL4z9y344TcJeKAQ,78367
130
- pex/docs/html/_pagefind/pagefind.en_c578c4b677.pf_meta,sha256=syml2Po7JLiDR8kfyF2zxFWciAwF_JttdLLcyrNHm6o,154
130
+ pex/docs/html/_pagefind/pagefind.en_92d55346bf.pf_meta,sha256=ks0UBAZlQ7MwylDMuJVf3_z3OszGjsCjMI0SOv2ZZEs,153
131
131
  pex/docs/html/_pagefind/pagefind.js,sha256=Q-4jKyPif6awDU9x8IoWXTWoJJR1JZicegUYQ-QI4MA,32912
132
132
  pex/docs/html/_pagefind/wasm.en.pagefind,sha256=mG0TKIE7WXynsyg-tpiMZiVG2Hwebbt2UqFqlqdTTsE,70873
133
133
  pex/docs/html/_pagefind/wasm.unknown.pagefind,sha256=eAREknqQnc_y96pbl8eYz9zqfUXsqe64B7HwrQE2SkY,67202
134
- pex/docs/html/_pagefind/fragment/en_245699a.pf_fragment,sha256=COxvbCC0ohjrmCuWPYVe3RJNwk3MGGlPq7n9ghvI6Qs,4847
135
- pex/docs/html/_pagefind/fragment/en_4695b51.pf_fragment,sha256=IM5z7VpBJEIMc6d0n9UgwrkOTAQ7O2WWFQbvux0S8hk,361
136
- pex/docs/html/_pagefind/fragment/en_57f2ab1.pf_fragment,sha256=yvnvaNIwiDeJf_F7VxW4_sE9Va3Bimge_G7LMrxQuUg,3648
137
- pex/docs/html/_pagefind/fragment/en_aefc110.pf_fragment,sha256=MupAsKOHKABBC0eZj7hzwyWco2gg-hAW1koC44HzqpY,1158
138
- pex/docs/html/_pagefind/fragment/en_b7fad62.pf_fragment,sha256=LMThWot19yNnCLqJTAuF5-oCcHBrlPee_G4OI94DQ38,369
139
- pex/docs/html/_pagefind/fragment/en_bf32fcd.pf_fragment,sha256=OFOtHfd8_zRypPFyjdkHwHFVdrSaff-jy71GmEsCbhw,1142
140
- pex/docs/html/_pagefind/fragment/en_c9714ee.pf_fragment,sha256=De-3L0IU4HuNFiDXeBBfUk5K11ij09BeA3VqOao4mvk,3019
141
- pex/docs/html/_pagefind/fragment/en_e6c0aae.pf_fragment,sha256=B4gOrSbaCUeZDkxOfpGEpzPgRYdHJaJN16yXmwyGcR4,6821
142
- pex/docs/html/_pagefind/index/en_7e57d09.pf_index,sha256=dG2DsD-Y8afoyc2fcN-MJni6cpqIjgmFxIbebrVXaCg,28829
134
+ pex/docs/html/_pagefind/fragment/en_19d749c.pf_fragment,sha256=nWiCVHDFE0TdsOVqR6_OiedoiD926d7MrfP1NWL5rWo,1158
135
+ pex/docs/html/_pagefind/fragment/en_358f3c1.pf_fragment,sha256=5EF8X6TZLlhWKTPLlmVewujgQaZMR_SY2RUeAxirJzk,360
136
+ pex/docs/html/_pagefind/fragment/en_4a62b9a.pf_fragment,sha256=TePUJyPHcylfGBi5NCB_TS332N_yVn1sYeo4gwL5x4Y,1142
137
+ pex/docs/html/_pagefind/fragment/en_5c1928c.pf_fragment,sha256=53g_5_S_XeLGIMYWjGxOCJfesgnIspZcxqSHBMh061k,3019
138
+ pex/docs/html/_pagefind/fragment/en_a6b0f05.pf_fragment,sha256=wPx07zuxLyqqOz_es-yEG47R4WsYpJOMbNlcaqeg_HM,4848
139
+ pex/docs/html/_pagefind/fragment/en_a77f515.pf_fragment,sha256=OquMhkVyVnfZ309bRruLv9bDjN32n17xcxfO9t4vVug,6820
140
+ pex/docs/html/_pagefind/fragment/en_ed65506.pf_fragment,sha256=S3JihXK1vLGnkzGrAGU8rWaNPVwHRGR2IpaWVtOkbv4,3648
141
+ pex/docs/html/_pagefind/fragment/en_f5aab8f.pf_fragment,sha256=sPfFdajJZSHlZhThq4OyATFInJkHZR-FhW2LcYECl7g,370
142
+ pex/docs/html/_pagefind/index/en_856ae3c.pf_index,sha256=yMSn22bkTA8VDebnMSlVfY4RQiiprOKVvM9HKeYO8uw,28865
143
143
  pex/docs/html/_sources/buildingpex.rst.txt,sha256=87P3ZO871MILL9pmpDM8_M7_YV1z5HjTYa9m8yuxTa4,19138
144
144
  pex/docs/html/_sources/index.rst.txt,sha256=vWt1s6dirYeR-9mFJY1SClwWvbWqIqJSFCAF1CdZojc,1468
145
145
  pex/docs/html/_sources/recipes.rst.txt,sha256=kerzvp8_t5io6eGl3YJODtNBQy7GmY2AA6RHaij9C-g,6958
@@ -149,7 +149,7 @@ pex/docs/html/_sources/api/vars.md.txt,sha256=C9gu5czyB-g788xRfYKF8P176ew_q97X6z
149
149
  pex/docs/html/_static/basic.css,sha256=ZW_xus1vJg_H1xuX-cLx_L9pLchL9GnNlSA078ue7-0,14685
150
150
  pex/docs/html/_static/debug.css,sha256=DQXNnnnVMjQwRmfAjwKXHeYZbA_8pZPDkDs2Z7QFWtY,1266
151
151
  pex/docs/html/_static/doctools.js,sha256=KZLAnfkYJqjTPjtItkXud-RXrc98cS13aoFOHixEi0M,4322
152
- pex/docs/html/_static/documentation_options.js,sha256=qSSP84Un1vSQjdIlT5RakJ0dfLmSBsOLlIVu1pO8Uz8,329
152
+ pex/docs/html/_static/documentation_options.js,sha256=HB4aLtM1p3uk5Xt3HgNXh53yB0WYUyx7g8L555eVXis,329
153
153
  pex/docs/html/_static/file.png,sha256=XEvJoWrr84xLlQ9ZuOUByjZJUyjLnrYiIYvOkGSjXj4,286
154
154
  pex/docs/html/_static/language_data.js,sha256=O8MRVjt_xegPyrL4Ypd0vzy2swICAA3zbf-OaVqQI7c,4598
155
155
  pex/docs/html/_static/minus.png,sha256=R-f8UNs2mfHKQc6aL_ogLADF0dUYDFX2K6hZsb1swAg,90
@@ -169,7 +169,7 @@ pex/docs/html/_static/styles/furo-extensions.css,sha256=PSsCB3EaBzE9-2yLJyKV9fkx
169
169
  pex/docs/html/_static/styles/furo-extensions.css.map,sha256=CzW267gfKqH8ruMlwJbWg-MsGAipIgZwoaP4gwDGkVw,7762
170
170
  pex/docs/html/_static/styles/furo.css,sha256=666beINeSQtLZbSeNCMj62G7a13xiX1YwJVvij3jr-8,50749
171
171
  pex/docs/html/_static/styles/furo.css.map,sha256=0k0kb9TwrJYQRT-2cbjTcOz7PQykGWHdy2BSuVMtrnY,76038
172
- pex/docs/html/api/vars.html,sha256=B8VLHKOvp5mDUxuNdiJ_Q4zYBEN0tUipqWzNptS18II,34903
172
+ pex/docs/html/api/vars.html,sha256=s4XODnt9tZvT5Ygcjp5Otb5Bz5XC78lypKyh_6ySx_M,34903
173
173
  pex/fs/__init__.py,sha256=ues2bnsufy1lYRyoWsiP-G4kuPrV-tXaZ0x-HFJFpwY,3605
174
174
  pex/fs/_posix.py,sha256=p-VkjEfRNXduBmkxcuEXWM1g6y6xrkufSYzEy93tqjA,1275
175
175
  pex/fs/_windows.py,sha256=apacgHpxNutF5HkU6cYOLHq7yqaijRMsFBdsdKSviDo,3304
@@ -205,14 +205,14 @@ pex/resolve/downloads.py,sha256=8R4GI-PSSLw2qv6XKsGyDFEiugfJgw2G6F4lywtU_Xk,7074
205
205
  pex/resolve/lock_downloader.py,sha256=PisFgzZsMaGjRrE6M-BLvDeoZqDnhvCdf2qJNe2-PW8,15395
206
206
  pex/resolve/lock_resolver.py,sha256=b6UoqaXPNdWEt1JC8S6HSc4el5ows6kmIa5T87OsAm0,23398
207
207
  pex/resolve/locked_resolve.py,sha256=A8bcW_HMjZSD29h_3CpYUPD2OwQtPsCScDaA5T9iKL4,40681
208
- pex/resolve/locker.py,sha256=2XFfWlxG2bDDxF9Hif44H-YdwqQRNB1D3Dc8l8fWdb4,27104
209
- pex/resolve/locker_patches.py,sha256=t_30hjSYG570UJHgpf7i1L5ssvi1LZ2YbM4iHd44V6s,11294
208
+ pex/resolve/locker.py,sha256=c-KzmnpOZNSaHuFr0JoeqSnL0uNwH5CpRkD12RipbQY,25477
209
+ pex/resolve/locker_patches.py,sha256=KttN07cCok3ajNm5TLzsZhBTPmPDyO33WkDbE4G9TB4,8043
210
210
  pex/resolve/package_repository.py,sha256=xMU9aTxojS2sNmWp03jfMBTIGhq3eqNuNOacl8BiiGY,15123
211
211
  pex/resolve/path_mappings.py,sha256=d6JVzD0K342ELz3O8AcsaXoikLDF3xYrgbXkixMmf3Q,2073
212
212
  pex/resolve/pex_repository_resolver.py,sha256=nr-qtnT-vGTan20vygbW8VH_uTv7jK9HdF4c4yrbBMY,5528
213
213
  pex/resolve/pre_resolved_resolver.py,sha256=nPQiE8cZwK-t9Jm-zpSpnbxNO4N4QXVA9fGIx_5llDs,10315
214
214
  pex/resolve/project.py,sha256=BYy1m8-jUsiaBR1DF3eJiqpqvdqrzB-cQDPvcMD2v-0,14923
215
- pex/resolve/requirement_configuration.py,sha256=kK_si5GsaZUlaQMrwq6SWauk-0nWnwEbeeJB4V1qzfI,2891
215
+ pex/resolve/requirement_configuration.py,sha256=sHnf2OxhHEd3tiuaw8VTpE420TcpBv-EUnUeJ2iAWm4,3145
216
216
  pex/resolve/requirement_options.py,sha256=4E5e_81ANZMg3-a1zYnJ--rixyqaEJ49197GjB3AYbA,2288
217
217
  pex/resolve/resolved_requirement.py,sha256=78dn81rEqnbkbhR9C6rAh_rTfQTLq-zUaZZVh9Z7ZAQ,2480
218
218
  pex/resolve/resolver_configuration.py,sha256=H1yx6LoO1bZO5wAAVrC5kSNvwSK-el9brmIiPZSIMDY,9780
@@ -221,17 +221,17 @@ pex/resolve/resolvers.py,sha256=0YFFukBDDTe0laT7at7wRMMbynaPzZhaZl55NgI1hS4,1015
221
221
  pex/resolve/script_metadata.py,sha256=6PdrBvUmKQGdTIPHfE-F07460drqjQB_HuBgz_35ql0,6903
222
222
  pex/resolve/target_configuration.py,sha256=FFrVHKgceCMlse2xOgxTtdnQ7ENw3A59t4IId0F1GDw,10349
223
223
  pex/resolve/target_options.py,sha256=6YoXvIWSyTKfkJ3fcEhqu7eDzF-TlUKhSoNlGoLApQI,12550
224
- pex/resolve/target_system.py,sha256=R256UFgP7vZ9iBI5Zo45Bh224nkBom6Y8Z6UnJqloKk,17256
224
+ pex/resolve/target_system.py,sha256=6omSogiX5cYlSGjPrAMQpP5MwhxBu4R8X0Mw6c6Jx_M,29905
225
225
  pex/resolve/venv_resolver.py,sha256=2TzcrBXz6FCWO30RMek4Coi81cy0QYPjcZgjN-TXWaE,20663
226
226
  pex/resolve/lockfile/__init__.py,sha256=uASB5OU996Jax-h3kMmeZjG5Jdy9BYDR6A1swkBoFDg,107
227
- pex/resolve/lockfile/create.py,sha256=R4EWte-H-MazD2YvlBgFS7ZzeC9sEsDgOgcgu-QexxA,28679
227
+ pex/resolve/lockfile/create.py,sha256=NEkIm0nCbUStBQqqjh_MUFmNNgNLw2iMBGX8EKip1UM,28615
228
228
  pex/resolve/lockfile/download_manager.py,sha256=7mI_vUIIn4VxG3RDNxyT5yTpFLG9LH_IlGDKRMB_OJ0,9176
229
229
  pex/resolve/lockfile/json_codec.py,sha256=jgFPmZ9eW-PyNFCzzUQU7S9vNJR6-gX2axtC065ypRw,20544
230
230
  pex/resolve/lockfile/model.py,sha256=BupcGuRT3EG8c_4Sc7C8CnKoZo7c6jqDYXreIJZoJfg,7838
231
231
  pex/resolve/lockfile/pep_751.py,sha256=t2vvd5dTgLuQdlehl5yLlM8gdkW7IiR4sy7TOj1io8g,72671
232
232
  pex/resolve/lockfile/requires_dist.py,sha256=ROU8j0Or5Dkqx_Tn9kysQvNaiittLgOj2BOJgxjDa-A,2973
233
233
  pex/resolve/lockfile/subset.py,sha256=tbjLsMa9aZ8vSE71uI-23d-rV9G3MrELhqiJuldmfdU,7980
234
- pex/resolve/lockfile/targets.py,sha256=2mb9RswM7pocEBQjKiyQuivEUwCrKF5CHAs4qpRned0,7111
234
+ pex/resolve/lockfile/targets.py,sha256=Dy28viC7yrlzRXgt-4PEVN9fCxqqnTLCpXRSpvm_QKA,17185
235
235
  pex/resolve/lockfile/tarjan.py,sha256=Pypa5E78mCY6WdRSDNzXZiYQsde6LvWhiBBOI-K2ia4,5053
236
236
  pex/resolve/lockfile/updater.py,sha256=k2mQP-ESC0uWmnSOyXo3JF-dyx2pkfX4sIC1Gb_peCY,35171
237
237
  pex/resolve/pep_691/__init__.py,sha256=hbVu8HKJGOAmXQlIyMjcEt0EsBK311HumeAwENvHHxY,107
@@ -977,7 +977,7 @@ pex/venv/install_scope.py,sha256=cws8l_ujLxViO_6ayspaq-jJjOfjE4rWWcaZPf72Xzw,374
977
977
  pex/venv/installer.py,sha256=jJtHjjwCVbCyAX1J8ZTtdBqv5MTFfngjXiPKWkAw3M4,23969
978
978
  pex/venv/installer_configuration.py,sha256=VbK7NdrMhPI6BKclDbcr5NYn_0ia7xtl2AhvMVC7AU4,1101
979
979
  pex/venv/installer_options.py,sha256=TS7AaRT_3Io0R2Aaoq1pSjQ0srZ4TFf2NattQpqHFiw,4457
980
- pex/venv/venv_pex.py,sha256=_slrxVbuK6b8WSTwlU2B52ZrqUV8c7eU9QH6bi82kWM,14010
980
+ pex/venv/venv_pex.py,sha256=YaEdGka0fRwU9BNrCkDLL04knpF3fYbMRbKI-zsFFXg,14012
981
981
  pex/venv/virtualenv.py,sha256=vpYYCrTmr_sHHIcJ-2GFgn3fVutVEvhg0U-U3IeQ6Jk,22755
982
982
  pex/venv/virtualenv_16.7.12_py,sha256=JklxCLvTpxytqGXXEoeLw5V_yuvyvEMTV_Vg8FJOYnM,106996
983
983
  pex/windows/__init__.py,sha256=4aRkPMLpaegUlRdqycx8YyQnUCbw4_Xu9Mt-qSI0g5c,5460
@@ -985,10 +985,10 @@ pex/windows/stubs/uv-trampoline-aarch64-console.exe,sha256=1S2aM-6CV7rKz-3ncM5X7
985
985
  pex/windows/stubs/uv-trampoline-aarch64-gui.exe,sha256=mb8x1FpyH-wy11X5YgWfqh_VUwBb62M4Zf9aFr5V4EE,40448
986
986
  pex/windows/stubs/uv-trampoline-x86_64-console.exe,sha256=nLopBrlCMMFjkKVRlY7Ke2zFGpQOyF5mSlLs0d7-HRQ,40960
987
987
  pex/windows/stubs/uv-trampoline-x86_64-gui.exe,sha256=icnp1oXrOZpc-dHTGvDbTHjr-D8M0eamvRrC9bPI_KI,41984
988
- pex-2.61.1.dist-info/METADATA,sha256=9_Cezqqwv4Qa1L7E-sm4q29QHKMtsN2yZe2S94ebtAE,7476
989
- pex-2.61.1.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
990
- pex-2.61.1.dist-info/entry_points.txt,sha256=LD9tcxNxdsVLeIF6zR7dyH1vgo2eD9a-05TC1UraGMQ,174
991
- pex-2.61.1.dist-info/top_level.txt,sha256=HlafJUPu7mfjxv3SDH-RbkxsHOWSVbPXTEBC1hzonpM,4
992
- pex-2.61.1.dist-info/licenses/LICENSE,sha256=bcDgaNzzpbyOBUIFuFt3IOHUkmW7xkv1FdLPeRl99po,11323
993
- pex-2.61.1.dist-info/pylock/pylock.toml,sha256=9TIk5X6BqnJ6lKu8eb0EnzwbBcOjs3QJWzcLMYx8M5k,7151
994
- pex-2.61.1.dist-info/RECORD,,
988
+ pex-2.62.0.dist-info/METADATA,sha256=dqKW2QxBo2xlALlVf3gk5TnPdjahajaNkfyTpCNaQ84,7476
989
+ pex-2.62.0.dist-info/WHEEL,sha256=JNWh1Fm1UdwIQV075glCn4MVuCRs0sotJIq-J6rbxCU,109
990
+ pex-2.62.0.dist-info/entry_points.txt,sha256=LD9tcxNxdsVLeIF6zR7dyH1vgo2eD9a-05TC1UraGMQ,174
991
+ pex-2.62.0.dist-info/top_level.txt,sha256=HlafJUPu7mfjxv3SDH-RbkxsHOWSVbPXTEBC1hzonpM,4
992
+ pex-2.62.0.dist-info/licenses/LICENSE,sha256=bcDgaNzzpbyOBUIFuFt3IOHUkmW7xkv1FdLPeRl99po,11323
993
+ pex-2.62.0.dist-info/pylock/pylock.toml,sha256=9TIk5X6BqnJ6lKu8eb0EnzwbBcOjs3QJWzcLMYx8M5k,7151
994
+ pex-2.62.0.dist-info/RECORD,,
File without changes