mirror of
https://github.com/Dictionarry-Hub/schema.git
synced 2026-05-03 06:14:17 +02:00
62 lines
1.8 KiB
Bash
Executable File
62 lines
1.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
|
schema_sql="$repo_root/ops/0.schema.sql"
|
|
out_dir="$repo_root/.github/image"
|
|
|
|
tmp_dir="$(mktemp -d)"
|
|
dot_file="$tmp_dir/schema.dot"
|
|
|
|
SCHEMA_SQL="$schema_sql" DOT_FILE="$dot_file" python3 - <<'PY'
|
|
import os
|
|
import re
|
|
from pathlib import Path
|
|
|
|
schema_sql = Path(os.environ["SCHEMA_SQL"]).read_text(encoding="utf-8")
|
|
|
|
create_table_re = re.compile(r"CREATE\s+TABLE\s+([A-Za-z0-9_]+)\s*\(", re.IGNORECASE)
|
|
references_re = re.compile(r"REFERENCES\s+([A-Za-z0-9_]+)", re.IGNORECASE)
|
|
|
|
tables = set(create_table_re.findall(schema_sql))
|
|
blocks = re.split(r"CREATE\s+TABLE\s+", schema_sql, flags=re.IGNORECASE)[1:]
|
|
|
|
edges = set()
|
|
for block in blocks:
|
|
name_match = re.match(r"([A-Za-z0-9_]+)", block)
|
|
if not name_match:
|
|
continue
|
|
table_name = name_match.group(1)
|
|
for ref in references_re.findall(block):
|
|
edges.add((table_name, ref))
|
|
|
|
lines = []
|
|
lines.append("digraph schema {")
|
|
lines.append(" rankdir=LR;")
|
|
lines.append(" splines=true;")
|
|
lines.append(" overlap=false;")
|
|
lines.append("")
|
|
for table in sorted(tables):
|
|
lines.append(f' "{table}";')
|
|
lines.append("")
|
|
for src, dst in sorted(edges):
|
|
lines.append(f' "{src}" -> "{dst}";')
|
|
lines.append("}")
|
|
|
|
Path(os.environ["DOT_FILE"]).write_text("\n".join(lines) + "\n", encoding="utf-8")
|
|
PY
|
|
|
|
mkdir -p "$out_dir"
|
|
|
|
dot -Tsvg -o "$out_dir/schema.svg" \
|
|
-Gbgcolor="#ffffff" \
|
|
-Nshape="box" -Nstyle="filled" -Nfillcolor="#f8f8f8" -Ncolor="#444444" -Nfontcolor="#111111" -Nfontname="Helvetica" -Nfontsize="12" \
|
|
-Ecolor="#666666" \
|
|
"$dot_file"
|
|
|
|
dot -Tsvg -o "$out_dir/schema-dark.svg" \
|
|
-Gbgcolor="#0b0b0b" \
|
|
-Nshape="box" -Nstyle="filled" -Nfillcolor="#1f1f1f" -Ncolor="#777777" -Nfontcolor="#f5f5f5" -Nfontname="Helvetica" -Nfontsize="12" \
|
|
-Ecolor="#aaaaaa" \
|
|
"$dot_file"
|