Skip to content

Commit 2ef9f37

Browse files
authored
Fix EngineClient.list_(jobs|programs) (#7848)
These methods need to use `_send_list_request_async` to page through results in asyncio and collect them to a list before returning. This was not caught by typechecks because these methods did not have type annotations, so I've added some annotations. In the future we could consider switching these to make the results pageable, but would need to be careful about invoking the pager methods in the correct event loop (see #7836).
1 parent 9d01b0b commit 2ef9f37

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

cirq-google/cirq_google/engine/engine_client.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ async def list_programs_async(
211211
created_before: datetime.datetime | datetime.date | None = None,
212212
created_after: datetime.datetime | datetime.date | None = None,
213213
has_labels: dict[str, str] | None = None,
214-
):
214+
) -> list[quantum.QuantumProgram]:
215215
"""Returns a list of previously executed quantum programs.
216216
217217
Args:
@@ -242,7 +242,7 @@ async def list_programs_async(
242242
request = quantum.ListQuantumProgramsRequest(
243243
parent=_project_name(project_id), filter=" AND ".join(filters)
244244
)
245-
return await self._send_request_async(self.grpc_client.list_quantum_programs, request)
245+
return await self._send_list_request_async(self.grpc_client.list_quantum_programs, request)
246246

247247
list_programs = duet.sync(list_programs_async)
248248

@@ -485,7 +485,7 @@ async def list_jobs_async(
485485
execution_states: set[quantum.ExecutionStatus.State] | None = None,
486486
executed_processor_ids: list[str] | None = None,
487487
scheduled_processor_ids: list[str] | None = None,
488-
):
488+
) -> list[quantum.QuantumJob]:
489489
"""Returns the list of jobs for a given program.
490490
491491
Args:
@@ -545,7 +545,7 @@ async def list_jobs_async(
545545
program_id = "-"
546546
parent = _program_name_from_ids(project_id, program_id)
547547
request = quantum.ListQuantumJobsRequest(parent=parent, filter=" AND ".join(filters))
548-
return await self._send_request_async(self.grpc_client.list_quantum_jobs, request)
548+
return await self._send_list_request_async(self.grpc_client.list_quantum_jobs, request)
549549

550550
list_jobs = duet.sync(list_jobs_async)
551551

cirq-google/cirq_google/engine/engine_client_test.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ def test_list_program(client_constructor, default_engine_client):
157157
quantum.QuantumProgram(name='projects/proj/programs/prog1'),
158158
quantum.QuantumProgram(name='projects/proj/programs/prog2'),
159159
]
160-
grpc_client.list_quantum_programs.return_value = results
160+
grpc_client.list_quantum_programs.return_value = _AsyncIterable(results)
161161

162162
assert default_engine_client.list_programs(project_id='proj') == results
163163
grpc_client.list_quantum_programs.assert_called_with(
@@ -1252,7 +1252,7 @@ def test_list_jobs(client_constructor, default_engine_client):
12521252
quantum.QuantumJob(name='projects/proj/programs/prog1/jobs/job1'),
12531253
quantum.QuantumJob(name='projects/proj/programs/prog1/jobs/job2'),
12541254
]
1255-
grpc_client.list_quantum_jobs.return_value = results
1255+
grpc_client.list_quantum_jobs.return_value = _AsyncIterable(results)
12561256

12571257
assert default_engine_client.list_jobs(project_id='proj', program_id='prog1') == results
12581258
grpc_client.list_quantum_jobs.assert_called_with(
@@ -1265,6 +1265,15 @@ def test_list_jobs(client_constructor, default_engine_client):
12651265
)
12661266

12671267

1268+
class _AsyncIterable:
1269+
def __init__(self, items):
1270+
self.items = items
1271+
1272+
async def __aiter__(self):
1273+
for item in self.items:
1274+
yield item
1275+
1276+
12681277
@pytest.mark.parametrize(
12691278
'expected_filter, '
12701279
'created_after, '

0 commit comments

Comments
 (0)