Skip to content

Commit a7d9731

Browse files
chore(internal): add support for parsing bool response content (#1774)
1 parent 50de514 commit a7d9731

File tree

4 files changed

+81
-0
lines changed

4 files changed

+81
-0
lines changed

Diff for: src/openai/_legacy_response.py

+3
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,9 @@ def _parse(self, *, to: type[_T] | None = None) -> R | _T:
258258
if cast_to == float:
259259
return cast(R, float(response.text))
260260

261+
if cast_to == bool:
262+
return cast(R, response.text.lower() == "true")
263+
261264
origin = get_origin(cast_to) or cast_to
262265

263266
if inspect.isclass(origin) and issubclass(origin, HttpxBinaryResponseContent):

Diff for: src/openai/_response.py

+3
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,9 @@ def _parse(self, *, to: type[_T] | None = None) -> R | _T:
192192
if cast_to == float:
193193
return cast(R, float(response.text))
194194

195+
if cast_to == bool:
196+
return cast(R, response.text.lower() == "true")
197+
195198
origin = get_origin(cast_to) or cast_to
196199

197200
# handle the legacy binary response case

Diff for: tests/test_legacy_response.py

+25
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,31 @@ def test_response_parse_mismatched_basemodel(client: OpenAI) -> None:
3434
response.parse(to=PydanticModel)
3535

3636

37+
@pytest.mark.parametrize(
38+
"content, expected",
39+
[
40+
("false", False),
41+
("true", True),
42+
("False", False),
43+
("True", True),
44+
("TrUe", True),
45+
("FalSe", False),
46+
],
47+
)
48+
def test_response_parse_bool(client: OpenAI, content: str, expected: bool) -> None:
49+
response = LegacyAPIResponse(
50+
raw=httpx.Response(200, content=content),
51+
client=client,
52+
stream=False,
53+
stream_cls=None,
54+
cast_to=str,
55+
options=FinalRequestOptions.construct(method="get", url="/foo"),
56+
)
57+
58+
result = response.parse(to=bool)
59+
assert result is expected
60+
61+
3762
def test_response_parse_custom_stream(client: OpenAI) -> None:
3863
response = LegacyAPIResponse(
3964
raw=httpx.Response(200, content=b"foo"),

Diff for: tests/test_response.py

+50
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,56 @@ async def test_async_response_parse_annotated_type(async_client: AsyncOpenAI) ->
237237
assert obj.bar == 2
238238

239239

240+
@pytest.mark.parametrize(
241+
"content, expected",
242+
[
243+
("false", False),
244+
("true", True),
245+
("False", False),
246+
("True", True),
247+
("TrUe", True),
248+
("FalSe", False),
249+
],
250+
)
251+
def test_response_parse_bool(client: OpenAI, content: str, expected: bool) -> None:
252+
response = APIResponse(
253+
raw=httpx.Response(200, content=content),
254+
client=client,
255+
stream=False,
256+
stream_cls=None,
257+
cast_to=str,
258+
options=FinalRequestOptions.construct(method="get", url="/foo"),
259+
)
260+
261+
result = response.parse(to=bool)
262+
assert result is expected
263+
264+
265+
@pytest.mark.parametrize(
266+
"content, expected",
267+
[
268+
("false", False),
269+
("true", True),
270+
("False", False),
271+
("True", True),
272+
("TrUe", True),
273+
("FalSe", False),
274+
],
275+
)
276+
async def test_async_response_parse_bool(client: AsyncOpenAI, content: str, expected: bool) -> None:
277+
response = AsyncAPIResponse(
278+
raw=httpx.Response(200, content=content),
279+
client=client,
280+
stream=False,
281+
stream_cls=None,
282+
cast_to=str,
283+
options=FinalRequestOptions.construct(method="get", url="/foo"),
284+
)
285+
286+
result = await response.parse(to=bool)
287+
assert result is expected
288+
289+
240290
class OtherModel(BaseModel):
241291
a: str
242292

0 commit comments

Comments
 (0)