improve state hierarchy validation, drop old testing special case (#3894)

This commit is contained in:
benedikt-bartscher 2024-09-09 03:29:37 +02:00 committed by GitHub
parent 477e1dece9
commit fd13e559c6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 8 additions and 19 deletions

View File

@ -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:

View File

@ -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)