diff --git a/pynecone/components/layout/cond.py b/pynecone/components/layout/cond.py index b6f24de15..266dac5bb 100644 --- a/pynecone/components/layout/cond.py +++ b/pynecone/components/layout/cond.py @@ -22,13 +22,10 @@ class Cond(Component): # The component to render if the cond is false. comp2: Component - # Whether the cond is within another cond. - is_nested: bool = False - @classmethod def create( cls, cond: Var, comp1: Component, comp2: Optional[Component] = None - ) -> Cond: + ) -> Component: """Create a conditional component. Args: @@ -39,31 +36,23 @@ class Cond(Component): Returns: The conditional component. """ - from pynecone.components.layout.foreach import Foreach - - if comp2 is None: - comp2 = Fragment.create() - if isinstance(comp1, Foreach): - comp1 = Fragment.create(comp1) - if isinstance(comp2, Foreach): - comp2 = Fragment.create(comp2) - if isinstance(comp1, Cond): - comp1.is_nested = True - if isinstance(comp2, Cond): - comp2.is_nested = True - return cls( - cond=cond, - comp1=comp1, - comp2=comp2, - children=[comp1, comp2], - ) # type: ignore + # Wrap everything in fragments. + comp1 = Fragment.create(comp1) + comp2 = Fragment.create(comp2) if comp2 else Fragment.create() + return Fragment.create( + cls( + cond=cond, + comp1=comp1, + comp2=comp2, + children=[comp1, comp2], + ) + ) def _render(self) -> Tag: return CondTag( cond=self.cond, true_value=self.comp1.render(), false_value=self.comp2.render(), - is_nested=self.is_nested, ) diff --git a/pynecone/components/tags/cond_tag.py b/pynecone/components/tags/cond_tag.py index d11f9a780..909f01a65 100644 --- a/pynecone/components/tags/cond_tag.py +++ b/pynecone/components/tags/cond_tag.py @@ -19,9 +19,6 @@ class CondTag(Tag): # The code to render if the condition is false. false_value: str - # Whether the cond tag is nested. - is_nested: bool = False - def __str__(self) -> str: """Render the tag as a React string. @@ -33,5 +30,4 @@ class CondTag(Tag): cond=self.cond.full_name, true_value=self.true_value, false_value=self.false_value, - is_nested=self.is_nested, ) diff --git a/pynecone/utils.py b/pynecone/utils.py index a1240b961..f6e33a215 100644 --- a/pynecone/utils.py +++ b/pynecone/utils.py @@ -1107,7 +1107,6 @@ def format_cond( cond: str, true_value: str, false_value: str = '""', - is_nested: bool = False, is_prop=False, ) -> str: """Format a conditional expression. @@ -1116,7 +1115,6 @@ def format_cond( cond: The cond. true_value: The value to return if the cond is true. false_value: The value to return if the cond is false. - is_nested: Whether the cond is nested. is_prop: Whether the cond is a prop Returns: @@ -1125,17 +1123,15 @@ def format_cond( # Import here to avoid circular imports. from pynecone.var import Var + # Format prop conds. if is_prop: prop1 = Var.create(true_value, is_string=type(true_value) == str) prop2 = Var.create(false_value, is_string=type(false_value) == str) assert prop1 is not None and prop2 is not None, "Invalid prop values" - expr = f"{cond} ? {prop1} : {prop2}".replace("{", "").replace("}", "") - else: - expr = f"{cond} ? {true_value} : {false_value}" + return f"{cond} ? {prop1} : {prop2}".replace("{", "").replace("}", "") - if not is_nested: - expr = wrap(expr, "{") - return expr + # Format component conds. + return wrap(f"{cond} ? {true_value} : {false_value}", "{") def get_event_handler_parts(handler: EventHandler) -> Tuple[str, str]: diff --git a/pyproject.toml b/pyproject.toml index 1d9b524bb..d3dd219a8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pynecone" -version = "0.1.18" +version = "0.1.19" description = "Web apps in pure Python." license = "Apache-2.0" authors = [ diff --git a/tests/components/layout/test_cond.py b/tests/components/layout/test_cond.py index 23a94c734..6bc0fa230 100644 --- a/tests/components/layout/test_cond.py +++ b/tests/components/layout/test_cond.py @@ -28,7 +28,7 @@ def cond_state(request): indirect=True, ) def test_validate_cond(cond_state: pc.Var): - """Test if cond can be a pc.Val with any values. + """Test if cond can be a pc.Var with any values. Args: cond_state: A fixture. @@ -40,9 +40,9 @@ def test_validate_cond(cond_state: pc.Var): ) assert str(cond_component) == ( - "{cond_state.value ? " - "{`cond is True`} : " - "{`cond is False`}}" + "{cond_state.value ? " + "{`cond is True`} : " + "{`cond is False`}}" ) @@ -78,9 +78,11 @@ 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 == True # noqa - assert comp.comp1 == Text.create("hello") + assert comp.comp1 == Fragment.create(Text.create("hello")) assert comp.comp2 == Fragment.create() # Props do not support the use of cond without else