coveragepy icon indicating copy to clipboard operation
coveragepy copied to clipboard

Plugin file tracer never gets called with source files

Open Timtam opened this issue 3 years ago • 0 comments

The issue seems to be rather complex. The more in-depth explanation follows at the end of the usual bug report content.

Describe the bug

A plugin's file_tracer method doesn't seem to get called with any file of a package that should be measured, but relevant files are showing up in the coverage report anyway, causing an error like this:

coverage.exceptions.DataError: Can't add file tracer data for unmeasured file 'C:\scripts\Bass4Py\Bass4Py\bass\bass.pxd'

To Reproduce

  1. What version of Python are you using?

Python 3.8.2

  1. What version of coverage.py shows the problem? The output of coverage debug sys is helpful.

-- sys ------------------------------------------------------- coverage_version: 6.3.1 coverage_module: c:\users\toni.virtualenvs\bass4py-lj7zysza\lib\site-packages\coverage_init_.py tracer: -none- CTracer: available plugins.file_tracers: Cython.Coverage.Plugin plugins.configurers: Cython.Coverage.Plugin plugins.context_switchers: -none- configs_attempted: .coveragerc configs_read: C:\scripts\Bass4Py.coveragerc config_file: C:\scripts\Bass4Py.coveragerc config_contents: b'[run]\r\nplugins = Cython.Coverage\r\nsource = Bass4Py\r\nomit =\r\n tests\r\n *init.py' data_file: -none- python: 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)] platform: Windows-10-10.0.22000-SP0 implementation: CPython executable: c:\users\toni.virtualenvs\bass4py-lj7zysza\scripts\python.exe def_encoding: utf-8 fs_encoding: utf-8 pid: 27908 cwd: C:\scripts\Bass4Py path: C:\Users\Toni.virtualenvs\Bass4Py-Lj7zYsZA\Scripts\coverage.exe c:\users\toni.virtualenvs\bass4py-lj7zysza\scripts\python38.zip C:\Users\Toni.pyenv\pyenv-win\versions\3.8.2\DLLs C:\Users\Toni.pyenv\pyenv-win\versions\3.8.2\lib C:\Users\Toni.pyenv\pyenv-win\versions\3.8.2 c:\users\toni.virtualenvs\bass4py-lj7zysza c:\users\toni.virtualenvs\bass4py-lj7zysza\lib\site-packages environment: PIP_PYTHON_PATH = c:\users\toni.local\pipx\venvs\pipenv\scripts\python.exe PYENV_HOME = C:\Users\Toni.pyenv\pyenv-win
PYTHONDONTWRITEBYTECODE = 1 TEMP = C:\Users\Toni\AppData\Local\Temp TMP = C:\Users\Toni\AppData\Local\Temp command_line: C:\Users\Toni.virtualenvs\Bass4Py-Lj7zYsZA\Scripts\coverage debug sys sqlite3_version: 2.6.0 sqlite3_sqlite_version: 3.28.0 sqlite3_temp_store: 0 sqlite3_compile_options: COMPILER=msvc-1916; ENABLE_FTS4; ENABLE_FTS5 THREADSAFE=1

  1. What versions of what packages do you have installed? The output of pip freeze is helpful.

aenum==2.2.1 alabaster==0.7.12 appdirs==1.4.4 atomicwrites==1.4.0 attrs==21.4.0 Babel==2.9.1 black==22.1.0 bleach==4.1.0 certifi==2021.10.8 chardet==4.0.0 charset-normalizer==2.0.12 click==8.0.3 colorama==0.4.4 coverage==6.3.1 Cython==3.0.0a10 docutils==0.17.1 idna==3.3 imagesize==1.3.0 importlib-metadata==4.11.1 iniconfig==1.1.1 Jinja2==3.0.3 keyring==23.5.0 MarkupSafe==2.1.0 mypy==0.790 mypy-extensions==0.4.3 packaging==21.3 pathspec==0.9.0 pkginfo==1.8.2 platformdirs==2.5.0 pluggy==1.0.0 py==1.11.0 Pygments==2.11.2 pyparsing==3.0.7 pytest==7.0.1 pytest-cov==3.0.0 pytest-order==1.0.1 pytz==2021.3 pywin32-ctypes==0.2.0 readme-renderer==32.0 regex==2021.7.1 requests==2.27.1 requests-toolbelt==0.9.1 rfc3986==2.0.0 six==1.16.0 snowballstemmer==2.2.0 Sphinx==4.4.0 sphinx-autodoc-typehints==1.17.0 sphinxcontrib-applehelp==1.0.2 sphinxcontrib-devhelp==1.0.2 sphinxcontrib-htmlhelp==2.0.0 sphinxcontrib-jsmath==1.0.1 sphinxcontrib-qthelp==1.0.3 sphinxcontrib-serializinghtml==1.1.5 toml==0.10.2 tomli==2.0.1 tqdm==4.62.3 twine==3.8.0 typed-ast==1.4.2 typing-extensions==4.1.1 urllib3==1.26.8 webencodings==0.5.1 zipp==3.7.0

  1. What code shows the problem? Give us a specific commit of a specific repo that we can check out. If you've already worked around the problem, please provide a commit before that fix.

