refactor: Index requirements by when
spec
Part 3 of reworking all package metadata to key by `when` conditions. Changes conflict dictionary structure from this: { (requirement_spec, ...): [(when_spec, policy, msg)] } to this: { when_spec: [((requirement_spec, ...), policy, msg), ...] }
This commit is contained in:
@@ -967,10 +967,10 @@ def _extracts_errors(triggers, summary):
|
|||||||
summary = f"{pkg_name}: wrong 'when=' condition for the '{provided}' virtual"
|
summary = f"{pkg_name}: wrong 'when=' condition for the '{provided}' virtual"
|
||||||
errors.extend(_extracts_errors(triggers, summary))
|
errors.extend(_extracts_errors(triggers, summary))
|
||||||
|
|
||||||
for _, triggers in pkg_cls.requirements.items():
|
for when, requirements, details in _error_items(pkg_cls.requirements):
|
||||||
triggers = [when_spec for when_spec, _, _ in triggers]
|
errors.append(
|
||||||
summary = f"{pkg_name}: wrong 'when=' condition in 'requires' directive"
|
error_cls(f"{pkg_name}: wrong 'when=' condition in 'requires' directive", details)
|
||||||
errors.extend(_extracts_errors(triggers, summary))
|
)
|
||||||
|
|
||||||
for when, _, details in _error_items(pkg_cls.patches):
|
for when, _, details in _error_items(pkg_cls.patches):
|
||||||
errors.append(
|
errors.append(
|
||||||
|
@@ -965,7 +965,7 @@ def license(
|
|||||||
|
|
||||||
|
|
||||||
@directive("requirements")
|
@directive("requirements")
|
||||||
def requires(*requirement_specs, policy="one_of", when=None, msg=None):
|
def requires(*requirement_specs: str, policy="one_of", when=None, msg=None):
|
||||||
"""Allows a package to request a configuration to be present in all valid solutions.
|
"""Allows a package to request a configuration to be present in all valid solutions.
|
||||||
|
|
||||||
For instance, a package that is known to compile only with GCC can declare:
|
For instance, a package that is known to compile only with GCC can declare:
|
||||||
@@ -984,7 +984,7 @@ def requires(*requirement_specs, policy="one_of", when=None, msg=None):
|
|||||||
msg: optional user defined message
|
msg: optional user defined message
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def _execute_requires(pkg):
|
def _execute_requires(pkg: "spack.package_base.PackageBase"):
|
||||||
if policy not in ("one_of", "any_of"):
|
if policy not in ("one_of", "any_of"):
|
||||||
err_msg = (
|
err_msg = (
|
||||||
f"the 'policy' argument of the 'requires' directive in {pkg.name} is set "
|
f"the 'policy' argument of the 'requires' directive in {pkg.name} is set "
|
||||||
@@ -997,9 +997,10 @@ def _execute_requires(pkg):
|
|||||||
return
|
return
|
||||||
|
|
||||||
# Save in a list the requirements and the associated custom messages
|
# Save in a list the requirements and the associated custom messages
|
||||||
when_spec_list = pkg.requirements.setdefault(tuple(requirement_specs), [])
|
requirement_list = pkg.requirements.setdefault(when_spec, [])
|
||||||
msg_with_name = f"{pkg.name}: {msg}" if msg is not None else msg
|
msg_with_name = f"{pkg.name}: {msg}" if msg is not None else msg
|
||||||
when_spec_list.append((when_spec, policy, msg_with_name))
|
requirements = tuple(spack.spec.Spec(s) for s in requirement_specs)
|
||||||
|
requirement_list.append((requirements, policy, msg_with_name))
|
||||||
|
|
||||||
return _execute_requires
|
return _execute_requires
|
||||||
|
|
||||||
|
@@ -562,6 +562,9 @@ class PackageBase(WindowsRPath, PackageViewMixin, metaclass=PackageMeta):
|
|||||||
versions: dict
|
versions: dict
|
||||||
dependencies: Dict["spack.spec.Spec", Dict[str, "spack.dependency.Dependency"]]
|
dependencies: Dict["spack.spec.Spec", Dict[str, "spack.dependency.Dependency"]]
|
||||||
conflicts: Dict["spack.spec.Spec", List[Tuple["spack.spec.Spec", Optional[str]]]]
|
conflicts: Dict["spack.spec.Spec", List[Tuple["spack.spec.Spec", Optional[str]]]]
|
||||||
|
requirements: Dict[
|
||||||
|
"spack.spec.Spec", List[Tuple[Tuple["spack.spec.Spec", ...], str, Optional[str]]]
|
||||||
|
]
|
||||||
patches: Dict["spack.spec.Spec", List["spack.patch.Patch"]]
|
patches: Dict["spack.spec.Spec", List["spack.patch.Patch"]]
|
||||||
|
|
||||||
#: By default, packages are not virtual
|
#: By default, packages are not virtual
|
||||||
|
@@ -1303,8 +1303,8 @@ def package_requirement_rules(self, pkg):
|
|||||||
|
|
||||||
def requirement_rules_from_package_py(self, pkg):
|
def requirement_rules_from_package_py(self, pkg):
|
||||||
rules = []
|
rules = []
|
||||||
for requirements, conditions in pkg.requirements.items():
|
for when_spec, requirement_list in pkg.requirements.items():
|
||||||
for when_spec, policy, message in conditions:
|
for requirements, policy, message in requirement_list:
|
||||||
rules.append(
|
rules.append(
|
||||||
RequirementRule(
|
RequirementRule(
|
||||||
pkg_name=pkg.name,
|
pkg_name=pkg.name,
|
||||||
|
Reference in New Issue
Block a user