Skip to content

Commit bf27447

Browse files
committed
overhaul of parameters panel_parameters property in CodeExercise and ParameterPanel
* panel_parameters returns now only parameters that are tunable in the panel * parameter now returns all parameters
1 parent 7bd4a97 commit bf27447

File tree

3 files changed

+38
-14
lines changed

3 files changed

+38
-14
lines changed

src/scwidgets/code/_widget_parameter_panel.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from typing import Callable, Dict, List, Union
22

3-
from ipywidgets import Output, VBox, Widget, interactive
3+
from ipywidgets import Output, VBox, Widget, fixed, interactive
44
from traitlets.utils.sentinel import Sentinel
55

66
from ..check import Check
@@ -52,15 +52,28 @@ def parameters_trait(self) -> List[str]:
5252

5353
@property
5454
def parameters(self) -> dict:
55+
"""
56+
:return: All parameters that were given on input are returned. Including also
57+
fixed parameters.
58+
"""
5559
return self._interactive_widget.kwargs.copy()
5660

5761
@parameters.setter
5862
def parameters(self, parameters: dict):
59-
# self._interactive_widget.kwargs is not sync with the trait
60-
# we assume that kwargs has the same order as in the widget children
61-
# to change the value of the children
62-
for i, key in enumerate(self._interactive_widget.kwargs):
63-
self._interactive_widget.children[i].value = parameters[key]
63+
for i, key in enumerate(self._interactive_widget.kwargs.keys()):
64+
self._interactive_widget.kwargs_widgets[i].value = parameters[key]
65+
66+
@property
67+
def panel_parameters(self) -> dict:
68+
"""
69+
:return: Only parameters that are tunable in the parameter panel are returned.
70+
Fixed parameters are ignored.
71+
"""
72+
return {
73+
key: self._interactive_widget.kwargs_widgets[i].value
74+
for i, key in enumerate(self._interactive_widget.kwargs.keys())
75+
if not (isinstance(self._interactive_widget.kwargs_widgets[i], fixed))
76+
}
6477

6578
def observe_parameters(
6679
self,

src/scwidgets/exercise/_widget_code_exercise.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -149,16 +149,12 @@ def __init__(
149149
self._output = CueOutput()
150150

151151
self._parameter_panel: Union[ParameterPanel, None]
152-
self._parameters: Union[dict, None]
153152
if isinstance(parameters, dict):
154153
self._parameter_panel = ParameterPanel(**parameters)
155-
self._parameters = self._parameter_panel.parameters
156154
elif isinstance(parameters, ParameterPanel):
157155
self._parameter_panel = parameters
158-
self._parameters = self._parameter_panel.parameters
159156
else:
160157
self._parameter_panel = None
161-
self._parameters = None
162158

163159
self._cue_code = self._code
164160
self._cue_outputs = cue_outputs
@@ -476,6 +472,21 @@ def answer(self, answer: dict):
476472

477473
@property
478474
def panel_parameters(self) -> Dict[str, Check.FunInParamT]:
475+
"""
476+
:return: Only parameters that are tunable in the parameter panel are returned.
477+
Fixed parameters are ignored.
478+
"""
479+
if self._parameter_panel is not None:
480+
parameter_panel = self._parameter_panel
481+
return parameter_panel.panel_parameters
482+
return {}
483+
484+
@property
485+
def parameters(self) -> Dict[str, Check.FunInParamT]:
486+
"""
487+
:return: All parameters that were given on input are returned. Including also
488+
fixed parameters.
489+
"""
479490
if self._parameter_panel is not None:
480491
parameter_panel = self._parameter_panel
481492
return parameter_panel.parameters
@@ -623,7 +634,7 @@ def _on_click_update_action(self) -> bool:
623634
if self._update_func is not None:
624635
self._update_func(self)
625636
elif self._code is not None:
626-
self.run_code(**self.panel_parameters)
637+
self.run_code(**self.parameters)
627638

628639
for cue_output in self.cue_outputs:
629640
if hasattr(cue_output, "draw_display"):

tests/test_code.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def get_code_exercise(
103103
parameters = None
104104

105105
def update_print(code_ex: CodeExercise):
106-
output = code_ex.run_code(**code_ex.panel_parameters)
106+
output = code_ex.run_code(**code_ex.parameters)
107107
code_ex.cue_outputs[0].display_object = f"Output:\n{output}"
108108

109109
code_ex = CodeExercise(
@@ -198,7 +198,7 @@ def test_compute_and_set_references(self, code_ex):
198198
],
199199
)
200200
def test_run_code(self, code_ex):
201-
output = code_ex.run_code(**code_ex.panel_parameters)
201+
output = code_ex.run_code(**code_ex.parameters)
202202
assert np.allclose((output,), code_ex.checks[0].outputs_references[0])
203203

204204
@pytest.mark.parametrize(
@@ -214,4 +214,4 @@ def test_erroneous_run_code(self, code_ex):
214214
CodeValidationError,
215215
match="NameError in code input: name 'bug' is not defined.*",
216216
):
217-
code_ex.run_code(**code_ex.panel_parameters)
217+
code_ex.run_code(**code_ex.parameters)

0 commit comments

Comments
 (0)