Refactor dependency_injector.providers package internals

This commit is contained in:
Roman Mogilatov 2016-04-08 18:50:40 +03:00
parent f595b7f670
commit 3a7b9c1e98
6 changed files with 71 additions and 75 deletions

View File

@ -6,8 +6,6 @@ from dependency_injector.providers.base import (
Static, Static,
StaticProvider, StaticProvider,
ExternalDependency, ExternalDependency,
OverridingContext,
override,
) )
from dependency_injector.providers.callable import ( from dependency_injector.providers.callable import (
Callable, Callable,
@ -29,6 +27,10 @@ from dependency_injector.providers.config import (
Config, Config,
ChildConfig, ChildConfig,
) )
from dependency_injector.providers.utils import (
OverridingContext,
override,
)
__all__ = ( __all__ = (

View File

@ -2,8 +2,8 @@
import six import six
from dependency_injector.providers.utils import OverridingContext
from dependency_injector.errors import Error from dependency_injector.errors import Error
from dependency_injector.utils import ( from dependency_injector.utils import (
is_provider, is_provider,
ensure_is_provider, ensure_is_provider,
@ -356,67 +356,3 @@ class ExternalDependency(Provider):
return represent_provider(provider=self, provides=self.instance_of) return represent_provider(provider=self, provides=self.instance_of)
__repr__ = __str__ __repr__ = __str__
class OverridingContext(object):
"""Provider overriding context.
:py:class:`OverridingContext` is used by :py:meth:`Provider.override` for
implemeting ``with`` contexts. When :py:class:`OverridingContext` is
closed, overriding that was created in this context is dropped also.
.. code-block:: python
with provider.override(another_provider):
assert provider.is_overridden
assert not provider.is_overridden
"""
def __init__(self, overridden, overriding):
"""Initializer.
:param overridden: Overridden provider.
:type overridden: :py:class:`Provider`
:param overriding: Overriding provider.
:type overriding: :py:class:`Provider`
"""
self.overridden = overridden
self.overriding = overriding
def __enter__(self):
"""Do nothing."""
return self.overriding
def __exit__(self, *_):
"""Exit overriding context."""
self.overridden.reset_last_overriding()
def override(overridden):
"""Decorator for overriding providers.
This decorator overrides ``overridden`` provider by decorated one.
.. code-block:: python
@Factory
class SomeClass(object):
pass
@override(SomeClass)
@Factory
class ExtendedSomeClass(SomeClass.cls):
pass
:param overridden: Provider that should be overridden.
:type overridden: :py:class:`Provider`
:return: Overriding provider.
:rtype: :py:class:`Provider`
"""
def decorator(overriding):
overridden.override(overriding)
return overriding
return decorator

View File

@ -3,14 +3,11 @@
import six import six
from dependency_injector.providers.base import Provider from dependency_injector.providers.base import Provider
from dependency_injector.injections import ( from dependency_injector.injections import (
_parse_args_injections, _parse_args_injections,
_parse_kwargs_injections, _parse_kwargs_injections,
) )
from dependency_injector.utils import represent_provider from dependency_injector.utils import represent_provider
from dependency_injector.errors import Error from dependency_injector.errors import Error

View File

@ -3,10 +3,8 @@
import six import six
from dependency_injector.providers.base import Provider from dependency_injector.providers.base import Provider
from dependency_injector.errors import Error
from dependency_injector.utils import represent_provider from dependency_injector.utils import represent_provider
from dependency_injector.errors import Error
@six.python_2_unicode_compatible @six.python_2_unicode_compatible

View File

@ -1,13 +1,11 @@
"""Dependency injector creational providers.""" """Dependency injector creational providers."""
from dependency_injector.providers.callable import Callable from dependency_injector.providers.callable import Callable
from dependency_injector.utils import ( from dependency_injector.utils import (
is_attribute_injection, is_attribute_injection,
is_method_injection, is_method_injection,
GLOBAL_LOCK, GLOBAL_LOCK,
) )
from dependency_injector.errors import Error from dependency_injector.errors import Error

View File

@ -0,0 +1,65 @@
"""Dependency injector provider utils."""
class OverridingContext(object):
"""Provider overriding context.
:py:class:`OverridingContext` is used by :py:meth:`Provider.override` for
implemeting ``with`` contexts. When :py:class:`OverridingContext` is
closed, overriding that was created in this context is dropped also.
.. code-block:: python
with provider.override(another_provider):
assert provider.is_overridden
assert not provider.is_overridden
"""
def __init__(self, overridden, overriding):
"""Initializer.
:param overridden: Overridden provider.
:type overridden: :py:class:`Provider`
:param overriding: Overriding provider.
:type overriding: :py:class:`Provider`
"""
self.overridden = overridden
self.overriding = overriding
def __enter__(self):
"""Do nothing."""
return self.overriding
def __exit__(self, *_):
"""Exit overriding context."""
self.overridden.reset_last_overriding()
def override(overridden):
"""Decorator for overriding providers.
This decorator overrides ``overridden`` provider by decorated one.
.. code-block:: python
@Factory
class SomeClass(object):
pass
@override(SomeClass)
@Factory
class ExtendedSomeClass(SomeClass.cls):
pass
:param overridden: Provider that should be overridden.
:type overridden: :py:class:`Provider`
:return: Overriding provider.
:rtype: :py:class:`Provider`
"""
def decorator(overriding):
overridden.override(overriding)
return overriding
return decorator