Skip to content

Commit 66d7720

Browse files
chore(internal): codegen related update (#172)
1 parent 28d3f2a commit 66d7720

File tree

3 files changed

+100
-1
lines changed

3 files changed

+100
-1
lines changed

src/runloop_api_client/_base_client.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,10 @@ def _build_headers(self, options: FinalRequestOptions, *, retries_taken: int = 0
412412
if idempotency_header and options.method.lower() != "get" and idempotency_header not in headers:
413413
headers[idempotency_header] = options.idempotency_key or self._idempotency_key()
414414

415-
headers.setdefault("x-stainless-retry-count", str(retries_taken))
415+
# Don't set the retry count header if it was already set or removed by the caller. We check
416+
# `custom_headers`, which can contain `Omit()`, instead of `headers` to account for the removal case.
417+
if "x-stainless-retry-count" not in (header.lower() for header in custom_headers):
418+
headers["x-stainless-retry-count"] = str(retries_taken)
416419

417420
return headers
418421

src/runloop_api_client/_compat.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,14 @@ def model_dump(
136136
exclude: IncEx = None,
137137
exclude_unset: bool = False,
138138
exclude_defaults: bool = False,
139+
warnings: bool = True,
139140
) -> dict[str, Any]:
140141
if PYDANTIC_V2:
141142
return model.model_dump(
142143
exclude=exclude,
143144
exclude_unset=exclude_unset,
144145
exclude_defaults=exclude_defaults,
146+
warnings=warnings,
145147
)
146148
return cast(
147149
"dict[str, Any]",

tests/test_client.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -783,6 +783,52 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
783783
assert response.retries_taken == failures_before_success
784784
assert int(response.http_request.headers.get("x-stainless-retry-count")) == failures_before_success
785785

786+
@pytest.mark.parametrize("failures_before_success", [0, 2, 4])
787+
@mock.patch("runloop_api_client._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
788+
@pytest.mark.respx(base_url=base_url)
789+
def test_omit_retry_count_header(
790+
self, client: Runloop, failures_before_success: int, respx_mock: MockRouter
791+
) -> None:
792+
client = client.with_options(max_retries=4)
793+
794+
nb_retries = 0
795+
796+
def retry_handler(_request: httpx.Request) -> httpx.Response:
797+
nonlocal nb_retries
798+
if nb_retries < failures_before_success:
799+
nb_retries += 1
800+
return httpx.Response(500)
801+
return httpx.Response(200)
802+
803+
respx_mock.post("/v1/devboxes").mock(side_effect=retry_handler)
804+
805+
response = client.devboxes.with_raw_response.create(extra_headers={"x-stainless-retry-count": Omit()})
806+
807+
assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0
808+
809+
@pytest.mark.parametrize("failures_before_success", [0, 2, 4])
810+
@mock.patch("runloop_api_client._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
811+
@pytest.mark.respx(base_url=base_url)
812+
def test_overwrite_retry_count_header(
813+
self, client: Runloop, failures_before_success: int, respx_mock: MockRouter
814+
) -> None:
815+
client = client.with_options(max_retries=4)
816+
817+
nb_retries = 0
818+
819+
def retry_handler(_request: httpx.Request) -> httpx.Response:
820+
nonlocal nb_retries
821+
if nb_retries < failures_before_success:
822+
nb_retries += 1
823+
return httpx.Response(500)
824+
return httpx.Response(200)
825+
826+
respx_mock.post("/v1/devboxes").mock(side_effect=retry_handler)
827+
828+
response = client.devboxes.with_raw_response.create(extra_headers={"x-stainless-retry-count": "42"})
829+
830+
assert response.http_request.headers.get("x-stainless-retry-count") == "42"
831+
786832

787833
class TestAsyncRunloop:
788834
client = AsyncRunloop(base_url=base_url, bearer_token=bearer_token, _strict_response_validation=True)
@@ -1523,3 +1569,51 @@ def retry_handler(_request: httpx.Request) -> httpx.Response:
15231569

15241570
assert response.retries_taken == failures_before_success
15251571
assert int(response.http_request.headers.get("x-stainless-retry-count")) == failures_before_success
1572+
1573+
@pytest.mark.parametrize("failures_before_success", [0, 2, 4])
1574+
@mock.patch("runloop_api_client._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
1575+
@pytest.mark.respx(base_url=base_url)
1576+
@pytest.mark.asyncio
1577+
async def test_omit_retry_count_header(
1578+
self, async_client: AsyncRunloop, failures_before_success: int, respx_mock: MockRouter
1579+
) -> None:
1580+
client = async_client.with_options(max_retries=4)
1581+
1582+
nb_retries = 0
1583+
1584+
def retry_handler(_request: httpx.Request) -> httpx.Response:
1585+
nonlocal nb_retries
1586+
if nb_retries < failures_before_success:
1587+
nb_retries += 1
1588+
return httpx.Response(500)
1589+
return httpx.Response(200)
1590+
1591+
respx_mock.post("/v1/devboxes").mock(side_effect=retry_handler)
1592+
1593+
response = await client.devboxes.with_raw_response.create(extra_headers={"x-stainless-retry-count": Omit()})
1594+
1595+
assert len(response.http_request.headers.get_list("x-stainless-retry-count")) == 0
1596+
1597+
@pytest.mark.parametrize("failures_before_success", [0, 2, 4])
1598+
@mock.patch("runloop_api_client._base_client.BaseClient._calculate_retry_timeout", _low_retry_timeout)
1599+
@pytest.mark.respx(base_url=base_url)
1600+
@pytest.mark.asyncio
1601+
async def test_overwrite_retry_count_header(
1602+
self, async_client: AsyncRunloop, failures_before_success: int, respx_mock: MockRouter
1603+
) -> None:
1604+
client = async_client.with_options(max_retries=4)
1605+
1606+
nb_retries = 0
1607+
1608+
def retry_handler(_request: httpx.Request) -> httpx.Response:
1609+
nonlocal nb_retries
1610+
if nb_retries < failures_before_success:
1611+
nb_retries += 1
1612+
return httpx.Response(500)
1613+
return httpx.Response(200)
1614+
1615+
respx_mock.post("/v1/devboxes").mock(side_effect=retry_handler)
1616+
1617+
response = await client.devboxes.with_raw_response.create(extra_headers={"x-stainless-retry-count": "42"})
1618+
1619+
assert response.http_request.headers.get("x-stainless-retry-count") == "42"

0 commit comments

Comments
 (0)