mirror of
				https://github.com/ets-labs/python-dependency-injector.git
				synced 2025-11-04 09:57:37 +03:00 
			
		
		
		
	Fix bug with accessing declarative catalog attributes from instance level
This commit is contained in:
		
							parent
							
								
									a29508cb7a
								
							
						
					
					
						commit
						bef0a952b5
					
				| 
						 | 
					@ -44,8 +44,8 @@ class DeclarativeCatalogMetaClass(type):
 | 
				
			||||||
        cls._catalog.name = '.'.join((cls.__module__, cls.__name__))
 | 
					        cls._catalog.name = '.'.join((cls.__module__, cls.__name__))
 | 
				
			||||||
        cls._catalog.bind_providers(dict(providers))
 | 
					        cls._catalog.bind_providers(dict(providers))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        cls.cls_providers = dict(cls_providers)
 | 
					        cls._cls_providers = dict(cls_providers)
 | 
				
			||||||
        cls.inherited_providers = dict(inherited_providers)
 | 
					        cls._inherited_providers = dict(inherited_providers)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        cls.Bundle = cls._catalog.Bundle
 | 
					        cls.Bundle = cls._catalog.Bundle
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -69,6 +69,22 @@ class DeclarativeCatalogMetaClass(type):
 | 
				
			||||||
        """
 | 
					        """
 | 
				
			||||||
        return cls._catalog.providers
 | 
					        return cls._catalog.providers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def cls_providers(cls):
 | 
				
			||||||
 | 
					        """Read-only dictionary of current catalog providers.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        :rtype: dict[str, :py:class:`dependency_injector.providers.Provider`]
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        return cls._cls_providers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def inherited_providers(cls):
 | 
				
			||||||
 | 
					        """Read-only dictionary of inherited providers.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        :rtype: dict[str, :py:class:`dependency_injector.providers.Provider`]
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        return cls._inherited_providers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def overridden_by(cls):
 | 
					    def overridden_by(cls):
 | 
				
			||||||
        """Tuple of overriding catalogs.
 | 
					        """Tuple of overriding catalogs.
 | 
				
			||||||
| 
						 | 
					@ -177,52 +193,6 @@ class DeclarativeCatalog(object):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        :type: :py:class:`CatalogBundle`
 | 
					        :type: :py:class:`CatalogBundle`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    .. py:attribute:: name
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Read-only property that represents catalog's name.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Catalog's name is catalog's module + catalog's class name.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        :type: str
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .. py:attribute:: cls_providers
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Read-only dictionary of current catalog providers.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        :type: dict[str, :py:class:`dependency_injector.providers.Provider`]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .. py:attribute:: inherited_providers
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Read-only dictionary of inherited providers.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        :type: dict[str, :py:class:`dependency_injector.providers.Provider`]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .. py:attribute:: providers
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Read-only dictionary of all providers.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        :type: dict[str, :py:class:`dependency_injector.providers.Provider`]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .. py:attribute:: overridden_by
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Tuple of overriding catalogs.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        :type: tuple[:py:class:`DeclarativeCatalog` |
 | 
					 | 
				
			||||||
                    :py:class:`DynamicCatalog`]
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .. py:attribute:: is_overridden
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Read-only property that is set to ``True`` if catalog is overridden.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        :type: bool
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .. py:attribute:: is_overridden
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        Read-only reference to the last overriding catalog, if any.
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        :type: :py:class:`DeclarativeCatalog` | :py:class:`DynamicCatalog` |
 | 
					 | 
				
			||||||
               None
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    .. py:attribute:: provider_type
 | 
					    .. py:attribute:: provider_type
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        If provider type is defined, :py:class:`DeclarativeCatalog` checks that
 | 
					        If provider type is defined, :py:class:`DeclarativeCatalog` checks that
 | 
				
			||||||
