Skip to content

Commit dd69b64

Browse files
authored
Add subscript notation to packages (spack#48467)
This PR allows using the subscript notation directly on packages. The intent is to reduce the boilerplate needed to retrieve package properties from nodes other than root.
1 parent b670205 commit dd69b64

File tree

18 files changed

+44
-37
lines changed

18 files changed

+44
-37
lines changed

lib/spack/spack/package_base.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,9 @@ def __init__(self, spec):
767767
self.win_rpath = fsys.WindowsSimulatedRPath(self)
768768
super().__init__()
769769

770+
def __getitem__(self, key: str) -> "PackageBase":
771+
return self.spec[key].package
772+
770773
@classmethod
771774
def dependency_names(cls):
772775
return _subkeys(cls.dependencies)

lib/spack/spack/test/package_class.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,3 +285,16 @@ def compilers(compiler, arch_spec):
285285
error = capfd.readouterr()[1]
286286
assert "Skipping tests for package" in error
287287
assert "test requires missing compiler" in error
288+
289+
290+
def test_package_subscript(default_mock_concretization):
291+
"""Tests that we can use the subscript notation on packages, and that it returns a package"""
292+
root = default_mock_concretization("mpileaks")
293+
root_pkg = root.package
294+
295+
# Subscript of a virtual
296+
assert isinstance(root_pkg["mpi"], spack.package_base.PackageBase)
297+
298+
# Subscript on concrete
299+
for d in root.traverse():
300+
assert isinstance(root_pkg[d.name], spack.package_base.PackageBase)

var/spack/repos/builtin/packages/cp2k/package.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -790,7 +790,7 @@ def edit(self, pkg, spec, prefix):
790790
"# include Plumed.inc as recommended by"
791791
"PLUMED to include libraries and flags"
792792
)
793-
mkf.write("include {0}\n".format(spec["plumed"].package.plumed_inc))
793+
mkf.write("include {0}\n".format(self.pkg["plumed"].plumed_inc))
794794

795795
mkf.write("\n# COMPILER, LINKER, TOOLS\n\n")
796796
mkf.write(

var/spack/repos/builtin/packages/glvis/package.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ def common_args(self):
153153
"CC={0}".format(env["CC"]),
154154
"PREFIX={0}".format(self.spec.prefix.bin),
155155
"MFEM_DIR={0}".format(self.spec["mfem"].prefix),
156-
"CONFIG_MK={0}".format(self.spec["mfem"].package.config_mk),
156+
"CONFIG_MK={0}".format(self.pkg["mfem"].config_mk),
157157
]
158158

159159
# https://github.com/spack/spack/issues/42839

var/spack/repos/builtin/packages/gromacs/package.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,7 @@ def patch(self):
585585
)
586586

587587
if self.spec.satisfies("+plumed"):
588-
self.spec["plumed"].package.apply_patch(self)
588+
self["plumed"].apply_patch(self)
589589

590590
if self.spec.satisfies("%nvhpc"):
591591
# Disable obsolete workaround

var/spack/repos/builtin/packages/laghos/package.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ def build_targets(self):
5858
spec = self.spec
5959

6060
targets.append("MFEM_DIR=%s" % spec["mfem"].prefix)
61-
targets.append("CONFIG_MK=%s" % spec["mfem"].package.config_mk)
62-
targets.append("TEST_MK=%s" % spec["mfem"].package.test_mk)
61+
targets.append("CONFIG_MK=%s" % self["mfem"].config_mk)
62+
targets.append("TEST_MK=%s" % self["mfem"].test_mk)
6363
if spec.satisfies("@:2.0"):
6464
targets.append("CXX=%s" % spec["mpi"].mpicxx)
6565
if self.spec.satisfies("+ofast %gcc"):

var/spack/repos/builtin/packages/mfem/package.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1309,7 +1309,7 @@ def libs(self):
13091309
@property
13101310
def config_mk(self):
13111311
"""Export the location of the config.mk file.
1312-
This property can be accessed using spec["mfem"].package.config_mk
1312+
This property can be accessed using pkg["mfem"].config_mk
13131313
"""
13141314
dirs = [self.prefix, self.prefix.share.mfem]
13151315
for d in dirs:
@@ -1321,7 +1321,7 @@ def config_mk(self):
13211321
@property
13221322
def test_mk(self):
13231323
"""Export the location of the test.mk file.
1324-
This property can be accessed using spec["mfem"].package.test_mk.
1324+
This property can be accessed using pkg["mfem"].test_mk.
13251325
In version 3.3.2 and newer, the location of test.mk is also defined
13261326
inside config.mk, variable MFEM_TEST_MK.
13271327
"""

var/spack/repos/builtin/packages/namd/package.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,11 +147,9 @@ def _copy_arch_file(self, lib):
147147
def _append_option(self, opts, lib):
148148
if lib != "python":
149149
self._copy_arch_file(lib)
150-
spec = self.spec
150+
lib_pkg = self[lib]
151151
lib_prefix = (
152-
spec[lib].package.component_prefix
153-
if spec[lib].name == "intel-oneapi-mkl"
154-
else spec[lib].prefix
152+
lib_pkg.component_prefix if lib_pkg.name == "intel-oneapi-mkl" else lib_pkg.prefix
155153
)
156154
opts.extend(["--with-{0}".format(lib), "--{0}-prefix".format(lib), lib_prefix])
157155

var/spack/repos/builtin/packages/nfft/package.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class Nfft(AutotoolsPackage):
3535
@property
3636
def fftw_selected_precisions(self):
3737
if not self._fftw_precisions:
38-
self._fftw_precisions = self.spec["fftw"].package.selected_precisions
38+
self._fftw_precisions = self["fftw"].selected_precisions
3939
return self._fftw_precisions
4040

4141
def configure(self, spec, prefix):

var/spack/repos/builtin/packages/openvdb/package.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,10 @@ def post_install(self):
8484
pyso = "pyopenvdb.dylib"
8585
else:
8686
pyso = "pyopenvdb.so"
87-
pyver = "python{0}".format(spec["python"].package.version.up_to(2))
87+
pyver = f"python{self['python'].version.up_to(2)}"
8888

89-
src = prefix.lib.join(pyver).join(pyso)
89+
src = self.prefix.lib.join(pyver).join(pyso)
9090
if not os.path.isfile(src):
91-
src = prefix.lib64.join(pyver).join(pyso)
91+
src = self.prefix.lib64.join(pyver).join(pyso)
9292
assert os.path.isfile(src)
9393
os.rename(src, os.path.join(python_platlib, pyso))

0 commit comments

Comments
 (0)