Environments: Add support for including views (#42250)
* Environments: Add support for including views (take 2) * schema type hint fixes
This commit is contained in:
parent
faf64f1a26
commit
2fc0d05a55
@ -63,10 +63,11 @@
|
|||||||
from spack.util.cpus import cpus_available
|
from spack.util.cpus import cpus_available
|
||||||
|
|
||||||
#: Dict from section names -> schema for that section
|
#: Dict from section names -> schema for that section
|
||||||
SECTION_SCHEMAS = {
|
SECTION_SCHEMAS: Dict[str, Any] = {
|
||||||
"compilers": spack.schema.compilers.schema,
|
"compilers": spack.schema.compilers.schema,
|
||||||
"concretizer": spack.schema.concretizer.schema,
|
"concretizer": spack.schema.concretizer.schema,
|
||||||
"definitions": spack.schema.definitions.schema,
|
"definitions": spack.schema.definitions.schema,
|
||||||
|
"view": spack.schema.view.schema,
|
||||||
"develop": spack.schema.develop.schema,
|
"develop": spack.schema.develop.schema,
|
||||||
"mirrors": spack.schema.mirrors.schema,
|
"mirrors": spack.schema.mirrors.schema,
|
||||||
"repos": spack.schema.repos.schema,
|
"repos": spack.schema.repos.schema,
|
||||||
@ -81,7 +82,7 @@
|
|||||||
|
|
||||||
# Same as above, but including keys for environments
|
# Same as above, but including keys for environments
|
||||||
# this allows us to unify config reading between configs and environments
|
# this allows us to unify config reading between configs and environments
|
||||||
_ALL_SCHEMAS = copy.deepcopy(SECTION_SCHEMAS)
|
_ALL_SCHEMAS: Dict[str, Any] = copy.deepcopy(SECTION_SCHEMAS)
|
||||||
_ALL_SCHEMAS.update({spack.schema.env.TOP_LEVEL_KEY: spack.schema.env.schema})
|
_ALL_SCHEMAS.update({spack.schema.env.TOP_LEVEL_KEY: spack.schema.env.schema})
|
||||||
|
|
||||||
#: Path to the default configuration
|
#: Path to the default configuration
|
||||||
@ -1096,7 +1097,7 @@ def read_config_file(
|
|||||||
data = syaml.load_config(f)
|
data = syaml.load_config(f)
|
||||||
|
|
||||||
if data:
|
if data:
|
||||||
if not schema:
|
if schema is None:
|
||||||
key = next(iter(data))
|
key = next(iter(data))
|
||||||
schema = _ALL_SCHEMAS[key]
|
schema = _ALL_SCHEMAS[key]
|
||||||
validate(data, schema)
|
validate(data, schema)
|
||||||
|
@ -871,9 +871,55 @@ def _process_definition(self, item):
|
|||||||
else:
|
else:
|
||||||
self.spec_lists[name] = user_specs
|
self.spec_lists[name] = user_specs
|
||||||
|
|
||||||
|
def _process_view(self, env_view: Optional[Union[bool, str, Dict]]):
|
||||||
|
"""Process view option(s), which can be boolean, string, or None.
|
||||||
|
|
||||||
|
A boolean environment view option takes precedence over any that may
|
||||||
|
be included. So ``view: True`` results in the default view only. And
|
||||||
|
``view: False`` means the environment will have no view.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
env_view: view option provided in the manifest or configuration
|
||||||
|
"""
|
||||||
|
|
||||||
|
def add_view(name, values):
|
||||||
|
"""Add the view with the name and the string or dict values."""
|
||||||
|
if isinstance(values, str):
|
||||||
|
self.views[name] = ViewDescriptor(self.path, values)
|
||||||
|
elif isinstance(values, dict):
|
||||||
|
self.views[name] = ViewDescriptor.from_dict(self.path, values)
|
||||||
|
else:
|
||||||
|
tty.error(f"Cannot add view named {name} for {type(values)} values {values}")
|
||||||
|
|
||||||
|
# If the configuration specifies 'view: False' then we are done
|
||||||
|
# processing views. If this is called with the environment's view
|
||||||
|
# view (versus an included view), then there are to be NO views.
|
||||||
|
if env_view is False:
|
||||||
|
return
|
||||||
|
|
||||||
|
# If the configuration specifies 'view: True' then only the default
|
||||||
|
# view will be created for the environment and we are done processing
|
||||||
|
# views.
|
||||||
|
if env_view is True:
|
||||||
|
add_view(default_view_name, self.view_path_default)
|
||||||
|
return
|
||||||
|
|
||||||
|
# Otherwise, the configuration has a subdirectory or dictionary.
|
||||||
|
if isinstance(env_view, str):
|
||||||
|
add_view(default_view_name, env_view)
|
||||||
|
elif env_view:
|
||||||
|
for name, values in env_view.items():
|
||||||
|
add_view(name, values)
|
||||||
|
|
||||||
|
# If we reach this point without an explicit view option then we
|
||||||
|
# provide the default view.
|
||||||
|
if self.views == dict():
|
||||||
|
self.views[default_view_name] = ViewDescriptor(self.path, self.view_path_default)
|
||||||
|
|
||||||
def _construct_state_from_manifest(self):
|
def _construct_state_from_manifest(self):
|
||||||
"""Set up user specs and views from the manifest file."""
|
"""Set up user specs and views from the manifest file."""
|
||||||
self.spec_lists = collections.OrderedDict()
|
self.spec_lists = collections.OrderedDict()
|
||||||
|
self.views = {}
|
||||||
|
|
||||||
for item in spack.config.get("definitions", []):
|
for item in spack.config.get("definitions", []):
|
||||||
self._process_definition(item)
|
self._process_definition(item)
|
||||||
@ -885,20 +931,7 @@ def _construct_state_from_manifest(self):
|
|||||||
)
|
)
|
||||||
self.spec_lists[user_speclist_name] = user_specs
|
self.spec_lists[user_speclist_name] = user_specs
|
||||||
|
|
||||||
enable_view = env_configuration.get("view")
|
self._process_view(spack.config.get("view", True))
|
||||||
# enable_view can be boolean, string, or None
|
|
||||||
if enable_view is True or enable_view is None:
|
|
||||||
self.views = {default_view_name: ViewDescriptor(self.path, self.view_path_default)}
|
|
||||||
elif isinstance(enable_view, str):
|
|
||||||
self.views = {default_view_name: ViewDescriptor(self.path, enable_view)}
|
|
||||||
elif enable_view:
|
|
||||||
path = self.path
|
|
||||||
self.views = dict(
|
|
||||||
(name, ViewDescriptor.from_dict(path, values))
|
|
||||||
for name, values in enable_view.items()
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
self.views = {}
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def user_specs(self):
|
def user_specs(self):
|
||||||
|
@ -3,16 +3,17 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
"""Schema for bootstrap.yaml configuration file."""
|
"""Schema for bootstrap.yaml configuration file."""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
#: Schema of a single source
|
#: Schema of a single source
|
||||||
_source_schema = {
|
_source_schema: Dict[str, Any] = {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {"name": {"type": "string"}, "metadata": {"type": "string"}},
|
"properties": {"name": {"type": "string"}, "metadata": {"type": "string"}},
|
||||||
"additionalProperties": False,
|
"additionalProperties": False,
|
||||||
"required": ["name", "metadata"],
|
"required": ["name", "metadata"],
|
||||||
}
|
}
|
||||||
|
|
||||||
properties = {
|
properties: Dict[str, Any] = {
|
||||||
"bootstrap": {
|
"bootstrap": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
|
@ -6,27 +6,31 @@
|
|||||||
"""Schema for a buildcache spec.yaml file
|
"""Schema for a buildcache spec.yaml file
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/lib/spack/spack/schema/buildcache_spec.py
|
.. literalinclude:: _spack_root/lib/spack/spack/schema/buildcache_spec.py
|
||||||
:lines: 13-
|
:lines: 15-
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
import spack.schema.spec
|
import spack.schema.spec
|
||||||
|
|
||||||
|
properties: Dict[str, Any] = {
|
||||||
|
# `buildinfo` is no longer needed as of Spack 0.21
|
||||||
|
"buildinfo": {"type": "object"},
|
||||||
|
"spec": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": True,
|
||||||
|
"items": spack.schema.spec.properties,
|
||||||
|
},
|
||||||
|
"binary_cache_checksum": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {"hash_algorithm": {"type": "string"}, "hash": {"type": "string"}},
|
||||||
|
},
|
||||||
|
"buildcache_layout_version": {"type": "number"},
|
||||||
|
}
|
||||||
|
|
||||||
schema = {
|
schema = {
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||||
"title": "Spack buildcache specfile schema",
|
"title": "Spack buildcache specfile schema",
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": False,
|
"additionalProperties": False,
|
||||||
"properties": {
|
"properties": properties,
|
||||||
# `buildinfo` is no longer needed as of Spack 0.21
|
|
||||||
"buildinfo": {"type": "object"},
|
|
||||||
"spec": {
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": True,
|
|
||||||
"items": spack.schema.spec.properties,
|
|
||||||
},
|
|
||||||
"binary_cache_checksum": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {"hash_algorithm": {"type": "string"}, "hash": {"type": "string"}},
|
|
||||||
},
|
|
||||||
"buildcache_layout_version": {"type": "number"},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
@ -2,16 +2,15 @@
|
|||||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
"""Schema for cdash.yaml configuration file.
|
"""Schema for cdash.yaml configuration file.
|
||||||
|
|
||||||
.. literalinclude:: ../spack/schema/cdash.py
|
.. literalinclude:: ../spack/schema/cdash.py
|
||||||
:lines: 13-
|
:lines: 13-
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
#: Properties for inclusion in other schemas
|
#: Properties for inclusion in other schemas
|
||||||
properties = {
|
properties: Dict[str, Any] = {
|
||||||
"cdash": {
|
"cdash": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": False,
|
"additionalProperties": False,
|
||||||
|
@ -2,12 +2,12 @@
|
|||||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
"""Schema for gitlab-ci.yaml configuration file.
|
"""Schema for gitlab-ci.yaml configuration file.
|
||||||
|
|
||||||
.. literalinclude:: ../spack/schema/ci.py
|
.. literalinclude:: ../spack/schema/ci.py
|
||||||
:lines: 13-
|
:lines: 16-
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
from llnl.util.lang import union_dicts
|
from llnl.util.lang import union_dicts
|
||||||
|
|
||||||
@ -164,7 +164,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
#: Properties for inclusion in other schemas
|
#: Properties for inclusion in other schemas
|
||||||
properties = {
|
properties: Dict[str, Any] = {
|
||||||
"ci": {
|
"ci": {
|
||||||
"oneOf": [
|
"oneOf": [
|
||||||
# TODO: Replace with core-shared-properties in Spack 0.23
|
# TODO: Replace with core-shared-properties in Spack 0.23
|
||||||
|
@ -2,16 +2,17 @@
|
|||||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
"""Schema for compilers.yaml configuration file.
|
"""Schema for compilers.yaml configuration file.
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/lib/spack/spack/schema/compilers.py
|
.. literalinclude:: _spack_root/lib/spack/spack/schema/compilers.py
|
||||||
:lines: 13-
|
:lines: 15-
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
import spack.schema.environment
|
import spack.schema.environment
|
||||||
|
|
||||||
#: Properties for inclusion in other schemas
|
#: Properties for inclusion in other schemas
|
||||||
properties = {
|
properties: Dict[str, Any] = {
|
||||||
"compilers": {
|
"compilers": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
|
@ -2,14 +2,14 @@
|
|||||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
"""Schema for concretizer.yaml configuration file.
|
"""Schema for concretizer.yaml configuration file.
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/lib/spack/spack/schema/concretizer.py
|
.. literalinclude:: _spack_root/lib/spack/spack/schema/concretizer.py
|
||||||
:lines: 13-
|
:lines: 12-
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
properties = {
|
properties: Dict[str, Any] = {
|
||||||
"concretizer": {
|
"concretizer": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": False,
|
"additionalProperties": False,
|
||||||
|
@ -5,15 +5,16 @@
|
|||||||
"""Schema for config.yaml configuration file.
|
"""Schema for config.yaml configuration file.
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/lib/spack/spack/schema/config.py
|
.. literalinclude:: _spack_root/lib/spack/spack/schema/config.py
|
||||||
:lines: 13-
|
:lines: 17-
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
from llnl.util.lang import union_dicts
|
from llnl.util.lang import union_dicts
|
||||||
|
|
||||||
import spack.schema.projections
|
import spack.schema.projections
|
||||||
|
|
||||||
#: Properties for inclusion in other schemas
|
#: Properties for inclusion in other schemas
|
||||||
properties = {
|
properties: Dict[str, Any] = {
|
||||||
"config": {
|
"config": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"default": {},
|
"default": {},
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
"""Schema for the 'container' subsection of Spack environments."""
|
"""Schema for the 'container' subsection of Spack environments."""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
_stages_from_dockerhub = {
|
_stages_from_dockerhub = {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
@ -85,4 +86,4 @@
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
properties = {"container": container_schema}
|
properties: Dict[str, Any] = {"container": container_schema}
|
||||||
|
@ -11,112 +11,115 @@
|
|||||||
This does not specify a configuration - it is an input format
|
This does not specify a configuration - it is an input format
|
||||||
that is consumed and transformed into Spack DB records.
|
that is consumed and transformed into Spack DB records.
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
|
properties: Dict[str, Any] = {
|
||||||
|
"_meta": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": False,
|
||||||
|
"properties": {
|
||||||
|
"file-type": {"type": "string", "minLength": 1},
|
||||||
|
"cpe-version": {"type": "string", "minLength": 1},
|
||||||
|
"system-type": {"type": "string", "minLength": 1},
|
||||||
|
"schema-version": {"type": "string", "minLength": 1},
|
||||||
|
# Older schemas use did not have "cpe-version", just the
|
||||||
|
# schema version; in that case it was just called "version"
|
||||||
|
"version": {"type": "string", "minLength": 1},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"compilers": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": False,
|
||||||
|
"properties": {
|
||||||
|
"name": {"type": "string", "minLength": 1},
|
||||||
|
"version": {"type": "string", "minLength": 1},
|
||||||
|
"prefix": {"type": "string", "minLength": 1},
|
||||||
|
"executables": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": False,
|
||||||
|
"properties": {
|
||||||
|
"cc": {"type": "string", "minLength": 1},
|
||||||
|
"cxx": {"type": "string", "minLength": 1},
|
||||||
|
"fc": {"type": "string", "minLength": 1},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"arch": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["os", "target"],
|
||||||
|
"additionalProperties": False,
|
||||||
|
"properties": {
|
||||||
|
"os": {"type": "string", "minLength": 1},
|
||||||
|
"target": {"type": "string", "minLength": 1},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"specs": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["name", "version", "arch", "compiler", "prefix", "hash"],
|
||||||
|
"additionalProperties": False,
|
||||||
|
"properties": {
|
||||||
|
"name": {"type": "string", "minLength": 1},
|
||||||
|
"version": {"type": "string", "minLength": 1},
|
||||||
|
"arch": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["platform", "platform_os", "target"],
|
||||||
|
"additionalProperties": False,
|
||||||
|
"properties": {
|
||||||
|
"platform": {"type": "string", "minLength": 1},
|
||||||
|
"platform_os": {"type": "string", "minLength": 1},
|
||||||
|
"target": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": False,
|
||||||
|
"required": ["name"],
|
||||||
|
"properties": {"name": {"type": "string", "minLength": 1}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"compiler": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["name", "version"],
|
||||||
|
"additionalProperties": False,
|
||||||
|
"properties": {
|
||||||
|
"name": {"type": "string", "minLength": 1},
|
||||||
|
"version": {"type": "string", "minLength": 1},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"type": "object",
|
||||||
|
"patternProperties": {
|
||||||
|
"\\w[\\w-]*": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["hash"],
|
||||||
|
"additionalProperties": False,
|
||||||
|
"properties": {
|
||||||
|
"hash": {"type": "string", "minLength": 1},
|
||||||
|
"type": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {"type": "string", "minLength": 1},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"prefix": {"type": "string", "minLength": 1},
|
||||||
|
"rpm": {"type": "string", "minLength": 1},
|
||||||
|
"hash": {"type": "string", "minLength": 1},
|
||||||
|
"parameters": {"type": "object"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
schema = {
|
schema = {
|
||||||
"$schema": "http://json-schema.org/schema#",
|
"$schema": "http://json-schema.org/schema#",
|
||||||
"title": "CPE manifest schema",
|
"title": "CPE manifest schema",
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": False,
|
"additionalProperties": False,
|
||||||
"properties": {
|
"properties": properties,
|
||||||
"_meta": {
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": False,
|
|
||||||
"properties": {
|
|
||||||
"file-type": {"type": "string", "minLength": 1},
|
|
||||||
"cpe-version": {"type": "string", "minLength": 1},
|
|
||||||
"system-type": {"type": "string", "minLength": 1},
|
|
||||||
"schema-version": {"type": "string", "minLength": 1},
|
|
||||||
# Older schemas use did not have "cpe-version", just the
|
|
||||||
# schema version; in that case it was just called "version"
|
|
||||||
"version": {"type": "string", "minLength": 1},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"compilers": {
|
|
||||||
"type": "array",
|
|
||||||
"items": {
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": False,
|
|
||||||
"properties": {
|
|
||||||
"name": {"type": "string", "minLength": 1},
|
|
||||||
"version": {"type": "string", "minLength": 1},
|
|
||||||
"prefix": {"type": "string", "minLength": 1},
|
|
||||||
"executables": {
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": False,
|
|
||||||
"properties": {
|
|
||||||
"cc": {"type": "string", "minLength": 1},
|
|
||||||
"cxx": {"type": "string", "minLength": 1},
|
|
||||||
"fc": {"type": "string", "minLength": 1},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"arch": {
|
|
||||||
"type": "object",
|
|
||||||
"required": ["os", "target"],
|
|
||||||
"additionalProperties": False,
|
|
||||||
"properties": {
|
|
||||||
"os": {"type": "string", "minLength": 1},
|
|
||||||
"target": {"type": "string", "minLength": 1},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"specs": {
|
|
||||||
"type": "array",
|
|
||||||
"items": {
|
|
||||||
"type": "object",
|
|
||||||
"required": ["name", "version", "arch", "compiler", "prefix", "hash"],
|
|
||||||
"additionalProperties": False,
|
|
||||||
"properties": {
|
|
||||||
"name": {"type": "string", "minLength": 1},
|
|
||||||
"version": {"type": "string", "minLength": 1},
|
|
||||||
"arch": {
|
|
||||||
"type": "object",
|
|
||||||
"required": ["platform", "platform_os", "target"],
|
|
||||||
"additioanlProperties": False,
|
|
||||||
"properties": {
|
|
||||||
"platform": {"type": "string", "minLength": 1},
|
|
||||||
"platform_os": {"type": "string", "minLength": 1},
|
|
||||||
"target": {
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": False,
|
|
||||||
"required": ["name"],
|
|
||||||
"properties": {"name": {"type": "string", "minLength": 1}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"compiler": {
|
|
||||||
"type": "object",
|
|
||||||
"required": ["name", "version"],
|
|
||||||
"additionalProperties": False,
|
|
||||||
"properties": {
|
|
||||||
"name": {"type": "string", "minLength": 1},
|
|
||||||
"version": {"type": "string", "minLength": 1},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"type": "object",
|
|
||||||
"patternProperties": {
|
|
||||||
"\\w[\\w-]*": {
|
|
||||||
"type": "object",
|
|
||||||
"required": ["hash"],
|
|
||||||
"additionalProperties": False,
|
|
||||||
"properties": {
|
|
||||||
"hash": {"type": "string", "minLength": 1},
|
|
||||||
"type": {
|
|
||||||
"type": "array",
|
|
||||||
"items": {"type": "string", "minLength": 1},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"prefix": {"type": "string", "minLength": 1},
|
|
||||||
"rpm": {"type": "string", "minLength": 1},
|
|
||||||
"hash": {"type": "string", "minLength": 1},
|
|
||||||
"parameters": {"type": "object"},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
@ -6,12 +6,41 @@
|
|||||||
"""Schema for database index.json file
|
"""Schema for database index.json file
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/lib/spack/spack/schema/database_index.py
|
.. literalinclude:: _spack_root/lib/spack/spack/schema/database_index.py
|
||||||
:lines: 36-
|
:lines: 17-
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
import spack.schema.spec
|
import spack.schema.spec
|
||||||
|
|
||||||
# spack.schema.spec.properties
|
# spack.schema.spec.properties
|
||||||
|
|
||||||
|
properties: Dict[str, Any] = {
|
||||||
|
"database": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["installs", "version"],
|
||||||
|
"additionalProperties": False,
|
||||||
|
"properties": {
|
||||||
|
"installs": {
|
||||||
|
"type": "object",
|
||||||
|
"patternProperties": {
|
||||||
|
r"^[\w\d]{32}$": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"spec": spack.schema.spec.properties,
|
||||||
|
"path": {"oneOf": [{"type": "string"}, {"type": "null"}]},
|
||||||
|
"installed": {"type": "boolean"},
|
||||||
|
"ref_count": {"type": "integer", "minimum": 0},
|
||||||
|
"explicit": {"type": "boolean"},
|
||||||
|
"installation_time": {"type": "number"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"version": {"type": "string"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#: Full schema with metadata
|
#: Full schema with metadata
|
||||||
schema = {
|
schema = {
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||||
@ -19,30 +48,5 @@
|
|||||||
"type": "object",
|
"type": "object",
|
||||||
"required": ["database"],
|
"required": ["database"],
|
||||||
"additionalProperties": False,
|
"additionalProperties": False,
|
||||||
"properties": {
|
"properties": properties,
|
||||||
"database": {
|
|
||||||
"type": "object",
|
|
||||||
"required": ["installs", "version"],
|
|
||||||
"additionalProperties": False,
|
|
||||||
"properties": {
|
|
||||||
"installs": {
|
|
||||||
"type": "object",
|
|
||||||
"patternProperties": {
|
|
||||||
r"^[\w\d]{32}$": {
|
|
||||||
"type": "object",
|
|
||||||
"properties": {
|
|
||||||
"spec": spack.schema.spec.properties,
|
|
||||||
"path": {"oneOf": [{"type": "string"}, {"type": "null"}]},
|
|
||||||
"installed": {"type": "boolean"},
|
|
||||||
"ref_count": {"type": "integer", "minimum": 0},
|
|
||||||
"explicit": {"type": "boolean"},
|
|
||||||
"installation_time": {"type": "number"},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"version": {"type": "string"},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
@ -6,13 +6,14 @@
|
|||||||
"""Schema for definitions
|
"""Schema for definitions
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/lib/spack/spack/schema/definitions.py
|
.. literalinclude:: _spack_root/lib/spack/spack/schema/definitions.py
|
||||||
:lines: 13-
|
:lines: 16-
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
import spack.schema
|
import spack.schema
|
||||||
|
|
||||||
#: Properties for inclusion in other schemas
|
#: Properties for inclusion in other schemas
|
||||||
properties = {
|
properties: Dict[str, Any] = {
|
||||||
"definitions": {
|
"definitions": {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"default": [],
|
"default": [],
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
|
properties: Dict[str, Any] = {
|
||||||
properties = {
|
|
||||||
"develop": {
|
"develop": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"default": {},
|
"default": {},
|
||||||
|
@ -6,8 +6,10 @@
|
|||||||
"""Schema for env.yaml configuration file.
|
"""Schema for env.yaml configuration file.
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/lib/spack/spack/schema/env.py
|
.. literalinclude:: _spack_root/lib/spack/spack/schema/env.py
|
||||||
:lines: 36-
|
:lines: 19-
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
from llnl.util.lang import union_dicts
|
from llnl.util.lang import union_dicts
|
||||||
|
|
||||||
import spack.schema.gitlab_ci # DEPRECATED
|
import spack.schema.gitlab_ci # DEPRECATED
|
||||||
@ -19,61 +21,31 @@
|
|||||||
|
|
||||||
projections_scheme = spack.schema.projections.properties["projections"]
|
projections_scheme = spack.schema.projections.properties["projections"]
|
||||||
|
|
||||||
|
properties: Dict[str, Any] = {
|
||||||
|
"spack": {
|
||||||
|
"type": "object",
|
||||||
|
"default": {},
|
||||||
|
"additionalProperties": False,
|
||||||
|
"properties": union_dicts(
|
||||||
|
# Include deprecated "gitlab-ci" section
|
||||||
|
spack.schema.gitlab_ci.properties,
|
||||||
|
# merged configuration scope schemas
|
||||||
|
spack.schema.merged.properties,
|
||||||
|
# extra environment schema properties
|
||||||
|
{
|
||||||
|
"include": {"type": "array", "default": [], "items": {"type": "string"}},
|
||||||
|
"specs": spack.schema.spec_list_schema,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
schema = {
|
schema = {
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||||
"title": "Spack environment file schema",
|
"title": "Spack environment file schema",
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": False,
|
"additionalProperties": False,
|
||||||
"properties": {
|
"properties": properties,
|
||||||
"spack": {
|
|
||||||
"type": "object",
|
|
||||||
"default": {},
|
|
||||||
"additionalProperties": False,
|
|
||||||
"properties": union_dicts(
|
|
||||||
# Include deprecated "gitlab-ci" section
|
|
||||||
spack.schema.gitlab_ci.properties,
|
|
||||||
# merged configuration scope schemas
|
|
||||||
spack.schema.merged.properties,
|
|
||||||
# extra environment schema properties
|
|
||||||
{
|
|
||||||
"include": {"type": "array", "default": [], "items": {"type": "string"}},
|
|
||||||
"specs": spack.schema.spec_list_schema,
|
|
||||||
"view": {
|
|
||||||
"anyOf": [
|
|
||||||
{"type": "boolean"},
|
|
||||||
{"type": "string"},
|
|
||||||
{
|
|
||||||
"type": "object",
|
|
||||||
"patternProperties": {
|
|
||||||
r"\w+": {
|
|
||||||
"required": ["root"],
|
|
||||||
"additionalProperties": False,
|
|
||||||
"properties": {
|
|
||||||
"root": {"type": "string"},
|
|
||||||
"link": {
|
|
||||||
"type": "string",
|
|
||||||
"pattern": "(roots|all|run)",
|
|
||||||
},
|
|
||||||
"link_type": {"type": "string"},
|
|
||||||
"select": {
|
|
||||||
"type": "array",
|
|
||||||
"items": {"type": "string"},
|
|
||||||
},
|
|
||||||
"exclude": {
|
|
||||||
"type": "array",
|
|
||||||
"items": {"type": "string"},
|
|
||||||
},
|
|
||||||
"projections": projections_scheme,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
]
|
|
||||||
},
|
|
||||||
},
|
|
||||||
),
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
schemas.
|
schemas.
|
||||||
"""
|
"""
|
||||||
import collections.abc
|
import collections.abc
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
array_of_strings_or_num = {
|
array_of_strings_or_num = {
|
||||||
"type": "array",
|
"type": "array",
|
||||||
@ -18,7 +19,7 @@
|
|||||||
"patternProperties": {r"\w[\w-]*": {"anyOf": [{"type": "string"}, {"type": "number"}]}},
|
"patternProperties": {r"\w[\w-]*": {"anyOf": [{"type": "string"}, {"type": "number"}]}},
|
||||||
}
|
}
|
||||||
|
|
||||||
definition = {
|
definition: Dict[str, Any] = {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"default": {},
|
"default": {},
|
||||||
"additionalProperties": False,
|
"additionalProperties": False,
|
||||||
|
@ -6,8 +6,9 @@
|
|||||||
"""Schema for gitlab-ci.yaml configuration file.
|
"""Schema for gitlab-ci.yaml configuration file.
|
||||||
|
|
||||||
.. literalinclude:: ../spack/schema/gitlab_ci.py
|
.. literalinclude:: ../spack/schema/gitlab_ci.py
|
||||||
:lines: 13-
|
:lines: 15-
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
from llnl.util.lang import union_dicts
|
from llnl.util.lang import union_dicts
|
||||||
|
|
||||||
@ -112,7 +113,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
#: Properties for inclusion in other schemas
|
#: Properties for inclusion in other schemas
|
||||||
properties = {"gitlab-ci": gitlab_ci_properties}
|
properties: Dict[str, Any] = {"gitlab-ci": gitlab_ci_properties}
|
||||||
|
|
||||||
#: Full schema with metadata
|
#: Full schema with metadata
|
||||||
schema = {
|
schema = {
|
||||||
|
@ -6,8 +6,10 @@
|
|||||||
"""Schema for configuration merged into one file.
|
"""Schema for configuration merged into one file.
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/lib/spack/spack/schema/merged.py
|
.. literalinclude:: _spack_root/lib/spack/spack/schema/merged.py
|
||||||
:lines: 39-
|
:lines: 32-
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
from llnl.util.lang import union_dicts
|
from llnl.util.lang import union_dicts
|
||||||
|
|
||||||
import spack.schema.bootstrap
|
import spack.schema.bootstrap
|
||||||
@ -24,9 +26,10 @@
|
|||||||
import spack.schema.packages
|
import spack.schema.packages
|
||||||
import spack.schema.repos
|
import spack.schema.repos
|
||||||
import spack.schema.upstreams
|
import spack.schema.upstreams
|
||||||
|
import spack.schema.view
|
||||||
|
|
||||||
#: Properties for inclusion in other schemas
|
#: Properties for inclusion in other schemas
|
||||||
properties = union_dicts(
|
properties: Dict[str, Any] = union_dicts(
|
||||||
spack.schema.bootstrap.properties,
|
spack.schema.bootstrap.properties,
|
||||||
spack.schema.cdash.properties,
|
spack.schema.cdash.properties,
|
||||||
spack.schema.compilers.properties,
|
spack.schema.compilers.properties,
|
||||||
@ -41,6 +44,7 @@
|
|||||||
spack.schema.packages.properties,
|
spack.schema.packages.properties,
|
||||||
spack.schema.repos.properties,
|
spack.schema.repos.properties,
|
||||||
spack.schema.upstreams.properties,
|
spack.schema.upstreams.properties,
|
||||||
|
spack.schema.view.properties,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,8 +6,9 @@
|
|||||||
"""Schema for mirrors.yaml configuration file.
|
"""Schema for mirrors.yaml configuration file.
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/lib/spack/spack/schema/mirrors.py
|
.. literalinclude:: _spack_root/lib/spack/spack/schema/mirrors.py
|
||||||
:lines: 12-69
|
:lines: 13-
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
#: Common properties for connection specification
|
#: Common properties for connection specification
|
||||||
connection = {
|
connection = {
|
||||||
@ -50,7 +51,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
#: Properties for inclusion in other schemas
|
#: Properties for inclusion in other schemas
|
||||||
properties = {
|
properties: Dict[str, Any] = {
|
||||||
"mirrors": {
|
"mirrors": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"default": {},
|
"default": {},
|
||||||
|
@ -6,8 +6,10 @@
|
|||||||
"""Schema for modules.yaml configuration file.
|
"""Schema for modules.yaml configuration file.
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/lib/spack/spack/schema/modules.py
|
.. literalinclude:: _spack_root/lib/spack/spack/schema/modules.py
|
||||||
:lines: 13-
|
:lines: 16-
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
import spack.schema.environment
|
import spack.schema.environment
|
||||||
import spack.schema.projections
|
import spack.schema.projections
|
||||||
|
|
||||||
@ -141,7 +143,7 @@
|
|||||||
|
|
||||||
|
|
||||||
# Properties for inclusion into other schemas (requires definitions)
|
# Properties for inclusion into other schemas (requires definitions)
|
||||||
properties = {
|
properties: Dict[str, Any] = {
|
||||||
"modules": {
|
"modules": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": False,
|
"additionalProperties": False,
|
||||||
|
@ -5,8 +5,10 @@
|
|||||||
"""Schema for packages.yaml configuration files.
|
"""Schema for packages.yaml configuration files.
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/lib/spack/spack/schema/packages.py
|
.. literalinclude:: _spack_root/lib/spack/spack/schema/packages.py
|
||||||
:lines: 13-
|
:lines: 14-
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
import spack.schema.environment
|
import spack.schema.environment
|
||||||
|
|
||||||
permissions = {
|
permissions = {
|
||||||
@ -91,7 +93,7 @@
|
|||||||
REQUIREMENT_URL = "https://spack.readthedocs.io/en/latest/packages_yaml.html#package-requirements"
|
REQUIREMENT_URL = "https://spack.readthedocs.io/en/latest/packages_yaml.html#package-requirements"
|
||||||
|
|
||||||
#: Properties for inclusion in other schemas
|
#: Properties for inclusion in other schemas
|
||||||
properties = {
|
properties: Dict[str, Any] = {
|
||||||
"packages": {
|
"packages": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"default": {},
|
"default": {},
|
||||||
|
@ -6,12 +6,12 @@
|
|||||||
"""Schema for projections.yaml configuration file.
|
"""Schema for projections.yaml configuration file.
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/lib/spack/spack/schema/projections.py
|
.. literalinclude:: _spack_root/lib/spack/spack/schema/projections.py
|
||||||
:lines: 13-
|
:lines: 14-
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
#: Properties for inclusion in other schemas
|
#: Properties for inclusion in other schemas
|
||||||
properties = {
|
properties: Dict[str, Any] = {
|
||||||
"projections": {"type": "object", "patternProperties": {r"all|\w[\w-]*": {"type": "string"}}}
|
"projections": {"type": "object", "patternProperties": {r"all|\w[\w-]*": {"type": "string"}}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,12 +6,14 @@
|
|||||||
"""Schema for repos.yaml configuration file.
|
"""Schema for repos.yaml configuration file.
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/lib/spack/spack/schema/repos.py
|
.. literalinclude:: _spack_root/lib/spack/spack/schema/repos.py
|
||||||
:lines: 13-
|
:lines: 14-
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
#: Properties for inclusion in other schemas
|
#: Properties for inclusion in other schemas
|
||||||
properties = {"repos": {"type": "array", "default": [], "items": {"type": "string"}}}
|
properties: Dict[str, Any] = {
|
||||||
|
"repos": {"type": "array", "default": [], "items": {"type": "string"}}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#: Full schema with metadata
|
#: Full schema with metadata
|
||||||
|
46
lib/spack/spack/schema/spack.py
Normal file
46
lib/spack/spack/schema/spack.py
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
"""Schema for spack environment
|
||||||
|
|
||||||
|
.. literalinclude:: _spack_root/lib/spack/spack/schema/spack.py
|
||||||
|
:lines: 20-
|
||||||
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
|
from llnl.util.lang import union_dicts
|
||||||
|
|
||||||
|
import spack.schema
|
||||||
|
import spack.schema.gitlab_ci as ci_schema # DEPRECATED
|
||||||
|
import spack.schema.merged as merged_schema
|
||||||
|
|
||||||
|
#: Properties for inclusion in other schemas
|
||||||
|
properties: Dict[str, Any] = {
|
||||||
|
"spack": {
|
||||||
|
"type": "object",
|
||||||
|
"default": {},
|
||||||
|
"additionalProperties": False,
|
||||||
|
"properties": union_dicts(
|
||||||
|
# Include deprecated "gitlab-ci" section
|
||||||
|
ci_schema.properties,
|
||||||
|
# merged configuration scope schemas
|
||||||
|
merged_schema.properties,
|
||||||
|
# extra environment schema properties
|
||||||
|
{
|
||||||
|
"include": {"type": "array", "default": [], "items": {"type": "string"}},
|
||||||
|
"specs": spack.schema.spec_list_schema,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#: Full schema with metadata
|
||||||
|
schema = {
|
||||||
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "Spack environment file schema",
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": False,
|
||||||
|
"properties": properties,
|
||||||
|
}
|
@ -8,9 +8,9 @@
|
|||||||
TODO: This needs to be updated? Especially the hashes under properties.
|
TODO: This needs to be updated? Especially the hashes under properties.
|
||||||
|
|
||||||
.. literalinclude:: _spack_root/lib/spack/spack/schema/spec.py
|
.. literalinclude:: _spack_root/lib/spack/spack/schema/spec.py
|
||||||
:lines: 13-
|
:lines: 15-
|
||||||
"""
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
target = {
|
target = {
|
||||||
"oneOf": [
|
"oneOf": [
|
||||||
@ -57,7 +57,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
#: Properties for inclusion in other schemas
|
#: Properties for inclusion in other schemas
|
||||||
properties = {
|
properties: Dict[str, Any] = {
|
||||||
"spec": {
|
"spec": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": False,
|
"additionalProperties": False,
|
||||||
|
@ -2,10 +2,10 @@
|
|||||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
#: Properties for inclusion in other schemas
|
#: Properties for inclusion in other schemas
|
||||||
properties = {
|
properties: Dict[str, Any] = {
|
||||||
"upstreams": {
|
"upstreams": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"default": {},
|
"default": {},
|
||||||
|
49
lib/spack/spack/schema/view.py
Normal file
49
lib/spack/spack/schema/view.py
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
"""Schema for view
|
||||||
|
|
||||||
|
.. literalinclude:: _spack_root/lib/spack/spack/schema/view.py
|
||||||
|
:lines: 15-
|
||||||
|
"""
|
||||||
|
from typing import Any, Dict
|
||||||
|
|
||||||
|
import spack.schema
|
||||||
|
|
||||||
|
projections_scheme = spack.schema.projections.properties["projections"]
|
||||||
|
|
||||||
|
#: Properties for inclusion in other schemas
|
||||||
|
properties: Dict[str, Any] = {
|
||||||
|
"view": {
|
||||||
|
"anyOf": [
|
||||||
|
{"type": "boolean"},
|
||||||
|
{"type": "string"},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"patternProperties": {
|
||||||
|
r"\w+": {
|
||||||
|
"required": ["root"],
|
||||||
|
"additionalProperties": False,
|
||||||
|
"properties": {
|
||||||
|
"root": {"type": "string"},
|
||||||
|
"link": {"type": "string", "pattern": "(roots|all|run)"},
|
||||||
|
"link_type": {"type": "string"},
|
||||||
|
"select": {"type": "array", "items": {"type": "string"}},
|
||||||
|
"exclude": {"type": "array", "items": {"type": "string"}},
|
||||||
|
"projections": projections_scheme,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#: Full schema with metadata
|
||||||
|
schema = {
|
||||||
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "Spack view configuration file schema",
|
||||||
|
"properties": properties,
|
||||||
|
}
|
@ -2537,58 +2537,88 @@ def test_stack_view_no_activate_without_default(
|
|||||||
assert viewdir not in shell
|
assert viewdir not in shell
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("include_views", [True, False, "split"])
|
||||||
def test_stack_view_multiple_views(
|
def test_stack_view_multiple_views(
|
||||||
tmpdir, mock_fetch, mock_packages, mock_archive, install_mockery
|
tmp_path,
|
||||||
|
mock_fetch,
|
||||||
|
mock_packages,
|
||||||
|
mock_archive,
|
||||||
|
install_mockery,
|
||||||
|
mutable_config,
|
||||||
|
include_views,
|
||||||
):
|
):
|
||||||
filename = str(tmpdir.join("spack.yaml"))
|
"""Test multiple views as both included views (True), as both environment
|
||||||
default_viewdir = str(tmpdir.join("default-view"))
|
views (False), or as one included and the other in the environment."""
|
||||||
combin_viewdir = str(tmpdir.join("combinatorial-view"))
|
# Write the view configuration and or manifest file
|
||||||
with open(filename, "w") as f:
|
view_filename = tmp_path / "view.yaml"
|
||||||
f.write(
|
base_content = """\
|
||||||
"""\
|
|
||||||
spack:
|
|
||||||
definitions:
|
definitions:
|
||||||
- packages: [mpileaks, cmake]
|
- packages: [mpileaks, cmake]
|
||||||
- compilers: ['%%gcc', '%%clang']
|
- compilers: ['%gcc', '%clang']
|
||||||
specs:
|
specs:
|
||||||
- matrix:
|
- matrix:
|
||||||
- [$packages]
|
- [$packages]
|
||||||
- [$compilers]
|
- [$compilers]
|
||||||
|
"""
|
||||||
|
|
||||||
view:
|
include_content = f" include:\n - {view_filename}\n"
|
||||||
default:
|
view_line = " view:\n"
|
||||||
root: %s
|
|
||||||
select: ['%%gcc']
|
|
||||||
combinatorial:
|
|
||||||
root: %s
|
|
||||||
exclude: [callpath %%gcc]
|
|
||||||
projections:
|
|
||||||
'all': '{name}/{version}-{compiler.name}'"""
|
|
||||||
% (default_viewdir, combin_viewdir)
|
|
||||||
)
|
|
||||||
with tmpdir.as_cwd():
|
|
||||||
env("create", "test", "./spack.yaml")
|
|
||||||
with ev.read("test"):
|
|
||||||
install()
|
|
||||||
|
|
||||||
shell = env("activate", "--sh", "test")
|
comb_dir = tmp_path / "combinatorial-view"
|
||||||
assert "PATH" in shell
|
comb_view = """\
|
||||||
assert os.path.join(default_viewdir, "bin") in shell
|
{0}combinatorial:
|
||||||
|
{0} root: {1}
|
||||||
|
{0} exclude: [callpath%gcc]
|
||||||
|
{0} projections:
|
||||||
|
"""
|
||||||
|
|
||||||
test = ev.read("test")
|
projection = " 'all': '{name}/{version}-{compiler.name}'"
|
||||||
for spec in test._get_environment_specs():
|
|
||||||
|
default_dir = tmp_path / "default-view"
|
||||||
|
default_view = """\
|
||||||
|
{0}default:
|
||||||
|
{0} root: {1}
|
||||||
|
{0} select: ['%gcc']
|
||||||
|
"""
|
||||||
|
|
||||||
|
content = "spack:\n"
|
||||||
|
indent = " "
|
||||||
|
if include_views is True:
|
||||||
|
# Include both the gcc and combinatorial views
|
||||||
|
view = "view:\n" + default_view.format(indent, str(default_dir))
|
||||||
|
view += comb_view.format(indent, str(comb_dir)) + indent + projection
|
||||||
|
view_filename.write_text(view)
|
||||||
|
content += include_content + base_content
|
||||||
|
elif include_views == "split":
|
||||||
|
# Include the gcc view and inline the combinatorial view
|
||||||
|
view = "view:\n" + default_view.format(indent, str(default_dir))
|
||||||
|
view_filename.write_text(view)
|
||||||
|
content += include_content + base_content + view_line
|
||||||
|
indent += " "
|
||||||
|
content += comb_view.format(indent, str(comb_dir)) + indent + projection
|
||||||
|
else:
|
||||||
|
# Inline both the gcc and combinatorial views in the environment.
|
||||||
|
indent += " "
|
||||||
|
content += base_content + view_line
|
||||||
|
content += default_view.format(indent, str(default_dir))
|
||||||
|
content += comb_view.format(indent, str(comb_dir)) + indent + projection
|
||||||
|
|
||||||
|
filename = tmp_path / ev.manifest_name
|
||||||
|
filename.write_text(content)
|
||||||
|
|
||||||
|
env("create", "test", str(filename))
|
||||||
|
with ev.read("test"):
|
||||||
|
install()
|
||||||
|
|
||||||
|
with ev.read("test") as e:
|
||||||
|
assert os.path.exists(str(default_dir / "bin"))
|
||||||
|
for spec in e._get_environment_specs():
|
||||||
|
spec_subdir = f"{spec.version}-{spec.compiler.name}"
|
||||||
|
comb_spec_dir = str(comb_dir / spec.name / spec_subdir)
|
||||||
if not spec.satisfies("callpath%gcc"):
|
if not spec.satisfies("callpath%gcc"):
|
||||||
assert os.path.exists(
|
assert os.path.exists(comb_spec_dir)
|
||||||
os.path.join(
|
|
||||||
combin_viewdir, spec.name, "%s-%s" % (spec.version, spec.compiler.name)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
else:
|
else:
|
||||||
assert not os.path.exists(
|
assert not os.path.exists(comb_spec_dir)
|
||||||
os.path.join(
|
|
||||||
combin_viewdir, spec.name, "%s-%s" % (spec.version, spec.compiler.name)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def test_env_activate_sh_prints_shell_output(tmpdir, mock_stage, mock_fetch, install_mockery):
|
def test_env_activate_sh_prints_shell_output(tmpdir, mock_stage, mock_fetch, install_mockery):
|
||||||
@ -3714,3 +3744,150 @@ def test_environment_created_from_lockfile_has_view(mock_packages, temporary_sto
|
|||||||
# Make sure the view was created
|
# Make sure the view was created
|
||||||
with ev.Environment(env_b) as e:
|
with ev.Environment(env_b) as e:
|
||||||
assert os.path.isdir(e.view_path_default)
|
assert os.path.isdir(e.view_path_default)
|
||||||
|
|
||||||
|
|
||||||
|
def test_env_view_disabled(tmp_path, mutable_mock_env_path):
|
||||||
|
"""Ensure an inlined view being disabled means not even the default view
|
||||||
|
is created (since the case doesn't appear to be covered in this module)."""
|
||||||
|
spack_yaml = tmp_path / ev.manifest_name
|
||||||
|
spack_yaml.write_text(
|
||||||
|
"""\
|
||||||
|
spack:
|
||||||
|
specs:
|
||||||
|
- mpileaks
|
||||||
|
view: false
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
env("create", "disabled", str(spack_yaml))
|
||||||
|
with ev.read("disabled") as e:
|
||||||
|
e.concretize()
|
||||||
|
|
||||||
|
assert len(e.views) == 0
|
||||||
|
assert not os.path.exists(e.view_path_default)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("first", ["false", "true", "custom"])
|
||||||
|
def test_env_include_mixed_views(tmp_path, mutable_mock_env_path, mutable_config, first):
|
||||||
|
"""Ensure including path and boolean views in different combinations result
|
||||||
|
in the creation of only the first view if it is not disabled."""
|
||||||
|
false_yaml = tmp_path / "false-view.yaml"
|
||||||
|
false_yaml.write_text("view: false\n")
|
||||||
|
|
||||||
|
true_yaml = tmp_path / "true-view.yaml"
|
||||||
|
true_yaml.write_text("view: true\n")
|
||||||
|
|
||||||
|
custom_name = "my-test-view"
|
||||||
|
custom_view = tmp_path / custom_name
|
||||||
|
custom_yaml = tmp_path / "custom-view.yaml"
|
||||||
|
custom_yaml.write_text(
|
||||||
|
f"""
|
||||||
|
view:
|
||||||
|
{custom_name}:
|
||||||
|
root: {custom_view}
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
if first == "false":
|
||||||
|
order = [false_yaml, true_yaml, custom_yaml]
|
||||||
|
elif first == "true":
|
||||||
|
order = [true_yaml, custom_yaml, false_yaml]
|
||||||
|
else:
|
||||||
|
order = [custom_yaml, false_yaml, true_yaml]
|
||||||
|
includes = [f" - {yaml}\n" for yaml in order]
|
||||||
|
|
||||||
|
spack_yaml = tmp_path / ev.manifest_name
|
||||||
|
spack_yaml.write_text(
|
||||||
|
f"""\
|
||||||
|
spack:
|
||||||
|
include:
|
||||||
|
{''.join(includes)}
|
||||||
|
specs:
|
||||||
|
- mpileaks
|
||||||
|
packages:
|
||||||
|
mpileaks:
|
||||||
|
compiler: [gcc]
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
env("create", "test", str(spack_yaml))
|
||||||
|
with ev.read("test") as e:
|
||||||
|
concretize()
|
||||||
|
|
||||||
|
# Only the first included view should be created if view not disabled by it
|
||||||
|
assert len(e.views) == 0 if first == "false" else 1
|
||||||
|
if first == "true":
|
||||||
|
assert os.path.exists(e.view_path_default)
|
||||||
|
else:
|
||||||
|
assert not os.path.exists(e.view_path_default)
|
||||||
|
|
||||||
|
if first == "custom":
|
||||||
|
assert os.path.exists(custom_view)
|
||||||
|
else:
|
||||||
|
assert not os.path.exists(custom_view)
|
||||||
|
|
||||||
|
|
||||||
|
def test_stack_view_multiple_views_same_name(
|
||||||
|
tmp_path, mock_fetch, mock_packages, mock_archive, install_mockery, mutable_config
|
||||||
|
):
|
||||||
|
"""Test multiple views with the same name combine settings with precedence
|
||||||
|
given to the options in spack.yaml."""
|
||||||
|
# Write the view configuration and or manifest file
|
||||||
|
|
||||||
|
view_filename = tmp_path / "view.yaml"
|
||||||
|
default_dir = tmp_path / "default-view"
|
||||||
|
default_view = f"""\
|
||||||
|
view:
|
||||||
|
default:
|
||||||
|
root: {default_dir}
|
||||||
|
select: ['%gcc']
|
||||||
|
projections:
|
||||||
|
all: '{{name}}/{{version}}-{{compiler.name}}'
|
||||||
|
"""
|
||||||
|
view_filename.write_text(default_view)
|
||||||
|
|
||||||
|
view_dir = tmp_path / "view"
|
||||||
|
content = f"""\
|
||||||
|
spack:
|
||||||
|
include:
|
||||||
|
- {view_filename}
|
||||||
|
definitions:
|
||||||
|
- packages: [mpileaks, cmake]
|
||||||
|
- compilers: ['%gcc', '%clang']
|
||||||
|
specs:
|
||||||
|
- matrix:
|
||||||
|
- [$packages]
|
||||||
|
- [$compilers]
|
||||||
|
|
||||||
|
view:
|
||||||
|
default:
|
||||||
|
root: {view_dir}
|
||||||
|
exclude: ['cmake']
|
||||||
|
projections:
|
||||||
|
all: '{{name}}/{{compiler.name}}-{{version}}'
|
||||||
|
"""
|
||||||
|
|
||||||
|
filename = tmp_path / ev.manifest_name
|
||||||
|
filename.write_text(content)
|
||||||
|
|
||||||
|
env("create", "test", str(filename))
|
||||||
|
with ev.read("test"):
|
||||||
|
install()
|
||||||
|
|
||||||
|
with ev.read("test") as e:
|
||||||
|
# the view root in the included view should NOT exist
|
||||||
|
assert not os.path.exists(str(default_dir))
|
||||||
|
|
||||||
|
for spec in e._get_environment_specs():
|
||||||
|
# no specs will exist in the included view projection
|
||||||
|
included_spec_subdir = f"{spec.version}-{spec.compiler.name}"
|
||||||
|
included_spec_dir = str(view_dir / spec.name / included_spec_subdir)
|
||||||
|
assert not os.path.exists(included_spec_dir)
|
||||||
|
|
||||||
|
# only specs compiled with %gcc (selected in the included view) that
|
||||||
|
# are also not cmake (excluded in the environment view) should exist
|
||||||
|
env_spec_subdir = f"{spec.compiler.name}-{spec.version}"
|
||||||
|
env_spec_dir = str(view_dir / spec.name / env_spec_subdir)
|
||||||
|
if spec.satisfies("cmake") or spec.satisfies("%clang"):
|
||||||
|
assert not os.path.exists(env_spec_dir)
|
||||||
|
else:
|
||||||
|
assert os.path.exists(env_spec_dir)
|
||||||
|
@ -1179,19 +1179,19 @@ complete -c spack -n '__fish_spack_using_command config' -l scope -r -d 'configu
|
|||||||
|
|
||||||
# spack config get
|
# spack config get
|
||||||
set -g __fish_spack_optspecs_spack_config_get h/help
|
set -g __fish_spack_optspecs_spack_config_get h/help
|
||||||
complete -c spack -n '__fish_spack_using_command_pos 0 config get' -f -a 'bootstrap cdash ci compilers concretizer config definitions develop mirrors modules packages repos upstreams'
|
complete -c spack -n '__fish_spack_using_command_pos 0 config get' -f -a 'bootstrap cdash ci compilers concretizer config definitions develop mirrors modules packages repos upstreams view'
|
||||||
complete -c spack -n '__fish_spack_using_command config get' -s h -l help -f -a help
|
complete -c spack -n '__fish_spack_using_command config get' -s h -l help -f -a help
|
||||||
complete -c spack -n '__fish_spack_using_command config get' -s h -l help -d 'show this help message and exit'
|
complete -c spack -n '__fish_spack_using_command config get' -s h -l help -d 'show this help message and exit'
|
||||||
|
|
||||||
# spack config blame
|
# spack config blame
|
||||||
set -g __fish_spack_optspecs_spack_config_blame h/help
|
set -g __fish_spack_optspecs_spack_config_blame h/help
|
||||||
complete -c spack -n '__fish_spack_using_command_pos 0 config blame' -f -a 'bootstrap cdash ci compilers concretizer config definitions develop mirrors modules packages repos upstreams'
|
complete -c spack -n '__fish_spack_using_command_pos 0 config blame' -f -a 'bootstrap cdash ci compilers concretizer config definitions develop mirrors modules packages repos upstreams view'
|
||||||
complete -c spack -n '__fish_spack_using_command config blame' -s h -l help -f -a help
|
complete -c spack -n '__fish_spack_using_command config blame' -s h -l help -f -a help
|
||||||
complete -c spack -n '__fish_spack_using_command config blame' -s h -l help -d 'show this help message and exit'
|
complete -c spack -n '__fish_spack_using_command config blame' -s h -l help -d 'show this help message and exit'
|
||||||
|
|
||||||
# spack config edit
|
# spack config edit
|
||||||
set -g __fish_spack_optspecs_spack_config_edit h/help print-file
|
set -g __fish_spack_optspecs_spack_config_edit h/help print-file
|
||||||
complete -c spack -n '__fish_spack_using_command_pos 0 config edit' -f -a 'bootstrap cdash ci compilers concretizer config definitions develop mirrors modules packages repos upstreams'
|
complete -c spack -n '__fish_spack_using_command_pos 0 config edit' -f -a 'bootstrap cdash ci compilers concretizer config definitions develop mirrors modules packages repos upstreams view'
|
||||||
complete -c spack -n '__fish_spack_using_command config edit' -s h -l help -f -a help
|
complete -c spack -n '__fish_spack_using_command config edit' -s h -l help -f -a help
|
||||||
complete -c spack -n '__fish_spack_using_command config edit' -s h -l help -d 'show this help message and exit'
|
complete -c spack -n '__fish_spack_using_command config edit' -s h -l help -d 'show this help message and exit'
|
||||||
complete -c spack -n '__fish_spack_using_command config edit' -l print-file -f -a print_file
|
complete -c spack -n '__fish_spack_using_command config edit' -l print-file -f -a print_file
|
||||||
|
Loading…
Reference in New Issue
Block a user