| 
						 | 
					@ -234,22 +204,75 @@ class DeclarativeCatalog(object):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Bundle = CatalogBundle
 | 
					    Bundle = CatalogBundle
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    name = str()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    cls_providers = dict()
 | 
					 | 
				
			||||||
    inherited_providers = dict()
 | 
					 | 
				
			||||||
    providers = dict()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    overridden_by = tuple()
 | 
					 | 
				
			||||||
    is_overridden = bool
 | 
					 | 
				
			||||||
    last_overriding = None
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    provider_type = None
 | 
					    provider_type = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    _catalog = DynamicCatalog
 | 
					    _catalog = DynamicCatalog
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    _cls_providers = dict()
 | 
				
			||||||
 | 
					    _inherited_providers = dict()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    __IS_CATALOG__ = True
 | 
					    __IS_CATALOG__ = True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def name(self):
 | 
				
			||||||
 | 
					        """Read-only property that represents catalog's name.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Catalog's name is catalog's module + catalog's class name.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        :rtype: str
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        return self.__class__.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def providers(self):
 | 
				
			||||||
 | 
					        """Read-only dictionary of all providers.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        :rtype: dict[str, :py:class:`dependency_injector.providers.Provider`]
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        return self.__class__.providers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def cls_providers(self):
 | 
				
			||||||
 | 
					        """Read-only dictionary of current catalog providers.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        :rtype: dict[str, :py:class:`dependency_injector.providers.Provider`]
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        return self.__class__.cls_providers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def inherited_providers(self):
 | 
				
			||||||
 | 
					        """Read-only dictionary of inherited providers.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        :rtype: dict[str, :py:class:`dependency_injector.providers.Provider`]
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        return self.__class__.inherited_providers
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def overridden_by(self):
 | 
				
			||||||
 | 
					        """Tuple of overriding catalogs.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        :rtype: tuple[:py:class:`DeclarativeCatalog` |
 | 
				
			||||||
 | 
					                      :py:class:`DynamicCatalog`]
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        return self.__class__.overridden_by
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def is_overridden(self):
 | 
				
			||||||
 | 
					        """Read-only property that is set to ``True`` if catalog is overridden.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        :rtype: bool
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        return self.__class__.is_overridden
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @property
 | 
				
			||||||
 | 
					    def last_overriding(self):
 | 
				
			||||||
 | 
					        """Read-only reference to the last overriding catalog, if any.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        :rtype: :py:class:`DeclarativeCatalog` | :py:class:`DynamicCatalog` |
 | 
				
			||||||
 | 
					               None
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        return self.__class__.last_overriding
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def is_bundle_owner(cls, bundle):
 | 
					    def is_bundle_owner(cls, bundle):
 | 
				
			||||||
        """Check if catalog is bundle owner.
 | 
					        """Check if catalog is bundle owner.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,6 +16,7 @@ Development version
 | 
				
			||||||
- Add ``add_injections()`` method to ``Callable``, ``DelegatedCallable``, 
 | 
					- Add ``add_injections()`` method to ``Callable``, ``DelegatedCallable``, 
 | 
				
			||||||
  ``Factory``, ``DelegatedFactory``, ``Singleton`` and ``DelegatedSingleton`` 
 | 
					  ``Factory``, ``DelegatedFactory``, ``Singleton`` and ``DelegatedSingleton`` 
 | 
				
			||||||
  providers.
 | 
					  providers.
 | 
				
			||||||
 | 
					- Fix bug with accessing to declarative catalog attributes from instance level.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1.16.8
 | 
					1.16.8
 | 
				
			||||||
------
 | 
					------
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -428,3 +428,32 @@ class CopyingTests(unittest.TestCase):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.assertEqual(CatalogA1.p13(), 11)
 | 
					        self.assertEqual(CatalogA1.p13(), 11)
 | 
				
			||||||
        self.assertEqual(CatalogA2.p13(), 22)
 | 
					        self.assertEqual(CatalogA2.p13(), 22)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class InstantiationTests(unittest.TestCase):
 | 
				
			||||||
 | 
					    """Declarative catalogs instantiation tests."""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def setUp(self):
 | 
				
			||||||
 | 
					        """Set test environment up."""
 | 
				
			||||||
 | 
					        self.catalog = CatalogA()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def tearDown(self):
 | 
				
			||||||
 | 
					        """Tear test environment down."""
 | 
				
			||||||
 | 
					        self.catalog = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_access_instance_attributes(self):
 | 
				
			||||||
 | 
					        """Test accessing declarative catalog instance attributes."""
 | 
				
			||||||
 | 
					        self.assertEqual(self.catalog.name,
 | 
				
			||||||
 | 
					                         CatalogA.name)
 | 
				
			||||||
 | 
					        self.assertEqual(self.catalog.providers,
 | 
				
			||||||
 | 
					                         CatalogA.providers)
 | 
				
			||||||
 | 
					        self.assertEqual(self.catalog.cls_providers,
 | 
				
			||||||
 | 
					                         CatalogA.cls_providers)
 | 
				
			||||||
 | 
					        self.assertEqual(self.catalog.inherited_providers,
 | 
				
			||||||
 | 
					                         CatalogA.inherited_providers)
 | 
				
			||||||
 | 
					        self.assertEqual(self.catalog.overridden_by,
 | 
				
			||||||
 | 
					                         CatalogA.overridden_by)
 | 
				
			||||||
 | 
					        self.assertEqual(self.catalog.is_overridden,
 | 
				
			||||||
 | 
					                         CatalogA.is_overridden)
 | 
				
			||||||
 | 
					        self.assertEqual(self.catalog.last_overriding,
 | 
				
			||||||
 | 
					                         CatalogA.last_overriding)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user