Switch to side-by-side view

--- a
+++ b/.github/workflows/build_dist.yaml
@@ -0,0 +1,91 @@
+name: Build distributions
+
+on:
+  pull_request:
+  release:
+    types:
+      - published
+
+jobs:
+  ruff:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - uses: actions/setup-python@v5
+      - run: pip install ruff
+      - name: Check formatting
+        run: ruff format --check
+      - name: Check linting
+        run: ruff check --output-format=github .
+
+  tests_and_coverage:
+    needs: [ruff]
+    name: Run unit tests and upload coverage report
+    runs-on: ${{ matrix.os }}
+    strategy:
+      matrix:
+        os: [ubuntu-latest, macos-latest]
+        python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
+
+    steps:
+      - uses: actions/checkout@v4
+
+      - uses: actions/setup-python@v5
+        with:
+          python-version: ${{ matrix.python-version }}
+
+      - name: Install test dependencies
+        run: pip install tox tox-gh-actions
+
+      - name: Run tests and build coverage report
+        run: tox
+
+      # upload the coverage report to coveralls.io
+      - name: Upload coverage reports to Coveralls
+        uses: coverallsapp/github-action@v2.3.4
+        with:
+          parallel: true
+        if: ${{ matrix.python-version == '3.12' }}
+
+  finish_coverage:
+    needs: [tests_and_coverage]
+    name: Notify Coveralls that the parallel build has finished
+    runs-on: ubuntu-latest
+    steps:
+      - name: Close parallel build
+        uses: coverallsapp/github-action@v2.3.4
+        with:
+          parallel-finished: true
+
+  build_sdist:
+    needs: [ruff]
+    name: Build source distribution
+    runs-on: ubuntu-latest
+
+    steps:
+      - uses: actions/checkout@v4
+
+      - name: Build source distribution
+        run: pipx run build --sdist
+
+      - uses: actions/upload-artifact@v4
+        with:
+          name: inmoose_sdist
+          path: dist/inmoose-*.tar.gz
+
+  upload_pypi:
+    needs: [build_sdist, tests_and_coverage]
+    name: Publish source distribution on PyPI
+    runs-on: ubuntu-latest
+    permissions:
+      # IMPORTANT: this permission is mandatory for trusted publishing
+      id-token: write
+    if: github.event_name == 'release' && github.event.action == 'published'
+    steps:
+      - uses: actions/download-artifact@v4
+        with:
+          name: inmoose_sdist
+          path: dist
+
+      - uses: pypa/gh-action-pypi-publish@v1.12.3
+