Skip to content
This repository was archived by the owner on May 23, 2023. It is now read-only.

Commit 28a0c92

Browse files
Merge pull request #12 from madeiramadeirabr/dynamic_config_class
Config dinâmica
2 parents 8e60a05 + b68112a commit 28a0c92

File tree

7 files changed

+179
-45
lines changed

7 files changed

+179
-45
lines changed

examples/lambda_api/lambda_app/boot.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
ROOT_DIR = current_path
1616
_LOADED = False
17+
_ENV_KEYS = []
1718

1819
try:
1920
import chalicelib
@@ -41,8 +42,14 @@ def is_loaded():
4142

4243

4344
def reset():
44-
global _LOADED
45+
global _LOADED, _ENV_KEYS
4546
_LOADED = False
47+
_ENV_KEYS = []
48+
49+
50+
def get_env_keys():
51+
global _ENV_KEYS
52+
return _ENV_KEYS
4653

4754

4855
def get_internal_logger():
@@ -65,12 +72,13 @@ def load_dot_env(env='development', force=False):
6572

6673
logger = get_internal_logger()
6774

68-
global _LOADED
75+
global _LOADED, _ENV_KEYS
6976
if not _LOADED or force:
7077
logger.info('Boot - Loading env: {}'.format(env))
7178

7279
# Default
7380
for k, v in _DEFAULT_ENV_CONFIGS.items():
81+
_ENV_KEYS.append(k)
7482
if k == 'APP_ENV':
7583
v = env
7684
os.environ[k] = v
@@ -80,6 +88,7 @@ def load_dot_env(env='development', force=False):
8088
env_vars = dotenv_values(config_path)
8189

8290
for k, v in env_vars.items():
91+
_ENV_KEYS.append(k)
8392
os.environ[k] = v
8493
_LOADED = True
8594
else:
@@ -99,6 +108,7 @@ def load_dot_env(env='development', force=False):
99108

100109

101110
def load_secrets(env='staging'):
111+
global _ENV_KEYS
102112
from lambda_app.aws.secrets import Secrets
103113
logger = get_internal_logger()
104114
result = False
@@ -128,13 +138,14 @@ def load_env(env='dev', force=False):
128138

129139
logger = get_internal_logger()
130140

131-
global _LOADED
141+
global _LOADED,_ENV_KEYS
132142
if not _LOADED or force:
133143

134144
logger.info('Boot - Loading env: {}'.format(env))
135145

136146
# Default
137147
for k, v in _DEFAULT_ENV_CONFIGS.items():
148+
_ENV_KEYS.append(k)
138149
if k == 'APP_ENV':
139150
v = env
140151
os.environ[k] = v
@@ -156,6 +167,7 @@ def load_env(env='dev', force=False):
156167
if env in configs['stages']:
157168
env_vars = configs['stages'][env]['environment_variables']
158169
for k, v in env_vars.items():
170+
_ENV_KEYS.append(k)
159171
os.environ[k] = v
160172
_LOADED = True
161173
else:

examples/lambda_api/lambda_app/config.py

Lines changed: 10 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -10,55 +10,19 @@
1010

1111
class Configuration:
1212
# APP
13-
APP_ENV = 'development'
1413
APP_NAME = ''
1514
APP_VERSION = ''
1615

17-
# LOG
18-
LOG_LEVEL = logging.INFO
19-
20-
# NEW RELIC
21-
NEW_RELIC_DEVELOPER_MODE = 'development'
22-
NEW_RELIC_LICENSE_KEY = "license_key"
23-
NEW_RELIC_LOG_HOST = "https://log-api.newrelic.com/log/v1"
24-
25-
DB_HOST = ""
26-
DB_USER = ""
27-
DB_PASSWORD = ""
28-
DB = ""
29-
30-
APP_QUEUE = ""
31-
32-
REDIS_HOST = ""
33-
REDIS_PORT = 6379
34-
REGION_NAME = ""
35-
36-
SQS_ENDPOINT = None
37-
SQS_LOCALSTACK = "http://localhost:4566"
38-
SECRET_KEY = 'teste'
39-
4016
def __init__(self):
4117
# APP
42-
self.APP_ENV = os.getenv("APP_ENV") if 'APP_ENV' in os.environ else 'development'
4318
self.APP_NAME = APP_NAME
4419
self.APP_VERSION = APP_VERSION
45-
self.SECRET_KEY = os.getenv("SECRET_KEY") if 'SECRET_KEY' in os.environ else self.SECRET_KEY
4620

