name: Continuous Integration on: # Allows you to run this workflow manually from the Actions tab workflow_dispatch: push: branches: - main pull_request: branches: - main merge_group: # ensure that the workflow is only triggered once per PR, subsequent pushes to the PR will cancel # and restart the workflow. See https://docs.github.com/en/actions/using-jobs/using-concurrency concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true # lint, clippy and coverage jobs are intentionally early in the workflow to catch simple formatting, # typos, and missing tests as early as possible. This allows us to fix these and resubmit the PR # without having to wait for the comprehensive matrix of tests to complete. jobs: rustfmt: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@nightly with: components: rustfmt - run: cargo +nightly fmt --all --check typos: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: crate-ci/typos@master dependencies: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: EmbarkStudios/cargo-deny-action@v2 cargo-machete: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: Swatinem/rust-cache@v2 - uses: bnjbvr/cargo-machete@v0.7.0 clippy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: components: clippy - uses: taiki-e/install-action@cargo-make - uses: Swatinem/rust-cache@v2 - run: cargo make clippy markdownlint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: DavidAnson/markdownlint-cli2-action@v17 with: globs: | '**/*.md' '!target' coverage: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: components: llvm-tools - uses: taiki-e/install-action@v2 with: tool: cargo-llvm-cov,cargo-make - uses: Swatinem/rust-cache@v2 - run: cargo make coverage - uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} fail_ci_if_error: true check: strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] toolchain: ["1.74.0", "stable"] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.toolchain }} - uses: taiki-e/install-action@cargo-make - uses: Swatinem/rust-cache@v2 - run: cargo make check env: RUST_BACKTRACE: full lint-docs: runs-on: ubuntu-latest env: RUSTDOCFLAGS: -Dwarnings steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@nightly - uses: dtolnay/install@cargo-docs-rs - uses: Swatinem/rust-cache@v2 # Run cargo rustdoc with the same options that would be used by docs.rs, taking into account # the package.metadata.docs.rs configured in Cargo.toml. # https://github.com/dtolnay/cargo-docs-rs - run: cargo +nightly docs-rs -p ratatui test-doc: strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - uses: taiki-e/install-action@cargo-make - uses: Swatinem/rust-cache@v2 - run: cargo make test-doc env: RUST_BACKTRACE: full test: strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] toolchain: ["1.74.0", "stable"] backend: [crossterm, termion, termwiz] exclude: # termion is not supported on windows - os: windows-latest backend: termion runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.toolchain }} - uses: taiki-e/install-action@v2 with: tool: cargo-make,nextest - uses: Swatinem/rust-cache@v2 - run: cargo make test-backend ${{ matrix.backend }} env: RUST_BACKTRACE: full