https://github.com/Timtam/Bass4Py/commit/d02f09541895a0bc83979ad629f1e83d99f78dca

  1. What commands did you run?

Both ways, running either within pytest-cov and pure coverage, yield the same result. Either:

coverage run -m pytest

or

pytest --cov-config=.coveragerc --cov

Expected behavior

I'd expect coverage to properly measure my Cython code which should be enabled with the help of the Cython.Coverage plugin.

Additional context

i'm currently in the process of tracking down an issue that exists since approximately Coverage.py 5.0 with a plugin which allows Coverage to measure Cython code, which can be found here: https://github.com/cython/cython/blob/master/Cython/Coverage.py

The issue is known to Cython's developers for quite a while now and i'm not sure where to even start searching and hope you can help me a bit further. The relevant issue can be found here: https://github.com/cython/cython/issues/3515

The situation is as follows:

I set up everything correctly (I hope), means that I prepared everything Cython-wise first and set up a .coveragerc file next, as you can see in the bug report above. I then make sure to compile the project with debug enabled, allowing Cython to provide any information necessary for coverage / Cython.Coverage to work with. Running coverage afterwards yields the error shown above.

I started digging into the Cython.Coverage plugin and tried to debug the file_tracer method, which I think should be called for any possible file which can be measured, which deffinitely happens, but it only gets called with site-packages like pytest and others, but never gets called with files from my actual project and never returns an actual FileTracer object to coverage.py to further work with. I'm thus confused that coverage still found a .pxd file to work with, because I think that the Cython.Coverage plugin isn't responsible for that incident. I wasn't able to find any information where coverage was able to detect the pxd file, which is deffinitely correct, but since Cython.Coverage did never return a FileTracer object, coverage obviously doesn't know how to further trace this file type. I tried to track the issue down and ended up within the C Tracer and now think that I might find the issue much faster if I can get some help from you instead of debugging through that piece of the coverage project.

Since building the project i'm working on can be rather complicated due to external dependencies and such, I provided a debug build of the Cython module in question for Python 3.8 amd64 Windows and will try to attach it to this issue so that you can download and test with it if you like. GitHub doesn't allow attaching whl files however, so I provided a download link. Hope thats okay.

https://web.cubbit.io/link/#7b1e965a-84d0-42ed-b955-bfe35f2dad10!LkZm1MtOAWSvhQrhNb3ZXMUhCA6zVdghjXxDI9aZTBA!8TINwrWKR/KE7IMroFOlhw

As I already mentioned, the issues seem to have started around the time of coverage getting updated to version 5.0. Those of you who are much more familiar with coverage and its history might know what changed during that update and thus be able to track down the issue much faster than me, I literally got into coverage about 2 days ago. Its probably just a matter of asking the right questions, but i'm not experienced enough to do so.

Steps to reproduce the issue:

  1. Create a new virtual environment with Python 3.8
  2. pip install -r requirements-dev.txt
  3. pip install path/to/the/wheel/i/provided.whl
  4. pytest --cov-config=.coveragerc --cov or coverage run -m pytest

I hope that I didn't forget anything, the problem kept me busy for quite a few hours now and I tried alot to track it down, just let me know if you need anything.

Thank you.

Timtam avatar Feb 19 '22 20:02 Timtam