pex 2.59.0__py2.py3-none-any.whl → 2.59.2__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 (45) hide show
  1. pex/cli/commands/lock.py +126 -101
  2. pex/docs/html/_pagefind/fragment/en_2872b88.pf_fragment +0 -0
  3. pex/docs/html/_pagefind/fragment/en_403e4e7.pf_fragment +0 -0
  4. pex/docs/html/_pagefind/fragment/en_57d6ca5.pf_fragment +0 -0
  5. pex/docs/html/_pagefind/fragment/en_644781c.pf_fragment +0 -0
  6. pex/docs/html/_pagefind/fragment/en_934de2b.pf_fragment +0 -0
  7. pex/docs/html/_pagefind/fragment/en_9be98db.pf_fragment +0 -0
  8. pex/docs/html/_pagefind/fragment/en_c13692d.pf_fragment +0 -0
  9. pex/docs/html/_pagefind/fragment/en_cd57e69.pf_fragment +0 -0
  10. pex/docs/html/_pagefind/index/en_8d50649.pf_index +0 -0
  11. pex/docs/html/_pagefind/pagefind-entry.json +1 -1
  12. pex/docs/html/_pagefind/pagefind.en_45165febeb.pf_meta +0 -0
  13. pex/docs/html/_static/documentation_options.js +1 -1
  14. pex/docs/html/_static/pygments.css +164 -146
  15. pex/docs/html/_static/styles/furo.css +1 -1
  16. pex/docs/html/_static/styles/furo.css.map +1 -1
  17. pex/docs/html/api/vars.html +25 -34
  18. pex/docs/html/buildingpex.html +25 -34
  19. pex/docs/html/genindex.html +24 -33
  20. pex/docs/html/index.html +25 -34
  21. pex/docs/html/recipes.html +25 -34
  22. pex/docs/html/scie.html +25 -34
  23. pex/docs/html/search.html +24 -33
  24. pex/docs/html/whatispex.html +25 -34
  25. pex/resolve/locked_resolve.py +5 -1
  26. pex/resolve/locker.py +3 -2
  27. pex/resolve/target_system.py +11 -18
  28. pex/version.py +1 -1
  29. {pex-2.59.0.dist-info → pex-2.59.2.dist-info}/METADATA +4 -4
  30. {pex-2.59.0.dist-info → pex-2.59.2.dist-info}/RECORD +35 -35
  31. pex/docs/html/_pagefind/fragment/en_23dc437.pf_fragment +0 -0
  32. pex/docs/html/_pagefind/fragment/en_3b86fa5.pf_fragment +0 -0
  33. pex/docs/html/_pagefind/fragment/en_65c3a5b.pf_fragment +0 -0
  34. pex/docs/html/_pagefind/fragment/en_6c2e6ff.pf_fragment +0 -0
  35. pex/docs/html/_pagefind/fragment/en_7320871.pf_fragment +0 -0
  36. pex/docs/html/_pagefind/fragment/en_7cfdecb.pf_fragment +0 -0
  37. pex/docs/html/_pagefind/fragment/en_89e2d7c.pf_fragment +0 -0
  38. pex/docs/html/_pagefind/fragment/en_d4675e3.pf_fragment +0 -0
  39. pex/docs/html/_pagefind/index/en_34a4497.pf_index +0 -0
  40. pex/docs/html/_pagefind/pagefind.en_4ade7b3598.pf_meta +0 -0
  41. {pex-2.59.0.dist-info → pex-2.59.2.dist-info}/WHEEL +0 -0
  42. {pex-2.59.0.dist-info → pex-2.59.2.dist-info}/entry_points.txt +0 -0
  43. {pex-2.59.0.dist-info → pex-2.59.2.dist-info}/licenses/LICENSE +0 -0
  44. {pex-2.59.0.dist-info → pex-2.59.2.dist-info}/pylock/pylock.toml +0 -0
  45. {pex-2.59.0.dist-info → pex-2.59.2.dist-info}/top_level.txt +0 -0
pex/cli/commands/lock.py CHANGED
@@ -76,7 +76,7 @@ from pex.resolve.resolver_options import parse_lockfile
76
76
  from pex.resolve.resolvers import Resolver
77
77
  from pex.resolve.script_metadata import ScriptMetadataApplication, apply_script_metadata
78
78
  from pex.resolve.target_configuration import InterpreterConstraintsNotSatisfied, TargetConfiguration
79
- from pex.resolve.target_system import TargetSystem
79
+ from pex.resolve.target_system import TargetSystem, UniversalTarget
80
80
  from pex.result import Error, Ok, Result, try_
81
81
  from pex.sorted_tuple import SortedTuple
82
82
  from pex.targets import LocalInterpreter, Target, Targets
@@ -535,6 +535,110 @@ class RootRequirements(object):
535
535
  return iter(self._root_requirements)
536
536
 
537
537
 
