pythagore 0.8.3

Mathematics tools for simple geometry
Documentation
name: Rust

on:
  push:
    branches: [ "master" ]
  
  pull_request:
    branches: [ "master" ]

concurrency:
  group: rust-${{ github.ref }}
  cancel-in-progress: true

env:
  CARGO_TERM_COLOR: always

jobs:
  lint:
    runs-on: ubuntu-latest

    permissions:
      contents: read
      security-events: write

    steps:
      - uses: actions/checkout@v3

      - name: Setup Rust
        run: rustup toolchain install stable --profile minimal --component clippy

      - name: Rust Cache
        uses: Swatinem/rust-cache@v2

      - name: Install SARIF utils
        run: cargo install clippy-sarif sarif-fmt

      - name: Run clippy
        run: cargo clippy --all-features --message-format=json | clippy-sarif | tee results.sarif | sarif-fmt

      - uses: github/codeql-action/upload-sarif@v2
        with:
          sarif_file: results.sarif
          wait-for-processing: true

  unit-tests:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Setup Rust
        run: rustup toolchain install stable --profile minimal

      - name: Install cargo-llvm-cov
        uses: taiki-e/install-action@cargo-llvm-cov

      - name: Rust Cache
        uses: Swatinem/rust-cache@v2

      - name: Run tests
        run: cargo llvm-cov --all-features --workspace --codecov --output-path codecov-unit.json

      - name: Test docs
        run: cargo test --doc

      - name: Upload coverage
        uses: actions/upload-artifact@v3
        with:
          name: codecov-unit
          path: codecov-unit.json

  publish-crates:
    if: ${{ github.event_name == 'push' }}
    name: Publish to crates.io

    runs-on: ubuntu-latest
    environment: crates.io
    needs: [lint, unit-tests]

    permissions:
      contents: write

    steps:
      - uses: actions/checkout@v3

      - name: Setup Rust
        run: rustup toolchain install stable --profile minimal

      - name: Rust Cache
        uses: Swatinem/rust-cache@v2

      - name: Read version
        id: status
        run: |
          VERSION=$(cargo metadata -q --format-version 1 | jq -r '.packages | map(select(.name == "pythagore")) | .[0].version')
          TAG="v$VERSION"
          
          echo "::group::Load tags"
          
          git fetch --tags
          
          echo "::endgroup::"
          
          if [[ $(git tag -l $TAG) == $TAG ]]; then
            echo "::notice::Version $VERSION already published"
          else
            echo "publish=true" >> $GITHUB_OUTPUT
          fi
          
          echo "tag=$TAG" >> $GITHUB_OUTPUT
          echo "version=$VERSION" >> $GITHUB_OUTPUT

      - name: Run semver-checks
        if: ${{ steps.status.outputs.publish }}
        run: |
          cargo install cargo-semver-checks --locked
          cargo semver-checks check-release --all-features

      - name: Publish
        if: ${{ steps.status.outputs.publish }}
        uses: katyo/publish-crates@v2
        with:
          registry-token: ${{ secrets.CARGO_REGISTRY_TOKEN }}

      - name: Tag ${{ steps.status.outputs.version }}
        if: ${{ steps.status.outputs.publish }}
        run: |
          git config user.name github-actions
          git config user.email github-actions@github.com
          
          git tag ${{ steps.status.outputs.tag }}
          git push --tags

      - name: Release notes
        if: ${{ steps.status.outputs.publish }}
        uses: softprops/action-gh-release@v1
        with:
          name: ${{ steps.status.outputs.version }}
          tag_name: ${{ steps.status.outputs.tag }}
          draft: true
          generate_release_notes: true

  publish-npm:
    if: ${{ github.event_name == 'push' }}
    name: Publish to npm

    runs-on: ubuntu-latest
    environment: npm
    needs: [lint, unit-tests]

    permissions:
      contents: write

    steps:
      - uses: actions/checkout@v3

      - name: Setup Node.js 18.x
        uses: actions/setup-node@v3.7.0
        with:
          node-version: 18.x
          registry-url: https://registry.npmjs.org

      - name: Setup Rust stable
        run: rustup toolchain install stable --profile minimal

      - name: Install wasm-pack
        uses: taiki-e/install-action@wasm-pack

      - name: Rust Cache
        uses: Swatinem/rust-cache@v2

      - name: Build
        run: wasm-pack build --all-features --scope jujulego --weak-refs

      - name: Publish
        run: yarn npm publish --access public --tolerate-republish
        working-directory: pkg
        env:
          YARN_NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

  codecov:
    if: ${{ !startsWith(github.head_ref, 'renovate/') }}
    runs-on: ubuntu-latest
    needs: [unit-tests]

    steps:
      - uses: actions/checkout@v3

      - name: Download unit coverage
        uses: actions/download-artifact@v3
        with:
          name: codecov-unit

      - name: Upload unit coverage to Codecov
        uses: codecov/codecov-action@v3
        with:
          files: codecov-unit.json
          flags: unit
          fail_ci_if_error: true