Skip to content

Commit fb6ff38

Browse files
authored
Merge pull request #4690 from Flamefire/ext-list-improvement
Refactor `make_extension_string`
2 parents 13208ea + 00b99bd commit fb6ff38

File tree

2 files changed

+28
-39
lines changed

2 files changed

+28
-39
lines changed

easybuild/framework/easyblock.py

+22-15
Original file line numberDiff line numberDiff line change
@@ -1523,8 +1523,8 @@ def make_module_extra_extensions(self):
15231523
# set environment variable that specifies list of extensions
15241524
# We need only name and version, so don't resolve templates
15251525
exts_list = self.make_extension_string(ext_sep=',', sort=False)
1526-
env_var_name = convert_name(self.name, upper=True)
1527-
lines.append(self.module_generator.set_environment('EBEXTSLIST%s' % env_var_name, exts_list))
1526+
env_var_name = 'EBEXTSLIST' + convert_name(self.name, upper=True)
1527+
lines.append(self.module_generator.set_environment(env_var_name, exts_list))
15281528

15291529
return ''.join(lines)
15301530

@@ -1803,14 +1803,32 @@ def load_dependency_modules(self):
18031803
# EXTENSIONS UTILITY FUNCTIONS
18041804
#
18051805

1806-
def _make_extension_list(self):
1806+
def make_extension_string(self, name_version_sep='-', ext_sep=', ', sort=True):
1807+
"""
1808+
Generate a string with a list of extensions returned by make_extension_list.
1809+
1810+
The name and version are separated by name_version_sep and each extension is separated by ext_sep.
1811+
For customization of extensions the make_extension_list method should be used.
1812+
"""
1813+
exts_list = (name_version_sep.join(ext) for ext in self.make_extension_list())
1814+
if sort:
1815+
exts_list = sorted(exts_list, key=str.lower)
1816+
return ext_sep.join(exts_list)
1817+
1818+
def make_extension_list(self):
18071819
"""
18081820
Return a list of extension names and their versions included in this installation
18091821
1810-
Each entry should be a (name, version) tuple or just (name, ) if no version exists
1822+
Each entry should be a (name, version) tuple or just (name, ) if no version exists.
1823+
Custom EasyBlocks may override this to add extensions that cannot be found automatically.
18111824
"""
18121825
# Each extension in exts_list is either a string or a list/tuple with name, version as first entries
18131826
# As name can be a templated value we must resolve templates
1827+
if hasattr(self, '_make_extension_list'):
1828+
self.log.nosupport("self._make_extension_list is replaced by self.make_extension_list", '5.0')
1829+
if type(self).make_extension_string != EasyBlock.make_extension_string:
1830+
self.log.nosupport("self.make_extension_string should not be overridden", '5.0')
1831+
18141832
exts_list = []
18151833
for ext in self.cfg.get_ref('exts_list'):
18161834
if isinstance(ext, str):
@@ -1820,17 +1838,6 @@ def _make_extension_list(self):
18201838
resolve_template(ext[1], self.cfg.template_values)))
18211839
return exts_list
18221840

1823-
def make_extension_string(self, name_version_sep='-', ext_sep=', ', sort=True):
1824-
"""
1825-
Generate a string with a list of extensions.
1826-
1827-
The name and version are separated by name_version_sep and each extension is separated by ext_sep
1828-
"""
1829-
exts_list = (name_version_sep.join(ext) for ext in self._make_extension_list())
1830-
if sort:
1831-
exts_list = sorted(exts_list, key=str.lower)
1832-
return ext_sep.join(exts_list)
1833-
18341841
def prepare_for_extensions(self):
18351842
"""Ran before installing extensions (eg to set templates)"""
18361843

easybuild/tools/module_generator.py

+6-24
Original file line numberDiff line numberDiff line change
@@ -623,21 +623,6 @@ def use(self, paths, prefix=None, guarded=False, user_modpath=None):
623623
"""
624624
raise NotImplementedError
625625

626-
def _generate_extension_list(self):
627-
"""
628-
Generate a string with a list of extensions.
629-
630-
The name and version are separated by name_version_sep and each extension is separated by ext_sep
631-
"""
632-
return self.app.make_extension_string()
633-
634-
def _generate_extensions_list(self):
635-
"""
636-
Generate a list of all extensions in name/version format
637-
"""
638-
exts_str = self.app.make_extension_string(name_version_sep='/', ext_sep=',')
639-
return exts_str.split(',') if exts_str else []
640-
641626
def _generate_help_text(self):
642627
"""
643628
Generate syntax-independent help text used for `module help`.
@@ -684,7 +669,7 @@ def _generate_help_text(self):
684669
lines.extend(self._generate_section("Compatible modules", compatible_modules_txt))
685670

686671
# Extensions (if any)
687-
extensions = self._generate_extension_list()
672+
extensions = self.app.make_extension_string()
688673
lines.extend(self._generate_section("Included extensions", '\n'.join(wrap(extensions, 78))))
689674

690675
return '\n'.join(lines)
@@ -699,10 +684,10 @@ def _generate_multi_deps_list(self):
699684
mod_list = []
700685
txt = ''
701686
vlist = self.app.cfg['multi_deps'].get(key)
702-
for idx in range(len(vlist)):
687+
for idx, version in enumerate(vlist):
703688
for deplist in self.app.cfg.multi_deps:
704689
for dep in deplist:
705-
if dep['name'] == key and dep['version'] == vlist[idx]:
690+
if dep['name'] == key and dep['version'] == version:
706691
modname = dep['short_mod_name']
707692
# indicate which version is loaded by default (unless that's disabled)
708693
if idx == 0 and self.app.cfg['multi_deps_load_default']:
@@ -741,7 +726,7 @@ def _generate_whatis_lines(self):
741726
if multi_deps:
742727
whatis.append("Compatible modules: %s" % ', '.join(multi_deps))
743728

744-
extensions = self._generate_extension_list()
729+
extensions = self.app.make_extension_string()
745730
if extensions:
746731
whatis.append("Extensions: %s" % extensions)
747732

@@ -1300,12 +1285,9 @@ def get_description(self, conflict=True):
13001285
elif conflict:
13011286
# conflict on 'name' part of module name (excluding version part at the end)
13021287
lines.extend(['', 'conflict("%s")' % os.path.dirname(self.app.short_mod_name)])
1303-
1304-
if build_option('module_extensions'):
1305-
extensions_list = self._generate_extensions_list()
1306-
1288+
extensions_list = self.app.make_extension_string(name_version_sep='/', ext_sep=',')
13071289
if extensions_list:
1308-
extensions_stmt = 'extensions("%s")' % ','.join([str(x) for x in extensions_list])
1290+
extensions_stmt = 'extensions("%s")' % extensions_list
13091291
# put this behind a Lmod version check as 'extensions' is only (well) supported since Lmod 8.2.8,
13101292
# see https://lmod.readthedocs.io/en/latest/330_extensions.html#module-extensions and
13111293
# https://github.com/TACC/Lmod/issues/428

0 commit comments

Comments
 (0)