From 276bcf788c17bc387984c228d4a5d22bb43062e5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 4 Dec 2023 13:00:47 +0100 Subject: [PATCH] =?utf8?q?=F0=9F=94=A7=20Update=20docs=20build=20setup,=20?= =?utf8?q?add=20support=20for=20sponsors,=20add=20sponsor=20GOVCERT.LU=20(?= =?utf8?q?#720)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .github/workflows/build-docs.yml | 10 +- README.md | 10 +- data/sponsors.yml | 6 ++ docs/img/sponsors/govcert.png | Bin 0 -> 10063 bytes docs/index.md | 19 ++++ mkdocs.insiders.yml | 5 +- mkdocs.maybe-insiders.yml | 6 ++ mkdocs.no-insiders.yml | 0 mkdocs.yml | 28 +++--- pyproject.toml | 2 + scripts/docs.py | 155 +++++++++++++++++++++++++++++++ 11 files changed, 220 insertions(+), 21 deletions(-) create mode 100644 data/sponsors.yml create mode 100644 docs/img/sponsors/govcert.png create mode 100644 mkdocs.maybe-insiders.yml create mode 100644 mkdocs.no-insiders.yml create mode 100644 scripts/docs.py diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 3d29204f..2e60ed7d 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -30,6 +30,8 @@ jobs: - pyproject.toml - mkdocs.yml - mkdocs.insiders.yml + - ./github/workflows/build-docs.yml + - ./github/workflows/deploy-docs.yml build-docs: needs: @@ -69,12 +71,10 @@ jobs: with: key: mkdocs-cards-${{ github.ref }} path: .cache + - name: Verify README + run: python ./scripts/docs.py verify-readme - name: Build Docs - if: github.event_name == 'pull_request' && github.secret_source != 'Actions' - run: python -m poetry run mkdocs build - - name: Build Docs with Insiders - if: github.event_name != 'pull_request' || github.secret_source == 'Actions' - run: python -m poetry run mkdocs build --config-file mkdocs.insiders.yml + run: python ./scripts/docs.py build - uses: actions/upload-artifact@v3 with: name: docs-site diff --git a/README.md b/README.md index a9387c51..ba3bb219 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,14 @@ The key features are: * **Extensible**: You have all the power of SQLAlchemy and Pydantic underneath. * **Short**: Minimize code duplication. A single type annotation does a lot of work. No need to duplicate models in SQLAlchemy and Pydantic. +## Sponsors + + + + + + + ## SQL Databases in FastAPI @@ -68,7 +76,7 @@ Successfully installed sqlmodel ## Example -For an introduction to databases, SQL, and everything else, see the SQLModel documentation. +For an introduction to databases, SQL, and everything else, see the SQLModel documentation. Here's a quick example. ✨ diff --git a/data/sponsors.yml b/data/sponsors.yml new file mode 100644 index 00000000..95cf8785 --- /dev/null +++ b/data/sponsors.yml @@ -0,0 +1,6 @@ +gold: [] +silver: + - url: https://www.govcert.lu + title: This project is being supported by GOVCERT.LU + img: https://sqlmodel.tiangolo.com/img/sponsors/govcert.png +bronze: [] diff --git a/docs/img/sponsors/govcert.png b/docs/img/sponsors/govcert.png new file mode 100644 index 0000000000000000000000000000000000000000..0bb4cb934ae3a8f9aa3d1ce04546eda5b51be4fb GIT binary patch literal 10063 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 J6$h~={tqi94%q+z literal 0 Hc-jL100001 diff --git a/docs/index.md b/docs/index.md index 524ef992..f77cc7b8 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,3 +1,7 @@ + +

SQLModel

@@ -38,6 +42,21 @@ The key features are: * **Extensible**: You have all the power of SQLAlchemy and Pydantic underneath. * **Short**: Minimize code duplication. A single type annotation does a lot of work. No need to duplicate models in SQLAlchemy and Pydantic. +## Sponsors + + + +{% if sponsors %} +{% for sponsor in sponsors.gold -%} + +{% endfor -%} +{%- for sponsor in sponsors.silver -%} + +{% endfor %} +{% endif %} + + + ## SQL Databases in FastAPI diff --git a/mkdocs.insiders.yml b/mkdocs.insiders.yml index 9f2775ff..d24d7549 100644 --- a/mkdocs.insiders.yml +++ b/mkdocs.insiders.yml @@ -1,4 +1,3 @@ -INHERIT: mkdocs.yml plugins: - - search - - social + social: + typeset: diff --git a/mkdocs.maybe-insiders.yml b/mkdocs.maybe-insiders.yml new file mode 100644 index 00000000..07aefaaa --- /dev/null +++ b/mkdocs.maybe-insiders.yml @@ -0,0 +1,6 @@ +# Define this here and not in the main mkdocs.yml file because that one could be auto +# updated and written, and the script would remove the env var +INHERIT: !ENV [INSIDERS_FILE, './mkdocs.no-insiders.yml'] +markdown_extensions: + pymdownx.highlight: + linenums: !ENV [LINENUMS, false] diff --git a/mkdocs.no-insiders.yml b/mkdocs.no-insiders.yml new file mode 100644 index 00000000..e69de29b diff --git a/mkdocs.yml b/mkdocs.yml index a41839c1..ce98f152 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,3 +1,4 @@ +INHERIT: ./mkdocs.maybe-insiders.yml site_name: SQLModel site_description: SQLModel, SQL databases in Python, designed for simplicity, compatibility, and robustness. site_url: https://sqlmodel.tiangolo.com/ @@ -36,6 +37,11 @@ theme: repo_name: tiangolo/sqlmodel repo_url: https://github.com/tiangolo/sqlmodel edit_uri: '' +plugins: + search: null + markdownextradata: + data: ./data + nav: - SQLModel: index.md - features.md @@ -98,30 +104,28 @@ nav: - release-notes.md markdown_extensions: -- markdown.extensions.attr_list -- markdown.extensions.tables -- markdown.extensions.md_in_html -- toc: + markdown.extensions.attr_list: + markdown.extensions.tables: + markdown.extensions.md_in_html: + toc: permalink: true -- pymdownx.superfences: + pymdownx.superfences: custom_fences: - name: mermaid class: mermaid format: !!python/name:pymdownx.superfences.fence_code_format '' -- pymdownx.betterem -- pymdownx.highlight: - linenums: !ENV [LINENUMS, false] -- pymdownx.blocks.details -- pymdownx.blocks.admonition: + pymdownx.betterem: + pymdownx.blocks.details: + pymdownx.blocks.admonition: types: - note - info - tip - warning - danger -- pymdownx.blocks.tab: + pymdownx.blocks.tab: alternate_style: True -- mdx_include + mdx_include: extra: analytics: diff --git a/pyproject.toml b/pyproject.toml index 9bfc434c..24a6c5c2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,6 +50,8 @@ fastapi = "^0.103.2" ruff = "^0.1.2" # For FastAPI tests httpx = "0.24.1" +typer-cli = "^0.0.13" +mkdocs-markdownextradata-plugin = ">=0.1.7,<0.3.0" [build-system] requires = ["poetry-core"] diff --git a/scripts/docs.py b/scripts/docs.py new file mode 100644 index 00000000..cab6c87d --- /dev/null +++ b/scripts/docs.py @@ -0,0 +1,155 @@ +import logging +import os +import re +import subprocess +from functools import lru_cache +from http.server import HTTPServer, SimpleHTTPRequestHandler +from importlib import metadata +from pathlib import Path + +import mkdocs.commands.build +import mkdocs.commands.serve +import mkdocs.config +import mkdocs.utils +import typer +from jinja2 import Template + +logging.basicConfig(level=logging.INFO) + +mkdocs_name = "mkdocs.yml" +en_docs_path = Path("") + +app = typer.Typer() + + +@lru_cache +def is_mkdocs_insiders() -> bool: + version = metadata.version("mkdocs-material") + return "insiders" in version + + +@app.callback() +def callback() -> None: + if is_mkdocs_insiders(): + os.environ["INSIDERS_FILE"] = "./mkdocs.insiders.yml" + # For MacOS with insiders and Cairo + os.environ["DYLD_FALLBACK_LIBRARY_PATH"] = "/opt/homebrew/lib" + + +index_sponsors_template = """ +{% if sponsors %} +{% for sponsor in sponsors.gold -%} + +{% endfor -%} +{%- for sponsor in sponsors.silver -%} + +{% endfor %} +{% endif %} +""" + + +def generate_readme_content() -> str: + en_index = en_docs_path / "docs" / "index.md" + content = en_index.read_text("utf-8") + match_pre = re.search(r"\n\n", content) + match_start = re.search(r"", content) + match_end = re.search(r"", content) + sponsors_data_path = en_docs_path / "data" / "sponsors.yml" + sponsors = mkdocs.utils.yaml_load(sponsors_data_path.read_text(encoding="utf-8")) + if not (match_start and match_end): + raise RuntimeError("Couldn't auto-generate sponsors section") + if not match_pre: + raise RuntimeError("Couldn't find pre section (