Skip to content

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

NameDescription
ADDEDNo description.
CHANGEDNo description.
PRESENTATIONNo description.
REMOVEDNo description.
RENAMEDNo description.

Functions

NameDescription
diff_documentsSemantic diff двух CLIR-документов (§215, уровни declaration и rule).
render_diffDiff вербализаций (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) -> str

Diff вербализаций (LS §3.6) — Markdown для ревьюера.

Для каждой записи печатается блок «было/стало» в построчном diff-виде; для добавленного и удалённого — текст целиком. Хэши остаются в документе, но подписью под текстом: юрист сверяет формулировки, а не digest-ы.

Documentation for Arxo. Writings — blog.arxo.io.

Anonymous visit counts on stats.arxo.io, no cookies.