diff --git a/pynecone/components/layout/cond.py b/pynecone/components/layout/cond.py index 8146e2d5a..d80f306f2 100644 --- a/pynecone/components/layout/cond.py +++ b/pynecone/components/layout/cond.py @@ -1,9 +1,7 @@ """Create a list of components from an iterable.""" from __future__ import annotations -from typing import Optional - -import pydantic +from typing import Any, Optional from pynecone.components.component import Component from pynecone.components.layout.fragment import Fragment @@ -15,7 +13,7 @@ class Cond(Component): """Render one of two components based on a condition.""" # The cond to determine which component to render. - cond: Var[bool] + cond: Var[Any] # The component to render if the cond is true. comp1: Component @@ -26,19 +24,6 @@ class Cond(Component): # Whether the cond is within another cond. is_nested: bool = False - @pydantic.validator("cond") - def validate_cond(cls, cond: Var) -> Var: - """Validate that the cond is a boolean. - - Args: - cond: The cond to validate. - - Returns: - The validated cond. - """ - assert issubclass(cond.type_, bool), "The var must be a boolean." - return cond - @classmethod def create( cls, cond: Var, comp1: Component, comp2: Optional[Component] = None diff --git a/pynecone/components/tags/cond_tag.py b/pynecone/components/tags/cond_tag.py index 5aa5e5117..d11f9a780 100644 --- a/pynecone/components/tags/cond_tag.py +++ b/pynecone/components/tags/cond_tag.py @@ -1,5 +1,7 @@ """Tag to conditionally render components.""" +from typing import Any + from pynecone import utils from pynecone.components.tags.tag import Tag from pynecone.var import Var @@ -9,7 +11,7 @@ class CondTag(Tag): """A conditional tag.""" # The condition to determine which component to render. - cond: Var[bool] + cond: Var[Any] # The code to render if the condition is true. true_value: str diff --git a/tests/components/layout/test_cond.py b/tests/components/layout/test_cond.py new file mode 100644 index 000000000..8c956c94a --- /dev/null +++ b/tests/components/layout/test_cond.py @@ -0,0 +1,41 @@ +import pytest + +import pynecone as pc +from pynecone.components.layout.cond import Cond +from pynecone.components.typography.text import Text + + +@pytest.fixture +def cond_state(request): + class CondState(pc.State): + value: request.param["value_type"] = request.param["value"] + + return CondState + + +@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: pc.Var): + """Test if cond can be a pc.Val with any values + + Args: + cond_state: A fixture. + """ + cond_component = Cond.create( + cond_state.value, + Text.create("cond is True"), + Text.create("cond is False"), + ) + + assert str(cond_component) == ( + "{cond_state.value ? " + "{`cond is True`} : " + "{`cond is False`}}" + )