47-
self.LOG_LEVEL = os.getenv("LOG_LEVEL") if 'LOG_LEVEL' in os.environ else self.LOG_LEVEL
48-
49-
self.DB_HOST = os.getenv("DB_HOST") if 'DB_HOST' in os.environ else self.DB_HOST
50-
self.DB_USER = os.getenv("DB_USER") if 'DB_USER' in os.environ else self.DB_USER
51-
self.DB_PASSWORD = os.getenv("DB_PASSWORD") if 'DB_PASSWORD' in os.environ else self.DB_PASSWORD
52-
self.DB = os.getenv("DB") if 'DB' in os.environ else self.DB
53-
54-
self.APP_QUEUE = os.getenv("APP_QUEUE") if 'APP_QUEUE' in os.environ else self.APP_QUEUE
55-
56-
self.REDIS_HOST = os.getenv("REDIS_HOST") if 'REDIS_HOST' in os.environ else self.REDIS_HOST
57-
self.REDIS_PORT = os.getenv("REDIS_PORT") if 'REDIS_PORT' in os.environ else self.REDIS_PORT
58-
self.REGION_NAME = os.getenv("REGION_NAME") if 'REGION_NAME' in os.environ else self.REGION_NAME
59-
60-
self.SQS_ENDPOINT = os.getenv("SQS_ENDPOINT") if 'SQS_ENDPOINT' in os.environ else self.SQS_ENDPOINT
61-
self.SQS_LOCALSTACK = os.getenv("SQS_LOCALSTACK") if 'SQS_LOCALSTACK' in os.environ else self.SQS_LOCALSTACK
21+
# montagem dinamica de atributos
22+
env_keys = Configuration.get_env_keys()
23+
for k in env_keys:
24+
value = os.getenv(k) if k in os.environ else None
25+
setattr(Configuration, k, value)
6226

6327
def __dict__(self):
6428
attributes = inspect.getmembers(self, lambda a: not (inspect.isroutine(a)))
@@ -67,6 +31,11 @@ def __dict__(self):
6731
def to_dict(self):
6832
return self.__dict__()
6933

34+
@staticmethod
35+
def get_env_keys():
36+
from lambda_app.boot import get_env_keys
37+
return get_env_keys()
38+
7039

7140
def reset():
7241
global _CONFIG
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import os
2+
import unittest
3+
from lambda_app.boot import load_dot_env, reset, is_loaded, load_env
4+
from tests.unit.testutils import BaseUnitTestCase, get_function_name
5+
from unittest_data_provider import data_provider
6+
7+
8+
def get_env():
9+
return (None, True), ('dev', True), ('development', True), ('integration', True), ('staging', True), (
10+
'production', True)
11+
12+
13+
def get_load_dot_env():
14+
return (None, True), ('dev', True), ('development', True), ('integration', False), ('staging', False), (
15+
'production', False)
16+
17+
18+
class BootTestCase(BaseUnitTestCase):
19+
20+
@data_provider(get_env)
21+
def test_load_env(self, env, expected):
22+
self.logger.info('Running test: %s - %s', get_function_name(__name__), env)
23+
APP_TYPE = os.environ['APP_TYPE']
24+
self.logger.info("APP_TYPE: {}".format(APP_TYPE))
25+
if APP_TYPE == 'Chalice':
26+
reset()
27+
load_env(env)
28+
self.assertEqual(is_loaded(), expected)
29+
else:
30+
self.skipTest('test_load_env - Ignored because the APP_TYPE {}'.format(APP_TYPE))
31+
32+
@data_provider(get_load_dot_env)
33+
def test_load_dot_env(self, env, expected):
34+
self.logger.info('Running test: %s - %s', get_function_name(__name__), env)
35+
APP_TYPE = os.environ['APP_TYPE']
36+
self.logger.info("APP_TYPE: {}".format(APP_TYPE))
37+
38+
if APP_TYPE == 'Flask':
39+
# AWS Image condition
40+
if 'ENVIRONMENT_NAME' in os.environ:
41+
if env == os.environ['ENVIRONMENT_NAME']:
42+
expected = True
43+
reset()
44+
load_dot_env(env)
45+
self.assertEqual(is_loaded(), expected)
46+
else:
47+
self.skipTest('test_load_dot_env - Ignored because the APP_TYPE {}'.format(APP_TYPE))
48+
49+
50+
if __name__ == '__main__':
51+
unittest.main()
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import unittest
2+
3+
from lambda_app.config import get_config
4+
from tests.unit.testutils import BaseUnitTestCase, get_function_name
5+
6+
7+
class ConfigTestCase(BaseUnitTestCase):
8+
CONFIG = None
9+
10+
def test_get_config(self):
11+
self.logger.info('Running test: %s', get_function_name(__name__))
12+
config = get_config()
13+
config_dict = config.to_dict()
14+
15+
self.assertTrue(getattr(config, 'APP_NAME'))
16+
self.logger.info(config.APP_NAME)
17+
self.assertTrue(getattr(config, 'APP_ENV'))
18+
self.logger.info(config.APP_ENV)
19+
20+
self.logger.info(config_dict)
21+
22+
23+
24+
25+
if __name__ == '__main__':
26+
unittest.main()

