Skip to content

Commit 23591b1

Browse files
committed
Add source validators to delegate parameter validator
This will ensure that when the validator is used to find the datatype of a parameter it can be detected correctly
1 parent ad7d762 commit 23591b1

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

src/qcodes/parameters/delegate_parameter.py

+17
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
from collections.abc import Sequence
99
from datetime import datetime
1010

11+
from qcodes.validators.validators import Validator
12+
1113
from .parameter_base import ParamDataType, ParamRawDataType
1214

1315

@@ -314,3 +316,18 @@ def validate(self, value: ParamDataType) -> None:
314316
super().validate(value)
315317
if self.source is not None:
316318
self.source.validate(self._from_value_to_raw_value(value))
319+
320+
@property
321+
def validators(self) -> tuple[Validator, ...]:
322+
"""
323+
Tuple of all validators associated with the parameter. Note that this
324+
includes validators of the source parameter if source parameter is set
325+
and has any validators.
326+
327+
:getter: All validators associated with the parameter.
328+
"""
329+
source_validators: tuple[Validator, ...] = (
330+
self.source.validators if self.source is not None else ()
331+
)
332+
333+
return source_validators + tuple(self._vals)

src/qcodes/parameters/parameter_base.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -382,9 +382,10 @@ def vals(self) -> Validator | None:
382382
RuntimeError: If removing the first validator when more than one validator is set.
383383
384384
"""
385+
validators = self.validators
385386

386-
if len(self._vals):
387-
return self._vals[0]
387+
if len(validators):
388+
return validators[0]
388389
else:
389390
return None
390391

tests/parameter/test_delegate_parameter.py

+13
Original file line numberDiff line numberDiff line change
@@ -627,6 +627,19 @@ def test_value_validation() -> None:
627627
delegate_param.validate(11)
628628

629629

630+
def test_validator_delegates_as_expected() -> None:
631+
source_param = Parameter("source", set_cmd=None, get_cmd=None)
632+
delegate_param = DelegateParameter("delegate", source=source_param)
633+
some_validator = vals.Numbers(-10, 10)
634+
source_param.vals = some_validator
635+
delegate_param.vals = None
636+
delegate_param.validate(1)
637+
with pytest.raises(ValueError):
638+
delegate_param.validate(11)
639+
assert delegate_param.validators == (some_validator,)
640+
assert delegate_param.vals == some_validator
641+
642+
630643
def test_value_validation_with_offset_and_scale() -> None:
631644
source_param = Parameter(
632645
"source", set_cmd=None, get_cmd=None, vals=vals.Numbers(-5, 5)

0 commit comments

Comments
 (0)