PageRenderTime 46ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/lib-python/2.7/distutils/tests/test_filelist.py

https://bitbucket.org/kkris/pypy
Python | 299 lines | 296 code | 2 blank | 1 comment | 0 complexity | 5042cefad4941fd4d16885ec1f7d933a MD5 | raw file
  1. """Tests for distutils.filelist."""
  2. import os
  3. import re
  4. import unittest
  5. from distutils import debug
  6. from distutils.log import WARN
  7. from distutils.errors import DistutilsTemplateError
  8. from distutils.filelist import glob_to_re, translate_pattern, FileList
  9. from test.test_support import captured_stdout, run_unittest
  10. from distutils.tests import support
  11. MANIFEST_IN = """\
  12. include ok
  13. include xo
  14. exclude xo
  15. include foo.tmp
  16. include buildout.cfg
  17. global-include *.x
  18. global-include *.txt
  19. global-exclude *.tmp
  20. recursive-include f *.oo
  21. recursive-exclude global *.x
  22. graft dir
  23. prune dir3
  24. """
  25. def make_local_path(s):
  26. """Converts '/' in a string to os.sep"""
  27. return s.replace('/', os.sep)
  28. class FileListTestCase(support.LoggingSilencer,
  29. unittest.TestCase):
  30. def assertNoWarnings(self):
  31. self.assertEqual(self.get_logs(WARN), [])
  32. self.clear_logs()
  33. def assertWarnings(self):
  34. self.assertGreater(len(self.get_logs(WARN)), 0)
  35. self.clear_logs()
  36. def test_glob_to_re(self):
  37. sep = os.sep
  38. if os.sep == '\\':
  39. sep = re.escape(os.sep)
  40. for glob, regex in (
  41. # simple cases
  42. ('foo*', r'foo[^%(sep)s]*\Z(?ms)'),
  43. ('foo?', r'foo[^%(sep)s]\Z(?ms)'),
  44. ('foo??', r'foo[^%(sep)s][^%(sep)s]\Z(?ms)'),
  45. # special cases
  46. (r'foo\\*', r'foo\\\\[^%(sep)s]*\Z(?ms)'),
  47. (r'foo\\\*', r'foo\\\\\\[^%(sep)s]*\Z(?ms)'),
  48. ('foo????', r'foo[^%(sep)s][^%(sep)s][^%(sep)s][^%(sep)s]\Z(?ms)'),
  49. (r'foo\\??', r'foo\\\\[^%(sep)s][^%(sep)s]\Z(?ms)')):
  50. regex = regex % {'sep': sep}
  51. self.assertEqual(glob_to_re(glob), regex)
  52. def test_process_template_line(self):
  53. # testing all MANIFEST.in template patterns
  54. file_list = FileList()
  55. l = make_local_path
  56. # simulated file list
  57. file_list.allfiles = ['foo.tmp', 'ok', 'xo', 'four.txt',
  58. 'buildout.cfg',
  59. # filelist does not filter out VCS directories,
  60. # it's sdist that does
  61. l('.hg/last-message.txt'),
  62. l('global/one.txt'),
  63. l('global/two.txt'),
  64. l('global/files.x'),
  65. l('global/here.tmp'),
  66. l('f/o/f.oo'),
  67. l('dir/graft-one'),
  68. l('dir/dir2/graft2'),
  69. l('dir3/ok'),
  70. l('dir3/sub/ok.txt'),
  71. ]
  72. for line in MANIFEST_IN.split('\n'):
  73. if line.strip() == '':
  74. continue
  75. file_list.process_template_line(line)
  76. wanted = ['ok',
  77. 'buildout.cfg',
  78. 'four.txt',
  79. l('.hg/last-message.txt'),
  80. l('global/one.txt'),
  81. l('global/two.txt'),
  82. l('f/o/f.oo'),
  83. l('dir/graft-one'),
  84. l('dir/dir2/graft2'),
  85. ]
  86. self.assertEqual(file_list.files, wanted)
  87. def test_debug_print(self):
  88. file_list = FileList()
  89. with captured_stdout() as stdout:
  90. file_list.debug_print('xxx')
  91. self.assertEqual(stdout.getvalue(), '')
  92. debug.DEBUG = True
  93. try:
  94. with captured_stdout() as stdout:
  95. file_list.debug_print('xxx')
  96. self.assertEqual(stdout.getvalue(), 'xxx\n')
  97. finally:
  98. debug.DEBUG = False
  99. def test_set_allfiles(self):
  100. file_list = FileList()
  101. files = ['a', 'b', 'c']
  102. file_list.set_allfiles(files)
  103. self.assertEqual(file_list.allfiles, files)
  104. def test_remove_duplicates(self):
  105. file_list = FileList()
  106. file_list.files = ['a', 'b', 'a', 'g', 'c', 'g']
  107. # files must be sorted beforehand (sdist does it)
  108. file_list.sort()
  109. file_list.remove_duplicates()
  110. self.assertEqual(file_list.files, ['a', 'b', 'c', 'g'])
  111. def test_translate_pattern(self):
  112. # not regex
  113. self.assertTrue(hasattr(
  114. translate_pattern('a', anchor=True, is_regex=False),
  115. 'search'))
  116. # is a regex
  117. regex = re.compile('a')
  118. self.assertEqual(
  119. translate_pattern(regex, anchor=True, is_regex=True),
  120. regex)
  121. # plain string flagged as regex
  122. self.assertTrue(hasattr(
  123. translate_pattern('a', anchor=True, is_regex=True),
  124. 'search'))
  125. # glob support
  126. self.assertTrue(translate_pattern(
  127. '*.py', anchor=True, is_regex=False).search('filelist.py'))
  128. def test_exclude_pattern(self):
  129. # return False if no match
  130. file_list = FileList()
  131. self.assertFalse(file_list.exclude_pattern('*.py'))
  132. # return True if files match
  133. file_list = FileList()
  134. file_list.files = ['a.py', 'b.py']
  135. self.assertTrue(file_list.exclude_pattern('*.py'))
  136. # test excludes
  137. file_list = FileList()
  138. file_list.files = ['a.py', 'a.txt']
  139. file_list.exclude_pattern('*.py')
  140. self.assertEqual(file_list.files, ['a.txt'])
  141. def test_include_pattern(self):
  142. # return False if no match
  143. file_list = FileList()
  144. file_list.set_allfiles([])
  145. self.assertFalse(file_list.include_pattern('*.py'))
  146. # return True if files match
  147. file_list = FileList()
  148. file_list.set_allfiles(['a.py', 'b.txt'])
  149. self.assertTrue(file_list.include_pattern('*.py'))
  150. # test * matches all files
  151. file_list = FileList()
  152. self.assertIsNone(file_list.allfiles)
  153. file_list.set_allfiles(['a.py', 'b.txt'])
  154. file_list.include_pattern('*')
  155. self.assertEqual(file_list.allfiles, ['a.py', 'b.txt'])
  156. def test_process_template(self):
  157. l = make_local_path
  158. # invalid lines
  159. file_list = FileList()
  160. for action in ('include', 'exclude', 'global-include',
  161. 'global-exclude', 'recursive-include',
  162. 'recursive-exclude', 'graft', 'prune', 'blarg'):
  163. self.assertRaises(DistutilsTemplateError,
  164. file_list.process_template_line, action)
  165. # include
  166. file_list = FileList()
  167. file_list.set_allfiles(['a.py', 'b.txt', l('d/c.py')])
  168. file_list.process_template_line('include *.py')
  169. self.assertEqual(file_list.files, ['a.py'])
  170. self.assertNoWarnings()
  171. file_list.process_template_line('include *.rb')
  172. self.assertEqual(file_list.files, ['a.py'])
  173. self.assertWarnings()
  174. # exclude
  175. file_list = FileList()
  176. file_list.files = ['a.py', 'b.txt', l('d/c.py')]
  177. file_list.process_template_line('exclude *.py')
  178. self.assertEqual(file_list.files, ['b.txt', l('d/c.py')])
  179. self.assertNoWarnings()
  180. file_list.process_template_line('exclude *.rb')
  181. self.assertEqual(file_list.files, ['b.txt', l('d/c.py')])
  182. self.assertWarnings()
  183. # global-include
  184. file_list = FileList()
  185. file_list.set_allfiles(['a.py', 'b.txt', l('d/c.py')])
  186. file_list.process_template_line('global-include *.py')
  187. self.assertEqual(file_list.files, ['a.py', l('d/c.py')])
  188. self.assertNoWarnings()
  189. file_list.process_template_line('global-include *.rb')
  190. self.assertEqual(file_list.files, ['a.py', l('d/c.py')])
  191. self.assertWarnings()
  192. # global-exclude
  193. file_list = FileList()
  194. file_list.files = ['a.py', 'b.txt', l('d/c.py')]
  195. file_list.process_template_line('global-exclude *.py')
  196. self.assertEqual(file_list.files, ['b.txt'])
  197. self.assertNoWarnings()
  198. file_list.process_template_line('global-exclude *.rb')
  199. self.assertEqual(file_list.files, ['b.txt'])
  200. self.assertWarnings()
  201. # recursive-include
  202. file_list = FileList()
  203. file_list.set_allfiles(['a.py', l('d/b.py'), l('d/c.txt'),
  204. l('d/d/e.py')])
  205. file_list.process_template_line('recursive-include d *.py')
  206. self.assertEqual(file_list.files, [l('d/b.py'), l('d/d/e.py')])
  207. self.assertNoWarnings()
  208. file_list.process_template_line('recursive-include e *.py')
  209. self.assertEqual(file_list.files, [l('d/b.py'), l('d/d/e.py')])
  210. self.assertWarnings()
  211. # recursive-exclude
  212. file_list = FileList()
  213. file_list.files = ['a.py', l('d/b.py'), l('d/c.txt'), l('d/d/e.py')]
  214. file_list.process_template_line('recursive-exclude d *.py')
  215. self.assertEqual(file_list.files, ['a.py', l('d/c.txt')])
  216. self.assertNoWarnings()
  217. file_list.process_template_line('recursive-exclude e *.py')
  218. self.assertEqual(file_list.files, ['a.py', l('d/c.txt')])
  219. self.assertWarnings()
  220. # graft
  221. file_list = FileList()
  222. file_list.set_allfiles(['a.py', l('d/b.py'), l('d/d/e.py'),
  223. l('f/f.py')])
  224. file_list.process_template_line('graft d')
  225. self.assertEqual(file_list.files, [l('d/b.py'), l('d/d/e.py')])
  226. self.assertNoWarnings()
  227. file_list.process_template_line('graft e')
  228. self.assertEqual(file_list.files, [l('d/b.py'), l('d/d/e.py')])
  229. self.assertWarnings()
  230. # prune
  231. file_list = FileList()
  232. file_list.files = ['a.py', l('d/b.py'), l('d/d/e.py'), l('f/f.py')]
  233. file_list.process_template_line('prune d')
  234. self.assertEqual(file_list.files, ['a.py', l('f/f.py')])
  235. self.assertNoWarnings()
  236. file_list.process_template_line('prune e')
  237. self.assertEqual(file_list.files, ['a.py', l('f/f.py')])
  238. self.assertWarnings()
  239. def test_suite():
  240. return unittest.makeSuite(FileListTestCase)
  241. if __name__ == "__main__":
  242. run_unittest(test_suite())