Skip to content

Commit 4e22efd

Browse files
Mike ProsserMike Prosser
authored andcommitted
add default value to get_value()
1 parent 96498f7 commit 4e22efd

File tree

4 files changed

+49
-6
lines changed

4 files changed

+49
-6
lines changed

examples/sample/sample_panel.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,28 @@
88

99
st.title("Sample Panel")
1010

11-
col1, col2 = st.columns([0.4, 0.6])
11+
col1, col2, col3 = st.columns([0.4, 0.3, 0.3])
1212

1313
with col1:
14+
st.markdown("**Type**")
1415
st.write("String")
1516
st.write("Integer")
1617
st.write("Float")
1718
st.write("Boolean")
1819
st.write("List")
1920

2021
with col2:
22+
st.markdown("**Set Values**")
2123
st.write(panel.get_value("sample_string"))
2224
st.write(panel.get_value("sample_int"))
2325
st.write(panel.get_value("sample_float"))
2426
st.write(panel.get_value("sample_bool"))
2527
st.write(panel.get_value("float_values"))
28+
29+
with col3:
30+
st.markdown("**Default Values**")
31+
st.write(panel.get_value("missing_string", "0"))
32+
st.write(panel.get_value("missing_int", 0))
33+
st.write(panel.get_value("missing_float", 0.0))
34+
st.write(panel.get_value("missing_bool", False))
35+
st.write(panel.get_value("missing_list", [0.0]))

src/nipanel/_panel_value_accessor.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,23 @@ def panel_id(self) -> str:
4141
"""Read-only accessor for the panel ID."""
4242
return self._panel_id
4343

44-
def get_value(self, value_id: str) -> object:
45-
"""Get the value for a control on the panel.
44+
def get_value(self, value_id: str, default_value: object = None) -> object:
45+
"""Get the value for a control on the panel with an optional default value.
4646
4747
Args:
4848
value_id: The id of the value
49+
default_value: The default value to return if the value is not set
4950
5051
Returns:
51-
The value
52+
The value, or the default value if not set
5253
"""
53-
return self._panel_client.get_value(self._panel_id, value_id)
54+
try:
55+
return self._panel_client.get_value(self._panel_id, value_id)
56+
except grpc.RpcError as e:
57+
if e.code() == grpc.StatusCode.NOT_FOUND and default_value is not None:
58+
return default_value
59+
else:
60+
raise e
5461

5562
def set_value(self, value_id: str, value: object) -> None:
5663
"""Set the value for a control on the panel.

tests/unit/test_streamlit_panel.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ def test___panel___set_value___sets_value(
123123
}
124124

125125

126-
def test___panel___get_unset_value___raises_exception(
126+
def test___panel___get_unset_value_with_no_default___raises_exception(
127127
fake_panel_channel: grpc.Channel,
128128
) -> None:
129129
"""Test that get_value() raises an exception for an unset value."""
@@ -146,6 +146,30 @@ def test___panel___set_value___gets_value(
146146
assert panel.get_value(value_id) == string_value
147147

148148

149+
def test___set_value___get_value_ignores_default(
150+
fake_panel_channel: grpc.Channel,
151+
) -> None:
152+
panel = StreamlitPanel("my_panel", "path/to/script", grpc_channel=fake_panel_channel)
153+
154+
value_id = "test_id"
155+
string_value = "test_value"
156+
panel.set_value(value_id, string_value)
157+
158+
assert panel.get_value(value_id, "default") == string_value
159+
160+
161+
def test___get_value_returns_default_when_value_not_set(
162+
fake_panel_channel: grpc.Channel,
163+
) -> None:
164+
panel = StreamlitPanel("my_panel", "path/to/script", grpc_channel=fake_panel_channel)
165+
166+
assert panel.get_value("missing_string", "default") == "default"
167+
assert panel.get_value("missing_int", 123) == 123
168+
assert panel.get_value("missing_float", 1.23) == 1.23
169+
assert panel.get_value("missing_bool", True) is True
170+
assert panel.get_value("missing_list", [1, 2, 3]) == [1, 2, 3]
171+
172+
149173
@pytest.mark.parametrize(
150174
"value_payload",
151175
[

tests/utils/_fake_python_panel_servicer.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ def EnumeratePanels( # noqa: N802
5959

6060
def GetValue(self, request: GetValueRequest, context: Any) -> GetValueResponse: # noqa: N802
6161
"""Trivial implementation for testing."""
62+
if request.value_id not in self._panel_value_ids.get(request.panel_id, {}):
63+
context.abort(grpc.StatusCode.NOT_FOUND, "Value ID not found in panel")
6264
value = self._panel_value_ids[request.panel_id][request.value_id]
6365
return GetValueResponse(value=value)
6466

0 commit comments

Comments
 (0)