examples/lambda_api/todo.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11

22
Tarefas:
33
Corrigir migrations
4-
Remover config do projeto para evitar problemas
54
fazer scripts do localstack como sqs ler as variaveis do .projectrc
65
Deixar independente de flask para cenários de SQS
76
Criar versões simplificada de SQS
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import os
2+
import unittest
3+
from lambda_app.boot import load_dot_env, reset, is_loaded, load_env
4+
from tests.unit.testutils import BaseUnitTestCase, get_function_name
5+
from unittest_data_provider import data_provider
6+
7+
8+
def get_env():
9+
return (None, True), ('dev', True), ('development', True), ('integration', True), ('staging', True), (
10+
'production', True)
11+
12+
13+
def get_load_dot_env():
14+
return (None, True), ('dev', True), ('development', True), ('integration', False), ('staging', False), (
15+
'production', False)
16+
17+
18+
class BootTestCase(BaseUnitTestCase):
19+
20+
@data_provider(get_env)
21+
def test_load_env(self, env, expected):
22+
self.logger.info('Running test: %s - %s', get_function_name(__name__), env)
23+
APP_TYPE = os.environ['APP_TYPE']
24+
self.logger.info("APP_TYPE: {}".format(APP_TYPE))
25+
if APP_TYPE == 'Chalice':
26+
reset()
27+
load_env(env)
28+
self.assertEqual(is_loaded(), expected)
29+
else:
30+
self.skipTest('test_load_env - Ignored because the APP_TYPE {}'.format(APP_TYPE))
31+
32+
@data_provider(get_load_dot_env)
33+
def test_load_dot_env(self, env, expected):
34+
self.logger.info('Running test: %s - %s', get_function_name(__name__), env)
35+
APP_TYPE = os.environ['APP_TYPE']
36+
self.logger.info("APP_TYPE: {}".format(APP_TYPE))
37+
38+
if APP_TYPE == 'Flask':
39+
# AWS Image condition
40+
if 'ENVIRONMENT_NAME' in os.environ:
41+
if env == os.environ['ENVIRONMENT_NAME']:
42+
expected = True
43+
reset()
44+
load_dot_env(env)
45+
self.assertEqual(is_loaded(), expected)
46+
else:
47+
self.skipTest('test_load_dot_env - Ignored because the APP_TYPE {}'.format(APP_TYPE))
48+
49+
50+
if __name__ == '__main__':
51+
unittest.main()
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import unittest
2+
3+
from lambda_app.config import get_config
4+
from tests.unit.testutils import BaseUnitTestCase, get_function_name
5+
6+
7+
class ConfigTestCase(BaseUnitTestCase):
8+
CONFIG = None
9+
10+
def test_get_config(self):
11+
self.logger.info('Running test: %s', get_function_name(__name__))
12+
config = get_config()
13+
config_dict = config.to_dict()
14+
15+
self.assertTrue(getattr(config, 'APP_NAME'))
16+
self.logger.info(config.APP_NAME)
17+
self.assertTrue(getattr(config, 'APP_ENV'))
18+
self.logger.info(config.APP_ENV)
19+
20+
self.logger.info(config_dict)
21+
22+
23+
24+
25+
if __name__ == '__main__':
26+
unittest.main()

0 commit comments

Comments
 (0)