Skip to content

Commit 4750815

Browse files
committed
added some tests
1 parent 19dbf3a commit 4750815

35 files changed

Lines changed: 810 additions & 149 deletions

extapi/_meta.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import importlib.util
2+
3+
has_open_telemetry = importlib.util.find_spec("opentelemetry") is not None

extapi/http/abc.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ async def execute(
3030
self,
3131
request: RequestData,
3232
) -> Response[T]:
33-
raise NotImplementedError
33+
raise NotImplementedError # pragma: no cover
3434

3535
async def get(
3636
self,
@@ -160,7 +160,7 @@ async def need_retry(self, response: Response[T]) -> tuple[bool, float | None]:
160160

161161
@runtime_checkable
162162
class Addon(Protocol[T]):
163-
async def enrich(self, request: RequestData) -> None: ...
163+
async def before_request(self, request: RequestData) -> None: ...
164164

165165
async def process_response(
166166
self, request: RequestData, response: Response[T]

extapi/http/addons/auth.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from base64 import b64encode
12
from collections.abc import Awaitable, Callable
23
from typing import Generic, TypeVar
34

@@ -28,8 +29,9 @@ async def need_retry(self, response: Response[T]) -> tuple[bool, float | None]:
2829
return True, None
2930
return False, None
3031

31-
async def enrich(self, request: RequestData) -> None:
32-
request.headers = request.headers or CIMultiDict()
32+
async def before_request(self, request: RequestData) -> None:
33+
if request.headers is None:
34+
request.headers = CIMultiDict()
3335

3436
token = await execute_sync_async(self._token_getter)
3537
request.headers["Authorization"] = f"Bearer {token}"
@@ -41,3 +43,30 @@ def __init__(self, token: str):
4143

4244
async def need_retry(self, response: Response[T]) -> tuple[bool, float | None]:
4345
return False, None
46+
47+
48+
class StaticBasicAuthAddon(Addon[T], Retryable[T], Generic[T]):
49+
__slots__ = ("_login", "_password")
50+
51+
def __init__(
52+
self,
53+
*,
54+
login: str,
55+
password: str,
56+
):
57+
self._login = login
58+
self._password = password
59+
self.__header_value = "Basic " + self._generate_auth(
60+
self._login, self._password
61+
)
62+
63+
def _generate_auth(self, login: str, password: str) -> str:
64+
return b64encode(f"{login}:{password}".encode("utf-8")).decode("utf-8")
65+
66+
async def need_retry(self, response: Response[T]) -> tuple[bool, float | None]:
67+
return False, None
68+
69+
async def before_request(self, request: RequestData) -> None:
70+
if request.headers is None:
71+
request.headers = CIMultiDict()
72+
request.headers["Authorization"] = self.__header_value

extapi/http/addons/headers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,6 @@ def __init__(
2222
):
2323
self._adder = adder
2424

25-
async def enrich(self, request: RequestData) -> None:
25+
async def before_request(self, request: RequestData) -> None:
2626
request.headers = request.headers or CIMultiDict()
2727
await execute_sync_async(self._adder, request.headers)

extapi/http/addons/log.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class LoggingAddon(Addon[T], Generic[T]):
1212
def __init__(self):
1313
self._logger = logging.getLogger("extapi.http.addons.log")
1414

15-
async def enrich(self, request: RequestData) -> None:
15+
async def before_request(self, request: RequestData) -> None:
1616
self._logger.debug("executing request %s %s", request.method, str(request.url))
1717

1818
async def process_response(
@@ -61,7 +61,7 @@ def __init__(
6161
super().__init__()
6262
self._truncate_response_data = truncate_response_data
6363

64-
async def enrich(self, request: RequestData) -> None:
64+
async def before_request(self, request: RequestData) -> None:
6565
json = request.json
6666
if json is not None:
6767
if isinstance(json, bytes):

extapi/http/addons/retry.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
from typing import Generic
1+
from typing import Generic, TypeVar
22

33
from extapi.http.abc import Retryable
4-
from extapi.http.executors.retry import T
54
from extapi.http.types import Response
65

6+
T = TypeVar("T")
7+
78

89
class Retry5xxAddon(Retryable[T], Generic[T]):
910
async def need_retry(self, response: Response[T]) -> tuple[bool, float | None]:

extapi/http/addons/status.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ def __init__(
1414
):
1515
self._expected_statuses = set(expected_statuses)
1616

17-
async def enrich(self, request: RequestData) -> None:
18-
return None
17+
async def before_request(self, request: RequestData) -> None:
18+
return None # pragma: no cover
1919

2020
async def process_response(
2121
self, request: RequestData, response: Response[T]

extapi/http/backends/aiohttp.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import aiohttp
44

55
from extapi.http.abc import AbstractExecutor
6-
from extapi.http.types import RequestData, Response, Closable
6+
from extapi.http.types import Closable, RequestData, Response
77

88

99
class AiohttpResponseWrap(Closable):

extapi/http/backends/httpx.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from yarl import URL
88

99
from extapi.http.abc import AbstractExecutor
10-
from extapi.http.types import RequestData, Response, Closable
10+
from extapi.http.types import Closable, RequestData, Response
1111

1212

1313
class HttpxResponseWrap(Closable):

extapi/http/executors/limiters.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
from typing import TypeVar
22

33
from extapi.http.abc import AbstractExecutor
4-
from extapi.http.base import WrappedExecutor
54
from extapi.http.types import RequestData, Response
65
from extapi.limiters.concurrency.abc import ConcurrencyLimiter
76
from extapi.limiters.rps.abc import RateLimiter
87

8+
from .wrapped import WrappedExecutor
9+
910
T = TypeVar("T")
1011

1112

@@ -39,5 +40,5 @@ def __init__(
3940
self._rate_limiter = rate_limiter
4041

4142
async def execute(self, request: RequestData) -> Response[T]:
42-
await self._rate_limiter.limit_rps()
43+
await self._rate_limiter.rate_limit()
4344
return await super().execute(request)

0 commit comments

Comments
 (0)