Skip to content

Commit 9c78ced

Browse files
committed
force paths to str before joining in canconical_filename
``` ================================== FAILURES =================================== ________________ UnicodeFilePathsTest.test_accented_directory _________________ [gw1] win32 -- Python 2.7.17 C:\projects\coveragepy\.tox\py27\Scripts\python.EXE args = (<tests.test_process.UnicodeFilePathsTest testMethod=test_accented_directory>,) kwargs = {} @functools.wraps(method) def _wrapper(*args, **kwargs): try: > result = method(*args, **kwargs) tests\coveragetest.py:47: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests\test_process.py:1320: in test_accented_directory self.assertEqual(out, "accented\n") E AssertionError: 'Traceback (most recent call last):\n File "C:\\projects\\coveragepy\\.tox\\py2 [truncated]... != 'accented\n' E + accented E - Traceback (most recent call last): E - File "C:\projects\coveragepy\.tox\py27\Scripts\coverage-script.py", line 11, in <module> E - load_entry_point('coverage', 'console_scripts', 'coverage')() E - File "c:\projects\coveragepy\coverage\cmdline.py", line 865, in main E - status = CoverageScript().command_line(argv) E - File "c:\projects\coveragepy\coverage\cmdline.py", line 582, in command_line E - return self.do_run(options, args) E - File "c:\projects\coveragepy\coverage\cmdline.py", line 737, in do_run E - self.coverage.start() E - File "c:\projects\coveragepy\coverage\control.py", line 524, in start E - self._init() E - File "c:\projects\coveragepy\coverage\control.py", line 253, in _init E - self._debug = DebugControl(self.config.debug, self._debug_file) E - File "c:\projects\coveragepy\coverage\debug.py", line 36, in __init__ E - def __init__(self, options, output): E - File "c:\projects\coveragepy\coverage\pytracer.py", line 135, in _trace E - disp = self.should_trace(filename, frame) E - File "c:\projects\coveragepy\coverage\control.py", line 315, in _should_trace E - disp = self._inorout.should_trace(filename, frame) E - File "c:\projects\coveragepy\coverage\inorout.py", line 309, in should_trace E - reason = self.check_include_omit_etc(disp.source_filename, frame) E - File "c:\projects\coveragepy\coverage\inorout.py", line 339, in check_include_omit_etc E - if self.source_match.match(filename): E - File "c:\projects\coveragepy\coverage\files.py", line 232, in match E - fpath = self.aliases.map(fpath) E - File "c:\projects\coveragepy\coverage\files.py", line 413, in map E - new = canonical_filename(new) E - File "<decorator-gen-2>", line 2, in canonical_filename E - File "C:\projects\coveragepy\.tox\py27\lib\site-packages\contracts\main.py", line 270, in contracts_checker E - result = function_(*args, **kwargs) E - File "c:\projects\coveragepy\coverage\files.py", line 67, in canonical_filename E - f = os.path.join(path, filename) E - File "c:\python27\lib\ntpath.py", line 85, in join E - result_path = result_path + p_path E - UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 124: ordinal not in range(128) E - Coverage.py warning: Trace function changed, measurement is likely wrong: None (trace-changed) ---------------------------- Captured stdout call ----------------------------- Traceback (most recent call last): File "C:\projects\coveragepy\.tox\py27\Scripts\coverage-script.py", line 11, in <module> load_entry_point('coverage', 'console_scripts', 'coverage')() File "c:\projects\coveragepy\coverage\cmdline.py", line 865, in main status = CoverageScript().command_line(argv) File "c:\projects\coveragepy\coverage\cmdline.py", line 582, in command_line return self.do_run(options, args) File "c:\projects\coveragepy\coverage\cmdline.py", line 737, in do_run self.coverage.start() File "c:\projects\coveragepy\coverage\control.py", line 524, in start self._init() File "c:\projects\coveragepy\coverage\control.py", line 253, in _init self._debug = DebugControl(self.config.debug, self._debug_file) File "c:\projects\coveragepy\coverage\debug.py", line 36, in __init__ def __init__(self, options, output): File "c:\projects\coveragepy\coverage\pytracer.py", line 135, in _trace disp = self.should_trace(filename, frame) File "c:\projects\coveragepy\coverage\control.py", line 315, in _should_trace disp = self._inorout.should_trace(filename, frame) File "c:\projects\coveragepy\coverage\inorout.py", line 309, in should_trace reason = self.check_include_omit_etc(disp.source_filename, frame) File "c:\projects\coveragepy\coverage\inorout.py", line 339, in check_include_omit_etc if self.source_match.match(filename): File "c:\projects\coveragepy\coverage\files.py", line 232, in match fpath = self.aliases.map(fpath) File "c:\projects\coveragepy\coverage\files.py", line 413, in map new = canonical_filename(new) File "<decorator-gen-2>", line 2, in canonical_filename File "C:\projects\coveragepy\.tox\py27\lib\site-packages\contracts\main.py", line 270, in contracts_checker result = function_(*args, **kwargs) File "c:\projects\coveragepy\coverage\files.py", line 67, in canonical_filename f = os.path.join(path, filename) File "c:\python27\lib\ntpath.py", line 85, in join result_path = result_path + p_path UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 124: ordinal not in range(128) Coverage.py warning: Trace function changed, measurement is likely wrong: None (trace-changed) =========================== short test summary info =========================== ```
1 parent 1062d3c commit 9c78ced

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

coverage/files.py

+20-4
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,13 @@ def canonical_filename(filename):
6464
for path in [os.curdir] + sys.path:
6565
if path is None:
6666
continue
67-
f = os.path.join(path, filename)
67+
6868
try:
69-
exists = os.path.exists(f)
69+
f = os.path.join(str_filename(path), str_filename(filename))
7070
except UnicodeError:
71-
exists = False
72-
if exists:
71+
continue
72+
73+
if os.path.exists(f):
7374
cf = f
7475
break
7576
cf = abs_file(cf)
@@ -143,6 +144,21 @@ def actual_path(filename):
143144
return filename
144145

145146

147+
if env.PY2:
148+
def str_filename(filename):
149+
return (
150+
filename
151+
if isinstance(filename, str)
152+
else filename.encode(
153+
sys.getfilesystemencoding() or sys.getdefaultencoding()
154+
)
155+
)
156+
else:
157+
@contract(filename='unicode', returns='unicode')
158+
def str_filename(filename):
159+
return filename
160+
161+
146162
if env.PY2:
147163
@contract(returns='unicode')
148164
def unicode_filename(filename):

0 commit comments

Comments
 (0)