1from __future__ import unicode_literals 2 3import os 4import shutil 5 6from django.core.files.base import ContentFile 7from django.core.files.storage import FileSystemStorage 8from django.test import TestCase 9 10from pipeline import glob 11 12 13def local_path(path): 14 return os.path.join(os.path.dirname(__file__), path) 15 16 17class GlobTest(TestCase): 18 def normpath(self, *parts): 19 return os.path.normpath(os.path.join(*parts)) 20 21 def mktemp(self, *parts): 22 filename = self.normpath(*parts) 23 base, file = os.path.split(filename) 24 base = os.path.join(self.storage.location, base) 25 if not os.path.exists(base): 26 os.makedirs(base) 27 self.storage.save(filename, ContentFile("")) 28 29 def assertSequenceEqual(self, l1, l2): 30 self.assertEqual(set(l1), set(l2)) 31 32 def setUp(self): 33 self.storage = FileSystemStorage(local_path('glob_dir')) 34 self.old_storage = glob.staticfiles_storage 35 glob.staticfiles_storage = self.storage 36 self.mktemp('a', 'D') 37 self.mktemp('aab', 'F') 38 self.mktemp('aaa', 'zzzF') 39 self.mktemp('ZZZ') 40 self.mktemp('a', 'bcd', 'EF') 41 self.mktemp('a', 'bcd', 'efg', 'ha') 42 43 def glob(self, *parts): 44 if len(parts) == 1: 45 pattern = parts[0] 46 else: 47 pattern = os.path.join(*parts) 48 return glob.glob(pattern) 49 50 def tearDown(self): 51 shutil.rmtree(self.storage.location) 52 glob.staticfiles_storage = self.old_storage 53 54 def test_glob_literal(self): 55 self.assertSequenceEqual(self.glob('a'), [self.normpath('a')]) 56 self.assertSequenceEqual(self.glob('a', 'D'), [self.normpath('a', 'D')]) 57 self.assertSequenceEqual(self.glob('aab'), [self.normpath('aab')]) 58 59 def test_glob_one_directory(self): 60 self.assertSequenceEqual( 61 self.glob('a*'), map(self.normpath, ['a', 'aab', 'aaa'])) 62 self.assertSequenceEqual( 63 self.glob('*a'), map(self.normpath, ['a', 'aaa'])) 64 self.assertSequenceEqual( 65 self.glob('aa?'), map(self.normpath, ['aaa', 'aab'])) 66 self.assertSequenceEqual( 67 self.glob('aa[ab]'), map(self.normpath, ['aaa', 'aab'])) 68 self.assertSequenceEqual(self.glob('*q'), []) 69 70 def test_glob_nested_directory(self): 71 if os.path.normcase("abCD") == "abCD": 72 # case-sensitive filesystem 73 self.assertSequenceEqual( 74 self.glob('a', 'bcd', 'E*'), [self.normpath('a', 'bcd', 'EF')]) 75 else: 76 # case insensitive filesystem 77 self.assertSequenceEqual(self.glob('a', 'bcd', 'E*'), [ 78 self.normpath('a', 'bcd', 'EF'), 79 self.normpath('a', 'bcd', 'efg') 80 ]) 81 self.assertSequenceEqual( 82 self.glob('a', 'bcd', '*g'), [self.normpath('a', 'bcd', 'efg')]) 83 84 def test_glob_directory_names(self): 85 self.assertSequenceEqual( 86 self.glob('*', 'D'), [self.normpath('a', 'D')]) 87 self.assertSequenceEqual(self.glob('*', '*a'), []) 88 self.assertSequenceEqual( 89 self.glob('a', '*', '*', '*a'), 90 [self.normpath('a', 'bcd', 'efg', 'ha')]) 91 self.assertSequenceEqual( 92 self.glob('?a?', '*F'), 93 map(self.normpath, [os.path.join('aaa', 'zzzF'), 94 os.path.join('aab', 'F')])) 95 96 def test_glob_directory_with_trailing_slash(self): 97 # We are verifying that when there is wildcard pattern which 98 # ends with os.sep doesn't blow up. 99 paths = glob.glob('*' + os.sep) 100 self.assertEqual(len(paths), 4) 101 self.assertTrue(all([os.sep in path for path in paths])) 102