Skip to content

Commit

Permalink
Fixing env var issues in configs
Browse files Browse the repository at this point in the history
  • Loading branch information
zpriddy committed Apr 17, 2020
1 parent 15414b8 commit ba3ba97
Show file tree
Hide file tree
Showing 8 changed files with 61 additions and 38 deletions.
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[metadata]
name = glados
version = 0.0.1-dev19
version = 0.0.1-dev20
description = A library to help with slackbot development
long_description = file: README.md
long_description_content_type = text/markdown
Expand Down
6 changes: 4 additions & 2 deletions src/glados/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,13 @@ def set_logging(level: str = None, format: str = None):
GladosError,
)

from .configs import GladosConfig
from .utils import read_config, check_for_env_vars

from .bot import GladosBot, BotImporter
from .router import GladosRouter, GladosRoute
from .plugin import GladosPlugin, PluginImporter

from .configs import GladosConfig
from .utils import read_config

from .core import Glados

Expand All @@ -75,4 +76,5 @@ def set_logging(level: str = None, format: str = None):
"read_config",
"logging",
"set_logging",
"check_for_env_vars",
]
32 changes: 3 additions & 29 deletions src/glados/bot.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from slack.web.classes.messages import Message
from slack.web.slack_response import SlackResponse

from glados import GladosRequest, get_enc_var, get_var, logging
from glados import GladosRequest, check_for_env_vars, logging


class BotImporter:
Expand Down Expand Up @@ -71,40 +71,14 @@ def __init__(
**kwargs,
):
# Get the values from the env vars if used.
token = self.check_for_env_vars(token)
signing_secret = self.check_for_env_vars(signing_secret)
token = check_for_env_vars(token)
signing_secret = check_for_env_vars(signing_secret)

self.name = name
self.token = token
self.client = WebClient(token=token)
self.signing_secret = signing_secret

def check_for_env_vars(self, value):
"""Check an input value to see if it is an env_var or enc_env_var and get the value.
Parameters
----------
value : input to check.
Returns
-------
Any:
Returns the value of the var from either the passed in value, or the env var value.
"""
if type(value) is dict and "env_var" in value:
var_name = value["env_var"]
try:
return get_var(var_name)
except KeyError:
logging.critical(f"missing env var: {value['env_var']}")
if type(value) is dict and "enc_env_var" in value:
var_name = value["enc_env_var"]
try:
return get_enc_var(var_name)
except KeyError:
logging.critical(f"missing enc env var: {value['enc_env_var']}")
return value

def validate_slack_signature(self, request: GladosRequest):
valid = self.client.validate_slack_signature(
signing_secret=self.signing_secret, **request.slack_verify.json
Expand Down
35 changes: 33 additions & 2 deletions src/glados/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,35 @@
from base64 import b64decode

from glados import logging
from typing import Union


def check_for_env_vars(value: Union[str, dict]):
"""Check an input value to see if it is an env_var or enc_env_var and get the value.
Parameters
----------
value
input to check.
Returns
-------
Any:
Returns the value of the var from either the passed in value, or the env var value.
"""
if type(value) is dict and "env_var" in value:
var_name = value["env_var"]
try:
return get_var(var_name)
except KeyError:
logging.critical(f"missing env var: {value['env_var']}")
if type(value) is dict and "enc_env_var" in value:
var_name = value["enc_env_var"]
try:
return get_enc_var(var_name)
except KeyError:
logging.critical(f"missing enc env var: {value['enc_env_var']}")
return value


def get_var(var_name: str):
Expand Down Expand Up @@ -57,6 +86,7 @@ def __init__(self, d):
def from_dict(self, d):
self.__dict__ = {}
for key, value in d.items():
value = check_for_env_vars(value)
if type(value) is dict:
value = PyJSON(value)
if type(value) is list:
Expand All @@ -69,7 +99,7 @@ def from_dict(self, d):
value = value_list
self.__dict__[key] = value

def to_dict(self):
def to_dict(self) -> dict:
d = {}
for key, value in self.__dict__.items():
if type(value) is PyJSON:
Expand All @@ -84,7 +114,8 @@ def __setitem__(self, key, value):
self.__dict__[key] = value

def __getitem__(self, key):
return self.__dict__[key]
value = self.__dict__[key]
return value

def get(self, key, default=None):
try:
Expand Down
3 changes: 2 additions & 1 deletion tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@
GLADOS_CONFIG_FILE = "tests/glados.yaml"
GLADOS_CONFIG_FILE_LIMITED = "tests/glados_limited.yaml"
GLADOS_CONFIG_SECTIONS = sorted(["datastore", "glados", "my_other_config"])
POSTGRES_HOST = "localhost"

LOGGING_FORMAT = (
"%(levelname)-8s :: [%(filename)s:%(lineno)s :: %(funcName)s() ] %(message)s"
"[TEST] %(levelname)-8s :: [%(filename)s:%(lineno)s :: %(funcName)s() ] %(message)s"
)
logging.basicConfig(
level=logging.DEBUG, format=LOGGING_FORMAT, datefmt="%Y-%m-%d %H:%M:%S"
Expand Down
2 changes: 2 additions & 0 deletions tests/glados.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ glados:

datastore:
enabled: false
host:
env_var: POSTGRES_HOST

my_other_config:
log: yes
Expand Down
17 changes: 15 additions & 2 deletions tests/test_glados_configs.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from tests import GLADOS_CONFIG_FILE, GLADOS_CONFIG_SECTIONS
from glados import GladosConfig
from tests import GLADOS_CONFIG_FILE, GLADOS_CONFIG_SECTIONS, POSTGRES_HOST
from glados import GladosConfig, check_for_env_vars

from os import environ


def test_bad_config_file_path():
Expand All @@ -16,3 +18,14 @@ def test_reading_glados_config():

assert gc.sections == GLADOS_CONFIG_SECTIONS
assert gc.config.glados.import_bots is True


def test_reading_glados_config_datastore():
environ["POSTGRES_HOST"] = POSTGRES_HOST
gc = GladosConfig(GLADOS_CONFIG_FILE)
gc.read_config()

assert gc.config.datastore.host == POSTGRES_HOST

assert gc.sections == GLADOS_CONFIG_SECTIONS
assert gc.config.glados.import_bots is True
2 changes: 1 addition & 1 deletion tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ setenv =
COVERAGE_FILE=.coverage.{envname}

[testenv:coverage]
basepython = python3.8
basepython = python3.7
commands =
coverage combine
coverage xml
Expand Down

0 comments on commit ba3ba97

Please sign in to comment.