Просмотр исходного кода

Refs #30461 -- Added django.utils._os.to_path().

Claude Paroz 5 лет назад
Родитель
Сommit
88c0b907e7
2 измененных файлов с 23 добавлено и 1 удалено
  1. 10 0
      django/utils/_os.py
  2. 13 1
      tests/utils_tests/test_os_utils.py

+ 10 - 0
django/utils/_os.py

@@ -1,6 +1,7 @@
 import os
 import tempfile
 from os.path import abspath, dirname, join, normcase, sep
+from pathlib import Path
 
 from django.core.exceptions import SuspiciousFileOperation
 
@@ -47,3 +48,12 @@ def symlinks_supported():
         except (OSError, NotImplementedError):
             supported = False
         return supported
+
+
+def to_path(value):
+    """Convert value to a pathlib.Path instance, if not already a Path."""
+    if isinstance(value, Path):
+        return value
+    elif not isinstance(value, str):
+        raise TypeError('Invalid path type: %s' % type(value).__name__)
+    return Path(value)

+ 13 - 1
tests/utils_tests/test_os_utils.py

@@ -1,8 +1,9 @@
 import os
 import unittest
+from pathlib import Path
 
 from django.core.exceptions import SuspiciousFileOperation
-from django.utils._os import safe_join
+from django.utils._os import safe_join, to_path
 
 
 class SafeJoinTests(unittest.TestCase):
@@ -29,3 +30,14 @@ class SafeJoinTests(unittest.TestCase):
     def test_parent_path(self):
         with self.assertRaises(SuspiciousFileOperation):
             safe_join("/abc/", "../def")
+
+
+class ToPathTests(unittest.TestCase):
+    def test_to_path(self):
+        for path in ('/tmp/some_file.txt', Path('/tmp/some_file.txt')):
+            with self.subTest(path):
+                self.assertEqual(to_path(path), Path('/tmp/some_file.txt'))
+
+    def test_to_path_invalid_value(self):
+        with self.assertRaises(TypeError):
+            to_path(42)