Skip to content

Commit

Permalink
Package requirements: allow single specs in requirement lists (spack#…
Browse files Browse the repository at this point in the history
…36258)

If you have a "require:" section in your packages config, and you
use it to specify a list of requirements, the list elements can
now include strings (before this, each element in the list had to
be a `one_of` or `any_of` specification, which is awkward if you
wanted to apply just one spec with no alternatives).
  • Loading branch information
scheibelp authored Mar 20, 2023
1 parent e1752ca commit c3e4115
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 9 deletions.
15 changes: 10 additions & 5 deletions lib/spack/spack/schema/packages.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,16 @@
{
"type": "array",
"items": {
"type": "object",
"properties": {
"one_of": {"type": "array"},
"any_of": {"type": "array"},
},
"oneOf": [
{
"type": "object",
"properties": {
"one_of": {"type": "array"},
"any_of": {"type": "array"},
},
},
{"type": "string"},
]
},
},
# Shorthand for a single requirement group with
Expand Down
11 changes: 8 additions & 3 deletions lib/spack/spack/solver/asp.py
Original file line number Diff line number Diff line change
Expand Up @@ -1017,9 +1017,14 @@ def _rules_from_requirements(self, pkg_name, requirements):
else:
rules = []
for requirement in requirements:
for policy in ("one_of", "any_of"):
if policy in requirement:
rules.append((pkg_name, policy, requirement[policy]))
if isinstance(requirement, str):
# A string represents a spec that must be satisfied. It is
# equivalent to a one_of group with a single element
rules.append((pkg_name, "one_of", [requirement]))
else:
for policy in ("one_of", "any_of"):
if policy in requirement:
rules.append((pkg_name, policy, requirement[policy]))
return rules

def pkg_rules(self, pkg, tests):
Expand Down
18 changes: 17 additions & 1 deletion lib/spack/spack/test/concretize_requirements.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,12 +107,28 @@ def fake_installs(monkeypatch, tmpdir):
)


def test_one_package_multiple_reqs(concretize_scope, test_repo):
if spack.config.get("config:concretizer") == "original":
pytest.skip("Original concretizer does not support configuration requirements")

conf_str = """\
packages:
y:
require:
- "@2.4"
- "~shared"
"""
update_packages_config(conf_str)
y_spec = Spec("y").concretized()
assert y_spec.satisfies("@2.4~shared")


def test_requirement_isnt_optional(concretize_scope, test_repo):
"""If a user spec requests something that directly conflicts
with a requirement, make sure we get an error.
"""
if spack.config.get("config:concretizer") == "original":
pytest.skip("Original concretizer does not support configuration" " requirements")
pytest.skip("Original concretizer does not support configuration requirements")

conf_str = """\
packages:
Expand Down

0 comments on commit c3e4115

Please sign in to comment.