11"""Tests for distutils.filelist."""
2+ import re
23import unittest
4+ from distutils import debug
5+ from distutils .log import WARN
6+ from distutils .errors import DistutilsTemplateError
7+ from distutils .filelist import glob_to_re , translate_pattern , FileList
38
4- from distutils .filelist import glob_to_re , FileList
59from test .support import captured_stdout , run_unittest
6- from distutils import debug
10+ from distutils .tests import support
11+
12+
13+ class FileListTestCase (support .LoggingSilencer ,
14+ unittest .TestCase ):
715
8- class FileListTestCase (unittest .TestCase ):
16+ def assertNoWarnings (self ):
17+ self .assertEqual (self .get_logs (WARN ), [])
18+ self .clear_logs ()
19+
20+ def assertWarnings (self ):
21+ self .assertGreater (len (self .get_logs (WARN )), 0 )
22+ self .clear_logs ()
923
1024 def test_glob_to_re (self ):
1125 # simple cases
@@ -23,18 +37,191 @@ def test_debug_print(self):
2337 file_list = FileList ()
2438 with captured_stdout () as stdout :
2539 file_list .debug_print ('xxx' )
26- stdout .seek (0 )
27- self .assertEqual (stdout .read (), '' )
40+ self .assertEqual (stdout .getvalue (), '' )
2841
2942 debug .DEBUG = True
3043 try :
3144 with captured_stdout () as stdout :
3245 file_list .debug_print ('xxx' )
33- stdout .seek (0 )
34- self .assertEqual (stdout .read (), 'xxx\n ' )
46+ self .assertEqual (stdout .getvalue (), 'xxx\n ' )
3547 finally :
3648 debug .DEBUG = False
3749
50+ def test_set_allfiles (self ):
51+ file_list = FileList ()
52+ files = ['a' , 'b' , 'c' ]
53+ file_list .set_allfiles (files )
54+ self .assertEqual (file_list .allfiles , files )
55+
56+ def test_remove_duplicates (self ):
57+ file_list = FileList ()
58+ file_list .files = ['a' , 'b' , 'a' , 'g' , 'c' , 'g' ]
59+ # files must be sorted beforehand (sdist does it)
60+ file_list .sort ()
61+ file_list .remove_duplicates ()
62+ self .assertEqual (file_list .files , ['a' , 'b' , 'c' , 'g' ])
63+
64+ def test_translate_pattern (self ):
65+ # not regex
66+ self .assertTrue (hasattr (
67+ translate_pattern ('a' , anchor = True , is_regex = False ),
68+ 'search' ))
69+
70+ # is a regex
71+ regex = re .compile ('a' )
72+ self .assertEqual (
73+ translate_pattern (regex , anchor = True , is_regex = True ),
74+ regex )
75+
76+ # plain string flagged as regex
77+ self .assertTrue (hasattr (
78+ translate_pattern ('a' , anchor = True , is_regex = True ),
79+ 'search' ))
80+
81+ # glob support
82+ self .assertTrue (translate_pattern (
83+ '*.py' , anchor = True , is_regex = False ).search ('filelist.py' ))
84+
85+ def test_exclude_pattern (self ):
86+ # return False if no match
87+ file_list = FileList ()
88+ self .assertFalse (file_list .exclude_pattern ('*.py' ))
89+
90+ # return True if files match
91+ file_list = FileList ()
92+ file_list .files = ['a.py' , 'b.py' ]
93+ self .assertTrue (file_list .exclude_pattern ('*.py' ))
94+
95+ # test excludes
96+ file_list = FileList ()
97+ file_list .files = ['a.py' , 'a.txt' ]
98+ file_list .exclude_pattern ('*.py' )
99+ self .assertEqual (file_list .files , ['a.txt' ])
100+
101+ def test_include_pattern (self ):
102+ # return False if no match
103+ file_list = FileList ()
104+ file_list .set_allfiles ([])
105+ self .assertFalse (file_list .include_pattern ('*.py' ))
106+
107+ # return True if files match
108+ file_list = FileList ()
109+ file_list .set_allfiles (['a.py' , 'b.txt' ])
110+ self .assertTrue (file_list .include_pattern ('*.py' ))
111+
112+ # test * matches all files
113+ file_list = FileList ()
114+ self .assertIsNone (file_list .allfiles )
115+ file_list .set_allfiles (['a.py' , 'b.txt' ])
116+ file_list .include_pattern ('*' )
117+ self .assertEqual (file_list .allfiles , ['a.py' , 'b.txt' ])
118+
119+ def test_process_template (self ):
120+ # invalid lines
121+ file_list = FileList ()
122+ for action in ('include' , 'exclude' , 'global-include' ,
123+ 'global-exclude' , 'recursive-include' ,
124+ 'recursive-exclude' , 'graft' , 'prune' , 'blarg' ):
125+ self .assertRaises (DistutilsTemplateError ,
126+ file_list .process_template_line , action )
127+
128+ # include
129+ file_list = FileList ()
130+ file_list .set_allfiles (['a.py' , 'b.txt' , 'd/c.py' ])
131+
132+ file_list .process_template_line ('include *.py' )
133+ self .assertEqual (file_list .files , ['a.py' ])
134+ self .assertNoWarnings ()
135+
136+ file_list .process_template_line ('include *.rb' )
137+ self .assertEqual (file_list .files , ['a.py' ])
138+ self .assertWarnings ()
139+
140+ # exclude
141+ file_list = FileList ()
142+ file_list .files = ['a.py' , 'b.txt' , 'd/c.py' ]
143+
144+ file_list .process_template_line ('exclude *.py' )
145+ self .assertEqual (file_list .files , ['b.txt' , 'd/c.py' ])
146+ self .assertNoWarnings ()
147+
148+ file_list .process_template_line ('exclude *.rb' )
149+ self .assertEqual (file_list .files , ['b.txt' , 'd/c.py' ])
150+ self .assertWarnings ()
151+
152+ # global-include
153+ file_list = FileList ()
154+ file_list .set_allfiles (['a.py' , 'b.txt' , 'd/c.py' ])
155+
156+ file_list .process_template_line ('global-include *.py' )
157+ self .assertEqual (file_list .files , ['a.py' , 'd/c.py' ])
158+ self .assertNoWarnings ()
159+
160+ file_list .process_template_line ('global-include *.rb' )
161+ self .assertEqual (file_list .files , ['a.py' , 'd/c.py' ])
162+ self .assertWarnings ()
163+
164+ # global-exclude
165+ file_list = FileList ()
166+ file_list .files = ['a.py' , 'b.txt' , 'd/c.py' ]
167+
168+ file_list .process_template_line ('global-exclude *.py' )
169+ self .assertEqual (file_list .files , ['b.txt' ])
170+ self .assertNoWarnings ()
171+
172+ file_list .process_template_line ('global-exclude *.rb' )
173+ self .assertEqual (file_list .files , ['b.txt' ])
174+ self .assertWarnings ()
175+
176+ # recursive-include
177+ file_list = FileList ()
178+ file_list .set_allfiles (['a.py' , 'd/b.py' , 'd/c.txt' , 'd/d/e.py' ])
179+
180+ file_list .process_template_line ('recursive-include d *.py' )
181+ self .assertEqual (file_list .files , ['d/b.py' , 'd/d/e.py' ])
182+ self .assertNoWarnings ()
183+
184+ file_list .process_template_line ('recursive-include e *.py' )
185+ self .assertEqual (file_list .files , ['d/b.py' , 'd/d/e.py' ])
186+ self .assertWarnings ()
187+
188+ # recursive-exclude
189+ file_list = FileList ()
190+ file_list .files = ['a.py' , 'd/b.py' , 'd/c.txt' , 'd/d/e.py' ]
191+
192+ file_list .process_template_line ('recursive-exclude d *.py' )
193+ self .assertEqual (file_list .files , ['a.py' , 'd/c.txt' ])
194+ self .assertNoWarnings ()
195+
196+ file_list .process_template_line ('recursive-exclude e *.py' )
197+ self .assertEqual (file_list .files , ['a.py' , 'd/c.txt' ])
198+ self .assertWarnings ()
199+
200+ # graft
201+ file_list = FileList ()
202+ file_list .set_allfiles (['a.py' , 'd/b.py' , 'd/d/e.py' , 'f/f.py' ])
203+
204+ file_list .process_template_line ('graft d' )
205+ self .assertEqual (file_list .files , ['d/b.py' , 'd/d/e.py' ])
206+ self .assertNoWarnings ()
207+
208+ file_list .process_template_line ('graft e' )
209+ self .assertEqual (file_list .files , ['d/b.py' , 'd/d/e.py' ])
210+ self .assertWarnings ()
211+
212+ # prune
213+ file_list = FileList ()
214+ file_list .files = ['a.py' , 'd/b.py' , 'd/d/e.py' , 'f/f.py' ]
215+
216+ file_list .process_template_line ('prune d' )
217+ self .assertEqual (file_list .files , ['a.py' , 'f/f.py' ])
218+ self .assertNoWarnings ()
219+
220+ file_list .process_template_line ('prune e' )
221+ self .assertEqual (file_list .files , ['a.py' , 'f/f.py' ])
222+ self .assertWarnings ()
223+
224+
38225def test_suite ():
39226 return unittest .makeSuite (FileListTestCase )
40227
0 commit comments