Skip to content

Commit c085112

Browse files
author
YuSUN
committed
feat: add depency injection
1 parent ea232a8 commit c085112

File tree

7 files changed

+110
-509
lines changed

7 files changed

+110
-509
lines changed

.github/workflows/main.yml

Lines changed: 0 additions & 33 deletions
This file was deleted.

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,7 @@ bump:
44
sed -i -e "s/__version__.*/__version__ = '${VERSION}'/g" gql/__init__.py
55
poetry version -s ${VERSION}
66

7+
publish:
8+
rm -rf dist
9+
flit build
10+
flit publish --repository teletraan

gql/__init__.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
"""
2+
Python schema-first GraphQL library based on GraphQL-core.
3+
"""
14
from .enum import enum_type # noqa
25
from .execute import ExecutionContext # noqa
36
from .middleware import MiddlewareManager # noqa
@@ -15,4 +18,4 @@
1518
from .schema_visitor import SchemaDirectiveVisitor # noqa
1619
from .utils import gql # noqa
1720

18-
__version__ = '0.2.10'
21+
__version__ = '0.3.0'

gql/depends.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from typing import Any, Callable
2+
3+
from graphql import GraphQLResolveInfo
4+
5+
6+
class ResolverDepends:
7+
def __init__(self, dependency: Callable[..., Any]) -> None:
8+
self.dependency = dependency
9+
10+
def get_parameters(self, parent: Any, info: GraphQLResolveInfo) -> tuple:
11+
"""
12+
Get parameters from parent and info.
13+
"""
14+
return ()
15+
16+
def execute(self, parent: Any, info: GraphQLResolveInfo):
17+
"""
18+
Execute depends to get real value.
19+
"""
20+
return self.dependency(*self.get_parameters(parent, info))
21+
22+
23+
class InfoDepends(ResolverDepends):
24+
def get_parameters(self, parent: Any, info: GraphQLResolveInfo):
25+
return (info,)
26+
27+
28+
class ContextDepends(ResolverDepends):
29+
def get_parameters(self, parent: Any, info: GraphQLResolveInfo):
30+
return (info.context,)
31+
32+
33+
class RequestDepends(ResolverDepends):
34+
def get_parameters(self, parent: Any, info: GraphQLResolveInfo):
35+
return (info.context.get('request'),)

gql/resolver.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import inspect
12
import logging
23
import traceback
34
from collections import defaultdict
@@ -19,6 +20,7 @@
1920
is_union_type,
2021
)
2122

23+
from .depends import ResolverDepends
2224
from .utils import execute_async_function, recursive_to_snake_case, to_camel_case, to_snake_case
2325

2426

@@ -44,15 +46,18 @@ def print_resolver_error(info: GraphQLResolveInfo):
4446
def reference_resolver(type_name: str):
4547
if type_name in reference_resolver_map:
4648
raise Exception(
47-
f"{type_name} is already registered by "
48-
f"{reference_resolver_map[type_name].__code__}"
49+
f"{type_name} is already registered by " f"{reference_resolver_map[type_name].__code__}"
4950
)
5051

5152
def wrap(func: ReferenceResolver):
5253
@wraps(func)
5354
def sync_resolver(parent, info, representation):
5455
try:
55-
result = func(parent, info, representation)
56+
kwargs = {}
57+
for name, param in inspect.signature(func).parameters.items():
58+
if isinstance(param.default, ResolverDepends):
59+
kwargs[name] = param.default.execute(parent, info)
60+
result = func(parent, info, representation, **kwargs)
5661
return dict(result) if result is not None else result
5762
except Exception as exc:
5863
print_resolver_error(info)
@@ -62,7 +67,11 @@ def sync_resolver(parent, info, representation):
6267
@wraps(func)
6368
async def async_resolver(parent, info, representation):
6469
try:
65-
result = await execute_async_function(func, parent, info, representation)
70+
kwargs = {}
71+
for name, param in inspect.signature(func).parameters.items():
72+
if isinstance(param.default, ResolverDepends):
73+
kwargs[name] = param.default.execute(parent, info)
74+
result = await execute_async_function(func, parent, info, representation, **kwargs)
6675
return dict(result) if result is not None else result
6776
except Exception as exc:
6877
print_resolver_error(info)
@@ -81,8 +90,7 @@ async def async_resolver(parent, info, representation):
8190
def type_resolver(type_name: str):
8291
if type_name in type_resolver_map:
8392
raise Exception(
84-
f"{type_name} is already registered by "
85-
f"{type_resolver_map[type_name].__code__}"
93+
f"{type_name} is already registered by " f"{type_resolver_map[type_name].__code__}"
8694
)
8795

8896
def wrap(func):
@@ -103,6 +111,11 @@ def wrap(func: GraphQLFieldResolver):
103111
def sync_resolver(parent, info, **kwargs):
104112
if snake_argument:
105113
kwargs = recursive_to_snake_case(kwargs)
114+
115+
for name, param in inspect.signature(func).parameters.items():
116+
if isinstance(param.default, ResolverDepends):
117+
kwargs[name] = param.default.execute(parent, info)
118+
106119
if not print_exc:
107120
return func(parent, info, **kwargs)
108121

@@ -117,6 +130,11 @@ def sync_resolver(parent, info, **kwargs):
117130
async def async_resolver(parent, info, **kwargs):
118131
if snake_argument:
119132
kwargs = recursive_to_snake_case(kwargs)
133+
134+
for name, param in inspect.signature(func).parameters.items():
135+
if isinstance(param.default, ResolverDepends):
136+
kwargs[name] = param.default.execute(parent, info)
137+
120138
if not print_exc:
121139
return await execute_async_function(func, parent, info, **kwargs)
122140

0 commit comments

Comments
 (0)