Skip to content

Commit 8ddeb84

Browse files
authored
refactor: improve internal readability
1 parent b831695 commit 8ddeb84

File tree

5 files changed

+135
-128
lines changed

5 files changed

+135
-128
lines changed

injection/_core/asfunction.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,9 @@ def asfunction[**P, T](
2323
) -> Any:
2424
def decorator(wp: AsFunctionWrappedType[P, T]) -> Callable[P, T]:
2525
fake_method = wp.__call__.__get__(NotImplemented, wp)
26-
factory: Caller[..., Callable[P, T]] = (
27-
(module or mod())
28-
.make_injected_function(
29-
wp,
30-
threadsafe=threadsafe,
31-
)
32-
.__injection_metadata__
26+
factory: Caller[..., Callable[P, T]] = (module or mod())._metadata(
27+
wp,
28+
threadsafe,
3329
)
3430

3531
wrapper: Callable[P, T] = (

injection/_core/locator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ def _extract_caller[**P, T](
291291

292292

293293
def _make_injectable[T](
294-
injectable_factory: InjectableFactory[T],
294+
factory: InjectableFactory[T],
295295
recipe: Recipe[..., T],
296296
) -> Injectable[T]:
297-
return injectable_factory(_extract_caller(recipe))
297+
return factory(_extract_caller(recipe))

injection/_core/module.py

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -387,12 +387,7 @@ def make_injected_function[**P, T](
387387
/,
388388
threadsafe: bool | None = None,
389389
) -> InjectedFunction[P, T]:
390-
metadata = InjectMetadata(wrapped, threadsafe)
391-
392-
@metadata.task
393-
def listen() -> None:
394-
metadata.update(self)
395-
self.add_listener(metadata)
390+
metadata = self._metadata(wrapped, threadsafe)
396391

397392
if iscoroutinefunction(wrapped):
398393
return AsyncInjectedFunction(metadata) # type: ignore[arg-type, return-value]
@@ -405,11 +400,7 @@ def make_async_factory[T](
405400
/,
406401
threadsafe: bool | None = None,
407402
) -> Callable[..., Awaitable[T]]:
408-
factory: InjectedFunction[..., T] = self.make_injected_function(
409-
wrapped,
410-
threadsafe,
411-
)
412-
return factory.__injection_metadata__.acall
403+
return self._metadata(wrapped, threadsafe).acall
413404

414405
async def afind_instance[T](
415406
self,
@@ -522,12 +513,14 @@ def aget_lazy_instance[T, Default](
522513
*,
523514
threadsafe: bool | None = None,
524515
) -> Awaitable[T | Default]:
525-
function = self.make_injected_function(
526-
lambda instance=default: instance,
527-
threadsafe=threadsafe,
516+
return SimpleAwaitable(
517+
self._metadata(
518+
lambda instance=default: instance,
519+
threadsafe=threadsafe,
520+
)
521+
.set_owner(cls) # type: ignore[arg-type]
522+
.acall
528523
)
529-
metadata = function.__injection_metadata__.set_owner(cls)
530-
return SimpleAwaitable(metadata.acall)
531524

532525
if TYPE_CHECKING: # pragma: no cover
533526

@@ -556,12 +549,14 @@ def get_lazy_instance[T, Default](
556549
*,
557550
threadsafe: bool | None = None,
558551
) -> Invertible[T | Default]:
559-
function = self.make_injected_function(
560-
lambda instance=default: instance,
561-
threadsafe=threadsafe,
552+
return SimpleInvertible(
553+
self._metadata(
554+
lambda instance=default: instance,
555+
threadsafe=threadsafe,
556+
)
557+
.set_owner(cls) # type: ignore[arg-type]
558+
.call
562559
)
563-
metadata = function.__injection_metadata__.set_owner(cls)
564-
return SimpleInvertible(metadata.call)
565560

566561
def update[T](self, updater: Updater[T]) -> Self:
567562
self.__locator.update(updater)
@@ -686,6 +681,13 @@ def dispatch(self, event: Event) -> Iterator[None]:
686681
finally:
687682
self.__debug(event)
688683

684+
def _metadata[**P, T](
685+
self,
686+
wrapped: Callable[P, T],
687+
threadsafe: bool | None = None,
688+
) -> InjectMetadata[P, T]:
689+
return InjectMetadata(wrapped, threadsafe).listen(self)
690+
689691
def _iter_locators(self) -> Iterator[Locator]:
690692
for module in self.__modules:
691693
yield from module._iter_locators()
@@ -879,16 +881,14 @@ def wrapped(self) -> Callable[P, T]:
879881

880882
async def abind(self, args: Iterable[Any], kwargs: Mapping[str, Any]) -> Arguments:
881883
arguments = self.__get_arguments(args, kwargs)
882-
dependencies = await self.__dependencies.aget_arguments(exclude=arguments)
883-
if dependencies:
884+
if dependencies := await self.__dependencies.aget_arguments(exclude=arguments):
884885
return self.__merge_arguments(arguments, dependencies)
885886

886887
return Arguments(args, kwargs)
887888

888889
def bind(self, args: Iterable[Any], kwargs: Mapping[str, Any]) -> Arguments:
889890
arguments = self.__get_arguments(args, kwargs)
890-
dependencies = self.__dependencies.get_arguments(exclude=arguments)
891-
if dependencies:
891+
if dependencies := self.__dependencies.get_arguments(exclude=arguments):
892892
return self.__merge_arguments(arguments, dependencies)
893893

894894
return Arguments(args, kwargs)
@@ -930,6 +930,14 @@ def decorator(wp: Callable[_P, _T]) -> Callable[_P, _T]:
930930

931931
return decorator(wrapped) if wrapped else decorator
932932

933+
def listen(self, module: Module) -> Self:
934+
@self.task
935+
def start_listening() -> None:
936+
self.update(module)
937+
module.add_listener(self)
938+
939+
return self
940+
933941
@singledispatchmethod
934942
def on_event(self, event: Event, /) -> ContextManager[None] | None:
935943
return None
@@ -945,8 +953,7 @@ def __get_arguments(
945953
args: Iterable[Any],
946954
kwargs: Mapping[str, Any],
947955
) -> dict[str, Any]:
948-
bound = self.signature.bind_partial(*args, **kwargs)
949-
return bound.arguments
956+
return self.signature.bind_partial(*args, **kwargs).arguments
950957

951958
def __merge_arguments(
952959
self,

injection/ext/fastapi.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from collections.abc import Awaitable, Callable
12
from dataclasses import dataclass, field
23
from types import GenericAlias
34
from typing import Annotated, Any, TypeAlias, TypeAliasType
@@ -25,20 +26,23 @@ def __call__[T](
2526
) -> Any:
2627
module = module or self.module
2728
threadsafe = self.threadsafe if threadsafe is None else threadsafe
28-
lazy_instance = module.aget_lazy_instance(cls, default, threadsafe=threadsafe)
29-
30-
async def dependency() -> T:
31-
return await lazy_instance
32-
33-
class_name = getattr(cls, "__name__", str(cls))
34-
dependency.__name__ = f"inject({class_name})"
29+
awaitable = module.aget_lazy_instance(cls, default, threadsafe=threadsafe)
30+
dependency = self.__make_dependency(awaitable)
31+
dependency.__name__ = f"Inject[{getattr(cls, '__name__', str(cls))}]"
3532
return Depends(dependency, use_cache=False)
3633

3734
def __getitem__[T, *Ts](self, params: T | tuple[T, *Ts], /) -> TypeAlias:
3835
iter_params = iter(params if isinstance(params, tuple) else (params,))
3936
cls = next(iter_params)
4037
return Annotated[cls, self(cls), *iter_params]
4138

39+
@staticmethod
40+
def __make_dependency[T](awaitable: Awaitable[T]) -> Callable[[], Awaitable[T]]:
41+
async def dependency() -> T:
42+
return await awaitable
43+
44+
return dependency
45+
4246

4347
Inject = FastAPIInject()
4448
InjectThreadSafe = FastAPIInject(threadsafe=True)

0 commit comments

Comments
 (0)