# Go Draw.io Exporter

Автор: Алексей Бадяев <aleksei.badiaev@mousesoft.ru>

Экспортирует все диаграммы из файла формата `Draw.io`.
Для работы необходимо наличие приложения `drawio-desktop`.

## Разработка

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

1. Клонировать репозиторий проекта в папку `$GOPATH/src/git.mousesoft.ru/ms/`.
2. Установить все Go-пакеты, от которых зависит этот проект
   (см. следующий раздел).
3. Если предполагается формирование отчёта о покрытии кода модульными тестами,
   то нужно установить необходимые для этого пакеты
   (см. раздел [Тестирование](#тестирование) далее).

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

Структура дерева файлов проекта соответствует рекомендациям в
[Standard Go Project Layout](https://github.com/golang-standards/project-layout):

- `build` - Сборка и непрерывная интеграция (Continuous Integration, *CI*).
- `cmd` - Основные приложения проекта. Имя директории для каждого приложения
    должно совпадать с именем исполняемого файла, который вы хотите собрать.
- `pkg` - Код библиотек, пригодных для использования в сторонних приложениях.
- `scripts` - Скрипты для сборки, установки, анализа и прочих операций над проектом.

### Линтеры

Отформатировать все исходные тексты проекта в соответствии со стандартом Go
можно командой:

    go fmt ./...

В проекте используются следующие линтеры:

- [go vet](https://pkg.go.dev/cmd/vet)
- [errcheck](https://github.com/kisielk/errcheck)  
  Команда установки линтера: `go install github.com/kisielk/errcheck@latest`.
- [staticcheck](https://staticcheck.io/)  
  Команда установки линтера: `go install honnef.co/go/tools/cmd/staticcheck@latest`.
- [usestdlibvars](https://github.com/sashamelentyev/usestdlibvars)  
  Команда установки линтера: `go install github.com/sashamelentyev/usestdlibvars@latest`

Все линтеры проекта можно запустить командой:

    make lint

## Компиляция

Все зависимости устанавливаются в папку `vendor` командой:

    make vendor

Собрать исполняемый файл сервиса можно командой:

    make build

После успешного выполнения команды в папке `out/bin` в корне проекта появится
исполняемые бинарные файлы.

### Версия продукта

Проект версионируется в соответствии с документом
[Семантическое Версионирование 2.0.0](https://semver.org/lang/ru/).
Наименование версии продукта считывается во время сборки проекта из переменной
окружения `VERSION`. Если при сборке переменная окружения `VERSION` не задана,
то номер версии формируется автоматически из системы контроля версий на основании
последнего тэга, наличия коммитов после него и текущего состояния репозитория
командой:

    git describe --always --tags --dirty

При этом если проект собирается из ветки выпуска вида `release/1.2.3`, то
то версия принимает вид `v1.2.3RC` (что означает "Release Candidate").

Для получения версии приложения необходимо запустить его с параметром `--version`:

    drawio-export --version

## Тестирование

Статический анализ всех исходных текстов проекта можно выполнить командами:

    go vet ./...

Модульные тесты проекта можно запустить командой:

    make test

### Отчёт о тестировании

Отчёт о выполнении тестов можно получить, запустив в папке программы команду:

    make test

Для получения отчёта о выполнении тестов в формате *JUnit XML* необходимо
установить инструмент:

    go install github.com/jstemmer/go-junit-report@latest

Получить отчёт можно командой:

    EXPORT_RESULT=true make test

После успешного выполнения команды появится файл `out/junit-report.xml`
с отчётом в формате [JUnit](https://junit.org).

### Покрытие кода тестами

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

    go install github.com/axw/gocov/gocov@latest
    go install github.com/matm/gocov-html/cmd/gocov-html@latest
    go install github.com/AlekSi/gocov-xml@latest

Для получения отчёта о покрытии проекта тестами в консоли нужно выполнить
команду:

    make coverage

Получить отчёт о покрытии кода тестами в формате *HTML* можно командой:

    EXPORT_RESULT=true make coverage

После успешного выполнения этой команды файл `out/coverage.html` будет содержать
отчёт о покрытии кода проекта модульными тестами в формате *HTML*.

Получить отчёт о покрытии кода тестами в формате *XML* можно командой:

    EXPORT_RESULT=true COVERAGE_FORMAT=xml make coverage

После успешного выполнения этой команды файл `out/coverage.xml` будет содержать
отчёт о покрытии кода проекта модульными тестами в формате *XML*.
