Skip to content

Commit 4d63830

Browse files
committed
Refactor Resource provider state management
1 parent 865c82a commit 4d63830

File tree

7 files changed

+152
-162
lines changed

7 files changed

+152
-162
lines changed

src/dependency_injector/_cwiring.pyx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ from collections.abc import Awaitable
55
from inspect import CO_ITERABLE_COROUTINE
66
from types import CoroutineType, GeneratorType
77

8-
from .providers cimport Provider, Resource
8+
from .providers cimport Provider, BaseResource
99
from .wiring import _Marker
1010

1111

@@ -54,15 +54,15 @@ cdef class DependencyResolver:
5454
cdef Provider provider
5555

5656
for name, provider in self.closings.items():
57-
if _is_injectable(self.kwargs, name) and isinstance(provider, Resource):
57+
if _is_injectable(self.kwargs, name) and isinstance(provider, BaseResource):
5858
provider.shutdown()
5959

6060
cdef list _handle_closings_async(self):
6161
cdef list to_await = []
6262
cdef Provider provider
6363

6464
for name, provider in self.closings.items():
65-
if _is_injectable(self.kwargs, name) and isinstance(provider, Resource):
65+
if _is_injectable(self.kwargs, name) and isinstance(provider, BaseResource):
6666
if _isawaitable(shutdown := provider.shutdown()):
6767
to_await.append(shutdown)
6868

src/dependency_injector/containers.pyi

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ try:
2222
except ImportError:
2323
from typing_extensions import Self as _Self
2424

25-
from .providers import Provider, Resource, Self, ProviderParent
25+
from .providers import Provider, BaseResource, Self, ProviderParent
2626

2727
C_Base = TypeVar("C_Base", bound="Container")
2828
C = TypeVar("C", bound="DeclarativeContainer")
@@ -77,8 +77,8 @@ class Container:
7777
warn_unresolved: bool = False,
7878
) -> None: ...
7979
def unwire(self) -> None: ...
80-
def init_resources(self, resource_type: Type[Resource[Any]] = Resource) -> Optional[Awaitable[None]]: ...
81-
def shutdown_resources(self, resource_type: Type[Resource[Any]] = Resource) -> Optional[Awaitable[None]]: ...
80+
def init_resources(self, resource_type: Type[BaseResource[Any]] = BaseResource) -> Optional[Awaitable[None]]: ...
81+
def shutdown_resources(self, resource_type: Type[BaseResource[Any]] = BaseResource) -> Optional[Awaitable[None]]: ...
8282
def load_config(self) -> None: ...
8383
def apply_container_providers_overridings(self) -> None: ...
8484
def reset_singletons(self) -> SingletonResetContext[C_Base]: ...

src/dependency_injector/containers.pyx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -339,10 +339,10 @@ class DynamicContainer(Container):
339339
self.wired_to_modules.clear()
340340
self.wired_to_packages.clear()
341341

342-
def init_resources(self, resource_type=providers.Resource):
342+
def init_resources(self, resource_type=providers.BaseResource):
343343
"""Initialize all container resources."""
344344

345-
if not issubclass(resource_type, providers.Resource):
345+
if not issubclass(resource_type, providers.BaseResource):
346346
raise TypeError("resource_type must be a subclass of Resource provider")
347347

348348
futures = []
@@ -356,10 +356,10 @@ class DynamicContainer(Container):
356356
if futures:
357357
return asyncio.gather(*futures)
358358

359-
def shutdown_resources(self, resource_type=providers.Resource):
359+
def shutdown_resources(self, resource_type=providers.BaseResource):
360360
"""Shutdown all container resources."""
361361

362-
if not issubclass(resource_type, providers.Resource):
362+
if not issubclass(resource_type, providers.BaseResource):
363363
raise TypeError("resource_type must be a subclass of Resource provider")
364364

365365
def _independent_resources(resources):

src/dependency_injector/providers.pxd

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -224,11 +224,19 @@ cdef class Dict(Provider):
224224
cpdef object _provide(self, tuple args, dict kwargs)
225225

226226

227-
cdef class Resource(Provider):
227+
cdef class ResourceState:
228+
cdef object resource
229+
cdef object shutdowner
230+
cdef bint is_async
231+
cdef bint async_done
232+
233+
cdef void from_coro(self, coro, error_callback)
234+
cdef void from_async_context_manager(self, acm, error_callback)
235+
cdef object from_context_manager(self, cm, error_callback)
236+
237+
238+
cdef class BaseResource(Provider):
228239
cdef object _provides
229-
cdef bint __initialized
230-
cdef object __shutdowner
231-
cdef object __resource
232240

233241
cdef tuple _args
234242
cdef int _args_len
@@ -237,12 +245,16 @@ cdef class Resource(Provider):
237245
cdef int _kwargs_len
238246

239247
cpdef object _provide(self, tuple args, dict kwargs)
248+
cdef void set_state(self, ResourceState state)
249+
cdef ResourceState get_state(self)
250+
251+
252+
cdef class Resource(BaseResource):
253+
cdef ResourceState _state
240254

241255

242-
cdef class ContextLocalResource(Resource):
243-
cdef object _resource_context_var
244-
cdef object _initialized_context_var
245-
cdef object _shutdowner_context_var
256+
cdef class ContextLocalResource(BaseResource):
257+
cdef object _cvar
246258

247259

248260
cdef class Container(Provider):

src/dependency_injector/providers.pyi

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ class Dict(Provider[_Dict]):
449449
) -> _Self: ...
450450
def clear_kwargs(self) -> _Self: ...
451451

452-
class Resource(Provider[T]):
452+
class BaseResource(Provider[T]):
453453
@overload
454454
def __init__(
455455
self,
@@ -524,7 +524,8 @@ class Resource(Provider[T]):
524524
def init(self) -> Optional[Awaitable[T]]: ...
525525
def shutdown(self) -> Optional[Awaitable]: ...
526526

527-
class ContextLocalResource(Resource[T]):...
527+
class Resource(BaseResource[T]): ...
528+
class ContextLocalResource(BaseResource[T]):...
528529

529530
class Container(Provider[T]):
530531
def __init__(

0 commit comments

Comments
 (0)