Relax type requirement on pc.cond (#323)

This commit is contained in:
Tommy Dew 2023-01-24 12:20:19 +08:00 committed by GitHub
parent d376d2972b
commit f7e35771e9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 46 additions and 18 deletions

View File

@ -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

View File

@ -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

View File

@ -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 ? "
"<Text>{`cond is True`}</Text> : "
"<Text>{`cond is False`}</Text>}"
)