Skip to content

Commit 4e926d6

Browse files
committed
Merge branch 'release/1.1.0'
2 parents 4b6b278 + 1f22f61 commit 4e926d6

22 files changed

+809
-1337
lines changed

.github/workflows/test.yml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@ jobs:
88
matrix:
99
cmd:
1010
- black
11-
- flake8
12-
- isort
1311
- mypy
14-
- autoflake
12+
- ruff
1513
runs-on: ubuntu-latest
1614
steps:
1715
- uses: actions/checkout@v2

.pre-commit-config.yaml

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,6 @@ repos:
2222
language: system
2323
types: [python]
2424

25-
- id: autoflake
26-
name: autoflake
27-
entry: poetry run autoflake
28-
language: system
29-
types: [python]
30-
args: [--in-place, --remove-all-unused-imports, --remove-duplicate-keys]
31-
32-
- id: isort
33-
name: isort
34-
entry: poetry run isort
35-
language: system
36-
types: [python]
37-
38-
- id: flake8
39-
name: Check with Flake8
40-
entry: poetry run flake8
41-
language: system
42-
pass_filenames: false
43-
types: [python]
44-
args: [--count, aiohttp_deps]
4525

4626
- id: mypy
4727
name: Validate types with MyPy
@@ -51,8 +31,13 @@ repos:
5131
pass_filenames: false
5232
args: [aiohttp_deps]
5333

54-
- id: yesqa
55-
name: Remove usless noqa
56-
entry: poetry run yesqa
34+
- id: ruff
35+
name: Run ruff lints
36+
entry: poetry run ruff
5737
language: system
38+
pass_filenames: false
5839
types: [python]
40+
args:
41+
- "--fix"
42+
- "aiohttp_deps"
43+
- "tests"

README.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ router = Router()
151151

152152

153153
async def get_db_session(app: web.Application = Depends()):
154-
async with app["db"] as sess:
154+
async with app[web.AppKey("db")] as sess:
155155
yield sess
156156

157157

@@ -363,7 +363,7 @@ Sometimes for tests you don't want to calculate actual functions
363363
and you want to pass another functions instead.
364364

365365
To do so, you can add "dependency_overrides" or "values_overrides" to the aplication's state.
366-
These values should be dicts.
366+
These values should be dicts. The keys for these values can be found in `aiohttp_deps.keys` module.
367367

368368
Here's an example.
369369

@@ -385,18 +385,22 @@ where you create your application. And make sure that keys
385385
of that dict are actual function that are being replaced.
386386

387387
```python
388-
my_app["values_overrides"] = {original_dep: 2}
388+
from aiohttp_deps import VALUES_OVERRIDES_KEY
389+
390+
my_app[VALUES_OVERRIDES_KEY] = {original_dep: 2}
389391
```
390392

391-
But `values_overrides` only overrides values. If you want to
393+
But `values_overrides` only overrides returned values. If you want to
392394
override functions, you have to use `dependency_overrides`. Here's an example:
393395

394396
```python
397+
from aiohttp_deps import DEPENDENCY_OVERRIDES_KEY
398+
395399
def replacing_function() -> int:
396400
return 2
397401

398402

399-
my_app["dependency_overrides"] = {original_dep: replacing_function}
403+
my_app[DEPENDENCY_OVERRIDES_KEY] = {original_dep: replacing_function}
400404
```
401405

402406
The cool point about `dependency_overrides`, is that it recalculates graph and

aiohttp_deps/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from taskiq_dependencies import Depends
33

44
from aiohttp_deps.initializer import init
5+
from aiohttp_deps.keys import DEPENDENCY_OVERRIDES_KEY, VALUES_OVERRIDES_KEY
56
from aiohttp_deps.router import Router
67
from aiohttp_deps.swagger import extra_openapi, openapi_response, setup_swagger
78
from aiohttp_deps.utils import Form, Header, Json, Path, Query
@@ -20,4 +21,6 @@
2021
"Form",
2122
"Path",
2223
"openapi_response",
24+
"DEPENDENCY_OVERRIDES_KEY",
25+
"VALUES_OVERRIDES_KEY",
2326
]

aiohttp_deps/initializer.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from aiohttp import hdrs, web
66
from taskiq_dependencies import DependencyGraph
77

8+
from aiohttp_deps.keys import DEPENDENCY_OVERRIDES_KEY, VALUES_OVERRIDES_KEY
89
from aiohttp_deps.view import View
910

1011

