Skip to content

Commit 22522cb

Browse files
author
GitHub CI
committed
release/v0.50.0
1 parent e1e0f6d commit 22522cb

File tree

292 files changed

+20347
-3237
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

292 files changed

+20347
-3237
lines changed

api/oss/src/apis/fastapi/testsets/models.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,15 @@
1212
Meta,
1313
Windowing,
1414
Reference,
15-
Data,
1615
)
1716

1817
from oss.src.core.testsets.dtos import (
1918
TestsetRevisionData,
2019
TestsetFlags,
2120
)
2221

22+
from oss.src.core.testcases.dtos import Testcase
23+
2324

2425
class SimpleTestset(
2526
Identifier,
@@ -100,9 +101,9 @@ class TestcasesQueryRequest(BaseModel):
100101

101102
class TestcaseResponse(BaseModel):
102103
count: int = 0
103-
testcase: Optional[Data] = None
104+
testcase: Optional[Testcase] = None
104105

105106

106107
class TestcasesResponse(BaseModel):
107108
count: int = 0
108-
testcases: List[Data] = []
109+
testcases: List[Testcase] = []

api/oss/src/apis/fastapi/testsets/router.py

Lines changed: 111 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1-
from typing import Optional, List, Literal
1+
from typing import Optional, List, Literal, Dict
22
from uuid import uuid4, UUID
33
from json import loads, JSONDecodeError
44
from io import BytesIO
5-
from copy import deepcopy
5+
6+
###
7+
import orjson
8+
import pandas as pd
9+
10+
###
611

712
from pydantic import ValidationError
813
from fastapi.responses import StreamingResponse
@@ -19,6 +24,7 @@
1924
from oss.src.core.shared.dtos import Reference
2025
from oss.src.core.testsets.dtos import TestsetFlags, TestsetRevisionData
2126
from oss.src.core.testsets.service import TestsetsService
27+
from oss.src.core.testcases.dtos import Testcase
2228

2329
from oss.src.core.testsets.dtos import (
2430
Testset,
@@ -268,11 +274,18 @@ async def create_simple_testset(
268274
raise FORBIDDEN_EXCEPTION
269275

270276
try:
271-
testcases = json_array_to_json_object(
272-
data=simple_testset_create_request.testset.data.testcases,
273-
).values()
277+
testcases = simple_testset_create_request.testset.data.testcases
278+
279+
testcases_data = [testcase.data for testcase in testcases]
280+
281+
testcases_data = json_array_to_json_object(data=testcases_data)
282+
283+
validate_testset_limits(testcases_data)
274284

275-
validate_testset_limits(testcases)
285+
for i, testcase_data in enumerate(testcases_data.values()):
286+
simple_testset_create_request.testset.data.testcases[
287+
i
288+
].data = testcase_data
276289

277290
except Exception as e:
278291
raise HTTPException(
@@ -282,7 +295,7 @@ async def create_simple_testset(
282295

283296
try:
284297
testset_revision_data = TestsetRevisionData(
285-
testcases=testcases,
298+
testcases=simple_testset_create_request.testset.data.testcases,
286299
)
287300

288301
except ValidationError as e:
@@ -552,11 +565,18 @@ async def edit_simple_testset(
552565
raise FORBIDDEN_EXCEPTION
553566

554567
try:
555-
testcases = json_array_to_json_object(
556-
data=simple_testset_edit_request.testset.data.testcases,
557-
).values()
568+
testcases = simple_testset_edit_request.testset.data.testcases
569+
570+
testcases_data = [testcase.data for testcase in testcases]
571+
572+
testcases_data = json_array_to_json_object(data=testcases_data)
558573

559-
validate_testset_limits(testcases)
574+
validate_testset_limits(testcases_data)
575+
576+
for i, testcase_data in enumerate(testcases_data.values()):
577+
simple_testset_edit_request.testset.data.testcases[
578+
i
579+
].data = testcase_data
560580

561581
except Exception as e:
562582
raise HTTPException(
@@ -698,21 +718,22 @@ async def edit_simple_testset(
698718
detail="Simple testset revisions not found. Please check the ID and try again.",
699719
)
700720

701-
old_testcases = deepcopy(testset_revision.data.testcases)
702-
703-
if old_testcases is not None:
704-
for old_testcase in old_testcases:
705-
del old_testcase["testcase_id"]
721+
old_testcase_ids = [
722+
testcase.data for testcase in testset_revision.data.testcases
723+
]
706724

707-
new_testcases = testset_revision_data.testcases
725+
new_testcase_ids = [
726+
testcase.data
727+
for testcase in simple_testset_edit_request.testset.data.testcases
728+
]
708729

709730
has_changes = (
710731
testset_revision.name != simple_testset_edit_request.testset.name
711732
or testset_revision.description
712733
!= simple_testset_edit_request.testset.description
713734
or testset_revision.tags != simple_testset_edit_request.testset.tags
714735
or testset_revision.meta != simple_testset_edit_request.testset.meta
715-
or old_testcases != new_testcases
736+
or old_testcase_ids != new_testcase_ids
716737
)
717738

718739
if has_changes:
@@ -1108,6 +1129,7 @@ async def create_simple_testset_from_file(
11081129
raise FORBIDDEN_EXCEPTION
11091130

11101131
if file_type is None or file_type not in ["csv", "json"]:
1132+
log.error(e)
11111133
raise HTTPException(
11121134
status_code=400,
11131135
detail="Invalid file type. Supported types are 'csv' and 'json'.",
@@ -1121,16 +1143,18 @@ async def create_simple_testset_from_file(
11211143
testset_tags = loads(testset_tags) if testset_tags else None
11221144
testset_meta = loads(testset_meta) if testset_meta else None
11231145
except JSONDecodeError as e:
1146+
log.error(e)
11241147
raise HTTPException(
11251148
status_code=400,
11261149
detail=f"Failed to parse tags or meta as JSON: {e}",
11271150
) from e
11281151

11291152
testcases = []
1153+
testcases_data: Dict[str, list] = {}
11301154

11311155
if file_type.lower() == "json":
11321156
try:
1133-
testcases = await json_file_to_json_array(file)
1157+
testcases_data = await json_file_to_json_array(file)
11341158

11351159
except Exception as e:
11361160
raise HTTPException(
@@ -1140,7 +1164,7 @@ async def create_simple_testset_from_file(
11401164

11411165
elif file_type.lower() == "csv":
11421166
try:
1143-
testcases = await csv_file_to_json_array(file)
1167+
testcases_data = await csv_file_to_json_array(file)
11441168

11451169
except Exception as e:
11461170
raise HTTPException(
@@ -1149,19 +1173,37 @@ async def create_simple_testset_from_file(
11491173
) from e
11501174

11511175
else:
1176+
log.error(e)
11521177
raise HTTPException(
11531178
status_code=400,
11541179
detail="Invalid file type. Supported types are 'csv' and 'json'.",
11551180
)
11561181

11571182
try:
1158-
testcases = json_array_to_json_object(
1159-
data=testcases,
1160-
).values()
1161-
1162-
validate_testset_limits(testcases)
1183+
testcases_data = json_array_to_json_object(
1184+
data=testcases_data,
1185+
testcase_id_key="__id__",
1186+
testcase_dedup_id_key="__dedup_id__",
1187+
)
1188+
validate_testset_limits(testcases_data)
1189+
1190+
for testcase_data in testcases_data.values():
1191+
testcase_flags = testcase_data.pop("__flags__", None)
1192+
testcase_tags = testcase_data.pop("__tags__", None)
1193+
testcase_meta = testcase_data.pop("__meta__", None)
1194+
1195+
testcases.append(
1196+
Testcase(
1197+
id=testcase_data.pop("__id__", None),
1198+
data=testcase_data,
1199+
flags=testcase_flags,
1200+
tags=testcase_tags,
1201+
meta=testcase_meta,
1202+
)
1203+
)
11631204

11641205
except Exception as e:
1206+
log.error(e)
11651207
raise HTTPException(
11661208
status_code=400,
11671209
detail=f"Failed to parse testcases as JSON array: {e}",
@@ -1173,6 +1215,7 @@ async def create_simple_testset_from_file(
11731215
)
11741216

11751217
except ValidationError as e:
1218+
log.error(e)
11761219
raise HTTPException(
11771220
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
11781221
) from e
@@ -1238,10 +1281,11 @@ async def edit_simple_testset_from_file(
12381281
) from e
12391282

12401283
testcases = []
1284+
testcases_data: Dict[str, list] = {}
12411285

12421286
if file_type.lower() == "json":
12431287
try:
1244-
testcases = await json_file_to_json_array(file)
1288+
testcases_data = await json_file_to_json_array(file)
12451289

12461290
except Exception as e:
12471291
raise HTTPException(
@@ -1251,7 +1295,7 @@ async def edit_simple_testset_from_file(
12511295

12521296
elif file_type.lower() == "csv":
12531297
try:
1254-
testcases = await csv_file_to_json_array(file)
1298+
testcases_data = await csv_file_to_json_array(file)
12551299

12561300
except Exception as e:
12571301
raise HTTPException(
@@ -1266,11 +1310,28 @@ async def edit_simple_testset_from_file(
12661310
)
12671311

12681312
try:
1269-
testcases = json_array_to_json_object(
1270-
data=testcases,
1271-
).values()
1313+
testcases_data = json_array_to_json_object(
1314+
data=testcases_data,
1315+
testcase_id_key="__id__",
1316+
testcase_dedup_id_key="__dedup_id__",
1317+
)
12721318

1273-
validate_testset_limits(testcases)
1319+
validate_testset_limits(testcases_data)
1320+
1321+
for testcase_data in testcases_data.values():
1322+
testcase_flags = testcase_data.pop("__flags__", None)
1323+
testcase_tags = testcase_data.pop("__tags__", None)
1324+
testcase_meta = testcase_data.pop("__meta__", None)
1325+
1326+
testcases.append(
1327+
Testcase(
1328+
id=testcase_data.pop("__id__", None),
1329+
data=testcase_data,
1330+
flags=testcase_flags,
1331+
tags=testcase_tags,
1332+
meta=testcase_meta,
1333+
)
1334+
)
12741335

12751336
except Exception as e:
12761337
raise HTTPException(
@@ -1360,10 +1421,19 @@ async def fetch_simple_testset_to_file(
13601421
filename = (file_name or f"testset_{testset_id}") + f".{file_type.lower()}"
13611422
testcases = testset.data.testcases
13621423

1363-
if file_type.lower() == "json":
1364-
import orjson
1424+
testcases_data = [
1425+
{
1426+
**testcase.data,
1427+
"__id__": testcase.id,
1428+
"__flags__": testcase.flags,
1429+
"__tags__": testcase.tags,
1430+
"__meta__": testcase.meta,
1431+
}
1432+
for testcase in testcases
1433+
]
13651434

1366-
buffer = BytesIO(orjson.dumps(testcases))
1435+
if file_type.lower() == "json":
1436+
buffer = BytesIO(orjson.dumps(testcases_data))
13671437

13681438
return StreamingResponse(
13691439
buffer,
@@ -1372,10 +1442,8 @@ async def fetch_simple_testset_to_file(
13721442
)
13731443

13741444
elif file_type.lower() == "csv":
1375-
import pandas as pd
1376-
13771445
buffer = BytesIO()
1378-
pd.DataFrame(testcases).to_csv(buffer, index=False)
1446+
pd.DataFrame(testcases_data).to_csv(buffer, index=False)
13791447
buffer.seek(0)
13801448

13811449
return StreamingResponse(
@@ -1474,6 +1542,10 @@ async def transfer_testset(
14741542
if old_testset is None:
14751543
return None
14761544

1545+
testcases_data = old_testset.csvdata
1546+
1547+
testcases = [Testcase(data=testcase_data) for testcase_data in testcases_data]
1548+
14771549
new_testset = await self.testsets_service.fetch_testset(
14781550
project_id=UUID(request.state.project_id),
14791551
testset_ref=Reference(id=testset_id),
@@ -1487,7 +1559,7 @@ async def transfer_testset(
14871559
slug=slug,
14881560
name=old_testset.name,
14891561
data=TestsetRevisionData(
1490-
testcases=old_testset.csvdata,
1562+
testcases=testcases,
14911563
),
14921564
)
14931565
)
@@ -1504,7 +1576,7 @@ async def transfer_testset(
15041576
id=testset_id,
15051577
name=old_testset.name,
15061578
data=TestsetRevisionData(
1507-
testcases=old_testset.csvdata,
1579+
testcases=testcases,
15081580
),
15091581
)
15101582
)

0 commit comments

Comments
 (0)