Додайте першу вправу


Перша вправа на кожному треку - дуже проста вправа «Hello, World!».

Мета цієї вправи - швидко переконатися, що все зібрано й налаштовано правильно. Це підтвердить, що користувач правильно встановив середовище програмування, уміє запускати тести й може зробити так, щоб вони проходили. Крім того, для клієнта командного рядка Exercism (CLI) це також засвідчує, що CLI встановлено й налаштовано правильно, і що сайт надсилає правильні файли для вправи, не додаючи зайвих артефактів. І нарешті, це переконує, що користувач знайомий з циклом: завантажити вправу за допомогою CLI, розвʼязати задачу у своєму локальному середовищі розробки й надіслати рішення назад на сайт.

Іншими словами, поки що це не про вивчення самої мови. Ми прагнемо чогось гранично простого.

Імовірно, це також буде найскладнішою частиною правильного налаштування репозиторію треку, адже під час реалізації вправи взаємодіє багато різних частин.

Реалізуємо вправу

До вправи «Hello, World!» застосовуються деякі особливі правила:

  • Вона завжди перша вправа на треку
  • Кожен трек має її реалізувати
  • Файл тестів містить лише один тест
  • Файл-заготовка містить майже робочу реалізацію, але замість «Hello, World!» у ній використано «Goodbye, Mars!»
  • У неї немає prerequisites
  • У неї немає practices

Визначаємо шляхи до файлів

Вправа «Hello, World!» (як і всі вправи на Exercism) потребує конкретного набору файлів:

  • Документація: пояснює учневі, що потрібно зробити (можна згенерувати автоматично).
  • Метадані: надають Exercism деякі метадані про вправу (здебільшого можна згенерувати автоматично).
  • Набір тестів: перевіряє правильність рішення (для кожного треку свій).
  • Заготовка реалізації: дає учням початкову точку (для кожного треку своя).
  • Приклад реалізації: дає зразок реалізації, який проходить усі тести (для кожного треку свій).
  • Додаткові файли: забезпечують можливість запуску тестів (для кожного треку свої, необовʼязково).

Перш ніж створити вправу «Hello, World!», нам потрібно визначитися з назвами й шляхами файлів, специфічних для треку (набір тестів, заготовка реалізації, приклад реалізації та будь-які додаткові файли).

Зазвичай варто використовувати назви, природні для мови. Якщо сильних уподобань немає, варто надавати перевагу простішим структурам каталогів. Скрипт CI має вміти розпізнавати приклад реалізації, тому варто вибрати загальну базову назву, яку можна використовувати в усіх вправах, наприклад example, sample або reference-solution.

Налаштовуємо шляхи до файлів

Вибравши шляхи до файлів для треку, налаштуймо їх у ключі files кореневого файлу config.json. Ключ files буде шаблоном для всіх вправ, завдяки чому будь-який інструментарій (частину якого ми використаємо за мить) знатиме, де шукати файли. Можна використовувати різні заповнювачі, щоб легко налаштувати слаг вправи (у цьому випадку hello-world).

Приклад

Якщо на треку для файлів використовується PascalCase, ключ files може мати такий вигляд:

"files": {
  "solution": [
    "%{pascal_slug}.cs"
  ],
  "test": [
    "%{pascal_slug}Tests.cs"
  ],
  "example": [
    ".meta/Example.cs"
  ]
}
Note

Файли прикладу потрібно зберігати в каталозі .meta.

Докладніше дивіться в документації ключа files.

Створюємо файли

Вказавши шаблони шляхів до файлів, можна швидко створити каркас файлів вправи «Hello, World!», виконавши з кореневого каталогу треку такі команди:

bin/fetch-configlet
bin/configlet create --practice-exercise hello-world

Вказуємо автора

Щоб сайт зазначив вас як автора вправи, виконайте такі кроки:

У файлі .meta/config.json вправи:

  • Додайте своє імʼя користувача GitHub до ключа authors

Щоб це працювало, потрібно привʼязати свій акаунт Exercism до GitHub. Це можна зробити на сайті в розділі «Інтеграції» сторінки налаштувань.

Note

Автори вправ також отримують репутацію

Використовуємо скрипт

Новіші репозиторії треків можуть використовувати скрипт bin/add-practice-exercise (джерело), щоб додавати нові вправи:

bin/add-exercise -a <github_username> two-fer
Note

Якщо в репозиторії треку немає цього файлу, його можна скопіювати за посиланням на джерело вище.

Реалізація вправи

Коли каркас файлів створено, потрібно:

  • додати тести у файл тестів
  • додати приклад реалізації
  • визначити вміст файлу-заготовки

Додаємо тести

Додавання тестів - ключова частина роботи над вправою. Загалом є два варіанти реалізації такої вправи:

  1. Написати тести з нуля, використовуючи тестові випадки з canonical-data.json вправи
  2. Перенести тести з реалізації іншого треку (підказка: перейдіть на https://exercism.org/exercises/hello-world, щоб побачити, які треки реалізували конкретну вправу).

Для вправи «Hello, World!» буде лише один тестовий випадок, тож підійде будь-який із цих варіантів.

Додаємо приклад реалізації

Файл прикладу реалізації має містити код, потрібний для проходження тестів.

Визначаємо заготовку

Файл-заготовка має містити майже робоче рішення тестів, але з текстом «Hello, World!», заміненим на «Goodbye, Mars!». Підказка: можна просто скопіювати й трохи змінити приклад рішення.

Оновлюємо авторів вправи

Коли роботу над вправою завершено, додайте своє імʼя користувача GitHub до масиву "authors" у файлі .meta/config.json вправи. Так ми коректно зазначимо, хто створив вправу.

Лінтинг

Щоб перевірити, що вправу налаштовано правильно, можна скористатися вбудованою функцією лінтингу інструмента configlet.

Спочатку потрібно завантажити інструмент configlet; для цього ми створили два скрипти:

  • bin/fetch-configlet: запускаємо, якщо використовується *nix або macOS
  • bin/fetch-configlet.ps1: запускаємо, якщо використовується Windows

Запуск одного з цих скриптів із кореневого каталогу репозиторію треку завантажить бінарний файл bin/configlet або bin/configlet.exe.

Після цього можна перевірити правильність вправи, запустивши bin/configlet lint.

Note

Цілком імовірно, що configlet повідомить про таку помилку:

The `tags` array is empty:
/path/to/track/config.json

Цю помилку буде виправлено на кроці Підготовка до запуску, тож можна або:

  • поки що проігнорувати помилку, або
  • виправити помилку, додавши теги
Note

Робочий процес configlet автоматично запускає configlet lint щоразу, коли щось потрапляє в main або в pull request.