Skip to content

Commit 314cf7c

Browse files
authored
Merge pull request #3081 from boegel/fix_dump_mandatory_params
always include mandatory easyconfig parameters in dumped easyconfig
2 parents b514905 + bf71ba1 commit 314cf7c

File tree

3 files changed

+45
-18
lines changed

3 files changed

+45
-18
lines changed

easybuild/framework/easyconfig/easyconfig.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1514,6 +1514,10 @@ def __getitem__(self, key):
15141514

15151515
return value
15161516

1517+
def is_mandatory_param(self, key):
1518+
"""Check whether specified easyconfig parameter is mandatory."""
1519+
return key in self.mandatory
1520+
15171521
def get_ref(self, key):
15181522
"""
15191523
Obtain reference to original/untemplated value of specified easyconfig parameter

easybuild/framework/easyconfig/format/one.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,9 @@ def dump(self, ecfg, default_values, templ_const, templ_val):
286286
# print other easyconfig parameters at the end
287287
keys_to_ignore = printed_keys + LAST_PARAMS
288288
for key in default_values:
289-
if key not in keys_to_ignore and ecfg[key] != default_values[key]:
289+
mandatory = ecfg.is_mandatory_param(key)
290+
non_default_value = ecfg[key] != default_values[key]
291+
if key not in keys_to_ignore and (mandatory or non_default_value):
290292
dump.extend(self._find_param_with_comments(key, quote_py_str(ecfg[key]), templ_const, templ_val))
291293
dump.append('')
292294

test/framework/easyconfig.py

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -148,13 +148,18 @@ def test_mandatory(self):
148148
])
149149
self.prep()
150150

151-
eb = EasyConfig(self.eb_file)
151+
ec = EasyConfig(self.eb_file)
152152

153-
self.assertEqual(eb['name'], "pi")
154-
self.assertEqual(eb['version'], "3.14")
155-
self.assertEqual(eb['homepage'], "http://example.com")
156-
self.assertEqual(eb['toolchain'], {"name": "system", "version": "system"})
157-
self.assertEqual(eb['description'], "test easyconfig")
153+
self.assertEqual(ec['name'], "pi")
154+
self.assertEqual(ec['version'], "3.14")
155+
self.assertEqual(ec['homepage'], "http://example.com")
156+
self.assertEqual(ec['toolchain'], {"name": "system", "version": "system"})
157+
self.assertEqual(ec['description'], "test easyconfig")
158+
159+
for key in ['name', 'version', 'homepage', 'toolchain', 'description']:
160+
self.assertTrue(ec.is_mandatory_param(key))
161+
for key in ['buildopts', 'dependencies', 'easyblock', 'sources']:
162+
self.assertFalse(ec.is_mandatory_param(key))
158163

159164
def test_validation(self):
160165
""" test other validations beside mandatory parameters """
@@ -318,24 +323,26 @@ def test_extra_options(self):
318323

319324
extra_vars = {'custom_key': ['default', "This is a default key", easyconfig.CUSTOM]}
320325

321-
eb = EasyConfig(self.eb_file, extra_options=extra_vars)
322-
self.assertEqual(eb['custom_key'], 'default')
326+
ec = EasyConfig(self.eb_file, extra_options=extra_vars)
327+
self.assertEqual(ec['custom_key'], 'default')
328+
329+
self.assertFalse(ec.is_mandatory_param('custom_key'))
323330

324-
eb['custom_key'] = "not so default"
325-
self.assertEqual(eb['custom_key'], 'not so default')
331+
ec['custom_key'] = "not so default"
332+
self.assertEqual(ec['custom_key'], 'not so default')
326333

327334
self.contents += "\ncustom_key = 'test'"
328335

329336
self.prep()
330337

331-
eb = EasyConfig(self.eb_file, extra_options=extra_vars)
332-
self.assertEqual(eb['custom_key'], 'test')
338+
ec = EasyConfig(self.eb_file, extra_options=extra_vars)
339+
self.assertEqual(ec['custom_key'], 'test')
333340

334-
eb['custom_key'] = "not so default"
335-
self.assertEqual(eb['custom_key'], 'not so default')
341+
ec['custom_key'] = "not so default"
342+
self.assertEqual(ec['custom_key'], 'not so default')
336343

337344
# test if extra toolchain options are being passed
338-
self.assertEqual(eb.toolchain.options['static'], True)
345+
self.assertEqual(ec.toolchain.options['static'], True)
339346

340347
# test extra mandatory parameters
341348
extra_vars.update({'mandatory_key': ['default', 'another mandatory key', easyconfig.MANDATORY]})
@@ -345,9 +352,23 @@ def test_extra_options(self):
345352
self.contents += '\nmandatory_key = "value"'
346353
self.prep()
347354

348-
eb = EasyConfig(self.eb_file, extra_options=extra_vars)
355+
ec = EasyConfig(self.eb_file, extra_options=extra_vars)
356+
357+
self.assertEqual(ec['mandatory_key'], 'value')
358+
self.assertTrue(ec.is_mandatory_param('mandatory_key'))
359+
360+
# check whether mandatory key is retained in dumped easyconfig file, even if it's set to the default value
361+
ec['mandatory_key'] = 'default'
362+
test_ecfile = os.path.join(self.test_prefix, 'test_dump_mandatory.eb')
363+
ec.dump(test_ecfile)
364+
365+
regex = re.compile("^mandatory_key = 'default'$", re.M)
366+
ectxt = read_file(test_ecfile)
367+
self.assertTrue(regex.search(ectxt), "Pattern '%s' found in: %s" % (regex.pattern, ectxt))
349368

350-
self.assertEqual(eb['mandatory_key'], 'value')
369+
# parsing again should work fine (if mandatory easyconfig parameters are indeed retained)
370+
ec = EasyConfig(test_ecfile, extra_options=extra_vars)
371+
self.assertEqual(ec['mandatory_key'], 'default')
351372

352373
def test_exts_list(self):
353374
"""Test handling of list of extensions."""

0 commit comments

Comments
 (0)