Skip to content

Commit 9bcfc14

Browse files
committed
deprecate state_auto_setters=True
1 parent 817b8b4 commit 9bcfc14

File tree

4 files changed

+39
-9
lines changed

4 files changed

+39
-9
lines changed

reflex/config.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ class BaseConfig:
237237
env_file: str | None = None
238238

239239
# Whether to automatically create setters for state base vars
240-
state_auto_setters: bool = True
240+
state_auto_setters: bool | None = None
241241

242242
# Whether to display the sticky "Built with Reflex" badge on all pages.
243243
show_built_with_reflex: bool | None = None

reflex/state.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1036,7 +1036,7 @@ def _init_var(cls, name: str, prop: Var):
10361036
)
10371037
raise VarTypeError(msg)
10381038
cls._set_var(name, prop)
1039-
if cls.is_user_defined() and get_config().state_auto_setters:
1039+
if cls.is_user_defined() and get_config().state_auto_setters is not False:
10401040
cls._create_setter(name, prop)
10411041
cls._set_default_value(name, prop)
10421042

reflex/utils/console.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import inspect
88
import os
99
import shutil
10+
import sys
1011
import time
1112
from pathlib import Path
1213
from types import FrameType
@@ -244,23 +245,38 @@ def warn(msg: str, *, dedupe: bool = False, **kwargs):
244245
print_to_log_file(f"[orange1]Warning: {msg}[/orange1]", **kwargs)
245246

246247

247-
def _get_first_non_framework_frame() -> FrameType | None:
248+
@once
249+
def _exclude_paths_from_frame_info() -> list[Path]:
250+
import importlib.util
251+
248252
import click
253+
import granian
254+
import socketio
249255
import typing_extensions
250256

251257
import reflex as rx
252258

253259
# Exclude utility modules that should never be the source of deprecated reflex usage.
254-
exclude_modules = [click, rx, typing_extensions]
260+
exclude_modules = [click, rx, typing_extensions, socketio, granian]
261+
modules_paths = [file for m in exclude_modules if (file := m.__file__)] + [
262+
spec.origin
263+
for m in [*sys.builtin_module_names, *sys.stdlib_module_names]
264+
if (spec := importlib.util.find_spec(m)) and spec.origin
265+
]
255266
exclude_roots = [
256267
p.parent.resolve() if (p := Path(file)).name == "__init__.py" else p.resolve()
257-
for m in exclude_modules
258-
if (file := m.__file__)
268+
for file in modules_paths
259269
]
260270
# Specifically exclude the reflex cli module.
261271
if reflex_bin := shutil.which(b"reflex"):
262272
exclude_roots.append(Path(reflex_bin.decode()))
263273

274+
return exclude_roots
275+
276+
277+
def _get_first_non_framework_frame() -> FrameType | None:
278+
exclude_roots = _exclude_paths_from_frame_info()
279+
264280
frame = inspect.currentframe()
265281
while frame := frame and frame.f_back:
266282
frame_path = Path(inspect.getfile(frame)).resolve()
@@ -297,13 +313,13 @@ def deprecate(
297313
filename = Path(origin_frame.f_code.co_filename)
298314
if filename.is_relative_to(Path.cwd()):
299315
filename = filename.relative_to(Path.cwd())
300-
loc = f"{filename}:{origin_frame.f_lineno}"
316+
loc = f" ({filename}:{origin_frame.f_lineno})"
301317
dedupe_key = f"{dedupe_key} {loc}"
302318

303319
if dedupe_key not in _EMITTED_DEPRECATION_WARNINGS:
304320
msg = (
305321
f"{feature_name} has been deprecated in version {deprecation_version}. {reason.rstrip('.').lstrip('. ')}. It will be completely "
306-
f"removed in {removal_version}. ({loc})"
322+
f"removed in {removal_version}.{loc}"
307323
)
308324
if _LOG_LEVEL <= LogLevel.WARNING:
309325
print(f"[yellow]DeprecationWarning: {msg}[/yellow]", **kwargs)

reflex/vars/base.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,11 @@ 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+
937+
setter_name = Var._get_setter_name_for_name(name)
933938

934939
def setter(state: Any, value: Any):
935940
"""Get the setter for the var.
@@ -938,6 +943,15 @@ def setter(state: Any, value: Any):
938943
state: The state within which we add the setter function.
939944
value: The value to set.
940945
"""
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+
)
941955
if self._var_type in [int, float]:
942956
try:
943957
value = self._var_type(value)
@@ -951,7 +965,7 @@ def setter(state: Any, value: Any):
951965

952966
setter.__annotations__["value"] = self._var_type
953967

954-
setter.__qualname__ = Var._get_setter_name_for_name(name)
968+
setter.__qualname__ = setter_name
955969

956970
return setter
957971

0 commit comments

Comments
 (0)