An open API service indexing awesome lists of open source software.

https://github.com/bialger/weather-forecast

A C++ crossplatform console app with convenient CLI for weather forecast. Requires Yandex Geocoder API key.
https://github.com/bialger/weather-forecast

install-script student-project text-ui weather-app weather-forecast

Last synced: 3 months ago
JSON representation

A C++ crossplatform console app with convenient CLI for weather forecast. Requires Yandex Geocoder API key.

Awesome Lists containing this project

README

          

# Программа weather-forecast

Данная программа предоставляет прогноз погоды в терминале с удобным текстовым интерфейсом.
Она была написана как лабораторная работа в курсе "Программирование на C++" в программе ITMO SE.
С заданием можно ознакомиться [здесь](./TASK.md).

Документация проекта находится [в соответствующей папке](./docs/README.md).

Этот документ описывает сборку из исходного кода и использование программы
weather-forecast.

## Зависимости

Для успешной компиляции требует установленного `Git`, `CMake` и компилятора C++,
поддерживающего стандарт C++20.
Также потребуется ключ от [Yandex Geocoder API](https://yandex.ru/dev/geocode/doc/ru/).

> Если Вам не хочется получать ключ, можно воспользоваться архивом кэша:
> [cache.zip](https://github.com/bialger/weather-forecast/releases/download/v1.2.0/cache.zip).
> После распаковки поместите в каталог /.config, а затем начните установку.
>

> Используйте вместо API-ключа `00000000-0000-0000-0000-000000000000`.

## Как собрать

> **Важно!**

> Для ОС Windows успешная сборка и компиляция возможна **только** при
> установленном компиляторе `MinGW`.

В данном документе описана исключительно процедура сборки главного исполняемого
файла.
> Процесс сборки тестов описан не будет, его можно восстановить из
[CI/CD скрипта](/.github/workflows/ci_tests.yml).

### Автоматическая сборка и установка

Сделайте исполняемым и запустите [shell-script установки](/install.sh), затем следуйте
инструкциям.
> **Важно!**

> Для ОС Windows автоматизированная сборка гарантирована только
> при запуске в Git Bash.

```shell
chmod +x ./install.sh && ./install.sh
```

### Ручная сборка

* Сначала, если Вы этого не сделали, клонируйте проект и перейдите в его каталог:

```shell
git clone https://github.com/bialger/weather-forecast.git && cd weather-forecast
```

#### Linux и MacOs

* Создайте Release-кеш CMake:

```shell
cmake -S . -B ~/CMakeBuilds/weather-forecast -DCMAKE_BUILD_TYPE=Release
```

* Соберите проект из этого кеша:

```shell
cmake --build ~/CMakeBuilds/weather-forecast --target weather-forecast
```

* Введите ключ от [Yandex Geocoder API](https://yandex.ru/dev/geocode/doc/ru/) и
запишите его в соответсвующий файл:

```shell
read -r API_KEY && echo "$API_KEY" > "./.config/yandex_api_key.apikey"
```

* Скопируйте в конфигурационный каталог файлы конфигурации:

```shell
cp -r ./.config ~/.config/weather-forecast
```

* Создайте символьную ссылку на исполняемый файл (`~/weather-forecast.run`):

```shell
ln -s ~/CMakeBuilds/weather-forecast/bin/weather-forecast ~/weather-forecast.run
```

* Запустите программу:

```shell
~/weather-forecast.run
```

#### Windows (`cmd.exe`)

* Создайте Release-кеш CMake:

```shell
cmake -S . -B "%userprofile%\CMakeBuilds\weather-forecast" -DCMAKE_BUILD_TYPE=Release
```

* Соберите проект из этого кеша:

```shell
cmake --build "%userprofile%\CMakeBuilds\weather-forecast" --target weather-forecast
```

* Введите ключ от [Yandex Geocoder API](https://yandex.ru/dev/geocode/doc/ru/) и
запишите его в соответсвующий файл:

```shell
SET /P API_KEY="Enter your Yandex Geocoder API key: " && echo %API_KEY% > ".config\yandex_api_key.apikey"
```

* Скопируйте в конфигурационный каталог файлы конфигурации:

```shell
xcopy /si .config "%userprofile%\.config\weather-forecast"
```

* Скопируйте исполняемый файл и библиотеки в каталог `%userprofile%\weather-forecast` для быстрого доступа

```shell
mkdir "%userprofile%\weather-forecast"
copy "%userprofile%\CMakeBuilds\weather-forecast\weather-forecast.exe" "%userprofile%\weather-forecast\weather-forecast.exe"
copy "%userprofile%\CMakeBuilds\weather-forecast\libcpr.dll" "%userprofile%\weather-forecast\libcpr.dll"
copy "%userprofile%\CMakeBuilds\weather-forecast\libcurl.dll" "%userprofile%\weather-forecast\libcurl.dll"
```

* Создайте символьную ссылку на исполняемый файл (`%userprofile%\weather-forecast\weather-forecast.exe`):

```shell
mklink "%userprofile%\weather-forecast.exe" "%userprofile%\weather-forecast\weather-forecast.exe"
```

> Для Windows запуск такой ссылки из командной строки или иного эмулятора терминала
> полноценно невозможен, только из Проводника.

* Запустите программу:

```shell
cd %userprofile%\weather-forecast && .\weather-forecast.exe
```

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

Программа weather-forecast — консольное приложение для просмотра погоды.
Предусмотрен показ погоды для локаций, перечисленных в конфигурационном файле, на
текущий момент, а также на утро, день, вечер и ночь некоторого количества дней.
Программа в один момент времени отображает непосредственно прогноз на три дня, для
просмотра прочих следует использовать навигации.
В случае отсутствия Интернет-соединения программа запустится, однако не будет отображать
актуальную информацию.
Для получения актуальных данных возобновите подключение и обновите данные в программе.

> Поскольку программа использует
[Yandex Geocoder API](https://yandex.ru/dev/geocode/doc/ru/), для работы
> требуется валидный API-ключ.
> Бесплатная версия поддерживает 1000 запросов в сутки.

### Пример интерфейса

![image](/assets/weather_forecast_1.png)

### Вызов

Программа может быть вызвана без аргументов — будут применены значения по умолчанию.
Порядок аргументов не имеет значения.

#### Аргументы командной строки:

* `-l` или `--location` - строка с названием первой локации, для которой будет
предоставлен прогноз погоды.
Если аргумент не указан, первая локация получается из конфигурационного файла.
* `-c` или `--config` - строка с именем файла конфигурации в формате JSON.
Значения по умолчанию получают из
[файла конфигурации по умолчанию](/.config/default_config.json).
Документ должен содержать строковое поле `api_key_file` с относительным путем к
файлу, содержащему ключ к
[Yandex Geocoder API](https://yandex.ru/dev/geocode/doc/ru/); поле `locations`,
содержащее список локаций (строк, содержащие адрес или название города на
английском языке) для показа погоды; поле `defaults`, содержащее следующие
значения параметров по умолчанию:
* `interval` - как аргумент `--interval`.
* `days_count` - как аргумент `--days-count`
* `location_index` - целое неотрицательное число, являющееся индексом локации
по умолчанию из списка `locations`.
Строго меньше количества локаций.
* `-L` или `--log-file` - строка с именем файла для записи логов.
Имя файла должно быть валидным, в частности, не являться именем каталога.
Если параметр не указан, логи выводятся в стандартный поток вывода.
* `-d` или `--days-count` - целое положительное число, определяющее количество дней
прогноза, отображаемых при запуске программы.
Не может превышать 15.
Если аргумент не указан, частота обновления получается из конфигурационного файла.
* `-i` или `--interval` - целое положительное число, определяющее частоту
обновлений в часах.
Не может превышать 48.
Если аргумент не указан, частота обновления получается из конфигурационного файла.
* `-v` или `--verbose` - флаг, при истинности которого происходит вывод логов работы
программы.
* `-h` или `--help` - флаг, при истинности которого вместо выполнения программы
происходит вывод справки и завершение работы.

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

Навигация в программе происходит с помощью нажатий клавиш.

#### Список управляющих клавиш

* `Esc` или `q` - выход из программы.
* `F5` или `r` - обновление данных.
* `+` - увеличение количества отображаемых дней на единицу, но не более 15.
* `-` - уменьшение количества отображаемых дней на единицу, но не менее 3.
При этом в том случае, если фокус направлен на последний день, происходит
смещение фокуса вверх.
* `w` или `ArrowUp` - смещение фокуса отображения вверх (меньшая дата) на единицу.
* `s` или `ArrowDown` - смещение фокуса отображения вверх (меньшая дата) на единицу.
* `n`, `d` или `ArrowRight` - переход к следующей локации из списка.
При достижении конца списка следующим считается первый элемент.
* `p`, `a` или `ArrowLeft` - переход к предыдущей локации из списка.
При достижении начала списка предыдущим считается последний элемент.