import contextlib import os.path import sys import tempfile import unittest from io import open from os.path import join as pjoin from ..Dependencies import extended_iglob @contextlib.contextmanager def writable_file(dir_path, filename): with open(pjoin(dir_path, filename), "w", encoding="utf8") as f: yield f class TestGlobbing(unittest.TestCase): @classmethod def setUpClass(cls): cls._orig_dir = os.getcwd() if sys.version_info[0] < 3: temp_path = cls._tmpdir = tempfile.mkdtemp() else: cls._tmpdir = tempfile.TemporaryDirectory() temp_path = cls._tmpdir.name os.chdir(temp_path) for dir1 in "abcd": for dir1x in [dir1, dir1 + 'x']: for dir2 in "xyz": dir_path = pjoin(dir1x, dir2) os.makedirs(dir_path) with writable_file(dir_path, "file2_pyx.pyx") as f: f.write(u'""" PYX """') with writable_file(dir_path, "file2_py.py") as f: f.write(u'""" PY """') with writable_file(dir1x, "file1_pyx.pyx") as f: f.write(u'""" PYX """') with writable_file(dir1x, "file1_py.py") as f: f.write(u'""" PY """') @classmethod def tearDownClass(cls): os.chdir(cls._orig_dir) if sys.version_info[0] < 3: import shutil shutil.rmtree(cls._tmpdir) else: cls._tmpdir.cleanup() def files_equal(self, pattern, expected_files): expected_files = sorted(expected_files) # It's the users's choice whether '/' will appear on Windows. matched_files = sorted(path.replace('/', os.sep) for path in extended_iglob(pattern)) self.assertListEqual(matched_files, expected_files) # / # Special case for Windows: also support '\' in patterns. if os.sep == '\\' and '/' in pattern: matched_files = sorted(extended_iglob(pattern.replace('/', '\\'))) self.assertListEqual(matched_files, expected_files) # \ def test_extended_iglob_simple(self): ax_files = [pjoin("a", "x", "file2_pyx.pyx"), pjoin("a", "x", "file2_py.py")] self.files_equal("a/x/*", ax_files) self.files_equal("a/x/*.c12", []) self.files_equal("a/x/*.{py,pyx,c12}", ax_files) self.files_equal("a/x/*.{py,pyx}", ax_files) self.files_equal("a/x/*.{pyx}", ax_files[:1]) self.files_equal("a/x/*.pyx", ax_files[:1]) self.files_equal("a/x/*.{py}", ax_files[1:]) self.files_equal("a/x/*.py", ax_files[1:]) def test_extended_iglob_simple_star(self): for basedir in "ad": files = [ pjoin(basedir, dirname, filename) for dirname in "xyz" for filename in ["file2_pyx.pyx", "file2_py.py"] ] self.files_equal(basedir + "/*/*", files) self.files_equal(basedir + "/*/*.c12", []) self.files_equal(basedir + "/*/*.{py,pyx,c12}", files) self.files_equal(basedir + "/*/*.{py,pyx}", files) self.files_equal(basedir + "/*/*.{pyx}", files[::2]) self.files_equal(basedir + "/*/*.pyx", files[::2]) self.files_equal(basedir + "/*/*.{py}", files[1::2]) self.files_equal(basedir + "/*/*.py", files[1::2]) for subdir in "xy*": files = [ pjoin(basedir, dirname, filename) for dirname in "xyz" if subdir in ('*', dirname) for filename in ["file2_pyx.pyx", "file2_py.py"] ] path = basedir + '/' + subdir + '/' self.files_equal(path + "*", files) self.files_equal(path + "*.{py,pyx}", files) self.files_equal(path + "*.{pyx}", files[::2]) self.files_equal(path + "*.pyx", files[::2]) self.files_equal(path + "*.{py}", files[1::2]) self.files_equal(path + "*.py", files[1::2]) def test_extended_iglob_double_star(self): basedirs = os.listdir(".") files = [ pjoin(basedir, dirname, filename) for basedir in basedirs for dirname in "xyz" for filename in ["file2_pyx.pyx", "file2_py.py"] ] all_files = [ pjoin(basedir, filename) for basedir in basedirs for filename in ["file1_pyx.pyx", "file1_py.py"] ] + files self.files_equal("*/*/*", files) self.files_equal("*/*/**/*", files) self.files_equal("*/**/*.*", all_files) self.files_equal("**/*.*", all_files) self.files_equal("*/**/*.c12", []) self.files_equal("**/*.c12", []) self.files_equal("*/*/*.{py,pyx,c12}", files) self.files_equal("*/*/**/*.{py,pyx,c12}", files) self.files_equal("*/**/*/*.{py,pyx,c12}", files) self.files_equal("**/*/*/*.{py,pyx,c12}", files) self.files_equal("**/*.{py,pyx,c12}", all_files) self.files_equal("*/*/*.{py,pyx}", files) self.files_equal("**/*/*/*.{py,pyx}", files) self.files_equal("*/**/*/*.{py,pyx}", files) self.files_equal("**/*.{py,pyx}", all_files) self.files_equal("*/*/*.{pyx}", files[::2]) self.files_equal("**/*.{pyx}", all_files[::2]) self.files_equal("*/**/*/*.pyx", files[::2]) self.files_equal("*/*/*.pyx", files[::2]) self.files_equal("**/*.pyx", all_files[::2]) self.files_equal("*/*/*.{py}", files[1::2]) self.files_equal("**/*.{py}", all_files[1::2]) self.files_equal("*/*/*.py", files[1::2]) self.files_equal("**/*.py", all_files[1::2])