pyo3 0.13.2

Bindings to Python interpreter
Documentation
name: CI

on:
  push:
    branches:
      - master
  pull_request:

env:
  CARGO_TERM_COLOR: always

jobs:
  fmt:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
      - run: pip install black==19.10b0
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          profile: minimal
          components: rustfmt
      - name: Check python formatting (black)
        run: black --check .
      - name: Check rust formatting (rustfmt)
        run: cargo fmt --all -- --check

  clippy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          profile: minimal
          components: clippy
      - run: make clippy

  build:
    needs: [fmt] # don't wait for clippy as fails rarely and takes longer
    name: python${{ matrix.python-version }}-${{ matrix.platform.python-architecture }} ${{ matrix.platform.os }} ${{ matrix.msrv }}
    runs-on: ${{ matrix.platform.os }}
    strategy:
      fail-fast: false  # If one platform fails, allow the rest to keep testing.
      matrix:
        rust: [stable]
        python-version: [3.6, 3.7, 3.8, 3.9, 3.10-dev, pypy-3.6]
        platform: [
          { os: "macOS-latest",   python-architecture: "x64", rust-target: "x86_64-apple-darwin" },
          { os: "ubuntu-latest", python-architecture: "x64", rust-target: "x86_64-unknown-linux-gnu" },
          { os: "windows-latest", python-architecture: "x64", rust-target: "x86_64-pc-windows-msvc" },
          { os: "windows-latest", python-architecture: "x86", rust-target: "i686-pc-windows-msvc" },
        ]
        exclude:
          # There is no 64-bit pypy on windows
          - python-version: pypy-3.6
            platform: { os: "windows-latest", python-architecture: "x64" }
        include:
          # Test minimal supported Rust version
          - rust: 1.41.1
            python-version: 3.9
            platform: { os: "ubuntu-latest", python-architecture: "x64", rust-target: "x86_64-unknown-linux-gnu" }
            msrv: "MSRV"

    steps:
      - uses: actions/checkout@v2

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python-version }}
          architecture: ${{ matrix.platform.python-architecture }}

      - name: Install Rust toolchain
        uses: actions-rs/toolchain@v1
        with:
          toolchain: ${{ matrix.rust }}
          target: ${{ matrix.platform.rust-target }}
          profile: minimal
          default: true

      - if: matrix.platform.os == 'ubuntu-latest'
        name: Prepare LD_LIBRARY_PATH (Ubuntu only)
        run: echo LD_LIBRARY_PATH=${pythonLocation}/lib >> $GITHUB_ENV

      - name: Build docs
        run: cargo doc --no-default-features --features "macros num-bigint num-complex hashbrown" --verbose --target ${{ matrix.platform.rust-target }}

      - name: Build (no features)
        run: cargo build --no-default-features --verbose --target ${{ matrix.platform.rust-target }}

      - name: Build (all additive features)
        run: cargo build --no-default-features --features "macros num-bigint num-complex hashbrown serde" --verbose --target ${{ matrix.platform.rust-target }}

      # Run tests (except on PyPy, because no embedding API).
      - if: matrix.python-version != 'pypy-3.6'
        name: Test
        run: cargo test --no-default-features --features "macros num-bigint num-complex hashbrown serde" --target ${{ matrix.platform.rust-target }}

      # Run tests again, but in abi3 mode
      - if: matrix.python-version != 'pypy-3.6'
        name: Test (abi3)
        run: cargo test --no-default-features --features "abi3 macros num-bigint num-complex hashbrown serde" --target ${{ matrix.platform.rust-target }}

      # Run tests again, for abi3-py36 (the minimal Python version)
      - if: (matrix.python-version != 'pypy-3.6') && (matrix.python-version != '3.6')
        name: Test (abi3-py36)
        run: cargo test --no-default-features --features "abi3-py36 macros num-bigint num-complex hashbrown serde" --target ${{ matrix.platform.rust-target }}

      - name: Test proc-macro code
        run: cargo test --manifest-path=pyo3-macros-backend/Cargo.toml --target ${{ matrix.platform.rust-target }}

      - name: Install python test dependencies
        run: |
          python -m pip install -U pip setuptools
          pip install setuptools-rust pytest pytest-benchmark tox tox-venv

      - name: Test example extension modules
        shell: bash
        run: |
          for example_dir in examples/*; do
              tox --discover $(which python) -c $example_dir -e py
          done

    env:
      RUST_BACKTRACE: 1
      RUSTFLAGS: "-D warnings"
      # TODO: this is a hack to workaround compile_error! warnings about auto-initialize on PyPy
      # Once cargo's `resolver = "2"` is stable (~ MSRV Rust 1.52), remove this.
      PYO3_CI: 1

  coverage:
    needs: [fmt]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions-rs/toolchain@v1
        with:
          toolchain: nightly
          override: true
          profile: minimal
      - uses: actions-rs/cargo@v1
        with:
          command: test
          args: --features "num-bigint num-complex hashbrown serde" --no-fail-fast
        env:
          CARGO_INCREMENTAL: 0
          RUSTFLAGS: "-Zprofile -Ccodegen-units=1 -Cinline-threshold=0 -Clink-dead-code -Coverflow-checks=off -Cpanic=abort -Zpanic_abort_tests"
          RUSTDOCFLAGS: "-Zprofile -Ccodegen-units=1 -Cinline-threshold=0 -Clink-dead-code -Coverflow-checks=off -Cpanic=abort -Zpanic_abort_tests"
      - uses: actions-rs/grcov@v0.1
        id: coverage
      - uses: codecov/codecov-action@v1
        with:
          file: ${{ steps.coverage.outputs.report }}