spack.modules: move get_module up (#46428)
This commit is contained in:
parent
14e8902854
commit
7711730f2c
@ -173,7 +173,7 @@ def loads(module_type, specs, args, out=None):
|
|||||||
modules = list(
|
modules = list(
|
||||||
(
|
(
|
||||||
spec,
|
spec,
|
||||||
spack.modules.common.get_module(
|
spack.modules.get_module(
|
||||||
module_type,
|
module_type,
|
||||||
spec,
|
spec,
|
||||||
get_full_path=False,
|
get_full_path=False,
|
||||||
@ -222,7 +222,7 @@ def find(module_type, specs, args):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
modules = [
|
modules = [
|
||||||
spack.modules.common.get_module(
|
spack.modules.get_module(
|
||||||
module_type,
|
module_type,
|
||||||
spec,
|
spec,
|
||||||
args.full_path,
|
args.full_path,
|
||||||
@ -233,7 +233,7 @@ def find(module_type, specs, args):
|
|||||||
]
|
]
|
||||||
|
|
||||||
modules.append(
|
modules.append(
|
||||||
spack.modules.common.get_module(
|
spack.modules.get_module(
|
||||||
module_type,
|
module_type,
|
||||||
single_spec,
|
single_spec,
|
||||||
args.full_path,
|
args.full_path,
|
||||||
|
@ -7,8 +7,16 @@
|
|||||||
include Tcl non-hierarchical modules, Lua hierarchical modules, and others.
|
include Tcl non-hierarchical modules, Lua hierarchical modules, and others.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
from typing import Dict, Type
|
from typing import Dict, Type
|
||||||
|
|
||||||
|
import llnl.util.tty as tty
|
||||||
|
|
||||||
|
import spack.repo
|
||||||
|
import spack.spec
|
||||||
|
import spack.store
|
||||||
|
|
||||||
|
from . import common
|
||||||
from .common import BaseModuleFileWriter, disable_modules
|
from .common import BaseModuleFileWriter, disable_modules
|
||||||
from .lmod import LmodModulefileWriter
|
from .lmod import LmodModulefileWriter
|
||||||
from .tcl import TclModulefileWriter
|
from .tcl import TclModulefileWriter
|
||||||
@ -19,3 +27,66 @@
|
|||||||
"tcl": TclModulefileWriter,
|
"tcl": TclModulefileWriter,
|
||||||
"lmod": LmodModulefileWriter,
|
"lmod": LmodModulefileWriter,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_module(
|
||||||
|
module_type, spec: spack.spec.Spec, get_full_path, module_set_name="default", required=True
|
||||||
|
):
|
||||||
|
"""Retrieve the module file for a given spec and module type.
|
||||||
|
|
||||||
|
Retrieve the module file for the given spec if it is available. If the
|
||||||
|
module is not available, this will raise an exception unless the module
|
||||||
|
is excluded or if the spec is installed upstream.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
module_type: the type of module we want to retrieve (e.g. lmod)
|
||||||
|
spec: refers to the installed package that we want to retrieve a module
|
||||||
|
for
|
||||||
|
required: if the module is required but excluded, this function will
|
||||||
|
print a debug message. If a module is missing but not excluded,
|
||||||
|
then an exception is raised (regardless of whether it is required)
|
||||||
|
get_full_path: if ``True``, this returns the full path to the module.
|
||||||
|
Otherwise, this returns the module name.
|
||||||
|
module_set_name: the named module configuration set from modules.yaml
|
||||||
|
for which to retrieve the module.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The module name or path. May return ``None`` if the module is not
|
||||||
|
available.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
upstream = spec.installed_upstream
|
||||||
|
except spack.repo.UnknownPackageError:
|
||||||
|
upstream, record = spack.store.STORE.db.query_by_spec_hash(spec.dag_hash())
|
||||||
|
if upstream:
|
||||||
|
module = common.upstream_module_index.upstream_module(spec, module_type)
|
||||||
|
if not module:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if get_full_path:
|
||||||
|
return module.path
|
||||||
|
else:
|
||||||
|
return module.use_name
|
||||||
|
else:
|
||||||
|
writer = module_types[module_type](spec, module_set_name)
|
||||||
|
if not os.path.isfile(writer.layout.filename):
|
||||||
|
fmt_str = "{name}{@version}{/hash:7}"
|
||||||
|
if not writer.conf.excluded:
|
||||||
|
raise common.ModuleNotFoundError(
|
||||||
|
"The module for package {} should be at {}, but it does not exist".format(
|
||||||
|
spec.format(fmt_str), writer.layout.filename
|
||||||
|
)
|
||||||
|
)
|
||||||
|
elif required:
|
||||||
|
tty.debug(
|
||||||
|
"The module configuration has excluded {}: omitting it".format(
|
||||||
|
spec.format(fmt_str)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
if get_full_path:
|
||||||
|
return writer.layout.filename
|
||||||
|
else:
|
||||||
|
return writer.layout.use_name
|
||||||
|
@ -46,7 +46,6 @@
|
|||||||
import spack.deptypes as dt
|
import spack.deptypes as dt
|
||||||
import spack.environment
|
import spack.environment
|
||||||
import spack.error
|
import spack.error
|
||||||
import spack.modules
|
|
||||||
import spack.paths
|
import spack.paths
|
||||||
import spack.projections as proj
|
import spack.projections as proj
|
||||||
import spack.repo
|
import spack.repo
|
||||||
@ -324,67 +323,6 @@ def upstream_module(self, spec, module_type):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def get_module(module_type, spec, get_full_path, module_set_name="default", required=True):
|
|
||||||
"""Retrieve the module file for a given spec and module type.
|
|
||||||
|
|
||||||
Retrieve the module file for the given spec if it is available. If the
|
|
||||||
module is not available, this will raise an exception unless the module
|
|
||||||
is excluded or if the spec is installed upstream.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
module_type: the type of module we want to retrieve (e.g. lmod)
|
|
||||||
spec: refers to the installed package that we want to retrieve a module
|
|
||||||
for
|
|
||||||
required: if the module is required but excluded, this function will
|
|
||||||
print a debug message. If a module is missing but not excluded,
|
|
||||||
then an exception is raised (regardless of whether it is required)
|
|
||||||
get_full_path: if ``True``, this returns the full path to the module.
|
|
||||||
Otherwise, this returns the module name.
|
|
||||||
module_set_name: the named module configuration set from modules.yaml
|
|
||||||
for which to retrieve the module.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
The module name or path. May return ``None`` if the module is not
|
|
||||||
available.
|
|
||||||
"""
|
|
||||||
try:
|
|
||||||
upstream = spec.installed_upstream
|
|
||||||
except spack.repo.UnknownPackageError:
|
|
||||||
upstream, record = spack.store.STORE.db.query_by_spec_hash(spec.dag_hash())
|
|
||||||
if upstream:
|
|
||||||
module = upstream_module_index.upstream_module(spec, module_type)
|
|
||||||
if not module:
|
|
||||||
return None
|
|
||||||
|
|
||||||
if get_full_path:
|
|
||||||
return module.path
|
|
||||||
else:
|
|
||||||
return module.use_name
|
|
||||||
else:
|
|
||||||
writer = spack.modules.module_types[module_type](spec, module_set_name)
|
|
||||||
if not os.path.isfile(writer.layout.filename):
|
|
||||||
fmt_str = "{name}{@version}{/hash:7}"
|
|
||||||
if not writer.conf.excluded:
|
|
||||||
raise ModuleNotFoundError(
|
|
||||||
"The module for package {} should be at {}, but it does not exist".format(
|
|
||||||
spec.format(fmt_str), writer.layout.filename
|
|
||||||
)
|
|
||||||
)
|
|
||||||
elif required:
|
|
||||||
tty.debug(
|
|
||||||
"The module configuration has excluded {}: omitting it".format(
|
|
||||||
spec.format(fmt_str)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
if get_full_path:
|
|
||||||
return writer.layout.filename
|
|
||||||
else:
|
|
||||||
return writer.layout.use_name
|
|
||||||
|
|
||||||
|
|
||||||
class BaseConfiguration:
|
class BaseConfiguration:
|
||||||
"""Manipulates the information needed to generate a module file to make
|
"""Manipulates the information needed to generate a module file to make
|
||||||
querying easier. It needs to be sub-classed for specific module types.
|
querying easier. It needs to be sub-classed for specific module types.
|
||||||
|
@ -171,7 +171,7 @@ def test_get_module_upstream():
|
|||||||
old_index = spack.modules.common.upstream_module_index
|
old_index = spack.modules.common.upstream_module_index
|
||||||
spack.modules.common.upstream_module_index = upstream_index
|
spack.modules.common.upstream_module_index = upstream_index
|
||||||
|
|
||||||
m1_path = spack.modules.common.get_module("tcl", s1, True)
|
m1_path = spack.modules.get_module("tcl", s1, True)
|
||||||
assert m1_path == "/path/to/a"
|
assert m1_path == "/path/to/a"
|
||||||
finally:
|
finally:
|
||||||
spack.modules.common.upstream_module_index = old_index
|
spack.modules.common.upstream_module_index = old_index
|
||||||
@ -193,7 +193,7 @@ def find_nothing(*args):
|
|||||||
with pytest.raises(spack.repo.UnknownPackageError):
|
with pytest.raises(spack.repo.UnknownPackageError):
|
||||||
spec.package
|
spec.package
|
||||||
|
|
||||||
module_path = spack.modules.common.get_module("tcl", spec, True)
|
module_path = spack.modules.get_module("tcl", spec, True)
|
||||||
assert module_path
|
assert module_path
|
||||||
|
|
||||||
spack.package_base.PackageBase.uninstall_by_spec(spec)
|
spack.package_base.PackageBase.uninstall_by_spec(spec)
|
||||||
|
Loading…
Reference in New Issue
Block a user