configlet lint


A configlet elsődleges használata a lintelés: annak ellenőrzése, hogy egy kurzus konfigurációs fájljai megfelelően strukturáltak-e, szintaktikailag és szemantikailag egyaránt. A hibásan beállított kurzusok nem feltétlenül szinkronizálódnak megfelelően, hibásan jelenhetnek meg a weboldalon, vagy nem optimális felhasználói élményt nyújthatnak, ezért a configlet ellenőrzései fontos szerepet játszanak az Exercism integritásának megőrzésében.

Használat

A lint parancs egy kurzus lintelésére használható.

configlet [global-options] lint [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]

Szabályok

Ezek az ellenőrzött lintelési szabályok.

Szabály: a kötelező fájlok jelen vannak

A lintelőnek ellenőriznie kell, hogy minden kötelező fájl jelen van-e. A nem feladatspecifikus fájlok, amelyeknek jelen kell lenniük:

  • config.json
  • docs/ABOUT.md
  • docs/INSTALLATION.md
  • docs/LEARNING.md
  • docs/RESOURCES.md
  • docs/SNIPPET.txt
  • docs/TESTS.md
  • exercises/shared/.docs/help.md
  • exercises/shared/.docs/tests.md

A tanulófeladatra jellemző fájlok, amelyeknek jelen kell lenniük:

  • exercises/concept/<slug>/.docs/hints.md
  • exercises/concept/<slug>/.docs/instructions.md
  • exercises/concept/<slug>/.docs/introduction.md
  • exercises/concept/<slug>/.meta/config.json

Hasonló lista készül majd a gyakorlófeladatokhoz is, de annak a specifikációját még nem határoztuk meg.

A config.json-ban felsorolt minden fogalomhoz a következő fájloknak kell tartozniuk:

  • concepts/<slug>/about.md
  • concepts/<slug>/introduction.md
  • concepts/<slug>/links.json

Szabály: a config.json fájl érvényes

