diff --git a/src/vws/transports.py b/src/vws/transports.py index 80aa989f..5dd9db23 100644 --- a/src/vws/transports.py +++ b/src/vws/transports.py @@ -1,7 +1,7 @@ """HTTP transport implementations for VWS clients.""" from collections.abc import Awaitable -from typing import Protocol, Self, runtime_checkable +from typing import Protocol, Self, assert_never, runtime_checkable import httpx import requests @@ -10,6 +10,30 @@ from vws.response import Response +@beartype(conf=BeartypeConf(is_pep484_tower=True)) +def _httpx_timeout( + request_timeout: float | tuple[float, float], +) -> httpx.Timeout: + """Build an ``httpx.Timeout`` from a request timeout value.""" + match request_timeout: + case (connect, read): + return httpx.Timeout( + connect=connect, + read=read, + write=None, + pool=None, + ) + case float() | int() as timeout: + return httpx.Timeout( + connect=timeout, + read=timeout, + write=None, + pool=None, + ) + case _ as unreachable: + assert_never(unreachable) # pyrefly: ignore[bad-argument-type] # ty: ignore[type-assertion-failure] + + @runtime_checkable class Transport(Protocol): """Protocol for HTTP transports used by VWS clients. @@ -149,21 +173,7 @@ def __call__( Returns: A Response populated from the httpx response. """ - if isinstance(request_timeout, tuple): - connect_timeout, read_timeout = request_timeout - httpx_timeout = httpx.Timeout( - connect=connect_timeout, - read=read_timeout, - write=None, - pool=None, - ) - else: - httpx_timeout = httpx.Timeout( - connect=request_timeout, - read=request_timeout, - write=None, - pool=None, - ) + httpx_timeout = _httpx_timeout(request_timeout=request_timeout) httpx_response = self._client.request( method=method, @@ -272,21 +282,7 @@ async def __call__( Returns: A Response populated from the httpx response. """ - if isinstance(request_timeout, tuple): - connect_timeout, read_timeout = request_timeout - httpx_timeout = httpx.Timeout( - connect=connect_timeout, - read=read_timeout, - write=None, - pool=None, - ) - else: - httpx_timeout = httpx.Timeout( - connect=request_timeout, - read=request_timeout, - write=None, - pool=None, - ) + httpx_timeout = _httpx_timeout(request_timeout=request_timeout) httpx_response = await self._client.request( method=method,