Code Monkey home page Code Monkey logo

java-project-lvl2's Introduction

[JAVA] Проект "Вычислитель отличий" (gendiff)

Actions Status Maintainability Test Coverage

Описание

Это вольная реализация проекта Хекслета "Вычислитель отличий". Это консольная утилита, которая генерирует 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.

Для удобства демонстрации добавлено две команды, которые соберут приложение и запустят его с аргументами.

Генерация diff для json в формате stylish

make run-stylish-json-example 

asciicast

Генерация diff для yaml в формате plain

make run-plain-yaml-example

asciicast

Файлы, для которых генерируется 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> в строку.

java-project-lvl2's People

Contributors

danielvinogradov avatar

Stargazers

 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.