From 04dfb8d7c351832d4e0312c6c22546f61d3664da Mon Sep 17 00:00:00 2001 From: sebPhilippot Date: Sat, 23 Aug 2025 20:54:45 +0200 Subject: [PATCH] Fix Repository __getitem__ consistency with __contains__ --- decouple.py | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/decouple.py b/decouple.py index 9873fc9..9a69c9f 100644 --- a/decouple.py +++ b/decouple.py @@ -18,9 +18,9 @@ text_type = unicode if PYVERSION >= (3, 2, 0): - read_config = lambda parser, file: parser.read_file(file) + def read_config(parser, file): return parser.read_file(file) else: - read_config = lambda parser, file: parser.readfp(file) + def read_config(parser, file): return parser.readfp(file) DEFAULT_ENCODING = 'UTF-8' @@ -30,6 +30,7 @@ TRUE_VALUES = {"y", "yes", "t", "true", "on", "1"} FALSE_VALUES = {"n", "no", "f", "false", "off", "0"} + def strtobool(value): if isinstance(value, bool): return value @@ -89,7 +90,8 @@ def get(self, option, default=undefined, cast=undefined): value = self.repository[option] else: if isinstance(default, Undefined): - raise UndefinedValueError('{} not found. Declare it as envvar or define a default value.'.format(option)) + raise UndefinedValueError( + '{} not found. Declare it as envvar or define a default value.'.format(option)) value = default @@ -134,6 +136,10 @@ def __contains__(self, key): self.parser.has_option(self.SECTION, key)) def __getitem__(self, key): + + if key in os.environ: + return os.environ[key] + try: return self.parser.get(self.SECTION, key) except NoOptionError: @@ -144,6 +150,7 @@ class RepositoryEnv(RepositoryEmpty): """ Retrieves option keys from .env files with fall back to os.environ. """ + def __init__(self, source, encoding=DEFAULT_ENCODING): self.data = {} @@ -163,7 +170,7 @@ def __contains__(self, key): return key in os.environ or key in self.data def __getitem__(self, key): - return self.data[key] + return os.environ[key] or self.data[key] class RepositorySecret(RepositoryEmpty): @@ -185,7 +192,7 @@ def __contains__(self, key): return key in os.environ or key in self.data def __getitem__(self, key): - return self.data[key] + return os.environ[key] or self.data[key] class AutoConfig(object): @@ -231,7 +238,8 @@ def _load(self, path): filename = self._find_file(os.path.abspath(path)) except Exception: filename = '' - Repository = self.SUPPORTED.get(os.path.basename(filename), RepositoryEmpty) + Repository = self.SUPPORTED.get( + os.path.basename(filename), RepositoryEmpty) self.config = Config(Repository(filename, encoding=self.encoding)) @@ -254,6 +262,7 @@ def __call__(self, *args, **kwargs): # Helpers + class Csv(object): """ Produces a csv parser that return a list of transformed elements. @@ -277,7 +286,7 @@ def __call__(self, value): if value is None: return self.post_process() - transform = lambda s: self.cast(s.strip(self.strip)) + def transform(s): return self.cast(s.strip(self.strip)) splitter = shlex(value, posix=True) splitter.whitespace = self.delimiter @@ -310,7 +319,7 @@ def __call__(self, value): transform = self.cast(value) if transform not in self._valid_values: raise ValueError(( - 'Value not in list: {!r}; valid values are {!r}' - ).format(value, self._valid_values)) + 'Value not in list: {!r}; valid values are {!r}' + ).format(value, self._valid_values)) else: return transform