From 586601b1692a1e2f6d35317877bd4cd3ce866bc1 Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Wed, 6 Mar 2024 12:02:42 -0800 Subject: [PATCH] All Var-typed props are implicitly Optional For compatibility with existing Component wraps, if the type is Var and a default is not provided, mark it as Optional and set a default of None. Fix _rename_props inheritance for pydantic-v2. --- reflex/components/component.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/reflex/components/component.py b/reflex/components/component.py index cb26cbd5b..4fe74bcd2 100644 --- a/reflex/components/component.py +++ b/reflex/components/component.py @@ -219,20 +219,26 @@ class Component(BaseComponent, ABC): # Set default values for any props. if types._issubclass(field.annotation, Var): - # TODO: pydantic v2 AttributeError: 'FieldInfo' object attribute 'is_required' is read-only - # field.is_required = False if not isinstance(field.default, PydanticUndefinedType): + # Wrap all given default values in Var field.default = Var.create(field.default) + # Var type fields are implicitly Optional + if field.is_required(): + field.annotation = Optional[field.annotation] + field.default = None + # Ensure renamed props from parent classes are applied to the subclass. - if cls._rename_props: + if cls._rename_props.default: inherited_rename_props = {} for parent in reversed(cls.mro()): - if issubclass(parent, Component) and parent._rename_props: - if isinstance(parent._rename_props, ModelPrivateAttr): - parent._rename_props = parent._rename_props.default - inherited_rename_props.update(parent._rename_props) - cls._rename_props = inherited_rename_props + if issubclass(parent, Component) and isinstance( + parent._rename_props, ModelPrivateAttr + ): + inherited_rename_props.update(parent._rename_props.default) + cls._rename_props.default = inherited_rename_props + + cls.model_rebuild(force=True) def __init__(self, *args, **kwargs): """Initialize the component.