11"""Tests for distutils.filelist."""
2+ import os
23import re
34import unittest
45from distutils import debug
910from test .support import captured_stdout , run_unittest
1011from distutils .tests import support
1112
13+ MANIFEST_IN = """\
14+ include ok
15+ include xo
16+ exclude xo
17+ include foo.tmp
18+ include buildout.cfg
19+ global-include *.x
20+ global-include *.txt
21+ global-exclude *.tmp
22+ recursive-include f *.oo
23+ recursive-exclude global *.x
24+ graft dir
25+ prune dir3
26+ """
27+
28+
29+ def make_local_path (s ):
30+ """Converts '/' in a string to os.sep"""
31+ return s .replace ('/' , os .sep )
32+
1233
1334class FileListTestCase (support .LoggingSilencer ,
1435 unittest .TestCase ):
@@ -22,16 +43,62 @@ def assertWarnings(self):
2243 self .clear_logs ()
2344
2445 def test_glob_to_re (self ):
25- # simple cases
26- self .assertEqual (glob_to_re ('foo*' ), 'foo[^/]*\\ Z(?ms)' )
27- self .assertEqual (glob_to_re ('foo?' ), 'foo[^/]\\ Z(?ms)' )
28- self .assertEqual (glob_to_re ('foo??' ), 'foo[^/][^/]\\ Z(?ms)' )
29-
30- # special cases
31- self .assertEqual (glob_to_re (r'foo\\*' ), r'foo\\\\[^/]*\Z(?ms)' )
32- self .assertEqual (glob_to_re (r'foo\\\*' ), r'foo\\\\\\[^/]*\Z(?ms)' )
33- self .assertEqual (glob_to_re ('foo????' ), r'foo[^/][^/][^/][^/]\Z(?ms)' )
34- self .assertEqual (glob_to_re (r'foo\\??' ), r'foo\\\\[^/][^/]\Z(?ms)' )
46+ sep = os .sep
47+ if os .sep == '\\ ' :
48+ sep = re .escape (os .sep )
49+
50+ for glob , regex in (
51+ # simple cases
52+ ('foo*' , r'foo[^%(sep)s]*\Z(?ms)' ),
53+ ('foo?' , r'foo[^%(sep)s]\Z(?ms)' ),
54+ ('foo??' , r'foo[^%(sep)s][^%(sep)s]\Z(?ms)' ),
55+ # special cases
56+ (r'foo\\*' , r'foo\\\\[^%(sep)s]*\Z(?ms)' ),
57+ (r'foo\\\*' , r'foo\\\\\\[^%(sep)s]*\Z(?ms)' ),
58+ ('foo????' , r'foo[^%(sep)s][^%(sep)s][^%(sep)s][^%(sep)s]\Z(?ms)' ),
59+ (r'foo\\??' , r'foo\\\\[^%(sep)s][^%(sep)s]\Z(?ms)' )):
60+ regex = regex % {'sep' : sep }
61+ self .assertEqual (glob_to_re (glob ), regex )
62+
63+ def test_process_template_line (self ):
64+ # testing all MANIFEST.in template patterns
65+ file_list = FileList ()
66+ l = make_local_path
67+
68+ # simulated file list
69+ file_list .allfiles = ['foo.tmp' , 'ok' , 'xo' , 'four.txt' ,
70+ 'buildout.cfg' ,
71+ # filelist does not filter out VCS directories,
72+ # it's sdist that does
73+ l ('.hg/last-message.txt' ),
74+ l ('global/one.txt' ),
75+ l ('global/two.txt' ),
76+ l ('global/files.x' ),
77+ l ('global/here.tmp' ),
78+ l ('f/o/f.oo' ),
79+ l ('dir/graft-one' ),
80+ l ('dir/dir2/graft2' ),
81+ l ('dir3/ok' ),
82+ l ('dir3/sub/ok.txt' ),
83+ ]
84+
85+ for line in MANIFEST_IN .split ('\n ' ):
86+ if line .strip () == '' :
87+ continue
88+ file_list .process_template_line (line )
89+
90+ wanted = ['ok' ,
91+ 'buildout.cfg' ,
92+ 'four.txt' ,
93+ l ('.hg/last-message.txt' ),
94+ l ('global/one.txt' ),
95+ l ('global/two.txt' ),
96+ l ('f/o/f.oo' ),
97+ l ('dir/graft-one' ),
98+ l ('dir/dir2/graft2' ),
99+ ]
100+
101+ self .assertEqual (file_list .files , wanted )
35102
36103 def test_debug_print (self ):
37104 file_list = FileList ()
@@ -117,6 +184,7 @@ def test_include_pattern(self):
117184 self .assertEqual (file_list .allfiles , ['a.py' , 'b.txt' ])
118185
119186 def test_process_template (self ):
187+ l = make_local_path
120188 # invalid lines
121189 file_list = FileList ()
122190 for action in ('include' , 'exclude' , 'global-include' ,
@@ -127,7 +195,7 @@ def test_process_template(self):
127195
128196 # include
129197 file_list = FileList ()
130- file_list .set_allfiles (['a.py' , 'b.txt' , 'd/c.py' ])
198+ file_list .set_allfiles (['a.py' , 'b.txt' , l ( 'd/c.py' ) ])
131199
132200 file_list .process_template_line ('include *.py' )
133201 self .assertEqual (file_list .files , ['a.py' ])
@@ -139,31 +207,31 @@ def test_process_template(self):
139207
140208 # exclude
141209 file_list = FileList ()
142- file_list .files = ['a.py' , 'b.txt' , 'd/c.py' ]
210+ file_list .files = ['a.py' , 'b.txt' , l ( 'd/c.py' ) ]
143211
144212 file_list .process_template_line ('exclude *.py' )
145- self .assertEqual (file_list .files , ['b.txt' , 'd/c.py' ])
213+ self .assertEqual (file_list .files , ['b.txt' , l ( 'd/c.py' ) ])
146214 self .assertNoWarnings ()
147215
148216 file_list .process_template_line ('exclude *.rb' )
149- self .assertEqual (file_list .files , ['b.txt' , 'd/c.py' ])
217+ self .assertEqual (file_list .files , ['b.txt' , l ( 'd/c.py' ) ])
150218 self .assertWarnings ()
151219
152220 # global-include
153221 file_list = FileList ()
154- file_list .set_allfiles (['a.py' , 'b.txt' , 'd/c.py' ])
222+ file_list .set_allfiles (['a.py' , 'b.txt' , l ( 'd/c.py' ) ])
155223
156224 file_list .process_template_line ('global-include *.py' )
157- self .assertEqual (file_list .files , ['a.py' , 'd/c.py' ])
225+ self .assertEqual (file_list .files , ['a.py' , l ( 'd/c.py' ) ])
158226 self .assertNoWarnings ()
159227
160228 file_list .process_template_line ('global-include *.rb' )
161- self .assertEqual (file_list .files , ['a.py' , 'd/c.py' ])
229+ self .assertEqual (file_list .files , ['a.py' , l ( 'd/c.py' ) ])
162230 self .assertWarnings ()
163231
164232 # global-exclude
165233 file_list = FileList ()
166- file_list .files = ['a.py' , 'b.txt' , 'd/c.py' ]
234+ file_list .files = ['a.py' , 'b.txt' , l ( 'd/c.py' ) ]
167235
168236 file_list .process_template_line ('global-exclude *.py' )
169237 self .assertEqual (file_list .files , ['b.txt' ])
@@ -175,50 +243,52 @@ def test_process_template(self):
175243
176244 # recursive-include
177245 file_list = FileList ()
178- file_list .set_allfiles (['a.py' , 'd/b.py' , 'd/c.txt' , 'd/d/e.py' ])
246+ file_list .set_allfiles (['a.py' , l ('d/b.py' ), l ('d/c.txt' ),
247+ l ('d/d/e.py' )])
179248
180249 file_list .process_template_line ('recursive-include d *.py' )
181- self .assertEqual (file_list .files , ['d/b.py' , 'd/d/e.py' ])
250+ self .assertEqual (file_list .files , [l ( 'd/b.py' ), l ( 'd/d/e.py' ) ])
182251 self .assertNoWarnings ()
183252
184253 file_list .process_template_line ('recursive-include e *.py' )
185- self .assertEqual (file_list .files , ['d/b.py' , 'd/d/e.py' ])
254+ self .assertEqual (file_list .files , [l ( 'd/b.py' ), l ( 'd/d/e.py' ) ])
186255 self .assertWarnings ()
187256
188257 # recursive-exclude
189258 file_list = FileList ()
190- file_list .files = ['a.py' , 'd/b.py' , 'd/c.txt' , 'd/d/e.py' ]
259+ file_list .files = ['a.py' , l ( 'd/b.py' ), l ( 'd/c.txt' ), l ( 'd/d/e.py' ) ]
191260
192261 file_list .process_template_line ('recursive-exclude d *.py' )
193- self .assertEqual (file_list .files , ['a.py' , 'd/c.txt' ])
262+ self .assertEqual (file_list .files , ['a.py' , l ( 'd/c.txt' ) ])
194263 self .assertNoWarnings ()
195264
196265 file_list .process_template_line ('recursive-exclude e *.py' )
197- self .assertEqual (file_list .files , ['a.py' , 'd/c.txt' ])
266+ self .assertEqual (file_list .files , ['a.py' , l ( 'd/c.txt' ) ])
198267 self .assertWarnings ()
199268
200269 # graft
201270 file_list = FileList ()
202- file_list .set_allfiles (['a.py' , 'd/b.py' , 'd/d/e.py' , 'f/f.py' ])
271+ file_list .set_allfiles (['a.py' , l ('d/b.py' ), l ('d/d/e.py' ),
272+ l ('f/f.py' )])
203273
204274 file_list .process_template_line ('graft d' )
205- self .assertEqual (file_list .files , ['d/b.py' , 'd/d/e.py' ])
275+ self .assertEqual (file_list .files , [l ( 'd/b.py' ), l ( 'd/d/e.py' ) ])
206276 self .assertNoWarnings ()
207277
208278 file_list .process_template_line ('graft e' )
209- self .assertEqual (file_list .files , ['d/b.py' , 'd/d/e.py' ])
279+ self .assertEqual (file_list .files , [l ( 'd/b.py' ), l ( 'd/d/e.py' ) ])
210280 self .assertWarnings ()
211281
212282 # prune
213283 file_list = FileList ()
214- file_list .files = ['a.py' , 'd/b.py' , 'd/d/e.py' , 'f/f.py' ]
284+ file_list .files = ['a.py' , l ( 'd/b.py' ), l ( 'd/d/e.py' ), l ( 'f/f.py' ) ]
215285
216286 file_list .process_template_line ('prune d' )
217- self .assertEqual (file_list .files , ['a.py' , 'f/f.py' ])
287+ self .assertEqual (file_list .files , ['a.py' , l ( 'f/f.py' ) ])
218288 self .assertNoWarnings ()
219289
220290 file_list .process_template_line ('prune e' )
221- self .assertEqual (file_list .files , ['a.py' , 'f/f.py' ])
291+ self .assertEqual (file_list .files , ['a.py' , l ( 'f/f.py' ) ])
222292 self .assertWarnings ()
223293
224294
0 commit comments