Move "provided" attribute (#306)

* Update typing stub

* Move attribute

* Add typing test

* Update docs

* Add test

* Update changelog
This commit is contained in:
Roman Mogylatov 2020-10-19 17:21:38 -04:00 committed by GitHub
parent 452a13c9f7
commit ff4d24706e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 3473 additions and 3939 deletions

View File

@ -9,6 +9,7 @@ follows `Semantic versioning`_
Develop Develop
------- -------
- Move ``.provided`` attribute to ``providers.Provider``.
- Update all links in documentation and examples to use ``https://`` instead of ``http``. - Update all links in documentation and examples to use ``https://`` instead of ``http``.
4.0.4 4.0.4

View File

@ -35,24 +35,4 @@ You can do nested constructions:
:emphasize-lines: 26-32 :emphasize-lines: 26-32
:lines: 3- :lines: 3-
The ``.provided`` attribute is available for the next providers:
- :py:class:`Factory` and its subclasses
- :py:class:`Singleton` and its subclasses
- :py:class:`Callable` and its subclasses
- :py:class:`Object`
- :py:class:`List`
- :py:class:`Selector`
- :py:class:`Dependency`
When you create a new provider subclass and want to implement the ``.provided`` attribute, you
should use the :py:class:`ProvidedInstance` provider. Add the ``.provided`` property
implementation to a new subclass:
.. code-block:: python
@property
def provided(self):
return ProvidedInstance(self)
.. disqus:: .. disqus::

File diff suppressed because it is too large Load Diff

View File

@ -42,14 +42,14 @@ class Provider(Generic[T]):
def delegate(self) -> Provider: ... def delegate(self) -> Provider: ...
@property @property
def provider(self) -> Provider: ... def provider(self) -> Provider: ...
@property
def provided(self) -> ProvidedInstance: ...
def _copy_overridings(self, copied: Provider, memo: Optional[Dict[Any, Any]]) -> None: ... def _copy_overridings(self, copied: Provider, memo: Optional[Dict[Any, Any]]) -> None: ...
class Object(Provider, Generic[T]): class Object(Provider, Generic[T]):
def __init__(self, provides: T) -> None: ... def __init__(self, provides: T) -> None: ...
def __call__(self, *args: Injection, **kwargs: Injection) -> T: ... def __call__(self, *args: Injection, **kwargs: Injection) -> T: ...
@property
def provided(self) -> ProvidedInstance: ...
class Delegate(Provider): class Delegate(Provider):
@ -63,8 +63,6 @@ class Dependency(Provider, Generic[T]):
def __init__(self, instance_of: Type[T] = object) -> None: ... def __init__(self, instance_of: Type[T] = object) -> None: ...
def __call__(self, *args: Injection, **kwargs: Injection) -> T: ... def __call__(self, *args: Injection, **kwargs: Injection) -> T: ...
@property @property
def provided(self) -> ProvidedInstance: ...
@property
def instance_of(self) -> Type[T]: ... def instance_of(self) -> Type[T]: ...
def provided_by(self, provider: Provider) -> OverridingContext: ... def provided_by(self, provider: Provider) -> OverridingContext: ...
@ -85,8 +83,6 @@ class Callable(Provider, Generic[T]):
@property @property
def provides(self) -> T: ... def provides(self) -> T: ...
@property @property
def provided(self) -> ProvidedInstance: ...
@property
def args(self) -> Tuple[Injection]: ... def args(self) -> Tuple[Injection]: ...
def add_args(self, *args: Injection) -> Callable[T]: ... def add_args(self, *args: Injection) -> Callable[T]: ...
def set_args(self, *args: Injection) -> Callable[T]: ... def set_args(self, *args: Injection) -> Callable[T]: ...
@ -173,8 +169,6 @@ class Factory(Provider, Generic[T]):
@property @property
def provides(self) -> T: ... def provides(self) -> T: ...
@property @property
def provided(self) -> ProvidedInstance: ...
@property
def args(self) -> Tuple[Injection]: ... def args(self) -> Tuple[Injection]: ...
def add_args(self, *args: Injection) -> Factory[T]: ... def add_args(self, *args: Injection) -> Factory[T]: ...
def set_args(self, *args: Injection) -> Factory[T]: ... def set_args(self, *args: Injection) -> Factory[T]: ...
@ -217,8 +211,6 @@ class BaseSingleton(Provider, Generic[T]):
@property @property
def cls(self) -> T: ... def cls(self) -> T: ...
@property @property
def provided(self) -> ProvidedInstance: ...
@property
def args(self) -> Tuple[Injection]: ... def args(self) -> Tuple[Injection]: ...
def add_args(self, *args: Injection) -> Factory[T]: ... def add_args(self, *args: Injection) -> Factory[T]: ...
def set_args(self, *args: Injection) -> Factory[T]: ... def set_args(self, *args: Injection) -> Factory[T]: ...
@ -266,8 +258,6 @@ class List(Provider):
def __init__(self, *args: Injection): ... def __init__(self, *args: Injection): ...
def __call__(self, *args: Injection, **kwargs: Injection) -> _List[Any]: ... def __call__(self, *args: Injection, **kwargs: Injection) -> _List[Any]: ...
@property @property
def provided(self) -> ProvidedInstance: ...
@property
def args(self) -> Tuple[Injection]: ... def args(self) -> Tuple[Injection]: ...
def add_args(self, *args: Injection) -> List: ... def add_args(self, *args: Injection) -> List: ...
def set_args(self, *args: Injection) -> List: ... def set_args(self, *args: Injection) -> List: ...
@ -288,8 +278,6 @@ class Selector(Provider):
def __call__(self, *args: Injection, **kwargs: Injection) -> Any: ... def __call__(self, *args: Injection, **kwargs: Injection) -> Any: ...
def __getattr__(self, name: str) -> Provider: ... def __getattr__(self, name: str) -> Provider: ...
@property @property
def provided(self) -> ProvidedInstance: ...
@property
def providers(self) -> Dict[str, Provider]: ... def providers(self) -> Dict[str, Provider]: ...

View File

@ -273,6 +273,11 @@ cdef class Provider(object):
""" """
return Delegate(self) return Delegate(self)
@property
def provided(self):
"""Return :py:class:`ProvidedInstance` provider."""
return ProvidedInstance(self)
cpdef object _provide(self, tuple args, dict kwargs): cpdef object _provide(self, tuple args, dict kwargs):
"""Providing strategy implementation. """Providing strategy implementation.
@ -333,11 +338,6 @@ cdef class Object(Provider):
""" """
return self.__str__() return self.__str__()
@property
def provided(self):
"""Return :py:class:`ProvidedInstance` provider."""
return ProvidedInstance(self)
cpdef object _provide(self, tuple args, dict kwargs): cpdef object _provide(self, tuple args, dict kwargs):
"""Return provided instance. """Return provided instance.
@ -498,11 +498,6 @@ cdef class Dependency(Provider):
""" """
return self.__str__() return self.__str__()
@property
def provided(self):
"""Return :py:class:`ProvidedInstance` provider."""
return ProvidedInstance(self)
@property @property
def instance_of(self): def instance_of(self):
"""Return class of required dependency.""" """Return class of required dependency."""
@ -793,11 +788,6 @@ cdef class Callable(Provider):
"""Return wrapped callable.""" """Return wrapped callable."""
return self.__provides return self.__provides
@property
def provided(self):
"""Return :py:class:`ProvidedInstance` provider."""
return ProvidedInstance(self)
@property @property
def args(self): def args(self):
"""Return positional argument injections.""" """Return positional argument injections."""
@ -1651,11 +1641,6 @@ cdef class Factory(Provider):
"""Return provided type.""" """Return provided type."""
return self.__instantiator.provides return self.__instantiator.provides
@property
def provided(self):
"""Return :py:class:`ProvidedInstance` provider."""
return ProvidedInstance(self)
@property @property
def args(self): def args(self):
"""Return positional argument injections.""" """Return positional argument injections."""
@ -1989,11 +1974,6 @@ cdef class BaseSingleton(Provider):
"""Return provided type.""" """Return provided type."""
return self.__instantiator.cls return self.__instantiator.cls
@property
def provided(self):
"""Return :py:class:`ProvidedInstance` provider."""
return ProvidedInstance(self)
@property @property
def args(self): def args(self):
"""Return positional argument injections.""" """Return positional argument injections."""
@ -2422,11 +2402,6 @@ cdef class List(Provider):
""" """
return represent_provider(provider=self, provides=list(self.args)) return represent_provider(provider=self, provides=list(self.args))
@property
def provided(self):
"""Return :py:class:`ProvidedInstance` provider."""
return ProvidedInstance(self)
@property @property
def args(self): def args(self):
"""Return positional argument injections.""" """Return positional argument injections."""
@ -2608,11 +2583,6 @@ cdef class Selector(Provider):
address=hex(id(self)), address=hex(id(self)),
) )
@property
def provided(self):
"""Return :py:class:`ProvidedInstance` provider."""
return ProvidedInstance(self)
@property @property
def providers(self): def providers(self):
"""Return providers.""" """Return providers."""

6
tests/typing/provider.py Normal file
View File

@ -0,0 +1,6 @@
from dependency_injector import providers
# Test 1: to check .provided attribute
provider1: providers.Provider[int] = providers.Object(1)
provided: providers.ProvidedInstance = provider1.provided

View File

@ -137,3 +137,10 @@ class ProvidedInstancePuzzleTests(unittest.TestCase):
'foo-bar', 'foo-bar',
], ],
) )
class ProvidedInstanceInBaseClassTests(unittest.TestCase):
def test_provided_attribute(self):
provider = providers.Provider()
assert isinstance(provider.provided, providers.ProvidedInstance)