diff --git a/examples/python/django/ds/views.py b/examples/python/django/ds/views.py index 6cb2da03..470aebf3 100644 --- a/examples/python/django/ds/views.py +++ b/examples/python/django/ds/views.py @@ -52,7 +52,7 @@ async def updates_asgi(request): async def time_updates(): while True: yield DatastarStreamingHttpResponse.merge_fragments( - [f"""{datetime.now().isoformat()}"""] + f"""{datetime.now().isoformat()}""" ) await asyncio.sleep(1) yield DatastarStreamingHttpResponse.merge_signals( @@ -110,7 +110,7 @@ def updates_wsgi(request): def time_updates(): while True: yield DatastarStreamingHttpResponse.merge_fragments( - [f"""{datetime.now().isoformat()}"""] + f"""{datetime.now().isoformat()}""" ) time.sleep(0.5) yield DatastarStreamingHttpResponse.merge_signals( diff --git a/examples/python/fastapi/app.py b/examples/python/fastapi/app.py index 6c904801..0b84bb0a 100644 --- a/examples/python/fastapi/app.py +++ b/examples/python/fastapi/app.py @@ -54,7 +54,7 @@ async def read_root(): async def time_updates(): while True: yield DatastarStreamingResponse.merge_fragments( - [f"""{datetime.now().isoformat()}"""] + f"""{datetime.now().isoformat()}""" ) await asyncio.sleep(1) yield DatastarStreamingResponse.merge_signals({"currentTime": f"{datetime.now().isoformat()}"}) diff --git a/examples/python/fasthtml/advanced.py b/examples/python/fasthtml/advanced.py index 42ad3b4f..c406f2fa 100644 --- a/examples/python/fasthtml/advanced.py +++ b/examples/python/fasthtml/advanced.py @@ -93,7 +93,7 @@ def GreatTable(pattern=default_pattern): @app.post async def table(filter: str): async def _(): - yield DatastarStreamingResponse.merge_fragments([GreatTable(filter)]) + yield DatastarStreamingResponse.merge_fragments(GreatTable(filter)) return DatastarStreamingResponse(_()) @@ -151,7 +151,7 @@ def index(): async def clock(): while True: now = datetime.isoformat(datetime.now()) - yield DatastarStreamingResponse.merge_fragments([Span(id="currentTime")(now)]) + yield DatastarStreamingResponse.merge_fragments(Span(id="currentTime")(now)) await asyncio.sleep(1) @@ -165,7 +165,7 @@ async def hello(): async def _(): # Simulate load time await asyncio.sleep(1) - yield DatastarStreamingResponse.merge_fragments([HELLO_BUTTON]) + yield DatastarStreamingResponse.merge_fragments(HELLO_BUTTON) return DatastarStreamingResponse(_()) @@ -185,7 +185,7 @@ async def reset(): async def _(sse): await asyncio.sleep(1) - yield sse.merge_fragments([reset_and_hello]) + yield sse.merge_fragments(reset_and_hello) return DatastarFastHTMLResponse(_) diff --git a/examples/python/fasthtml/simple.py b/examples/python/fasthtml/simple.py index 406dd4eb..75beebca 100644 --- a/examples/python/fasthtml/simple.py +++ b/examples/python/fasthtml/simple.py @@ -46,7 +46,7 @@ async def index(): async def clock(): while True: now = datetime.isoformat(datetime.now()) - yield DatastarStreamingResponse.merge_fragments([Span(id="currentTime")(now)]) + yield DatastarStreamingResponse.merge_fragments(Span(id="currentTime")(now)) await asyncio.sleep(1) yield DatastarStreamingResponse.merge_signals({"currentTime": f"{now}"}) await asyncio.sleep(1) diff --git a/examples/python/quart/app.py b/examples/python/quart/app.py index d2d088ea..87e3e3a0 100644 --- a/examples/python/quart/app.py +++ b/examples/python/quart/app.py @@ -47,7 +47,7 @@ async def updates(): async def time_updates(): while True: yield ServerSentEventGenerator.merge_fragments( - [f"""{datetime.now().isoformat()}"""] + f"""{datetime.now().isoformat()}""" ) await asyncio.sleep(1) yield ServerSentEventGenerator.merge_signals({"currentTime": f"{datetime.now().isoformat()}"}) diff --git a/examples/python/sanic/app.py b/examples/python/sanic/app.py index 465f9dd1..74897ef9 100644 --- a/examples/python/sanic/app.py +++ b/examples/python/sanic/app.py @@ -58,13 +58,11 @@ async def add_signal(request): await response.send( SSE.merge_fragments( - [ - """ + """
Current time from signal: CURRENT_TIME
- """ - ], + """, selector="#timers", merge_mode=FragmentMergeMode.FragmentMergeModeAppend, ) @@ -79,13 +77,11 @@ async def add_fragment(request): await response.send( SSE.merge_fragments( - [ - f"""\ + f"""\
Current time from fragment: {datetime.now().isoformat()}
- """ - ], + """, selector="#timers", merge_mode=FragmentMergeMode.FragmentMergeModeAppend, ) @@ -101,13 +97,11 @@ async def updates(request): while True: await response.send( SSE.merge_fragments( - [ - f""" + f"""
Current time from fragment: {datetime.now().isoformat()}
- """ - ], + """, selector=".fragment", ) ) diff --git a/sdk/python/src/datastar_py/fasthtml.py b/sdk/python/src/datastar_py/fasthtml.py index 8d2848c3..2ba32078 100644 --- a/sdk/python/src/datastar_py/fasthtml.py +++ b/sdk/python/src/datastar_py/fasthtml.py @@ -10,6 +10,7 @@ class DatastarStreamingResponse(_DatastarStreamingResponse): @classmethod @override def merge_fragments(cls, fragments, *args, **kwargs): - xml_fragments = [f if isinstance(f, str) else to_xml(f) for f in fragments] + if not isinstance(fragments, str): + fragments = to_xml(fragments) # From here, business as usual - return super().merge_fragments(xml_fragments, *args, **kwargs) + return super().merge_fragments(fragments, *args, **kwargs) diff --git a/sdk/python/src/datastar_py/sse.py b/sdk/python/src/datastar_py/sse.py index 858c9fd9..0e81772e 100644 --- a/sdk/python/src/datastar_py/sse.py +++ b/sdk/python/src/datastar_py/sse.py @@ -38,7 +38,7 @@ class ServerSentEventGenerator: @classmethod def merge_fragments( cls, - fragments: list[str], + fragments: str, selector: Optional[str] = None, merge_mode: Optional[consts.FragmentMergeMode] = None, use_view_transition: bool = consts.DEFAULT_FRAGMENTS_USE_VIEW_TRANSITIONS, @@ -57,8 +57,7 @@ class ServerSentEventGenerator: data_lines.extend( f"data: {consts.FRAGMENTS_DATALINE_LITERAL} {x}" - for fragment in fragments - for x in fragment.splitlines() + for x in fragments.splitlines() ) return ServerSentEventGenerator._send(