Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 77466be

Browse files
committed
Branch merge
2 parents 1c67dd9 + aa2cb3a commit 77466be

6 files changed

Lines changed: 437 additions & 19 deletions

File tree

Lib/distutils/tests/test_filelist.py

Lines changed: 194 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,25 @@
11
"""Tests for distutils.filelist."""
2+
import re
23
import 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
59
from 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+
38225
def test_suite():
39226
return unittest.makeSuite(FileListTestCase)
40227

Lib/packaging/manifest.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,9 @@ def exclude_pattern(self, pattern, anchor=True, prefix=None,
147147

148148
def _parse_template_line(self, line):
149149
words = line.split()
150-
if len(words) == 1:
150+
if len(words) == 1 and words[0] not in (
151+
'include', 'exclude', 'global-include', 'global-exclude',
152+
'recursive-include', 'recursive-exclude', 'graft', 'prune'):
151153
# no action given, let's use the default 'include'
152154
words.insert(0, 'include')
153155

Lib/packaging/tests/test_command_check.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,15 @@ def test_check_metadata(self):
5656
cmd = self._run(metadata, strict=True)
5757
self.assertEqual([], self.get_logs(logging.WARNING))
5858

59+
# now a test with non-ASCII characters
60+
metadata = {'home_page': 'xxx', 'author': '\u00c9ric',
61+
'author_email': 'xxx', 'name': 'xxx',
62+
'version': '1.2',
63+
'summary': 'Something about esszet \u00df',
64+
'description': 'More things about esszet \u00df'}
65+
cmd = self._run(metadata)
66+
self.assertEqual([], self.get_logs(logging.WARNING))
67+
5968
def test_check_metadata_1_2(self):
6069
# let's run the command with no metadata at all
6170
# by default, check is checking the metadata
@@ -95,14 +104,26 @@ def test_check_metadata_1_2(self):
95104

96105
@unittest.skipUnless(_HAS_DOCUTILS, "requires docutils")
97106
def test_check_restructuredtext(self):
98-
# let's see if it detects broken rest in long_description
107+
# let's see if it detects broken rest in description
99108
broken_rest = 'title\n===\n\ntest'
100109
pkg_info, dist = self.create_dist(description=broken_rest)
101110
cmd = check(dist)
102111
cmd.check_restructuredtext()
103112
self.assertEqual(len(self.get_logs(logging.WARNING)), 1)
113+
# clear warnings from the previous call
114+
self.loghandler.flush()
115+
116+
# let's see if we have an error with strict=1
117+
metadata = {'home_page': 'xxx', 'author': 'xxx',
118+
'author_email': 'xxx',
119+
'name': 'xxx', 'version': '1.2',
120+
'description': broken_rest}
121+
self.assertRaises(PackagingSetupError, self._run, metadata,
122+
strict=True, all=True)
123+
self.loghandler.flush()
104124

105-
pkg_info, dist = self.create_dist(description='title\n=====\n\ntest')
125+
# and non-broken rest, including a non-ASCII character to test #12114
126+
dist = self.create_dist(description='title\n=====\n\ntest \u00df')[1]
106127
cmd = check(dist)
107128
cmd.check_restructuredtext()
108129
self.assertEqual([], self.get_logs(logging.WARNING))

Lib/packaging/tests/test_command_register.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -200,29 +200,26 @@ def test_password_reset(self):
200200

201201
@unittest.skipUnless(DOCUTILS_SUPPORT, 'needs docutils')
202202
def test_strict(self):
203-
# testing the script option
204-
# when on, the register command stops if
205-
# the metadata is incomplete or if
206-
# long_description is not reSt compliant
203+
# testing the strict option: when on, the register command stops if the
204+
# metadata is incomplete or if description contains bad reST
207205

208-
# empty metadata
206+
# empty metadata # XXX this is not really empty..
209207
cmd = self._get_cmd({'name': 'xxx', 'version': 'xxx'})
210208
cmd.ensure_finalized()
211209
cmd.strict = True
212210
inputs = Inputs('1', 'tarek', 'y')
213211
register_module.input = inputs
214212
self.assertRaises(PackagingSetupError, cmd.run)
215213

216-
# metadata is OK but long_description is broken
214+
# metadata is OK but description is broken
217215
metadata = {'home_page': 'xxx', 'author': 'xxx',
218216
'author_email': 'éxéxé',
219-
'name': 'xxx', 'version': 'xxx',
217+
'name': 'xxx', 'version': '4.2',
220218
'description': 'title\n==\n\ntext'}
221219

222220
cmd = self._get_cmd(metadata)
223221
cmd.ensure_finalized()
224222
cmd.strict = True
225-
226223
self.assertRaises(PackagingSetupError, cmd.run)
227224

228225
# now something that works
@@ -243,6 +240,21 @@ def test_strict(self):
243240
cmd.ensure_finalized()
244241
cmd.run()
245242

243+
# and finally a Unicode test (bug #12114)
244+
metadata = {'home_page': 'xxx', 'author': '\u00c9ric',
245+
'author_email': 'xxx', 'name': 'xxx',
246+
'version': 'xxx',
247+
'summary': 'Something about esszet \u00df',
248+
'description': 'More things about esszet \u00df'}
249+
250+
cmd = self._get_cmd(metadata)
251+
cmd.ensure_finalized()
252+
cmd.strict = True
253+
inputs = Inputs('1', 'tarek', 'y')
254+
register_module.input = inputs
255+
cmd.ensure_finalized()
256+
cmd.run()
257+
246258
def test_register_pep345(self):
247259
cmd = self._get_cmd({})
248260
cmd.ensure_finalized()

0 commit comments

Comments
 (0)