Uses pathlib.Path in PathValue

This commit is contained in:
Eduardo Cuducos 2021-10-11 15:54:10 -04:00
parent d89fe5a2cb
commit b4764ed903
2 changed files with 23 additions and 10 deletions

View file

@ -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):

View file

@ -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