Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 27 additions & 3 deletions reframe/core/variables.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand All @@ -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
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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)

Expand Down
5 changes: 2 additions & 3 deletions unittests/test_pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -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