daniillgolovin/difrences-files

Generate diff

1.0.1 2024-07-15 10:02 UTC

This package is auto-updated.

Last update: 2025-06-15 12:14:07 UTC


README

Maintainability Test Coverage linter and tests

Описание

«Вычислитель отличий» — программа, определяющая разницу между двумя структурами данных. Это популярная задача, для решения которой существует множество онлайн сервисов, например JSON Diff. Подобный механизм используется при выводе тестов или при автоматическом отслеживании изменений в конфигурационных файлах.

В рамках данного проекта реализовано создание AST (англ. Abstract Syntax Tree) - абстрактного синтаксического дерева, на основании которого имеющиеся форматеры (stylish, plain, json) выводят различия как плоских, так и вложенных файлов (используется рекурсия).

Особенности

  • Доступны следующие форматы для чтения: JSON, YAML.
  • Реализованы следующие форматеры: stylish (по умолчанию), plain, json.
  • Возможность использовать как библиотеку, так и как CLI команду. `

Установка

⚠️ Перед установкой проекта проверьте наличие установленных php, composer!

Для работы с проектом необходимо выполнить следующие действия по его установке:

  1. Склонируйте репозиторий, используя одну из следующих консольных команд:
# HTTPS
>> git clone https://github.com/DaniillGolovin/Difference-Generator.git
# SSH
>> git clone git@github.com:DaniillGolovin/Difference-Generator.git
  1. Осуществите установку проекта:
>> make install
  1. Запустите команду на примере тех, которые указаны ниже.

Для глобальной установки выполните команду:

$ 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)

asciicast

Различия между плоскими файлами (YAML) формат (STYLISH)

asciicast

Различия между вложенными файлами (JSON) формат (STYLISH)

asciicast

Различия между вложенными файлами (YAML) формат (STYLISH)

asciicast

Формат 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)

asciicast

Различия между плоскими файлами (YAML) формат (PLAIN)

asciicast

Различия между вложенными файлами (JSON) формат (PLAIN)

asciicast

Различия между вложенными файлами (YAML) формат (PLAIN)

asciicast

Формат 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)

asciicast

Различия между плоскими файлами (YAML) формат (JSON)

asciicast

Различия между вложенными файлами (JSON) формат (JSON)

asciicast

Различия между вложенными файлами (YAML) формат (JSON)

asciicast

Структура проекта

..
├── 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