CLI interactive integration tests с expect и Go — часть 1
CLI interactive integration tests с expect и Go — часть 1
Тестирование интерактивных консольных приложение получилось довольно интересной задачей.
Как пример напишем простейшие консольное приложение при помощи библиотеки survey:
package main
import (
"fmt"
"github.com/AlecAivazis/survey/v2"
)
// the questions to ask
var qs = []*survey.Question{
{
Name: "name",
Prompt: &survey.Input{Message: "What is your name?"},
Validate: survey.Required,
Transform: survey.Title,
},
{
Name: "color",
Prompt: &survey.Select{
Message: "Choose a color:",
Options: []string{"red", "blue", "green"},
Default: "red",
},
},
{
Name: "age",
Prompt: &survey.Input{Message: "How old are you?"},
},
}
func main() {
// the answers will be written to this struct
answers := struct {
Name string // survey will match the question and field names
FavoriteColor string `survey:"color"` // or you can tag fields to match a specific name
Age int // if the types don't match, survey will convert it
}{}
// perform the questions
err := survey.Ask(qs, &answers)
if err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("%s chose %s.", answers.Name, answers.FavoriteColor)
}
Приложение взаимодействует с пользователе спрашивая различне вопросы и ожидает от пользовательского ввода.
Sassoft API: Coincallback API
Sassoft API: Coincallback API
Описание API
Данный API сервис предназначен для получения уведомлений прихода средств на различные криптоадреса:
- Bitcoin
- Litecoin
- Ethereum
- Ripple
- Dogecoin
- Zcash
Идея простая: вы генерируете новый адрес для приёма криптовалюты и посылаете запрос на Coincallback API для отслеживания приёма средств. Как только средства поступают на адрес, сервис делает POST запрос на ваш адрес, указанный в адресе.
Nginx — настройка load balancer
Nginx — настройка load balancer
Простейшая настройка nginx в качестве load balancer может выглядеть следующим образом. Открываем nginx.conf, добавляем секцию серверов upstream и даём ей имя (например loadbalancer). Серверы могут слушать на разных портах. Кроме того, можно одновременно использовать серверы, слушающие на TCP- и UNIX-сокетах.
В нашем случае:
...
upstream loadbalancer {
server 172.17.0.1:5000;
server 172.17.0.1:5001;
}
...
Далее в секции server указываем nginx что нам нужно проксировать запросы с определенных роутов на наш loadbalancer:
Curl — набор на все случаи жизни
Curl — набор на все случаи жизни
В данной статье собраны некоторые полезные сниппеты для работы с curl. Curl — это кросс-платформенная служебная программа командной строки, позволяющая взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Для справки: curl поддерживает не только протокол HTTP, но и десяток других — DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET и TFTP. Вообщем большой комбайн с различными интересными фичами. Я покажу лишь примеры, которые использовал сам за последнее время.
Golang: Получение stock price с Yahoo Finance
Golang: Получение stock price с Yahoo Finance
При помощи https://github.com/antchfx/htmlquery мы можем легко получать и парсить данные с веб страницы Yahoo Finance. Нас интересует именно stock price. Для этого в начале находим на странице нужный нам блок:
<div class="D(ib) Mend(20px)" data-reactid="31"> <span class="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)" data-reactid="32">63.50</span> <span class="Trsdu(0.3s) Fw(500) Pstart(10px) Fz(24px) C($positiveColor)" data-reactid="33">+2.15 (+3.50%)</span> <div id="quote-market-notice" class="C($tertiaryColor) D(b) Fz(12px) Fw(n) Mstart(0)--mobpsm Mt(6px)--mobpsm" data-reactid="34"> <span data-reactid="35">As of 1:25PM CET. Market open.</span> </div> </div>
Окей, нужный блок найден. Из этого блока нас больше всего интересует ticker price — 63.50:
Sassoft API: Notifications API
Sassoft API: Notifications API
Описание API
Данный API сервис предназначен для отправки уведомлений через различные каналы:
- Telegram
- Email через Sendgrid API
- SMTP Email
Спецификация
- POST /notify
- message * — сообщение для отправки (html форматирование поддерживается)
- message_plain — сообщение для отправки без html форматирования
- from — имя от, необходим если type=email
- from_address — адрес от, необходим если type=email
- title — заголовок, необходим если type=email
- receiver * — получатель сообщения
- type * — поддерживаемые типы: Email, Telegram, SMTP
- token * — токен пользователя
Пример запроса:
Sassoft API: Rates API для криптовалют
Sassoft API: Rates API для криптовалют
Описание API
Данный API сервис предназначен для выдачи курсов криптовалют и фиатных валют в режиме реального времени без задержек.
При помощи одного GET запроса можно получить текущие курсы криптовалют в USD, EUR, RUB. Для примера:
{
"BTC_USD":22999.408322398973,
"BTC_EUR":18745.989744887796,
"BTC_RUB":1677209.0364978933
...
}
Rates API будет полезен для сервисов, работающих на обменах криптовалют и мониторингов курсов.
Установка и настройка supervisord в raspbian
Установка и настройка supervisord в raspbian
Supervisord — система контроля процессов для Linux. По-простому, это штука которая следит чтобы ваш процесс был всегда запущен с установленной конфигурацией. Система следит что процесс работает и перезапускает если процесс падает.
Установка supervisor:
sudo apt-get install supervisor service supervisor start
Добавление конфигурации в supervisord.conf (либо создайте отдельно /etc/supervisor/conf.d/server.conf):
Локальная отладка GitHub Actions с act
Локальная отладка GitHub Actions с act
Не так давно потребовалось понять причину почему один из введенных actions для GitHub Actions перестал работать. Для того, чтобы проверить работу action их нужно для начала запустить локально. Это можно сделать при помощи утилиты act. Важно выбрать правильный runner для работы.
Пример использования act:
brew install nektos/tap/act act -P ubuntu-latest=nektos/act-environments-ubuntu:18.04 -j test
Где -j это название action для локального запуска.
Golang — Упаковка ресурсов и статических файлов в бинарник с go rice
Golang — Упаковка ресурсов и статических файлов в бинарник с go rice
Задача упаковки статических ресурсов в один жирный бинарник стоит не так часто, но в одном из проектов все-таки это понадобилось. Посмотрев на разные библиотеки из awesome go, остановился на наверное самом простом и более для меня понятном go rice.
В чем фишка? Мы меняем вызовы os.Open на box.Open, далее запускаем утилиту rice embed-go, которая создает для нас rice-box.go с нужным массивом байтов внутри. Утилита сканирует наш код и вызовы box.Open и добавляет файлы в файл rice-box.go