Selaa lähdekoodia

fix: every computed var should get it's own static deps (#4914)

benedikt-bartscher 2 kuukautta sitten
vanhempi
säilyke
b868bc759f
2 muutettua tiedostoa jossa 21 lisäystä ja 1 poistoa
  1. 2 1
      reflex/vars/base.py
  2. 19 0
      tests/units/test_state.py

+ 2 - 1
reflex/vars/base.py

@@ -3,6 +3,7 @@
 from __future__ import annotations
 
 import contextlib
+import copy
 import dataclasses
 import datetime
 import functools
@@ -2146,7 +2147,7 @@ class ComputedVar(Var[RETURN_TYPE]):
             "fget": kwargs.pop("fget", self._fget),
             "initial_value": kwargs.pop("initial_value", self._initial_value),
             "cache": kwargs.pop("cache", self._cache),
-            "deps": kwargs.pop("deps", self._static_deps),
+            "deps": kwargs.pop("deps", copy.copy(self._static_deps)),
             "auto_deps": kwargs.pop("auto_deps", self._auto_deps),
             "interval": kwargs.pop("interval", self._update_interval),
             "backend": kwargs.pop("backend", self._backend),

+ 19 - 0
tests/units/test_state.py

@@ -3916,3 +3916,22 @@ async def test_async_computed_var_get_var_value(mock_app: rx.App, token: str):
 
     other_state.data.append({"foo": "baz"})
     assert "rows" in comp_state.dirty_vars
+
+
+def test_computed_var_mutability() -> None:
+    class CvMixin(rx.State, mixin=True):
+        @rx.var(cache=True, deps=["hi"])
+        def cv(self) -> int:
+            return 42
+
+    class FirstCvState(CvMixin, rx.State):
+        pass
+
+    class SecondCvState(CvMixin, rx.State):
+        pass
+
+    first_cv = FirstCvState.computed_vars["cv"]
+    second_cv = SecondCvState.computed_vars["cv"]
+
+    assert first_cv is not second_cv
+    assert first_cv._static_deps is not second_cv._static_deps