538
+ def subset_locked_resolve(
539
+ locked_resolve, # type: LockedResolve
540
+ root_requirements, # type: RootRequirements
541
+ constraint_by_project_name, # type: Mapping[ProjectName, Constraint]
542
+ lock_file_description, # type: str
543
+ universal_target=None, # type: Optional[UniversalTarget]
544
+ ):
545
+ # type: (...) -> Union[LockedResolve, Error]
546
+
547
+ available = {
548
+ locked_req.pin.project_name: (
549
+ ProjectNameAndVersion(locked_req.pin.project_name.raw, locked_req.pin.version.raw),
550
+ locked_req,
551
+ )
552
+ for locked_req in locked_resolve.locked_requirements
553
+ }
554
+ retain = set()
555
+ to_resolve = deque(root_requirements) # type: Deque[Union[RootRequirement, Requirement]]
556
+ while to_resolve:
557
+ req = to_resolve.popleft()
558
+ if req.project_name in retain:
559
+ continue
560
+ retain.add(req.project_name)
561
+
562
+ dep = available.get(req.project_name)
563
+ if not dep:
564
+ return Error(
565
+ "There is no lock entry for {project} in {lock_file} to satisfy the "
566
+ "{transitive}{req} requirement.".format(
567
+ project=req.project_name,
568
+ lock_file=lock_file_description,
569
+ transitive="" if isinstance(req, RootRequirement) else "transitive ",
570
+ req=(req if isinstance(req, RootRequirement) else "'{req}'".format(req=req)),
571
+ )
572
+ )
573
+
574
+ pnav, locked_req = dep
575
+ if isinstance(req, RootRequirement):
576
+ reqs = req.select(pnav)
577
+ if not reqs:
578
+ return Error(
579
+ "The locked version of {project} in {lock_file} is {version} which "
580
+ "does not satisfy the {req} requirement.".format(
581
+ project=pnav.project_name,
582
+ lock_file=lock_file_description,
583
+ version=pnav.version,
584
+ req=req,
585
+ )
586
+ )
587
+ elif pnav not in req:
588
+ production_assert(
589
+ isinstance(req, RootRequirement),
590
+ "Transitive requirements in a lock should always match existing lock "
591
+ "entries. Found {project} {version} in {lock_file}, which does not satisfy "
592
+ "transitive requirement '{req}' found in the same lock.",
593
+ project=pnav.project_name,
594
+ version=pnav.version,
595
+ lock_file=lock_file_description,
596
+ req=req,
597
+ )
598
+ return Error(
599
+ "The locked version of {project} in {lock_file} is {version} which does "
600
+ "not satisfy the '{req}' requirement.".format(
601
+ project=pnav.project_name,
602
+ lock_file=lock_file_description,
603
+ version=pnav.version,
604
+ req=req,
605
+ )
606
+ )
607
+ elif (
608
+ req.project_name in constraint_by_project_name
609
+ and pnav not in constraint_by_project_name[req.project_name]
610
+ ):
611
+ return Error(
612
+ "The locked version of {project} in {lock_file} is {version} which does "
613
+ "not satisfy the '{constraint}' constraint.".format(
614
+ project=pnav.project_name,
615
+ lock_file=lock_file_description,
616
+ version=pnav.version,
617
+ constraint=constraint_by_project_name[req.project_name],
618
+ )
619
+ )
620
+ else:
621
+ reqs = (req,)
622
+
623
+ for req in reqs:
624
+ to_resolve.extend(
625
+ requires_dist.filter_dependencies(
626
+ req,
627
+ locked_req,
628
+ universal_target=universal_target,
629
+ )
630
+ )
631
+
632
+ return attr.evolve(
633
+ locked_resolve,
634
+ locked_requirements=SortedTuple(
635
+ locked_requirement
636
+ for locked_requirement in locked_resolve.locked_requirements
637
+ if locked_requirement.pin.project_name in retain
638
+ ),
639
+ )
640
+
641
+
538
642
  class Lock(OutputMixin, JsonMixin, BuildTimeCommand):
539
643
  """Operate on PEX lock files."""
540
644
 
@@ -1587,6 +1691,7 @@ class Lock(OutputMixin, JsonMixin, BuildTimeCommand):
1587
1691
  )
1588
1692
 
1589
1693
  resolve_subsets = [] # type: List[LockedResolve]
1694
+ errors = [] # type: List[Error]
1590
1695
  for index, locked_resolve in enumerate(lock_file.locked_resolves, start=0):
1591
1696
  if len(lock_file.locked_resolves) == 1:
1592
1697
  lock_file_description = lockfile_path
@@ -1595,107 +1700,27 @@ class Lock(OutputMixin, JsonMixin, BuildTimeCommand):
1595
1700
  index=index, lock_file=lockfile_path
1596
1701
  )
1597
1702
 
