From dc39bcd6265310decafa847379ead40ffad32d59 Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Tue, 19 Dec 2023 15:52:22 -0800 Subject: [PATCH] pydantic v2 hacks/fixups --- reflex/components/component.py | 2 +- reflex/state.py | 10 +++++++--- reflex/vars.py | 10 ++++++---- tests/utils/test_utils.py | 8 ++++---- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/reflex/components/component.py b/reflex/components/component.py index 63d3f1622..b9ffb6ffd 100644 --- a/reflex/components/component.py +++ b/reflex/components/component.py @@ -727,7 +727,7 @@ class Component(BaseComponent, ABC): # Get Vars associated with component props. for prop in self.get_props(): prop_var = getattr(self, prop) - if isinstance(prop_var, Var): + if isinstance(prop_var, Var) and prop_var is not UnspecifiedVar: vars.append(prop_var) # Style keeps track of its own VarData instance, so embed in a temp Var that is yielded. diff --git a/reflex/state.py b/reflex/state.py index 5570b26a0..1c014366e 100644 --- a/reflex/state.py +++ b/reflex/state.py @@ -902,7 +902,11 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow): for prop_name in self.base_vars: if prop_name == constants.ROUTER: continue # never reset the router data - setattr(self, prop_name, copy.deepcopy(fields[prop_name].default)) + if fields[prop_name].is_required(): + value = self.base_vars[prop_name].get_default_value() + else: + value = copy.deepcopy(fields[prop_name].default) + setattr(self, prop_name, copy.deepcopy(value)) # Recursively reset the substates. for substate in self.substates.values(): @@ -916,8 +920,8 @@ class BaseState(Base, ABC, extra=pydantic.Extra.allow): for prop_name in self.base_vars: field = fields[prop_name] if isinstance(field.default, ClientStorageBase) or ( - isinstance(field.type_, type) - and issubclass(field.type_, ClientStorageBase) + isinstance(field.annotation, type) + and issubclass(field.annotation, ClientStorageBase) ): setattr(self, prop_name, copy.deepcopy(field.default)) diff --git a/reflex/vars.py b/reflex/vars.py index 25144fc1a..a2b5e3443 100644 --- a/reflex/vars.py +++ b/reflex/vars.py @@ -632,6 +632,8 @@ class Var: f"wrongly." ) + if name.startswith("_var"): + print(name) raise AttributeError( f"The State var has no attribute '{name}' or may have been annotated wrongly.", ) @@ -1538,10 +1540,6 @@ class Var: serializers.serializer(_encode_var) -# Marker for a Var that was not passed -UnspecifiedVar = Var() - - @dataclasses.dataclass( eq=False, **{"slots": True} if sys.version_info >= (3, 10) else {}, @@ -1664,6 +1662,10 @@ class BaseVar(Var): return setter +# Marker for a Var that was not passed +UnspecifiedVar = BaseVar(_var_name="") + + @dataclasses.dataclass(init=False, eq=False) class ComputedVar(Var, property): """A field with computed getters.""" diff --git a/tests/utils/test_utils.py b/tests/utils/test_utils.py index 82085dd74..0abba9376 100644 --- a/tests/utils/test_utils.py +++ b/tests/utils/test_utils.py @@ -339,8 +339,8 @@ def test_node_install_windows(tmp_path, mocker): mocker.patch("reflex.utils.processes.stream_logs") class Resp(Base): - status_code = 200 - text = "test" + status_code: int = 200 + text: str = "test" mocker.patch("httpx.stream", return_value=Resp()) download = mocker.patch("reflex.utils.prerequisites.download_and_extract_fnm_zip") @@ -381,8 +381,8 @@ def test_node_install_unix(tmp_path, mocker, machine, system): mocker.patch("reflex.utils.prerequisites.platform.system", return_value=system) class Resp(Base): - status_code = 200 - text = "test" + status_code: int = 200 + text: str = "test" mocker.patch("httpx.stream", return_value=Resp()) download = mocker.patch("reflex.utils.prerequisites.download_and_extract_fnm_zip")