Skip to content

Commit

Permalink
Merge pull request #1 from AEzzatA/master
Browse files Browse the repository at this point in the history
Format the source code using Black
  • Loading branch information
thesimj committed May 16, 2019
2 parents d32d6dd + a697293 commit b47a258
Show file tree
Hide file tree
Showing 3 changed files with 105 additions and 93 deletions.
36 changes: 24 additions & 12 deletions envyaml/envyaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@

from yaml import safe_load

__version__ = '0.1910'
__version__ = "0.1910"


class EnvYAML:
__version__ = __version__

DEFAULT_ENV_YAML_FILE = 'env.yaml'
DEFAULT_ENV_FILE = '.env'
DEFAULT_ENV_YAML_FILE = "env.yaml"
DEFAULT_ENV_FILE = ".env"

__env_file = None # type:str
__yaml_file = None # type: str
Expand All @@ -50,8 +50,12 @@ def __init__(self, yaml_file=None, env_file=None, include_environment=True):
self.__env_file = env_file

# get env file and read
env_config = self.__read_env_file(self.__get_file_path(env_file, 'ENV_FILE', self.DEFAULT_ENV_FILE))
yaml_config = self.__read_yaml_file(self.__get_file_path(yaml_file, 'ENV_YAML_FILE', self.DEFAULT_ENV_YAML_FILE))
env_config = self.__read_env_file(
self.__get_file_path(env_file, "ENV_FILE", self.DEFAULT_ENV_FILE)
)
yaml_config = self.__read_yaml_file(
self.__get_file_path(yaml_file, "ENV_YAML_FILE", self.DEFAULT_ENV_YAML_FILE)
)

