docs(map): ссылки на материалы перенесены в Gitea
This commit is contained in:
1 parent
6be0442838
commit
ec9dd4c1a8
6 files changed
+42
-16
No files matched your search
@@ -148,7 +148,7 @@
|
|||||||
<header>
|
<header>
|
||||||
<h1 id="page-title"></h1>
|
<h1 id="page-title"></h1>
|
||||||
<p class="lead" id="lead"></p>
|
<p class="lead" id="lead"></p>
|
||||||
<p class="navigation"><a href="db_schema.md">Руководство: от бронирования до витрины</a> · Учебная ветка main</p>
|
<p class="navigation"><a href="https://git.dementev.space/ddmitry/airflow-greenplum/src/docs/design/db_schema.md" target="_blank" rel="noopener noreferrer">Руководство: от бронирования до витрины (Gitea)</a> · Учебная ветка main</p>
|
||||||
</header>
|
</header>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<div class="switcher" id="switcher" aria-label="Вид связей"></div>
|
<div class="switcher" id="switcher" aria-label="Вид связей"></div>
|
||||||
@@ -196,11 +196,12 @@
|
|||||||
</div>
|
</div>
|
||||||
<aside id="details" aria-live="polite" aria-label="Карточка выбранного объекта"></aside>
|
<aside id="details" aria-live="polite" aria-label="Карточка выбранного объекта"></aside>
|
||||||
</main>
|
</main>
|
||||||
<noscript>Для интерактивной карты включите JavaScript. Объяснение модели доступно в <a href="db_schema.md">руководстве</a>.</noscript>
|
<noscript>Для интерактивной карты включите JavaScript. Объяснение модели доступно в <a href="https://git.dementev.space/ddmitry/airflow-greenplum/src/docs/design/db_schema.md">руководстве в Gitea</a>.</noscript>
|
||||||
<script>
|
<script>
|
||||||
const MAP = {
|
const MAP = {
|
||||||
"title": "Хранилище авиаперевозок",
|
"title": "Хранилище авиаперевозок",
|
||||||
"lead": "От бронирования до витрины: выберите таблицу или связь.",
|
"lead": "От бронирования до витрины: выберите таблицу или связь.",
|
||||||
|
"repository_url": "https://git.dementev.space/ddmitry/airflow-greenplum/src/",
|
||||||
"layers": [
|
"layers": [
|
||||||
{
|
{
|
||||||
"id": "source",
|
"id": "source",
|
||||||
@@ -5001,7 +5002,8 @@
|
|||||||
links.forEach((item) => {
|
links.forEach((item) => {
|
||||||
const row = document.createElement("li");
|
const row = document.createElement("li");
|
||||||
const link = document.createElement("a");
|
const link = document.createElement("a");
|
||||||
link.href = item.url;
|
// Выбор таблицы остается в локальной карте; файлы открываются в Gitea.
|
||||||
|
link.href = item.url.startsWith("#") ? item.url : new URL(item.url, new URL("docs/design/", MAP.repository_url)).href;
|
||||||
link.target = "_blank";
|
link.target = "_blank";
|
||||||
link.rel = "noopener noreferrer";
|
link.rel = "noopener noreferrer";
|
||||||
link.textContent = item.label;
|
link.textContent = item.label;
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# Исходники карты DWH
|
# Исходники карты DWH
|
||||||
|
|
||||||
Готовый файл - [../architecture-map.html](../architecture-map.html).
|
Готовый файл - [../architecture-map.html](../architecture-map.html).
|
||||||
Откройте его локально в браузере. Сервер и интернет не требуются;
|
Откройте его локально в браузере. Для самой карты сервер и интернет не требуются.
|
||||||
SQL и Markdown открываются из соседних каталогов репозитория.
|
Ссылки на SQL, DAG и Markdown открывают Gitea, поэтому для переходов нужен интернет.
|
||||||
Учебный маршрут находится в [руководстве о структуре](../db_schema.md).
|
Учебный маршрут находится в [руководстве о структуре](../db_schema.md).
|
||||||
|
|
||||||
## Редактирование и сборка
|
## Редактирование и сборка
|
||||||
@@ -28,6 +28,13 @@ uv run docs/design/architecture-map/render.py --check
|
|||||||
Проверка входов учитывает именованные таблицы в FROM/JOIN;
|
Проверка входов учитывает именованные таблицы в FROM/JOIN;
|
||||||
смысл соединений нужно сверять при изменении SQL вручную.
|
смысл соединений нужно сверять при изменении SQL вручную.
|
||||||
|
|
||||||
|
`repository_url` в `map.json` задает адрес Gitea с окончанием `/src/`.
|
||||||
|
В нем нет имени ветки или коммита: Gitea открывает файл из текущей ветки
|
||||||
|
по умолчанию. Пути в `links` остаются относительными к готовому HTML,
|
||||||
|
чтобы сборка проверяла файлы и разделы в локальном репозитории;
|
||||||
|
интерфейс преобразует их в адреса Gitea. Ссылки вида `#node=…` остаются
|
||||||
|
в локальной карте. Ссылка на руководство в шапке собирается из того же адреса.
|
||||||
|
|
||||||
Внешние `stg.*_ext` представлены в карточках STG, поскольку это входы чтения,
|
Внешние `stg.*_ext` представлены в карточках STG, поскольку это входы чтения,
|
||||||
а не еще одна копия данных. Поля источника сверяются с контрактом PXF.
|
а не еще одна копия данных. Поля источника сверяются с контрактом PXF.
|
||||||
Для заглушек используются DDL и `docs/assignment/analyst_spec.md`.
|
Для заглушек используются DDL и `docs/assignment/analyst_spec.md`.
|
||||||
@@ -55,6 +62,8 @@ uv run docs/design/architecture-map/render.py --check
|
|||||||
4. У факта откройте обе роли `dim_airports`, путь через `ods.routes`
|
4. У факта откройте обе роли `dim_airports`, путь через `ods.routes`
|
||||||
и выбор версии `dim_routes`. Проверьте отдельные карточки связей.
|
и выбор версии `dim_routes`. Проверьте отдельные карточки связей.
|
||||||
5. Откройте адрес объекта, обновите страницу, проверьте назад/вперед.
|
5. Откройте адрес объекта, обновите страницу, проверьте назад/вперед.
|
||||||
Откройте DDL, загрузку, DQ и пункт задания из карточки.
|
Откройте DDL, загрузку, DQ, DAG и пункт задания из карточки в Gitea.
|
||||||
|
Проверьте форматирование Markdown, подсветку кода и переход к разделу задания.
|
||||||
|
Ссылка на таблицу должна открывать локальную карту с тем же выбором.
|
||||||
6. Проверьте выбор клавишами Enter/пробел и вид на узком экране.
|
6. Проверьте выбор клавишами Enter/пробел и вид на узком экране.
|
||||||
На узком экране карта прокручивается, карточка находится под ней.
|
На узком экране карта прокручивается, карточка находится под ней.
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"title": "Хранилище авиаперевозок",
|
"title": "Хранилище авиаперевозок",
|
||||||
"lead": "От бронирования до витрины: выберите таблицу или связь.",
|
"lead": "От бронирования до витрины: выберите таблицу или связь.",
|
||||||
|
"repository_url": "https://git.dementev.space/ddmitry/airflow-greenplum/src/",
|
||||||
"layers": [
|
"layers": [
|
||||||
{
|
{
|
||||||
"id": "source",
|
"id": "source",
|
||||||
|
|||||||
@@ -10,8 +10,9 @@ from __future__ import annotations
|
|||||||
import argparse
|
import argparse
|
||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
|
from html import escape
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from urllib.parse import unquote, urlsplit
|
from urllib.parse import unquote, urljoin, urlsplit
|
||||||
|
|
||||||
HERE = Path(__file__).resolve().parent
|
HERE = Path(__file__).resolve().parent
|
||||||
ROOT = HERE.parents[2]
|
ROOT = HERE.parents[2]
|
||||||
@@ -34,6 +35,15 @@ def headings(text: str) -> set[str]:
|
|||||||
|
|
||||||
def validate(data: dict) -> None:
|
def validate(data: dict) -> None:
|
||||||
"""Сверить объекты, поля, статусы, входы готовых SQL и локальные ссылки."""
|
"""Сверить объекты, поля, статусы, входы готовых SQL и локальные ссылки."""
|
||||||
|
repository = urlsplit(data["repository_url"])
|
||||||
|
if (
|
||||||
|
repository.scheme != "https"
|
||||||
|
or not repository.netloc
|
||||||
|
or not repository.path.endswith("/src/")
|
||||||
|
or repository.query
|
||||||
|
or repository.fragment
|
||||||
|
):
|
||||||
|
raise ValueError("Укажите HTTPS-адрес репозитория Gitea с окончанием /src/")
|
||||||
nodes = {node["id"]: node for node in data["nodes"]}
|
nodes = {node["id"]: node for node in data["nodes"]}
|
||||||
if len(nodes) != len(data["nodes"]):
|
if len(nodes) != len(data["nodes"]):
|
||||||
raise ValueError("Повторяется идентификатор объекта")
|
raise ValueError("Повторяется идентификатор объекта")
|
||||||
@@ -140,7 +150,10 @@ def main() -> int:
|
|||||||
if template.count(MARKER) != 1:
|
if template.count(MARKER) != 1:
|
||||||
raise ValueError("В шаблоне должен быть ровно один маркер данных")
|
raise ValueError("В шаблоне должен быть ровно один маркер данных")
|
||||||
payload = json.dumps(data, ensure_ascii=False, indent=2).replace("<", "\\u003c")
|
payload = json.dumps(data, ensure_ascii=False, indent=2).replace("<", "\\u003c")
|
||||||
result = NOTICE + template.replace(MARKER, payload)
|
guide_url = urljoin(data["repository_url"], "docs/design/db_schema.md")
|
||||||
|
result = NOTICE + template.replace(MARKER, payload).replace(
|
||||||
|
"__GUIDE_URL__", escape(guide_url, quote=True)
|
||||||
|
)
|
||||||
if args.check:
|
if args.check:
|
||||||
if not OUTPUT.exists() or OUTPUT.read_text(encoding="utf-8") != result:
|
if not OUTPUT.exists() or OUTPUT.read_text(encoding="utf-8") != result:
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
|
|||||||
@@ -147,7 +147,7 @@
|
|||||||
<header>
|
<header>
|
||||||
<h1 id="page-title"></h1>
|
<h1 id="page-title"></h1>
|
||||||
<p class="lead" id="lead"></p>
|
<p class="lead" id="lead"></p>
|
||||||
<p class="navigation"><a href="db_schema.md">Руководство: от бронирования до витрины</a> · Учебная ветка main</p>
|
<p class="navigation"><a href="__GUIDE_URL__" target="_blank" rel="noopener noreferrer">Руководство: от бронирования до витрины (Gitea)</a> · Учебная ветка main</p>
|
||||||
</header>
|
</header>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<div class="switcher" id="switcher" aria-label="Вид связей"></div>
|
<div class="switcher" id="switcher" aria-label="Вид связей"></div>
|
||||||
@@ -195,7 +195,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<aside id="details" aria-live="polite" aria-label="Карточка выбранного объекта"></aside>
|
<aside id="details" aria-live="polite" aria-label="Карточка выбранного объекта"></aside>
|
||||||
</main>
|
</main>
|
||||||
<noscript>Для интерактивной карты включите JavaScript. Объяснение модели доступно в <a href="db_schema.md">руководстве</a>.</noscript>
|
<noscript>Для интерактивной карты включите JavaScript. Объяснение модели доступно в <a href="__GUIDE_URL__">руководстве в Gitea</a>.</noscript>
|
||||||
<script>
|
<script>
|
||||||
const MAP = /*__MAP_DATA__*/;
|
const MAP = /*__MAP_DATA__*/;
|
||||||
const NS = "http://www.w3.org/2000/svg";
|
const NS = "http://www.w3.org/2000/svg";
|
||||||
@@ -252,7 +252,8 @@
|
|||||||
links.forEach((item) => {
|
links.forEach((item) => {
|
||||||
const row = document.createElement("li");
|
const row = document.createElement("li");
|
||||||
const link = document.createElement("a");
|
const link = document.createElement("a");
|
||||||
link.href = item.url;
|
// Выбор таблицы остается в локальной карте; файлы открываются в Gitea.
|
||||||
|
link.href = item.url.startsWith("#") ? item.url : new URL(item.url, new URL("docs/design/", MAP.repository_url)).href;
|
||||||
link.target = "_blank";
|
link.target = "_blank";
|
||||||
link.rel = "noopener noreferrer";
|
link.rel = "noopener noreferrer";
|
||||||
link.textContent = item.label;
|
link.textContent = item.label;
|
||||||
|
|||||||
@@ -15,11 +15,11 @@ xdg-open docs/design/architecture-map.html
|
|||||||
```
|
```
|
||||||
|
|
||||||
На Windows можно открыть этот же файл в Проводнике. Сервер, интернет и работающий
|
На Windows можно открыть этот же файл в Проводнике. Сервер, интернет и работающий
|
||||||
Docker для карты не нужны. Храните HTML рядом с остальными файлами репозитория:
|
Docker для карты не нужны: все ее данные включены в HTML.
|
||||||
ссылки из карточек ведут в локальные SQL и Markdown.
|
Ссылки на SQL, DAG, задание и это руководство открывают файлы в Gitea:
|
||||||
Браузер может показать Markdown как текст, а SQL предложить скачать.
|
документы — с форматированием, код — с подсветкой синтаксиса.
|
||||||
Скачанный файл можно открыть в редакторе; для форматированного чтения
|
Для этих переходов нужен интернет. Файлы берутся из текущей ветки репозитория
|
||||||
руководства используйте Markdown preview.
|
по умолчанию.
|
||||||
|
|
||||||
**В Gitea ссылка на HTML обычно показывает исходный текст, а не карту.**
|
**В Gitea ссылка на HTML обычно показывает исходный текст, а не карту.**
|
||||||
Сначала откройте локальный HTML. Адресная ссылка вида
|
Сначала откройте локальный HTML. Адресная ссылка вида
|
||||||
|
|||||||
Reference in new issue
Block a user