From f9063035c3c96a63ebd4041ee7e08a4f3cf4bec4 Mon Sep 17 00:00:00 2001 From: Peter Ebden Date: Mon, 13 Jul 2015 17:05:40 +0100 Subject: Add support for searching inside .pex archives similarly to .zip and .egg. --- coverage/python.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'coverage/python.py') diff --git a/coverage/python.py b/coverage/python.py index b1667f6..22ca214 100644 --- a/coverage/python.py +++ b/coverage/python.py @@ -63,7 +63,7 @@ def get_zip_bytes(filename): an empty string if the file is empty. """ - markers = ['.zip'+os.sep, '.egg'+os.sep] + markers = ['.zip'+os.sep, '.egg'+os.sep, '.pex'+os.sep] for marker in markers: if marker in filename: parts = filename.split(marker) -- cgit v1.2.1 From ec3022971e7a1b56628a9c8c7d35a50570a9bcf7 Mon Sep 17 00:00:00 2001 From: loic Date: Tue, 10 Jan 2017 16:33:14 +0100 Subject: move _source_for_file to python.py --- coverage/python.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'coverage/python.py') diff --git a/coverage/python.py b/coverage/python.py index c3ca0e1..ada21e6 100644 --- a/coverage/python.py +++ b/coverage/python.py @@ -91,6 +91,39 @@ def get_zip_bytes(filename): return None +def _source_for_file(self, filename): + """Return the source file for `filename`. + + Given a file name being traced, return the best guess as to the source + file to attribute it to. + + """ + if filename.endswith(".py"): + # .py files are themselves source files. + return filename + + elif filename.endswith((".pyc", ".pyo")): + # Bytecode files probably have source files near them. + py_filename = filename[:-1] + if os.path.exists(py_filename): + # Found a .py file, use that. + return py_filename + if env.WINDOWS: + # On Windows, it could be a .pyw file. + pyw_filename = py_filename + "w" + if os.path.exists(pyw_filename): + return pyw_filename + # Didn't find source, but it's probably the .py file we want. + return py_filename + + elif filename.endswith("$py.class"): + # Jython is easy to guess. + return filename[:-9] + ".py" + + # No idea, just use the file name as-is. + return filename + + class PythonFileReporter(FileReporter): """Report support for a Python file.""" -- cgit v1.2.1 From 5ffdccc8a588921cdaef8c3a55ecfb5ff9170309 Mon Sep 17 00:00:00 2001 From: loic Date: Tue, 10 Jan 2017 17:31:34 +0100 Subject: source_for_file helper with unit tests --- coverage/python.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'coverage/python.py') diff --git a/coverage/python.py b/coverage/python.py index ada21e6..5e142d2 100644 --- a/coverage/python.py +++ b/coverage/python.py @@ -91,7 +91,7 @@ def get_zip_bytes(filename): return None -def _source_for_file(self, filename): +def source_for_file(filename): """Return the source file for `filename`. Given a file name being traced, return the best guess as to the source -- cgit v1.2.1 From 2b304497bbad3a4a4d84f719a17ea080e4bbf708 Mon Sep 17 00:00:00 2001 From: loic Date: Tue, 10 Jan 2017 22:21:13 +0100 Subject: use the new source_for_file helper where it makes sense --- coverage/python.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'coverage/python.py') diff --git a/coverage/python.py b/coverage/python.py index 5e142d2..f75be60 100644 --- a/coverage/python.py +++ b/coverage/python.py @@ -139,13 +139,7 @@ class PythonFileReporter(FileReporter): else: filename = morf - filename = files.unicode_filename(filename) - - # .pyc files should always refer to a .py instead. - if filename.endswith(('.pyc', '.pyo')): - filename = filename[:-1] - elif filename.endswith('$py.class'): # Jython - filename = filename[:-9] + ".py" + filename = source_for_file(files.unicode_filename(filename)) super(PythonFileReporter, self).__init__(files.canonical_filename(filename)) -- cgit v1.2.1 From 50a3baf54146337172d5efc57933adceb2b2fb78 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Tue, 14 Mar 2017 13:40:14 -0400 Subject: Minimal IronPython support. IronPython is weird: 2.7.7 has "str is unicode", and unicode.encode produces unicode! f_lasti is missing, and frame globals are missing. --- coverage/python.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'coverage/python.py') diff --git a/coverage/python.py b/coverage/python.py index f75be60..9418c38 100644 --- a/coverage/python.py +++ b/coverage/python.py @@ -26,7 +26,13 @@ def read_python_source(filename): """ with open(filename, "rb") as f: - return f.read().replace(b"\r\n", b"\n").replace(b"\r", b"\n") + source = f.read() + + if env.IRONPYTHON: + # IronPython reads Unicode strings even for "rb" files. + source = bytes(source) + + return source.replace(b"\r\n", b"\n").replace(b"\r", b"\n") @contract(returns='unicode') -- cgit v1.2.1