improve state hierarchy validation, drop old testing special case (#3894)
This commit is contained in:
parent
477e1dece9
commit
fd13e559c6
@ -269,13 +269,12 @@ class App(MiddlewareMixin, LifespanMixin, Base):
|
|||||||
"`connect_error_component` is deprecated, use `overlay_component` instead"
|
"`connect_error_component` is deprecated, use `overlay_component` instead"
|
||||||
)
|
)
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
base_state_subclasses = BaseState.__subclasses__()
|
|
||||||
|
|
||||||
# Special case to allow test cases have multiple subclasses of rx.BaseState.
|
# Special case to allow test cases have multiple subclasses of rx.BaseState.
|
||||||
if not is_testing_env() and len(base_state_subclasses) > 1:
|
if not is_testing_env() and BaseState.__subclasses__() != [State]:
|
||||||
# Only one Base State class is allowed.
|
# Only rx.State is allowed as Base State subclass.
|
||||||
raise ValueError(
|
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:
|
if "breakpoints" in self.style:
|
||||||
|
@ -495,21 +495,11 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow):
|
|||||||
if cls.get_name() in set(
|
if cls.get_name() in set(
|
||||||
c.get_name() for c in parent_state.class_subclasses
|
c.get_name() for c in parent_state.class_subclasses
|
||||||
):
|
):
|
||||||
if is_testing_env():
|
# This should not happen, since we have added module prefix to state names in #3214
|
||||||
# Clear existing subclass with same name when app is reloaded via
|
raise StateValueError(
|
||||||
# utils.prerequisites.get_app(reload=True)
|
f"The substate class '{cls.get_name()}' has been defined multiple times. "
|
||||||
parent_state.class_subclasses = set(
|
"Shadowing substate classes is not allowed."
|
||||||
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."
|
|
||||||
)
|
|
||||||
# Track this new subclass in the parent state's subclasses set.
|
# Track this new subclass in the parent state's subclasses set.
|
||||||
parent_state.class_subclasses.add(cls)
|
parent_state.class_subclasses.add(cls)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user