diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..c05b5fe93 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +/.github/ @thomass-dev @rouk1 @augustebaum diff --git a/.github/actions/sphinx/deploy/action.yml b/.github/actions/sphinx/deploy/action.yml index e6118ee0f..d3568bc66 100644 --- a/.github/actions/sphinx/deploy/action.yml +++ b/.github/actions/sphinx/deploy/action.yml @@ -14,8 +14,7 @@ inputs: required: false default: scaleway BUCKET: - required: false - default: prod-probabl-skore + required: true SOURCE: required: true DESTINATION: diff --git a/.github/actions/workflow-run/context/action.yml b/.github/actions/workflow-run/context/action.yml new file mode 100644 index 000000000..e2ba0263c --- /dev/null +++ b/.github/actions/workflow-run/context/action.yml @@ -0,0 +1,38 @@ +name: acquire-pr-context +description: | + Acquire the PR number and the PR commit HEAD sha, after a "workflow_run" event. + + The "workflow_run" context differs from the "pull_request" context and doesn't contain + PR basic information. This action intends to provide some missing information in the + "workflow_run" context, without having to explicitly record them in the workflow that + triggered the "workflow_run" event. + +outputs: + pr-number: + description: "The PR number" + value: ${{ steps.acquire-pr-context.outputs.number }} + pr-head-sha: + description: "The PR commit HEAD sha" + value: ${{ steps.acquire-pr-context.outputs.head-sha }} + +runs: + using: composite + steps: + - id: acquire-pr-context + shell: bash + run: |- + gh pr view \ + --repo "${REPOSITORY}" "${BRANCH}" \ + --json 'number,headRefOid' \ + --jq '"number=\(.number)\nhead-sha=\(.headRefOid)"' \ + \ + >> "${GITHUB_OUTPUT}" + env: + GH_TOKEN: ${{ github.token }} + REPOSITORY: ${{ github.repository }} + BRANCH: |- + ${{ + (github.event.workflow_run.head_repository.fork == true) + && format('{0}:{1}', github.event.workflow_run.head_repository.owner.login, github.event.workflow_run.head_branch) + || github.event.workflow_run.head_branch + }} diff --git a/.github/workflows/skore.yml b/.github/workflows/backend.yml similarity index 57% rename from .github/workflows/skore.yml rename to .github/workflows/backend.yml index 43b27f506..11360d694 100644 --- a/.github/workflows/skore.yml +++ b/.github/workflows/backend.yml @@ -1,13 +1,49 @@ -name: Reusable skore workflow - -on: [workflow_call] +name: backend + +on: + pull_request: + paths: + - 'skore/src/**' + - 'skore/tests/**' + - 'skore/pyproject.toml' + - 'skore/requirements*.txt' + - '.github/workflows/backend.yml' + push: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read defaults: run: shell: "bash" jobs: - test-skore: + backend-lint: + runs-on: "ubuntu-latest" + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: pip + + - name: Install dependencies + run: python -m pip install --upgrade pip pre-commit + + - name: Lint + working-directory: skore/ + run: pre-commit run --all-files ruff + + backend-test: strategy: fail-fast: false matrix: @@ -21,14 +57,20 @@ jobs: - os: "ubuntu-latest" python: "3.12" scikit-learn: "1.5" + - os: "ubuntu-latest" + python: "3.12" + scikit-learn: "1.6" + coverage: true runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v4 + - name: Checkout code + uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - name: Setup Python + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python }} - cache: "pip" + cache: pip - name: Restore python-venv uses: actions/cache/restore@v4 @@ -75,46 +117,33 @@ jobs: path: 'skore/venv' key: ${{ steps.cache-python-venv.outputs.cache-primary-key }} - - name: Lint and test - timeout-minutes: 10 - working-directory: "skore/" - run: | - # Lint - pre-commit run --all-files ruff - - # Build - python -m build + - name: Build + working-directory: skore/ + run: python -m build + - name: Install + working-directory: skore/ + run: | # Install `skore` without its dependencies, which are present in the venv wheel=(dist/*.whl); python -m pip install --force-reinstall --no-deps "${wheel}" - # Test - python -m pytest --no-cov src/ tests/ -n auto + - name: Test without coverage + if: ${{ ! matrix.coverage }} + timeout-minutes: 10 + working-directory: skore/ + run: python -m pytest -n auto src/ tests/ --no-cov - coverage-skore: - runs-on: ubuntu-latest - if: ${{ github.event_name == 'pull_request' }} - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: 3.12 - cache: "pip" - - name: pytest coverage - working-directory: "skore/" + - name: Test with coverage + if: ${{ matrix.coverage }} + timeout-minutes: 10 + working-directory: skore/ run: | - # Install dependencies - python -m pip install --upgrade pip - python -m pip install --upgrade pre-commit - python -m pip install --upgrade build - python -m pip install -e .[test] - - # run coverage - python -m pytest -n auto --junitxml=coverage.xml --cov=skore src/ tests/ | tee pytest-coverage.txt - - name: Pytest coverage comment - if: ${{ ! github.event.pull_request.head.repo.fork }} - uses: MishaKav/pytest-coverage-comment@main + mkdir coverage + python -m pytest -n auto src/ tests/ --junitxml=coverage/coverage.xml --cov-config=pyproject.toml --cov | tee coverage/coverage.txt + + - name: Upload coverage reports + if: ${{ matrix.coverage && (github.event_name == 'pull_request') }} + uses: actions/upload-artifact@v4 with: - pytest-coverage-path: ./skore/pytest-coverage.txt - junitxml-path: ./skore/coverage.xml - title: pytest coverage report + name: backend-coverage + path: skore/coverage/ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index e3db1d26d..000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,69 +0,0 @@ -name: CI - -on: - pull_request: - push: - branches: - - main - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - changes: - runs-on: ubuntu-latest - outputs: - skore: ${{ steps.filter.outputs.skore }} - skore-ui: ${{ steps.filter.outputs.skore-ui }} - permissions: - pull-requests: read - steps: - - uses: actions/checkout@v4 - - uses: dorny/paths-filter@v3 - id: filter - with: - filters: | - skore: - - 'skore/src/**' - - 'skore/tests/**' - - 'skore/pyproject.toml' - - 'skore/requirements*.txt' - - '.github/workflows/skore.yml' - skore-ui: - - 'skore-ui/**' - - '.github/workflows/skore-ui.yml' - - lint-all-files: - uses: ./.github/workflows/lint.yml - permissions: - contents: read - - lint-and-test-skore: - needs: [lint-all-files, changes] - if: ${{ (github.event_name == 'push' && github.ref == 'refs/heads/main') || (github.event_name == 'pull_request' && needs.changes.outputs.skore == 'true') }} - uses: ./.github/workflows/skore.yml - permissions: - contents: read - pull-requests: write - - lint-and-test-skore-ui: - needs: [lint-all-files, changes] - if: ${{ (github.event_name == 'push' && github.ref == 'refs/heads/main') || (github.event_name == 'pull_request' && needs.changes.outputs.skore-ui == 'true') }} - uses: ./.github/workflows/skore-ui.yml - permissions: - contents: read - pull-requests: write - - ci-all-green: - needs: - - changes - - lint-all-files - - lint-and-test-skore - - lint-and-test-skore-ui - if: ${{ always() }} - runs-on: Ubuntu-latest - steps: - - shell: bash - run: | - [[ ${{ contains(needs.*.result, 'failure') }} = false ]] diff --git a/.github/workflows/frontend.yml b/.github/workflows/frontend.yml new file mode 100644 index 000000000..641493bae --- /dev/null +++ b/.github/workflows/frontend.yml @@ -0,0 +1,89 @@ +name: frontend + +on: + pull_request: + paths: + - 'skore-ui/**' + - '.github/workflows/frontend.yml' + push: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +defaults: + run: + shell: "bash" + +jobs: + frontend-lint: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + cache-dependency-path: skore-ui/package-lock.json + + - name: Lint + working-directory: skore-ui/ + run: | + npm install + npm run type-check + npm run lint + npm run format + npm run style-lint + + frontend-test: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + cache-dependency-path: skore-ui/package-lock.json + + - name: Test with coverage + working-directory: skore-ui/ + run: | + npm install + npm run test:unit:coverage + + - name: Upload coverage reports + if: ${{ github.event_name == 'pull_request' }} + uses: actions/upload-artifact@v4 + with: + name: frontend-coverage + path: skore-ui/coverage/ + + frontend-build: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: '20' + cache: 'npm' + cache-dependency-path: skore-ui/package-lock.json + + - name: Build + working-directory: skore-ui/ + run: | + npm install + npm run build diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 886506ca7..9d76ffc11 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,21 +1,40 @@ -name: Reusable lint workflow +name: lint -on: [workflow_call] +on: + pull_request: + push: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + +defaults: + run: + shell: "bash" jobs: - lint-all-files: + lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Python + uses: actions/setup-python@v5 with: - python-version: '3.12' - cache: 'pip' - - name: Lint all files - run: | - python -m pip install --upgrade pip - python -m pip install --upgrade pre-commit + python-version: "3.12" + cache: pip + + - name: Install dependencies + run: python -m pip install --upgrade pip pre-commit + - name: Lint + run: | pre-commit run --all-files check-yaml pre-commit run --all-files check-toml pre-commit run --all-files check-added-large-files diff --git a/.github/workflows/add-pr-assignee.yml b/.github/workflows/pr-add-assignee.yml similarity index 90% rename from .github/workflows/add-pr-assignee.yml rename to .github/workflows/pr-add-assignee.yml index c6570c0aa..f5a673e1c 100644 --- a/.github/workflows/add-pr-assignee.yml +++ b/.github/workflows/pr-add-assignee.yml @@ -1,11 +1,13 @@ -name: Add PR assignee +name: add assignee in PR on: - pull_request: + pull_request_target: types: [opened] +permissions: {} + jobs: - add-pr-assignee: + add-assignee: runs-on: ubuntu-latest permissions: pull-requests: write diff --git a/.github/workflows/pr-cleanup.yml b/.github/workflows/pr-cleanup.yml new file mode 100644 index 000000000..ff83a624d --- /dev/null +++ b/.github/workflows/pr-cleanup.yml @@ -0,0 +1,79 @@ +name: cleanup PR + +on: + pull_request_target: + types: [closed] + +permissions: {} + +defaults: + run: + shell: "bash" + +jobs: + clean-artifacts: + if: always() + runs-on: ubuntu-latest + permissions: + actions: write + steps: + - name: Clean artifacts + run: | + set -u + + ARTIFACTS=$( \ + gh api \ + --paginate \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + /repos/probabl-ai/skore/actions/artifacts \ + | \ + jq -c " \ + .artifacts[] \ + | select((.workflow_run.head_branch == \"${HEAD_BRANCH}\") and (.workflow_run.head_repository_id == ${HEAD_REPOSITORY_ID})) \ + | {id: .id, name: .name} \ + " \ + ) + + for ARTIFACT in $ARTIFACTS; do + ID=$(echo "${ARTIFACT}" | jq -r '.id') + NAME=$(echo "${ARTIFACT}" | jq -r '.name') + + echo "Deleting artifact (NAME: \"${NAME}\", ID: \"${ID}\")" + + gh api \ + --method DELETE \ + --silent \ + -H "Accept: application/vnd.github+json" \ + -H "X-GitHub-Api-Version: 2022-11-28" \ + /repos/${REPOSITORY_OWNER}/${REPOSITORY_NAME}/actions/artifacts/${ID} + done + env: + GH_TOKEN: ${{ github.token }} + REPOSITORY_OWNER: ${{ github.repository_owner }} + REPOSITORY_NAME: ${{ github.event.repository.name }} + HEAD_REPOSITORY_ID: ${{ github.event.pull_request.head.repo.id }} + HEAD_BRANCH: ${{ github.head_ref }} + + clean-documentation-preview: + if: always() + runs-on: ubuntu-latest + steps: + - name: Install `rclone` + shell: bash + run: | + sudo apt-get update + sudo apt-get install -y rclone + + - name: Copy configuration + shell: bash + run: echo "${CONFIGURATION}" > rclone.configuration + env: + CONFIGURATION: ${{ secrets.RCLONE_CONFIG_DOC_PREVIEW }} + + - name: Clean documentation preview + run: rclone --config rclone.configuration purge "${PROVIDER}:${BUCKET}/${PULL_REQUEST_NUMBER}" + env: + PROVIDER: scaleway + BUCKET: ${{ vars.DOCUMENTATION_PREVIEW_BUCKET }} + PULL_REQUEST_NUMBER: ${{ github.event.number }} diff --git a/.github/workflows/pr-display-backend-coverage.yml b/.github/workflows/pr-display-backend-coverage.yml new file mode 100644 index 000000000..de3ac1703 --- /dev/null +++ b/.github/workflows/pr-display-backend-coverage.yml @@ -0,0 +1,44 @@ +name: display backend coverage in PR + +on: + workflow_run: + workflows: [backend] + types: [completed] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: {} + +jobs: + display-backend-coverage: + if: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }} + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + pull-requests: write + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Acquire PR context + id: acquire-pr-context + uses: ./.github/actions/workflow-run/context + + - name: Download coverage reports + uses: actions/download-artifact@v4 + with: + name: backend-coverage + path: coverage/ + github-token: ${{ github.token }} + run-id: ${{ github.event.workflow_run.id }} + + - name: Display coverage reports + uses: MishaKav/pytest-coverage-comment@main + with: + issue-number: ${{ steps.acquire-pr-context.outputs.pr-number }} + pytest-coverage-path: coverage/coverage.txt + junitxml-path: coverage/coverage.xml + title: Coverage Report for backend diff --git a/.github/workflows/pr-display-frontend-coverage.yml b/.github/workflows/pr-display-frontend-coverage.yml new file mode 100644 index 000000000..6dc1517cb --- /dev/null +++ b/.github/workflows/pr-display-frontend-coverage.yml @@ -0,0 +1,42 @@ +name: display frontend coverage in PR + +on: + workflow_run: + workflows: [frontend] + types: [completed] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: {} + +jobs: + display-frontend-coverage: + if: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }} + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + pull-requests: write + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Acquire PR context + id: acquire-pr-context + uses: ./.github/actions/workflow-run/context + + - name: Download coverage reports + uses: actions/download-artifact@v4 + with: + name: frontend-coverage + path: coverage/ + github-token: ${{ github.token }} + run-id: ${{ github.event.workflow_run.id }} + + - name: Display coverage reports + uses: davelosert/vitest-coverage-report-action@v2 + with: + pr-number: ${{ steps.acquire-pr-context.outputs.pr-number }} + name: frontend diff --git a/.github/workflows/lint-pr-title.yml b/.github/workflows/pr-lint-title.yml similarity index 96% rename from .github/workflows/lint-pr-title.yml rename to .github/workflows/pr-lint-title.yml index 0b1ea9944..d47f985d7 100644 --- a/.github/workflows/lint-pr-title.yml +++ b/.github/workflows/pr-lint-title.yml @@ -1,4 +1,4 @@ -name: Lint PR title +name: lint title in PR on: pull_request: @@ -8,7 +8,7 @@ permissions: pull-requests: read jobs: - lint-pr-title: + lint-title: runs-on: ubuntu-latest steps: - uses: actions/setup-node@v4 diff --git a/.github/workflows/pr-serve-documentation-preview.yml b/.github/workflows/pr-serve-documentation-preview.yml new file mode 100644 index 000000000..7f1cbcb0e --- /dev/null +++ b/.github/workflows/pr-serve-documentation-preview.yml @@ -0,0 +1,53 @@ +name: serve documentation preview in PR + +on: + workflow_run: + workflows: [sphinx] + types: [completed] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +permissions: {} + +jobs: + serve-documentation-preview: + if: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }} + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + pull-requests: write + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Download HTML artifacts + uses: actions/download-artifact@v4 + with: + name: sphinx-html-artifact + path: html/ + github-token: ${{ github.token }} + run-id: ${{ github.event.workflow_run.id }} + + - name: Acquire PR context + id: acquire-pr-context + uses: ./.github/actions/workflow-run/context + + - name: Serve documentation preview + uses: ./.github/actions/sphinx/deploy + with: + CONFIGURATION: ${{ secrets.RCLONE_CONFIG_DOC_PREVIEW }} + BUCKET: ${{ vars.DOCUMENTATION_PREVIEW_BUCKET }} + SOURCE: html/ + DESTINATION: ${{ steps.acquire-pr-context.outputs.pr-number }}/ + + - name: Comment with documentation preview link + uses: marocchino/sticky-pull-request-comment@v2 + with: + number: ${{ steps.acquire-pr-context.outputs.pr-number }} + header: documentation-preview + message: >- + [Documentation preview](${{ vars.DOCUMENTATION_PREVIEW_URL }}/${{ steps.acquire-pr-context.outputs.pr-number }}) + @ ${{ steps.acquire-pr-context.outputs.pr-head-sha }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f1f44d21f..768356c21 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,4 +1,4 @@ -name: Release +name: release on: release: diff --git a/.github/workflows/skore-ui.yml b/.github/workflows/skore-ui.yml deleted file mode 100644 index 0fbdd686d..000000000 --- a/.github/workflows/skore-ui.yml +++ /dev/null @@ -1,62 +0,0 @@ -name: Reusable skore-ui workflow - -on: [workflow_call] - -defaults: - run: - shell: 'bash' - working-directory: './skore-ui' - -jobs: - lint-skore-ui: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'npm' - cache-dependency-path: skore-ui/package-lock.json - - name: Lint skore-ui - run: | - npm install - npm run type-check - npm run lint - npm run format - npm run style-lint - - test-skore-ui: - runs-on: ubuntu-latest - needs: lint-skore-ui - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'npm' - cache-dependency-path: skore-ui/package-lock.json - - name: Test skore-ui - run: | - npm install - npm run test:unit:coverage - - name: Report coverage - if: ${{ always() && ! github.event.pull_request.head.repo.fork }} - uses: davelosert/vitest-coverage-report-action@v2 - with: - working-directory: ./skore-ui - pr-number: ${{ github.event.number }} - - build-skore-ui: - runs-on: ubuntu-latest - needs: test-skore-ui - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: '20' - cache: 'npm' - cache-dependency-path: skore-ui/package-lock.json - - name: Build skore-ui - run: | - npm install - npm run build diff --git a/.github/workflows/sphinx.yml b/.github/workflows/sphinx.yml index 9b4be3374..a91976798 100644 --- a/.github/workflows/sphinx.yml +++ b/.github/workflows/sphinx.yml @@ -1,4 +1,4 @@ -name: Sphinx +name: sphinx # **How it works** @@ -116,8 +116,8 @@ jobs: path: sphinx/build/html/ sphinx-deploy-html: - runs-on: ubuntu-latest if: ${{ (github.event_name == 'release') || (github.event_name == 'push' && github.ref == 'refs/heads/main') }} + runs-on: ubuntu-latest needs: [sphinx-version, sphinx-build] steps: - uses: actions/checkout@v4 @@ -128,12 +128,13 @@ jobs: - uses: ./.github/actions/sphinx/deploy with: CONFIGURATION: ${{ secrets.RCLONE_CONFIG_DOCS }} + BUCKET: ${{ vars.DOCUMENTATION_BUCKET }} SOURCE: html/ DESTINATION: ${{ needs.sphinx-version.outputs.SPHINX_VERSION }}/ sphinx-deploy-root-files: - runs-on: ubuntu-latest if: ${{ github.event_name == 'release' }} + runs-on: ubuntu-latest needs: [sphinx-version, sphinx-build, sphinx-deploy-html] steps: - uses: actions/checkout@v4 @@ -144,7 +145,7 @@ jobs: import operator import json - url = "https://skore.probabl.ai" + url = os.environ["URL"] current = os.environ["CURRENT"] response = requests.get(f"{url}/versions.json") @@ -177,17 +178,19 @@ jobs: """ ) env: + URL: ${{ vars.DOCUMENTATION_URL }} CURRENT: ${{ needs.sphinx-version.outputs.SPHINX_VERSION }} - uses: ./.github/actions/sphinx/deploy with: CONFIGURATION: ${{ secrets.RCLONE_CONFIG_DOCS }} + BUCKET: ${{ vars.DOCUMENTATION_BUCKET }} ACTION: copy SOURCE: artifacts/ DESTINATION: - sphinx-clean: + sphinx-clean-artifacts: runs-on: ubuntu-latest - if: always() + if: ${{ always() && (github.event_name != 'pull_request') }} needs: [sphinx-version, sphinx-build, sphinx-deploy-html, sphinx-deploy-root-files] steps: - uses: geekyeggo/delete-artifact@v5 diff --git a/README.md b/README.md index 9405f2609..a9ac43b91 100644 --- a/README.md +++ b/README.md @@ -103,13 +103,15 @@ Thank you for considering contributing to skore! Join our mission to promote ope
+
+ ![license](https://img.shields.io/pypi/l/skore) ![python](https://img.shields.io/badge/python-3.9%20%7C%203.10%20%7C%203.11%20%7C%203.12-blue?style=flat&logo=python) [![downloads](https://static.pepy.tech/badge/skore/month)](https://pepy.tech/projects/skore) [![pypi](https://img.shields.io/pypi/v/skore)](https://pypi.org/project/skore/) - ![ci](https://github.com/probabl-ai/skore/actions/workflows/ci.yml/badge.svg?event=push) [![Discord](https://img.shields.io/badge/Discord-%235865F2.svg?logo=discord&logoColor=white)](https://discord.probabl.ai/) +
--- Brought to you by diff --git a/skore/pyproject.toml b/skore/pyproject.toml index ea1195285..085d03c65 100644 --- a/skore/pyproject.toml +++ b/skore/pyproject.toml @@ -102,9 +102,6 @@ sphinx = [ [tool.pytest.ini_options] addopts = [ "--doctest-modules", - "--cov=src/", - "--cov=tests/", - "--cov-branch", "--import-mode=importlib", "--no-header", "--verbosity=2", @@ -117,10 +114,13 @@ addopts = [ ] [tool.coverage.run] -omit = [ - "src/skore/externals/*", - "tests/*", -] +branch = true +parallel = true +source = ["skore"] + +[tool.coverage.report] +omit = ["*/externals/*", "src/*", "tests/*"] +show_missing = true [tool.ruff] src = ["skore"]