@@ -40,13 +41,17 @@ async def __call__(self, request: web.Request) -> web.StreamResponse:
4041
:param request: current request.
4142
:return: response.
4243
"""
44+
# Hack for mypy to work
45+
values_overrides = request.app.get(VALUES_OVERRIDES_KEY)
46+
if values_overrides is None:
47+
values_overrides = {}
4348
async with self.graph.async_ctx(
4449
{
4550
web.Request: request,
4651
web.Application: request.app,
47-
**request.app.get("values_overrides", {}),
52+
**values_overrides,
4853
},
49-
replaced_deps=request.app.get("dependency_overrides"),
54+
replaced_deps=request.app.get(DEPENDENCY_OVERRIDES_KEY),
5055
) as resolver:
5156
return await self.original_handler(**(await resolver.resolve_kwargs()))
5257

@@ -72,7 +77,7 @@ def __init__(
7277
allowed_methods = {
7378
method.lower()
7479
for method in hdrs.METH_ALL
75-
if hasattr(original_route, method.lower()) # noqa: WPS421
80+
if hasattr(original_route, method.lower())
7681
}
7782
self.graph_map = {
7883
method: DependencyGraph(getattr(original_route, method))

aiohttp_deps/keys.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from typing import Any, Dict
2+
3+
from aiohttp import web
4+
5+
SWAGGER_SCHEMA_KEY = web.AppKey("openapi_schema", Dict[str, Any])
6+
VALUES_OVERRIDES_KEY = web.AppKey("values_overrides", Dict[Any, Any])
7+
DEPENDENCY_OVERRIDES_KEY = web.AppKey("dependency_overrides", Dict[Any, Any])

aiohttp_deps/router.pyi

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
from typing import Any, Awaitable, Callable, Iterable, Type, Union
22

3+
import typing_extensions
34
from aiohttp import web
45
from aiohttp.abc import AbstractView
56

6-
_Handler = Callable[..., Awaitable[web.StreamResponse]]
7+
_Handler: typing_extensions.TypeAlias = Callable[..., Awaitable[web.StreamResponse]]
78

8-
_ViewedHandler = Union[Type[AbstractView], _Handler]
9+
_ViewedHandler: typing_extensions.TypeAlias = Union[Type[AbstractView], _Handler]
910

10-
_Deco = Callable[[_ViewedHandler], _ViewedHandler]
11+
_Deco: typing_extensions.TypeAlias = Callable[[_ViewedHandler], _ViewedHandler]
1112

1213
class Router(web.RouteTableDef):
1314
def head(self, path: str, **kwargs: Any) -> _Deco: ...
@@ -18,4 +19,8 @@ class Router(web.RouteTableDef):
1819
def delete(self, path: str, **kwargs: Any) -> _Deco: ...
1920
def options(self, path: str, **kwargs: Any) -> _Deco: ...
2021
def view(self, path: str, **kwargs: Any) -> _Deco: ...
21-
def add_routes(self, router: Iterable[web.AbstractRouteDef], prefix: str = "") -> None: ...
22+
def add_routes(
23+
self,
24+
router: Iterable[web.AbstractRouteDef],
25+
prefix: str = "",
26+
) -> None: ...

aiohttp_deps/swagger.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,12 @@
1818
from taskiq_dependencies import DependencyGraph
1919

2020
from aiohttp_deps.initializer import InjectableFuncHandler, InjectableViewHandler
21+
from aiohttp_deps.keys import SWAGGER_SCHEMA_KEY
2122
from aiohttp_deps.utils import Form, Header, Json, Path, Query
2223

23-
_T = TypeVar("_T") # noqa: WPS111
24+
_T = TypeVar("_T")
2425

2526
REF_TEMPLATE = "#/components/schemas/{model}"
26-
SCHEMA_KEY = "openapi_schema"
2727
SWAGGER_HTML_TEMPALTE = """
2828
<html lang="en">
2929
@@ -52,15 +52,15 @@
5252
</body>
5353
</html>
5454
"""
55-
METHODS_WITH_BODY = {"POST", "PUT", "PATCH"} # noqa: WPS407
55+
METHODS_WITH_BODY = {"POST", "PUT", "PATCH"}
5656

5757
logger = getLogger()
5858

5959

6060
async def _schema_handler(
6161
request: web.Request,
6262
) -> web.Response:
63-
return web.json_response(request.app[SCHEMA_KEY])
63+
return web.json_response(request.app[SWAGGER_SCHEMA_KEY])
6464

6565

6666
def _get_swagger_handler(
@@ -99,7 +99,7 @@ def dummy(_var: annotation.annotation) -> None: # type: ignore
9999
)
100100

101101

102-
def _add_route_def( # noqa: C901, WPS210, WPS211
102+
def _add_route_def( # noqa: C901
103103
openapi_schema: Dict[str, Any],
104104
route: web.ResourceRoute,
105105
method: str,
@@ -198,7 +198,7 @@ def _insert_in_params(data: Dict[str, Any]) -> None:
198198
)
199199

200200

201-
def setup_swagger( # noqa: C901, WPS211
201+
def setup_swagger( # noqa: C901
202202
schema_url: str = "/openapi.json",
203203
swagger_ui_url: str = "/docs",
204204
enable_ui: bool = True,
@@ -302,7 +302,7 @@ async def event_handler(app: web.Application) -> None:
302302
exc_info=True,
303303
)
304304

305-
app[SCHEMA_KEY] = openapi_schema
305+
app[SWAGGER_SCHEMA_KEY] = openapi_schema
306306

307307
app.router.add_get(
308308
schema_url,

aiohttp_deps/utils.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@ def __init__(
2727
alias: Optional[str] = None,
2828
multiple: bool = False,
2929
description: str = "",
30-
):
30+
) -> None:
3131
self.default = default
3232
self.alias = alias
3333
self.multiple = multiple
3434
self.description = description
3535
self.type_initialized = False
3636
self.type_cache: "Union[pydantic.TypeAdapter[Any], None]" = None
3737

38-
def __call__( # noqa: C901
38+
def __call__(
3939
self,
4040
param_info: ParamInfo = Depends(),
4141
request: web.Request = Depends(),
@@ -85,7 +85,7 @@ def __call__( # noqa: C901
8585
raise web.HTTPBadRequest(
8686
headers={"Content-Type": "application/json"},
8787
text=json.dumps(errors),
88-
)
88+
) from err
8989

9090

9191
class Json:
@@ -100,7 +100,7 @@ def __init__(self) -> None:
100100
self.type_initialized = False
101101
self.type_cache: "Union[pydantic.TypeAdapter[Any], None]" = None
102102

103-
async def __call__( # noqa: C901
103+
async def __call__(
104104
self,
105105
param_info: ParamInfo = Depends(),
106106
request: web.Request = Depends(),
@@ -142,7 +142,7 @@ async def __call__( # noqa: C901
142142
raise web.HTTPBadRequest(
143143
headers={"Content-Type": "application/json"},
144144
text=json.dumps(errors),
145-
)
145+
) from err
146146

147147

148148
class Query:
@@ -165,15 +165,15 @@ def __init__(
165165
alias: Optional[str] = None,
166166
multiple: bool = False,
167167
description: str = "",
168-
):
168+
) -> None:
169169
self.default = default
170170
self.alias = alias
171171
self.multiple = multiple
172172
self.description = description
173173
self.type_initialized = False
174174
self.type_cache: "Union[pydantic.TypeAdapter[Any], None]" = None
175175

176-
def __call__( # noqa: C901
176+
def __call__(
177177
self,
178178
param_info: ParamInfo = Depends(),
179179
request: web.Request = Depends(),
@@ -223,7 +223,7 @@ def __call__( # noqa: C901
223223
raise web.HTTPBadRequest(
224224
headers={"Content-Type": "application/json"},
225225
text=json.dumps(errors),
226-
)
226+
) from err
227227

228228

229229
class Form:
@@ -240,7 +240,7 @@ def __init__(self) -> None:
240240
self.type_initialized = False
241241
self.type_cache: "Union[pydantic.TypeAdapter[Any], None]" = None
242242

243-
async def __call__( # noqa: C901
243+
async def __call__(
244244
self,
245245
param_info: ParamInfo = Depends(),
246246
request: web.Request = Depends(),
@@ -279,7 +279,7 @@ async def __call__( # noqa: C901
279279
raise web.HTTPBadRequest(
280280
headers={"Content-Type": "application/json"},
281281
text=json.dumps(errors),
282-
)
282+
) from err
283283

284284

285285
class Path:
@@ -304,7 +304,7 @@ def __init__(
304304
self.type_initialized = False
305305
self.type_cache: "Union[pydantic.TypeAdapter[Any], None]" = None
306306

307-
def __call__( # noqa: C901
307+
def __call__(
308308
self,
309309
param_info: ParamInfo = Depends(),
310310
request: web.Request = Depends(),
@@ -343,4 +343,4 @@ def __call__( # noqa: C901
343343
raise web.HTTPBadRequest(
344344
headers={"Content-Type": "application/json"},
345345
text=json.dumps(errors),
346-
)
346+
) from err

aiohttp_deps/view.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
from aiohttp.web_response import StreamResponse
55
from taskiq_dependencies import DependencyGraph
66

7+
from aiohttp_deps.keys import DEPENDENCY_OVERRIDES_KEY, VALUES_OVERRIDES_KEY
8+
79

810
class View(web.View):
911
"""
@@ -39,12 +41,15 @@ async def _iter(self) -> StreamResponse:
3941
)
4042
if method is None:
4143
self._raise_allowed_methods()
44+
values_overrides = self.request.app.get(VALUES_OVERRIDES_KEY)
45+
if values_overrides is None:
46+
values_overrides = {}
4247
async with self._graph_map[self.request.method.lower()].async_ctx(
4348
{
4449
web.Request: self.request,
4550
web.Application: self.request.app,
46-
**self.request.app.get("values_overrides", {}),
51+
**values_overrides,
4752
},
48-
replaced_deps=self.request.app.get("dependency_overrides"),
53+
replaced_deps=self.request.app.get(DEPENDENCY_OVERRIDES_KEY),
4954
) as ctx:
5055
return await method(**(await ctx.resolve_kwargs())) # type: ignore

0 commit comments

Comments
 (0)