Добавить нормализацию документов ЦБД Минюста КР #8
Reference in New Issue
Block a user
Delete Branch "feature/minjust-document-normalization"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что сделано
Ограничения этой версии
OCR, перевод, юридическое сопоставление редакций, PostgreSQL/OpenSearch и RAG намеренно оставлены для следующих этапов. Исходный архив не изменяется.
Проверка
Независимое code review
Итог: перед слиянием нужны исправления.
Замечания
Высокая — ошибочная конфигурация путей может удалить исходный архив.
backend/normalization/minjust_cbd.py:534-545,backend/normalization/minjust_cbd.py:574-577. Код не проверяет пересечениеinput_rootиoutput. Если передать одинаковые пути (например,--input data/minjust-cbd --output data/minjust-cbd), целевой каталогoutput/documents/<code>совпадает с исходным документом:publish_directory()переносит сырой каталог в.previous, ставит на его место нормализованный результат и затем удаляет backup. На временных данных сценарий воспроизведён:metadata.jsonисходника исчез, осталсяdocument.json. Это прямо нарушает обязательное требование не изменятьdata/minjust-cbd. Нужно до открытия manifest и обработки документов сравнитьresolve()путей (с учётом symlink) и отклонять равные/пересекающиеся input/output; добавить регрессионный тест.Средняя — manifest может навсегда скрыть отсутствующий результат после прерывания публикации.
backend/normalization/minjust_cbd.py:517-531,backend/normalization/minjust_cbd.py:569-572.publish_directory()сначала переносит target в.previous, затем ставит staged на его место. Если процесс завершится между этими операциями, target отсутствует, но manifest по-прежнему содержит прежнийsuccess. При следующем обычном запуске совпадение checksum/schema/version приводит кskipped, без проверки существованияdocuments/<code>/document.jsonи без восстановления.previous. Сценарий воспроизведён в/tmp: повторный запуск вернулskipped=1, target остался отсутствовать. Нужны восстановление незавершённой публикации при старте и/или проверка целевого результата перед skip; добавить тест имитации прерывания.Низкая — некорректный URL в HTML валит нормализацию всего документа вместо удаления атрибута.
backend/normalization/minjust_cbd.py:222-225,backend/normalization/minjust_cbd.py:236-255.urlsplit()может выброситьValueError; примерhref="http://["воспроизведён. Ошибка из санитайзера переводит весь документ вerror. На входной границе безопаснее считать такойhref/srcнедопустимым и удалить атрибут; нужен граничный тест.Что проверено
origin/main...07381ad(17 файлов);PYTHONPATH=backend python3 -m unittest backend/test_minjust_cbd.py backend/test_minjust_normalization.py -v— 8 тестов, OK;python3 -m unittest discover -s tools/telegram-bot -v— 6 тестов, OK;python3 -m py_compile backend/ingestion/minjust_cbd.py backend/normalization/minjust_cbd.py— OK;git diff --check origin/main...HEAD— OK;data/не выполнялись.Остальная реализация выглядит целостно: нормализатор использует стандартную библиотеку, сохраняет происхождение и контрольные суммы, разделяет RU/KY, публикует документ через staging и изолирует ошибку отдельной записи; исправление восстановления пагинации покрыто регрессионным тестом. Остаточные риски после перечисленных исправлений: отсутствие межпроцессной блокировки и стоимость полного повторного хеширования архива примерно из 210 тысяч документов.
Повторное code review после
752bd38Итог: замечания из предыдущего review закрыты, PR можно сливать.
Проверка прежних замечаний
HIGH — пересечение input/output: закрыто. Добавленный
validate_roots()сравнивает разрешённые абсолютные пути и отклоняет равенство, вложение output в input и input в output до создания выходного каталога и manifest. Тест проверяет все три варианта и неизменность исходногоmetadata.json.MEDIUM — восстановление
.previousи ошибочный skip: закрыто.recover_directory(target)вызывается перед вычислением решения о skip: если target отсутствует, backup атомарно возвращается на место; если target уже опубликован, оставшийся backup удаляется. Дополнительная проверкаtarget.is_dir()не позволяет manifest со статусомsuccessпропустить полностью отсутствующий результат. Регрессионный тест воспроизводит прерываниеtarget -> .previousи подтверждает восстановление до skip.LOW — malformed URL: закрыто.
safe_link()иsafe_image()теперь перехватываютValueErrorотurlsplit()и считают URL небезопасным. Тест покрываетhref="http://["иsrc="http://["; документ нормализуется, URL отсутствует в безопасном HTML.Регрессии и проверки
Новых блокирующих замечаний в diff
07381ad..752bd38не найдено. Исправления локальны, не добавляют зависимостей, backend patch-версия корректно повышена до0.2.2, документация и footer-версии обновлены.PYTHONPATH=backend python3 -m unittest backend/test_minjust_cbd.py backend/test_minjust_normalization.py -v— 10 тестов, OK;python3 -m unittest discover -s tools/telegram-bot -v— 6 тестов, OK;python3 -m py_compile backend/ingestion/minjust_cbd.py backend/normalization/minjust_cbd.py— OK;git diff --check origin/main...HEAD— OK.Полный проход и изменения локального
data/не выполнялись. Неблокирующие прежние остаточные риски (межпроцессная блокировка и стоимость полного повторного хеширования около 210 тысяч документов) остаются отдельными будущими задачами и не препятствуют слиянию этого PR.