Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -38,14 +38,24 @@ Get them:
'true'
>>> getenv('BOOLEAN', type=bool)
True
>>> getenv('BOOLEAN', default=False)
True
>>> getenv('LIST', type=list)
['a', 'b', 'c']
>>> getenv('LIST', default=[1, 2, 3])
['a', 'b', 'c']
>>> getenv('LIST', type=tuple)
('a', 'b', 'c')
>>> getenv('LIST', default=(1, 2, 3))
('a', 'b', 'c')
>>> getenv('TRICKY_LIST', type=list, separator=':')
['d', 'e', 'f']
>>> getenv('TRICKY_LIST', default=[1, 2, 3], separator=':')
['d', 'e', 'f']
>>> getenv('DICT', type=dict)
{'foo': 'bar'}
>>> getenv('DICT', default={'key': 'value'})
{'foo': 'bar'}
>>> getenv('LOST', default='default value anyone?')
'default value anyone?'

Expand Down
13 changes: 7 additions & 6 deletions smart_getenv.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,19 @@
import os
from ast import literal_eval


__version__ = '1.1.0'
__version__ = '1.2.0'


def getenv(name, **kwargs):
"""
Retrieves environment variable by name and casts the value to desired type.
If desired type is list or tuple - uses separator to split the value.
"""
default_value = kwargs.pop('default', None)
desired_type = kwargs.pop('type', str)
list_separator = kwargs.pop('separator', ',')
default_value = kwargs.get('default', None)
list_separator = kwargs.get('separator', ',')
desired_type = kwargs.get('type')
if not desired_type and default_value is not None:
desired_type = type(default_value)

value = os.getenv(name, None)

Expand All @@ -28,7 +29,7 @@ def getenv(name, **kwargs):
else:
return bool(value)

if desired_type is list or desired_type is tuple:
if desired_type in (list, tuple):
value = value.split(list_separator)
return desired_type(value)

Expand Down
19 changes: 19 additions & 0 deletions tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def test_getenv_type_str(self):
"""
os.environ[self.test_var_name] = 'abc'
self.assertEqual(getenv(self.test_var_name, type=str), 'abc')
self.assertEqual(getenv(self.test_var_name, default='qwe'), 'abc')

def test_getenv_type_int(self):
"""
Expand All @@ -58,6 +59,9 @@ def test_getenv_type_int(self):
except ValueError:
pass

os.environ[self.test_var_name] = '2'
self.assertEqual(getenv(self.test_var_name, default=1), 2)

def test_getenv_type_float(self):
"""
If environment variable exists and desired type is float:
Expand All @@ -75,6 +79,9 @@ def test_getenv_type_float(self):
except ValueError:
pass

os.environ[self.test_var_name] = '123.4'
self.assertEqual(getenv(self.test_var_name, default=245.6), 123.4)

def test_getenv_type_bool(self):
"""
If environment variable exists and desired type is bool, ensure getenv returns bool.
Expand Down Expand Up @@ -106,6 +113,9 @@ def test_getenv_type_bool(self):
os.environ[self.test_var_name] = ''
self.assertEqual(getenv(self.test_var_name, type=bool), False)

os.environ[self.test_var_name] = 'absolutely not a boolean'
self.assertEqual(getenv(self.test_var_name, default=False), True)

def test_getenv_type_list(self):
"""
If environment variable exists and desired type is list:
Expand All @@ -125,6 +135,9 @@ def test_getenv_type_list(self):
os.environ[self.test_var_name] = 'a:b:c'
self.assertEqual(getenv(self.test_var_name, type=list, separator=':'), ['a', 'b', 'c'])

os.environ[self.test_var_name] = 'a,b,c'
self.assertEqual(getenv(self.test_var_name, default=[1, 2]), ['a', 'b', 'c'])

def test_getenv_type_tuple(self):
"""
If environment variable exists and desired type is tuple:
Expand All @@ -144,6 +157,9 @@ def test_getenv_type_tuple(self):
os.environ[self.test_var_name] = 'a:b:c'
self.assertEqual(getenv(self.test_var_name, type=tuple, separator=':'), ('a', 'b', 'c'))

os.environ[self.test_var_name] = 'a,b,c'
self.assertEqual(getenv(self.test_var_name, default=(1, 2)), ('a', 'b', 'c'))

def test_getenv_type_dict(self):
"""
If environment variable exists and desired type is dict:
Expand All @@ -169,6 +185,9 @@ def test_getenv_type_dict(self):
except SyntaxError:
pass

os.environ[self.test_var_name] = '{ "key": "value" }'
self.assertEqual(getenv(self.test_var_name, default={"key": "other value"}), {'key': 'value'})


if __name__ == '__main__':
unittest.main()