Skip to content

Commit 10dd898

Browse files
chore(internal): add support for parsing bool response content (#1774)
1 parent e446e75 commit 10dd898

File tree

4 files changed

+81
-0
lines changed

4 files changed

+81
-0
lines changed

src/openai/_legacy_response.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,9 @@ def _parse(self, *, to: type[_T] | None = None) -> R | _T:
255255
if cast_to == float:
256256
return cast(R, float(response.text))
257257

258+
if cast_to == bool:
259+
return cast(R, response.text.lower() == "true")
260+
258261
origin = get_origin(cast_to) or cast_to
259262

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

src/openai/_response.py

Lines changed: 3 additions & 0 deletions
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

tests/test_legacy_response.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,31 @@ def test_response_parse_mismatched_basemodel(client: OpenAI) -> None:
3232
response.parse(to=PydanticModel)
3333

3434

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

tests/test_response.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,56 @@ async def test_async_response_parse_annotated_type(async_client: AsyncOpenAI) ->
190190
assert obj.bar == 2
191191

192192

193+
@pytest.mark.parametrize(
194+
"content, expected",
195+
[
196+
("false", False),
197+
("true", True),
198+
("False", False),
199+
("True", True),
200+
("TrUe", True),
201+
("FalSe", False),
202+
],
203+
)
204+
def test_response_parse_bool(client: OpenAI, content: str, expected: bool) -> None:
205+
response = APIResponse(
206+
raw=httpx.Response(200, content=content),
207+
client=client,
208+
stream=False,
209+
stream_cls=None,
210+
cast_to=str,
211+
options=FinalRequestOptions.construct(method="get", url="/foo"),
212+
)
213+
214+
result = response.parse(to=bool)
215+
assert result is expected
216+
217+
218+
@pytest.mark.parametrize(
219+
"content, expected",
220+
[
221+
("false", False),
222+
("true", True),
223+
("False", False),
224+
("True", True),
225+
("TrUe", True),
226+
("FalSe", False),
227+
],
228+
)
229+
async def test_async_response_parse_bool(client: AsyncOpenAI, content: str, expected: bool) -> None:
230+
response = AsyncAPIResponse(
231+
raw=httpx.Response(200, content=content),
232+
client=client,
233+
stream=False,
234+
stream_cls=None,
235+
cast_to=str,
236+
options=FinalRequestOptions.construct(method="get", url="/foo"),
237+
)
238+
239+
result = await response.parse(to=bool)
240+
assert result is expected
241+
242+
193243
class OtherModel(BaseModel):
194244
a: str
195245

0 commit comments

Comments
 (0)