Skip to content

Commit 1bfa349

Browse files
committed
refactor: address review comments
- Switch pyright config to use 'exclude' instead of 'ignore' for types. - Update REST transport to explicitly construct resource URLs, accommodating bare ID inputs. - Update tests to use bare IDs instead of resource names, aligning with 'Short ID' convention. - Ensure parts.py uses correct typing. Signed-off-by: Luca Muscariello <muscariello@ieee.org>
1 parent 61e09c2 commit 1bfa349

11 files changed

Lines changed: 118 additions & 119 deletions

File tree

pyrightconfig.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@
55
"src"
66
],
77
"exclude": [
8-
"**/__pycache__"
9-
],
10-
"ignore": [
8+
"**/__pycache__",
119
"src/a2a/types"
1210
],
11+
"ignore": [],
1312
"reportMissingImports": false,
1413
"reportMissingModuleSource": false
1514
}

src/a2a/client/transports/rest.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ async def cancel_task(
259259
context,
260260
)
261261
response_data = await self._send_post_request(
262-
f'/v1/{request.id}:cancel', payload, modified_kwargs
262+
f'/v1/tasks/{request.id}:cancel', payload, modified_kwargs
263263
)
264264
response: Task = ParseDict(response_data, Task())
265265
return response
@@ -281,7 +281,7 @@ async def set_task_callback(
281281
payload, modified_kwargs, context
282282
)
283283
response_data = await self._send_post_request(
284-
f'/v1/{request.task_id}/pushNotificationConfigs',
284+
f'/v1/tasks/{request.task_id}/pushNotificationConfigs',
285285
payload,
286286
modified_kwargs,
287287
)
@@ -313,7 +313,7 @@ async def get_task_callback(
313313
if 'task_id' in params:
314314
del params['task_id']
315315
response_data = await self._send_get_request(
316-
f'/v1/{request.task_id}/pushNotificationConfigs/{request.id}',
316+
f'/v1/tasks/{request.task_id}/pushNotificationConfigs/{request.id}',
317317
params,
318318
modified_kwargs,
319319
)

tests/client/transports/test_grpc_client.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -306,13 +306,13 @@ async def test_get_task(
306306
) -> None:
307307
"""Test retrieving a task."""
308308
mock_grpc_stub.GetTask.return_value = sample_task
309-
params = GetTaskRequest(id=f'tasks/{sample_task.id}')
309+
params = GetTaskRequest(id=f'{sample_task.id}')
310310

311311
response = await grpc_transport.get_task(params)
312312

313313
mock_grpc_stub.GetTask.assert_awaited_once_with(
314314
a2a_pb2.GetTaskRequest(
315-
id=f'tasks/{sample_task.id}', history_length=None
315+
id=f'{sample_task.id}', history_length=None
316316
),
317317
metadata=[
318318
(
@@ -332,14 +332,14 @@ async def test_get_task_with_history(
332332
mock_grpc_stub.GetTask.return_value = sample_task
333333
history_len = 10
334334
params = GetTaskRequest(
335-
id=f'tasks/{sample_task.id}', history_length=history_len
335+
id=f'{sample_task.id}', history_length=history_len
336336
)
337337

338338
await grpc_transport.get_task(params)
339339

340340
mock_grpc_stub.GetTask.assert_awaited_once_with(
341341
a2a_pb2.GetTaskRequest(
342-
id=f'tasks/{sample_task.id}', history_length=history_len
342+
id=f'{sample_task.id}', history_length=history_len
343343
),
344344
metadata=[
345345
(
@@ -364,11 +364,11 @@ async def test_cancel_task(
364364
extensions = [
365365
'https://example.com/test-ext/v3',
366366
]
367-
request = a2a_pb2.CancelTaskRequest(id=f'tasks/{sample_task.id}')
367+
request = a2a_pb2.CancelTaskRequest(id=f'{sample_task.id}')
368368
response = await grpc_transport.cancel_task(request, extensions=extensions)
369369

370370
mock_grpc_stub.CancelTask.assert_awaited_once_with(
371-
a2a_pb2.CancelTaskRequest(id=f'tasks/{sample_task.id}'),
371+
a2a_pb2.CancelTaskRequest(id=f'{sample_task.id}'),
372372
metadata=[(HTTP_EXTENSION_HEADER, 'https://example.com/test-ext/v3')],
373373
)
374374
assert response.status.state == TaskState.TASK_STATE_CANCELED
@@ -387,7 +387,7 @@ async def test_set_task_callback_with_valid_task(
387387

388388
# Create the request object expected by the transport
389389
request = CreateTaskPushNotificationConfigRequest(
390-
task_id='tasks/task-1',
390+
task_id='task-1',
391391
config_id=sample_task_push_notification_config.push_notification_config.id,
392392
config=sample_task_push_notification_config.push_notification_config,
393393
)
@@ -415,22 +415,22 @@ async def test_set_task_callback_with_invalid_task(
415415
# Return a config with an invalid name format
416416
mock_grpc_stub.CreateTaskPushNotificationConfig.return_value = (
417417
a2a_pb2.TaskPushNotificationConfig(
418-
task_id='invalid-path-to-tasks/task-1',
418+
task_id='invalid-path-to-task-1',
419419
id='config-1',
420420
push_notification_config=sample_push_notification_config,
421421
)
422422
)
423423

424424
request = CreateTaskPushNotificationConfigRequest(
425-
task_id='tasks/task-1',
425+
task_id='task-1',
426426
config_id='config-1',
427427
config=sample_push_notification_config,
428428
)
429429

430430
# Note: The transport doesn't validate the response name format
431431
# It just returns the response from the stub
432432
response = await grpc_transport.set_task_callback(request)
433-
assert response.task_id == 'invalid-path-to-tasks/task-1'
433+
assert response.task_id == 'invalid-path-to-task-1'
434434

435435

436436
@pytest.mark.asyncio
@@ -447,14 +447,14 @@ async def test_get_task_callback_with_valid_task(
447447

448448
response = await grpc_transport.get_task_callback(
449449
GetTaskPushNotificationConfigRequest(
450-
task_id='tasks/task-1',
450+
task_id='task-1',
451451
id=config_id,
452452
)
453453
)
454454

455455
mock_grpc_stub.GetTaskPushNotificationConfig.assert_awaited_once_with(
456456
a2a_pb2.GetTaskPushNotificationConfigRequest(
457-
task_id='tasks/task-1',
457+
task_id='task-1',
458458
id=config_id,
459459
),
460460
metadata=[
@@ -476,20 +476,20 @@ async def test_get_task_callback_with_invalid_task(
476476
"""Test retrieving a task push notification config with an invalid task name."""
477477
mock_grpc_stub.GetTaskPushNotificationConfig.return_value = (
478478
a2a_pb2.TaskPushNotificationConfig(
479-
task_id='invalid-path-to-tasks/task-1',
479+
task_id='invalid-path-to-task-1',
480480
id='config-1',
481481
push_notification_config=sample_push_notification_config,
482482
)
483483
)
484484

485485
response = await grpc_transport.get_task_callback(
486486
GetTaskPushNotificationConfigRequest(
487-
task_id='tasks/task-1',
487+
task_id='task-1',
488488
id='config-1',
489489
)
490490
)
491491
# The transport doesn't validate the response name format
492-
assert response.task_id == 'invalid-path-to-tasks/task-1'
492+
assert response.task_id == 'invalid-path-to-task-1'
493493

494494

495495
@pytest.mark.parametrize(

tests/client/transports/test_jsonrpc_client.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ async def test_get_task_success(self, transport, mock_httpx_client):
276276
mock_httpx_client.post.return_value = mock_response
277277

278278
# Proto uses 'name' field for task identifier in request
279-
request = GetTaskRequest(id=f'tasks/{task_id}')
279+
request = GetTaskRequest(id=f'{task_id}')
280280
response = await transport.get_task(request)
281281

282282
assert isinstance(response, Task)
@@ -303,7 +303,7 @@ async def test_get_task_with_history(self, transport, mock_httpx_client):
303303
mock_response.raise_for_status = MagicMock()
304304
mock_httpx_client.post.return_value = mock_response
305305

306-
request = GetTaskRequest(id=f'tasks/{task_id}', history_length=10)
306+
request = GetTaskRequest(id=f'{task_id}', history_length=10)
307307
response = await transport.get_task(request)
308308

309309
assert isinstance(response, Task)
@@ -332,7 +332,7 @@ async def test_cancel_task_success(self, transport, mock_httpx_client):
332332
mock_response.raise_for_status = MagicMock()
333333
mock_httpx_client.post.return_value = mock_response
334334

335-
request = CancelTaskRequest(id=f'tasks/{task_id}')
335+
request = CancelTaskRequest(id=f'{task_id}')
336336
response = await transport.cancel_task(request)
337337

338338
assert isinstance(response, Task)
@@ -356,15 +356,15 @@ async def test_get_task_callback_success(
356356
'jsonrpc': '2.0',
357357
'id': '1',
358358
'result': {
359-
'task_id': f'tasks/{task_id}',
359+
'task_id': f'{task_id}',
360360
'id': 'config-1',
361361
},
362362
}
363363
mock_response.raise_for_status = MagicMock()
364364
mock_httpx_client.post.return_value = mock_response
365365

366366
request = GetTaskPushNotificationConfigRequest(
367-
task_id=f'tasks/{task_id}',
367+
task_id=f'{task_id}',
368368
id='config-1',
369369
)
370370
response = await transport.get_task_callback(request)

tests/e2e/push_notifications/notifications_app.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ async def add_notification(request: Request):
5757
'status': 'received',
5858
}
5959

60-
@app.get('/tasks/{task_id}/notifications')
60+
@app.get('/{task_id}/notifications')
6161
async def list_notifications_by_task(
6262
task_id: Annotated[
6363
str, Path(title='The ID of the task to list the notifications for.')

tests/e2e/push_notifications/test_default_push_notification_support.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ async def test_notification_triggering_with_in_message_config_e2e(
138138
# Verify a single notification was sent.
139139
notifications = await wait_for_n_notifications(
140140
http_client,
141-
f'{notifications_server}/tasks/{task.id}/notifications',
141+
f'{notifications_server}/{task.id}/notifications',
142142
n=1,
143143
)
144144
assert notifications[0].token == token
@@ -182,7 +182,7 @@ async def test_notification_triggering_after_config_change_e2e(
182182

183183
# Verify that no notification has been sent yet.
184184
response = await http_client.get(
185-
f'{notifications_server}/tasks/{task.id}/notifications'
185+
f'{notifications_server}/{task.id}/notifications'
186186
)
187187
assert response.status_code == 200
188188
assert len(response.json().get('notifications', [])) == 0
@@ -191,7 +191,7 @@ async def test_notification_triggering_after_config_change_e2e(
191191
token = uuid.uuid4().hex
192192
await a2a_client.set_task_callback(
193193
CreateTaskPushNotificationConfigRequest(
194-
task_id=f'tasks/{task.id}',
194+
task_id=f'{task.id}',
195195
config_id='after-config-change',
196196
config=PushNotificationConfig(
197197
id='after-config-change',
@@ -218,7 +218,7 @@ async def test_notification_triggering_after_config_change_e2e(
218218
# Verify that the push notification was sent.
219219
notifications = await wait_for_n_notifications(
220220
http_client,
221-
f'{notifications_server}/tasks/{task.id}/notifications',
221+
f'{notifications_server}/{task.id}/notifications',
222222
n=1,
223223
)
224224
# Notification.task is a dict from proto serialization

tests/integration/test_client_server_integration.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ def channel_factory(address: str) -> Channel:
440440
transport = GrpcTransport(channel=channel, agent_card=agent_card)
441441

442442
# Use GetTaskRequest with name (AIP resource format)
443-
params = GetTaskRequest(id=f'tasks/{GET_TASK_RESPONSE.id}')
443+
params = GetTaskRequest(id=f'{GET_TASK_RESPONSE.id}')
444444
result = await transport.get_task(request=params)
445445

446446
assert result.id == GET_TASK_RESPONSE.id
@@ -467,7 +467,7 @@ async def test_http_transport_cancel_task(
467467
handler = transport_setup.handler
468468

469469
# Use CancelTaskRequest with name (AIP resource format)
470-
params = CancelTaskRequest(id=f'tasks/{CANCEL_TASK_RESPONSE.id}')
470+
params = CancelTaskRequest(id=f'{CANCEL_TASK_RESPONSE.id}')
471471
result = await transport.cancel_task(request=params)
472472

473473
assert result.id == CANCEL_TASK_RESPONSE.id
@@ -491,7 +491,7 @@ def channel_factory(address: str) -> Channel:
491491
transport = GrpcTransport(channel=channel, agent_card=agent_card)
492492

493493
# Use CancelTaskRequest with name (AIP resource format)
494-
params = CancelTaskRequest(id=f'tasks/{CANCEL_TASK_RESPONSE.id}')
494+
params = CancelTaskRequest(id=f'{CANCEL_TASK_RESPONSE.id}')
495495
result = await transport.cancel_task(request=params)
496496

497497
assert result.id == CANCEL_TASK_RESPONSE.id
@@ -519,7 +519,7 @@ async def test_http_transport_set_task_callback(
519519

520520
# Create CreateTaskPushNotificationConfigRequest with required fields
521521
params = CreateTaskPushNotificationConfigRequest(
522-
task_id='tasks/task-callback-123',
522+
task_id='task-callback-123',
523523
config_id='pnc-abc',
524524
config=CALLBACK_CONFIG.push_notification_config,
525525
)
@@ -556,7 +556,7 @@ def channel_factory(address: str) -> Channel:
556556

557557
# Create CreateTaskPushNotificationConfigRequest with required fields
558558
params = CreateTaskPushNotificationConfigRequest(
559-
task_id='tasks/task-callback-123',
559+
task_id='task-callback-123',
560560
config_id='pnc-abc',
561561
config=CALLBACK_CONFIG.push_notification_config,
562562
)
@@ -596,7 +596,7 @@ async def test_http_transport_get_task_callback(
596596

597597
# Use GetTaskPushNotificationConfigRequest with name field (resource name)
598598
params = GetTaskPushNotificationConfigRequest(
599-
task_id=f'tasks/{CALLBACK_CONFIG.task_id}', id=CALLBACK_CONFIG.id
599+
task_id=f'{CALLBACK_CONFIG.task_id}', id=CALLBACK_CONFIG.id
600600
)
601601
result = await transport.get_task_callback(request=params)
602602

@@ -631,7 +631,7 @@ def channel_factory(address: str) -> Channel:
631631

632632
# Use GetTaskPushNotificationConfigRequest with name field (resource name)
633633
params = GetTaskPushNotificationConfigRequest(
634-
task_id=f'tasks/{CALLBACK_CONFIG.task_id}', id=CALLBACK_CONFIG.id
634+
task_id=f'{CALLBACK_CONFIG.task_id}', id=CALLBACK_CONFIG.id
635635
)
636636
result = await transport.get_task_callback(request=params)
637637

0 commit comments

Comments
 (0)