name: Tests on: release: types: [ published ] pull_request: push: env: PY_COLORS: "1" jobs: test: runs-on: ${{ matrix.os }} continue-on-error: ${{ matrix.experimental }} # See: https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idcontinue-on-error strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] experimental: [false] python-version: [ "3.8", "3.9", "3.10", "3.11", "3.12", "3.13", "pypy-3.8", "pypy-3.9", ] # Python 3.9 is on macos-13 but not macos-latest (macos-14-arm64) # https://github.com/actions/setup-python/issues/696#issuecomment-1637587760 exclude: - { python-version: "3.8", os: "macos-latest", experimental: false } - { python-version: "3.9", os: "macos-latest", experimental: false } include: - { python-version: "3.8", os: "macos-13", experimental: false } - { python-version: "3.9", os: "macos-13", experimental: false } fail-fast: false steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} allow-prereleases: true - name: Install dependencies run: | python -m pip install --upgrade pip pip install tox - name: Setup SocketCAN if: ${{ matrix.os == 'ubuntu-latest' }} run: | sudo apt-get -y install linux-modules-extra-$(uname -r) sudo ./test/open_vcan.sh - name: Test with pytest via tox run: | tox -e gh env: # SocketCAN tests currently fail with PyPy because it does not support raw CAN sockets # See: https://foss.heptapod.net/pypy/pypy/-/issues/3809 TEST_SOCKETCAN: "${{ matrix.os == 'ubuntu-latest' && ! startsWith(matrix.python-version, 'pypy' ) }}" - name: Coveralls Parallel uses: coverallsapp/github-action@v2 with: github-token: ${{ secrets.github_token }} flag-name: Unittests-${{ matrix.os }}-${{ matrix.python-version }} parallel: true path-to-lcov: ./coverage.lcov coveralls: needs: test runs-on: ubuntu-latest steps: - name: Coveralls Finished uses: coverallsapp/github-action@v2 with: github-token: ${{ secrets.github_token }} parallel-finished: true static-code-analysis: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.10" - name: Install dependencies run: | python -m pip install --upgrade pip pip install -e .[lint] - name: mypy 3.8 run: | mypy --python-version 3.8 . - name: mypy 3.9 run: | mypy --python-version 3.9 . - name: mypy 3.10 run: | mypy --python-version 3.10 . - name: mypy 3.11 run: | mypy --python-version 3.11 . - name: mypy 3.12 run: | mypy --python-version 3.12 . - name: ruff run: | ruff check can - name: pylint run: | pylint \ can/**.py \ can/io \ doc/conf.py \ examples/**.py \ can/interfaces/socketcan format: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.10" - name: Install dependencies run: | python -m pip install --upgrade pip pip install -e .[lint] - name: Code Format Check with Black run: | black --check --verbose . docs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.10" - name: Install dependencies run: | python -m pip install --upgrade pip pip install -e .[canalystii,gs_usb,mf4] pip install -r doc/doc-requirements.txt - name: Build documentation run: | python -m sphinx -Wan --keep-going doc build - name: Run doctest run: | python -m sphinx -b doctest -W --keep-going doc build build: name: Packaging runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # fetch tags for setuptools-scm - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.10" - name: Build wheel and sdist run: pipx run build - name: Check build artifacts run: pipx run twine check --strict dist/* - name: Save artifacts uses: actions/upload-artifact@v4 with: name: release path: ./dist upload_pypi: needs: [build] name: Release to PyPi runs-on: ubuntu-latest permissions: id-token: write attestations: write # upload to PyPI only on release if: github.event.release && github.event.action == 'published' steps: - uses: actions/download-artifact@v4 with: path: dist merge-multiple: true - name: Publish release distributions to PyPI uses: pypa/gh-action-pypi-publish@release/v1