forked from theskumar/python-dotenv
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathenviron.py
More file actions
89 lines (63 loc) · 2.37 KB
/
environ.py
File metadata and controls
89 lines (63 loc) · 2.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# -*- coding: utf-8 -*-
import os
import json
import string
from .helpers import Csv
from .compat import text_type
class UndefinedValueError(Exception):
pass
class Undefined(object):
"""Class to represent undefined type. """
pass
def _cast_boolean(value):
"""
Helper to convert config values to boolean as ConfigParser do.
"""
_BOOLEANS = {'1': True, 'yes': True, 'true': True, 'on': True,
'0': False, 'no': False, 'false': False, 'off': False, '': False}
value = str(value)
if value.lower() not in _BOOLEANS:
raise ValueError('Not a boolean: %s' % value)
return _BOOLEANS[value.lower()]
class Env():
ENVIRON = os.environ
NOTSET = Undefined()
def __call__(self, var, default=NOTSET, cast=NOTSET):
return self.get_value(var, default=default, cast=cast)
def __contains__(self, var):
return var in self.ENVIRON
def get_value(self, var, default=NOTSET, cast=NOTSET):
"""
Return the value for option or default if defined.
"""
# We can't avoid __contains__ because value may be empty.
try:
value = self.ENVIRON[var]
except KeyError:
if isinstance(default, Undefined):
error_msg = '{} not found. Declare it as envvar or define a default value.'.format(var)
raise UndefinedValueError(error_msg)
value = default
if cast is self.NOTSET:
return value
if cast is bool:
value = _cast_boolean(value)
elif cast is list:
value = [x for x in value.split(',') if x]
else:
value = cast(value)
return value
# shortcuts
def int(self, var, default=NOTSET):
return self.get_value(var, default, cast=int)
def str(self, var, default=NOTSET):
return self.get_value(var, default)
def bool(self, var, default=NOTSET):
return self.get_value(var, default, cast=bool)
def float(self, var, default=NOTSET):
return self.get_value(var, default, cast=float)
def json(self, var, default=NOTSET):
return self.get_value(var, default, cast=json.loads)
def csv(self, var, default=NOTSET, cast=text_type, delimiter=',', strip=string.whitespace, post_process=list):
return self.get_value(var, default, cast=Csv(cast, delimiter, strip, post_process))
env = Env()