Сравнение препаратов
Доработать пример питоновского модуля difflib: добавить в него поддержку т. н. «препаратов»: преобразования сравниваемых файлов и более тонкую настройку параметров сравнения. Далее в тексте слово «ключ» обозначает параметр командной строки argparse.
Построчное сравнение
Перед тем, как вызвать соответствующее сравнение, определяется формат входных файлов
Как минимум, с помощью mimetypes
- Если указан только один входной файл, его тип указывается в диагностике и работа завершается
- Предусмотреть ключ «задать тип файла» (тогда он не проверяется, а берётся из командной строки)
Далее к каждому из файлов (или к обоим сразу) применяется указанный в командной строке фильтр. Если фильтра нет, утилита работает как в примере.
- Предусмотреть ключ «показать все фильтры для этого типа файла и выйти»
- Предусмотреть ключ «показать все фильтры для всех типов файлов и выйти»
На выходе должно получиться две последовательности строк для стандартных инструментов сравнения (unified_diff, ndiff, HtmlDiff и т. п.)
Эти последовательности сравниваются и результат выводится, как в примере.
Предусмотреть как минимум ключ, меняющий параметр wrapcolumn в HtmlDiff
Метрика похожести
Предусмотреть ключ, при получении которого выводится не diff, а ratio(), quick_ratio() или real_quick_ratio(), в зависимости от необязательного параметра этого ключа.
Метрика имеет кубическую сложность, большие файлы не сравнивать)
Привязка фильтров и пользовательские фильтры
У каждого фильтра должна быть указана привязка к mimetype
как минимум на уровне «любой/любой», «тип/любой» и «тип/подтип)
Можно пойти дальше и задать какие-то более сложные соответствия, но необязательно
Предусмотреть каталог по умолчанию, в котором утилита ищет пользовательские фильтры
Использовать подкаталог, находящийся в pathlib.Path.home(), это, кажется, единственный кроссплатформенный путь в более-менее очевидном месте
- Предусмотреть ключ для выбора другого каталога
Фильтры по умолчанию
«Перефоматированный python»: исходные файлы на ЯП python сначала обрабатываются ast.parse(), а затем — ast.unparse()
«Дамп»: исходные файлы предварительно обрабатываются binascii.hexlify()
Такой фильтр показывается в списке фильтров для файлов любых типов
Надо поисследовать, какое именно представление эффективнее сравнивать, и что именно должно являться «элементом» для difflib.SequenceMatcher
«Пример для пользователя»: фильтр, в котором применяется всё разработанное для фильтров API (если есть) и который нужно закладывать в пользовательский каталог. Делать он может что угодно, например, применять заданное регулярное выражение к обрабатываемой строке.
Такой фильтр показывается в списке фильтров для файлов text/любой
Результатом должна быть программа на Pythоn.
- Оформление в виде пакета / публикация на PyPI приветствуется