pyo3-asyncio 0.20.0

PyO3 utilities for Python's Asyncio library
Documentation
name: CI

on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - master

env:
  CARGO_TERM_COLOR: always

jobs:
  fmt:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with:
          python-version: "3.10"
      - run: pip install black==22.8.0
      - uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: stable
          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@v3
      - uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: stable
          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.7",
            "3.8",
            "3.9",
            "3.10",
            "3.11-dev",
            "pypy-3.7",
            "pypy-3.8",
            "pypy-3.9",
          ]
        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:
          # PyPy doesn't release 32-bit Windows builds any more
          - python-version: pypy-3.7
            platform: { os: "windows-latest", python-architecture: "x86" }
          - python-version: pypy-3.8
            platform: { os: "windows-latest", python-architecture: "x86" }
          - python-version: pypy-3.9
            platform: { os: "windows-latest", python-architecture: "x86" }
        include:
          # Test minimal supported Rust version
          - rust: 1.63.0
            python-version: "3.10"
            platform:
              {
                os: "ubuntu-latest",
                python-architecture: "x64",
                rust-target: "x86_64-unknown-linux-gnu",
              }
            msrv: "MSRV"

          # Test the `nightly` feature
          - rust: nightly
            python-version: "3.10"
            platform:
              {
                os: "ubuntu-latest",
                python-architecture: "x64",
                rust-target: "x86_64-unknown-linux-gnu",
              }
            msrv: "nightly"
            extra_features: "nightly"

    steps:
      - uses: actions/checkout@v3

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

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: ${{ matrix.rust }}
          target: ${{ matrix.platform.rust-target }}

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

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

      - name: Build
        run: cargo build --features=${{env.features}} --verbose --target ${{ matrix.platform.rust-target }}

      # uvloop doesn't compile under Windows, Python 3.11-dev, and PyPy
      - if: ${{ matrix.platform.os != 'windows-latest' && matrix.python-version != '3.11-dev' && !startsWith(matrix.python-version, 'pypy') }}
        name: Install pyo3-asyncio test dependencies
        run: |
          python -m pip install -U uvloop

      - if: ${{ matrix.msrv != 'MSRV' && matrix.python-version != '3.11-dev' && !startsWith(matrix.python-version, 'pypy') }}
        name: Test
        run: cargo test --all-features --target ${{ matrix.platform.rust-target }}

      - if: ${{ matrix.msrv == 'MSRV' && matrix.python-version != '3.11-dev' && !startsWith(matrix.python-version, 'pypy') }}
        name: Test (MSRV, --no-default-features)
        run: cargo test --no-default-features --features tokio-runtime,async-std-runtime,attributes,unstable-streams --target ${{ matrix.platform.rust-target }}

    env:
      RUST_BACKTRACE: 1
      RUSTFLAGS: "-D warnings"

  coverage:
    needs: [fmt]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: nightly
          override: true
      - name: Install pyo3-asyncio test dependencies
        run: |
          python -m pip install -U uvloop
      - uses: actions-rs/cargo@v1
        with:
          command: test
          args: --all-features
        env:
          CARGO_INCREMENTAL: 0
          RUSTFLAGS: "-Zprofile -Ccodegen-units=1 -Cinline-threshold=0 -Clink-dead-code -Coverflow-checks=off"
          RUSTDOCFLAGS: "-Zprofile -Ccodegen-units=1 -Cinline-threshold=0 -Clink-dead-code -Coverflow-checks=off"
      - uses: actions-rs/grcov@v0.1
        id: coverage
      - uses: codecov/codecov-action@v1
        with:
          file: ${{ steps.coverage.outputs.report }}