Skip to content

Commit b0ed239

Browse files
authored
deprecate state auto settings at compile time (#5746)
* move state_auth_setters deprecation warning to compile time * Also warn for setvar
1 parent 5e23de5 commit b0ed239

File tree

2 files changed

+43
-16
lines changed

2 files changed

+43
-16
lines changed

reflex/state.py

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,8 +225,20 @@ def __call__(self, *args: Any) -> EventSpec:
225225
EventHandlerValueError: If the given Var name is not a str
226226
NotImplementedError: If the setter for the given Var is async
227227
"""
228+
from reflex.config import get_config
228229
from reflex.utils.exceptions import EventHandlerValueError
229230

231+
config = get_config()
232+
if config.state_auto_setters is None:
233+
console.deprecate(
234+
feature_name="state_auto_setters defaulting to True",
235+
reason="The default value will be changed to False in a future release. Set state_auto_setters explicitly or define setters explicitly. "
236+
f"Used {self.state_cls.__name__}.setvar without defining it.",
237+
deprecation_version="0.8.9",
238+
removal_version="0.9.0",
239+
dedupe=True,
240+
)
241+
230242
if args:
231243
if not isinstance(args[0], str):
232244
msg = f"Var name must be passed as a string, got {args[0]!r}"
@@ -1096,19 +1108,22 @@ def _set_var(cls, name: str, prop: Var):
10961108
setattr(cls, name, prop)
10971109

10981110
@classmethod
1099-
def _create_event_handler(cls, fn: Any):
1111+
def _create_event_handler(
1112+
cls, fn: Any, event_handler_cls: type[EventHandler] = EventHandler
1113+
):
11001114
"""Create an event handler for the given function.
11011115
11021116
Args:
11031117
fn: The function to create an event handler for.
1118+
event_handler_cls: The event handler class to use.
11041119
11051120
Returns:
11061121
The event handler.
11071122
"""
11081123
# Check if function has stored event_actions from decorator
11091124
event_actions = getattr(fn, "_rx_event_actions", {})
11101125

1111-
return EventHandler(
1126+
return event_handler_cls(
11121127
fn=fn, state_full_name=cls.get_full_name(), event_actions=event_actions
11131128
)
11141129

@@ -1125,9 +1140,34 @@ def _create_setter(cls, name: str, prop: Var):
11251140
name: The name of the var.
11261141
prop: The var to create a setter for.
11271142
"""
1143+
from reflex.config import get_config
1144+
1145+
config = get_config()
1146+
_create_event_handler_kwargs = {}
1147+
1148+
if config.state_auto_setters is None:
1149+
1150+
class EventHandlerDeprecatedSetter(EventHandler):
1151+
def __call__(self, *args, **kwargs):
1152+
console.deprecate(
1153+
feature_name="state_auto_setters defaulting to True",
1154+
reason="The default value will be changed to False in a future release. Set state_auto_setters explicitly or define setters explicitly. "
1155+
f"Used {setter_name} in {cls.__name__} without defining it.",
1156+
deprecation_version="0.8.9",
1157+
removal_version="0.9.0",
1158+
dedupe=True,
1159+
)
1160+
return super().__call__(*args, **kwargs)
1161+
1162+
_create_event_handler_kwargs["event_handler_cls"] = (
1163+
EventHandlerDeprecatedSetter
1164+
)
1165+
11281166
setter_name = Var._get_setter_name_for_name(name)
11291167
if setter_name not in cls.__dict__:
1130-
event_handler = cls._create_event_handler(prop._get_setter(name))
1168+
event_handler = cls._create_event_handler(
1169+
prop._get_setter(name), **_create_event_handler_kwargs
1170+
)
11311171
cls.event_handlers[setter_name] = event_handler
11321172
setattr(cls, setter_name, event_handler)
11331173

reflex/vars/base.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -930,10 +930,6 @@ def _get_setter(self, name: str) -> Callable[[BaseState, Any], None]:
930930
Returns:
931931
A function that that creates a setter for the var.
932932
"""
933-
from reflex.config import get_config
934-
935-
config = get_config()
936-
937933
setter_name = Var._get_setter_name_for_name(name)
938934

939935
def setter(state: Any, value: Any):
@@ -943,15 +939,6 @@ def setter(state: Any, value: Any):
943939
state: The state within which we add the setter function.
944940
value: The value to set.
945941
"""
946-
if config.state_auto_setters is None:
947-
console.deprecate(
948-
feature_name="state_auto_setters defaulting to True",
949-
reason="The default value will be changed to False in a future release. Set state_auto_setters explicitly or define setters explicitly. "
950-
f"Used {setter_name} in {type(state).__name__} without defining it.",
951-
deprecation_version="0.8.9",
952-
removal_version="0.9.0",
953-
dedupe=True,
954-
)
955942
if self._var_type in [int, float]:
956943
try:
957944
value = self._var_type(value)

0 commit comments

Comments
 (0)