Это вольная реализация проекта Хекслета "Вычислитель отличий". Это консольная утилита, которая генерирует diff между двумя файлами. Поддерживаемые форматы – JSON и YAML.
Diff генерируется не по строчкам, а по значениям. Ключи отсортированы в алфавитном порядке. Также т.к. сравнение идет по значению, теоретически возможно сравнивать файлы разных поддерживаемых расширений, но это не тестировалось и в приложении сейчас явным образом запрещено.
Класс Differ
также может быть использован в качестве библиотеки.
Пример. Для файлов file1.json
{
"host": "hexlet.io",
"timeout": 50,
"proxy": "123.234.53.22",
"follow": false
}
и file2.json
{
"timeout": 20,
"verbose": true,
"host": "hexlet.io"
}
будет сгенерирован diff вида
{
- follow: false
host: hexlet.io
- proxy: 123.234.53.22
- timeout: 50
+ timeout: 20
+ verbose: true
}
Также возможен вывод в формате plain
:
Property 'follow' was removed.
Property 'proxy' was removed.
Property 'timeout' was updated. From 50 to 20
Property 'verbose' was added with value: true
Для получение информации об утилите можно запустить ее с флагом -h
. Ожидаемый вывод:
gendiff [-hV] [-f=<format>] <filePath1> <filePath2>
Prints the diff between two files to STDOUT.
<filePath1> path to first file
<filePath2> path to second file
-f, --format=<format> output format [default: stylish]
-h, --help Show this help message and exit.
-V, --version Print version information and exit.
Для удобства демонстрации добавлено две команды, которые соберут приложение и запустят его с аргументами.
make run-stylish-json-example
make run-plain-yaml-example
Файлы, для которых генерируется diff в примерах, находятся в /src/test/resources/hexlet/code/fixtures/*
.
Краткое описание основных сущностей (большинство интерфейсов имеет единственную реализацию).
interface FileParser
– читает и парсит файл. Основной метод parse
преобразовывает Path
в Map<String, Object
, где
ключ – ключ в json/yaml, а значение – значение по ключу в json/yaml.
interface DiffGenerator
– генерирует diff. Основной метод generate
принимает две Map<String, Object>
и
возвращает Set<DiffUnit
.
interface DiffUnit
– предоставляет информацию об изменении (добавлении, удалении, модификации или отсутствие
изменений) значения ключа.
class DiffUnitSetFormatterFactory
– умеет возвращать класс, реализующий interface DiffUnitSetFormatter
, основной
метод которого, format
, форматирует переданное множество Set<DiffUnit>
в строку.