daniillgolovin / difrences-files
Generate diff
Requires
- php: >=8.1.0
- docopt/docopt: ^1.0
- funct/funct: ^1.5
- symfony/yaml: ^5.2
Requires (Dev)
- phpstan/phpstan: ^1.11
- phpunit/phpunit: ^9
- squizlabs/php_codesniffer: ^3.10
README
Описание
«Вычислитель отличий» — программа, определяющая разницу между двумя структурами данных. Это популярная задача, для решения которой существует множество онлайн сервисов, например JSON Diff. Подобный механизм используется при выводе тестов или при автоматическом отслеживании изменений в конфигурационных файлах.
В рамках данного проекта реализовано создание AST (англ. Abstract Syntax Tree) - абстрактного синтаксического дерева, на основании которого имеющиеся форматеры (stylish
, plain
, json
) выводят различия как плоских, так и вложенных файлов (используется рекурсия).
Особенности
- Доступны следующие форматы для чтения:
JSON
,YAML
. - Реализованы следующие форматеры:
stylish
(по умолчанию),plain
,json
. - Возможность использовать как библиотеку, так и как
CLI
команду. `
Установка
⚠️ Перед установкой проекта проверьте наличие установленных php, composer!
Для работы с проектом необходимо выполнить следующие действия по его установке:
- Склонируйте репозиторий, используя одну из следующих консольных команд:
# HTTPS >> git clone https://github.com/DaniillGolovin/Difference-Generator.git # SSH >> git clone git@github.com:DaniillGolovin/Difference-Generator.git
- Осуществите установку проекта:
>> make install
- Запустите команду на примере тех, которые указаны ниже.
Для глобальной установки выполните команду:
$ composer global require daniillgolovin/difrences-files
Использование
CLI команда
Данный проект можно использовать как утилиту командной строки. Подробности использования описания в helper:
>> gendiff -h
gendiff -h Generate diff Usage: gendiff (-h|--help) gendiff (-v|--version) gendiff [--format <fmt>] <firstFilePath> <secondFilePath> Options: -h --help Show this screen -v --version Show version --format <fmt> Report format [default: stylish] Examples: stylish, plain, json
Формат stylish
Данный форматер выводит разницу между двумя файлами, учитывая следующие особенности:
- Если свойство было добавлено и удалено либо изменило свое значение, то указываются знаки
+
и-
соответственно. - В остальных случаях свойство либо не изменилось, либо в обоих файлах имеет в качестве значения объект (является вложенным).
Пример
>> gendiff file1.json file2.json
{ - follow: false host: hexlet.io - proxy: 123.234.53.22 - timeout: 50 + timeout: 20 + verbose: true }
Различия между плоскими файлами (JSON) формат (STYLISH)
Различия между плоскими файлами (YAML) формат (STYLISH)
Различия между вложенными файлами (JSON) формат (STYLISH)
Различия между вложенными файлами (YAML) формат (STYLISH)
Формат plain
Данный форматер выводит разницу между двумя файлами, учитывая следующие особенности:
- Если свойство имеет "сложное значение" (объект, массив), то выводится
[complex value]
. - Если свойство является вложенным, то оно не учитывается: сохраняется лишь путь до него, который используется при выводе остальных "плоских" свойств, находящийся внутри оного.
- Если свойство не было изменено, то оно не выводится.
Пример
>> gendiff file5.json file6.json --format plain
Property 'common.follow' was added with value: false Property 'common.setting2' was removed Property 'common.setting3' was updated. From true to null Property 'common.setting4' was added with value: 'blah blah' Property 'common.setting5' was added with value: [complex value] Property 'common.setting6.doge.wow' was updated. From '' to 'so much' Property 'common.setting6.ops' was added with value: 'vops' Property 'group1.baz' was updated. From 'bas' to 'bars' Property 'group1.nest' was updated. From [complex value] to 'str' Property 'group2' was removed Property 'group3' was added with value: [complex value]
Различия между плоскими файлами (JSON) формат (PLAIN)
Различия между плоскими файлами (YAML) формат (PLAIN)
Различия между вложенными файлами (JSON) формат (PLAIN)
Различия между вложенными файлами (YAML) формат (PLAIN)
Формат json
Данный форматер выводит разницу между двумя файлами, учитывая следующие особенности:
- Если свойство не является вложенным или "сложным" то указывается его имя, дескриптор, старое значение, новое значение, дети в формате:
{ state: 'СОСТОЯНИЕ', type: 'ТИП', oldValue: 'ЗНАЧЕНИЕ в file1' oldValue: 'ЗНАЧЕНИЕ в file2' children: 'ДЕТИ' }
.
Пример
>> gendiff file1.yaml file2.yaml --format json
{ { "key":"follow", "type":"removed", "oldValue":null, "newValue":false }, } { "key":"host", "type":"not updated", "oldValue":"hexlet.io", "newValue":"hexlet.io" }, { "key":"proxy","type":"removed", "oldValue":null, "newValue":"123.234.53.22" }, { "key":"timeout", "type":"updated", "oldValue":50, "newValue":20 }, { "key":"verbose", "type":"added", "oldValue":null, "newValue":true } }
Различия между плоскими файлами (JSON) формат (JSON)
Различия между плоскими файлами (YAML) формат (JSON)
Различия между вложенными файлами (JSON) формат (JSON)
Различия между вложенными файлами (YAML) формат (JSON)
Структура проекта
.. ├── Makefile ├── README.md ├── bin │ └── gendiff ├── composer.json ├── composer.lock ├── coverage.txt ├── file.txt ├── phpunit.xml ├── src │ ├── Differ.php │ ├── Formatters │ │ ├── Json.php │ │ ├── Plain.php │ │ └── Stylish.php │ ├── Formatters.php │ └── Parsers.php └── tests ├── GenDiffTest.php └── fixtures ├── diff.txt ├── diffJson.txt ├── diffPlain.txt ├── diffStylish.txt ├── file1.json ├── file1.yml ├── file2.json ├── file2.yml ├── fileNest1.json ├── fileNest1.yml ├── fileNest2.json └── fileNest2.yml 5 directories, 27 files