Skip to content

Commit

Permalink
config interface with env config
Browse files Browse the repository at this point in the history
  • Loading branch information
p1c2u committed Sep 15, 2018
1 parent 3fbe41d commit caa6dc0
Show file tree
Hide file tree
Showing 13 changed files with 209 additions and 57 deletions.
18 changes: 18 additions & 0 deletions kore/components/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import logging

log = logging.getLogger(__name__)


class BaseComponent(object):

factories = ()
services = ()

def __init__(self, namespace=None):
self.namespace = namespace

def get_factories(self):
return self.factories

def get_services(self):
return self.services
20 changes: 3 additions & 17 deletions kore/components/plugins/base.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,4 @@
import logging
# backward compatibility
from kore.components.base import BaseComponent as BasePluginComponent

log = logging.getLogger(__name__)


class BasePluginComponent(object):

factories = ()
services = ()

def __init__(self, namespace=None):
self.namespace = namespace

def get_factories(self):
return self.factories

def get_services(self):
return self.services
__all__ = ['BasePluginComponent', ]
2 changes: 1 addition & 1 deletion kore/components/registrars.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def bind(self, container):
if hasattr(component, 'post_hook'):
warnings.warn(
"post_hook method is deprecated. "
"Use container_prepared signal instead.",
"Use post_register signal instead.",
DeprecationWarning,
)
component.post_hook(container)
27 changes: 27 additions & 0 deletions kore/configs/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
class BaseConfigSection(object):

@property
def __dict__(self, key):
raise NotImplementedError

def __iter__(self):
raise NotImplementedError

def __getitem__(self, key):
raise NotImplementedError

def keys(self):
raise NotImplementedError

def get(self, key, default=None):
try:
return self[key]
except KeyError:
return default

def get_section(self, name):
raise NotImplementedError


class BaseConfig(BaseConfigSection):
pass
9 changes: 9 additions & 0 deletions kore/configs/dict.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from collections import defaultdict

from kore.configs.base import BaseConfig


class DictConfig(defaultdict, BaseConfig):

def __missing__(self, key):
return defaultdict()
71 changes: 71 additions & 0 deletions kore/configs/env.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import os

from six import iteritems
from kore.configs.base import BaseConfigSection, BaseConfig


class BaseEnv(object):

prefix = NotImplemented

def __iter__(self):
for key in self._iter_envvars():
yield key.replace(self.prefix, "").lower()

def __getitem__(self, key):
envvar = self._get_envvar(key)
return os.environ[envvar]

@property
def __dict__(self):
data = {}
for key in self._iter_envvars():
subkey = key.replace(self.prefix, "").lower()
data[subkey] = os.environ[key]
return data

def get(self, key, default=None):
envvar = self._get_envvar(key)
try:
return os.environ[envvar]
except KeyError:
return default

def keys(self):
return list(self)

def _get_envvar(self, key):
return ''.join([self.prefix, key]).upper()

def _iter_envvars(self):
for key, value in iteritems(os.environ):
if key.startswith(self.prefix):
yield key


class EnvSection(BaseEnv, BaseConfigSection):

separator = '_'

def __init__(self, name):
self.name = name

@property
def prefix(self):
return ''.join([self.name, self.separator])

def get_section(self, name):
envvar = self._get_envvar(name)
return EnvSection(envvar)


class EnvConfig(BaseEnv, BaseConfig):

def __init__(self, *args, **kwargs):
prefix = kwargs.get('env_prefix', '')

self.prefix = prefix

def get_section(self, name):
envvar = self._get_envvar(name)
return EnvSection(envvar)
10 changes: 0 additions & 10 deletions kore/configs/models.py

This file was deleted.

19 changes: 3 additions & 16 deletions kore/configs/plugins/base.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,4 @@
import logging
# backeward compativility
from kore.configs.base import BaseConfig as BasePluginConfig

from kore.configs.models import BaseConfig

log = logging.getLogger(__name__)


class BasePluginConfig(BaseConfig):

def __getitem__(self, key):
raise NotImplementedError

def get(self, key, default=None):
try:
return self[key]
except KeyError:
return default
__all__ = ['BasePluginConfig', ]
9 changes: 0 additions & 9 deletions kore/configs/plugins/dict.py

This file was deleted.

3 changes: 2 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ def run_tests(self):

entry_points = """\
[kore.configs]
dict = kore.configs.plugins.dict:DictConfig
dict = kore.configs.dict:DictConfig
env = kore.configs.env:EnvConfig
"""


Expand Down
4 changes: 2 additions & 2 deletions tests/integration/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

from kore.components.factories import ComponentFactory
from kore.components.plugins.base import BasePluginComponent
from kore.configs.models import BaseConfig
from kore.configs.plugins.dict import DictConfig
from kore.configs.base import BaseConfig
from kore.configs.dict import DictConfig
from kore.containers.factories import ContainerFactory
from kore.plugins.models import Plugin
from kore.plugins.providers import PluginsProvider
Expand Down
72 changes: 72 additions & 0 deletions tests/integration/test_env_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
from kore import config_factory

from kore.configs.env import EnvSection


class TestEnvConfig(object):

def test_get_section(self):
config_type = 'env'
config_opt = {
'bar': 'baz',
}

config = config_factory.create(config_type, **config_opt)

result = config.get_section('UNDEFINED')

assert result.__class__ is EnvSection

def test_get_section_default_value(self):
config_type = 'env'
config_opt = {
'bar': 'baz',
}

config = config_factory.create(config_type, **config_opt)

section = config.get_section('UNDEFINED')

result = section.get('UNDEFINED', 'undefined')

assert result == 'undefined'

def test_section_option(self, monkeypatch):
monkeypatch.setenv('TESTING_KEY', 'value')
config_type = 'env'
config_opt = {
'bar': 'baz',
}
config = config_factory.create(config_type, **config_opt)
section = config.get_section('TESTING')

result = section['key']

assert result == 'value'

def test_section_option_upper(self, monkeypatch):
monkeypatch.setenv('TESTING_KEY', 'value')
config_type = 'env'
config_opt = {
'bar': 'baz',
}
config = config_factory.create(config_type, **config_opt)
section = config.get_section('TESTING')

result = dict(section)

assert result == {
'key': 'value',
}

def test_get_value(self, monkeypatch):
monkeypatch.setenv('TESTING_KEY', 'value')
config_type = 'env'
config_opt = {
'bar': 'baz',
}
config = config_factory.create(config_type, **config_opt)

result = config.get('key2', 'undefined')

assert result == 'undefined'
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import mock
import pytest

from kore.configs.models import BaseConfig
from kore.configs.base import BaseConfig


class TestBaseConfigGet(object):
Expand Down

0 comments on commit caa6dc0

Please sign in to comment.