A config.json fájlnál a következő ellenőrzéseket kell elvégezni:

  • A fájlnak érvényes JSON-nak kell lennie
  • A "language" kulcs kötelező
  • A "language" értékének nem üres string¹-nek kell lennie, legfeljebb 255 karakter hosszúsággal
  • A "slug" kulcs kötelező
  • A "slug" értékének kebab-case string²-nek kell lennie, legfeljebb 255 karakter hosszúsággal
  • A "active" kulcs kötelező
  • A "active" értékének booleannak kell lennie
  • A "blurb" kulcs kötelező
  • A "blurb" értékének nem üres string¹-nek kell lennie, legfeljebb 400 karakter hosszúsággal
  • A "version" kulcs kötelező
  • A "version" értékének a 3 egész számnak kell lennie
  • A "status.concept_exercises" kulcs kötelező
  • A "status.concept_exercises" értékének booleannak kell lennie
  • A "status.test_runner" kulcs kötelező
  • A "status.test_runner" értékének booleannak kell lennie
  • A "status.representer" kulcs kötelező
  • A "status.representer" értékének booleannak kell lennie
  • A "status.analyzer" kulcs kötelező
  • A "status.analyzer" értékének booleannak kell lennie
  • A "online_editor.indent_style" kulcs kötelező
  • A "online_editor.indent_style" értékének a space vagy tab stringnek kell lennie
  • A "online_editor.indent_size" kulcs kötelező
  • A "online_editor.indent_size" értékének olyan egész számnak kell lennie, amely >= 0 és <= 8
  • A "online_editor.highlightjs_language" kulcs opcionális
  • A "online_editor.highlightjs_language" értékének nem üres string¹-nek kell lennie
  • A "files" kulcs opcionális
  • A "files" értékének objektumnak kell lennie
  • A "files.solution" kulcs opcionális
  • A "files.solution" értékének tömbnek kell lennie
  • A "files.solution" értékeinek érvényes mintáknak⁵ kell lenniük
  • A "files.solution" értékei nem ismétlődhetnek
  • A "files.test" kulcs opcionális
  • A "files.test" értékének tömbnek kell lennie
  • A "files.test" értékeinek érvényes mintáknak⁵ kell lenniük
  • A "files.test" értékei nem ismétlődhetnek
  • A "files.example" kulcs opcionális
  • A "files.example" értékének tömbnek kell lennie
  • A "files.example" értékeinek érvényes mintáknak⁵ kell lenniük
  • A "files.example" értékei nem ismétlődhetnek
  • A "files.exemplar" kulcs opcionális
  • A "files.exemplar" értékének tömbnek kell lennie
  • A "files.exemplar" értékeinek érvényes mintáknak⁵ kell lenniük
  • A "files.exemplar" értékei nem ismétlődhetnek
  • A "files.editor" kulcs opcionális
  • A "files.editor" értékének tömbnek kell lennie
  • A "files.editor" értékeinek érvényes mintáknak⁵ kell lenniük
  • A "files.editor" értékei nem ismétlődhetnek
  • A "files.invalidator" kulcs opcionális
  • A "files.invalidator" értékének tömbnek kell lennie
  • A "files.invalidator" értékeinek érvényes mintáknak⁵ kell lenniük
  • A "files.invalidator" értékei nem ismétlődhetnek
  • A minták kizárólag a "files.solution", "files.test", "files.example", "files.exemplar", "files.editor" vagy "files.invalidator" tömbök egyikében szerepelhetnek (átfedés nem megengedett)
    • Ha a kurzus d vagy plsql, a "files.solution" és "files.test" fájlok átfedhetik egymást
    • A "files.example és "files.exemplar" fájlok átfedhetik egymást
  • A "test_runner.average_run_time" kulcs kötelező, ha a "status.test_runner" értéke true
  • A "test_runner.average_run_time" értékének olyan egész számnak kell lennie, amely > 0
  • Az "approaches.snippet_extension" kulcs kötelező, ha a kurzusnak egy vagy több megközelítése van
  • Az "approaches.snippet_extension" értékének nem üres string¹-nek kell lennie
  • Az "exercises" kulcs kötelező
  • Az "exercises.concept" kulcs kötelező
  • Az "exercises.concept" értékének tömbnek kell lennie
  • Az "exercises.concept[].slug" kulcs kötelező
  • Az "exercises.concept[].slug" értékének kebab-case string²-nek kell lennie, legfeljebb 255 karakter hosszúsággal
  • Az "exercises.concept[].slug" értékének egyedinek kell lennie az "exercises.concept[].slug" mezőn belül, és nem szerepelhet az "exercises.practice[].slug" mezőben
  • Az "exercises.concept[].name" kulcs kötelező
  • Az "exercises.concept[].name" értékének Title Case string³-nek kell lennie, legfeljebb 255 karakter hosszúsággal
  • Az "exercises.concept[].uuid" kulcs kötelező
  • Az "exercises.concept[].uuid" értékének egyedi, 4-es verziójú UUID stringnek⁶ kell lennie
  • Az "exercises.concept[].uuid" értéke feladatonként soha nem változhat
  • Az "exercises.concept[].concepts" kulcs kötelező
  • Az "exercises.concept[].concepts" értékének nem üres stringtömbnek kell lennie, ha az "exercises.concept[].status" értéke nem deprecated
  • Az "exercises.concept[].concepts" értékének üres tömbnek kell lennie, ha az "exercises.concept[].status" értéke deprecated
  • Az "exercises.concept[].concepts" értékeinek kebab-case stringeknek² kell lenniük
  • Az "exercises.concept[].concepts" értékei nem ismétlődhetnek
  • Az "exercises.concept[].concepts" értékei nem szerepelhetnek egyetlen más tanulófeladat "concepts" tulajdonságában sem
  • Az "exercises.concept[].concepts" értékeinek meg kell egyezniük valamelyik fogalom "concepts.slug" tulajdonságával
  • Az "exercises.concept[].prerequisites" kulcs kötelező
  • Az "exercises.concept[].prerequisites" értékének nem üres stringtömbnek kell lennie, ha az "exercises.concept[].status" értéke nem deprecated, kivéve pontosan egy feladatot, amelynek lehet üres tömb az értéke
  • Az "exercises.concept[].prerequisites" értékének üres tömbnek kell lennie, ha az "exercises.concept[].status" értéke deprecated
  • Az "exercises.concept[].prerequisites" értékeinek kebab-case stringeknek² kell lenniük
  • Az "exercises.concept[].prerequisites" értékei nem ismétlődhetnek
  • Az "exercises.concept[].prerequisites" értékeinek meg kell egyezniük bármely más tanulófeladat "concepts" tulajdonságának értékeivel
  • Az "exercises.concept[].prerequisites" értékei nem egyezhetnek meg a feladat "exercises.concept[].concepts" tulajdonságában szereplő egyetlen értékkel sem
  • Az "exercises.concept[].prerequisites" értékeinek meg kell egyezniük valamelyik fogalom "concepts.slug" tulajdonságával
  • Nem lehetnek körkörös hivatkozások az "exercises.concept[].concepts" és az "exercises.concept[].prerequisites" között
  • Az "exercises.concept[].status" kulcs opcionális
  • Az "exercises.concept[].status" értékének a wip, beta, active vagy deprecated stringnek kell lennie
  • Az "exercises.practice" kulcs kötelező
  • Az "exercises.practice" értékének tömbnek kell lennie
  • Az "exercises.practice[].slug" kulcs kötelező
  • Az "exercises.practice[].slug" értékének kebab-case string²-nek kell lennie, legfeljebb 255 karakter hosszúsággal
  • Az "exercises.practice[].slug" értékének egyedinek kell lennie az "exercises.practice[].slug" mezőn belül, és nem szerepelhet az "exercises.concept[].slug" mezőben
  • Pontosan egy olyan "exercises.practice[].slug" értéknek kell lennie, amely a hello-world string
  • Az "exercises.practice[].name" kulcs kötelező
  • Az "exercises.practice[].name" értékének Title Case string³-nek kell lennie, legfeljebb 255 karakter hosszúsággal
  • Az "exercises.practice[].uuid" kulcs kötelező
  • Az "exercises.practice[].uuid" értékének egyedi, 4-es verziójú UUID stringnek⁶ kell lennie
  • Az "exercises.practice[].uuid" értéke feladatonként soha nem változhat
  • Az "exercises.practice[].difficulty" kulcs kötelező
  • Az "exercises.practice[].difficulty" értékének olyan egész számnak kell lennie, amely >= 1 és <= 10
  • Az "exercises.practice[].practices" kulcs kötelező
  • Az "exercises.practice[].practices" értékének nem üres stringtömbnek kell lennie, ha az "exercises.practice[].status" értéke nem deprecated
  • Az "exercises.practice[].practices" értékének üres tömbnek kell lennie, ha az "exercises.practice[].status" értéke deprecated
  • Az "exercises.practice[].practices" értékeinek kebab-case stringeknek² kell lenniük
  • Az "exercises.practice[].practices" értékei nem ismétlődhetnek
  • Az "exercises.practice[].practices" értékeinek meg kell egyezniük valamelyik fogalom "concepts[].slug" tulajdonságával
  • Az "exercises.practice[].practices" értékei legfeljebb 10 alkalommal hivatkozhatnak egy adott fogalom slugjára (az összes feladatot együttvéve)
  • Az "exercises.practice[].prerequisites" kulcs kötelező
  • Az "exercises.practice[].prerequisites" értékének nem üres stringtömbnek kell lennie, ha az "exercises.practice[].status" értéke nem deprecated
  • Az "exercises.practice[].prerequisites" értékének üres tömbnek kell lennie, ha az "exercises.practice[].status" értéke deprecated
  • Az "exercises.practice[].prerequisites" értékének üres tömbnek kell lennie, ha az "exercises.practice[].slug" értéke hello-world
  • Az "exercises.practice[].prerequisites" értékeinek kebab-case stringeknek² kell lenniük
  • Az "exercises.practice[].prerequisites" értékei nem ismétlődhetnek
  • Az "exercises.practice[].prerequisites" értékeinek meg kell egyezniük bármely tanulófeladat "exercises.concept[].concepts" értékeivel
  • Az "exercises.practice[].prerequisites" értékeinek meg kell egyezniük valamelyik fogalom "concepts[].slug" tulajdonságával
  • Az "exercises.practice[].status" kulcs opcionális
  • Az "exercises.practice[].status" értékének a wip, beta, active vagy deprecated stringnek kell lennie
  • Az "exercises.practice[].status" értékét, ha az "exercises.practice[].slug" értéke hello-world, vagy el kell hagyni, vagy az active stringnek kell lennie
  • Az "exercises.foregone" kulcs opcionális
  • Az "exercises.foregone" értékének tömbnek kell lennie
  • Az "exercises.foregone" értékeinek kebab-case stringeknek² kell lenniük
  • Az "exercises.foregone" értékei nem ismétlődhetnek
  • Az "exercises.foregone" értékei nem egyezhetnek meg egyetlen tanuló- vagy gyakorlófeladat slugjával sem
  • A "concepts" kulcs kötelező
  • A "concepts" értékének tömbnek kell lennie
  • A "concepts[].uuid" kulcs kötelező
  • A "concepts[].uuid" értékének egyedi, 4-es verziójú UUID stringnek⁶ kell lennie
  • A "concepts[].uuid" értéke fogalmonként soha nem változhat
  • A "concepts[].slug" kulcs kötelező
  • A "concepts[].slug" értékének kebab-case string²-nek kell lennie, legfeljebb 255 karakter hosszúsággal
  • A "concepts[].name" kulcs kötelező
  • A "concepts[].name" értékének Title Case string³-nek kell lennie, legfeljebb 255 karakter hosszúsággal
  • A "concepts[].tags" kulcs opcionális
  • A "concepts[].tags.all" kulcs opcionális, kivéve, ha a "concepts[].tags.any" üres
  • A "concepts[].tags.all" értékének tömbnek kell lennie
  • A "concepts[].tags.all" értékeinek nem üres tag⁷ stringeknek kell lenniük, legfeljebb 255 karakter hosszúsággal
  • A "concepts[].tags.all" értékei nem ismétlődhetnek
  • A "concepts[].tags.any" kulcs opcionális, kivéve, ha a "concepts[].tags.all" üres
  • A "concepts[].tags.any" értékének tömbnek kell lennie
  • A "concepts[].tags.any" értékeinek nem üres tag⁷ stringeknek kell lenniük, legfeljebb 255 karakter hosszúsággal
  • A "concepts[].tags.any" értékei nem ismétlődhetnek
  • A "concepts[].tags.not" kulcs opcionális
  • A "concepts[].tags.not" értékének tömbnek kell lennie
  • A "concepts[].tags.not" értékeinek nem üres tag⁷ stringeknek kell lenniük, legfeljebb 255 karakter hosszúsággal
  • A "concepts[].tags.not" értékei nem ismétlődhetnek
  • Minden "concepts" értékhez tartoznia kell egy concept/<concepts.slug>/about.md fájlnak. A fájlra vonatkozó lintelési szabályok alább találhatók.
  • Minden "concepts" értékhez tartoznia kell egy concept/<concepts.slug>/introduction.md fájlnak. A fájlra vonatkozó lintelési szabályok alább találhatók.
  • Minden "concepts" értékhez tartoznia kell egy concept/<concepts.slug>/links.json fájlnak. A fájlra vonatkozó lintelési szabályok alább találhatók.
  • A "key_features" kulcs opcionális
  • A "key_features" értékének olyan tömbnek kell lennie, amelynek hossza = 6
  • A "key_features[].icon" kulcs kötelező
  • A "key_features[].icon" értékének az előre definiált ikonértékek egyikét kell használnia
  • A "key_features[].title" kulcs kötelező
  • A "key_features[].title" értékének Sentence Case string⁴-nek kell lennie, legfeljebb 25 karakter hosszúsággal
  • A "key_features[].content" kulcs kötelező
  • A "key_features[].content" értékének nem üres string¹-nek kell lennie, legfeljebb 100 karakter hosszúsággal
  • A "tags" kulcs kötelező
  • A "tags" értékének stringtömbnek kell lennie
  • A "tags" értékei nem ismétlődhetnek
  • A "tags" értékeinek az előre definiált tagértékek egyikét kell használniuk

