mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2025-02-18 04:20:46 +03:00
Restrict overriding of catalogs by themselves
This commit is contained in:
parent
ab3e901d7e
commit
449dff6282
|
@ -7,6 +7,7 @@ from .errors import UndefinedProviderError
|
||||||
|
|
||||||
from .utils import is_provider
|
from .utils import is_provider
|
||||||
from .utils import is_catalog
|
from .utils import is_catalog
|
||||||
|
from .utils import is_declarative_catalog
|
||||||
from .utils import ensure_is_provider
|
from .utils import ensure_is_provider
|
||||||
from .utils import ensure_is_catalog_bundle
|
from .utils import ensure_is_catalog_bundle
|
||||||
|
|
||||||
|
@ -254,8 +255,14 @@ class DynamicCatalog(object):
|
||||||
:type overriding: :py:class:`DeclarativeCatalog` |
|
:type overriding: :py:class:`DeclarativeCatalog` |
|
||||||
:py:class:`DynamicCatalog`
|
:py:class:`DynamicCatalog`
|
||||||
|
|
||||||
|
:raise: :py:exc:`dependency_injector.errors.Error` if trying to
|
||||||
|
override catalog by itself
|
||||||
|
|
||||||
:rtype: None
|
:rtype: None
|
||||||
"""
|
"""
|
||||||
|
if overriding is self:
|
||||||
|
raise Error('Catalog {0} could not be overridden '
|
||||||
|
'with itself'.format(self))
|
||||||
self.overridden_by += (overriding,)
|
self.overridden_by += (overriding,)
|
||||||
for name, provider in six.iteritems(overriding.providers):
|
for name, provider in six.iteritems(overriding.providers):
|
||||||
self.get_provider(name).override(provider)
|
self.get_provider(name).override(provider)
|
||||||
|
@ -673,8 +680,14 @@ class DeclarativeCatalog(object):
|
||||||
:type overriding: :py:class:`DeclarativeCatalog` |
|
:type overriding: :py:class:`DeclarativeCatalog` |
|
||||||
:py:class:`DynamicCatalog`
|
:py:class:`DynamicCatalog`
|
||||||
|
|
||||||
|
:raise: :py:exc:`dependency_injector.errors.Error` if trying to
|
||||||
|
override catalog by itself or its subclasses
|
||||||
|
|
||||||
:rtype: None
|
:rtype: None
|
||||||
"""
|
"""
|
||||||
|
if is_declarative_catalog(overriding) and issubclass(cls, overriding):
|
||||||
|
raise Error('Catalog {0} could not be overridden '
|
||||||
|
'with itself or its subclasses'.format(cls))
|
||||||
return cls._catalog.override(overriding)
|
return cls._catalog.override(overriding)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
|
@ -474,6 +474,23 @@ class OverrideTests(unittest.TestCase):
|
||||||
self.assertEqual(CatalogA.p12(), 2)
|
self.assertEqual(CatalogA.p12(), 2)
|
||||||
self.assertEqual(len(CatalogA.overridden_by), 1)
|
self.assertEqual(len(CatalogA.overridden_by), 1)
|
||||||
|
|
||||||
|
def test_override_declarative_catalog_with_itself(self):
|
||||||
|
"""Test catalog overriding of declarative catalog with itself."""
|
||||||
|
with self.assertRaises(errors.Error):
|
||||||
|
CatalogA.override(CatalogA)
|
||||||
|
|
||||||
|
def test_override_declarative_catalog_with_subclass(self):
|
||||||
|
"""Test catalog overriding of declarative catalog with subclass."""
|
||||||
|
with self.assertRaises(errors.Error):
|
||||||
|
CatalogB.override(CatalogA)
|
||||||
|
|
||||||
|
def test_override_dynamic_catalog_with_itself(self):
|
||||||
|
"""Test catalog overriding of dynamic catalog with itself."""
|
||||||
|
catalog = catalogs.DynamicCatalog(p11=providers.Value(1),
|
||||||
|
p12=providers.Value(2))
|
||||||
|
with self.assertRaises(errors.Error):
|
||||||
|
catalog.override(catalog)
|
||||||
|
|
||||||
def test_overriding_with_dynamic_catalog(self):
|
def test_overriding_with_dynamic_catalog(self):
|
||||||
"""Test catalog overriding with another dynamic catalog."""
|
"""Test catalog overriding with another dynamic catalog."""
|
||||||
CatalogA.override(catalogs.DynamicCatalog(p11=providers.Value(1),
|
CatalogA.override(catalogs.DynamicCatalog(p11=providers.Value(1),
|
||||||
|
|
Loading…
Reference in New Issue
Block a user