Skip to content

Commit d037ed6

Browse files
Merge pull request #3097 from boegel/fix_multi_deps_single
fix generated module statements in case only a single version is listed in multi_deps
2 parents cc753bc + d00725a commit d037ed6

File tree

2 files changed

+136
-2
lines changed

2 files changed

+136
-2
lines changed

easybuild/tools/module_generator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,7 @@ def load_module(self, mod_name, recursive_unload=False, depends_on=False, unload
789789
cond_tmpl = "[ module-info mode remove ] || %s"
790790

791791
if depends_on:
792-
if multi_dep_mods:
792+
if multi_dep_mods and len(multi_dep_mods) > 1:
793793
parent_mod_name = os.path.dirname(mod_name)
794794
guard = self.is_loaded(multi_dep_mods[1:])
795795
if_body = load_template % {'mod_name': parent_mod_name}
@@ -1181,7 +1181,7 @@ def load_module(self, mod_name, recursive_unload=False, depends_on=False, unload
11811181
cond_tmpl = 'mode() == "unload" or %s'
11821182

11831183
if depends_on:
1184-
if multi_dep_mods:
1184+
if multi_dep_mods and len(multi_dep_mods) > 1:
11851185
parent_mod_name = os.path.dirname(mod_name)
11861186
guard = self.is_loaded(multi_dep_mods[1:])
11871187
if_body = load_template % {'mod_name': parent_mod_name}

test/framework/module_generator.py

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,140 @@ def test_load(self):
345345
init_config(build_options={'mod_depends_on': 'True'})
346346
self.assertErrorRegex(EasyBuildError, expected, self.modgen.load_module, "mod_name")
347347

348+
def test_load_multi_deps(self):
349+
"""Test generated load statement when multi_deps is involved."""
350+
351+
# first check with typical two-version multi_deps
352+
multi_dep_mods = ['Python/3.7.4', 'Python/2.7.16']
353+
res = self.modgen.load_module('Python/3.7.4', multi_dep_mods=multi_dep_mods)
354+
355+
if self.MODULE_GENERATOR_CLASS == ModuleGeneratorTcl:
356+
expected = '\n'.join([
357+
'',
358+
"if { ![ is-loaded Python/3.7.4 ] && ![ is-loaded Python/2.7.16 ] } {",
359+
" module load Python/3.7.4",
360+
'}',
361+
'',
362+
])
363+
else: # Lua syntax
364+
expected = '\n'.join([
365+
'',
366+
'if not ( isloaded("Python/3.7.4") ) and not ( isloaded("Python/2.7.16") ) then',
367+
' load("Python/3.7.4")',
368+
'end',
369+
'',
370+
])
371+
self.assertEqual(expected, res)
372+
373+
if self.modtool.supports_depends_on:
374+
# two versions with depends_on
375+
res = self.modgen.load_module('Python/3.7.4', multi_dep_mods=multi_dep_mods, depends_on=True)
376+
377+
if self.MODULE_GENERATOR_CLASS == ModuleGeneratorTcl:
378+
expected = '\n'.join([
379+
'',
380+
"if { [ module-info mode remove ] || [ is-loaded Python/2.7.16 ] } {",
381+
" depends-on Python",
382+
'} else {',
383+
" depends-on Python/3.7.4",
384+
'}',
385+
'',
386+
])
387+
else: # Lua syntax
388+
expected = '\n'.join([
389+
'',
390+
'if mode() == "unload" or isloaded("Python/2.7.16") then',
391+
' depends_on("Python")',
392+
'else',
393+
' depends_on("Python/3.7.4")',
394+
'end',
395+
'',
396+
])
397+
self.assertEqual(expected, res)
398+
399+
# now test with more than two versions...
400+
multi_dep_mods = ['foo/1.2.3', 'foo/2.3.4', 'foo/3.4.5', 'foo/4.5.6']
401+
res = self.modgen.load_module('foo/1.2.3', multi_dep_mods=multi_dep_mods)
402+
403+
if self.MODULE_GENERATOR_CLASS == ModuleGeneratorTcl:
404+
expected = '\n'.join([
405+
'',
406+
"if { ![ is-loaded foo/1.2.3 ] && ![ is-loaded foo/2.3.4 ] && " +
407+
"![ is-loaded foo/3.4.5 ] && ![ is-loaded foo/4.5.6 ] } {",
408+
" module load foo/1.2.3",
409+
'}',
410+
'',
411+
])
412+
else: # Lua syntax
413+
expected = '\n'.join([
414+
'',
415+
'if not ( isloaded("foo/1.2.3") ) and not ( isloaded("foo/2.3.4") ) and ' +
416+
'not ( isloaded("foo/3.4.5") ) and not ( isloaded("foo/4.5.6") ) then',
417+
' load("foo/1.2.3")',
418+
'end',
419+
'',
420+
])
421+
self.assertEqual(expected, res)
422+
423+
if self.modtool.supports_depends_on:
424+
# more than two versions, with depends_on
425+
res = self.modgen.load_module('foo/1.2.3', multi_dep_mods=multi_dep_mods, depends_on=True)
426+
427+
if self.MODULE_GENERATOR_CLASS == ModuleGeneratorTcl:
428+
expected = '\n'.join([
429+
'',
430+
"if { [ module-info mode remove ] || [ is-loaded foo/2.3.4 ] || [ is-loaded foo/3.4.5 ] " +
431+
"|| [ is-loaded foo/4.5.6 ] } {",
432+
" depends-on foo",
433+
"} else {",
434+
" depends-on foo/1.2.3",
435+
'}',
436+
'',
437+
])
438+
else: # Lua syntax
439+
expected = '\n'.join([
440+
'',
441+
'if mode() == "unload" or isloaded("foo/2.3.4") or isloaded("foo/3.4.5") or ' +
442+
'isloaded("foo/4.5.6") then',
443+
' depends_on("foo")',
444+
'else',
445+
' depends_on("foo/1.2.3")',
446+
'end',
447+
'',
448+
])
449+
self.assertEqual(expected, res)
450+
451+
# what if we only list a single version?
452+
# see https://github.com/easybuilders/easybuild-framework/issues/3080
453+
res = self.modgen.load_module('one/1.0', multi_dep_mods=['one/1.0'])
454+
455+
if self.MODULE_GENERATOR_CLASS == ModuleGeneratorTcl:
456+
expected = '\n'.join([
457+
'',
458+
"if { ![ is-loaded one/1.0 ] } {",
459+
" module load one/1.0",
460+
'}',
461+
'',
462+
])
463+
else: # Lua syntax
464+
expected = '\n'.join([
465+
'',
466+
'if not ( isloaded("one/1.0") ) then',
467+
' load("one/1.0")',
468+
'end',
469+
'',
470+
])
471+
self.assertEqual(expected, res)
472+
473+
if self.modtool.supports_depends_on:
474+
res = self.modgen.load_module('one/1.0', multi_dep_mods=['one/1.0'], depends_on=True)
475+
476+
if self.MODULE_GENERATOR_CLASS == ModuleGeneratorTcl:
477+
expected = '\ndepends-on one/1.0\n'
478+
else: # Lua syntax
479+
expected = '\ndepends_on("one/1.0")\n'
480+
self.assertEqual(expected, res)
481+
348482
def test_modulerc(self):
349483
"""Test modulerc method."""
350484
self.assertErrorRegex(EasyBuildError, "Incorrect module_version value type", self.modgen.modulerc, 'foo')

0 commit comments

Comments
 (0)