Skip to content

💄 Refactor the coveragepy config#3158

Merged
webknjaz merged 7 commits intopython-trio:mainfrom
webknjaz:maintenance/coveragepy-refactor
Dec 20, 2024
Merged

💄 Refactor the coveragepy config#3158
webknjaz merged 7 commits intopython-trio:mainfrom
webknjaz:maintenance/coveragepy-refactor

Conversation

@webknjaz
Copy link
Member

This is a combination of changes that include:

  • setting up local coveragepy HTML output to show context
  • setting up mapping between site-packages and the repo
  • measuring all the Python files in the repo
  • including Cython
  • making xfails not influence the coverage metric (these test functions may start executing different amounts of lines over time, causing random coverage drops/gains)
  • using relative paths for playing nice with Codecov

@webknjaz webknjaz added project meta skip newsfragment Newsfragment is not required labels Dec 19, 2024
@webknjaz webknjaz self-assigned this Dec 19, 2024
@webknjaz webknjaz mentioned this pull request Dec 19, 2024
@webknjaz webknjaz force-pushed the maintenance/coveragepy-refactor branch from 6acc88f to f883fa0 Compare December 19, 2024 01:56
@webknjaz webknjaz force-pushed the maintenance/coveragepy-refactor branch 8 times, most recently from ebd6084 to 2ab8c61 Compare December 19, 2024 02:18
@codecov
Copy link

codecov bot commented Dec 19, 2024

Codecov Report

All modified and coverable lines are covered by tests ✅

Project coverage is 99.62%. Comparing base (4f66fab) to head (6212cdf).
Report is 280 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #3158      +/-   ##
==========================================
- Coverage   99.62%   99.62%   -0.01%     
==========================================
  Files         122      124       +2     
  Lines       18407    18381      -26     
  Branches     1226     1226              
==========================================
- Hits        18338    18312      -26     
  Misses         47       47              
  Partials       22       22              
Files with missing lines Coverage Δ
tests/cython/run_test_cython.py 100.00% <100.00%> (ø)
tests/cython/test_cython.pyx 100.00% <100.00%> (ø)

... and 3 files with indirect coverage changes

🚀 New features to boost your workflow:
  • Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@webknjaz webknjaz force-pushed the maintenance/coveragepy-refactor branch 5 times, most recently from ad3067d to 9c872c9 Compare December 19, 2024 02:47
@webknjaz webknjaz marked this pull request as ready for review December 19, 2024 02:47
Copy link
Member

@CoolCat467 CoolCat467 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good as far as I can tell, just a question about one of the config changes

Comment on lines +278 to +279
"*/src",
'*\src',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why does it have both forward and backwards slash?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also one below this also has a backwards slash

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably not, but I saw this practice a lot in the wild. I think modern coveragepy normalizes them but I don't want to take a chance.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably not what?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, my brain parsed it as “is this necessary?” 😆 Apologies.

These are basically explicit Windows path variants.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, that makes a lot of sense.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Having recently skimmed a bunch of codecov docs I'm pretty sure there's enough path normalization mentioned in a bunch of places that this shouldn't be needed.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jakkdl this is not Codecov but coveragepy.

@webknjaz
Copy link
Member Author

webknjaz commented Dec 19, 2024

Yeah, I only had to adapt my typical standalone config (which is easier to maintain) to the toml combo. It's all battle-tested, otherwise.

parallel = true
plugins = []
relative_files = true
source = ["."]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need source and source_pkgs? We should only need one

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is needed to measure coverage outside src/. One setting can only contain importable names while the other can have both importables and paths.

I had to do a lot of experiments to arrive to this config shape. Other variants may output incorrect paths into the XML report, confusing Codecov.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(this also allows including that Cython smoke test)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably that smoke test should be inside src/trio/_test

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alternatively we could use source_pkgs = ["trio", "tests"]

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@graingert this won't work well. The combination of the two is the only config that is known not to cause problems one way or the other. Plus, it represents the shape of the project exactly — the source is the entire Git repo; the importable is whatever is in site-packages but it's also mapped back to the source for proper representation within both coveragepy and codecov.

I've seen cases where it would display test_*.py files in the root of the repository in Codecov while showing the correct paths in the coveragepy's own HTML output. And that's just one example of how things tend to break.

Can we please rely on my experience here? I happened to maintain the use of coveragepy specifically a lot in the past few years, and would like to avoid weird behaviors just because this project wants to deviate from what's gone through countless hours of debugging rather surprising corner cases.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added the source_pkgs feature to coveragepy for this use case

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@graingert really? I didn't know!

Still, there were cases where this specific configuration layout was the only thing that made it possible for Codecov not to break in some cases. This was in both src- and flat-layout projects (some in aio-libs, some elsewhere).

Though, I feel like it's still important to cover other things that might appear outside src/. Sometimes, these are helper scripts or something similar — by collecting such coverage, it is possible to configure Codecov-reported statuses better and be more conscious about what to take into account through exclusions.

As for adding "tests" into source_pkgs, that might work, but would not address the “covering everything” part. Plus, I'm worried about the side effects it may have on Codecov.

@@ -0,0 +1 @@
from . import test_cython # noqa: F401
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possibly it makes sense to refactor test_cython to export a main function and we can then call it here

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I thought so. But it was late and I was lazy :)

Will do!

echo "version=$(python -V | cut -d' ' -f2 | cut -d'.' -f1,2)"
>> "${GITHUB_OUTPUT}"
- if: always()
uses: codecov/codecov-action@v5
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is there any problem with mixing versions? I previously hit errors I thought was caused by that.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, they just use different uploader and APIs. But newer versions are less prone to flaky upload crashes for some reason, as I noticed.

Comment on lines +278 to +279
"*/src",
'*\src',
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Having recently skimmed a bunch of codecov docs I'm pretty sure there's enough path normalization mentioned in a bunch of places that this shouldn't be needed.

@webknjaz webknjaz force-pushed the maintenance/coveragepy-refactor branch from 9c872c9 to 915b739 Compare December 19, 2024 23:06
@webknjaz webknjaz enabled auto-merge December 19, 2024 23:06
@webknjaz

This comment was marked as resolved.

@webknjaz webknjaz force-pushed the maintenance/coveragepy-refactor branch from b9b515c to 6212cdf Compare December 19, 2024 23:08
@webknjaz webknjaz added this pull request to the merge queue Dec 19, 2024
@github-merge-queue github-merge-queue bot removed this pull request from the merge queue due to failed status checks Dec 19, 2024
Copy link
Member

@graingert graingert left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's use source, or source_pkgs not both

parallel = true
plugins = []
relative_files = true
source = ["."]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alternatively we could use source_pkgs = ["trio", "tests"]

@webknjaz webknjaz added this pull request to the merge queue Dec 19, 2024
@webknjaz
Copy link
Member Author

Merge queue didn't work for the first time because of the flakiness of the Codecov v3 action, FTR.

I've added it back. As for the test relocation and other suggestions, they are out of the scope because I don't want to fit in more requirements into this effort. Those changes can always be tried out separately and shouldn't be blocking — and it would be easier to see if they work in isolation, since this already combines a bit more changes than I'd like in one PR.

Merged via the queue into python-trio:main with commit 0f270f9 Dec 20, 2024
36 checks passed
@webknjaz webknjaz deleted the maintenance/coveragepy-refactor branch December 20, 2024 00:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

project meta skip newsfragment Newsfragment is not required

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants