diff --git a/Lib/distutils/filelist.py b/Lib/distutils/filelist.py --- a/Lib/distutils/filelist.py +++ b/Lib/distutils/filelist.py @@ -172,7 +172,7 @@ log.warn(("no previously-included directories found " "matching '%s'"), dir_pattern) else: - raise DistutilsInternalError( + raise DistutilsInternalError( #pragma: NO COVER "this cannot happen: invalid action '%s'" % action) diff --git a/Lib/distutils/tests/test_filelist.py b/Lib/distutils/tests/test_filelist.py --- a/Lib/distutils/tests/test_filelist.py +++ b/Lib/distutils/tests/test_filelist.py @@ -1,11 +1,25 @@ """Tests for distutils.filelist.""" import unittest +import re -from distutils.filelist import glob_to_re, FileList +from distutils.filelist import glob_to_re, translate_pattern, FileList +from distutils.errors import DistutilsTemplateError from test.support import captured_stdout, run_unittest from distutils import debug +from distutils.tests import support +from distutils.log import WARN -class FileListTestCase(unittest.TestCase): +ANCHOR = 1 +IS_REGEX = 1 + +class FileListTestCase(support.LoggingSilencer, + unittest.TestCase): + + def assertNoWarnings(self): + self.assertEquals(len(self.get_logs(WARN)), 0) + + def assertWarnings(self): + self.assertTrue(len(self.get_logs(WARN)) > 0) def test_glob_to_re(self): # simple cases @@ -35,6 +49,174 @@ finally: debug.DEBUG = False + def test_set_allfiles(self): + file_list = FileList() + files = ['a', 'b', 'c'] + file_list.set_allfiles(files) + self.assertEqual(file_list.allfiles, files) + + def test_remove_duplicates(self): + file_list = FileList() + file_list.files = ['a', 'a', 'b', 'a'] + file_list.remove_duplicates() + # files should be sorted before-hand + self.assertEqual(file_list.files, ['a', 'b', 'a']) + + def test_translate_pattern_not_regex(self): + self.assertTrue(hasattr(translate_pattern('a', ANCHOR, None, not IS_REGEX), 'search')) + + def test_translate_pattern_is_regex_with_regex(self): + regex = re.compile('a') + self.assertEqual(translate_pattern(regex, ANCHOR, None, IS_REGEX), regex) + + def test_translate_pattern_is_regex_with_string(self): + self.assertTrue(hasattr(translate_pattern('a', ANCHOR, None, IS_REGEX), 'search')) + + def test_translate_pattern_glob_if_not_regex(self): + self.assertTrue(translate_pattern('*.py', ANCHOR, None, not IS_REGEX).search('filelist.py')) + + def test_exclude_pattern_return_false(self): + file_list = FileList() + self.assertFalse(file_list.exclude_pattern('*.py')) + + def test_exclude_pattern_return_true(self): + file_list = FileList() + file_list.files = ['a.py', 'b.py'] + self.assertTrue(file_list.exclude_pattern('*.py')) + + def test_exclude_pattern_excludes(self): + file_list = FileList() + file_list.files = ['a.py', 'a.txt'] + file_list.exclude_pattern('*.py') + self.assertEquals(file_list.files, ['a.txt']) + + def test_include_pattern_returns_false(self): + file_list = FileList() + file_list.set_allfiles([]) + self.assertFalse(file_list.include_pattern('*.py')) + + def test_include_pattern_returns_true(self): + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt']) + self.assertTrue(file_list.include_pattern('*.py')) + + def test_include_pattern_loads_allfiles(self): + file_list = FileList() + self.assertTrue(file_list.allfiles == None) + file_list.include_pattern('*') + self.assertTrue(file_list.allfiles != None) + + def test_process_template_line_raise_on_invalid_parse(self): + file_list = FileList() + for action in ('include', + 'exclude', + 'global-include', + 'global-exclude', + 'recursive-include', + 'recursive-exclude', + 'graft', + 'prune', + 'blarg'): + self.assertRaises(DistutilsTemplateError, + file_list.process_template_line, + action) + + def test_process_template_line_include(self): + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt', 'd/c.py']) + + file_list.process_template_line('include *.py') + self.assertEquals(file_list.files, ['a.py']) + self.assertNoWarnings() + + file_list.process_template_line('include *.rb') + self.assertEquals(file_list.files, ['a.py']) + self.assertWarnings() + + def test_process_template_line_exclude(self): + file_list = FileList() + file_list.files = ['a.py', 'b.txt', 'd/c.py'] + + file_list.process_template_line('exclude *.py') + self.assertEquals(file_list.files, ['b.txt', 'd/c.py']) + self.assertNoWarnings() + + file_list.process_template_line('exclude *.rb') + self.assertEquals(file_list.files, ['b.txt', 'd/c.py']) + self.assertWarnings() + + def test_process_template_line_global_include(self): + file_list = FileList() + file_list.set_allfiles(['a.py', 'b.txt', 'd/c.py']) + + file_list.process_template_line('global-include *.py') + self.assertEquals(file_list.files, ['a.py', 'd/c.py']) + self.assertNoWarnings() + + file_list.process_template_line('global-include *.rb') + self.assertEquals(file_list.files, ['a.py', 'd/c.py']) + self.assertWarnings() + + def test_process_template_line_global_exclude(self): + file_list = FileList() + file_list.files = ['a.py', 'b.txt', 'd/c.py'] + + file_list.process_template_line('global-exclude *.py') + self.assertEquals(file_list.files, ['b.txt']) + self.assertNoWarnings() + + file_list.process_template_line('global-exclude *.rb') + self.assertEquals(file_list.files, ['b.txt']) + self.assertWarnings() + + def test_process_template_line_recursive_include(self): + file_list = FileList() + file_list.set_allfiles(['a.py', 'd/b.py', 'd/c.txt', 'd/d/e.py']) + + file_list.process_template_line('recursive-include d *.py') + self.assertEquals(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertNoWarnings() + + file_list.process_template_line('recursive-include e *.py') + self.assertEquals(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertWarnings() + + def test_process_template_line_recursive_exclude(self): + file_list = FileList() + file_list.files = ['a.py', 'd/b.py', 'd/c.txt', 'd/d/e.py'] + + file_list.process_template_line('recursive-exclude d *.py') + self.assertEquals(file_list.files, ['a.py', 'd/c.txt']) + self.assertNoWarnings() + + file_list.process_template_line('recursive-exclude e *.py') + self.assertEquals(file_list.files, ['a.py', 'd/c.txt']) + self.assertWarnings() + + def test_process_template_line_graft(self): + file_list = FileList() + file_list.set_allfiles(['a.py', 'd/b.py', 'd/d/e.py', 'f/f.py']) + + file_list.process_template_line('graft d') + self.assertEquals(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertNoWarnings() + + file_list.process_template_line('graft e') + self.assertEquals(file_list.files, ['d/b.py', 'd/d/e.py']) + self.assertWarnings() + + def test_process_template_line_prune(self): + file_list = FileList() + file_list.files = ['a.py', 'd/b.py', 'd/d/e.py', 'f/f.py'] + + file_list.process_template_line('prune d') + self.assertEquals(file_list.files, ['a.py', 'f/f.py']) + self.assertNoWarnings() + + file_list.process_template_line('prune e') + self.assertEquals(file_list.files, ['a.py', 'f/f.py']) + self.assertWarnings() + def test_suite(): return unittest.makeSuite(FileListTestCase)