ndarray 0.17.1

An n-dimensional array for general elements and for numerics. Lightweight array views and slicing; views support chunking and splitting.
Documentation
on:
  pull_request:
    paths-ignore:
      - '.github/workflows/latest-deps.yaml'
  merge_group:
  push:
    branches:
      - master

name: Continuous integration

env:
  CARGO_TERM_COLOR: always
  HOST: x86_64-unknown-linux-gnu
  FEATURES: "approx,serde,rayon"
  RUSTFLAGS: "-D warnings"
  MSRV: 1.64.0
  BLAS_MSRV: 1.71.1

jobs:
  pass-msrv:
    runs-on: ubuntu-latest
    name: Pass MSRV values to other jobs
    outputs:
      MSRV: ${{ env.MSRV }}
      BLAS_MSRV: ${{ env.BLAS_MSRV }}
    steps:
      - name: Pass MSRV
        run: |
          echo "MSRV=${{ env.MSRV }}" >> $GITHUB_OUTPUT
          echo "BLAS_MSRV=${{ env.BLAS_MSRV }}" >> $GITHUB_OUTPUT

  clippy:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        rust:
          - stable
    name: clippy/${{ matrix.rust }}
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.rust }}
          components: clippy
      - uses: Swatinem/rust-cache@v2
      - run: cargo clippy --features approx,serde,rayon

  format:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        rust:
          - nightly
    name: format/${{ matrix.rust }}
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.rust }}
          components: rustfmt
      - run: cargo fmt --all --check

  nostd:
    runs-on: ubuntu-latest
    continue-on-error: ${{ matrix.experimental }}
    strategy:
      matrix:
        include:
          - rust: stable
            experimental: false
            target: thumbv6m-none-eabi

    name: nostd/${{ matrix.target }}/${{ matrix.rust }}
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: ${{ matrix.rust }}
          targets: ${{ matrix.target }}
      - name: Tests
        run: |
          cargo rustc "--target=${{ matrix.target }}" --no-default-features --features portable-atomic-critical-section

  tests:
    runs-on: ubuntu-latest
    needs: pass-msrv
    strategy:
      matrix:
        rust:
          - stable
          - beta
          - nightly
          - ${{ needs.pass-msrv.outputs.MSRV }}

    name: tests/${{ matrix.rust }}
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.rust }}
      - uses: rui314/setup-mold@v1
      - uses: Swatinem/rust-cache@v2
      - uses: taiki-e/install-action@nextest
      - name: Install openblas
        run: sudo apt-get install libopenblas-dev gfortran
      - run: ./scripts/all-tests.sh "$FEATURES" ${{ matrix.rust }}
    
  blas-msrv:
    runs-on: ubuntu-latest
    name: blas-msrv
    needs: pass-msrv
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ needs.pass-msrv.outputs.BLAS_MSRV }}
      - uses: rui314/setup-mold@v1
      - uses: Swatinem/rust-cache@v2
      - uses: taiki-e/install-action@nextest
      - name: Install openblas
        run: sudo apt-get install libopenblas-dev gfortran
      - run: ./scripts/blas-integ-tests.sh $BLAS_MSRV

  miri:
    runs-on: ubuntu-latest
    name: miri
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@nightly
        with:
          components: miri
      - uses: Swatinem/rust-cache@v2
      - uses: taiki-e/install-action@nextest
      - run: ./scripts/miri-tests.sh

  cross_test:
    #if: ${{ github.event_name == 'merge_group' }}
    runs-on: ubuntu-latest
    strategy:
      matrix:
        include:
          - rust: stable
            target: s390x-unknown-linux-gnu
          - rust: stable
            target: i686-unknown-linux-gnu

    name: cross_test/${{ matrix.target }}/${{ matrix.rust }}
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.rust }}
          targets: ${{ matrix.target }}
      - uses: rui314/setup-mold@v1
      - uses: Swatinem/rust-cache@v2
      - name: Install cross
        run: cargo install cross
      - run: ./scripts/cross-tests.sh "approx,serde,rayon" ${{ matrix.rust }} ${{ matrix.target }}

  cargo-careful:
    #if: ${{ github.event_name == 'merge_group' }}
    runs-on: ubuntu-latest
    name: cargo-careful
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: nightly
      - uses: Swatinem/rust-cache@v2
      - uses: taiki-e/install-action@nextest
      - name: Install cargo-careful
        run: cargo install cargo-careful
      - run: cargo careful nextest run -Zcareful-sanitizer --features="$FEATURES"

  docs:
    #if: ${{ github.event_name == 'merge_group' }}
    runs-on: ubuntu-latest
    strategy:
      matrix:
        rust:
          - nightly # This is what docs.rs runs on, and is needed for the feature flags
    name: docs/${{ matrix.rust }}
    env:
      RUSTDOCFLAGS: "-Dwarnings --cfg docsrs"
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.rust }}
      - run: cargo doc --no-deps --all-features

  conclusion:
    needs:
      - clippy
      - format  # should format be required?
      - nostd
      - tests
      - miri
      - cross_test
      - cargo-careful
      - docs
    runs-on: ubuntu-latest
    steps:
      - name: Result
        run: |
          jq -C <<< "${needs}"
          # Check if all needs were successful or skipped.
          "$(jq -r 'all(.result as $result | (["success", "skipped"] | contains([$result])))' <<< "${needs}")"
        env:
          needs: ${{ toJson(needs) }}