Szabály: az exercises/concept/<slug>/.meta/config.json érvényes

  • A fájlnak érvényes JSON-nak kell lennie
  • A JSON gyökérnek objektumnak kell lennie
  • A "blurb" kulcs kötelező
  • A "blurb" értékének nem üres string¹-nek kell lennie, legfeljebb 350 karakter hosszúsággal
  • A "source" kulcs opcionális
  • A "source" értékének nem üres string¹-nek kell lennie
  • A "source_url" kulcs opcionális
  • A "source_url" értékének URL-nek kell lennie
  • Az "authors" kulcs kötelező
  • Az "authors" értékének nem üres tömbnek kell lennie
  • Az "authors" értékeinek nem üres stringeknek¹ kell lenniük
  • Az "authors" értékei nem ismétlődhetnek
  • Az "authors" értékeit a rendszer kis- és nagybetűtől függetlenül kezeli
  • A "contributors" kulcs opcionális
  • A "contributors" értékének tömbnek kell lennie
  • A "contributors" értékeinek nem üres stringeknek¹ kell lenniük
  • A "contributors" értékei nem ismétlődhetnek
  • A "contributors" értékeit a rendszer kis- és nagybetűtől függetlenül kezeli
  • A felhasználók csak az "authors" vagy a "contributors" tömb egyikében szerepelhetnek (átfedés nem megengedett)
  • A "files.solution" kulcs kötelező
  • A "files.solution" értékének nem üres tömbnek kell lennie
  • A "files.solution" értékei nem ismétlődhetnek
  • A "files.test" kulcs kötelező
  • A "files.test" értékének nem üres tömbnek kell lennie
  • A "files.test" értékei nem ismétlődhetnek
  • A "files.exemplar" kulcs kötelező
  • A "files.exemplar" értékének nem üres tömbnek kell lennie
  • A "files.exemplar" értékei nem ismétlődhetnek
  • A "files.editor" kulcs opcionális
  • A "files.editor" értékének tömbnek kell lennie
  • A "files.editor" értékei nem ismétlődhetnek
  • A "files.invalidator" kulcs opcionális
  • A "files.invalidator" értékének tömbnek kell lennie
  • A "files.invalidator" értékei nem ismétlődhetnek
  • A "files.solution"-ban felsorolt fájloknak létezniük kell
  • A "files.test"-ban felsorolt fájloknak létezniük kell
  • A "files.exemplar"-ban felsorolt fájloknak létezniük kell
  • A "files.editor"-ban felsorolt fájloknak létezniük kell
  • A "files.invalidator"-ban felsorolt fájloknak létezniük kell
  • A fájlok kizárólag a "files.solution", "files.test", "files.exemplar" vagy "files.invalidator" tömbök egyikében szerepelhetnek (átfedés nem megengedett)
    • Ha a kurzus d vagy plsql, a "files.solution" és "files.test" fájlok átfedhetik egymást
  • A "forked_from" kulcs opcionális
  • A "forked_from" értékének tömbnek kell lennie
  • A "forked_from" értékeinek <track-slug>/<exercise-slug> formátumú stringeknek kell lenniük (pl. fsharp/bird-watcher)
  • A "forked_from" értékeinek ténylegesen megvalósított feladatokra kell hivatkozniuk
  • A "forked_from" értékei nem ismétlődhetnek
  • A "language_versions" kulcs opcionális
  • A "language_versions" értékének stringnek kell lennie
  • A "representer.version" kulcs opcionális
  • A "representer.version" értékének olyan egész számnak kell lennie, amely >= 1
  • Az "icon" kulcs opcionális
  • Az "icon" értékének kebab-case string²-nek kell lennie

