From 0c08f2c31e96af4ac1a8816df0a2782ae1232d7b Mon Sep 17 00:00:00 2001 From: Vasileios Karakasis Date: Tue, 22 Nov 2022 22:57:21 +0100 Subject: [PATCH] Fix variable aliasing --- reframe/core/variables.py | 30 +++++++++++++++++++++++++++--- unittests/test_pipeline.py | 5 ++--- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/reframe/core/variables.py b/reframe/core/variables.py index 961744e850..f285d39561 100644 --- a/reframe/core/variables.py +++ b/reframe/core/variables.py @@ -7,8 +7,8 @@ # Functionality to build extensible variable spaces into ReFrame tests. # -import math import copy +import math import reframe.core.fields as fields import reframe.core.namespaces as namespaces @@ -258,6 +258,9 @@ def is_loggable(self): def is_defined(self): return self._default_value is not Undefined + def is_alias(self): + return self._target is not None + def undefine(self): self._default_value = Undefined @@ -267,14 +270,14 @@ def define(self, value): @property def _default_value(self): - if self._target: + if self.is_alias(): return self._target._default_value else: return self._p_default_value @_default_value.setter def _default_value(self, value): - if self._target: + if self.is_alias(): self._target._default_value = value else: self._p_default_value = value @@ -305,6 +308,18 @@ def field(self): def name(self): return self._name + @property + def target(self): + return self._target + + def reset_target(self, new_target): + if not self.is_deprecated(): + self._p_field = new_target._field + else: + self._p_field._target_field = new_target._field + + self._target = new_target + def __set_name__(self, owner, name): self._name = name @@ -687,6 +702,9 @@ def __init__(self, other): self._warn_deprecation(DEPRECATE_RD) + def __repr__(self): + return super().__repr__().replace('TestVar', 'ShadowVar') + class VarSpace(namespaces.Namespace): '''Variable space of a regression test. @@ -724,6 +742,12 @@ def join(self, other, cls): self.vars[key] = copy.deepcopy(var) + # Inherited variables are copied in the current namespace, so we need + # to update any aliases to point to the current namespace copies + for var in self.vars.values(): + if var.is_alias(): + var.reset_target(self.vars[var.target.name]) + # Carry over the set of injected variables self._injected_vars.update(other._injected_vars) diff --git a/unittests/test_pipeline.py b/unittests/test_pipeline.py index 0d6a8350cc..b21b354eb7 100644 --- a/unittests/test_pipeline.py +++ b/unittests/test_pipeline.py @@ -1892,16 +1892,15 @@ def set_defaults(self): assert x.bar == 100 -def _test_variables_deprecation(): +def test_variables_deprecation(): with pytest.warns(ReframeDeprecationWarning): class _X(rfm.RunOnlyRegressionTest): variables = {'FOO': 1} test = _X() - print('===') assert test.env_vars['FOO'] == 1 with pytest.warns(ReframeDeprecationWarning): - test.variables['BAR'] == 2 + test.variables['BAR'] = 2 assert test.env_vars['BAR'] == 2