Формат челленджа: папка, этапы, вопросы и тесты
Челлендж — папка в репозитории с файлом challenge.md, этапами в stages/, вопросами и тестами в checks/ и заготовкой в starter/. Всё это обычные markdown-файлы и код — их пишут руками или правят после генерации.
В этой статье
Папка#
Челлендж — любая папка репозитория, в которой лежит challenge.md. Челленджей в одном
репозитории может быть сколько угодно, корень репозитория — тоже папка. Челленджи читаются с
ветки по умолчанию.
parser/
challenge.md название, описание, уровень, теги
stages/
01-zachem.md этап без проверок — теория
02-voprosy.md этап с вопросами
03-kod.md этап с кодом и тестами
checks/ ответы и тесты
02-voprosy.md вопросы этапа 02
03-kod/test_parser.py тесты этапа 03
starter/ с чего начинается репозиторий попытки
parser.py
- stages/ — этапы. Порядок этапов — порядок имён файлов, поэтому имена начинаются с номера
с ведущим нулём:
01-…,02-…,10-…. Имя без.md— адрес этапа:/{владелец}/{репозиторий}/learn/{папка}/stages/02-voprosy. Челлендж в корне репозитория пишется в адресе как-. - checks/ — файлы вопросов с отмеченными ответами и тесты. На экране этапа они не показываются и в репозиторий попытки не копируются. Но это обычные файлы репозитория: в публичном репозитории их может открыть любой — как ответы в конце учебника.
- starter/ — файлы, с которых начинается репозиторий попытки. Нужна, только если в челлендже есть этапы с проверкой файлов.
Папка с challenge.md внутри starter/ или checks/ другого челленджа — его содержимое, а не
отдельный челлендж.
challenge.md#
Шапка плоская — только строки и списки, без вложенных объектов:
| поле | что в нём |
|---|---|
title |
название — обязательно |
summary |
одна строка для списка челленджей |
language |
язык текстов: ru, en |
level |
beginner, intermediate или advanced — на экране «для начала», «средний», «продвинутый» |
tags |
список [git, основы] или одно слово |
source |
путь к материалу, из которого сделан челлендж, от папки челленджа: ../git.md. Файл обязан существовать; на странице челленджа — ссылка «Материал, из которого он сделан» |
Тело — вступление: зачем этот челлендж и что получится в конце. Его показывает страница челленджа.
Этап#
Этап — файл stages/NN-имя.md: шапка и текст задания или теории в markdown. В шапке три поля
описывают этап:
| поле | что в нём |
|---|---|
title |
название этапа — обязательно |
summary |
короткое описание |
minutes |
сколько минут займёт, целым числом — в списке этапов «5 мин» |
Все остальные ключи шапки — проверки. Незнакомый ключ — ошибка формата.
| ключ | как записать | этап засчитан, когда |
|---|---|---|
quiz |
quiz: checks/02-voprosy.md |
на каждый вопрос файла ответили верно; неверные возвращаются в конце круга |
self_check |
self_check: [пункт, пункт] или список строк - пункт |
отмечены все пункты — проверяешь себя сам |
files |
files: [konspekt.md, src/parser.py] |
файлы есть и не пустые |
contains |
contains: и строки путь: текст или путь: ["текст", "текст"] |
в файле есть каждый текст, регистр не важен |
min_words |
min_words: и строки путь: 150 |
в файле не меньше стольких слов, шапка файла не считается |
numeric |
numeric: и строки path: answer.md, answer: 42, tolerance: 0.5 |
последнее число в файле совпало с ответом в пределах допуска; допуск по умолчанию 0, запятая и точка равноправны |
tests |
tests: checks/03-kod/test_parser.py |
тесты на Python (.py) или JavaScript (.js) прошли в песочнице |
Как это складывается:
- Этап без проверок — теория. Его засчитывает кнопка Прочитано, дальше.
- Проверки сочетаются. Этап засчитан, когда пройдены все его части: вопросы, самопроверка и файлы. На экране этапа это список «Что проверяется».
- Два рода путей.
quizиtestsуказывают на файлы челленджа — от его папки, и файл обязан существовать.files,contains,min_wordsиnumericуказывают на файлы в репозитории попытки — от его корня. Путь не может выходить за корень через... - Проверки по файлам (
files,contains,min_words,numeric,tests) читают репозиторий попытки на последнем коммите. Челлендж с такими этапами получает при старте репозиторий попытки, см. Челленджи. - Вид этапа в списке берётся из проверок: «Задание» — есть проверки по файлам, иначе
«Вопросы» — есть
quiz, иначе «Самопроверка», иначе «Теория».
Шапка этапа с проверкой файлов, как в конспекте по методу Корнелла:
---
title: Напиши конспект
files:
contains:
konspekt.md:
min_words:
konspekt.md: 150
---
Расчёт с ответом числом и самопроверка:
---
title: Сколько времени это заняло
files:
numeric:
path: skorost.md
answer: 250
tolerance: 1
---
---
title: Проверь конспект сам
self_check:
- В каждом блоке заметок — мысль своими словами, а не цитата
- Итог умещается в пять предложений и называет главное
---
Файл вопросов#
Вопросы этапа лежат в отдельном markdown-файле в checks/, а шапка этапа ссылается на него:
quiz: checks/02-voprosy.md. Файл читается в любом редакторе как обычная заметка.
- Вопрос — заголовок второго уровня
## …. Заголовок первого уровня и текст до первого вопроса — вступление, вопросом он не считается. - В конце заголовка — id в фигурных скобках:
## Что такое HEAD? {#head}. id — латиница в нижнем регистре, цифры,-и_, до 64 знаков, уникален на весь челлендж. По id живут прогресс попытки и расписание повторений: текст вопроса править можно, смена id начинает вопрос с нуля. - Вид вопроса узнаётся по форме ответа. Его можно назвать явно классом рядом с id:
{#head .card}. - Тело читается с конца. Последние строки
> …— пояснение, которое показывается после ответа. Перед ними — блок ответа. Всё выше — текст вопроса, поэтому нумерованный список или код в условии с ответом не путаются. В одном блоке ответа — один вид строк: варианты, порядок, пары или ответы= ….
| вид | как записать | что делает пользователь |
|---|---|---|
выбор (single) |
варианты - [ ] текст, верный один — - [x] текст |
выбирает один вариант |
несколько ответов (multiple) |
отмечено несколько - [x] или класс .multiple |
отмечает все подходящие; часть верных — «Частично верно» |
порядок (order) |
нумерованный список 1. в верном порядке |
расставляет перемешанные пункты |
пары (pairs) |
строки - слева => справа, не меньше двух |
соединяет; правая колонка перемешана |
пропуски (blanks) |
___ в тексте вопроса и по строке = ответ на каждый пропуск |
вписывает слова |
число (numeric) |
= 42 или = 2.5 ± 0.1 (можно +-) |
вводит число; запятая или точка |
короткий ответ (text) |
= ответ | другой вариант |
пишет ответ; регистр, ё/е, кавычки и точка в конце не важны |
карточка (card) |
класс .card, под заголовком — обратная сторона текстом |
вспоминает, открывает ответ и сам оценивает себя |
У вариантов их должно быть не меньше двух и хотя бы один отмечен верным; у порядка — не меньше двух пунктов; у карточки нет блока ответа, только текст обратной стороны.
Тесты#
Этап с кодом ссылается на файл тестов в checks/, а файлы, с которых начинается работа,
кладутся в starter/ и в шапке перечисляются в files.
- Тесты — обычный скрипт на Python или JavaScript, язык определяется по расширению. Этап
засчитан, если скрипт отработал до конца без ошибки: удобно писать
assertс сообщением. Выход раньше конца файла — например,sys.exit(0)в файле решения — не засчитывается. - Файлы попытки подключаются по имени (
from wordcount import count_words) или по пути (from src.parser import parse). В песочницу уходят файлы попытки того же языка. - Прогон идёт в песочнице с ограничением по времени: бесконечный цикл — провал, а не зависание. Вывод тестов показывается под заданием.
Как видны ошибки формата#
Челлендж с ошибками не начинается. Во вкладке Учиться репозитория у него стоит «В файлах челленджа ошибок: N», а на странице челленджа — список: файл, строка и что не так. Например:
parser/stages/03-kod.md: в шапке этапа нет `title`
parser/stages/03-kod.md: неизвестная проверка `test`; есть: quiz, self_check, files, contains, min_words, numeric, tests
parser/stages/02-voprosy.md: `quiz` ссылается на `checks/02.md`, а такого файла в челлендже нет
parser/checks/02-voprosy.md:7: у вопроса «Что такое HEAD?» нет id — допиши в конец заголовка `{#короткий-id}`
parser/checks/02-voprosy.md:15: вопрос `merge-blank`: пропусков `___` в тексте 2, а строк ответа `= …` 1
Поправь файл и сделай коммит — список обновится. Уже начатые попытки ошибки не задевают: каждая закреплена на версии челленджа, с которой её начали.
Пример: челлендж из вопросов#
Челлендж про git: две теории, два этапа вопросов и карточки. Репозитория попытки у него нет — только прогресс.
git-basics/challenge.md:
git-basics/stages/01-snimki.md — теория, проверок нет:
1. 2.3.
git-basics/stages/02-kommit.md — этап вопросов:
git-basics/checks/02-kommit.md — выбор одного, выбор нескольких и порядок:
- ---
- --
1. 2.3.
- ---
- --
git-basics/stages/03-vetki.md — вторая теория:
git-basics/stages/04-vetki-voprosy.md:
git-basics/checks/04-vetki.md — пары, число, короткий ответ и пропуск:
- --
- --
- --
git-basics/stages/05-kartochki.md и git-basics/checks/05-kartochki.md — карточки:
Пример: этап с кодом и тестами#
Челлендж «Счётчик слов на Python»: пользователь пишет wordcount.py в своём репозитории попытки,
тесты проверяют каждый этап.
python-wordcount/
challenge.md
stages/
01-zadacha.md теория: что считаем словом
02-count.md files + tests
03-top.md files + tests
04-voprosy.md quiz
checks/
02-count/test_count.py
03-top/test_top.py
04-voprosy.md
starter/
wordcount.py
python-wordcount/stages/02-count.md:
python-wordcount/checks/02-count/test_count.py:
assert == 4,
assert == 0,
assert == 0,
assert == 3,
assert == 5,
python-wordcount/starter/wordcount.py — с этого файла начинается репозиторий попытки:
"""Частотный анализ текста.
Функции появятся по этапам челленджа — начни с `count_words`.
"""
"""Сколько слов в тексте."""
"""n самых частых слов: список пар (слово, сколько раз)."""
На заготовке тест падает на NotImplementedError, поэтому этап не засчитывается, пока функция
не написана. Свой челлендж удобно начать с копии этих файлов: создай папку в своём репозитории,
положи в неё challenge.md и stages/, сделай коммит и открой вкладку Учиться.
Было полезно?