Szabály: az exercises/concept/<slug>/.docs/hints.md érvényes

  • A Markdownnak meg kell felelnie a Markdown-szabványoknak
  • Minden címsornak vagy ## General, vagy ## X. <task> formátumúnak kell lennie, ahol az X megegyezik az instructions.md-ben szereplő feladatszám-címsorral
  • Minden tippet Markdown listaelemként kell megadni
  • A hivatkozásoknak abszolútnak kell lenniük (relatív hivatkozások nem megengedettek)

Szabály: az exercises/concept/<slug>/.docs/instructions.md érvényes

  • A Markdownnak meg kell felelnie a Markdown-szabványoknak
  • Minden feladatnak egy második szintű címsorral kell kezdődnie, amely egy számot követő ponttal kezdődik: ## 1. Do X
  • A hivatkozásoknak abszolútnak kell lenniük (relatív hivatkozások nem megengedettek)

Szabály: az exercises/concept/<slug>/.docs/instructions.md.tpl érvényes (ha jelen van)

  • Minden fogalom-helyőrző fogalmának meg kell egyeznie a kurzus config.json-jában szereplő valamelyik fogalom "concepts.slug" tulajdonságával.

Szabály: az exercises/concept/<slug>/.docs/introduction.md érvényes

  • A Markdownnak meg kell felelnie a Markdown-szabványoknak
  • A hivatkozásoknak abszolútnak kell lenniük (relatív hivatkozások nem megengedettek)

