diff --git a/configurations/values.py b/configurations/values.py index 2413a1a..73d4a43 100644 --- a/configurations/values.py +++ b/configurations/values.py @@ -3,6 +3,7 @@ import copy import decimal import os import sys +from pathlib import Path from django.core import validators from django.core.exceptions import ValidationError, ImproperlyConfigured @@ -391,14 +392,15 @@ class RegexValue(ValidationMixin, Value): class PathValue(Value): def __init__(self, *args, **kwargs): self.check_exists = kwargs.pop('check_exists', True) + self.use_pathlib = kwargs.pop('use_pathlib', True) super().__init__(*args, **kwargs) def setup(self, name): value = super().setup(name) - value = os.path.expanduser(value) - if self.check_exists and not os.path.exists(value): + value = Path(value).expanduser() + if self.check_exists and not value.exists(): raise ValueError('Path {0!r} does not exist.'.format(value)) - return os.path.abspath(value) + return value.absolute() if self.use_pathlib else str(value) class SecretValue(Value): diff --git a/tests/test_values.py b/tests/test_values.py index 2547e50..452abc6 100644 --- a/tests/test_values.py +++ b/tests/test_values.py @@ -1,6 +1,7 @@ import decimal import os from contextlib import contextmanager +from pathlib import Path from django.test import TestCase from django.core.exceptions import ImproperlyConfigured @@ -335,22 +336,32 @@ class ValueTests(TestCase): def test_path_values_with_check(self): value = PathValue() with env(DJANGO_TEST='/'): - self.assertEqual(value.setup('TEST'), '/') + self.assertEqual(value.setup('TEST'), Path('/')) with env(DJANGO_TEST='~/'): - self.assertEqual(value.setup('TEST'), os.path.expanduser('~')) + self.assertEqual(value.setup('TEST'), Path.home()) with env(DJANGO_TEST='/does/not/exist'): self.assertRaises(ValueError, value.setup, 'TEST') def test_path_values_no_check(self): value = PathValue(check_exists=False) with env(DJANGO_TEST='/'): - self.assertEqual(value.setup('TEST'), '/') + self.assertEqual(value.setup('TEST'), Path('/')) with env(DJANGO_TEST='~/spam/eggs'): - self.assertEqual(value.setup('TEST'), - os.path.join(os.path.expanduser('~'), - 'spam', 'eggs')) + self.assertEqual( + value.setup('TEST'), + Path.home() / 'spam' / 'eggs' + ) with env(DJANGO_TEST='/does/not/exist'): - self.assertEqual(value.setup('TEST'), '/does/not/exist') + self.assertEqual(value.setup('TEST'), Path('/does/not/exist')) + + def test_path_values_without_pathlib(self): + value = PathValue(use_pathlib=False) + with env(DJANGO_TEST='/'): + self.assertEqual(value.setup('TEST'), '/') + with env(DJANGO_TEST='~/'): + self.assertEqual(value.setup('TEST'), os.path.expanduser('~')) + with env(DJANGO_TEST='/does/not/exist'): + self.assertRaises(ValueError, value.setup, 'TEST') def test_secret_value(self): # no default allowed, only environment values are