1edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport glob 2edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport os 3edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport shutil 4edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport sys 5edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport unittest 6edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 7edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepfrom test.test_support import run_unittest, TESTFN 8edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 9edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 10edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepdef fsdecode(s): 11edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep return unicode(s, sys.getfilesystemencoding()) 12edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 13edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 14edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass GlobTests(unittest.TestCase): 15edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 16edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def norm(self, *parts): 17edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep return os.path.normpath(os.path.join(self.tempdir, *parts)) 18edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 19edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def mktemp(self, *parts): 20edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep filename = self.norm(*parts) 21edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep base, file = os.path.split(filename) 22edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if not os.path.exists(base): 23edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.makedirs(base) 24edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep f = open(filename, 'w') 25edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep f.close() 26edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 27edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def setUp(self): 28edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.tempdir = TESTFN + "_dir" 29edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.mktemp('a', 'D') 30edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.mktemp('aab', 'F') 31edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.mktemp('.aa', 'G') 32edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.mktemp('.bb', 'H') 33edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.mktemp('aaa', 'zzzF') 34edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.mktemp('ZZZ') 35edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.mktemp('a', 'bcd', 'EF') 36edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.mktemp('a', 'bcd', 'efg', 'ha') 37edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if hasattr(os, 'symlink'): 38edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.symlink(self.norm('broken'), self.norm('sym1')) 39edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.symlink('broken', self.norm('sym2')) 40edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.symlink(os.path.join('a', 'bcd'), self.norm('sym3')) 41edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 42edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def tearDown(self): 43edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep shutil.rmtree(self.tempdir) 44edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 45edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def glob(self, *parts): 46edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if len(parts) == 1: 47edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pattern = parts[0] 48edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep else: 49edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pattern = os.path.join(*parts) 50edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep p = os.path.join(self.tempdir, pattern) 51edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep res = glob.glob(p) 52edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(list(glob.iglob(p)), res) 53edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ures = [fsdecode(x) for x in res] 54edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(glob.glob(fsdecode(p)), ures) 55edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(list(glob.iglob(fsdecode(p))), ures) 56edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep return res 57edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 58edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def assertSequencesEqual_noorder(self, l1, l2): 59edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep l1 = list(l1) 60edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep l2 = list(l2) 61edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(set(l1), set(l2)) 62edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(sorted(l1), sorted(l2)) 63edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 64edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_glob_literal(self): 65edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq = self.assertSequencesEqual_noorder 66edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('a'), [self.norm('a')]) 67edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('a', 'D'), [self.norm('a', 'D')]) 68edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('aab'), [self.norm('aab')]) 69edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('zymurgy'), []) 70edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 71edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep res = glob.glob('*') 72edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual({type(r) for r in res}, {str}) 73edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep res = glob.glob(os.path.join(os.curdir, '*')) 74edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual({type(r) for r in res}, {str}) 75edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 76edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # test return types are unicode, but only if os.listdir 77edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # returns unicode filenames 78edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep tmp = os.listdir(fsdecode(os.curdir)) 79edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if {type(x) for x in tmp} == {unicode}: 80edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep res = glob.glob(u'*') 81edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual({type(r) for r in res}, {unicode}) 82edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep res = glob.glob(os.path.join(fsdecode(os.curdir), u'*')) 83edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual({type(r) for r in res}, {unicode}) 84edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 85edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_glob_one_directory(self): 86edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq = self.assertSequencesEqual_noorder 87edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('a*'), map(self.norm, ['a', 'aab', 'aaa'])) 88edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('*a'), map(self.norm, ['a', 'aaa'])) 89edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('.*'), map(self.norm, ['.aa', '.bb'])) 90edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('?aa'), map(self.norm, ['aaa'])) 91edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('aa?'), map(self.norm, ['aaa', 'aab'])) 92edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('aa[ab]'), map(self.norm, ['aaa', 'aab'])) 93edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('*q'), []) 94edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 95edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_glob_nested_directory(self): 96edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq = self.assertSequencesEqual_noorder 97edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if os.path.normcase("abCD") == "abCD": 98edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # case-sensitive filesystem 99edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF')]) 100edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep else: 101edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # case insensitive filesystem 102edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF'), 103edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.norm('a', 'bcd', 'efg')]) 104edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('a', 'bcd', '*g'), [self.norm('a', 'bcd', 'efg')]) 105edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 106edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_glob_directory_names(self): 107edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq = self.assertSequencesEqual_noorder 108edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('*', 'D'), [self.norm('a', 'D')]) 109edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('*', '*a'), []) 110edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('a', '*', '*', '*a'), 111edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep [self.norm('a', 'bcd', 'efg', 'ha')]) 112edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('?a?', '*F'), [self.norm('aaa', 'zzzF'), 113edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.norm('aab', 'F')]) 114edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 115edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_glob_directory_with_trailing_slash(self): 116edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Patterns ending with a slash shouldn't match non-dirs 117edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep res = glob.glob(self.norm('Z*Z') + os.sep) 118edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(res, []) 119edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep res = glob.glob(self.norm('ZZZ') + os.sep) 120edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(res, []) 121edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # When there is a wildcard pattern which ends with os.sep, glob() 122edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # doesn't blow up. 123edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep res = glob.glob(self.norm('aa*') + os.sep) 124edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(res), 2) 125edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # either of these results is reasonable 126edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIn(set(res), [ 127edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep {self.norm('aaa'), self.norm('aab')}, 128edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep {self.norm('aaa') + os.sep, self.norm('aab') + os.sep}, 129edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ]) 130edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 131edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_glob_unicode_directory_with_trailing_slash(self): 132edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Same as test_glob_directory_with_trailing_slash, but with an 133edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # unicode argument. 134edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep res = glob.glob(fsdecode(self.norm('Z*Z') + os.sep)) 135edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(res, []) 136edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep res = glob.glob(fsdecode(self.norm('ZZZ') + os.sep)) 137edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(res, []) 138edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep res = glob.glob(fsdecode(self.norm('aa*') + os.sep)) 139edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(res), 2) 140edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # either of these results is reasonable 141edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIn(set(res), [ 142edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep {fsdecode(self.norm('aaa')), fsdecode(self.norm('aab'))}, 143edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep {fsdecode(self.norm('aaa') + os.sep), 144edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep fsdecode(self.norm('aab') + os.sep)}, 145edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ]) 146edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 147edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep @unittest.skipUnless(hasattr(os, 'symlink'), "Requires symlink support") 148edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_glob_symlinks(self): 149edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq = self.assertSequencesEqual_noorder 150edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('sym3'), [self.norm('sym3')]) 151edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('sym3', '*'), [self.norm('sym3', 'EF'), 152edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.norm('sym3', 'efg')]) 153edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIn(self.glob('sym3' + os.sep), 154edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep [[self.norm('sym3')], [self.norm('sym3') + os.sep]]) 155edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('*', '*F'), 156edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep [self.norm('aaa', 'zzzF'), self.norm('aab', 'F'), 157edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.norm('sym3', 'EF')]) 158edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 159edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep @unittest.skipUnless(hasattr(os, 'symlink'), "Requires symlink support") 160edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_glob_broken_symlinks(self): 161edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq = self.assertSequencesEqual_noorder 162edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('sym*'), [self.norm('sym1'), self.norm('sym2'), 163edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.norm('sym3')]) 164edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('sym1'), [self.norm('sym1')]) 165edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(self.glob('sym2'), [self.norm('sym2')]) 166edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 167edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep @unittest.skipUnless(sys.platform == "win32", "Win32 specific test") 168edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_glob_magic_in_drive(self): 169edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq = self.assertSequencesEqual_noorder 170edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(glob.glob('*:'), []) 171edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(glob.glob(u'*:'), []) 172edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(glob.glob('?:'), []) 173edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eq(glob.glob(u'?:'), []) 174edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 175edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 176edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepdef test_main(): 177edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep run_unittest(GlobTests) 178edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 179edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 180edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepif __name__ == "__main__": 181edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep test_main() 182