143 lines
5.7 KiB
Python
143 lines
5.7 KiB
Python
|
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])
|