Skip to content

Commit 384117d

Browse files
committed
Update declarative container to support custom string types
1 parent 06f9855 commit 384117d

File tree

4 files changed

+48
-33
lines changed

4 files changed

+48
-33
lines changed

src/dependency_injector/containers.c

Lines changed: 17 additions & 28 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/dependency_injector/containers.pyx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -469,14 +469,14 @@ class DeclarativeContainerMetaClass(type):
469469

470470
return cls
471471

472-
def __setattr__(cls, str name, object value):
472+
def __setattr__(cls, name, value):
473473
"""Set class attribute.
474474
475475
If value of attribute is provider, it will be added into providers
476476
dictionary.
477477
478478
:param name: Attribute's name
479-
:type name: str
479+
:type name: object
480480
481481
:param value: Attribute's value
482482
:type value: object
@@ -493,14 +493,14 @@ class DeclarativeContainerMetaClass(type):
493493
cls.cls_providers[name] = value
494494
super(DeclarativeContainerMetaClass, cls).__setattr__(name, value)
495495

496-
def __delattr__(cls, str name):
496+
def __delattr__(cls, name):
497497
"""Delete class attribute.
498498
499499
If value of attribute is provider, it will be deleted from providers
500500
dictionary.
501501
502502
:param name: Attribute's name
503-
:type name: str
503+
:type name: object
504504
505505
:rtype: None
506506
"""

tests/unit/containers/test_declarative_py2_py3.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,3 +496,30 @@ class Container(containers.DeclarativeContainer):
496496
str(context.exception),
497497
'Dependency "Container.child_container.dependency" is not defined',
498498
)
499+
500+
501+
class DeclarativeContainerWithCustomStringTests(unittest.TestCase):
502+
# See: https://github.com/ets-labs/python-dependency-injector/issues/479
503+
504+
class CustomString(str):
505+
pass
506+
507+
class CustomClass:
508+
thing = None
509+
510+
class CustomContainer(containers.DeclarativeContainer):
511+
pass
512+
513+
def setUp(self):
514+
self.container = self.CustomContainer
515+
self.provider = providers.Provider()
516+
517+
def test_setattr(self):
518+
setattr(self.container, self.CustomString('test_attr'), self.provider)
519+
self.assertIs(self.container.test_attr, self.provider)
520+
521+
def test_delattr(self):
522+
setattr(self.container, self.CustomString('test_attr'), self.provider)
523+
delattr(self.container, self.CustomString('test_attr'))
524+
with self.assertRaises(AttributeError):
525+
self.container.test_attr

tests/unit/containers/test_dynamic_py2_py3.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,6 @@ class CustomClass:
698698
thing = None
699699

700700
def setUp(self):
701-
self.object = self.CustomClass()
702701
self.container = containers.DynamicContainer()
703702
self.provider = providers.Provider()
704703

0 commit comments

Comments
 (0)