lawref.semdiff
Semantic diff §215 и его вербализованный вид (WP-23-срез + WP-25 (c)).
Две функции, разделённые намеренно:
diff_documentsотвечает на вопрос «что изменилось в семантике» и работает с хэшами узлов (§209-фильтр, применённый к узлу): переименование локального имени при явном@idсемантикой не является, правка метки — тоже (errata E-0010), а изменение тела правила — является;render_diffотвечает на вопрос «как это прочитает юрист» и печатает тот же результат как diff вербализаций (LS §3.6: основной формат ревью изменений). Юрист сверяет тексты, а не хэши.
Сопоставление узлов идёт по StableId; узлы, пропавшие в одном документе и появившиеся в другом с ТЕМ ЖЕ semantic hash, показываются переименованием, а не парой «удалено/добавлено»: без этого рефакторинг имени выглядел бы как удаление нормы.
Attributes
| Name | Description |
|---|---|
ADDED | No description. |
CHANGED | No description. |
PRESENTATION | No description. |
REMOVED | No description. |
RENAMED | No description. |
Functions
| Name | Description |
|---|---|
diff_documents | Semantic diff двух CLIR-документов (§215, уровни declaration и rule). |
render_diff | Diff вербализаций (LS §3.6) — Markdown для ревьюера. |
ADDEDattributemodule attribute#
ADDED = 'added'CHANGEDattributemodule attribute#
CHANGED = 'changed'PRESENTATIONattributemodule attribute#
PRESENTATION = 'presentation'REMOVEDattributemodule attribute#
REMOVED = 'removed'RENAMEDattributemodule attribute#
RENAMED = 'renamed'diff_documentsfunction#
def diff_documents(before: dict, after: dict) -> dict[str, Any]Semantic diff двух CLIR-документов (§215, уровни declaration и rule).
Возвращает {"entries": [...], "semanticChange": bool}. entries —
отсортированный по id список записей вида
{"kind", "id", "newId"?, "hashBefore"?, "hashAfter"?}.
semanticChange отвечает про содержание норм: добавлено, удалено или
изменено. Переименование содержания не меняет и потому его не поднимает —
но §209 включает id узла в хэш, поэтому программа всё равно получает другой
semantic hash, а утверждения по прежнему адресу становятся беспредметными;
об этом сказано прямо в вербализованном diff-е.
presentation — узел с тем же semantic hash, но изменившимся content hash:
правка метки или морфологической формы. Семантикой это не является, но
вербализация меняется, поэтому запись выдаётся отдельным видом, а не
молча пропускается — иначе ревьюер не узнал бы, что текст под его
утверждением изменился (LS §3.6).
render_difffunction#
def render_diff(result: dict, before_verb: dict, after_verb: dict, pack: dict) -> strDiff вербализаций (LS §3.6) — Markdown для ревьюера.
Для каждой записи печатается блок «было/стало» в построчном diff-виде; для добавленного и удалённого — текст целиком. Хэши остаются в документе, но подписью под текстом: юрист сверяет формулировки, а не digest-ы.
Documentation for Arxo. Writings — blog.arxo.io.
Anonymous visit counts on stats.arxo.io, no cookies.