Практичну вправу на треку Exercism часто реалізують за специфікацією з репозиторію exercism/problem-specifications.
Exercism свідомо вимагає, щоб кожна вправа мала власну копію певних файлів (як-от .docs/instructions.md), навіть якщо ця вправа вже є в problem-specifications.
Тому в configlet є команда sync, яка може перевірити, чи такі практичні вправи на треку синхронізовані з цим репозиторієм-джерелом, і оновити їх, коли є доступні оновлення.
З problem-specifications можна оновлювати три види даних: документацію, метадані й тести.
Є також один вид даних, який можна заповнити з файлу config.json рівня треку: шляхи до файлів у конфігураційних файлах вправ.
Перевірку й оновлення цих видів даних ми описуємо в окремих розділах нижче, але ось короткий підсумок:
configlet sync працює лише з тими вправами, які є у файлі config.json рівня треку.
Тому якщо ми реалізуємо нову вправу на треку й хочемо створити початкові файли за допомогою configlet sync, спершу додамо цю вправу до файлу config.json рівня треку.
Якщо вправа ще не готова до показу користувачам, встановімо її значення status як wip.configlet sync без опцій нічого не змінює на треку й перевіряє всі види даних для кожної вправи.--docs, --filepaths, --metadata і --tests.--update.--update --yes.--update --tests include --exercise prime-factors.problem-specifications, додамо --offline --prob-specs-dir /path/to/local/problem-specifications
configlet sync намагається зберегти порядок ключів у файлах .meta/config.json вправ.
Щоб записати ці файли в канонічній формі без синхронізації, скористаймося командою configlet fmt.
Однак configlet sync усе ж додає обовʼязкові ключі (authors, files, blurb), можливо порожні, якщо їх немає.
Це менш «схоже на синхронізацію», зате зручніше: під час реалізації нової вправи можна скористатися sync, щоб створити початковий файл .meta/config.json.configlet sync видаляє ключі, яких немає в специфікації.
Власні пари ключ-значення все одно підтримуються: їх треба записувати всередині обʼєкта JSON із назвою custom.Зауважмо, що у випусках configlet 4.0.0-alpha.34 і раніших команда sync працювала лише з тестами.
Команду sync можна використовувати, щоб перевіряти або оновлювати документацію, метадані й тести практичних вправ із «problem-specifications».
Нею також можна перевіряти або заповнювати відсутні значення files для концептуальних і практичних вправ із файлу config.json рівня треку.
configlet [global-options] sync [command-options]
Global options:
-h, --help Show this help message and exit
--version Show this tool's version information and exit
-t, --track-dir <dir> Specify a track directory to use instead of the current directory
-v, --verbosity <verbosity> The verbosity of output. Allowed values: q[uiet], n[ormal], d[etailed]
Options for sync:
-e, --exercise <slug> Only operate on this exercise
-p, --prob-specs-dir <dir> Use this 'problem-specifications' directory, rather than cloning temporarily
-o, --offline Do not check that the directory specified by --prob-specs-dir is up to date
-u, --update Prompt to update the seen data that are unsynced
-y, --yes Auto-confirm prompts from --update for updating docs, filepaths, and metadata
--docs Sync Practice Exercise '.docs/introduction.md' and '.docs/instructions.md' files
--filepaths Populate empty 'files' values in Concept/Practice exercise '.meta/config.json' files
--metadata Sync Practice Exercise '.meta/config.json' metadata values
--tests [mode] Sync Practice Exercise '.meta/tests.toml' files.
The mode value specifies how missing tests are handled when using --update.
Allowed values: c[hoose], i[nclude], e[xclude] (default: choose)
Практична вправа, похідна від репозиторію problem-specifications, повинна мати файл .docs/instructions.md (а можливо, і файл .docs/introduction.md) з документацією вправи з problem-specifications.
Щоб перевірити всі практичні вправи на треку на наявність оновлень документації (з ненульовим кодом виходу, якщо є хоч одне доступне оновлення):
configlet sync --docs
Щоб інтерактивно оновити документацію для всіх практичних вправ, додамо опцію --update (або -u для стислості):
configlet sync --docs --update
Щоб неінтерактивно оновити документацію для всіх практичних вправ, додамо опцію --yes (або -y для стислості):
configlet sync --docs --update --yes
Щоб працювати з однією практичною вправою, скористаймося опцією --exercise (або -e для стислості).
Наприклад, щоб неінтерактивно оновити документацію для вправи prime-factors:
configlet sync --docs -uy -e prime-factors
Кожна вправа на треку повинна мати файл .meta/config.json.
Для практичної вправи, похідної від репозиторію problem-specifications, цей файл має містити пари ключ-значення blurb, source і source_url, які є у відповідному файлі metadata.toml із репозиторію-джерела.
Щоб перевірити всі практичні вправи на наявність оновлень метаданих (з ненульовим кодом виходу, якщо є хоч одне доступне оновлення):
configlet sync --metadata
Щоб інтерактивно оновити метадані для всіх практичних вправ, додамо опцію --update (або -u для стислості):
configlet sync --metadata --update
Щоб неінтерактивно оновити метадані для всіх практичних вправ, додамо опцію --yes (або -y для стислості):
configlet sync --metadata --update --yes
Щоб працювати з однією практичною вправою, скористаймося опцією --exercise (або -e для стислості).
Наприклад, щоб неінтерактивно оновити метадані для вправи prime-factors:
configlet sync --metadata -uy -e prime-factors
Якщо трек реалізує вправу, для якої в репозиторії problem-specifications є тестові дані, вправа повинна містити файл .meta/tests.toml.
Мета файлу tests.toml - відстежувати, які тести реалізовано у вправі.
Тести в цьому файлі ідентифікуються за їхнім UUID, і кожен тест має булеве значення (англ. Boolean), яке вказує, чи реалізовано його у вправі.
Файл tests.toml має такий формат:
# This is an auto-generated file.
#
# Regenerating this file via `configlet sync` will:
# - Recreate every `description` key/value pair
# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications
# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion)
# - Preserve any other key/value pair
#
# As user-added comments (using the # character) will be removed when this file
# is regenerated, comments can be added via a `comment` key.
[1e22cceb-c5e4-4562-9afe-aef07ad1eaf4]
description = "basic"
[79ae3889-a5c0-4b01-baf0-232d31180c08]
description = "lowercase words"
[ec7000a7-3931-4a17-890e-33ca2073a548]
description = "invalid input"
include = false
comment = "excluded because we don't want to add error handling to the exercise"
У цьому випадку трек обрав реалізувати два з трьох доступних тестів.
Якщо трек використовує генератор тестів, щоб згенерувати набір тестів для вправи, він повинен використати вміст файлу tests.toml, щоб визначити, які тести включити до згенерованого набору тестів.
Щоб перевірити кожен файл tests.toml практичної вправи на наявність оновлень тестів (з ненульовим кодом виходу, якщо є хоч один тестовий випадок, який є в канонічних даних вправи, але відсутній у tests.toml):
configlet sync --tests
Щоб інтерактивно оновити файл tests.toml для всіх практичних вправ, додамо опцію --update:
configlet sync --tests --update
Для кожного відсутнього тесту це пропонує користувачеві вибрати, включити його, виключити чи пропустити, і відповідно оновлює відповідний файл tests.toml.
Configlet записує файл tests.toml вправи, коли користувач завершує вибір для цієї вправи.
Це означає, що ми можемо перервати configlet на запрошенні (наприклад, натиснувши Ctrl-C у терміналі) і втратимо рішення щодо синхронізації щонайбільше для однієї вправи.
Щоб неінтерактивно включити кожен ще не бачений тестовий випадок, скористаймося --tests include.
Наприклад, щоб зробити це для вправи з назвою prime-factors:
configlet sync --tests include -u -e prime-factors
Не забудьмо насправді реалізувати ці тести на треку!
Нарешті, команда sync також виконує «синхронізацію» з джерела, яким не є problem-specifications, а саме з файлу config.json рівня треку.
Кожна концептуальна вправа і кожна практична вправа повинна мати файл .meta/config.json з обʼєктом files, який задає (відносні) розташування файлів, які використовує вправа.
Такі шляхи до файлів зазвичай мають просту закономірність, тож configlet може заповнити значення рівня вправи за закономірностями з ключа files файлу config.json рівня треку.
Щоб перевірити, що кожна концептуальна і практична вправа на треку має повністю заповнений ключ files (або принаймні такий, який не можна заповнити з ключа files рівня треку):
configlet sync --filepaths
(Зауважмо, що configlet lint також видасть помилку, якщо у вправи ключ files відсутній або порожній.)
Щоб заповнити порожні або відсутні значення ключа files рівня вправи для кожної концептуальної і практичної вправи за закономірностями з ключа files рівня треку:
configlet sync --filepaths --update
Щоб зробити це неінтерактивно і для однієї вправи з назвою prime-factors:
configlet sync --filepaths -uy -e prime-factors
sync під час додавання нової вправи на трекКоманда sync стає в пригоді, коли ми додаємо нову вправу на трек.
Якщо ми додаємо практичну вправу з назвою foo, яка є в problem-specifications, один із можливих робочих процесів такий:
foo до файлу config.json рівня треку.
Після цього вправа стане видимою для configlet sync.configlet sync --docs --filepaths --metadata -uy -e foo, щоб створити документацію вправи та початковий файл .meta/config.json із заповненими files, blurb, а можливо, і значеннями source та source_url..meta/config.json вправи так, як потрібно.
Наприклад, додамо себе до масиву authors.configlet sync --tests include -u -e foo, щоб створити файл .meta/tests.toml з усіма включеними тестами..meta/tests.toml і додамо include = false до кожного тестового випадку, який вправа не реалізовуватиме..meta/tests.toml.