Skip to content

Commit 3211bbe

Browse files
[executors] chore: wrap server response into ApiExecutorResponse
1 parent 992997b commit 3211bbe

File tree

3 files changed

+22
-17
lines changed

3 files changed

+22
-17
lines changed

libs/garf_executors/garf_executors/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,13 @@
1515

1616
from __future__ import annotations
1717

18-
from garf_executors.api_executor import ApiQueryExecutor
18+
from garf_executors.api_executor import ApiExecutionContext, ApiQueryExecutor
1919
from garf_executors.fetchers import FETCHERS
2020

2121
__all__ = [
2222
'FETCHERS',
2323
'ApiQueryExecutor',
24+
'ApiExecutionContext',
2425
]
2526

2627
__version__ = '0.0.7'

libs/garf_executors/garf_executors/entrypoints/server.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class ApiExecutorRequest(pydantic.BaseModel):
4040
title: str | None = None
4141
query: str | None = None
4242
query_path: str | list[str] | None = None
43-
context: garf_executors.api_executor.ApiExecutionContext
43+
context: garf_executors.ApiExecutionContext
4444

4545
@pydantic.model_validator(mode='after')
4646
def check_query_specified(self):
@@ -57,35 +57,42 @@ def model_post_init(self, __context__) -> None:
5757
self.title = str(self.query_path)
5858

5959

60+
class ApiExecutorResponse(pydantic.BaseModel):
61+
"""Response after executing a query.
62+
63+
Attributes:
64+
results: Results of query execution.
65+
"""
66+
67+
results: list[str]
68+
69+
6070
router = fastapi.APIRouter(prefix='/api')
6171

6272

6373
@router.post('/execute')
64-
async def execute(request: ApiExecutorRequest) -> dict[str, str]:
74+
async def execute(request: ApiExecutorRequest) -> ApiExecutorResponse:
6575
if not (concrete_api_fetcher := garf_executors.FETCHERS.get(request.source)):
6676
raise exceptions.GarfExecutorError(
6777
f'Source {request.source} is not available.'
6878
)
6979

70-
query_executor = garf_executors.api_executor.ApiQueryExecutor(
80+
query_executor = garf_executors.ApiQueryExecutor(
7181
concrete_api_fetcher(**request.context.fetcher_parameters)
7282
)
7383

7484
result = query_executor.execute(request.query, request.title, request.context)
75-
76-
return fastapi.responses.JSONResponse(
77-
content=fastapi.encoders.jsonable_encoder({'result': result})
78-
)
85+
return ApiExecutorResponse(results=[result])
7986

8087

8188
@router.post('/execute:batch')
82-
async def execute_batch(request: ApiExecutorRequest) -> dict[str, str]:
89+
async def execute_batch(request: ApiExecutorRequest) -> ApiExecutorResponse:
8390
if not (concrete_api_fetcher := garf_executors.FETCHERS.get(request.source)):
8491
raise exceptions.GarfExecutorError(
8592
f'Source {request.source} is not available.'
8693
)
8794

88-
query_executor = garf_executors.api_executor.ApiQueryExecutor(
95+
query_executor = garf_executors.ApiQueryExecutor(
8996
concrete_api_fetcher(**request.context.fetcher_parameters)
9097
)
9198
file_reader = reader.FileReader()
@@ -102,10 +109,7 @@ async def execute_batch(request: ApiExecutorRequest) -> dict[str, str]:
102109
}
103110
for future in futures.as_completed(future_to_query):
104111
results.append(future.result())
105-
106-
return fastapi.responses.JSONResponse(
107-
content=fastapi.encoders.jsonable_encoder({'result': results})
108-
)
112+
return ApiExecutorResponse(results=results)
109113

110114

111115
if __name__ == '__main__':

libs/garf_executors/tests/end-to-end/test_server.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def test_fake_source_from_query_text(self, tmp_path):
5050
}
5151
response = client.post('/api/execute', json=request)
5252
assert response.status_code == fastapi.status.HTTP_200_OK
53-
expected_output = {'result': f'[CSV] - at {tmp_path}/test.csv'}
53+
expected_output = {'results': [f'[CSV] - at {tmp_path}/test.csv']}
5454
assert response.json() == expected_output
5555

5656
def test_fake_source_from_query_path(self, tmp_path):
@@ -71,7 +71,7 @@ def test_fake_source_from_query_path(self, tmp_path):
7171
}
7272
response = client.post('/api/execute', json=request)
7373
assert response.status_code == fastapi.status.HTTP_200_OK
74-
expected_output = {'result': f'[CSV] - at {tmp_path}/query.csv'}
74+
expected_output = {'results': [f'[CSV] - at {tmp_path}/query.csv']}
7575
assert response.json() == expected_output
7676

7777
def test_batch_fake_source_from_query_path(self, tmp_path):
@@ -96,7 +96,7 @@ def test_batch_fake_source_from_query_path(self, tmp_path):
9696
response = client.post('/api/execute:batch', json=request)
9797
assert response.status_code == fastapi.status.HTTP_200_OK
9898
expected_output = {
99-
'result': [
99+
'results': [
100100
f'[CSV] - at {tmp_path}/query.csv',
101101
f'[CSV] - at {tmp_path}/query.csv',
102102
]

0 commit comments

Comments
 (0)