From fd13e559c6eb18d08ece079fe544bff3f35b39d8 Mon Sep 17 00:00:00 2001 From: benedikt-bartscher <31854409+benedikt-bartscher@users.noreply.github.com> Date: Mon, 9 Sep 2024 03:29:37 +0200 Subject: [PATCH] improve state hierarchy validation, drop old testing special case (#3894) --- reflex/app.py | 7 +++---- reflex/state.py | 20 +++++--------------- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/reflex/app.py b/reflex/app.py index a3094885d..9e5c2541a 100644 --- a/reflex/app.py +++ b/reflex/app.py @@ -269,13 +269,12 @@ class App(MiddlewareMixin, LifespanMixin, Base): "`connect_error_component` is deprecated, use `overlay_component` instead" ) super().__init__(**kwargs) - base_state_subclasses = BaseState.__subclasses__() # Special case to allow test cases have multiple subclasses of rx.BaseState. - if not is_testing_env() and len(base_state_subclasses) > 1: - # Only one Base State class is allowed. + if not is_testing_env() and BaseState.__subclasses__() != [State]: + # Only rx.State is allowed as Base State subclass. raise ValueError( - "rx.BaseState cannot be subclassed multiple times. use rx.State instead" + "rx.BaseState cannot be subclassed directly. Use rx.State instead" ) if "breakpoints" in self.style: diff --git a/reflex/state.py b/reflex/state.py index 01c1bb7c9..5dfdf3d8d 100644 --- a/reflex/state.py +++ b/reflex/state.py @@ -495,21 +495,11 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow): if cls.get_name() in set( c.get_name() for c in parent_state.class_subclasses ): - if is_testing_env(): - # Clear existing subclass with same name when app is reloaded via - # utils.prerequisites.get_app(reload=True) - parent_state.class_subclasses = set( - c - for c in parent_state.class_subclasses - if c.get_name() != cls.get_name() - ) - else: - # During normal operation, subclasses cannot have the same name, even if they are - # defined in different modules. - raise StateValueError( - f"The substate class '{cls.get_name()}' has been defined multiple times. " - "Shadowing substate classes is not allowed." - ) + # This should not happen, since we have added module prefix to state names in #3214 + raise StateValueError( + f"The substate class '{cls.get_name()}' has been defined multiple times. " + "Shadowing substate classes is not allowed." + ) # Track this new subclass in the parent state's subclasses set. parent_state.class_subclasses.add(cls)