Skip to content

Commit 42e39e2

Browse files
committed
coverage
1 parent 0bf0c97 commit 42e39e2

File tree

3 files changed

+29
-81
lines changed

3 files changed

+29
-81
lines changed

pydantic_ai_slim/pydantic_ai/ui/adapter.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -190,16 +190,11 @@ async def process_stream(
190190
async for event in event_stream.handle_stream(stream):
191191
yield event
192192

193-
try:
194-
result = event_stream.result
195-
if on_complete is not None and result is not None:
193+
if (result := event_stream.result) and on_complete is not None:
196194
if _utils.is_async_callable(on_complete):
197195
await on_complete(result)
198196
else:
199197
await _utils.run_in_executor(on_complete, result)
200-
except Exception as e: # TODO (DouweM): coverage
201-
async for event in event_stream.on_error(e):
202-
yield event
203198

204199
async def run_stream(
205200
self,

pydantic_ai_slim/pydantic_ai/ui/event_stream.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ async def handle_stream(self, stream: AsyncIterator[SourceEvent]) -> AsyncIterat
117117
if turn != next_turn:
118118
if turn == 'request':
119119
async for e in self.after_request():
120-
yield e # TODO (DouweM): coverage
120+
yield e
121121
elif turn == 'response':
122122
async for e in self.after_response():
123123
yield e # TODO (DouweM): coverage
@@ -178,7 +178,7 @@ async def handle_event(self, event: SourceEvent) -> AsyncIterator[EventT]: # no
178178
case FinalResultEvent():
179179
self._final_result_event = event
180180
async for e in self.handle_final_result(event):
181-
yield e # TODO (DouweM): coverage
181+
yield e
182182
case FunctionToolCallEvent():
183183
async for e in self.handle_function_tool_call(event):
184184
yield e # TODO (DouweM): coverage
@@ -204,7 +204,7 @@ async def handle_event(self, event: SourceEvent) -> AsyncIterator[EventT]: # no
204204

205205
self.result = event.result
206206
async for e in self.handle_run_result(event):
207-
yield e # TODO (DouweM): coverage
207+
yield e
208208
case _:
209209
pass
210210

@@ -250,7 +250,7 @@ async def handle_part_delta(self, event: PartDeltaEvent) -> AsyncIterator[EventT
250250
case ThinkingPartDelta():
251251
async for e in self.handle_thinking_delta(delta):
252252
yield e
253-
case ToolCallPartDelta(): # TODO (DouweM): coverage branch
253+
case ToolCallPartDelta(): # pragma: no branch
254254
async for e in self.handle_tool_call_delta(delta):
255255
yield e
256256

@@ -331,7 +331,7 @@ async def handle_thinking_delta(self, delta: ThinkingPartDelta) -> AsyncIterator
331331
Yields:
332332
Protocol-specific events.
333333
"""
334-
return
334+
return # TODO (DouweM): coverage
335335
yield # Make this an async generator
336336

337337
async def handle_thinking_end(

tests/test_ui.py

Lines changed: 23 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def event_stream(self) -> UIEventStream:
8484

8585
@cached_property
8686
def messages(self) -> list[ModelMessage]:
87-
return self.request.messages
87+
return self.load_messages(self.request.messages)
8888

8989
@cached_property
9090
def state(self) -> dict[str, Any] | None:
@@ -122,136 +122,75 @@ async def handle_part_end(self, event: PartEndEvent) -> AsyncIterator[str]:
122122

123123
async def handle_text_start(self, part: TextPart, follows_text: bool = False) -> AsyncIterator[str]:
124124
yield f'<text>{part.content}'
125-
async for e in super().handle_text_start(part, follows_text):
126-
yield e
127125

128126
async def handle_text_delta(self, delta: TextPartDelta) -> AsyncIterator[str]:
129127
yield delta.content_delta
130-
async for e in super().handle_text_delta(delta):
131-
yield e
132128

133129
async def handle_text_end(self, part: TextPart, followed_by_text: bool = False) -> AsyncIterator[str]:
134130
yield '</text>'
135-
async for e in super().handle_text_end(part, followed_by_text):
136-
yield e
137131

138132
async def handle_thinking_start(self, part: ThinkingPart, follows_thinking: bool = False) -> AsyncIterator[str]:
139133
yield f'<thinking>{part.content}'
140-
async for e in super().handle_thinking_start(part, follows_thinking):
141-
yield e
142134

143135
async def handle_thinking_delta(self, delta: ThinkingPartDelta) -> AsyncIterator[str]:
144136
yield str(delta.content_delta)
145-
async for e in super().handle_thinking_delta(delta):
146-
yield e
147137

148138
async def handle_thinking_end(self, part: ThinkingPart, followed_by_thinking: bool = False) -> AsyncIterator[str]:
149139
yield '</thinking>'
150-
async for e in super().handle_thinking_end(part, followed_by_thinking):
151-
yield e
152140

153141
async def handle_tool_call_start(self, part: ToolCallPart) -> AsyncIterator[str]:
154142
yield f'<tool-call name={part.tool_name!r}>{part.args}'
155-
async for e in super().handle_tool_call_start(part):
156-
yield e
157143

158144
async def handle_tool_call_delta(self, delta: ToolCallPartDelta) -> AsyncIterator[str]:
159145
yield str(delta.args_delta)
160-
async for e in super().handle_tool_call_delta(delta):
161-
yield e
162146

163147
async def handle_tool_call_end(self, part: ToolCallPart) -> AsyncIterator[str]:
164148
yield f'</tool-call name={part.tool_name!r}>'
165-
async for e in super().handle_tool_call_end(part):
166-
yield e
167149

168150
async def handle_builtin_tool_call_start(self, part: BuiltinToolCallPart) -> AsyncIterator[str]:
169151
yield f'<builtin-tool-call name={part.tool_name!r}>{part.args}'
170-
async for e in super().handle_builtin_tool_call_start(part):
171-
yield e
172152

173153
async def handle_builtin_tool_call_end(self, part: BuiltinToolCallPart) -> AsyncIterator[str]:
174154
yield f'</builtin-tool-call name={part.tool_name!r}>'
175-
async for e in super().handle_builtin_tool_call_end(part):
176-
yield e
177155

178156
async def handle_builtin_tool_return(self, part: BuiltinToolReturnPart) -> AsyncIterator[str]:
179157
yield f'<builtin-tool-return name={part.tool_name!r}>{part.content}</builtin-tool-return>'
180-
async for e in super().handle_builtin_tool_return(part):
181-
yield e
182158

183159
async def handle_file(self, part: FilePart) -> AsyncIterator[str]:
184160
yield f'<file media_type={part.content.media_type!r} />'
185-
async for e in super().handle_file(part):
186-
yield e
187161

188162
async def handle_final_result(self, event: FinalResultEvent) -> AsyncIterator[str]:
189163
yield '<final-result />'
190-
async for e in super().handle_final_result(event):
191-
yield e
192164

193165
async def handle_function_tool_call(self, event: FunctionToolCallEvent) -> AsyncIterator[str]:
194166
yield f'<function-tool-call name={event.part.tool_name!r}>{event.part.args}</function-tool-call>'
195-
async for e in super().handle_function_tool_call(event):
196-
yield e
197167

198168
async def handle_function_tool_result(self, event: FunctionToolResultEvent) -> AsyncIterator[str]:
199169
yield f'<function-tool-result name={event.result.tool_name!r}>{event.result.content}</function-tool-result>'
200-
async for e in super().handle_function_tool_result(event):
201-
yield e
202170

203171
async def handle_run_result(self, event: AgentRunResultEvent) -> AsyncIterator[str]:
204172
yield f'<run-result>{event.result.output}</run-result>'
205-
async for e in super().handle_run_result(event):
206-
yield e
207-
208-
async def before_request(self) -> AsyncIterator[str]:
209-
yield '<request>'
210-
async for e in super().before_request():
211-
yield e
212173

213-
async def after_request(self) -> AsyncIterator[str]:
214-
yield '</request>'
215-
async for e in super().after_request():
216-
yield e
174+
async def before_stream(self) -> AsyncIterator[str]:
175+
yield '<stream>'
217176

218177
async def before_response(self) -> AsyncIterator[str]:
219178
yield '<response>'
220-
async for e in super().before_response():
221-
yield e
222179

223180
async def after_response(self) -> AsyncIterator[str]:
224181
yield '</response>'
225-
async for e in super().after_response():
226-
yield e
227182

228-
async def before_stream(self) -> AsyncIterator[str]:
229-
yield '<stream>'
230-
async for e in super().before_stream():
231-
yield e
183+
async def before_request(self) -> AsyncIterator[str]:
184+
yield '<request>'
185+
186+
async def after_request(self) -> AsyncIterator[str]:
187+
yield '</request>'
232188

233189
async def after_stream(self) -> AsyncIterator[str]:
234190
yield '</stream>'
235-
async for e in super().after_stream():
236-
yield e
237191

238192
async def on_error(self, error: Exception) -> AsyncIterator[str]:
239-
yield f'on_error({error.__class__.__name__}({str(error)!r}))'
240-
async for e in super().on_error(error):
241-
yield e
242-
243-
244-
async def test_event_stream_text():
245-
# text
246-
# - back to back
247-
# thinking
248-
# - back to back
249-
# tool call
250-
# builtin tool call
251-
# file
252-
# error
253-
# output tool
254-
pass
193+
yield f'<error type={error.__class__.__name__!r}>{str(error)}</error>'
255194

256195

257196
async def test_event_stream_builtin_tool_call():
@@ -313,3 +252,17 @@ async def stream_function(
313252
'</stream>',
314253
]
315254
)
255+
256+
257+
async def test_event_stream_text():
258+
# tool call
259+
# error
260+
# output tool
261+
# - dispatch_request
262+
# text
263+
# - back to back
264+
# thinking
265+
# - back to back
266+
# tool call
267+
# file
268+
pass

0 commit comments

Comments
 (0)