name: Tests and Linting
on:
workflow_dispatch:
pull_request:
push:
branches: [master]
env:
UV_INDEX_STRATEGY: "unsafe-first-match"
UV_EXTRA_INDEX_URL: "https://download.pytorch.org/whl/cpu"
PIP_EXTRA_INDEX_URL: "https://download.pytorch.org/whl/cpu"
UV_SYSTEM_PYTHON: 1
BRANCH_NAME: ${{ github.head_ref || github.ref_name }}
jobs:
linting:
name: Linting
if: github.event_name == 'pull_request'
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
with:
# requites to grab the history of the PR
fetch-depth: 0
- uses: actions/setup-python@v5
with:
cache: 'pip'
- uses: pre-commit/action@v3.0.0
with:
extra_args: --color=always --from-ref ${{ github.event.pull_request.base.sha }} --to-ref ${{ github.event.pull_request.head.sha }}
pytest:
name: Pytest
runs-on: ubuntu-22.04
strategy:
fail-fast: true
matrix:
python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@v2
- name: Cache downloaded resources
uses: actions/cache@v3
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@v5
with:
python-version: ${{ matrix.python-version }}
cache: 'pip'
- name: Install dependencies
run: pip install -e ".[dev]"
if: matrix.python-version != '3.9' && matrix.python-version != '3.10' && matrix.python-version != '3.11' && matrix.python-version != '3.12'
- name: Install dependencies
run: pip install -e ".[dev,setup]"
if: matrix.python-version == '3.9'
- name: Install dependencies
# skip ML tests for 3.10 and 3.11
run: pip install -e ".[dev-no-ml]"
if: matrix.python-version == '3.10' || matrix.python-version == '3.11' || matrix.python-version == '3.12'
- name: Test with Pytest on Python ${{ matrix.python-version }}
env:
UMLS_API_KEY: ${{ secrets.UMLS_API_KEY }}
run: coverage run -m pytest --ignore tests/test_docs.py
if: matrix.python-version != '3.9'
- name: Test with Pytest on Python ${{ matrix.python-version }}
env:
UMLS_API_KEY: ${{ secrets.UMLS_API_KEY }}
run: coverage run -m pytest
if: matrix.python-version == '3.9'
- name: Upload coverage data
uses: actions/upload-artifact@v4
with:
name: coverage-data-${{ matrix.python-version }}
path: .coverage.*
if-no-files-found: ignore
include-hidden-files: true
coverage:
name: Coverage
needs: pytest
uses: aphp/foldedtensor/.github/workflows/coverage.yml@main
with:
base-branch: master
coverage-data-pattern: coverage-data-*
coverage-report: coverage.txt
coverage-badge: coverage.svg
coverage-branch: coverage
documentation:
name: Documentation
runs-on: ubuntu-latest
# Main docs are built in another workflow, we don't have to test them outside of PR
if: github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v5
with:
python-version: 3.9
cache: 'pip'
- name: Install dependencies
run: pip install -e ".[docs]"
- name: Set up Git
run: |
git config user.name ${{ github.actor }}
git config user.email ${{ github.actor }}@users.noreply.github.com
echo Current branch: $BRANCH_NAME
- name: Build documentation
run: |
mike deploy --no-redirect --rebase --update-aliases $BRANCH_NAME latest
mike set-default $BRANCH_NAME
- name: Put content of gh-pages to public folder
run: rm -rf public && mkdir public && git archive gh-pages | tar -x -C ./public/
- name: Set up Vercel
run: npm install --global vercel@latest
- name: Pull Vercel environment
run: vercel pull --yes --environment=preview --token=${{ secrets.VERCEL_TOKEN }}
- name: Create new vercel project linked to this branch
run: vercel project add edsnlp-$BRANCH_NAME --token=${{ secrets.VERCEL_TOKEN }}
- name: Link public folder to the (maybe) new vercel project
run: vercel link --cwd public --project edsnlp-$BRANCH_NAME --yes --token=${{ secrets.VERCEL_TOKEN }}
- name: Deploy to Vercel
run: vercel deploy public/ --yes --token=${{ secrets.VERCEL_TOKEN }} --archive=tgz --prod > deployment-url.txt
- name: Post the documentation link
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
slugify () {
echo "$1" | iconv -c -t ascii//TRANSLIT | sed -E 's/[^a-zA-Z0-9-]+//g' | tr A-Z a-z
}
RAW_PROJECT_NAME="edsnlp-$BRANCH_NAME"
URL=https://$(slugify "$RAW_PROJECT_NAME").vercel.app/
COMMENT_BODY="## Docs preview URL\n\n$URL\n\n"
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("## Docs preview URL"))) | .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\"}" "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\"}" "$PR_COMMENTS_URL"
fi
if [ $status -ne 0 ]; then
exit $status
fi
simple-installation:
name: Simple installation
runs-on: ubuntu-22.04
strategy:
fail-fast: true
matrix:
python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: 'pip'
- run: echo WEEK=$(date +%V) >>$GITHUB_ENV
shell: bash
- name: Install library
run: |
pip install ".[ml]" pytest
pytest tests/pipelines/test_pipelines.py