Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/dependency_injector/providers.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ cdef class ConfigurationOption(Provider):
cdef Configuration _root
cdef dict _children
cdef bint _required
cdef object _required_option
cdef object _cache


Expand Down
11 changes: 10 additions & 1 deletion src/dependency_injector/providers.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -1522,6 +1522,7 @@ cdef class ConfigurationOption(Provider):
self._root = root
self._children = {}
self._required = required
self._required_option = None
self._cache = UNDEFINED
super().__init__()

Expand All @@ -1537,6 +1538,7 @@ cdef class ConfigurationOption(Provider):
copied._root = deepcopy(self._root, memo)
copied._children = deepcopy(self._children, memo)
copied._required = self._required
copied._required_option = deepcopy(self._required_option, memo)
self._copy_overridings(copied, memo)
return copied

Expand Down Expand Up @@ -1604,7 +1606,11 @@ cdef class ConfigurationOption(Provider):
return TypedConfigurationOption(callback, self, *args, **kwargs)

def required(self):
return self.__class__(self._name, self._root, required=True)
if self._required:
return self
if self._required_option is None:
self._required_option = self.__class__(self._name, self._root, required=True)
return self._required_option

def is_required(self):
return self._required
Expand All @@ -1626,6 +1632,9 @@ cdef class ConfigurationOption(Provider):
for provider in self._children.values():
provider.reset_cache()

if self._required_option is not None:
self._required_option.reset_cache()

for provider in self.overrides:
if isinstance(provider, (Configuration, ConfigurationOption)):
provider.reset_cache()
Expand Down
18 changes: 18 additions & 0 deletions tests/unit/providers/configuration/test_config_py2_py3.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,24 @@ def test_required(config):
provider()


def test_required_cache_is_reset_after_option_override():
class Container(containers.DeclarativeContainer):
config = providers.Configuration()
singleton = providers.Singleton(dict, value=config.a.required())

container = Container()
container.config.a.from_value("initial")

assert container.singleton() == {"value": "initial"}

with container.config.a.override("overridden"):
container.singleton.reset()
assert container.singleton() == {"value": "overridden"}

container.singleton.reset()
assert container.singleton() == {"value": "initial"}


def test_required_defined_none(config):
provider = providers.Callable(
lambda value: value,
Expand Down