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 @@
+
+
@@ -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 (