Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion reflex/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ class BaseConfig:
env_file: str | None = None

# Whether to automatically create setters for state base vars
state_auto_setters: bool = True
state_auto_setters: bool | None = None

# Whether to display the sticky "Built with Reflex" badge on all pages.
show_built_with_reflex: bool | None = None
Expand Down
2 changes: 1 addition & 1 deletion reflex/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -1036,7 +1036,7 @@ def _init_var(cls, name: str, prop: Var):
)
raise VarTypeError(msg)
cls._set_var(name, prop)
if cls.is_user_defined() and get_config().state_auto_setters:
if cls.is_user_defined() and get_config().state_auto_setters is not False:
cls._create_setter(name, prop)
cls._set_default_value(name, prop)

Expand Down
28 changes: 22 additions & 6 deletions reflex/utils/console.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import inspect
import os
import shutil
import sys
import time
from pathlib import Path
from types import FrameType
Expand Down Expand Up @@ -244,23 +245,38 @@ def warn(msg: str, *, dedupe: bool = False, **kwargs):
print_to_log_file(f"[orange1]Warning: {msg}[/orange1]", **kwargs)


def _get_first_non_framework_frame() -> FrameType | None:
@once
def _exclude_paths_from_frame_info() -> list[Path]:
import importlib.util

import click
import granian
import socketio
import typing_extensions

import reflex as rx

# Exclude utility modules that should never be the source of deprecated reflex usage.
exclude_modules = [click, rx, typing_extensions]
exclude_modules = [click, rx, typing_extensions, socketio, granian]
modules_paths = [file for m in exclude_modules if (file := m.__file__)] + [
spec.origin
for m in [*sys.builtin_module_names, *sys.stdlib_module_names]
if (spec := importlib.util.find_spec(m)) and spec.origin
]
exclude_roots = [
p.parent.resolve() if (p := Path(file)).name == "__init__.py" else p.resolve()
for m in exclude_modules
if (file := m.__file__)
for file in modules_paths
]
# Specifically exclude the reflex cli module.
if reflex_bin := shutil.which(b"reflex"):
exclude_roots.append(Path(reflex_bin.decode()))
Comment thread
adhami3310 marked this conversation as resolved.

return exclude_roots


def _get_first_non_framework_frame() -> FrameType | None:
exclude_roots = _exclude_paths_from_frame_info()

frame = inspect.currentframe()
while frame := frame and frame.f_back:
frame_path = Path(inspect.getfile(frame)).resolve()
Expand Down Expand Up @@ -297,13 +313,13 @@ def deprecate(
filename = Path(origin_frame.f_code.co_filename)
if filename.is_relative_to(Path.cwd()):
filename = filename.relative_to(Path.cwd())
loc = f"{filename}:{origin_frame.f_lineno}"
loc = f" ({filename}:{origin_frame.f_lineno})"
dedupe_key = f"{dedupe_key} {loc}"

if dedupe_key not in _EMITTED_DEPRECATION_WARNINGS:
msg = (
f"{feature_name} has been deprecated in version {deprecation_version}. {reason.rstrip('.').lstrip('. ')}. It will be completely "
f"removed in {removal_version}. ({loc})"
f"removed in {removal_version}.{loc}"
)
if _LOG_LEVEL <= LogLevel.WARNING:
print(f"[yellow]DeprecationWarning: {msg}[/yellow]", **kwargs)
Expand Down
16 changes: 15 additions & 1 deletion reflex/vars/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -930,6 +930,11 @@ def _get_setter(self, name: str) -> Callable[[BaseState, Any], None]:
Returns:
A function that that creates a setter for the var.
"""
from reflex.config import get_config

config = get_config()

setter_name = Var._get_setter_name_for_name(name)

def setter(state: Any, value: Any):
"""Get the setter for the var.
Expand All @@ -938,6 +943,15 @@ def setter(state: Any, value: Any):
state: The state within which we add the setter function.
value: The value to set.
"""
if config.state_auto_setters is None:
console.deprecate(
feature_name="state_auto_setters defaulting to True",
reason="The default value will be changed to False in a future release. Set state_auto_setters explicitly or define setters explicitly. "
f"Used {setter_name} in {type(state).__name__} without defining it.",
deprecation_version="0.8.9",
removal_version="0.9.0",
dedupe=True,
)
Comment thread
adhami3310 marked this conversation as resolved.
Outdated
if self._var_type in [int, float]:
try:
value = self._var_type(value)
Expand All @@ -951,7 +965,7 @@ def setter(state: Any, value: Any):

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

setter.__qualname__ = Var._get_setter_name_for_name(name)
setter.__qualname__ = setter_name

return setter

Expand Down
Loading