import os
from . import ConfigSource
[docs]class Environment(ConfigSource):
def __init__(self,
environ=None,
prefix=None,
lower=True,
sectionsep="_",
**kwargs):
"""Loads settings from environment variables. If ``prefix`` is set to
``MYAPP_``, the value of the environment variable ``MYAPP_HOME``
will be available as the configuration setting ``home``.
:param environ: Environment variables, in dict form like
:py:data:`os.environ`. If not provided, uses
the real :py:data:`os.environ`.
:type environ: dict
:param prefix: Since the entire environment is not suitable to use
as a configuration, only variables starting with this
prefix are used.
:type prefix: str
:param lower: If true, lowercase the name of environment
variables (since these typically uses uppercase)
:type lower: True
:param sectionsep: An alternate section separator instead of ``-``.
:type sectionsep: str
"""
super(Environment, self).__init__(**kwargs)
if environ is None:
if kwargs.get("empty"):
environ = {}
else:
environ = os.environ
if prefix is None:
prefix = ""
self.source = environ
self.prefix = prefix
self.sectionsep = sectionsep
# used by both keys and subsections, but in different ways
def _internalkeys(self):
return [x.lower()[len(self.prefix):] for x in self.source.keys() if x.startswith(self.prefix)]
[docs] def keys(self):
for x in self._internalkeys():
if self.sectionsep not in x:
yield x
[docs] def has(self, key):
# reverse the prefix/lowerize stuff
k = self.prefix + key.upper()
return k in self.source
[docs] def get(self, key):
k = self.prefix + key.upper()
return self.source[k]
[docs] def set(self, key, val):
k = self.prefix + key.upper()
self.source[k] = val
[docs] def typed(self, key):
return False
[docs] def subsections(self):
yielded = set()
for x in self._internalkeys():
if self.sectionsep in x:
section = x.split(self.sectionsep)[0]
if section not in yielded:
yield(section)
yielded.add(section)
[docs] def subsection(self, key):
s = key.upper() + self.sectionsep
newenviron = dict([(k.replace(s,"", 1), v) for k, v in self.source.items() if s in k])
return Environment(newenviron,
prefix=self.prefix,
sectionsep=self.sectionsep,
parent=self,
identifier=self.identifier)