Szabály: az exercises/practice/<slug>/.meta/config.json érvényes

  • A fájlnak érvényes JSON-nak kell lennie
  • A JSON gyökérnek objektumnak kell lennie
  • A "blurb" kulcs kötelező
  • A "blurb" értékének nem üres string¹-nek kell lennie, legfeljebb 350 karakter hosszúsággal
  • A "source" kulcs opcionális
  • A "source" értékének nem üres string¹-nek kell lennie
  • A "source_url" kulcs opcionális
  • A "source_url" értékének URL-nek kell lennie
  • Az "authors" kulcs opcionális
  • Az "authors" értékének tömbnek kell lennie
  • Az "authors" értékeinek nem üres stringeknek¹ kell lenniük
  • Az "authors" értékei nem ismétlődhetnek
  • Az "authors" értékeit a rendszer kis- és nagybetűtől függetlenül kezeli
  • A "contributors" kulcs opcionális
  • A "contributors" értékének tömbnek kell lennie
  • A "contributors" értékeinek nem üres stringeknek¹ kell lenniük
  • A "contributors" értékei nem ismétlődhetnek
  • A "contributors" értékeit a rendszer kis- és nagybetűtől függetlenül kezeli
  • A felhasználók csak az "authors" vagy a "contributors" tömb egyikében szerepelhetnek (átfedés nem megengedett)
  • A "files.solution" kulcs kötelező
  • A "files.solution" értékének nem üres tömbnek kell lennie
  • A "files.solution" értékei nem ismétlődhetnek
  • A "files.test" kulcs kötelező
  • A "files.test" értékének nem üres tömbnek kell lennie
  • A "files.test" értékei nem ismétlődhetnek
  • A "files.example" kulcs kötelező
  • A "files.example" értékének nem üres tömbnek kell lennie
  • A "files.example" értékei nem ismétlődhetnek
  • A "files.editor" kulcs opcionális
  • A "files.editor" értékének tömbnek kell lennie
  • A "files.editor" értékei nem ismétlődhetnek
  • A "files.invalidator" kulcs opcionális
  • A "files.invalidator" értékének tömbnek kell lennie
  • A "files.invalidator" értékei nem ismétlődhetnek
  • A "files.solution"-ban felsorolt fájloknak létezniük kell
  • A "files.test"-ban felsorolt fájloknak létezniük kell
  • A "files.example"-ban felsorolt fájloknak létezniük kell
  • A "files.editor"-ban felsorolt fájloknak létezniük kell
  • A "files.invalidator"-ban felsorolt fájloknak létezniük kell
  • A fájlok kizárólag a "files.solution", "files.test", "files.example vagy "files.invalidator" tömbök egyikében szerepelhetnek (átfedés nem megengedett)
    • Ha a kurzus d vagy plsql, a "files.solution" és "files.test" fájlok átfedhetik egymást
  • A "language_versions" kulcs opcionális
  • A "language_versions" értékének stringnek kell lennie
  • A "test_runner" kulcs opcionális
  • A "test_runner" értékének booleannak kell lennie
  • A "representer.version" kulcs opcionális
  • A "representer.version" értékének olyan egész számnak kell lennie, amely >= 1
  • Az "icon" kulcs opcionális
  • Az "icon" értékének kebab-case string²-nek kell lennie

