Python code coverage is missing files

Before submitting a topic, please confirm the following

I have searched for similar issues before creating this topic.
I have verified that my repository is using the Codecov GitHub app, if using GitHub
I have validated my codecov.yaml configuration file.
I have filled out the below sections to the best of my ability.
I understand that the community boards are a free, best-effort tool. While we hope to have someone on the Codecov team resolve your problem quickly, this is not always possible.

Description

Created a new monorepo with packages with Python and Javascript. The Javascript project looks fine but the Python project is missing files. Python project is using coverage tool and the data looks fine from the tool.

CI/CD URL

Please provide a link to the CI/CD run.

Codecov Output

Please provide the full output of running the uploader on your CI/CD. This will typically have the Codecov logo as ASCII.

12:09:49  + codecov --verbose --nonZero --rootDir /home/ubuntu/jenkins/workspace/cellaneous_nemesis-generator_dev --flags nemesis-generator --dir .
12:09:49  [2023-05-03T16:09:49.125Z] ['verbose'] Start of uploader: 1683130189125...
12:09:49  [2023-05-03T16:09:49.126Z] ['info'] 
12:09:49       _____          _
12:09:49      / ____|        | |
12:09:49     | |     ___   __| | ___  ___ _____   __
12:09:49     | |    / _ \ / _` |/ _ \/ __/ _ \ \ / /
12:09:49     | |___| (_) | (_| |  __/ (_| (_) \ V /
12:09:49      \_____\___/ \__,_|\___|\___\___/ \_/
12:09:49  
12:09:49    Codecov report uploader 0.5.0
12:09:49  [2023-05-03T16:09:49.126Z] ['info'] => Project root located at: /home/ubuntu/jenkins/workspace/cellaneous_nemesis-generator_dev
12:09:49  [2023-05-03T16:09:49.129Z] ['info'] ->  Token found by environment variables
12:09:49  [2023-05-03T16:09:49.130Z] ['verbose'] Start of network processing...
12:09:49  [2023-05-03T16:09:49.130Z] ['verbose'] Searching for files in /home/ubuntu/jenkins/workspace/cellaneous_nemesis-generator_dev
12:09:49  [2023-05-03T16:09:49.272Z] ['verbose'] Skipping coveragepy, no .coverage file found.
12:09:49  [2023-05-03T16:09:49.276Z] ['info'] Searching for coverage files...
12:09:49  [2023-05-03T16:09:49.357Z] ['info'] Warning: Some files located via search were excluded from upload.
12:09:49  [2023-05-03T16:09:49.358Z] ['info'] If Codecov did not locate your files, please review https://docs.codecov.com/docs/supported-report-formats
12:09:49  [2023-05-03T16:09:49.358Z] ['verbose'] Preparing to clean the following coverage paths: coverage.xml
12:09:49  [2023-05-03T16:09:49.358Z] ['info'] => Found 1 possible coverage files:
12:09:49    coverage.xml
12:09:49  [2023-05-03T16:09:49.358Z] ['verbose'] End of network processing
12:09:49  [2023-05-03T16:09:49.358Z] ['info'] Processing coverage.xml...
12:09:49  [2023-05-03T16:09:49.363Z] ['info'] Detected Jenkins CI as the CI provider.
12:09:49  [2023-05-03T16:09:49.363Z] ['verbose'] -> Using the following env variables:
12:09:49  [2023-05-03T16:09:49.364Z] ['verbose']      BRANCH_NAME: dev
12:09:49  [2023-05-03T16:09:49.364Z] ['verbose']      BUILD_NUMBER: 4
12:09:49  [2023-05-03T16:09:49.364Z] ['verbose']      BUILD_URL: https://jenkins.symboldev.com/job/Nem/job/generated/job/miscellaneous/job/nemesis-generator/job/dev/4/
12:09:49  [2023-05-03T16:09:49.364Z] ['verbose']      CHANGE_ID: undefined
12:09:49  [2023-05-03T16:09:49.364Z] ['verbose']      GIT_BRANCH: dev
12:09:49  [2023-05-03T16:09:49.364Z] ['verbose']      GIT_COMMIT: 0f9087a61ea292f3c1b7ca75ccf7e11b44b6c721
12:09:49  [2023-05-03T16:09:49.364Z] ['verbose']      JENKINS_URL: https://jenkins.symboldev.com/
12:09:49  [2023-05-03T16:09:49.364Z] ['verbose']      ghprbActualCommit: undefined
12:09:49  [2023-05-03T16:09:49.364Z] ['verbose']      ghprbPullId: undefined
12:09:49  [2023-05-03T16:09:49.364Z] ['verbose']      ghprbSourceBranch: undefined
12:09:49  [2023-05-03T16:09:49.377Z] ['verbose'] Using the following upload parameters:
12:09:49  [2023-05-03T16:09:49.377Z] ['verbose'] branch
12:09:49  [2023-05-03T16:09:49.377Z] ['verbose'] build
12:09:49  [2023-05-03T16:09:49.378Z] ['verbose'] buildURL
12:09:49  [2023-05-03T16:09:49.378Z] ['verbose'] commit
12:09:49  [2023-05-03T16:09:49.378Z] ['verbose'] job
12:09:49  [2023-05-03T16:09:49.378Z] ['verbose'] pr
12:09:49  [2023-05-03T16:09:49.378Z] ['verbose'] service
12:09:49  [2023-05-03T16:09:49.378Z] ['verbose'] slug
12:09:49  [2023-05-03T16:09:49.378Z] ['verbose'] name
12:09:49  [2023-05-03T16:09:49.378Z] ['verbose'] tag
12:09:49  [2023-05-03T16:09:49.378Z] ['verbose'] flags
12:09:49  [2023-05-03T16:09:49.378Z] ['verbose'] parent
12:09:49  [2023-05-03T16:09:49.379Z] ['info'] Pinging Codecov: https://codecov.io/upload/v4?package=uploader-0.5.0&token=*******&branch=dev&build=4&build_url=https%3A%2F%2Fjenkins.symboldev.com%2Fjob%2FNem%2Fjob%2Fgenerated%2Fjob%2Fmiscellaneous%2Fjob%2Fnemesis-generator%2Fjob%2Fdev%2F4%2F&commit=0f9087a61ea292f3c1b7ca75ccf7e11b44b6c721&job=&pr=&service=jenkins&slug=NEMProject%2Fmiscellaneous&name=&tag=&flags=nemesis-generator&parent=
12:09:49  [2023-05-03T16:09:49.379Z] ['verbose'] Passed token was 36 characters long
12:09:49  [2023-05-03T16:09:49.379Z] ['verbose'] https://codecov.io/upload/v4?package=uploader-0.5.0&branch=dev&build=4&build_url=https%3A%2F%2Fjenkins.symboldev.com%2Fjob%2FNem%2Fjob%2Fgenerated%2Fjob%2Fmiscellaneous%2Fjob%2Fnemesis-generator%2Fjob%2Fdev%2F4%2F&commit=0f9087a61ea292f3c1b7ca75ccf7e11b44b6c721&job=&pr=&service=jenkins&slug=NEMProject%2Fmiscellaneous&name=&tag=&flags=nemesis-generator&parent=
12:09:49          Content-Type: 'text/plain'
12:09:49          Content-Encoding: 'gzip'
12:09:49          X-Reduced-Redundancy: 'false'
12:09:49  [2023-05-03T16:09:49.601Z] ['info'] https://app.codecov.io/github/NemProject/miscellaneous/commit/0f9087a61ea292f3c1b7ca75ccf7e11b44b6c721
12:09:49  https://storage.googleapis.com/codecov/v4/raw/2023-05-03/D15196F2D2954B7CD53E83DE79C5C907/0f9087a61ea292f3c1b7ca75ccf7e11b44b6c721/6a67dfb6-f6ad-4314-b022-fbb6dd24ce92.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=GOOG1EJOGFN2JQ4OCTGA2MU5AEIT7OT5Z7HTFOAN2SPG4NWSN2UJYOY5U6LZQ%2F20230503%2FUS%2Fs3%2Faws4_request&X-Amz-Date=20230503T160949Z&X-Amz-Expires=10&X-Amz-SignedHeaders=host&X-Amz-Signature=ca0dc69b68757b8e83be39116db15647797c7705c1e8c764598c547d0e95f394
12:09:49  [2023-05-03T16:09:49.601Z] ['verbose'] Returned upload url: https://storage.googleapis.com/codecov/v4/raw/2023-05-03/D15196F2D2954B7CD53E83DE79C5C907/0f9087a61ea292f3c1b7ca75ccf7e11b44b6c721/6a67dfb6-f6ad-4314-b022-fbb6dd24ce92.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=GOOG1EJOGFN2JQ4OCTGA2MU5AEIT7OT5Z7HTFOAN2SPG4NWSN2UJYOY5U6LZQ%2F20230503%2FUS%2Fs3%2Faws4_request&X-Amz-Date=20230503T160949Z&X-Amz-Expires=10&X-Amz-SignedHeaders=host&X-Amz-Signature=ca0dc69b68757b8e83be39116db15647797c7705c1e8c764598c547d0e95f394
12:09:49  [2023-05-03T16:09:49.601Z] ['info'] Uploading...
12:09:49  [2023-05-03T16:09:49.769Z] ['info'] {"status":"success","resultURL":"https://app.codecov.io/github/NemProject/miscellaneous/commit/0f9087a61ea292f3c1b7ca75ccf7e11b44b6c721"}
12:09:49  [2023-05-03T16:09:49.769Z] ['verbose'] End of uploader: 644 milliseconds

Expected Results

I expected that all the files should show coverage. Below is the output of the coverage tool during the CI run. It shows that all the files had 100% coverage.

12:09:48  + coverage report --fail-under=95
12:09:48  Name                                       Stmts   Miss  Cover
12:09:48  --------------------------------------------------------------
12:09:48  configuration_generator/__init__.py            0      0   100%
12:09:48  configuration_generator/__main__.py           61      0   100%
12:09:48  generator/__init__.py                          0      0   100%
12:09:48  generator/__main__.py                        104      0   100%
12:09:48  node_configuration_generator/__init__.py       0      0   100%
12:09:48  node_configuration_generator/__main__.py      52      0   100%
12:09:48  --------------------------------------------------------------
12:09:48  TOTAL                                        217      0   100%

Actual Results

Only the configuration_generator folder shows in the UI.

Additional Information

These are the missing files/folder

generator/__main__.py                        104      0   100%
node_configuration_generator/__main__.py      52      0   100%

@Wayonb I think there is something wrong with the way the coverage is being merged before you run the Codecov upload commands, but I could be wrong. Would you be able to output cat coverage.xml before uploading to Codecov, around here?

Codecov is getting a coverage report with only one __init__.py and __main__.py, so it’s not really possible for us to figure out which directory it’s getting under. You can see that by clicking Download on the 4 build here

@tom I will cat coverage.xml to be sure but in the logs coverage is logging the correct info below.


[2023-05-03T16:09:48.306Z] + coverage report --fail-under=95

[2023-05-03T16:09:48.561Z] Name                                       Stmts   Miss  Cover

[2023-05-03T16:09:48.561Z] --------------------------------------------------------------

[2023-05-03T16:09:48.561Z] configuration_generator/__init__.py            0      0   100%

[2023-05-03T16:09:48.561Z] configuration_generator/__main__.py           61      0   100%

[2023-05-03T16:09:48.561Z] generator/__init__.py                          0      0   100%

[2023-05-03T16:09:48.561Z] generator/__main__.py                        104      0   100%

[2023-05-03T16:09:48.561Z] node_configuration_generator/__init__.py       0      0   100%

[2023-05-03T16:09:48.561Z] node_configuration_generator/__main__.py      52      0   100%

[2023-05-03T16:09:48.561Z] --------------------------------------------------------------

@tom You are right.

I ran a quick test locally and the xml it generated is incorrect. :joy: :thinking:

Wrote XML report to coverage.xml
<?xml version="1.0" ?>
<coverage version="7.2.5" timestamp="1683506709270" lines-valid="217" lines-covered="217" line-rate="1" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
	<!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.2.5 -->
	<!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
	<sources>
		<source>/miscell/nemesis-generator/configuration_generator</source>
		<source>/miscell/nemesis-generator/generator</source>
		<source>/miscell/nemesis-generator/node_configuration_generator</source>
	</sources>
	<packages>
		<package name="." line-rate="1" branch-rate="0" complexity="0">
			<classes>
				<class name="__init__.py" filename="__init__.py" complexity="0" line-rate="1" branch-rate="0">
					<methods/>
					<lines/>
				</class>
				<class name="__main__.py" filename="__main__.py" complexity="0" line-rate="1" branch-rate="0">
					<methods/>
					<lines>
						<line number="1" hits="1"/>
						<line number="2" hits="1"/>
						<line number="3" hits="1"/>
						<line number="4" hits="1"/>
						<line number="5" hits="1"/>
						<line number="7" hits="1"/>
						<line number="9" hits="1"/>
						<line number="12" hits="1"/>
						<line number="13" hits="1"/>
						<line number="39" hits="1"/>
						<line number="42" hits="1"/>
						<line number="43" hits="1"/>
						<line number="55" hits="1"/>
						<line number="61" hits="1"/>
						<line number="62" hits="1"/>
						<line number="63" hits="1"/>
						<line number="65" hits="1"/>
						<line number="66" hits="1"/>
						<line number="68" hits="1"/>
						<line number="69" hits="1"/>
						<line number="70" hits="1"/>
						<line number="72" hits="1"/>
						<line number="73" hits="1"/>
						<line number="74" hits="1"/>
						<line number="76" hits="1"/>
						<line number="89" hits="1"/>
						<line number="91" hits="1"/>
						<line number="94" hits="1"/>
						<line number="95" hits="1"/>
						<line number="96" hits="1"/>
						<line number="99" hits="1"/>
						<line number="100" hits="1"/>
						<line number="101" hits="1"/>
						<line number="104" hits="1"/>
						<line number="105" hits="1"/>
						<line number="106" hits="1"/>
						<line number="109" hits="1"/>
						<line number="110" hits="1"/>
						<line number="111" hits="1"/>
						<line number="112" hits="1"/>
						<line number="113" hits="1"/>
						<line number="115" hits="1"/>
						<line number="116" hits="1"/>
						<line number="117" hits="1"/>
						<line number="118" hits="1"/>
						<line number="119" hits="1"/>
						<line number="120" hits="1"/>
						<line number="121" hits="1"/>
						<line number="122" hits="1"/>
						<line number="124" hits="1"/>
						<line number="127" hits="1"/>
						<line number="128" hits="1"/>
					</lines>
				</class>
			</classes>
		</package>
	</packages>
</coverage>

@Wayonb what are the coverage ... commands you are running? Maybe there’s a clue there. Also, what directory are you running it from?

@tom Thanks.

It seems to be how the directories/files are specified in the .coveragerc.
I switched from the first to the second connif and it seems to work.
The first seems to combined the output :sweat_smile:

cat .coveragerc 
[run]
source = 
	generator
	configuration_generator
	node_configuration_generator

to

cat .coveragerc 
[run]
include = 
	generator/*.py
	configuration_generator/*.py
	node_configuration_generator/*.py
1 Like

push a fix and it looks good.

1 Like

Oh, nice find @Wayonb! Thanks for coming back with the details!

@tom is the file drop if its empty?

The __init__py file is empty and the xml seems correct below. Not a big deal but just wondering.

Wrote XML report to coverage.xml
<?xml version="1.0" ?>
<coverage version="7.2.5" timestamp="1683553669823" lines-valid="217" lines-covered="217" line-rate="1" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0">
	<!-- Generated by coverage.py: https://coverage.readthedocs.io/en/7.2.5 -->
	<!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd -->
	<sources>
		<source>/miscell/nemesis-generator</source>
	</sources>
	<packages>
		<package name="configuration_generator" line-rate="1" branch-rate="0" complexity="0">
			<classes>
				<class name="__init__.py" filename="configuration_generator/__init__.py" complexity="0" line-rate="1" branch-rate="0">
					<methods/>
					<lines/>
				</class>
				<class name="__main__.py" filename="configuration_generator/__main__.py" complexity="0" line-rate="1" branch-rate="0">
					<methods/>
					<lines>
						<line number="1" hits="1"/>
						<line number="2" hits="1"/>
						<line number="4" hits="1"/>
						<line number="5" hits="1"/>
						<line number="6" hits="1"/>
						<line number="7" hits="1"/>
						<line number="8" hits="1"/>
						<line number="10" hits="1"/>
						<line number="13" hits="1"/>
						<line number="14" hits="1"/>
						<line number="15" hits="1"/>
						<line number="19" hits="1"/>
						<line number="20" hits="1"/>
						<line number="21" hits="1"/>
						<line number="22" hits="1"/>
						<line number="23" hits="1"/>
						<line number="25" hits="1"/>
						<line number="26" hits="1"/>
						<line number="27" hits="1"/>
						<line number="29" hits="1"/>
						<line number="30" hits="1"/>
						<line number="31" hits="1"/>
						<line number="32" hits="1"/>
						<line number="33" hits="1"/>
						<line number="35" hits="1"/>
						<line number="36" hits="1"/>
						<line number="38" hits="1"/>
						<line number="39" hits="1"/>
						<line number="44" hits="1"/>
						<line number="53" hits="1"/>
						<line number="55" hits="1"/>
						<line number="56" hits="1"/>
						<line number="62" hits="1"/>
						<line number="72" hits="1"/>
						<line number="74" hits="1"/>
						<line number="75" hits="1"/>
						<line number="76" hits="1"/>
						<line number="77" hits="1"/>
						<line number="79" hits="1"/>
						<line number="80" hits="1"/>
						<line number="81" hits="1"/>
						<line number="84" hits="1"/>
						<line number="85" hits="1"/>
						<line number="86" hits="1"/>
						<line number="87" hits="1"/>
						<line number="88" hits="1"/>
						<line number="90" hits="1"/>
						<line number="94" hits="1"/>
						<line number="95" hits="1"/>
						<line number="96" hits="1"/>
						<line number="97" hits="1"/>
						<line number="98" hits="1"/>
						<line number="99" hits="1"/>
						<line number="100" hits="1"/>
						<line number="102" hits="1"/>
						<line number="103" hits="1"/>
						<line number="104" hits="1"/>
						<line number="105" hits="1"/>
						<line number="106" hits="1"/>
						<line number="109" hits="1"/>
						<line number="110" hits="1"/>
					</lines>
				</class>
			</classes>
		</package>
		<package name="generator" line-rate="1" branch-rate="0" complexity="0">
			<classes>
				<class name="__init__.py" filename="generator/__init__.py" complexity="0" line-rate="1" branch-rate="0">
					<methods/>
					<lines/>
				</class>
				<class name="__main__.py" filename="generator/__main__.py" complexity="0" line-rate="1" branch-rate="0">
					<methods/>
					<lines>
						<line number="1" hits="1"/>
						<line number="3" hits="1"/>
						<line number="4" hits="1"/>
						<line number="5" hits="1"/>
						<line number="6" hits="1"/>
						<line number="7" hits="1"/>
						<line number="8" hits="1"/>
						<line number="9" hits="1"/>
						<line number="11" hits="1"/>
						<line number="12" hits="1"/>
						<line number="15" hits="1"/>
						<line number="16" hits="1"/>
						<line number="17" hits="1"/>
						<line number="18" hits="1"/>
						<line number="19" hits="1"/>
						<line number="22" hits="1"/>
						<line number="24" hits="1"/>
						<line number="26" hits="1"/>
						<line number="27" hits="1"/>
						<line number="28" hits="1"/>
						<line number="30" hits="1"/>
						<line number="31" hits="1"/>
						<line number="34" hits="1"/>
						<line number="35" hits="1"/>
						<line number="38" hits="1"/>
						<line number="40" hits="1"/>
						<line number="41" hits="1"/>
						<line number="42" hits="1"/>
						<line number="44" hits="1"/>
						<line number="45" hits="1"/>
						<line number="46" hits="1"/>
						<line number="48" hits="1"/>
						<line number="49" hits="1"/>
						<line number="50" hits="1"/>
						<line number="52" hits="1"/>
						<line number="53" hits="1"/>
						<line number="54" hits="1"/>
						<line number="56" hits="1"/>
						<line number="57" hits="1"/>
						<line number="58" hits="1"/>
						<line number="59" hits="1"/>
						<line number="61" hits="1"/>
						<line number="62" hits="1"/>
						<line number="63" hits="1"/>
						<line number="64" hits="1"/>
						<line number="65" hits="1"/>
						<line number="67" hits="1"/>
						<line number="68" hits="1"/>
						<line number="69" hits="1"/>
						<line number="71" hits="1"/>
						<line number="73" hits="1"/>
						<line number="79" hits="1"/>
						<line number="80" hits="1"/>
						<line number="83" hits="1"/>
						<line number="84" hits="1"/>
						<line number="85" hits="1"/>
						<line number="86" hits="1"/>
						<line number="87" hits="1"/>
						<line number="90" hits="1"/>
						<line number="91" hits="1"/>
						<line number="92" hits="1"/>
						<line number="93" hits="1"/>
						<line number="95" hits="1"/>
						<line number="96" hits="1"/>
						<line number="97" hits="1"/>
						<line number="98" hits="1"/>
						<line number="100" hits="1"/>
						<line number="101" hits="1"/>
						<line number="102" hits="1"/>
						<line number="104" hits="1"/>
						<line number="106" hits="1"/>
						<line number="108" hits="1"/>
						<line number="110" hits="1"/>
						<line number="111" hits="1"/>
						<line number="113" hits="1"/>
						<line number="114" hits="1"/>
						<line number="115" hits="1"/>
						<line number="117" hits="1"/>
						<line number="118" hits="1"/>
						<line number="119" hits="1"/>
						<line number="120" hits="1"/>
						<line number="121" hits="1"/>
						<line number="123" hits="1"/>
						<line number="124" hits="1"/>
						<line number="126" hits="1"/>
						<line number="127" hits="1"/>
						<line number="128" hits="1"/>
						<line number="129" hits="1"/>
						<line number="130" hits="1"/>
						<line number="133" hits="1"/>
						<line number="134" hits="1"/>
						<line number="135" hits="1"/>
						<line number="136" hits="1"/>
						<line number="138" hits="1"/>
						<line number="142" hits="1"/>
						<line number="143" hits="1"/>
						<line number="144" hits="1"/>
						<line number="146" hits="1"/>
						<line number="147" hits="1"/>
						<line number="149" hits="1"/>
						<line number="150" hits="1"/>
						<line number="151" hits="1"/>
						<line number="154" hits="1"/>
						<line number="155" hits="1"/>
					</lines>
				</class>
			</classes>
		</package>
		<package name="node_configuration_generator" line-rate="1" branch-rate="0" complexity="0">
			<classes>
				<class name="__init__.py" filename="node_configuration_generator/__init__.py" complexity="0" line-rate="1" branch-rate="0">
					<methods/>
					<lines/>
				</class>
				<class name="__main__.py" filename="node_configuration_generator/__main__.py" complexity="0" line-rate="1" branch-rate="0">
					<methods/>
					<lines>
						<line number="1" hits="1"/>
						<line number="2" hits="1"/>
						<line number="3" hits="1"/>
						<line number="4" hits="1"/>
						<line number="5" hits="1"/>
						<line number="7" hits="1"/>
						<line number="9" hits="1"/>
						<line number="12" hits="1"/>
						<line number="13" hits="1"/>
						<line number="39" hits="1"/>
						<line number="42" hits="1"/>
						<line number="43" hits="1"/>
						<line number="55" hits="1"/>
						<line number="61" hits="1"/>
						<line number="62" hits="1"/>
						<line number="63" hits="1"/>
						<line number="65" hits="1"/>
						<line number="66" hits="1"/>
						<line number="68" hits="1"/>
						<line number="69" hits="1"/>
						<line number="70" hits="1"/>
						<line number="72" hits="1"/>
						<line number="73" hits="1"/>
						<line number="74" hits="1"/>
						<line number="76" hits="1"/>
						<line number="89" hits="1"/>
						<line number="91" hits="1"/>
						<line number="94" hits="1"/>
						<line number="95" hits="1"/>
						<line number="96" hits="1"/>
						<line number="99" hits="1"/>
						<line number="100" hits="1"/>
						<line number="101" hits="1"/>
						<line number="104" hits="1"/>
						<line number="105" hits="1"/>
						<line number="106" hits="1"/>
						<line number="109" hits="1"/>
						<line number="110" hits="1"/>
						<line number="111" hits="1"/>
						<line number="112" hits="1"/>
						<line number="113" hits="1"/>
						<line number="115" hits="1"/>
						<line number="116" hits="1"/>
						<line number="117" hits="1"/>
						<line number="118" hits="1"/>
						<line number="119" hits="1"/>
						<line number="120" hits="1"/>
						<line number="121" hits="1"/>
						<line number="122" hits="1"/>
						<line number="124" hits="1"/>
						<line number="127" hits="1"/>
						<line number="128" hits="1"/>
					</lines>
				</class>
			</classes>
		</package>
	</packages>
</coverage>

@Wayonb yeah, we don’t show files that are empty as there is no coverage to actually show.

Thanks for verifying :+1: