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 }} - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.12' - name: Install dev dependencies run: | python -m pip install --upgrade pip pip install -r requirements-dev.txt - name: Run coverage and extract percentage id: coverage run: | python -m coverage run -m unittest discover -t . -s tests/unit > /dev/null 2>&1 || true PERCENT=$(python -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=$(python -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