ratatui-image 10.0.8

An image widget for ratatui, supporting sixels, kitty, iterm2, and unicode-halfblocks
name: ci
on:
  workflow_dispatch:
  push:
    branches:
      - master
      - ci
  pull_request:
    branches:
      - master
  merge_group:
  workflow_call:

concurrency:
  group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

env:
  CLICOLOR_FORCE: 1

jobs:
  ensure-readme-up-to-date:
    name: Ensure readme has been generated
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
      - name: Install rust
        uses: actions-rs/toolchain@v1
        with:
          toolchain: 1.88.0
          profile: default
          override: true
      - uses: davidB/rust-cargo-make@v1
      - name: Make readme
        run: cargo make readme
      - name: Ensure no changes
        run: git diff --exit-code .

  nix-flake-check:
    name: Nix flake check
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Install Nix
        uses: cachix/install-nix-action@v24

      - name: Cachix
        uses: cachix/cachix-action@v12
        with:
          name: ratatui-image-ci
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: Flake check
        run: |
          nix flake show
          nix flake check --print-build-logs

  nix-build:
    name: Nix build
    runs-on: ubuntu-latest
    outputs:
      artifact_path: ${{ steps.upload-artifact.outputs.artifact_path }}
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Install Nix
        uses: cachix/install-nix-action@v24

      - name: Cachix
        uses: cachix/cachix-action@v12
        with:
          name: ratatui-image-ci
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: Build package
        run: |
          nix build . --print-build-logs

  nix-build-windows:
    name: Nix build (windows)
    runs-on: ubuntu-latest
    outputs:
      artifact_path: ${{ steps.upload-artifact.outputs.artifact_path }}
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Install Nix
        uses: cachix/install-nix-action@v24

      - name: Cachix
        uses: cachix/cachix-action@v12
        with:
          name: ratatui-image-ci
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: Build package
        run: |
          nix build .#windows --print-build-logs

  setup-terminals:
    name: Find terminal tests
    runs-on: ubuntu-latest
    outputs:
      terminals: ${{ steps.set-terminals.outputs.terminals }}
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Install Nix
        uses: cachix/install-nix-action@v24

      - id: set-terminals
        run: |
          terminals=$(nix eval --raw --impure --expr 'let flake = builtins.getFlake (toString ./.); pkgs = flake.packages.x86_64-linux; terminals = builtins.filter (name: builtins.substring 0 15 name == "screenshot-test") (builtins.attrNames pkgs); in builtins.toJSON (map (t: builtins.substring 16 (-1) t) terminals)')
          echo "terminals=$terminals" >> $GITHUB_OUTPUT

  nix-flake-screenshots:
    name: Nix screenshot tests
    runs-on: ubuntu-latest
    needs: [nix-build, setup-terminals]
    permissions:
      contents: read
    strategy:
      matrix:
        terminal: ${{ fromJSON(needs.setup-terminals.outputs.terminals) }}
    steps:
      - name: Checkout Code
        uses: actions/checkout@v4

      - name: Install Nix
        uses: cachix/install-nix-action@v24

      - name: Cachix
        uses: cachix/cachix-action@v12
        with:
          name: ratatui-image-ci
          authToken: "${{ secrets.CACHIX_AUTH_TOKEN }}"

      - name: Run screenshot test for ${{ matrix.terminal }}
        run: |
          nix build .#screenshot-test-${{ matrix.terminal }} --print-build-logs

      - name: Upload screenshot artifact
        uses: actions/upload-artifact@v4
        with:
          name: screenshot-${{ matrix.terminal }}
          path: result/screenshot-${{ matrix.terminal }}.png