PHPackages                             daniillgolovin/difrences-files - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. daniillgolovin/difrences-files

ActiveProject

daniillgolovin/difrences-files
==============================

Generate diff

1.0.1(1y ago)023MITPHPPHP &gt;=8.1.0

Since Jul 8Pushed 1y ago1 watchersCompare

[ Source](https://github.com/DaniillGolovin/Differences-Files)[ Packagist](https://packagist.org/packages/daniillgolovin/difrences-files)[ RSS](/packages/daniillgolovin-difrences-files/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (5)Dependencies (6)Versions (6)Used By (0)

Вычислитель отличий
===================

[](#вычислитель-отличий)

[![Maintainability](https://camo.githubusercontent.com/4af9407d9c1434329af7882cb6735aa0a18b92cc00bb01754a7a0b91d2952579/68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f39623934633835383066633063333438326634642f6d61696e7461696e6162696c697479)](https://codeclimate.com/github/DaniillGolovin/Differences-Files/maintainability)[![Test Coverage](https://camo.githubusercontent.com/10d6cb150eb3bb427d292399d6e1d17f71b6e68fc7bf3e425437c20dc7bd9884/68747470733a2f2f6170692e636f6465636c696d6174652e636f6d2f76312f6261646765732f39623934633835383066633063333438326634642f746573745f636f766572616765)](https://codeclimate.com/github/DaniillGolovin/Differences-Files/test_coverage)[![linter and tests](https://github.com/DaniillGolovin/Differences-Files/actions/workflows/lint.yml/badge.svg)](https://github.com/DaniillGolovin/Differences-Files/actions/workflows/lint.yml/badge.svg)

Описание
--------

[](#описание)

> **«Вычислитель отличий»** — программа, определяющая разницу между двумя структурами данных. Это популярная задача, для решения которой существует множество онлайн сервисов, например [JSON Diff](http://www.jsondiff.com/ "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
```

2. Осуществите установку проекта:

```
>> make install
```

3. Запустите команду на примере тех, которые указаны [ниже](#%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5).

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

```
$ composer global require daniillgolovin/difrences-files
```

Использование
-------------

[](#использование)

### CLI команда

[](#cli-команда)

Данный проект можно использовать как утилиту *командной строки*. Подробности использования описания в **helper**:

```
>> gendiff -h
```

```
gendiff -h

Generate diff

Usage:
  gendiff (-h|--help)
  gendiff (-v|--version)
  gendiff [--format ]

Options:
  -h --help                    Show this screen
  -v --version                 Show version
  --format                Report format [default: stylish] Examples: stylish, plain, json
```

#### Формат `stylish`

[](#формат-stylish)

Данный форматер выводит разницу между двумя файлами, учитывая следующие особенности:

- Если свойство было **добавлено** и **удалено** либо **изменило** свое значение, то указываются знаки `+` и `-` соответственно.
- В остальных случаях свойство либо **не изменилось**, либо в **обоих файлах** имеет в качестве значения *объект* (является **вложенным**).

##### Пример

[](#пример)

```
>> gendiff file1.json file2.json
```

```
{
  - follow: false
    host: hexlet.io
  - proxy: 123.234.53.22
  - timeout: 50
  + timeout: 20
  + verbose: true
}
```

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

[](#различия-между-плоскими-файлами-json-формат-stylish)

[![asciicast](https://camo.githubusercontent.com/1efd6cdfdeb6214fadf105e6ec02c0dc16bb00838cd1b5ad4b88499ce69947f4/68747470733a2f2f61736369696e656d612e6f72672f612f56467568625a624962423048667a514c7061617141586359512e737667)](https://asciinema.org/a/VFuhbZbIbB0HfzQLpaaqAXcYQ)

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

[](#различия-между-плоскими-файлами-yaml-формат-stylish)

[![asciicast](https://camo.githubusercontent.com/c90e707f6d616c2bd769ca9b9283597174ec5601464417dca77ca68aca33452b/68747470733a2f2f61736369696e656d612e6f72672f612f49476f4d473248437036796230734a304231436139574137672e737667)](https://asciinema.org/a/IGoMG2HCp6yb0sJ0B1Ca9WA7g)

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

[](#различия-между-вложенными-файлами-json-формат-stylish)

[![asciicast](https://camo.githubusercontent.com/3dc9fdd67d8cf857f63d5d9f5f4698c40de380cb31fb5fb0f2b27d7fbd1961b6/68747470733a2f2f61736369696e656d612e6f72672f612f58526b485a53636859657454413537796e43387837354849312e737667)](https://asciinema.org/a/XRkHZSchYetTA57ynC8x75HI1)

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

[](#различия-между-вложенными-файлами-yaml-формат-stylish)

[![asciicast](https://camo.githubusercontent.com/2d9484eb78e796c3ee2c976a55f2c48e6afde03a68433c5b286f6c8f4e3c46af/68747470733a2f2f61736369696e656d612e6f72672f612f67424d3964307542356a4c676b5767794f746d5737387137562e737667)](https://asciinema.org/a/gBM9d0uB5jLgkWgyOtmW78q7V)

#### Формат `plain`

[](#формат-plain)

Данный форматер выводит разницу между двумя файлами, учитывая следующие особенности:

- Если свойство имеет *"сложное значение"* (*объект*, *массив*), то выводится `[complex value]`.
- Если свойство является *вложенным*, то оно **не учитывается**: сохраняется лишь путь до него, который используется при выводе остальных *"плоских"* свойств, находящийся внутри оного.
- Если свойство **не было** изменено, то оно **не выводится**.

##### Пример

[](#пример-1)

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

[](#различия-между-плоскими-файлами-json-формат-plain)

[![asciicast](https://camo.githubusercontent.com/de640cdc24cc123401a91f8d367ee8eebcd852969212f02b1e391c2318cc73bd/68747470733a2f2f61736369696e656d612e6f72672f612f30434951796d3377363836763969506c6759784158717775642e737667)](https://asciinema.org/a/0CIQym3w686v9iPlgYxAXqwud)

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

[](#различия-между-плоскими-файлами-yaml-формат-plain)

[![asciicast](https://camo.githubusercontent.com/796702305dfeb218ac3ba1d21cd1daee48df2143450aa59d8a87a60f198347e0/68747470733a2f2f61736369696e656d612e6f72672f612f724c4b7a457343684932793945746b614e414d476c504b366d2e737667)](https://asciinema.org/a/rLKzEsChI2y9EtkaNAMGlPK6m)

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

[](#различия-между-вложенными-файлами-json-формат-plain)

[![asciicast](https://camo.githubusercontent.com/7422046a2c94652317f0a2c976e63aaf2de3b26b28e98fde293be194effab80e/68747470733a2f2f61736369696e656d612e6f72672f612f4a776a66796563314b554533314f3741345a6e6959673979642e737667)](https://asciinema.org/a/Jwjfyec1KUE31O7A4ZniYg9yd)

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

[](#различия-между-вложенными-файлами-yaml-формат-plain)

[![asciicast](https://camo.githubusercontent.com/c9ccc7d2cbb89c64ee266561fa87751eee8a4b7941d356d83b77559691264c9f/68747470733a2f2f61736369696e656d612e6f72672f612f7172397062644a6e6d31746166515964746c434b4b6b316f632e737667)](https://asciinema.org/a/qr9pbdJnm1tafQYdtlCKKk1oc)

#### Формат `json`

[](#формат-json)

Данный форматер выводит разницу между двумя файлами, учитывая следующие особенности:

- Если свойство не является *вложенным* или *"сложным"* то указывается его **имя**, **дескриптор**, **старое значение**, **новое значение**, **дети** в формате: `{ state: 'СОСТОЯНИЕ', type: 'ТИП', oldValue: 'ЗНАЧЕНИЕ в file1' oldValue: 'ЗНАЧЕНИЕ в file2' children: 'ДЕТИ' }`.

##### Пример

[](#пример-2)

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

[](#различия-между-плоскими-файлами-json-формат-json)

[![asciicast](https://camo.githubusercontent.com/da1d578ba0276a3f5fbcdf4da844d16126c1c3101dc66bdb807185cec72da7ee/68747470733a2f2f61736369696e656d612e6f72672f612f6865673343346f77477542456258414e4d66414c7a39696c302e737667)](https://asciinema.org/a/heg3C4owGuBEbXANMfALz9il0)

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

[](#различия-между-плоскими-файлами-yaml-формат-json)

[![asciicast](https://camo.githubusercontent.com/53fa5307af534d2ef5e9e919ff8835d0f64f9febd4aa463caf3d92ef82bd4fcf/68747470733a2f2f61736369696e656d612e6f72672f612f514f556a717653496e3045326752696b336b73556d5841424a2e737667)](https://asciinema.org/a/QOUjqvSIn0E2gRik3ksUmXABJ)

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

[](#различия-между-вложенными-файлами-json-формат-json)

[![asciicast](https://camo.githubusercontent.com/572962ab709f8b819cbac6a5d7b38518751f801875588ab001d32b2ba180a3b3/68747470733a2f2f61736369696e656d612e6f72672f612f3536364668575a78594d7238764242376474703335613030662e737667)](https://asciinema.org/a/566FhWZxYMr8vBB7dtp35a00f)

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

[](#различия-между-вложенными-файлами-yaml-формат-json)

[![asciicast](https://camo.githubusercontent.com/040de73b4b339e834dfcc1e07289a78defda3895a83565c7337fbbd7613fc541/68747470733a2f2f61736369696e656d612e6f72672f612f6c434b4b43544e4a783065586f557675753930737858396b572e737667)](https://asciinema.org/a/lCKKCTNJx0eXoUvuu90sxX9kW)

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

[](#структура-проекта)

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

###  Health Score

27

—

LowBetter than 49% of packages

Maintenance33

Infrequent updates — may be unmaintained

Popularity6

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity52

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

5

Last Release

667d ago

Major Versions

0.0.3 → 1.0.02024-07-15

PHP version history (2 changes)0.0.1PHP &gt;=7.4.3

0.0.2PHP &gt;=8.1.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/3b7d8ec7a4beac7532a5f0d5d83694a17358f80f24c03fe52b40bfeb93ba3c02?d=identicon)[DaniillGolovin](/maintainers/DaniillGolovin)

---

Top Contributors

[![DaniillGolovin](https://avatars.githubusercontent.com/u/159516144?v=4)](https://github.com/DaniillGolovin "DaniillGolovin (76 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP\_CodeSniffer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/daniillgolovin-difrences-files/health.svg)

```
[![Health](https://phpackages.com/badges/daniillgolovin-difrences-files/health.svg)](https://phpackages.com/packages/daniillgolovin-difrences-files)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