Szabály: az exercises/{concept|practice}/<slug>/.approaches/config.json érvényes

  • A fájl jelenléte opcionális, kivéve, ha van egy introduction.md vagy egy testvérkönyvtár
  • A fájlnak érvényes JSON-nak kell lennie
  • A JSON gyökérnek objektumnak kell lennie
  • Az "introduction.authors" kulcs opcionális
  • Az "introduction.authors" értékének tömbnek kell lennie
  • Az "introduction.authors" értékeinek nem üres stringeknek¹ kell lenniük
  • Az "introduction.authors" értékei nem ismétlődhetnek
  • Az "introduction.authors" értékeit a rendszer kis- és nagybetűtől függetlenül kezeli
  • Ha az "introduction.authors" tömb nem üres, akkor lennie kell egy nem üres introduction.md fájlnak
  • Az "introduction.contributors" kulcs opcionális
  • Az "introduction.contributors" értékének tömbnek kell lennie
  • Az "introduction.contributors" értékeinek nem üres stringeknek¹ kell lenniük
  • Az "introduction.contributors" értékei nem ismétlődhetnek
  • Az "introduction.contributors" értékeit a rendszer kis- és nagybetűtől függetlenül kezeli
  • Ha az "introduction.contributors" tömb nem üres, akkor lennie kell egy nem üres introduction.md fájlnak
  • A felhasználók csak az "introduction.authors" vagy az "introduction.contributors" tömb egyikében szerepelhetnek (átfedés nem megengedett)
  • Az "approaches" kulcs opcionális, kivéve, ha jelen van egy testvérkönyvtár (amely a megközelítés fájljait tartalmazza)
  • Az "approaches" értékének objektumok tömbjének kell lennie
  • Az "approaches[].uuid" kulcs kötelező
  • Az "approaches[].uuid" értékének egyedi, 4-es verziójú UUID stringnek⁶ kell lennie
  • Az "approaches[].uuid" értéke fogalmonként soha nem változhat
  • Az "approaches[].slug" kulcs kötelező
  • Az "approaches[].slug" értékének kebab-case string²-nek kell lennie, legfeljebb 255 karakter hosszúsággal
  • Az "approaches[].slug" értékéhez tartoznia kell egy megfelelő, nem üres <slug>/content.md fájlnak
  • Az "approaches[].slug" értékéhez tartoznia kell egy megfelelő, nem üres <slug>/snippet.txt fájlnak
  • Az "approaches[].title" kulcs kötelező
  • Az "approaches[].title" értékének Title Case string³-nek kell lennie, legfeljebb 255 karakter hosszúsággal
  • Az "approaches[].blurb" kulcs kötelező
  • Az "approaches[].blurb" értékének nem üres string¹-nek kell lennie, legfeljebb 350 karakter hosszúsággal
  • Az "approaches[].authors" kulcs kötelező
  • Az "approaches[].authors" értékének nem üres tömbnek kell lennie
  • Az "approaches[].authors" értékeinek nem üres stringeknek¹ kell lenniük
  • Az "approaches[].authors" értékei nem ismétlődhetnek
  • Az "approaches[].authors" értékeit a rendszer kis- és nagybetűtől függetlenül kezeli
  • Az "approaches[].contributors" kulcs opcionális
  • Az "approaches[].contributors" értékének tömbnek kell lennie
  • Az "approaches[].contributors" értékeinek nem üres stringeknek¹ kell lenniük
  • Az "approaches[].contributors" értékei nem ismétlődhetnek
  • Az "approaches[].contributors" értékeit a rendszer kis- és nagybetűtől függetlenül kezeli
  • A felhasználók csak az "approaches[].authors" vagy az "approaches[].contributors" tömb egyikében szerepelhetnek (átfedés nem megengedett)
  • Az "approaches[].tags" kulcs opcionális
  • Az "approaches[].tags.all" kulcs opcionális, kivéve, ha az "approaches[].tags.any" üres
  • Az "approaches[].tags.all" értékének tömbnek kell lennie
  • Az "approaches[].tags.all" értékeinek nem üres tag⁷ stringeknek kell lenniük, legfeljebb 255 karakter hosszúsággal
  • Az "approaches[].tags.all" értékei nem ismétlődhetnek
  • Az "approaches[].tags.any" kulcs opcionális, kivéve, ha az "approaches[].tags.all" üres
  • Az "approaches[].tags.any" értékének tömbnek kell lennie
  • Az "approaches[].tags.any" értékeinek nem üres tag⁷ stringeknek kell lenniük, legfeljebb 255 karakter hosszúsággal
  • Az "approaches[].tags.any" értékei nem ismétlődhetnek
  • Az "approaches[].tags.not" kulcs opcionális
  • Az "approaches[].tags.not" értékének tömbnek kell lennie
  • Az "approaches[].tags.not" értékeinek nem üres tag⁷ stringeknek kell lenniük, legfeljebb 255 karakter hosszúsággal
  • Az "approaches[].tags.not" értékei nem ismétlődhetnek

Szabály: az exercises/{concept|practice}/<slug>/.approaches/<approach-slug>/content.md érvényes

  • A fájl jelenléte kötelező, ha létezik megfelelő "approaches[].slug" bejegyzés a .approaches/config.json fájlban
  • A Markdownnak meg kell felelnie a Markdown-szabványoknak
  • A hivatkozásoknak abszolútnak kell lenniük (relatív hivatkozások nem megengedettek)

Szabály: az exercises/{concept|practice}/<slug>/.approaches/<approach-slug>/snippet.<snippet-extension> érvényes

  • A fájl jelenléte kötelező, ha létezik megfelelő "approaches[].slug" bejegyzés a .approaches/config.json fájlban
  • A részlet legfeljebb 8 sorból állhat
  • A részlet kiterjesztését a kurzus config.json fájljában található approaches.snippet_extension értéke adja

