| name: Tests |
| |
| on: |
| push: |
| branches: [ master ] |
| tags: [ '[0-9]+.[0-9]+.[0-9]+*' ] |
| pull_request: |
| branches: [ master ] |
| |
| permissions: {} |
| |
| env: |
| CIBW_TEST_COMMAND: python -m unittest discover --start-directory {project} |
| CIBW_SKIP: cp39-* cp310-* |
| CIBW_ENVIRONMENT_PASS_LINUX: TOMLI_USE_MYPYC |
| FORCE_COLOR: 1 |
| PIP_DISABLE_PIP_VERSION_CHECK: 1 |
| |
| jobs: |
| |
| linters: |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 |
| with: |
| persist-credentials: false |
| - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 |
| with: |
| python-version: '3.11' |
| |
| - name: Install pre-commit |
| run: | |
| pip install pre-commit |
| |
| - name: run linters |
| # pre-commit also runs in pre-commit.ci, but let's have it here too |
| # to block `pypi-publish` job from triggering if pre-commit fails |
| run: | |
| pre-commit run --all-files |
| |
| tests: |
| runs-on: ${{ matrix.os }} |
| strategy: |
| matrix: |
| python-version: ['pypy3.11', '3.8', '3.9', '3.10', '3.11', '3.12', '3.13', '3.14', '3.15-dev'] |
| os: [ubuntu-latest, macos-latest, windows-latest] |
| continue-on-error: ${{ matrix.python-version == '3.15-dev' }} |
| |
| steps: |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 |
| with: |
| persist-credentials: false |
| |
| - name: Set up Python ${{ matrix.python-version }} |
| uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 |
| with: |
| python-version: ${{ matrix.python-version }} |
| |
| - name: Install package |
| run: | |
| pip install . |
| |
| - name: Test with unittest |
| run: | |
| python -m unittest |
| |
| coverage: |
| runs-on: ubuntu-latest |
| steps: |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 |
| with: |
| persist-credentials: false |
| - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 |
| with: |
| python-version: '3.x' |
| - name: Install package and coverage deps |
| run: | |
| pip install . coverage |
| - name: Measure coverage |
| run: | |
| # Coverage should be 100% without external tests |
| rm -rf tests/data/valid/_external/ |
| rm -rf tests/data/invalid/_external/ |
| coverage run -m unittest |
| coverage report --fail-under=100 --show-missing |
| - name: Report coverage |
| uses: codecov/codecov-action@e79a6962e0d4c0c17b229090214935d2e33f8354 # v6.0.1 |
| with: |
| token: ${{ secrets.CODECOV_TOKEN }} |
| |
| binary-wheels: |
| name: Binary wheels for ${{ startsWith(matrix.os, 'macos-') && 'macOS' || startsWith(matrix.os, 'windows-11-arm') && 'Windows (arm64)' || startsWith(matrix.os, 'windows-') && 'Windows' || endsWith(matrix.os, '-arm') && 'Linux (arm64)' || 'Linux' }} |
| runs-on: ${{ matrix.os }} |
| strategy: |
| matrix: |
| os: [ubuntu-latest, ubuntu-24.04-arm, windows-latest, windows-11-arm, macos-latest] |
| |
| steps: |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 |
| with: |
| persist-credentials: false |
| |
| - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0 |
| with: |
| python-version: '3.x' |
| |
| - name: Switch build backend to setuptools |
| run: | |
| pip install -r scripts/requirements.txt |
| python scripts/use_setuptools.py |
| |
| - name: Build wheels |
| uses: pypa/cibuildwheel@adba99c781d3746d38b3a09b1cf797965bcb7fe6 # v4.3.0 |
| env: |
| CIBW_ARCHS_MACOS: x86_64 arm64 |
| TOMLI_USE_MYPYC: '1' |
| |
| - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 |
| with: |
| name: artifact-binary-${{ matrix.os }} |
| path: wheelhouse/*.whl |
| if-no-files-found: error |
| |
| pure-python-wheel-and-sdist: |
| name: Build a pure Python wheel and source distribution |
| runs-on: ubuntu-latest |
| |
| steps: |
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 |
| with: |
| persist-credentials: false |
| |
| - name: Install build dependencies |
| run: pip install build |
| |
| - name: Build |
| run: python -m build |
| |
| - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 |
| with: |
| name: artifact-pure-python |
| path: dist/* |
| if-no-files-found: error |
| |
| allgood: |
| runs-on: ubuntu-latest |
| needs: |
| - tests |
| - coverage |
| - linters |
| - binary-wheels |
| - pure-python-wheel-and-sdist |
| steps: |
| - run: echo "Great success!" |
| |
| pypi-publish: |
| # Only publish if all other jobs succeed |
| needs: [ allgood ] |
| if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags') |
| runs-on: ubuntu-latest |
| permissions: |
| # This permission is mandatory for Trusted Publishing |
| id-token: write |
| steps: |
| - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 |
| with: |
| path: dist |
| pattern: artifact-* |
| merge-multiple: true |
| - name: Publish package distributions to PyPI |
| uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2 |