jia-parse 1.0.0

Command-line and library parser for PDDL and Jia model files.
Documentation
name: Coverage

on:
  push:
    branches:
      - main
      - master
  workflow_dispatch:

permissions:
  contents: read

env:
  COVERAGE_PREFIX: coverage/jia-parse

jobs:
  coverage:
    name: Generate and upload coverage
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Rust
        uses: dtolnay/rust-toolchain@stable
        with:
          components: llvm-tools-preview

      - name: Install cargo-llvm-cov
        uses: taiki-e/install-action@cargo-llvm-cov

      - name: Prepare coverage output directory
        run: mkdir -p target/coverage-upload

      - name: Generate LCOV coverage
        run: cargo llvm-cov --workspace --lcov --output-path target/coverage-upload/lcov.info

      - name: Generate coverage summary
        run: cargo llvm-cov --workspace --summary-only | tee target/coverage-upload/summary.txt

      - name: Generate coverage JSON
        run: |
          python3 <<'PY'
          import json
          from pathlib import Path

          lcov = Path("target/coverage-upload/lcov.info").read_text().splitlines()
          lines_found = 0
          lines_hit = 0

          for line in lcov:
              if line.startswith("LF:"):
                  lines_found += int(line.split(":", 1)[1])
              elif line.startswith("LH:"):
                  lines_hit += int(line.split(":", 1)[1])

          percent = 100.0 if lines_found == 0 else (lines_hit / lines_found) * 100.0
          rounded = round(percent, 2)

          if rounded >= 90:
              color = "brightgreen"
          elif rounded >= 80:
              color = "green"
          elif rounded >= 70:
              color = "yellowgreen"
          elif rounded >= 60:
              color = "yellow"
          else:
              color = "red"

          summary = {
              "lines": {
                  "covered": lines_hit,
                  "total": lines_found,
                  "percent": rounded,
              }
          }
          badge = {
              "schemaVersion": 1,
              "label": "coverage",
              "message": f"{rounded:.2f}%",
              "color": color,
          }

          Path("target/coverage-upload/coverage-summary.json").write_text(
              json.dumps(summary, indent=2) + "\n"
          )
          Path("target/coverage-upload/coverage-badge.json").write_text(
              json.dumps(badge, indent=2) + "\n"
          )
          PY

      - name: Generate HTML coverage
        run: cargo llvm-cov --workspace --html --output-dir target/coverage-upload/html

      - name: Prepare upload
        run: |
          cp target/coverage-upload/lcov.info target/coverage-upload/html/lcov.info
          cp target/coverage-upload/summary.txt target/coverage-upload/html/summary.txt
          cp target/coverage-upload/coverage-summary.json target/coverage-upload/html/coverage-summary.json
          cp target/coverage-upload/coverage-badge.json target/coverage-upload/html/coverage-badge.json

      - name: Upload coverage to S3
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_REGION: ${{ secrets.AWS_REGION }}
          AWS_ENDPOINT_URL_S3: ${{ secrets.AWS_ENDPOINT_URL_S3 }}
          BUCKET_NAME: ${{ secrets.BUCKET_NAME }}
        run: |
          aws s3 sync target/coverage-upload/html "s3://${BUCKET_NAME}/${COVERAGE_PREFIX}/" \
            --endpoint-url "${AWS_ENDPOINT_URL_S3}" \
            --delete