конвенции отделены от обвязки
- сами конвенции переехали в conventions/, описательное — в корень: LANGUAGE.md (язык записи) и GUIDE.md (как ведут конвенции) - conv синхронизирует только conventions/, пути в origin даются относительно неё — раскладка копий в репозиториях не меняется
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
принято», а не «что здесь происходит».
|
принято», а не «что здесь происходит».
|
||||||
|
|
||||||
Как записывается сама конвенция — правила, модальность, обоснования — в
|
Как записывается сама конвенция — правила, модальность, обоснования — в
|
||||||
[language.md](language.md). Здесь — про то, зачем конвенции заводятся, где
|
[LANGUAGE.md](LANGUAGE.md). Здесь — про то, зачем конвенции заводятся, где
|
||||||
живут и как соотносятся с соседними видами документов.
|
живут и как соотносятся с соседними видами документов.
|
||||||
|
|
||||||
## Область действия
|
## Область действия
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
Правила ниже адресованы автору конвенции — тому, кто заводит новый файл или
|
Правила ниже адресованы автору конвенции — тому, кто заводит новый файл или
|
||||||
правит существующий, в каноне и в копиях репозиториев. Обязательность живёт
|
правит существующий, в каноне и в копиях репозиториев. Обязательность живёт
|
||||||
на отдельном правиле, а не на файле; шкала модальных слов — в
|
на отдельном правиле, а не на файле; шкала модальных слов — в
|
||||||
[language.md](language.md).
|
[LANGUAGE.md](LANGUAGE.md).
|
||||||
|
|
||||||
## Отличие от соседей
|
## Отличие от соседей
|
||||||
|
|
||||||
@@ -5,6 +5,20 @@
|
|||||||
`ansible-roles`: канон не источник истины во время работы, а лавка, из
|
`ansible-roles`: канон не источник истины во время работы, а лавка, из
|
||||||
которой берут и в которую возвращают улучшения.
|
которой берут и в которую возвращают улучшения.
|
||||||
|
|
||||||
|
Сами конвенции лежат в `conventions/`, обвязка — в корне:
|
||||||
|
|
||||||
|
| Файл | Что описывает |
|
||||||
|
|---|---|
|
||||||
|
| `README.md` | устройство канона, оси, синхронизация, жизненный цикл |
|
||||||
|
| [LANGUAGE.md](LANGUAGE.md) | язык записи правил: номера, модальность, «Почему» |
|
||||||
|
| [GUIDE.md](GUIDE.md) | как ведут конвенции: когда заводить, механизация, отступления |
|
||||||
|
| `conv` | синхронизация копий |
|
||||||
|
|
||||||
|
Обвязка живёт только в каноне и в репозитории не оказывается — `conv`
|
||||||
|
синхронизирует лишь содержимое `conventions/`. Пока это осознанное
|
||||||
|
ограничение: копия конвенции ссылается на `LANGUAGE.md` как на внешний
|
||||||
|
документ.
|
||||||
|
|
||||||
Правило то же, что у ролей: **деплоится и читается только то, что лежит в
|
Правило то же, что у ролей: **деплоится и читается только то, что лежит в
|
||||||
git репозитория**. Канон никем не подключается на лету.
|
git репозитория**. Канон никем не подключается на лету.
|
||||||
|
|
||||||
@@ -30,12 +44,16 @@ git репозитория**. Канон никем не подключаетс
|
|||||||
## Оси
|
## Оси
|
||||||
|
|
||||||
```
|
```
|
||||||
common/ как вести сами конвенции
|
conventions/
|
||||||
arch/ решения, переживающие смену языка и инструментов
|
arch/ решения, переживающие смену языка и инструментов
|
||||||
lang/<язык>/ как решение реализуется и механизируется в языке
|
lang/<язык>/ как решение реализуется и механизируется в языке
|
||||||
stack/<стек>/ привязка к инструменту, хранилищу, транспорту
|
stack/<стек>/ привязка к инструменту, хранилищу, транспорту
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Пути правил даются относительно `conventions/`: адрес
|
||||||
|
`arch/db-identifiers.md R5`, а не `conventions/arch/…` — так же, как они
|
||||||
|
лягут в `docs/conventions/` репозитория.
|
||||||
|
|
||||||
Тест — по тому, замена чего убивает правило:
|
Тест — по тому, замена чего убивает правило:
|
||||||
|
|
||||||
> Умирает при смене **языка** → `lang/`. Умирает при смене **инструмента,
|
> Умирает при смене **языка** → `lang/`. Умирает при смене **инструмента,
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
"""conv — синхронизация конвенций между каноном и репозиторием.
|
"""conv — синхронизация конвенций между каноном и репозиторием.
|
||||||
|
|
||||||
Канон — эта директория. Репозиторий держит закоммиченные копии нужных
|
Канон — директория conventions/ рядом с этим скриптом. Репозиторий держит
|
||||||
конвенций в docs/conventions/, повторяя структуру канона. Копия — источник
|
закоммиченные копии нужных конвенций в docs/conventions/, повторяя её
|
||||||
правды для репозитория; канон — лавка, из которой берут.
|
структуру. Копия — источник правды для репозитория; канон — лавка, из
|
||||||
|
которой берут. Пути в origin даются относительно conventions/.
|
||||||
|
|
||||||
Служебная разметка копии:
|
Служебная разметка копии:
|
||||||
|
|
||||||
@@ -50,8 +51,8 @@ import sys
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import NoReturn
|
from typing import NoReturn
|
||||||
|
|
||||||
CANON = Path(__file__).resolve().parent
|
CANON = Path(__file__).resolve().parent / "conventions"
|
||||||
CANON_TREES = ("common", "arch", "lang", "stack")
|
CANON_TREES = ("arch", "lang", "stack")
|
||||||
SERVICE_KEYS = ("origin", "origin_hash", "synced", "local")
|
SERVICE_KEYS = ("origin", "origin_hash", "synced", "local")
|
||||||
DEFAULT_DIR = "docs/conventions"
|
DEFAULT_DIR = "docs/conventions"
|
||||||
ENC = "utf-8"
|
ENC = "utf-8"
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
создания и ценности содержимого: конфигурация, данные, кеш. Категория сразу
|
создания и ценности содержимого: конфигурация, данные, кеш. Категория сразу
|
||||||
отвечает на два вопроса, которые иначе выясняются чтением кода приложения:
|
отвечает на два вопроса, которые иначе выясняются чтением кода приложения:
|
||||||
**кто создаёт** содержимое и **что будет, если его потерять**. Из категорий
|
**кто создаёт** содержимое и **что будет, если его потерять**. Из категорий
|
||||||
механически выводится состав бэкапа. Форма записи — `common/language.md`.
|
механически выводится состав бэкапа. Форма записи — `LANGUAGE.md`.
|
||||||
|
|
||||||
## Область действия
|
## Область действия
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# Конфигурация приложения
|
# Конфигурация приложения
|
||||||
|
|
||||||
Как устроена конфигурация: где лежит, как попадает в процесс, что с
|
Как устроена конфигурация: где лежит, как попадает в процесс, что с
|
||||||
секретами и когда падает. Форма записи — `common/language.md`.
|
секретами и когда падает. Форма записи — `LANGUAGE.md`.
|
||||||
|
|
||||||
## Область действия
|
## Область действия
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# Идентификаторы сущностей
|
# Идентификаторы сущностей
|
||||||
|
|
||||||
Как выбираются и как выглядят первичные ключи сущностей. Форма записи —
|
Как выбираются и как выглядят первичные ключи сущностей. Форма записи —
|
||||||
`common/language.md`.
|
`LANGUAGE.md`.
|
||||||
|
|
||||||
## Область действия
|
## Область действия
|
||||||
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Как приложение записывает моменты и длительности: в каком формате, откуда
|
Как приложение записывает моменты и длительности: в каком формате, откуда
|
||||||
берётся значение и где появляется не-UTC. Форма записи —
|
берётся значение и где появляется не-UTC. Форма записи —
|
||||||
`common/language.md`.
|
`LANGUAGE.md`.
|
||||||
|
|
||||||
## Область действия
|
## Область действия
|
||||||
|
|
||||||
@@ -5,7 +5,7 @@ extends: arch/config.md
|
|||||||
# Конфигурация: реализация на Go
|
# Конфигурация: реализация на Go
|
||||||
|
|
||||||
Как `arch/config.md` выглядит в Go-приложении: формат, загрузчик, границы
|
Как `arch/config.md` выглядит в Go-приложении: формат, загрузчик, границы
|
||||||
запрета на окружение. Форма записи — `common/language.md`.
|
запрета на окружение. Форма записи — `LANGUAGE.md`.
|
||||||
|
|
||||||
Секретов Go-специфика не касается: они приходят из деплоя уже в файле, а
|
Секретов Go-специфика не касается: они приходят из деплоя уже в файле, а
|
||||||
проверка их непустоты идёт вместе с остальной валидацией — как описано в
|
проверка их непустоты идёт вместе с остальной валидацией — как описано в
|
||||||
@@ -5,7 +5,7 @@ extends: arch/db-identifiers.md
|
|||||||
# Идентификаторы: реализация на Go
|
# Идентификаторы: реализация на Go
|
||||||
|
|
||||||
Как `arch/db-identifiers.md` выглядит в Go-приложении, выбравшем ULID
|
Как `arch/db-identifiers.md` выглядит в Go-приложении, выбравшем ULID
|
||||||
(ветка `arch/db-identifiers.md` R1.1). Форма записи — `common/language.md`.
|
(ветка `arch/db-identifiers.md` R1.1). Форма записи — `LANGUAGE.md`.
|
||||||
|
|
||||||
Единая точка из `arch/db-identifiers.md` R3 — пакет `internal/ident`: он
|
Единая точка из `arch/db-identifiers.md` R3 — пакет `internal/ident`: он
|
||||||
порождает идентификаторы (`NewID`, `NewIDAt`) и он же их разбирает
|
порождает идентификаторы (`NewID`, `NewIDAt`) и он же их разбирает
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# Схема и миграции (SQLite, Go)
|
# Схема и миграции (SQLite, Go)
|
||||||
|
|
||||||
Как пишутся миграции и какие типы колонок выбираются для схемы SQLite в
|
Как пишутся миграции и какие типы колонок выбираются для схемы SQLite в
|
||||||
Go-приложении. Форма записи — `common/language.md`.
|
Go-приложении. Форма записи — `LANGUAGE.md`.
|
||||||
|
|
||||||
## Область действия
|
## Область действия
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
# Ошибки
|
# Ошибки
|
||||||
|
|
||||||
Как ошибки строятся, оборачиваются и проверяются. Форма записи —
|
Как ошибки строятся, оборачиваются и проверяются. Форма записи —
|
||||||
`common/language.md`. Где и когда ошибку **логировать** — в
|
`LANGUAGE.md`. Где и когда ошибку **логировать** — в
|
||||||
`lang/go/logging.md` (коротко: лог один раз на доменной границе).
|
`lang/go/logging.md` (коротко: лог один раз на доменной границе).
|
||||||
|
|
||||||
## Правила
|
## Правила
|
||||||
@@ -6,7 +6,7 @@ extends: arch/time.md
|
|||||||
|
|
||||||
Как и когда писать логи. Это правила оформления кода (How), а не
|
Как и когда писать логи. Это правила оформления кода (How), а не
|
||||||
спецификация поведения: наблюдаемые требования к логам, входящие в контракт
|
спецификация поведения: наблюдаемые требования к логам, входящие в контракт
|
||||||
функциональности, живут в спеках. Форма записи — `common/language.md`.
|
функциональности, живут в спеках. Форма записи — `LANGUAGE.md`.
|
||||||
|
|
||||||
Лог читают инструментами, а не глазами: повседневно — `jq`
|
Лог читают инструментами, а не глазами: повседневно — `jq`
|
||||||
(`jq 'select(.download_id=="a1b2")' app.jsonl`), тяжёлое (агрегации, JOIN) —
|
(`jq 'select(.download_id=="a1b2")' app.jsonl`), тяжёлое (агрегации, JOIN) —
|
||||||
@@ -6,7 +6,7 @@ extends: arch/time.md
|
|||||||
|
|
||||||
Как требования `arch/time.md` выполняются в Go-коде: откуда берётся
|
Как требования `arch/time.md` выполняются в Go-коде: откуда берётся
|
||||||
«сейчас», в каком виде время попадает в базу и в логи, что делать с зонами.
|
«сейчас», в каком виде время попадает в базу и в логи, что делать с зонами.
|
||||||
Форма записи — `common/language.md`.
|
Форма записи — `LANGUAGE.md`.
|
||||||
|
|
||||||
## Правила
|
## Правила
|
||||||
|
|
||||||
@@ -5,7 +5,7 @@ extends: arch/app-directories.md
|
|||||||
# Категории директорий: реализация в Ansible
|
# Категории директорий: реализация в Ansible
|
||||||
|
|
||||||
Как категории из `arch/app-directories.md` раскладываются на сервере
|
Как категории из `arch/app-directories.md` раскладываются на сервере
|
||||||
плейбуком. Форма записи — `common/language.md`.
|
плейбуком. Форма записи — `LANGUAGE.md`.
|
||||||
|
|
||||||
## Область действия
|
## Область действия
|
||||||
|
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
Как пишется код веб-UI: частичный своп фрагментов, поллинг живых
|
Как пишется код веб-UI: частичный своп фрагментов, поллинг живых
|
||||||
обновлений, обработчики действий, деградация без JS, ошибки. Что именно UI
|
обновлений, обработчики действий, деградация без JS, ошибки. Что именно UI
|
||||||
показывает и какие действия поддерживает — в спеках, не здесь. Форма записи
|
показывает и какие действия поддерживает — в спеках, не здесь. Форма записи
|
||||||
— `common/language.md`.
|
— `LANGUAGE.md`.
|
||||||
|
|
||||||
Логирование запросов — `lang/go/logging.md` (HTTP-поля, рутинно-частое на
|
Логирование запросов — `lang/go/logging.md` (HTTP-поля, рутинно-частое на
|
||||||
`DEBUG`). Трансляция доменных ошибок наружу — `lang/go/errors.md`
|
`DEBUG`). Трансляция доменных ошибок наружу — `lang/go/errors.md`
|
||||||
Reference in New Issue
Block a user