• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

dennisdoomen / packageguard / 32631513776
81%

Build:
DEFAULT BRANCH: main
Ran 23 Aug 2026 09:43AM UTC
Jobs 1
Files 79
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

23 Aug 2026 09:37AM UTC coverage: 78.563% (+0.2%) from 78.389%
32631513776

push

github

web-flow
Share one resilient GitHub client across the whole run (#239)

* Share one resilient GitHub client across the whole run

PackageGuard talked to api.github.com from two places, each with its own
HttpClient and neither aware of the rate limit. Risk enrichment ran six
packages at a time, and every package fanned out into per-issue and
per-pull-request calls behind their own semaphores, so well over a hundred
requests could be in flight at once. GitHub answers that with 403 under its
secondary rate limit, which the code then reported as a failure to fetch
metadata.

Route every GitHub request through one GitHubApiClient that:

- caps concurrency at 8 requests, far below the 100 GitHub allows;
- honours retry-after and x-ratelimit-reset, retrying short throttles;
- stops making requests once the budget is spent, and says so once, rather
  than spending the rest of the run collecting rejections;
- skips requests marked optional when the budget drops into a reserve, so
  the packages still to be scanned keep getting their essential signals;
- revalidates responses with If-None-Match against a cache stored next to
  cache.bin, and remembers which resources do not exist.

A repository whose metadata could not be read is now cached as such. It used
to be left out of the cache, so all forty packages sharing a repository each
retried the same failing fan-out.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Address the InspectCode findings on the review

Tighten the visibility of members that only the declaring type uses: the rate
limit budget becomes a private field on the client, GetStringAsync becomes
private, and ResetsAt and Reserve become private on GitHubRateLimit.

Drop two members nothing calls: GitHubApi.Reset, which was written for tests
that construct their clients directly, and the ResponseCache property.

Rename the attempt result's IsThrottled to WasThrottled, so it no longer hides
the outer IsThrottled that inspects a response, and drop t... (continued)

1801 of 2580 branches covered (69.81%)

Branch coverage included in aggregate %.

409 of 469 new or added lines in 8 files covered. (87.21%)

3 existing lines in 1 file now uncovered.

5624 of 6871 relevant lines covered (81.85%)

1804.11 hits per line

Uncovered Changes

Lines Coverage ∆ File
35
81.15
Src/PackageGuard.Core/GitHub/GitHubApiClient.cs
11
69.98
-0.46% Src/PackageGuard.Core/Risk/Enrichment/GitHubRepositoryRiskEnricher.cs
8
91.89
Src/PackageGuard.Core/GitHub/GitHubResponseCache.cs
4
77.42
Src/PackageGuard.Core/GitHub/GitHubRateLimit.cs
2
91.18
-5.75% Src/PackageGuard.Core/CSharp/FetchingStrategies/GitHubLicenseFetcher.cs

Coverage Regressions

Lines Coverage ∆ File
3
69.98
-0.46% Src/PackageGuard.Core/Risk/Enrichment/GitHubRepositoryRiskEnricher.cs
Jobs
ID Job ID Ran Files Coverage
1 32631513776.1 23 Aug 2026 09:43AM UTC 79
78.56
GitHub Action Run
Source Files on build 32631513776
  • Tree
  • List 79
  • Changed 43
  • Source Changed 3
  • Coverage Changed 43
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • Github Actions Build #32631513776
  • 9b2e9c8b on github
  • Prev Build on main (#32623316672)
  • Next Build on main (#32656324840)
  • Delete
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc