Skip to content

Commit fb26cf3

Browse files
authored
Merge pull request #60 from rstudio/inputs-readonly
2 parents 899dc0e + c81821f commit fb26cf3

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

shiny/reactive.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,9 @@
4444
# Value
4545
# ==============================================================================
4646
class Value(Generic[T]):
47-
def __init__(self, value: T) -> None:
47+
def __init__(self, value: T, *, _read_only: bool = False) -> None:
4848
self._value: T = value
49+
self._read_only: bool = _read_only
4950
self._dependents: Dependents = Dependents()
5051

5152
# Calling the object is equivalent to `.get()`
@@ -58,6 +59,15 @@ def get(self) -> T:
5859
return self._value
5960

6061
def set(self, value: T) -> bool:
62+
if self._read_only:
63+
raise RuntimeError(
64+
"Can't set read-only reactive.Value. If you are trying to set an input value, use `update_xxx()` instead."
65+
)
66+
return self._set(value)
67+
68+
# The ._set() method allows setting read-only Value objects. This is used when the
69+
# Value is part of a session.Inputs object, and the session wants to set it.
70+
def _set(self, value: T) -> bool:
6171
if self._value is value:
6272
return False
6373

shiny/session.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ def _manage_inputs(self, data: Dict[str, object]) -> None:
238238
if len(keys) == 2:
239239
val = input_handlers.process_value(keys[1], val, keys[0], self)
240240

241-
self.input[keys[0]].set(val)
241+
self.input[keys[0]]._set(val)
242242

243243
# ==========================================================================
244244
# Message handlers
@@ -537,7 +537,7 @@ class Inputs:
537537
def __init__(self, **kwargs: object) -> None:
538538
self._map: dict[str, Value[Any]] = {}
539539
for key, value in kwargs.items():
540-
self._map[key] = Value(value)
540+
self._map[key] = Value(value, _read_only=True)
541541

542542
def __setitem__(self, key: str, value: Value[Any]) -> None:
543543
if not isinstance(value, Value):
@@ -550,7 +550,7 @@ def __getitem__(self, key: str) -> Value[Any]:
550550
# dependencies on input values that haven't been received from client
551551
# yet.
552552
if key not in self._map:
553-
self._map[key] = Value(None)
553+
self._map[key] = Value(None, _read_only=True)
554554

555555
return self._map[key]
556556

0 commit comments

Comments
 (0)