diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 3d29204..2e60ed7 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 a9387c5..ba3bb21 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 0000000..95cf878 --- /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 0000000..0bb4cb9 Binary files /dev/null and b/docs/img/sponsors/govcert.png differ diff --git a/docs/index.md b/docs/index.md index 524ef99..f77cc7b 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 9f2775f..d24d754 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 0000000..07aefaa --- /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 0000000..e69de29 diff --git a/mkdocs.yml b/mkdocs.yml index a41839c..ce98f15 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 9bfc434..24a6c5c 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 0000000..cab6c87 --- /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 (