name: Update Quality Badges on: push: branches: - main paths: - '**.py' - '.coveragerc' # The core-coverage badge reads this list; refresh when it changes. - 'scripts/critical-modules.txt' workflow_dispatch: jobs: update-badges: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: fetch-depth: 0 token: ${{ secrets.GITHUB_TOKEN }} # No actions/setup-python: the runner image ships Python 3.12 and older # act_runner engines mishandle setup-python's PATH. Install into the # ephemeral job container's system Python (--break-system-packages is # safe because the container is disposable). - name: Install dev dependencies run: python3 -m pip install --break-system-packages -r requirements-dev.txt - name: Run coverage and extract percentage id: coverage run: | python3 -m coverage run -m unittest discover -t . -s tests/unit > /dev/null 2>&1 || true PERCENT=$(python3 -m coverage report 2>/dev/null | grep '^TOTAL' | grep -oP '\d+(?=%)' | tail -1) echo "percent=$PERCENT" >> $GITHUB_OUTPUT echo "Coverage: $PERCENT%" - name: Extract core (critical-module) coverage percentage id: core_coverage run: | # Reuses the .coverage data from the previous step. The core list is # the single source of truth in scripts/critical-modules.txt; every # core module is unit-tested, so the unit-only run is accurate for it. INCLUDE=$(grep -vE '^[[:space:]]*(#|$)' scripts/critical-modules.txt | paste -sd, -) PERCENT=$(python3 -m coverage report --include="$INCLUDE" 2>/dev/null | grep '^TOTAL' | grep -oP '\d+(?=%)' | tail -1) echo "percent=$PERCENT" >> $GITHUB_OUTPUT echo "Core coverage: $PERCENT%" - name: Update badges in README run: | COVERAGE_PERCENT="${{ steps.coverage.outputs.percent }}" CORE_COVERAGE_PERCENT="${{ steps.core_coverage.outputs.percent }}" if [ -n "$COVERAGE_PERCENT" ]; then sed -i "s|/badge/coverage-[^)]*|/badge/coverage-${COVERAGE_PERCENT}%25-brightgreen|" README.md fi if [ -n "$CORE_COVERAGE_PERCENT" ]; then sed -i "s|/badge/core%20coverage-[^)]*|/badge/core%20coverage-${CORE_COVERAGE_PERCENT}%25-brightgreen|" README.md fi echo "Updated badges:" grep -E "coverage" README.md | head -2 - name: Commit and push badge updates run: | git config --local user.email "action@gitea.local" git config --local user.name "Quality Badge Bot" # Check if there are changes if git diff --quiet README.md; then echo "No badge changes needed" else echo "Badge changes detected, committing..." git add README.md MSG="chore: update quality badges"$'\n\n'"- Coverage: ${{ steps.coverage.outputs.percent }}%"$'\n'"- Core coverage: ${{ steps.core_coverage.outputs.percent }}%"$'\n\n'"[skip ci]" git commit -m "$MSG" git push fi