From 2146632e79ba2e0f8f5a3b0775cab2049ea4422a Mon Sep 17 00:00:00 2001 From: Benedikt Bartscher Date: Wed, 4 Dec 2024 22:11:15 +0100 Subject: [PATCH 1/5] feat: allow disabling auto-setters via REFLEX_AUTO_CREATE_SETTERS --- reflex/config.py | 3 +++ reflex/state.py | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/reflex/config.py b/reflex/config.py index 88230cefec3..9627efa20a9 100644 --- a/reflex/config.py +++ b/reflex/config.py @@ -564,6 +564,9 @@ class EnvironmentVariables: # The maximum size of the reflex state in kilobytes. REFLEX_STATE_SIZE_LIMIT: EnvVar[int] = env_var(1000) + # Whether to automatically create setters for state base vars + REFLEX_AUTO_CREATE_SETTERS: EnvVar[bool] = env_var(True) + environment = EnvironmentVariables() diff --git a/reflex/state.py b/reflex/state.py index 55f29cf45f3..7163fb69af5 100644 --- a/reflex/state.py +++ b/reflex/state.py @@ -43,7 +43,7 @@ from typing_extensions import Self from reflex import event -from reflex.config import PerformanceMode, get_config +from reflex.config import EnvironmentVariables, PerformanceMode, get_config from reflex.istate.data import RouterData from reflex.istate.storage import ClientStorageBase from reflex.model import Model @@ -979,7 +979,8 @@ def _init_var(cls, prop: Var): f'Found var "{prop._js_expr}" with type {prop._var_type}.' ) cls._set_var(prop) - cls._create_setter(prop) + if EnvironmentVariables.REFLEX_AUTO_CREATE_SETTERS.get(): + cls._create_setter(prop) cls._set_default_value(prop) @classmethod From a5ed8d9da90f2c80218693a3cb503d6eb64761fb Mon Sep 17 00:00:00 2001 From: Benedikt Bartscher Date: Wed, 4 Dec 2024 23:54:13 +0100 Subject: [PATCH 2/5] refactor to rx.Config --- reflex/config.py | 6 +++--- reflex/state.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/reflex/config.py b/reflex/config.py index 9627efa20a9..62b185d8a9f 100644 --- a/reflex/config.py +++ b/reflex/config.py @@ -564,9 +564,6 @@ class EnvironmentVariables: # The maximum size of the reflex state in kilobytes. REFLEX_STATE_SIZE_LIMIT: EnvVar[int] = env_var(1000) - # Whether to automatically create setters for state base vars - REFLEX_AUTO_CREATE_SETTERS: EnvVar[bool] = env_var(True) - environment = EnvironmentVariables() @@ -686,6 +683,9 @@ class Config: # Path to file containing key-values pairs to override in the environment; Dotenv format. env_file: Optional[str] = None + # Whether to automatically create setters for state base vars + state_auto_setters: bool = True + def __init__(self, *args, **kwargs): """Initialize the config values. diff --git a/reflex/state.py b/reflex/state.py index 7163fb69af5..592827b49d5 100644 --- a/reflex/state.py +++ b/reflex/state.py @@ -43,7 +43,7 @@ from typing_extensions import Self from reflex import event -from reflex.config import EnvironmentVariables, PerformanceMode, get_config +from reflex.config import PerformanceMode, get_config from reflex.istate.data import RouterData from reflex.istate.storage import ClientStorageBase from reflex.model import Model @@ -979,7 +979,7 @@ def _init_var(cls, prop: Var): f'Found var "{prop._js_expr}" with type {prop._var_type}.' ) cls._set_var(prop) - if EnvironmentVariables.REFLEX_AUTO_CREATE_SETTERS.get(): + if get_config().state_auto_setters: cls._create_setter(prop) cls._set_default_value(prop) From b5423931181b12ddbdeb180452190585189e1e28 Mon Sep 17 00:00:00 2001 From: Khaleel Al-Adhami Date: Tue, 6 May 2025 11:04:39 -0700 Subject: [PATCH 3/5] add get config import --- reflex/state.py | 1 + 1 file changed, 1 insertion(+) diff --git a/reflex/state.py b/reflex/state.py index b56f051cecd..d864391988f 100644 --- a/reflex/state.py +++ b/reflex/state.py @@ -1013,6 +1013,7 @@ def _init_var(cls, prop: Var): Raises: VarTypeError: if the variable has an incorrect type """ + from reflex.config import get_config from reflex.utils.exceptions import VarTypeError if not types.is_valid_var_type(prop._var_type): From d24d1ac37791f17da40038dd53090a8d9eb90467 Mon Sep 17 00:00:00 2001 From: Khaleel Al-Adhami Date: Tue, 6 May 2025 11:31:07 -0700 Subject: [PATCH 4/5] add test and disable create set var --- reflex/state.py | 7 ++++++- tests/units/test_state.py | 27 +++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/reflex/state.py b/reflex/state.py index d864391988f..e1580447847 100644 --- a/reflex/state.py +++ b/reflex/state.py @@ -1095,7 +1095,12 @@ def _create_event_handler(cls, fn: Any): @classmethod def _create_setvar(cls): """Create the setvar method for the state.""" - cls.setvar = cls.event_handlers["setvar"] = EventHandlerSetVar(state_cls=cls) + from reflex.config import get_config + + if get_config().state_auto_setters: + cls.setvar = cls.event_handlers["setvar"] = EventHandlerSetVar( + state_cls=cls + ) @classmethod def _create_setter(cls, prop: Var): diff --git a/tests/units/test_state.py b/tests/units/test_state.py index a1599c16f99..4981c108d12 100644 --- a/tests/units/test_state.py +++ b/tests/units/test_state.py @@ -3406,6 +3406,33 @@ def test_redis_state_manager_config_knobs_invalid_lock_warning_threshold( del sys.modules[constants.Config.MODULE] +def test_auto_setters_off(tmp_path): + proj_root = tmp_path / "project1" + proj_root.mkdir() + + config_string = """ +import reflex as rx +config = rx.Config( + app_name="project1", + state_auto_setters=False, +) + """ + + (proj_root / "rxconfig.py").write_text(dedent(config_string)) + + with chdir(proj_root): + # reload config for each parameter to avoid stale values + reflex.config.get_config(reload=True) + from reflex.state import State + + class TestState(State): + """A test state.""" + + num: int = 0 + + assert TestState.event_handlers == {} + + class MixinState(State, mixin=True): """A mixin state for testing.""" From 5a430920bb9a8f932003afc919d1a6eb59c870c6 Mon Sep 17 00:00:00 2001 From: Khaleel Al-Adhami Date: Tue, 6 May 2025 11:51:48 -0700 Subject: [PATCH 5/5] we don't need to disable this guy --- reflex/state.py | 7 +------ tests/units/test_state.py | 2 +- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/reflex/state.py b/reflex/state.py index e1580447847..d864391988f 100644 --- a/reflex/state.py +++ b/reflex/state.py @@ -1095,12 +1095,7 @@ def _create_event_handler(cls, fn: Any): @classmethod def _create_setvar(cls): """Create the setvar method for the state.""" - from reflex.config import get_config - - if get_config().state_auto_setters: - cls.setvar = cls.event_handlers["setvar"] = EventHandlerSetVar( - state_cls=cls - ) + cls.setvar = cls.event_handlers["setvar"] = EventHandlerSetVar(state_cls=cls) @classmethod def _create_setter(cls, prop: Var): diff --git a/tests/units/test_state.py b/tests/units/test_state.py index 4981c108d12..1fa02dd2a6f 100644 --- a/tests/units/test_state.py +++ b/tests/units/test_state.py @@ -3430,7 +3430,7 @@ class TestState(State): num: int = 0 - assert TestState.event_handlers == {} + assert list(TestState.event_handlers) == ["setvar"] class MixinState(State, mixin=True):