shad-go/ciletters/README.md

67 lines
4 KiB
Markdown
Raw Normal View History

2021-02-18 19:47:04 +00:00
## ciletters
В этой задаче вам предстоит познакомиться со стандартным пакетом [text/template](https://golang.org/pkg/text/template/),
2022-02-24 19:35:05 +00:00
позволяющим генерировать текст в определенном формате, а также с пакетом [embed](https://pkg.go.dev/embed),
позволяющим вкомпиливать в исполняемый файл строковые литералы.
2021-02-18 19:47:04 +00:00
### Легенда
В gitlab можно подписаться на различные события: успешный build, новый комментарий, решённое issue и др.
Вот так, например, выглядит нотификация о сломанном pipeline'е:
![Image description](assets/notification.png)
В задаче предлагается сгенерировать письмо подобного содержания в текстовом виде.
Для генерации HTML в языке также имеется стандартный пакет [html/template](https://golang.org/pkg/html/template/).
2021-02-27 12:23:31 +00:00
Работа с ним аналогична работе с `text/template`, поэтому для простоты в задаче был выбран текстовый формат.
2021-02-18 19:47:04 +00:00
### Что нужно сделать?
Нужно реализовать функцию `MakeLetter` из файла [letter.go](./letter.go),
которая по go объекту нотификации генерирует её текстовое представление.
2022-03-06 02:06:00 +00:00
Для этого нужно написать `text/template` шаблон, сохранить его в отдельный файл, а затем получить его содержимое в коде с помомщью `go:embed`.
2022-02-24 19:35:05 +00:00
2021-02-18 19:47:04 +00:00
#### Прокомментированный пример из теста
```
Your pipeline #194613 has failed! // 194613 -- это ID pipeline'а
Project: go-spring-2021/gopher // Project состоит из ID группы и ID проекта
Branch: 🌿 master
Commit: 8967153e Solve urlfetch. // Первые 8 байт хэша коммита.
CommitAuthor: gopher
// Здесь происходит цикл по всем сломанным job'ам
Stage: test, Job grade // test -- это имя stage'а, а grade -- имя job'а
// Далее идут последние 10 строк лога gitlab runner'а
testtool: copying go.mod, go.sum and .golangci.yml
testtool: running tests
2023-10-02 19:32:41 +00:00
testtool: > go test -mod readonly -tags private -c -o /tmp/bincache730817117/5d83984f885e61c1 gitlab.com/manytask/itmo-go/private/sum
2021-02-18 19:47:04 +00:00
--- FAIL: TestSum (0.00s)
sum_test.go:19: 2 + 2 == 0 != 4
sum_test.go:19: 9223372036854775807 + 1 == 0 != -9223372036854775808
FAIL
testtool: task sum failed: test failed: exit status 1
some tasks failed
ERROR: Job failed: exit code 1
```
Объект нотификации описан в [notification.go](notification.go).
2022-02-17 17:04:02 +00:00
Обратите внимание на `//go:build !change`.
2021-02-18 19:47:04 +00:00
Этот файл менять не нужно, и на сервере будет использоваться оригинальный вариант.
2021-02-19 19:53:31 +00:00
В реализации нужно подогнать `text/template` шаблон под требуемый вывод. Функция должна использовать один шаблон.
2022-02-17 17:04:02 +00:00
Использовать `fmt.Sprintf` или конкатенацию строк нельзя.
2021-02-18 19:47:04 +00:00
Вам могут понадобиться:
* условные блоки (`if/else`)
* range'и
* кастомные функции в шаблоне: https://golang.org/pkg/text/template/#FuncMap
* `'-'` для удаления пробелов
### Проверка решения
Для запуска тестов нужно выполнить следующую команду:
```
go test -v ./ciletters/...
```