1598
- available = {
1599
- locked_req.pin.project_name: (
1600
- ProjectNameAndVersion(
1601
- locked_req.pin.project_name.raw, locked_req.pin.version.raw
1602
- ),
1603
- locked_req,
1604
- )
1605
- for locked_req in locked_resolve.locked_requirements
1606
- }
1607
- retain = set()
1608
- to_resolve = deque(
1609
- root_requirements
1610
- ) # type: Deque[Union[RootRequirement, Requirement]]
1611
- while to_resolve:
1612
- req = to_resolve.popleft()
1613
- if req.project_name in retain:
1614
- continue
1615
- retain.add(req.project_name)
1616
-
1617
- dep = available.get(req.project_name)
1618
- if not dep:
1619
- return Error(
1620
- "There is no lock entry for {project} in {lock_file} to satisfy the "
1621
- "{transitive}{req} requirement.".format(
1622
- project=req.project_name,
1623
- lock_file=lock_file_description,
1624
- transitive="" if isinstance(req, RootRequirement) else "transitive ",
1625
- req=(
1626
- req
1627
- if isinstance(req, RootRequirement)
1628
- else "'{req}'".format(req=req)
1629
- ),
1630
- )
1631
- )
1632
-
1633
- pnav, locked_req = dep
1634
- if isinstance(req, RootRequirement):
1635
- reqs = req.select(pnav)
1636
- if not reqs:
1637
- return Error(
1638
- "The locked version of {project} in {lock_file} is {version} which "
1639
- "does not satisfy the {req} requirement.".format(
1640
- project=pnav.project_name,
1641
- lock_file=lock_file_description,
1642
- version=pnav.version,
1643
- req=req,
1644
- )
1645
- )
1646
- elif pnav not in req:
1647
- production_assert(
1648
- isinstance(req, RootRequirement),
1649
- "Transitive requirements in a lock should always match existing lock "
1650
- "entries. Found {project} {version} in {lock_file}, which does not satisfy "
1651
- "transitive requirement '{req}' found in the same lock.",
1652
- project=pnav.project_name,
1653
- version=pnav.version,
1654
- lock_file=lock_file_description,
1655
- req=req,
1656
- )
1657
- return Error(
1658
- "The locked version of {project} in {lock_file} is {version} which does "
1659
- "not satisfy the '{req}' requirement.".format(
1660
- project=pnav.project_name,
1661
- lock_file=lock_file_description,
1662
- version=pnav.version,
1663
- req=req,
1664
- )
1665
- )
1666
- elif (
1667
- req.project_name in constraint_by_project_name
1668
- and pnav not in constraint_by_project_name[req.project_name]
1669
- ):
1670
- return Error(
1671
- "The locked version of {project} in {lock_file} is {version} which does "
1672
- "not satisfy the '{constraint}' constraint.".format(
1673
- project=pnav.project_name,
1674
- lock_file=lock_file_description,
1675
- version=pnav.version,
1676
- constraint=constraint_by_project_name[req.project_name],
1677
- )
1678
- )
1679
- else:
1680
- reqs = (req,)
1681
-
1682
- for req in reqs:
1683
- to_resolve.extend(
1684
- requires_dist.filter_dependencies(
1685
- req,
1686
- locked_req,
1687
- universal_target=lock_file.configuration.universal_target,
1688
- )
1689
- )
1703
+ result = subset_locked_resolve(
1704
+ locked_resolve,
1705
+ root_requirements,
1706
+ constraint_by_project_name,
1707
+ lock_file_description=lock_file_description,
1708
+ universal_target=lock_file.configuration.universal_target,
1709
+ )
1710
+ if isinstance(result, LockedResolve):
1711
+ resolve_subsets.append(result)
1712
+ else:
1713
+ errors.append(result)
1690
1714
 
1691
- resolve_subsets.append(
1692
- attr.evolve(
1693
- locked_resolve,
1694
- locked_requirements=SortedTuple(
1695
- locked_requirement
1696
- for locked_requirement in locked_resolve.locked_requirements
1697
- if locked_requirement.pin.project_name in retain
1698
- ),
1715
+ if not resolve_subsets:
1716
+ if len(errors) == 1:
1717
+ return errors[0]
1718
+ return Error(
1719
+ "Failed to subset any of the {count} locked resolves contained in {lock_file}:\n"
1720
+ "{errors}".format(
1721
+ count=len(lock_file.locked_resolves),
1722
+ lock_file=lockfile_path,
1723
+ errors="\n".join(str(error) for error in errors),
1699
1724
  )
1700
1725
  )
1701
1726
 
@@ -1 +1 @@
1
- {"version":"1.3.0","languages":{"en":{"hash":"en_4ade7b3598","wasm":"en","page_count":8}}}
1
+ {"version":"1.3.0","languages":{"en":{"hash":"en_45165febeb","wasm":"en","page_count":8}}}
@@ -1,5 +1,5 @@
1
1
  const DOCUMENTATION_OPTIONS = {
2
- VERSION: '2.59.0',
2
+ VERSION: '2.59.2',
3
3
  LANGUAGE: 'en',
4
4
  COLLAPSE_INDEX: false,
5
5
  BUILDER: 'html',