Автор форка SuperB1aze/pii-mask-enhanced нашел и исправил несколько пропусков обработки Word и Excel в Pii-Mask. Вместе с исправлениями он добавил тесты. Я запустил их на нашей версии и получил 13 провалов. Так чужая работа дала нам список сценариев для разбора и помогла увидеть ошибки, которых не обнаруживали прежние проверки.

Хотелось перенести эти исправления и сохранить улучшения, появившиеся у нас после разделения веток. Поэтому сравнение сделал в обе стороны: Office-тесты автора форка запустил на нашей версии, а выбранные наши тесты - на форке.

Ниже покажу один найденный у нас пропуск, результаты сравнения и порядок проверки. Это разбор зафиксированных версий, на момент аудита перенос исправлений еще не был выполнен.

Фамилия после вложенной надписи

Один из тестов автора форка собирает минимальный искусственный OOXML-пакет с такой структурой. Здесь показан тестовый случай вложенности, без полной разметки настоящей надписи Word. ФИО искусственное:

<w:p>
  <w:r><w:t>Договор. </w:t></w:r>
  <w:r><w:pict><w:txbxContent>
    <w:p><w:r><w:t>Приложение</w:t></w:r></w:p>
  </w:txbxContent></w:pict></w:r>
  <w:r><w:t>Директор Соколова Анна Владимировна</w:t></w:r>
</w:p>

Это фрагмент XML, не самостоятельный DOCX. В тесте он помещается в архив с остальными необходимыми частями документа.

Во внешнем абзаце есть надпись со своим вложенным абзацем. После нее идет ФИО. На проверенной нашей версии тест test_text_after_textbox_is_masked падает: фамилия остается в выходном XML. В форке он проходит.

Этот тест проверяет конкретное место в структуре файла. Обычный абзац с тем же ФИО мог маскироваться правильно. Причина искать дополнительные проверки здесь - вложенность документа, которую простой текстовый пример не воспроизводит.

В Office-исправлении форка есть и другие случаи: удаленный текст рецензирования, коды полей, адреса ссылок и авторы комментариев. Для Excel добавлены печатные колонтитулы и новые комментарии. Это полезные дополнения к нашему покрытию.

Как проверяли совместимость улучшений

Я зафиксировал коммиты и работал во временных копиях. В перенесенных тестах менял только импорты: пакет форка называется pii_mask_enhanced, наш - pii_mask. Утверждения и входные данные оставил прежними.

Проверка

Результат

Собственный полный набор форка

372 passed, 1 skipped

Тесты DOCX/XLSX форка на нашей версии

32 passed, 13 failed

Наши тесты имен латиницей и технических терминов на нашей версии

63 passed

Те же 63 проверки на форке

32 passed, 31 failed

Числа относятся к разным наборам: 372, 45 и 63 проверки. Складывать их в общий процент качества нельзя. Полный собственный набор нашей версии в этом сравнении не запускался.

Тринадцать провалов указали на сценарии Office для отдельного разбора. В наборе есть проверки скрытия данных, сохранности остальных полей и отказа от неподдерживаемой обработки. Число провалов не равно числу утечек. Для разбора каждого случая уже есть тест автора форка.

В обратном направлении проверяли совместимость с нашими последующими изменениями. В проверенный форк не входили восемь коммитов, добавленных в нашем репозитории после разделения веток, в том числе исправления для имен латиницей и технических терминов в резюме. Поэтому 31 провал описывает различие версий. Причину каждого нужно проверять по истории изменений; приписывать эти результаты рефакторингу автора оснований нет.

Как повторить сравнение

Использованы наш репозиторий и форк. Проверены:

  • Наш Pii-Mask: c2a03fc841be638898ae12b96b219f8b3aebe0ac.

  • Форк: bf4deafd437263f32041eb8f99bde2e76751f94d.

Порядок воспроизведения:

  1. Клонировать оба репозитория в соседние каталоги pii-mask и pii-mask-enhanced, выполнить в каждом git checkout с соответствующим SHA. Для сравнения использован Python 3.12. В каждом каталоге создать отдельное окружение через python3.12 -m venv .venv и установить зависимости: .venv/bin/python -m pip install -e ".[dev]".

  2. Из каталога форка запустить .venv/bin/python -m pytest -q tests.

  3. Скопировать его tests/test_docx.py и tests/test_xlsx.py в отдельный каталог проверок нашей копии. Заменить from pii_mask_enhanced.formats import docx / xlsx на from pii_mask import docx / xlsx, а from pii_mask_enhanced.engine.core import Masker - на from pii_mask.core import Masker. Импорты внутри тестовых функций тоже учитываются.

  4. Для отдельного каталога fork_checks внутри нашей копии команда такая: .venv/bin/python -m pytest -q fork_checks. Эти два файла используют собственные вспомогательные функции, stdlib и pytest; дополнительных conftest.py для них не требуется.

  5. Скопировать наши tests/test_latin_names.py и tests/test_tech_terms.py в отдельный каталог проверок форка. Заменить импорт на from pii_mask_enhanced.engine.core import Masker и запустить из каталога форка .venv/bin/python -m pytest -q upstream_checks, если копии тестов лежат в upstream_checks. Для контрольного прогона в нашем репозитории: .venv/bin/python -m pytest -q tests/test_latin_names.py tests/test_tech_terms.py.

Перед запуском полезно проверить module.__file__ у импортируемых модулей: он должен указывать на выбранную копию. Иначе установленный пакет из другого каталога может незаметно подменить участника сравнения.

Что изменилось в нашем плане работы

Результатом аудита стал ранбук выборочного переноса Office-исправлений с сохранением наших последующих доработок. На момент сравнения перенос еще не был выполнен; рабочая установка не менялась.

Использовались искусственные примеры. При дополнительной проверке .doc-конвертера на Linux тест настоящего Microsoft Word был пропущен с причиной нет MS Word с pywin32. Прохождение этих тестов также не доказывает отсутствие данных во всех возможных частях Office-файла: изображения, вложенные объекты и другие каналы требуют своего покрытия.

Тесты автора форка дали нам готовые воспроизведения для Office-сценариев, которых не было в нашем наборе, а его исправления - материал для переноса. Сравнение с нашими последующими тестами помогло определить, какое поведение нужно сохранить при этой работе.