diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f8a3b3e..59bb587 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -37,11 +37,6 @@ jobs: with: path: ~/.data/ key: resources - - name: Set up Java - uses: actions/setup-java@v2 - with: - distribution: "temurin" # See 'Supported distributions' for available options - java-version: "8" - name: Set up Python uses: actions/setup-python@v2 with: @@ -59,14 +54,102 @@ jobs: if: matrix.python-version != '3.9' - name: Test with Pytest on Python ${{ matrix.python-version }} + run: coverage run -m pytest + + - name: Upload coverage data + uses: actions/upload-artifact@v4 + with: + name: coverage-data-${{ matrix.python-version }} + path: .coverage.* + if-no-files-found: ignore + + Coverage: + name: Combine & check coverage + if: always() + needs: Pytest + runs-on: ubuntu-latest + env: + GITHUB_PR_NUMBER: ${{github.event.pull_request.number}} + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + # Use latest Python, so it understands all syntax. + python-version: "3.7" + + - uses: actions/download-artifact@v4 + with: + pattern: coverage-data-* + merge-multiple: true + + - name: Combine coverage and generate report + run: | + python -Im pip install --upgrade "git+https://github.com/percevalw/coveragepy.git#egg=coverage[toml]" + + ls -lah + + python -Im coverage combine + + # Report and write to summary. + python -Im coverage report --skip-covered --skip-empty --format=detailed-markdown >> $GITHUB_STEP_SUMMARY + echo '## Coverage Report' > step-summary.md + cat $GITHUB_STEP_SUMMARY >> step-summary.md + + coverage report > coverage-report.txt + echo "main_coverage=$(grep 'TOTAL' coverage-report.txt | awk '{print $NF}' | sed 's/%//')" > main-coverage.txt + + - name: Upload Coverage Percentage for Main + uses: actions/upload-artifact@v4 + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/main' + with: + name: main-coverage-percentage + path: main-coverage.txt + + - name: Compare Coverage Percentages + if: github.ref != 'refs/heads/main' && github.ref != 'refs/heads/main' && github.event_name == 'pull_request' env: - UMLS_API_KEY: ${{ secrets.UMLS_API_KEY }} - run: python -m pytest --cov foldedtensor --cov-report xml - if: matrix.python-version == '3.9' + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + + main_coverage=$(cat ./.github/workflows/artifacts/main-coverage.txt || echo "90") + branch_coverage=$(coverage report | grep 'TOTAL' | awk '{print $NF}' | sed 's/%//') + + # echo "Main Coverage: $main_coverage%" > step-summary.md + # echo "Branch Coverage: $branch_coverage%" > step-summary.md + + # Echo comparison in with cross if it's lower, and checkmark if it's higher. + if (( $(echo "$branch_coverage < $main_coverage" | bc -l) )); then + echo "Coverage has decreased from the main branch." + echo >> step-summary.md + echo "Branch Coverage: $branch_coverage% < Main Coverage: $main_coverage% :x:" >> step-summary.md + FAILED=true + else + echo "Coverage is sufficient or improved." + echo >> step-summary.md + echo "Branch Coverage: **$branch_coverage%** ≥ Main Coverage: **$main_coverage%** :white_check_mark:" >> step-summary.md + FAILED=false + fi + + COMMENT_BODY_JSON=$(jq -Rs . <<< $(cat step-summary.md)) + HEADER="Authorization: token $GITHUB_TOKEN" + PR_COMMENTS_URL="https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments" + + # Fetch existing comments to find if one from this workflow already exists + COMMENTS=$(curl -s -H "$HEADER" "$PR_COMMENTS_URL") + COMMENT_ID=$(echo "$COMMENTS" | jq -r '.[] | select(.user.login == "github-actions[bot]" and (.body | startswith("## Coverage Report"))) | .id') + + # Check if we have a comment ID, if so, update it, otherwise create a new one + if [[ "$COMMENT_ID" ]]; then + # Update existing comment + curl -s -X PATCH -H "$HEADER" -H "Content-Type: application/json" -d "{\"body\": $COMMENT_BODY_JSON}" "https://api.github.com/repos/${{ github.repository }}/issues/comments/$COMMENT_ID" + else + # Post new comment + curl -s -X POST -H "$HEADER" -H "Content-Type: application/json" -d "{\"body\": $COMMENT_BODY_JSON}" "$PR_COMMENTS_URL" + fi - - name: Upload coverage - uses: codecov/codecov-action@v2 - if: matrix.python-version == '3.9' + if [[ "$FAILED" == "true" ]]; then + exit 1 + fi Installation: runs-on: ubuntu-latest diff --git a/pyproject.toml b/pyproject.toml index 51ae8ee..08a0c14 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -54,6 +54,14 @@ testpaths = [ "tests", ] +[tool.coverage.run] +concurrency = ["multiprocessing"] +parallel = true +include = ['foldedtensor/*'] + +[tool.coverage.report] +include = ['foldedtensor/*'] +precision = 1 [build-system] requires = [