Skip to content

Commit a627eef

Browse files
Fix #128
2 parents 0137606 + f802447 commit a627eef

File tree

2 files changed

+34
-2
lines changed

2 files changed

+34
-2
lines changed

decouple.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from shlex import shlex
66
from io import open
77
from collections import OrderedDict
8-
from distutils.util import strtobool
98

109
# Useful for very coarse version differentiation.
1110
PYVERSION = sys.version_info
@@ -26,6 +25,22 @@
2625

2726
DEFAULT_ENCODING = 'UTF-8'
2827

28+
29+
# Python 3.10 don't have strtobool anymore. So we move it here.
30+
TRUE_VALUES = {"y", "yes", "t", "true", "on", "1"}
31+
FALSE_VALUES = {"n", "no", "f", "false", "off", "0"}
32+
33+
def strtobool(value):
34+
value = value.lower()
35+
36+
if value in TRUE_VALUES:
37+
return True
38+
elif value in FALSE_VALUES:
39+
return False
40+
41+
raise ValueError("Invalid truth value: " + value)
42+
43+
2944
class UndefinedValueError(Exception):
3045
pass
3146

@@ -283,7 +298,6 @@ def __init__(self, flat=None, cast=text_type, choices=None):
283298
self._valid_values.extend(self.flat)
284299
self._valid_values.extend([value for value, _ in self.choices])
285300

286-
287301
def __call__(self, value):
288302
transform = self.cast(value)
289303
if transform not in self._valid_values:

tests/test_strtobool.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import pytest
2+
from decouple import strtobool
3+
4+
5+
@pytest.mark.parametrize("value", ("Y", "YES", "T", "TRUE", "ON", "1"))
6+
def test_true_values(value):
7+
assert strtobool(value)
8+
9+
10+
@pytest.mark.parametrize("value", ("N", "NO", "F", "FALSE", "OFF", "0"))
11+
def test_false_values(value):
12+
assert strtobool(value) is False
13+
14+
15+
def test_invalid():
16+
with pytest.raises(ValueError, match="Invalid truth value"):
17+
strtobool("MAYBE")
18+

0 commit comments

Comments
 (0)