Skip to content
Open
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
27 changes: 18 additions & 9 deletions decouple.py
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand All @@ -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
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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:
Expand All @@ -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 = {}

Expand All @@ -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):
Expand All @@ -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):
Expand Down Expand Up @@ -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))

Expand All @@ -254,6 +262,7 @@ def __call__(self, *args, **kwargs):

# Helpers


class Csv(object):
"""
Produces a csv parser that return a list of transformed elements.
Expand All @@ -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
Expand Down Expand Up @@ -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
Loading