
* fully migrate vars into new system * i hate rufffff (no i don't) * fix silly pright issues (except colormode and state) * remove all instances of Var.create * create immutable callable var and get rid of more base vars * implement hash for all functions * get reflex-web to compile * get it to compile reflex-web successfully * fix tests * fix pyi * use override from typing_extension * put plotly inside of a catch * dicts are unusable sadly * fix silly mistake * overload equals to special case immutable var * improve test_cond * solve more CI issues, down to 94 failures * down to 20 errors * down to 13 errors * pass all testcases * fix pyright issues * reorder things * use get origin more * use fixed_type logic * various optimizations * go back to passing test cases * use less boilerplate * remove unnecessary print message * remove weird comment * add test for html issue * add type ignore * fix another silly issue * override get all var data for var operations call * make integration tests pass * fix immutable call var * better logic for finding parent class * use even better logic for finding state wrt computedvar * only choose the ones that are defined in the same module * small dict to large dict * [REF-3591] Remove chakra-related files from immutable vars PR (#3821) * Add comments to html metadata component (#3731) * fix: add verification for path /404 (#3723) Co-authored-by: coolstorm <manas.gupta@fampay.in> * Use the new state name when setting `is_hydrated` to false (#3738) * Use `._is_mutable()` to account for parent state proxy (#3739) When a parent state proxy is set, also allow child StateProxy._self_mutable to override the parent's `_is_mutable()`. * bump to 0.5.9 (#3746) * add message when installing requirements.txt is needed for chosen template during init (#3750) * #3752 bugfix add domain for XAxis (#3764) * fix appharness app_source typing (#3777) * fix import clash between connectionToaster and hooks.useState (#3749) * use different registry when in china, fixes #3700 (#3702) * do not reload compilation if using local app in AppHarness (#3790) * do not reload if using local app * Update reflex/testing.py Co-authored-by: Masen Furer <m_github@0x26.net> --------- Co-authored-by: Masen Furer <m_github@0x26.net> * Bump memory on relevant actions (#3781) Co-authored-by: Alek Petuskey <alekpetuskey@Aleks-MacBook-Pro.local> * [REF-3334] Validate Toast Props (#3793) * [REF-3536][REF-3537][REF-3541] Move chakra components into its repo(reflex-chakra) (#3798) * fix get_uuid_string_var (#3795) * minor State cleanup (#3768) * Fix code wrap in markdown (#3755) --------- Co-authored-by: Alek Petuskey <alek@pynecone.io> Co-authored-by: Manas Gupta <53006261+Manas1820@users.noreply.github.com> Co-authored-by: coolstorm <manas.gupta@fampay.in> Co-authored-by: Thomas Brandého <thomas.brandeho@gmail.com> Co-authored-by: Shubhankar Dimri <dimrishubhi@gmail.com> Co-authored-by: benedikt-bartscher <31854409+benedikt-bartscher@users.noreply.github.com> Co-authored-by: Khaleel Al-Adhami <khaleel.aladhami@gmail.com> Co-authored-by: Alek Petuskey <alekpetuskey@Aleks-MacBook-Pro.local> Co-authored-by: Elijah Ahianyo <elijahahianyo@gmail.com> * pyproject.toml: bump to 0.6.0a1 * pyproject.toml: depend on reflex-chakra>=0.6.0a New Var system support in reflex-chakra 0.6.0a1 * poetry.lock: relock dependencies * integration: bump listening timeout to 1200 seconds * integration: bump listening timeout to 1800 seconds * Use cached_var_no_lock to avoid ImmutableVar deadlocks (#3835) * Use cached_var_no_lock to avoid ImmutableVar deadlocks ImmutableVar subclasses will always return the same value for a _var_name or _get_all_var_data so there is no need to use a per-class lock to protect a cached attribute on an instance, and doing so actually is observed to cause deadlocks when a particular _cached_var_name creates new LiteralVar instances and attempts to serialize them. * remove unused module global --------- Co-authored-by: Masen Furer <m_github@0x26.net> Co-authored-by: Alek Petuskey <alek@pynecone.io> Co-authored-by: Manas Gupta <53006261+Manas1820@users.noreply.github.com> Co-authored-by: coolstorm <manas.gupta@fampay.in> Co-authored-by: Thomas Brandého <thomas.brandeho@gmail.com> Co-authored-by: Shubhankar Dimri <dimrishubhi@gmail.com> Co-authored-by: benedikt-bartscher <31854409+benedikt-bartscher@users.noreply.github.com> Co-authored-by: Alek Petuskey <alekpetuskey@Aleks-MacBook-Pro.local> Co-authored-by: Elijah Ahianyo <elijahahianyo@gmail.com>
149 lines
4.2 KiB
Python
149 lines
4.2 KiB
Python
import json
|
|
from typing import Any, Union
|
|
|
|
import pytest
|
|
|
|
from reflex.components.base.fragment import Fragment
|
|
from reflex.components.core.cond import Cond, cond
|
|
from reflex.components.radix.themes.typography.text import Text
|
|
from reflex.ivars.base import ImmutableVar, LiteralVar, immutable_computed_var
|
|
from reflex.state import BaseState, State
|
|
from reflex.utils.format import format_state_name
|
|
from reflex.vars import Var
|
|
|
|
|
|
@pytest.fixture
|
|
def cond_state(request):
|
|
class CondState(BaseState):
|
|
value: request.param["value_type"] = request.param["value"] # noqa
|
|
|
|
return CondState
|
|
|
|
|
|
def test_f_string_cond_interpolation():
|
|
# make sure backticks inside interpolation don't get escaped
|
|
var = LiteralVar.create(f"x {cond(True, 'a', 'b')}")
|
|
assert str(var) == '("x "+(Boolean(true) ? "a" : "b"))'
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"cond_state",
|
|
[
|
|
pytest.param({"value_type": bool, "value": True}),
|
|
pytest.param({"value_type": int, "value": 0}),
|
|
pytest.param({"value_type": str, "value": "true"}),
|
|
],
|
|
indirect=True,
|
|
)
|
|
def test_validate_cond(cond_state: BaseState):
|
|
"""Test if cond can be a rx.Var with any values.
|
|
|
|
Args:
|
|
cond_state: A fixture.
|
|
"""
|
|
cond_component = cond(
|
|
cond_state.value,
|
|
Text.create("cond is True"),
|
|
Text.create("cond is False"),
|
|
)
|
|
cond_dict = cond_component.render() if type(cond_component) == Fragment else {}
|
|
assert cond_dict["name"] == "Fragment"
|
|
|
|
[condition] = cond_dict["children"]
|
|
assert condition["cond_state"] == f"isTrue({cond_state.get_full_name()}.value)"
|
|
|
|
# true value
|
|
true_value = condition["true_value"]
|
|
assert true_value["name"] == "Fragment"
|
|
|
|
[true_value_text] = true_value["children"]
|
|
assert true_value_text["name"] == "RadixThemesText"
|
|
assert true_value_text["children"][0]["contents"] == '{"cond is True"}'
|
|
|
|
# false value
|
|
false_value = condition["false_value"]
|
|
assert false_value["name"] == "Fragment"
|
|
|
|
[false_value_text] = false_value["children"]
|
|
assert false_value_text["name"] == "RadixThemesText"
|
|
assert false_value_text["children"][0]["contents"] == '{"cond is False"}'
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
"c1, c2",
|
|
[
|
|
(True, False),
|
|
(32, 0),
|
|
("hello", ""),
|
|
(2.3, 0.0),
|
|
(Var.create("a"), Var.create("b")),
|
|
],
|
|
)
|
|
def test_prop_cond(c1: Any, c2: Any):
|
|
"""Test if cond can be a prop.
|
|
|
|
Args:
|
|
c1: truth condition value
|
|
c2: false condition value
|
|
"""
|
|
prop_cond = cond(
|
|
True,
|
|
c1,
|
|
c2,
|
|
)
|
|
|
|
assert isinstance(prop_cond, Var)
|
|
if not isinstance(c1, Var):
|
|
c1 = json.dumps(c1)
|
|
if not isinstance(c2, Var):
|
|
c2 = json.dumps(c2)
|
|
assert str(prop_cond) == f"(Boolean(true) ? {c1} : {c2})"
|
|
|
|
|
|
def test_cond_no_mix():
|
|
"""Test if cond can't mix components and props."""
|
|
with pytest.raises(ValueError):
|
|
cond(True, Var.create("hello"), Text.create("world"))
|
|
|
|
|
|
def test_cond_no_else():
|
|
"""Test if cond can be used without else."""
|
|
# Components should support the use of cond without else
|
|
comp = cond(True, Text.create("hello"))
|
|
assert isinstance(comp, Fragment)
|
|
comp = comp.children[0]
|
|
assert isinstance(comp, Cond)
|
|
assert comp.cond._decode() is True # type: ignore
|
|
assert comp.comp1.render() == Fragment.create(Text.create("hello")).render()
|
|
assert comp.comp2 == Fragment.create()
|
|
|
|
# Props do not support the use of cond without else
|
|
with pytest.raises(ValueError):
|
|
cond(True, "hello") # type: ignore
|
|
|
|
|
|
def test_cond_computed_var():
|
|
"""Test if cond works with computed vars."""
|
|
|
|
class CondStateComputed(State):
|
|
@immutable_computed_var
|
|
def computed_int(self) -> int:
|
|
return 0
|
|
|
|
@immutable_computed_var
|
|
def computed_str(self) -> str:
|
|
return "a string"
|
|
|
|
comp = cond(True, CondStateComputed.computed_int, CondStateComputed.computed_str)
|
|
|
|
# TODO: shouln't this be a ComputedVar?
|
|
assert isinstance(comp, ImmutableVar)
|
|
|
|
state_name = format_state_name(CondStateComputed.get_full_name())
|
|
assert (
|
|
str(comp)
|
|
== f"(Boolean(true) ? {state_name}.computed_int : {state_name}.computed_str)"
|
|
)
|
|
|
|
assert comp._var_type == Union[int, str]
|