summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Behnel <stefan_ml@behnel.de>2019-01-17 18:19:54 +0100
committerGitHub <noreply@github.com>2019-01-17 18:19:54 +0100
commit40ddd70915c33d6f2a9491085941fe2886e81cd0 (patch)
treeb854bb00b8ef3cf83bc4018610e1f0f59520c393
parent99d273059b11a6ab354549c8f52a11e919e4e626 (diff)
parentbd44de56407ab970fc65a631a856b9956613a21a (diff)
downloadcython-40ddd70915c33d6f2a9491085941fe2886e81cd0.tar.gz
Merge pull request #2784 from wjsi/master
Fix inconsistency between traced files and reported files
-rw-r--r--Cython/Coverage.py6
-rw-r--r--tests/run/coverage_installed_pkg.srctree71
2 files changed, 75 insertions, 2 deletions
diff --git a/Cython/Coverage.py b/Cython/Coverage.py
index f05e2b650..fa2f0ede1 100644
--- a/Cython/Coverage.py
+++ b/Cython/Coverage.py
@@ -74,7 +74,7 @@ class Plugin(CoveragePlugin):
if c_file is None:
c_file, py_file = self._find_source_files(filename)
if not c_file:
- return None
+ return None # unknown file
# parse all source file paths and lines from C file
# to learn about all relevant source files right away (pyx/pxi/pxd)
@@ -82,7 +82,9 @@ class Plugin(CoveragePlugin):
# is not from the main .pyx file but a file with a different
# name than the .c file (which prevents us from finding the
# .c file)
- self._parse_lines(c_file, filename)
+ _, code = self._parse_lines(c_file, filename)
+ if code is None:
+ return None # no source found
if self._file_path_map is None:
self._file_path_map = {}
diff --git a/tests/run/coverage_installed_pkg.srctree b/tests/run/coverage_installed_pkg.srctree
new file mode 100644
index 000000000..7d70f7a45
--- /dev/null
+++ b/tests/run/coverage_installed_pkg.srctree
@@ -0,0 +1,71 @@
+# mode: run
+# tag: coverage,trace
+
+"""
+PYTHON setup.py build_ext -i
+PYTHON -c "import shutil; shutil.move('ext_src/ext_pkg', 'ext_pkg')"
+PYTHON -m coverage run coverage_test.py
+PYTHON -m coverage report
+"""
+
+######## setup.py ########
+from distutils.core import setup, Extension
+from Cython.Build import cythonize
+
+setup(ext_modules = cythonize([
+ 'pkg/*.pyx',
+]))
+
+setup(
+ name='ext_pkg',
+ package_dir={'': 'ext_src'},
+ ext_modules = cythonize([
+ Extension('ext_pkg._mul', ['ext_src/ext_pkg/mul.py'])
+ ]),
+)
+
+
+######## .coveragerc ########
+[run]
+plugins = Cython.Coverage
+
+
+######## pkg/__init__.py ########
+from .test_ext_import import test_add
+
+
+######## pkg/test_ext_import.pyx ########
+# cython: linetrace=True
+# distutils: define_macros=CYTHON_TRACE=1
+
+import ext_pkg
+
+
+cpdef test_add(int a, int b):
+ return a + ext_pkg.test_mul(b, 2)
+
+
+######## ext_src/ext_pkg/__init__.py ########
+from .mul import test_mul
+
+
+######## ext_src/ext_pkg/mul.py ########
+from __future__ import absolute_import
+
+
+def test_mul(a, b):
+ return a * b
+
+
+try:
+ from ._mul import *
+except ImportError:
+ pass
+
+
+######## coverage_test.py ########
+
+from pkg import test_add
+
+
+assert 5 == test_add(1, 2)