|
27 | 27 | import sysconfig |
28 | 28 | import tempfile |
29 | 29 | from textwrap import dedent |
| 30 | +from types import SimpleNamespace |
30 | 31 | import urllib.error |
31 | 32 | import urllib.request |
32 | 33 | from unittest import mock |
@@ -1127,6 +1128,36 @@ def test_read_pth_file_bad_line_continues(self): |
1127 | 1128 | fullname = os.path.join(self.sitedir, 'foo.pth') |
1128 | 1129 | self.assertIn(subdir, site._pending_syspaths.get(fullname, [])) |
1129 | 1130 |
|
| 1131 | + def _flags_with_verbose(self, verbose): |
| 1132 | + # Build a sys.flags clone with verbose overridden but every |
| 1133 | + # other field preserved, so unrelated reads like |
| 1134 | + # sys.flags.optimize during io.open_code() continue to work. |
| 1135 | + attrs = {name: getattr(sys.flags, name) |
| 1136 | + for name in sys.flags.__match_args__} |
| 1137 | + attrs['verbose'] = verbose |
| 1138 | + return SimpleNamespace(**attrs) |
| 1139 | + |
| 1140 | + def test_read_pth_file_parse_error_silent_by_default(self): |
| 1141 | + # PEP 829: parse-time errors are silent unless -v is given. |
| 1142 | + # Force the error path by making makepath() raise. |
| 1143 | + self._make_pth("badline\n", name='foo') |
| 1144 | + with mock.patch('site.makepath', side_effect=ValueError("boom")), \ |
| 1145 | + mock.patch('sys.flags', self._flags_with_verbose(False)), \ |
| 1146 | + captured_stderr() as err: |
| 1147 | + site._read_pth_file(self.sitedir, 'foo.pth', set()) |
| 1148 | + self.assertEqual(err.getvalue(), "") |
| 1149 | + |
| 1150 | + def test_read_pth_file_parse_error_reported_under_verbose(self): |
| 1151 | + # PEP 829: parse-time errors are reported when -v is given. |
| 1152 | + self._make_pth("badline\n", name='foo') |
| 1153 | + with mock.patch('site.makepath', side_effect=ValueError("boom")), \ |
| 1154 | + mock.patch('sys.flags', self._flags_with_verbose(True)), \ |
| 1155 | + captured_stderr() as err: |
| 1156 | + site._read_pth_file(self.sitedir, 'foo.pth', set()) |
| 1157 | + out = err.getvalue() |
| 1158 | + self.assertIn('Error in', out) |
| 1159 | + self.assertIn('foo.pth', out) |
| 1160 | + |
1130 | 1161 | def test_read_pth_file_locale_fallback(self): |
1131 | 1162 | # PEP 829: .pth files that fail UTF-8 decoding fall back to the |
1132 | 1163 | # locale encoding for backward compatibility (deprecated in |
|
0 commit comments