+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/
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
- 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:
--- /dev/null
+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 -%}
+<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}"></a>
+{% endfor -%}
+{%- for sponsor in sponsors.silver -%}
+<a href="{{ sponsor.url }}" target="_blank" title="{{ sponsor.title }}"><img src="{{ sponsor.img }}"></a>
+{% 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"</style>\n\n", content)
+ match_start = re.search(r"<!-- sponsors -->", content)
+ match_end = re.search(r"<!-- /sponsors -->", 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 (<style>) in index.md")
+ frontmatter_end = match_pre.end()
+ pre_end = match_start.end()
+ post_start = match_end.start()
+ template = Template(index_sponsors_template)
+ message = template.render(sponsors=sponsors)
+ pre_content = content[frontmatter_end:pre_end]
+ post_content = content[post_start:]
+ new_content = pre_content + message + post_content
+ return new_content
+
+
+@app.command()
+def generate_readme() -> None:
+ """
+ Generate README.md content from main index.md
+ """
+ typer.echo("Generating README")
+ readme_path = Path("README.md")
+ new_content = generate_readme_content()
+ readme_path.write_text(new_content, encoding="utf-8")
+
+
+@app.command()
+def verify_readme() -> None:
+ """
+ Verify README.md content from main index.md
+ """
+ typer.echo("Verifying README")
+ readme_path = Path("README.md")
+ generated_content = generate_readme_content()
+ readme_content = readme_path.read_text("utf-8")
+ if generated_content != readme_content:
+ typer.secho(
+ "README.md outdated from the latest index.md", color=typer.colors.RED
+ )
+ raise typer.Abort()
+ typer.echo("Valid README ✅")
+
+
+@app.command()
+def live() -> None:
+ """
+ Serve with livereload a docs site for a specific language.
+
+ This only shows the actual translated files, not the placeholders created with
+ build-all.
+
+ Takes an optional LANG argument with the name of the language to serve, by default
+ en.
+ """
+ # Enable line numbers during local development to make it easier to highlight
+ os.environ["LINENUMS"] = "true"
+ mkdocs.commands.serve.serve(dev_addr="127.0.0.1:8008")
+
+
+@app.command()
+def build() -> None:
+ """
+ Build the docs.
+ """
+ insiders_env_file = os.environ.get("INSIDERS_FILE")
+ print(f"Insiders file {insiders_env_file}")
+ if is_mkdocs_insiders():
+ print("Using insiders")
+ print("Building docs")
+ subprocess.run(["mkdocs", "build"], check=True)
+ typer.secho("Successfully built docs", color=typer.colors.GREEN)
+
+
+@app.command()
+def serve() -> None:
+ """
+ A quick server to preview a built site.
+
+ For development, prefer the command live (or just mkdocs serve).
+
+ This is here only to preview the documentation site.
+
+ Make sure you run the build command first.
+ """
+ typer.echo("Warning: this is a very simple server.")
+ typer.echo("For development, use the command live instead.")
+ typer.echo("This is here only to preview the documentation site.")
+ typer.echo("Make sure you run the build command first.")
+ os.chdir("site")
+ server_address = ("", 8008)
+ server = HTTPServer(server_address, SimpleHTTPRequestHandler)
+ typer.echo("Serving at: http://127.0.0.1:8008")
+ server.serve_forever()
+
+
+if __name__ == "__main__":
+ app()