From c2aeec30928ba10eb499cb9de390895f02cc1f82 Mon Sep 17 00:00:00 2001 From: Pier-Jean Malandrino Date: Mon, 23 Mar 2026 09:51:03 +0100 Subject: [PATCH] Add live documentaiton and change architecture diagram --- .github/workflows/docling-compat.yml | 95 +++++++++++++++++++++++++++ docs/Sans-titre-2026-03-10-1116.png | Bin 0 -> 56370 bytes docs/architecture.md | 37 ++++++++--- docs/images/archi.png | Bin 0 -> 56370 bytes docs/index.md | 2 + 5 files changed, 126 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/docling-compat.yml create mode 100644 docs/Sans-titre-2026-03-10-1116.png create mode 100644 docs/images/archi.png diff --git a/.github/workflows/docling-compat.yml b/.github/workflows/docling-compat.yml new file mode 100644 index 0000000..0d6f2ee --- /dev/null +++ b/.github/workflows/docling-compat.yml @@ -0,0 +1,95 @@ +name: Docling compatibility + +# Runs daily and on manual trigger. +# Installs the LATEST docling + docling-core (ignoring version pins) +# and runs the backend tests. Opens an issue if something breaks. + +on: + schedule: + - cron: "30 6 * * *" # Every day at 06:30 UTC + workflow_dispatch: # Manual trigger from GitHub UI + +jobs: + compat: + name: Test against latest Docling + runs-on: ubuntu-latest + defaults: + run: + working-directory: document-parser + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: pip + cache-dependency-path: document-parser/requirements.txt + + - name: Install system dependencies + run: sudo apt-get update && sudo apt-get install -y --no-install-recommends poppler-utils + + - name: Install pinned dependencies + run: | + pip install --upgrade pip + pip install -r requirements.txt + pip install pytest pytest-asyncio httpx + + - name: Upgrade docling to latest + id: versions + run: | + pip install --upgrade docling docling-core + echo "docling=$(pip show docling | grep Version | cut -d' ' -f2)" >> "$GITHUB_OUTPUT" + echo "docling_core=$(pip show docling-core | grep Version | cut -d' ' -f2)" >> "$GITHUB_OUTPUT" + + - name: Run tests + run: pytest tests/ -v + + - name: Open issue on failure + if: failure() + uses: actions/github-script@v7 + with: + script: | + const docling = '${{ steps.versions.outputs.docling }}'; + const doclingCore = '${{ steps.versions.outputs.docling_core }}'; + const run = `${context.serverUrl}/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId}`; + + // Don't open duplicate issues + const { data: issues } = await github.rest.issues.listForRepo({ + owner: context.repo.owner, + repo: context.repo.repo, + state: 'open', + labels: 'docling-compat', + }); + + const title = `Docling compatibility break: docling ${docling} / docling-core ${doclingCore}`; + + if (issues.some(i => i.title === title)) { + console.log('Issue already exists, skipping.'); + return; + } + + await github.rest.issues.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title, + labels: ['docling-compat', 'bug'], + body: [ + `## Docling compatibility failure`, + ``, + `The daily compatibility check failed with the latest Docling releases:`, + ``, + `| Package | Version |`, + `|---------|---------|`, + `| \`docling\` | \`${docling}\` |`, + `| \`docling-core\` | \`${doclingCore}\` |`, + ``, + `**Workflow run:** [View logs](${run})`, + ``, + `### Next steps`, + `1. Check the failing tests in the workflow logs`, + `2. Identify breaking changes in the Docling changelog`, + `3. Update the code and version pins in \`requirements.txt\``, + `4. Close this issue once fixed`, + ].join('\n'), + }); diff --git a/docs/Sans-titre-2026-03-10-1116.png b/docs/Sans-titre-2026-03-10-1116.png new file mode 100644 index 0000000000000000000000000000000000000000..f81569dc211d74a14bcc35468d5b2bdf245591a1 GIT binary patch literal 56370 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Ķ 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 brSIn4h~N2_I^$lS1-$&X2K!z26(0K+mGeAP literal 0 HcmV?d00001 diff --git a/docs/architecture.md b/docs/architecture.md index 6e236e5..9cfcade 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -2,17 +2,38 @@ ## Overview -``` -┌────────────┐ ┌───────────────────────┐ -│ Frontend │────────▶│ Document Parser │ -│ Vue 3 + TS │ /api/* │ FastAPI + Docling │ -│ port 3000 │ │ SQLite + file storage │ -└────────────┘ │ port 8000 │ - └───────────────────────┘ -``` +![Docling Studio architecture](images/archi.png){ width="700" } Two services communicating via REST. The frontend is a Vue 3 SPA served by Nginx in production. The backend is a FastAPI app that wraps Docling's document conversion engine. +### Zooming into the backend + +The schema above shows the macro view. Inside the backend, the code follows a **Clean Architecture** with strict layer boundaries: + +``` +┌──────────────────────────────────────────────────────┐ +│ Backend │ +│ │ +│ ┌──────────┐ │ +│ │ api/ │ ← HTTP (FastAPI routes, Pydantic) │ +│ └────┬─────┘ │ +│ │ calls │ +│ ┌────▼─────┐ │ +│ │services/ │ ← Use case orchestration │ +│ └──┬────┬──┘ │ +│ │ │ │ +│ ┌───▼──┐ ┌▼───────────┐ │ +│ │domain│ │persistence/ │ │ +│ │ │ │ │ │ +│ │bbox │ │ SQLite CRUD │ ← Storage (your blue box) │ +│ │parse │ │ file store │ │ +│ └──────┘ └─────────────┘ │ +│ ↑ pure Python, no deps ↑ aiosqlite │ +└──────────────────────────────────────────────────────┘ +``` + +Dependencies flow **inward**: `api → services → domain`. The domain layer has zero knowledge of HTTP or database. + ## Backend — Clean Architecture The backend follows a strict layered architecture. Dependencies flow inward: API → Services → Domain. The domain layer has zero knowledge of HTTP or database. diff --git a/docs/images/archi.png b/docs/images/archi.png new file mode 100644 index 0000000000000000000000000000000000000000..f81569dc211d74a14bcc35468d5b2bdf245591a1 GIT binary patch literal 56370 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Ķ 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 brSIn4h~N2_I^$lS1-$&X2K!z26(0K+mGeAP literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index 9ae42fc..1da8358 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,6 +4,8 @@ A visual document analysis studio powered by [Docling](https://github.com/DS4SD/ Upload a PDF, configure the extraction pipeline, and visualize the results — text, tables, images, formulas, bounding boxes — all from your browser. +![Docling Studio architecture](images/archi.png){ width="600" } + ![Docling Studio — Execution Result](screenshots/DS-execution-result.png) ## Features