# compose raw config
self.__config_raw = dict(os.environ) if include_environment else {}
Expand Down Expand Up @@ -97,11 +101,11 @@ def __read_env_file(file_path):
if file_path:
with open(file_path) as f:
for line in f.readlines(): # type:str
if line and line[0].isalpha() and ('=' in line):
name, value = line.strip().split('=', 1) # type: str,str
if line and line[0].isalpha() and ("=" in line):
name, value = line.strip().split("=", 1) # type: str,str
# strip value
value = value.strip().strip('\'\"')
name = name.strip().strip('\'\"')
value = value.strip().strip("'\"")
name = name.strip().strip("'\"")
# set environ
os.environ[name] = value
# set local config
Expand Down Expand Up @@ -157,10 +161,14 @@ def __flat_deep(prefix, config):
"""
dest_ = {}

elements = enumerate(config) if (isinstance(config, list) or isinstance(config, tuple)) else config.items() # type: (str, any)
elements = (
enumerate(config)
if (isinstance(config, list) or isinstance(config, tuple))
else config.items()
) # type: (str, any)

for key_, value_ in elements:
key_ = prefix + '.' + str(key_)
key_ = prefix + "." + str(key_)

if isinstance(value_, dict):
dest_[key_] = value_
Expand All @@ -187,7 +195,11 @@ def __flat(config):
for key_, value_ in config.items():
key_ = str(key_)

if isinstance(value_, dict) or isinstance(value_, list) or isinstance(value_, type):
if (
isinstance(value_, dict)
or isinstance(value_, list)
or isinstance(value_, type)
):
dest_[key_] = value_
dest_.update(EnvYAML.__flat_deep(key_, value_))

Expand Down
38 changes: 19 additions & 19 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,29 +7,29 @@
long_description = f.read()

setup(
name='envyaml',
name="envyaml",
packages=find_packages(),
version=__version__,
url='https://github.com/thesimj/envyaml',
license='MIT',
author='Mykola Bubelich',
author_email='projects@bubelich.com',
description='Simple YAML configuration file parser with easy access for structured data',
install_requires=['PyYAML'],
python_requires='>=2.7',
url="https://github.com/thesimj/envyaml",
license="MIT",
author="Mykola Bubelich",
author_email="projects@bubelich.com",
description="Simple YAML configuration file parser with easy access for structured data",
install_requires=["PyYAML"],
python_requires=">=2.7",
include_package_data=True,
platforms='any',
test_suite='tests',
platforms="any",
test_suite="tests",
long_description=long_description,
long_description_content_type="text/markdown",
classifiers=[
'Operating System :: OS Independent',
'License :: OSI Approved :: MIT License',
'Topic :: Utilities',
'Intended Audience :: Developers',
'Topic :: Software Development :: Libraries :: Python Modules',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
]
"Operating System :: OS Independent",
"License :: OSI Approved :: MIT License",
"Topic :: Utilities",
"Intended Audience :: Developers",
"Topic :: Software Development :: Libraries :: Python Modules",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
],
)
124 changes: 62 additions & 62 deletions tests/test_envyaml.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,180 +7,180 @@
from envyaml import EnvYAML

# set os env
os.environ['TEST_ENV'] = 'test-env'
os.environ["TEST_ENV"] = "test-env"


def test_it_should_read_env_file():
env = EnvYAML('tests/env.test.yaml', env_file='tests/test.env')
env = EnvYAML("tests/env.test.yaml", env_file="tests/test.env")

assert env['env_file.project.name'] == 'project-x-42'
assert env['USERNAME'] == 'env-username'
assert env['PASSWORD'] == 'env-password-with-escape'
assert env['PASSWORD_WE'] == 'env-password-without-escape'
assert env['EMPTY'] == ''
assert env["env_file.project.name"] == "project-x-42"
assert env["USERNAME"] == "env-username"
assert env["PASSWORD"] == "env-password-with-escape"
assert env["PASSWORD_WE"] == "env-password-without-escape"
assert env["EMPTY"] == ""

# Test wrong names, should be not found and raise KeyErro
with pytest.raises(KeyError):
assert env['01sre']
assert env["01sre"]

with pytest.raises(KeyError):
assert env['!dtdrthkj']
assert env["!dtdrthkj"]

with pytest.raises(KeyError):
assert env['$WRONG_NAME']
assert env["$WRONG_NAME"]

# Config from comment
with pytest.raises(KeyError):
assert env['comments']
assert env["comments"]


def test_it_should_read_custom_file():
env = EnvYAML('tests/env.test.yaml')
env = EnvYAML("tests/env.test.yaml")

# access by property name
assert env['one.two.three.value'] == "one-two-three-value"
assert env["one.two.three.value"] == "one-two-three-value"
# access by item name
assert env['one.two.three.value'] == "one-two-three-value"
assert env["one.two.three.value"] == "one-two-three-value"
# access list item
assert env['list_test'][0] == 'one'
assert env["list_test"][0] == "one"
# access list item (array)
assert env['list_test.0'] == 'one'
assert env["list_test.0"] == "one"

assert isinstance(env['keys'], dict) and len(env['keys']) == 2
assert isinstance(env["keys"], dict) and len(env["keys"]) == 2


def test_it_should_access_environment_variables():
os.environ['ENV_VAR'] = 'test-env-var'
os.environ["ENV_VAR"] = "test-env-var"

env = EnvYAML()

assert env['ENV_VAR'] == 'test-env-var'
assert env["ENV_VAR"] == "test-env-var"


def test_it_should_fail_when_access_environment_variables():
os.environ['ENV_VAR'] = 'test-env-var'
os.environ["ENV_VAR"] = "test-env-var"

env = EnvYAML(include_environment=False)

with pytest.raises(KeyError):
assert env['ENV_VAR'] == 'test-env-var'
assert env["ENV_VAR"] == "test-env-var"


def test_it_should_access_environ():
os.environ['ENV_VAR'] = 'test-env-var'
os.environ["ENV_VAR"] = "test-env-var"

env = EnvYAML()

assert env.environ() == os.environ
assert env.environ()['ENV_VAR'] == os.environ['ENV_VAR']
assert env.environ()["ENV_VAR"] == os.environ["ENV_VAR"]


def test_it_should_read_default_file():
env = EnvYAML()

# access by property name
assert env['one.two.three.value'] == "one-two-three-value"
assert env["one.two.three.value"] == "one-two-three-value"
# access by item name
assert env['one.two.three.value'] == "one-two-three-value"
assert env["one.two.three.value"] == "one-two-three-value"
# access list item
assert env['list_test'][0] == 'one'
assert env["list_test"][0] == "one"
# access list item (array)
assert env['list_test.0'] == 'one'
assert env["list_test.0"] == "one"

assert isinstance(env['keys'], dict) and len(env['keys']) == 2
assert isinstance(env["keys"], dict) and len(env["keys"]) == 2


def test_it_should_populate_env_variable():
env = EnvYAML('tests/env.test.yaml')
env = EnvYAML("tests/env.test.yaml")

assert env['config.test_env'] == os.environ['TEST_ENV']
assert env["config.test_env"] == os.environ["TEST_ENV"]


def test_it_should_return_dict_on_export():
env = EnvYAML('tests/env.test.yaml')
env = EnvYAML("tests/env.test.yaml")

assert isinstance(env.export(), dict) and len(env.export()) >= 4


def test_it_should_convert_config_to_dict():
env = EnvYAML('tests/env.test.yaml')
env = EnvYAML("tests/env.test.yaml")

assert isinstance(dict(env['test']), dict)
assert isinstance(dict(env["test"]), dict)


def test_it_should_access_all_keys_in_config():
env = EnvYAML('tests/env.test.yaml')
env = EnvYAML("tests/env.test.yaml")

assert len(env.keys()) > 10


def test_it_should_access_keys_and_lists():
env = EnvYAML('tests/env.test.yaml')
env = EnvYAML("tests/env.test.yaml")

assert isinstance(env['keys_and_lists'], dict)
assert isinstance(env['keys_and_lists.one'], list)
assert isinstance(env['keys_and_lists.two'], list)
assert isinstance(env["keys_and_lists"], dict)
assert isinstance(env["keys_and_lists.one"], list)
assert isinstance(env["keys_and_lists.two"], list)

assert env['keys_and_lists.one.0'] == 'one'
assert env['keys_and_lists.two.1.super.one'] == 'one'
assert env["keys_and_lists.one.0"] == "one"
assert env["keys_and_lists.two.1.super.one"] == "one"


def test_it_should_read_config_from_env_variable():
# Set env file
os.environ['ENV_YAML_FILE'] = 'tests/env.test.yaml'
os.environ['ENV_FILE'] = 'tests/test.env'
os.environ["ENV_YAML_FILE"] = "tests/env.test.yaml"
os.environ["ENV_FILE"] = "tests/test.env"

env = EnvYAML()

assert env['env_file.project.name'] == 'project-x-42'
assert env["env_file.project.name"] == "project-x-42"
assert isinstance(env.export(), dict) and len(env.export()) >= 4


def test_it_should_raise_exception_when_file_not_found():
with pytest.raises(IOError):
EnvYAML('tests/env.notfound.yaml')
EnvYAML("tests/env.notfound.yaml")


def test_it_should_use_default_value():
env = EnvYAML('tests/env.test.yaml')
env = EnvYAML("tests/env.test.yaml")

assert env.get('not.exist.key') is None
assert env.get('not.exist.key', 'default') == 'default'
assert env.get('config.test') == 100
assert env.get("not.exist.key") is None
assert env.get("not.exist.key", "default") == "default"
assert env.get("config.test") == 100


def test_it_should_get_lists_values_by_number():
env = EnvYAML('tests/env.test.yaml')
env = EnvYAML("tests/env.test.yaml")

assert env['list_test'][0] == 'one'
assert env['list_test'][1] == 'two'
assert env['list_test'][2] == 'tree'
assert env["list_test"][0] == "one"
assert env["list_test"][1] == "two"
assert env["list_test"][2] == "tree"

assert env.get('list_test.0') == 'one'
assert env.get('list_test.1') == 'two'
assert env.get('list_test.2') == 'tree'
assert env.get("list_test.0") == "one"
assert env.get("list_test.1") == "two"
assert env.get("list_test.2") == "tree"

assert env['list_test.0'] == 'one'
assert env['list_test.1'] == 'two'
assert env['list_test.2'] == 'tree'
assert env["list_test.0"] == "one"
assert env["list_test.1"] == "two"
assert env["list_test.2"] == "tree"


def test_it_should_not_fail_when_try_load_non_exist_default_file():
del os.environ['ENV_YAML_FILE']
del os.environ['ENV_FILE']
del os.environ["ENV_YAML_FILE"]
del os.environ["ENV_FILE"]

env = EnvYAML()

assert isinstance(env, EnvYAML)


def test_it_should_not_fail_when_try_load_default_empty_yaml_file():
env = EnvYAML('tests/env.empty.yaml')
env = EnvYAML("tests/env.empty.yaml")

assert isinstance(env, EnvYAML)


def test_it_should_not_fail_when_try_load_default_empty_dotenv_file():
env = EnvYAML(env_file='tests/test.empty.env')
env = EnvYAML(env_file="tests/test.empty.env")

assert isinstance(env, EnvYAML)

0 comments on commit b47a258

Please sign in to comment.