chk_defaced 0.4.0

Detect tampered documents before they reach an LLM: font defacement (the extracted text differs from the glyphs actually drawn) and invisible or cloaked text, in PDF, DOCX and HTML. Deterministic, no LLM, no network.
Documentation
name: CI

on:
  push:
    branches: [main]
  pull_request:

env:
  CARGO_TERM_COLOR: always
  # Le build native (Tesseract, pdfium, webview) restano fuori: sono dietro feature
  # opzionali e richiederebbero toolchain di sistema sul runner. Qui si verifica il
  # crate che un consumatore ottiene per default, che e' Rust puro.

jobs:
  check:
    name: build, test, clippy, doc
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      # Toolchain FISSATA sul job che blocca: `-D warnings` su `stable` significa che una
      # nuova release di clippy puo' rompere la CI senza che il codice sia cambiato. Qui il
      # verdetto dipende solo da cio' che scriviamo noi. Va alzata deliberatamente, ed e' un
      # "testato con", non la MSRV (che il crate non dichiara ancora).
      - uses: dtolnay/rust-toolchain@1.98.0
        with:
          components: clippy

      - uses: Swatinem/rust-cache@v2

      - name: build
        run: cargo build --all-targets

      # Le fixture stanno fuori dal repo (../data/...): i test che le usano si
      # auto-saltano, quelli deterministici girano comunque.
      # `--lib` e `--doc` non si possono combinare in una sola invocazione di cargo.
      - name: test
        run: |
          cargo test --lib
          cargo test --doc

      - name: clippy
        run: cargo clippy --all-targets -- -D warnings

      # I link rotti nella documentazione si vedono su docs.rs, cioe' sulla pagina
      # pubblica del crate: qui diventano un errore prima che ci arrivino.
      - name: doc
        run: cargo doc --no-deps
        env:
          RUSTDOCFLAGS: -D warnings

  # La `rust-version` dichiarata nel manifest e' una promessa ai consumatori: qui si verifica
  # che sia vera, invece di restare un numero scritto una volta e mai piu' controllato.
  msrv:
    name: MSRV dichiarata (1.88)
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@1.88.0
      - uses: Swatinem/rust-cache@v2
      - run: cargo build --lib
      - run: cargo test --lib

  # Contraltare del job fissato: gira sulla `stable` del giorno e **avvisa senza bloccare**.
  # Serve a vedere i lint nuovi quando escono invece che quando aggiorniamo il pin, senza che
  # decidano loro se una PR e' mergiabile. Se diventa rosso, si valuta e si alza il pin.
  lint-stable:
    name: clippy su stable (non bloccante)
    runs-on: ubuntu-latest
    continue-on-error: true
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy
      - uses: Swatinem/rust-cache@v2
      - run: cargo clippy --all-targets -- -D warnings

  # `--no-default-features` disattiva CLI e HTML: verifica che la libreria resti
  # utilizzabile da chi la incorpora senza volersi portare dietro clap e scraper.
  minimal:
    name: senza feature di default
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@stable
      - uses: Swatinem/rust-cache@v2
      - run: cargo build --no-default-features