Szabály: az exercises/{concept|practice}/<slug>/.articles/config.json érvényes

  • A fájl jelenléte opcionális, kivéve, ha van egy testvérkönyvtár
  • A fájlnak érvényes JSON-nak kell lennie
  • A JSON gyökérnek objektumnak kell lennie
  • Az "articles" kulcs opcionális, kivéve, ha jelen van egy testvérkönyvtár (amely a cikk fájljait tartalmazza)
  • Az "articles" értékének objektumok tömbjének kell lennie
  • Az "articles[].uuid" kulcs kötelező
  • Az "articles[].uuid" értékének egyedi, 4-es verziójú UUID stringnek⁶ kell lennie
  • Az "articles[].uuid" értéke fogalmonként soha nem változhat
  • Az "articles[].slug" kulcs kötelező
  • Az "articles[].slug" értékének kebab-case string²-nek kell lennie, legfeljebb 255 karakter hosszúsággal
  • Az "articles[].slug" értékéhez tartoznia kell egy megfelelő, nem üres <slug>/content.md fájlnak
  • Az "articles[].slug" értékéhez tartoznia kell egy megfelelő, nem üres <slug>/snippet.md fájlnak
  • Az "articles[].title" kulcs kötelező
  • Az "articles[].title" értékének Title Case string³-nek kell lennie, legfeljebb 255 karakter hosszúsággal
  • Az "articles[].blurb" kulcs kötelező
  • Az "articles[].blurb" értékének nem üres string¹-nek kell lennie, legfeljebb 350 karakter hosszúsággal
  • Az "articles[].authors" kulcs kötelező
  • Az "articles[].authors" értékének nem üres tömbnek kell lennie
  • Az "articles[].authors" értékeinek nem üres stringeknek¹ kell lenniük
  • Az "articles[].authors" értékei nem ismétlődhetnek
  • Az "articles[].authors" értékeit a rendszer kis- és nagybetűtől függetlenül kezeli
  • Az "articles[].contributors" kulcs opcionális
  • Az "articles[].contributors" értékének tömbnek kell lennie
  • Az "articles[].contributors" értékeinek nem üres stringeknek¹ kell lenniük
  • Az "articles[].contributors" értékei nem ismétlődhetnek
  • Az "articles[].contributors" értékeit a rendszer kis- és nagybetűtől függetlenül kezeli
  • A felhasználók csak az "articles[].authors" vagy az "articles[].contributors" tömb egyikében szerepelhetnek (átfedés nem megengedett)

Szabály: az exercises/{concept|practice}/<slug>/.articles/<article-slug>/content.md érvényes

  • A fájl jelenléte kötelező, ha létezik megfelelő "articles[].slug" bejegyzés a .articles/config.json fájlban
  • A Markdownnak meg kell felelnie a Markdown-szabványoknak
  • A hivatkozásoknak abszolútnak kell lenniük (relatív hivatkozások nem megengedettek)

Szabály: az exercises/{concept|practice}/<slug>/.articles/<article-slug>/snippet.md érvényes

  • A fájl jelenléte kötelező, ha létezik megfelelő "articles[].slug" bejegyzés a .articles/config.json fájlban
  • A Markdownnak meg kell felelnie a Markdown-szabványoknak
  • A részlet legfeljebb 8 sorból állhat (a kezdő és záró kódkerítés-jelölőket figyelmen kívül kell hagyni)

Szabály: az exercises/shared/.docs/debug.md érvényes

  • A fájl jelenléte opcionális
  • A Markdownnak meg kell felelnie a Markdown-szabványoknak
  • A hivatkozásoknak abszolútnak kell lenniük (relatív hivatkozások nem megengedettek)

Szabály: az exercises/shared/.docs/help.md érvényes

  • A fájl jelenléte kötelező
  • A Markdownnak meg kell felelnie a Markdown-szabványoknak
  • A hivatkozásoknak abszolútnak kell lenniük (relatív hivatkozások nem megengedettek)

Szabály: az exercises/shared/.docs/tests.md érvényes

  • A fájl jelenléte kötelező
  • A Markdownnak meg kell felelnie a Markdown-szabványoknak
  • A hivatkozásoknak abszolútnak kell lenniük (relatív hivatkozások nem megengedettek)

Szabály: a concepts/<slug>/about.md érvényes

  • A Markdownnak meg kell felelnie a Markdown-szabványoknak
  • A hivatkozásoknak abszolútnak kell lenniük (relatív hivatkozások nem megengedettek)

Szabály: a concepts/<slug>/introduction.md érvényes

  • A Markdownnak meg kell felelnie a Markdown-szabványoknak
  • A hivatkozásoknak abszolútnak kell lenniük (relatív hivatkozások nem megengedettek)
  • A fájlnak érvényes JSON-nak kell lennie
  • A JSON gyökérnek tömbnek kell lennie
  • A "[].url" tulajdonság kötelező
  • A "[].url" értékének URL-nek kell lennie
  • A "[].description" tulajdonság kötelező
  • A "[].description" értékének nem üres string¹-nek kell lennie
  • A "[].icon_url" tulajdonság opcionális
  • A "[].icon_url" értékének URL-nek kell lennie

Szabály: a concept/<slug>/.meta/config.json érvényes

  • A fájlnak érvényes JSON-nak kell lennie
  • A JSON gyökérnek objektumnak kell lennie
  • A "blurb" kulcs kötelező
  • A "blurb" értékének nem üres string¹-nek kell lennie, legfeljebb 350 karakter hosszúsággal
  • Az "authors" kulcs kötelező
  • Az "authors" értékének tömbnek kell lennie
  • Az "authors" értékeinek nem üres stringeknek¹ kell lenniük
  • Az "authors" értékei nem ismétlődhetnek
  • Az "authors" értékeit a rendszer kis- és nagybetűtől függetlenül kezeli
  • A "contributors" kulcs opcionális
  • A "contributors" értékének tömbnek kell lennie
  • A "contributors" értékeinek nem üres stringeknek¹ kell lenniük
  • A "contributors" értékei nem ismétlődhetnek
  • A "contributors" értékeit a rendszer kis- és nagybetűtől függetlenül kezeli
  • A felhasználók csak az "authors" vagy a "contributors" tömb egyikében szerepelhetnek (átfedés nem megengedett)

