Skip to content

Commit

Permalink
improve foreach behavior with strings (reflex-dev#4751)
Browse files Browse the repository at this point in the history
* improve foreach behavior with strings

* add a defensive guard before giving up

* add integration tests
  • Loading branch information
adhami3310 authored Feb 6, 2025
1 parent ab558ce commit b3b79a6
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 2 deletions.
14 changes: 12 additions & 2 deletions reflex/components/core/foreach.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,10 @@ def create(
TypeError: If the render function is a ComponentState.
UntypedVarError: If the iterable is of type Any without a type annotation.
"""
from reflex.vars.object import ObjectVar
from reflex.vars import ArrayVar, ObjectVar, StringVar

iterable = LiteralVar.create(iterable).guess_type()

iterable = LiteralVar.create(iterable)
if iterable._var_type == Any:
raise ForeachVarError(
f"Could not foreach over var `{iterable!s}` of type Any. "
Expand All @@ -75,6 +76,15 @@ def create(
if isinstance(iterable, ObjectVar):
iterable = iterable.entries()

if isinstance(iterable, StringVar):
iterable = iterable.split()

if not isinstance(iterable, ArrayVar):
raise ForeachVarError(
f"Could not foreach over var `{iterable!s}` of type {iterable._var_type}. "
"See https://reflex.dev/docs/library/dynamic-rendering/foreach/"
)

component = cls(
iterable=iterable,
render_fn=render_fn,
Expand Down
10 changes: 10 additions & 0 deletions tests/integration/test_var_operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -628,6 +628,14 @@ def index():
),
id="dict_in_foreach3",
),
rx.box(
rx.foreach("abcdef", lambda x: rx.text.span(x + " ")),
id="str_in_foreach",
),
rx.box(
rx.foreach(VarOperationState.str_var1, lambda x: rx.text.span(x + " ")),
id="str_var_in_foreach",
),
rx.box(
rx.foreach(
VarOperationState.people,
Expand Down Expand Up @@ -844,6 +852,8 @@ def test_var_operations(driver, var_operations: AppHarness):
("dict_in_foreach1", "a1b2"),
("dict_in_foreach2", "12"),
("dict_in_foreach3", "1234"),
("str_in_foreach", "a b c d e f"),
("str_var_in_foreach", "f i r s t"),
("typed_dict_in_foreach", "Hello Alice33Hello Bob28"),
]

Expand Down

0 comments on commit b3b79a6

Please sign in to comment.