4
4
"""
5
5
6
6
import os
7
- from typing import Any , Optional , NoReturn
7
+ from collections .abc import Callable
8
+
9
+ from distutils .util import strtobool
10
+ from typing import Any , Type
8
11
9
12
from kirovy import exceptions
10
13
from kirovy .typing import SettingsValidationCallback
11
14
from kirovy .settings import settings_constants
12
15
13
16
MINIMUM_SECRET_KEY_LENGTH = 32
17
+ _NOT_SET = object ()
18
+
19
+
20
+ def _unvalidated_env_var (_ : str , __ : Any ) -> None :
21
+ return
14
22
15
23
16
24
def get_env_var (
17
25
key : str ,
18
- default : Optional [Any ] = None ,
19
- validation_callback : Optional [SettingsValidationCallback ] = None ,
26
+ default : Any | None = _NOT_SET ,
27
+ validation_callback : SettingsValidationCallback = _unvalidated_env_var ,
28
+ * ,
29
+ value_type : Type [Callable [[object ], Any ]] = str ,
20
30
) -> Any :
21
31
"""Get an env var and validate it.
22
32
@@ -25,16 +35,24 @@ def get_env_var(
25
35
26
36
Do not provide defaults for e.g. passwords.
27
37
28
- :param str key:
38
+ :param key:
29
39
The env var key to search for.
30
- :param Optional[Any] default:
40
+ :param default:
31
41
The default value. Use to make an env var not raise an error if
32
42
no env var is found. Never use for secrets.
33
43
If you use with ``validation_callback`` then make sure your default value will
34
44
pass your validation check.
35
- :param Optional[SettingsValidationCallback] validation_callback:
45
+ :param validation_callback:
36
46
A function to call on a value to make sure it's valid.
37
47
Raises an exception if invalid.
48
+ :param value_type:
49
+ Convert the string from ``os.environ`` to this type. The type must be callable.
50
+ No validation is performed on the environment string before attempting to cast,
51
+ so you're responsible for handling cast errors.
52
+
53
+ .. note::
54
+
55
+ If you provide ``bool`` then we will use ``distutils.util.strtobool``.
38
56
:return Any:
39
57
The env var value
40
58
@@ -45,28 +63,29 @@ def get_env_var(
45
63
46
64
"""
47
65
48
- value : Optional [Any ] = os .environ .get (key )
49
-
50
- if value is None :
51
- value = default
66
+ value : str | None = os .environ .get (key )
52
67
53
- if value is None :
68
+ if value is None and default is _NOT_SET :
54
69
raise exceptions .ConfigurationException (key , "Env var is required and cannot be None." )
55
70
56
- if validation_callback is not None :
57
- validation_callback (key , value )
71
+ if value_type == bool :
72
+ value_type = strtobool
73
+
74
+ value = value_type (value ) if value is not None else default
75
+
76
+ validation_callback (key , value )
58
77
59
78
return value
60
79
61
80
62
- def secret_key_validator (key : str , value : str ) -> NoReturn :
81
+ def secret_key_validator (key : str , value : str ) -> None :
63
82
"""Validate the secret key.
64
83
65
84
:param str key:
66
85
env var key.
67
86
:param str value:
68
87
The value found.
69
- :return NoReturn :
88
+ :return:
70
89
71
90
:raises exceptions.ConfigurationException:
72
91
"""
0 commit comments