Szabály: a docs/ABOUT.md érvényes

  • A fájl jelenléte kötelező
  • A fájl tartalma nem lehet üres
  • A Markdownnak meg kell felelnie a Markdown-szabványoknak
  • A hivatkozásoknak abszolútnak kell lenniük (relatív hivatkozások nem megengedettek)

Szabály: a docs/INSTALLATION.md érvényes

  • A fájl jelenléte kötelező
  • A fájl tartalma nem lehet üres
  • A Markdownnak meg kell felelnie a Markdown-szabványoknak
  • A hivatkozásoknak abszolútnak kell lenniük (relatív hivatkozások nem megengedettek)

Szabály: a docs/LEARNING.md érvényes

  • A fájl jelenléte kötelező
  • A fájl tartalma nem lehet üres
  • A Markdownnak meg kell felelnie a Markdown-szabványoknak
  • A hivatkozásoknak abszolútnak kell lenniük (relatív hivatkozások nem megengedettek)

Szabály: a docs/RESOURCES.md érvényes

  • A fájl jelenléte kötelező
  • A fájl tartalma nem lehet üres
  • A Markdownnak meg kell felelnie a Markdown-szabványoknak
  • A hivatkozásoknak abszolútnak kell lenniük (relatív hivatkozások nem megengedettek)

Szabály: a docs/SNIPPET.txt érvényes

  • A fájl jelenléte kötelező
  • A fájl tartalma nem lehet üres

Szabály: a docs/TESTS.md érvényes

  • A fájl jelenléte kötelező
  • A fájl tartalma nem lehet üres
  • A Markdownnak meg kell felelnie a Markdown-szabványoknak
  • A hivatkozásoknak abszolútnak kell lenniük (relatív hivatkozások nem megengedettek)

Fogalomtár

  1. Nem üres string: olyan string, amely legalább egy nem szóköz karaktert tartalmaz.

  2. kebab-case string: olyan string, amely csak az [a-z0-9] tartományba eső karaktereket tartalmazza, amelyeket opcionálisan kötőjelek választanak el (pl. „two-fer”). Meg kell felelnie a következő reguláris kifejezésnek: ^[a-z0-9]+(-[a-z0-9]+)*$

  3. Title Case string: nem üres string, amely megfelel az alábbi Chicago Manual of Style irányelveinek:

    • A címek és alcímek első és utolsó szavát nagy kezdőbetűvel kell írni.
    • A „fontos” szavakat (főnevek, névmások, igék, melléknevek, határozószók és néhány kötőszó) nagy kezdőbetűvel kell írni.
    • A kötőszavakat, mint and, but, for, or és nor, kis kezdőbetűvel kell írni.
    • A névelőket, the, a és an, kis kezdőbetűvel kell írni.
    • Az elöljárószavakat hossztól függetlenül kis kezdőbetűvel kell írni, kivéve, ha hangsúlyosak, határozószói vagy melléknévi szerepben állnak, illetve kötőszóként használatosak.
    • A to és as szavakat kis kezdőbetűvel kell írni.
    • A latin fajnevek második tagját kis kezdőbetűvel kell írni.
  4. Sentence Case string: nem üres string, amely megfelel az alábbi irányelveknek:

    • A mondat első szavát, valamint a tulajdonneveket és minden olyan további szót, amelyet egy konkrétabb szabály előír, nagy kezdőbetűvel kell írni.
  5. Érvényes files minta: nem üres string¹, amely egy feladatban használt fájl helyét adja meg a feladat könyvtárához képest. A minta a következő helyőrzők egyikét használhatja:

    • %{kebab_slug}: a feladat kebab-case slugja (pl. bit-manipulation)
    • %{snake_slug}: a feladat snake_case slugja (pl. bit_manipulation)
    • %{camel_slug}: a feladat camelCase slugja (pl. bitManipulation)
    • %{pascal_slug}: a feladat PascalCase slugja (pl. BitManipulation)
  6. Egyedi, 4-es verziójú UUID string: olyan string, amely az alábbi feltételek mindegyikének megfelel:

    • Egy adott Exercism-kurzus kurzusszintű config.json fájljában csak egyszer fordul elő
    • Nem fordul elő egyetlen más Exercism-kurzus kurzusszintű config.json fájljában sem
    • Nem fordul elő a https://github.com/exercism/problem-specifications egyetlen canonical-data.json fájljában sem
    • Nem fordul elő máshol az Exercism-ön
    • Megfelel a következő reguláris kifejezésnek:
    ^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
    

    Például az alábbi UUID formátuma megfelelő:

    d334ffe3-657e-4725-a950-290b284b6d9f
    

    Megfelelő UUID generálásához futtathatod a configlet uuid parancsot.

  7. Érvényes elemző tag: nem üres string¹, amely <category>:<thing> formátumban van megadva. A <category> értékének a következők egyikének kell lennie:

  • paradigm (pl. paradigm:functional)
  • technique (pl. technique:recursion)
  • construct (pl. construct:bitwise-and)
  • uses (pl. uses:DateTime.add_seconds)

A <thing> értékének nem üres string¹-nek kell lennie.