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.
- pex/cli/commands/lock.py +126 -101
- pex/docs/html/_pagefind/fragment/en_2872b88.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_403e4e7.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_57d6ca5.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_644781c.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_934de2b.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_9be98db.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_c13692d.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_cd57e69.pf_fragment +0 -0
- pex/docs/html/_pagefind/index/en_8d50649.pf_index +0 -0
- pex/docs/html/_pagefind/pagefind-entry.json +1 -1
- pex/docs/html/_pagefind/pagefind.en_45165febeb.pf_meta +0 -0
- pex/docs/html/_static/documentation_options.js +1 -1
- pex/docs/html/_static/pygments.css +164 -146
- pex/docs/html/_static/styles/furo.css +1 -1
- pex/docs/html/_static/styles/furo.css.map +1 -1
- pex/docs/html/api/vars.html +25 -34
- pex/docs/html/buildingpex.html +25 -34
- pex/docs/html/genindex.html +24 -33
- pex/docs/html/index.html +25 -34
- pex/docs/html/recipes.html +25 -34
- pex/docs/html/scie.html +25 -34
- pex/docs/html/search.html +24 -33
- pex/docs/html/whatispex.html +25 -34
- pex/resolve/locked_resolve.py +5 -1
- pex/resolve/locker.py +3 -2
- pex/resolve/target_system.py +11 -18
- pex/version.py +1 -1
- {pex-2.59.0.dist-info → pex-2.59.2.dist-info}/METADATA +4 -4
- {pex-2.59.0.dist-info → pex-2.59.2.dist-info}/RECORD +35 -35
- pex/docs/html/_pagefind/fragment/en_23dc437.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_3b86fa5.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_65c3a5b.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_6c2e6ff.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_7320871.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_7cfdecb.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_89e2d7c.pf_fragment +0 -0
- pex/docs/html/_pagefind/fragment/en_d4675e3.pf_fragment +0 -0
- pex/docs/html/_pagefind/index/en_34a4497.pf_index +0 -0
- pex/docs/html/_pagefind/pagefind.en_4ade7b3598.pf_meta +0 -0
- {pex-2.59.0.dist-info → pex-2.59.2.dist-info}/WHEEL +0 -0
- {pex-2.59.0.dist-info → pex-2.59.2.dist-info}/entry_points.txt +0 -0
- {pex-2.59.0.dist-info → pex-2.59.2.dist-info}/licenses/LICENSE +0 -0
- {pex-2.59.0.dist-info → pex-2.59.2.dist-info}/pylock/pylock.toml +0 -0
- {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
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
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
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
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
|
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"1.3.0","languages":{"en":{"hash":"
|
|
1
|
+
{"version":"1.3.0","languages":{"en":{"hash":"en_45165febeb","wasm":"en","page_count":8}}}
|
|
Binary file
|