configlet lint


کاربرد اصلی configlet لینت کردن است: بررسی اینکه فایل‌های پیکربندی یک ترک، هم از نظر نحوه‌ی نگارش و هم از نظر معنا، درست ساختاربندی شده‌اند. ترک‌هایی که پیکربندی نادرست دارند ممکن است درست همگام‌سازی نشوند، در وب‌سایت اشتباه به نظر برسند یا تجربه‌ی کاربری نامناسبی ایجاد کنند؛ به همین دلیل محافظ‌های configlet نقش مهمی در حفظ یکپارچگی Exercism دارند.

کاربرد

از دستور lint می‌توان برای لینت کردن یک ترک استفاده کرد.

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]

قواعد

این‌ها قواعد لینتی هستند که بررسی می‌شوند.

قاعده: وجود فایل‌های الزامی

لینتر باید بررسی کند که همه‌ی فایل‌های الزامی وجود دارند. فایل‌های غیرمربوط به تمرین که باید وجود داشته باشند عبارت‌اند از:

  • 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

فایل‌های مخصوص تمرین مفهومی که باید وجود داشته باشند عبارت‌اند از:

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

برای تمرین‌های عملی هم فهرست مشابهی وجود خواهد داشت، اما هنوز مشخصات آن را تعریف نکرده‌ایم.

هر مفهومی که در config.json فهرست شده است باید فایل‌های زیر را داشته باشد:

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

قاعده: معتبر بودن فایل config.json

فایل config.json باید شرایط زیر را رعایت کند:

  • فایل باید JSON معتبر باشد
  • کلید "language" الزامی است
  • مقدار "language" باید یک رشته‌ی ناتهی¹ با طول کمتر از یا برابر ۲۵۵ باشد
  • کلید "slug" الزامی است
  • مقدار "slug" باید یک رشته‌ی کیبابکیس² با طول کمتر از یا برابر ۲۵۵ باشد
  • کلید "active" الزامی است
  • مقدار "active" باید منطقی باشد
  • کلید "blurb" الزامی است
  • مقدار "blurb" باید یک رشته‌ی ناتهی¹ با طول کمتر از یا برابر ۴۰۰ باشد
  • کلید "version" الزامی است
  • مقدار "version" باید عدد صحیح 3 باشد
  • کلید "status.concept_exercises" الزامی است
  • مقدار "status.concept_exercises" باید منطقی باشد
  • کلید "status.test_runner" الزامی است
  • مقدار "status.test_runner" باید منطقی باشد
  • کلید "status.representer" الزامی است
  • مقدار "status.representer" باید منطقی باشد
  • کلید "status.analyzer" الزامی است
  • مقدار "status.analyzer" باید منطقی باشد
  • کلید "online_editor.indent_style" الزامی است
  • مقدار "online_editor.indent_style" باید رشته‌ی space یا tab باشد
  • کلید "online_editor.indent_size" الزامی است
  • مقدار "online_editor.indent_size" باید عدد صحیحی بزرگ‌تر از یا برابر ۰ و کوچک‌تر از یا برابر ۸ باشد
  • کلید "online_editor.highlightjs_language" اختیاری است
  • مقدار "online_editor.highlightjs_language" باید یک رشته‌ی ناتهی¹ باشد
  • کلید "files" اختیاری است
  • مقدار "files" باید یک شیء باشد
  • کلید "files.solution" اختیاری است
  • مقدار "files.solution" باید یک آرایه باشد
  • مقادیر "files.solution" باید الگوهای معتبر⁵ باشند
  • مقادیر "files.solution" نباید تکراری باشند
  • کلید "files.test" اختیاری است
  • مقدار "files.test" باید یک آرایه باشد
  • مقادیر "files.test" باید الگوهای معتبر⁵ باشند
  • مقادیر "files.test" نباید تکراری باشند
  • کلید "files.example" اختیاری است
  • مقدار "files.example" باید یک آرایه باشد
  • مقادیر "files.example" باید الگوهای معتبر⁵ باشند
  • مقادیر "files.example" نباید تکراری باشند
  • کلید "files.exemplar" اختیاری است
  • مقدار "files.exemplar" باید یک آرایه باشد
  • مقادیر "files.exemplar" باید الگوهای معتبر⁵ باشند
  • مقادیر "files.exemplar" نباید تکراری باشند
  • کلید "files.editor" اختیاری است
  • مقدار "files.editor" باید یک آرایه باشد
  • مقادیر "files.editor" باید الگوهای معتبر⁵ باشند
  • مقادیر "files.editor" نباید تکراری باشند
  • کلید "files.invalidator" اختیاری است
  • مقدار "files.invalidator" باید یک آرایه باشد
  • مقادیر "files.invalidator" باید الگوهای معتبر⁵ باشند
  • مقادیر "files.invalidator" نباید تکراری باشند
  • الگوها را فقط می‌توان در یکی از آرایه‌های "files.solution"، "files.test"، "files.example"، "files.exemplar"، "files.editor" یا "files.invalidator" فهرست کرد (بدون همپوشانی)
    • اگر ترک d یا plsql باشد، فایل‌های "files.solution" و "files.test" می‌توانند هم‌پوشانی داشته باشند
    • فایل‌های "files.example و "files.exemplar" می‌توانند هم‌پوشانی داشته باشند
  • کلید "test_runner.average_run_time" الزامی است اگر "status.test_runner" برابر با true باشد
  • مقدار "test_runner.average_run_time" باید عدد صحیحی بزرگ‌تر از ۰ باشد
  • کلید "approaches.snippet_extension" الزامی است اگر ترک یک رویکرد یا بیشتر داشته باشد
  • مقدار "approaches.snippet_extension" باید یک رشته‌ی ناتهی¹ باشد
  • کلید "exercises" الزامی است
  • کلید "exercises.concept" الزامی است
  • مقدار "exercises.concept" باید یک آرایه باشد
  • کلید "exercises.concept[].slug" الزامی است
  • مقدار "exercises.concept[].slug" باید یک رشته‌ی کیبابکیس² با طول کمتر از یا برابر ۲۵۵ باشد
  • مقدار "exercises.concept[].slug" باید در "exercises.concept[].slug" یکتا باشد و نباید در "exercises.practice[].slug" وجود داشته باشد
  • کلید "exercises.concept[].name" الزامی است
  • مقدار "exercises.concept[].name" باید یک رشته‌ی تایتل‌کیس³ با طول کمتر از یا برابر ۲۵۵ باشد
  • کلید "exercises.concept[].uuid" الزامی است
  • مقدار "exercises.concept[].uuid" باید یک رشته‌ی UUID یکتای نسخه‌ی ۴ باشد⁶
  • مقدار "exercises.concept[].uuid" برای هر تمرین هرگز نباید تغییر کند
  • کلید "exercises.concept[].concepts" الزامی است
  • اگر "exercises.concept[].status" برابر با deprecated نباشد، مقدار "exercises.concept[].concepts" باید آرایه‌ای ناتهی از رشته‌ها باشد
  • اگر "exercises.concept[].status" برابر با deprecated باشد، مقدار "exercises.concept[].concepts" باید آرایه‌ی خالی باشد
  • مقادیر "exercises.concept[].concepts" باید رشته‌های کیبابکیس² باشند
  • مقادیر "exercises.concept[].concepts" نباید تکراری باشند
  • مقادیر "exercises.concept[].concepts" نباید در ویژگی "concepts" هیچ تمرین مفهومی دیگری باشند
  • مقادیر "exercises.concept[].concepts" باید با ویژگی "concepts.slug" یکی از مفاهیم مطابقت داشته باشند
  • کلید "exercises.concept[].prerequisites" الزامی است
  • اگر "exercises.concept[].status" برابر با deprecated نباشد، مقدار "exercises.concept[].prerequisites" باید آرایه‌ای ناتهی از رشته‌ها باشد؛ به‌جز دقیقاً یک تمرین که مجاز است آرایه‌ی خالی را به عنوان مقدار خود داشته باشد
  • اگر "exercises.concept[].status" برابر با deprecated باشد، مقدار "exercises.concept[].prerequisites" باید آرایه‌ی خالی باشد
  • مقادیر "exercises.concept[].prerequisites" باید رشته‌های کیبابکیس² باشند
  • مقادیر "exercises.concept[].prerequisites" نباید تکراری باشند
  • مقادیر "exercises.concept[].prerequisites" باید با مقادیر ویژگی "concepts" یک تمرین مفهومی دیگر مطابقت داشته باشند
  • مقادیر "exercises.concept[].prerequisites" نباید با هیچ‌یک از مقادیر ویژگی "exercises.concept[].concepts" خود تمرین مطابقت داشته باشند
  • مقادیر "exercises.concept[].prerequisites" باید با ویژگی "concepts.slug" یکی از مفاهیم مطابقت داشته باشند
  • نباید هیچ چرخه‌ای بین "exercises.concept[].concepts" و "exercises.concept[].prerequisites" وجود داشته باشد
  • کلید "exercises.concept[].status" اختیاری است
  • مقدار "exercises.concept[].status" باید رشته‌ی wip، beta، active یا deprecated باشد
  • کلید "exercises.practice" الزامی است
  • مقدار "exercises.practice" باید یک آرایه باشد
  • کلید "exercises.practice[].slug" الزامی است
  • مقدار "exercises.practice[].slug" باید یک رشته‌ی کیبابکیس² با طول کمتر از یا برابر ۲۵۵ باشد
  • مقدار "exercises.practice[].slug" باید در "exercises.practice[].slug" یکتا باشد و نباید در "exercises.concept[].slug" وجود داشته باشد
  • باید دقیقاً یک مقدار "exercises.practice[].slug" وجود داشته باشد که رشته‌ی hello-world است
  • کلید "exercises.practice[].name" الزامی است
  • مقدار "exercises.practice[].name" باید یک رشته‌ی تایتل‌کیس³ با طول کمتر از یا برابر ۲۵۵ باشد
  • کلید "exercises.practice[].uuid" الزامی است
  • مقدار "exercises.practice[].uuid" باید یک رشته‌ی UUID یکتای نسخه‌ی ۴ باشد⁶
  • مقدار "exercises.practice[].uuid" برای هر تمرین هرگز نباید تغییر کند
  • کلید "exercises.practice[].difficulty" الزامی است
  • مقدار "exercises.practice[].difficulty" باید عدد صحیحی بزرگ‌تر از یا برابر ۱ و کوچک‌تر از یا برابر ۱۰ باشد
  • کلید "exercises.practice[].practices" الزامی است
  • اگر "exercises.practice[].status" برابر با deprecated نباشد، مقدار "exercises.practice[].practices" باید آرایه‌ای ناتهی از رشته‌ها باشد
  • اگر "exercises.practice[].status" برابر با deprecated باشد، مقدار "exercises.practice[].practices" باید آرایه‌ی خالی باشد
  • مقادیر "exercises.practice[].practices" باید رشته‌های کیبابکیس² باشند
  • مقادیر "exercises.practice[].practices" نباید تکراری باشند
  • مقادیر "exercises.practice[].practices" باید با ویژگی "concepts[].slug" یکی از مفاهیم مطابقت داشته باشند
  • مقادیر "exercises.practice[].practices" باید حداکثر ۱۰ بار (در مجموع همه‌ی تمرین‌ها) به اسلاگ یک مفهوم منفرد اشاره کنند
  • کلید "exercises.practice[].prerequisites" الزامی است
  • اگر "exercises.practice[].status" برابر با deprecated نباشد، مقدار "exercises.practice[].prerequisites" باید آرایه‌ای ناتهی از رشته‌ها باشد
  • اگر "exercises.practice[].status" برابر با deprecated باشد، مقدار "exercises.practice[].prerequisites" باید آرایه‌ی خالی باشد
  • اگر "exercises.practice[].slug" برابر با hello-world باشد، مقدار "exercises.practice[].prerequisites" باید آرایه‌ی خالی باشد
  • مقادیر "exercises.practice[].prerequisites" باید رشته‌های کیبابکیس² باشند
  • مقادیر "exercises.practice[].prerequisites" نباید تکراری باشند
  • مقادیر "exercises.practice[].prerequisites" باید با مقادیر "exercises.concept[].concepts" یکی از تمرین‌های مفهومی مطابقت داشته باشند
  • مقادیر "exercises.practice[].prerequisites" باید با ویژگی "concepts[].slug" یکی از مفاهیم مطابقت داشته باشند
  • کلید "exercises.practice[].status" اختیاری است
  • مقدار "exercises.practice[].status" باید رشته‌ی wip، beta، active یا deprecated باشد
  • اگر "exercises.practice[].slug" برابر با hello-world باشد، مقدار "exercises.practice[].status" باید یا حذف شده باشد یا رشته‌ی active باشد
  • کلید "exercises.foregone" اختیاری است
  • مقدار "exercises.foregone" باید یک آرایه باشد
  • مقادیر "exercises.foregone" باید رشته‌های کیبابکیس² باشند
  • مقادیر "exercises.foregone" نباید تکراری باشند
  • مقادیر "exercises.foregone" نباید با هیچ‌یک از اسلاگ‌های تمرین مفهومی یا عملی مطابقت داشته باشند
  • کلید "concepts" الزامی است
  • مقدار "concepts" باید یک آرایه باشد
  • کلید "concepts[].uuid" الزامی است
  • مقدار "concepts[].uuid" باید یک رشته‌ی UUID یکتای نسخه‌ی ۴ باشد⁶
  • مقدار "concepts[].uuid" برای هر مفهوم هرگز نباید تغییر کند
  • کلید "concepts[].slug" الزامی است
  • مقدار "concepts[].slug" باید یک رشته‌ی کیبابکیس² با طول کمتر از یا برابر ۲۵۵ باشد
  • کلید "concepts[].name" الزامی است
  • مقدار "concepts[].name" باید یک رشته‌ی تایتل‌کیس³ با طول کمتر از یا برابر ۲۵۵ باشد
  • کلید "concepts[].tags" اختیاری است
  • کلید "concepts[].tags.all" اختیاری است، مگر اینکه "concepts[].tags.any" خالی باشد
  • مقدار "concepts[].tags.all" باید یک آرایه باشد
  • مقادیر "concepts[].tags.all" باید رشته‌های برچسب⁷ ناتهی با طول کمتر از یا برابر ۲۵۵ باشند
  • مقادیر "concepts[].tags.all" نباید تکراری باشند
  • کلید "concepts[].tags.any" اختیاری است، مگر اینکه "concepts[].tags.all" خالی باشد
  • مقدار "concepts[].tags.any" باید یک آرایه باشد
  • مقادیر "concepts[].tags.any" باید رشته‌های برچسب⁷ ناتهی با طول کمتر از یا برابر ۲۵۵ باشند
  • مقادیر "concepts[].tags.any" نباید تکراری باشند
  • کلید "concepts[].tags.not" اختیاری است
  • مقدار "concepts[].tags.not" باید یک آرایه باشد
  • مقادیر "concepts[].tags.not" باید رشته‌های برچسب⁷ ناتهی با طول کمتر از یا برابر ۲۵۵ باشند
  • مقادیر "concepts[].tags.not" نباید تکراری باشند
  • هر مقدار "concepts" باید یک فایل concept/<concepts.slug>/about.md داشته باشد. قواعد لینت این فایل در ادامه مشخص شده است.
  • هر مقدار "concepts" باید یک فایل concept/<concepts.slug>/introduction.md داشته باشد. قواعد لینت این فایل در ادامه مشخص شده است.
  • هر مقدار "concepts" باید یک فایل concept/<concepts.slug>/links.json داشته باشد. قواعد لینت این فایل در ادامه مشخص شده است.
  • کلید "key_features" اختیاری است
  • مقدار "key_features" باید آرایه‌ای با طول برابر ۶ باشد
  • کلید "key_features[].icon" الزامی است
  • مقدار "key_features[].icon" باید از یکی از مقادیر نماد از پیش تعریف‌شده استفاده کند
  • کلید "key_features[].title" الزامی است
  • مقدار "key_features[].title" باید یک رشته‌ی سنتنس‌کیس⁴ با طول کمتر از یا برابر ۲۵ باشد
  • کلید "key_features[].content" الزامی است
  • مقدار "key_features[].content" باید یک رشته‌ی ناتهی¹ با طول کمتر از یا برابر ۱۰۰ باشد
  • کلید "tags" الزامی است
  • مقدار "tags" باید آرایه‌ای از رشته‌ها باشد
  • مقادیر "tags" نباید تکراری باشند
  • مقادیر "tags" باید از یکی از مقادیر برچسب از پیش تعریف‌شده استفاده کنند

قاعده: معتبر بودن exercises/concept/<slug>/.meta/config.json

  • فایل باید JSON معتبر باشد
  • ریشه‌ی JSON باید یک شیء باشد
  • کلید "blurb" الزامی است
  • مقدار "blurb" باید یک رشته‌ی ناتهی¹ با طول کمتر از یا برابر ۳۵۰ باشد
  • کلید "source" اختیاری است
  • مقدار "source" باید یک رشته‌ی ناتهی¹ باشد
  • کلید "source_url" اختیاری است
  • مقدار "source_url" باید یک URL باشد
  • کلید "authors" الزامی است
  • مقدار "authors" باید آرایه‌ای ناتهی باشد
  • مقادیر "authors" باید رشته‌های ناتهی¹ باشند
  • مقادیر "authors" نباید تکراری باشند
  • مقادیر "authors" بدون توجه به بزرگی و کوچکی حروف در نظر گرفته می‌شوند
  • کلید "contributors" اختیاری است
  • مقدار "contributors" باید یک آرایه باشد
  • مقادیر "contributors" باید رشته‌های ناتهی¹ باشند
  • مقادیر "contributors" نباید تکراری باشند
  • مقادیر "contributors" بدون توجه به بزرگی و کوچکی حروف در نظر گرفته می‌شوند
  • کاربران را فقط می‌توان در یکی از آرایه‌های "authors" یا "contributors" فهرست کرد (بدون همپوشانی)
  • کلید "files.solution" الزامی است
  • مقدار "files.solution" باید آرایه‌ای ناتهی باشد
  • مقادیر "files.solution" نباید تکراری باشند
  • کلید "files.test" الزامی است
  • مقدار "files.test" باید آرایه‌ای ناتهی باشد
  • مقادیر "files.test" نباید تکراری باشند
  • کلید "files.exemplar" الزامی است
  • مقدار "files.exemplar" باید آرایه‌ای ناتهی باشد
  • مقادیر "files.exemplar" نباید تکراری باشند
  • کلید "files.editor" اختیاری است
  • مقدار "files.editor" باید یک آرایه باشد
  • مقادیر "files.editor" نباید تکراری باشند
  • کلید "files.invalidator" اختیاری است
  • مقدار "files.invalidator" باید یک آرایه باشد
  • مقادیر "files.invalidator" نباید تکراری باشند
  • فایل‌های فهرست‌شده در "files.solution" باید وجود داشته باشند
  • فایل‌های فهرست‌شده در "files.test" باید وجود داشته باشند
  • فایل‌های فهرست‌شده در "files.exemplar" باید وجود داشته باشند
  • فایل‌های فهرست‌شده در "files.editor" باید وجود داشته باشند
  • فایل‌های فهرست‌شده در "files.invalidator" باید وجود داشته باشند
  • فایل‌ها را فقط می‌توان در یکی از آرایه‌های "files.solution"، "files.test"، "files.exemplar" یا "files.invalidator" فهرست کرد (بدون همپوشانی)
    • اگر ترک d یا plsql باشد، فایل‌های "files.solution" و "files.test" می‌توانند هم‌پوشانی داشته باشند
  • کلید "forked_from" اختیاری است
  • مقدار "forked_from" باید یک آرایه باشد
  • مقادیر "forked_from" باید رشته‌هایی به شکل <track-slug>/<exercise-slug> باشند (مثلاً fsharp/bird-watcher)
  • مقادیر "forked_from" باید به تمرین‌هایی اشاره کنند که واقعاً پیاده‌سازی شده‌اند
  • مقادیر "forked_from" نباید تکراری باشند
  • کلید "language_versions" اختیاری است
  • مقدار "language_versions" باید یک رشته باشد
  • کلید "representer.version" اختیاری است
  • مقدار "representer.version" باید عدد صحیحی بزرگ‌تر از یا برابر ۱ باشد
  • کلید "icon" اختیاری است
  • مقدار "icon" باید یک رشته‌ی کیبابکیس² باشد

قاعده: معتبر بودن exercises/concept/<slug>/.docs/hints.md

  • Markdown باید با استانداردهای Markdown مطابقت داشته باشد
  • همه‌ی سرتیترها باید یا ## General باشند یا ## X. <task>، که در آن X با شماره‌ی سرتیتر کار در instructions.md مطابقت داشته باشد
  • همه‌ی راهنمایی‌ها باید به صورت آیتم‌های فهرست Markdown نوشته شوند
  • لینک‌ها باید مطلق باشند (لینک‌های نسبی مجاز نیستند)

قاعده: معتبر بودن exercises/concept/<slug>/.docs/instructions.md

  • Markdown باید با استانداردهای Markdown مطابقت داشته باشد
  • همه‌ی کارها باید با یک سرتیتر سطح دو شروع شوند که با یک عدد و سپس یک نقطه آغاز می‌شود: ## 1. Do X
  • لینک‌ها باید مطلق باشند (لینک‌های نسبی مجاز نیستند)

قاعده: معتبر بودن exercises/concept/<slug>/.docs/instructions.md.tpl (در صورت وجود)

  • مفهوم هر یک از جانگهدارهای مفهوم باید با ویژگی "concepts.slug" یکی از مفاهیم موجود در config.json ترک مطابقت داشته باشد.

قاعده: معتبر بودن exercises/concept/<slug>/.docs/introduction.md

  • Markdown باید با استانداردهای Markdown مطابقت داشته باشد
  • لینک‌ها باید مطلق باشند (لینک‌های نسبی مجاز نیستند)

قاعده: معتبر بودن exercises/practice/<slug>/.meta/config.json

  • فایل باید JSON معتبر باشد
  • ریشه‌ی JSON باید یک شیء باشد
  • کلید "blurb" الزامی است
  • مقدار "blurb" باید یک رشته‌ی ناتهی¹ با طول کمتر از یا برابر ۳۵۰ باشد
  • کلید "source" اختیاری است
  • مقدار "source" باید یک رشته‌ی ناتهی¹ باشد
  • کلید "source_url" اختیاری است
  • مقدار "source_url" باید یک URL باشد
  • کلید "authors" اختیاری است
  • مقدار "authors" باید یک آرایه باشد
  • مقادیر "authors" باید رشته‌های ناتهی¹ باشند
  • مقادیر "authors" نباید تکراری باشند
  • مقادیر "authors" بدون توجه به بزرگی و کوچکی حروف در نظر گرفته می‌شوند
  • کلید "contributors" اختیاری است
  • مقدار "contributors" باید یک آرایه باشد
  • مقادیر "contributors" باید رشته‌های ناتهی¹ باشند
  • مقادیر "contributors" نباید تکراری باشند
  • مقادیر "contributors" بدون توجه به بزرگی و کوچکی حروف در نظر گرفته می‌شوند
  • کاربران را فقط می‌توان در یکی از آرایه‌های "authors" یا "contributors" فهرست کرد (بدون همپوشانی)
  • کلید "files.solution" الزامی است
  • مقدار "files.solution" باید آرایه‌ای ناتهی باشد
  • مقادیر "files.solution" نباید تکراری باشند
  • کلید "files.test" الزامی است
  • مقدار "files.test" باید آرایه‌ای ناتهی باشد
  • مقادیر "files.test" نباید تکراری باشند
  • کلید "files.example" الزامی است
  • مقدار "files.example" باید آرایه‌ای ناتهی باشد
  • مقادیر "files.example" نباید تکراری باشند
  • کلید "files.editor" اختیاری است
  • مقدار "files.editor" باید یک آرایه باشد
  • مقادیر "files.editor" نباید تکراری باشند
  • کلید "files.invalidator" اختیاری است
  • مقدار "files.invalidator" باید یک آرایه باشد
  • مقادیر "files.invalidator" نباید تکراری باشند
  • فایل‌های فهرست‌شده در "files.solution" باید وجود داشته باشند
  • فایل‌های فهرست‌شده در "files.test" باید وجود داشته باشند
  • فایل‌های فهرست‌شده در "files.example" باید وجود داشته باشند
  • فایل‌های فهرست‌شده در "files.editor" باید وجود داشته باشند
  • فایل‌های فهرست‌شده در "files.invalidator" باید وجود داشته باشند
  • فایل‌ها را فقط می‌توان در یکی از آرایه‌های "files.solution"، "files.test"، "files.example یا "files.invalidator" فهرست کرد (بدون همپوشانی)
    • اگر ترک d یا plsql باشد، فایل‌های "files.solution" و "files.test" می‌توانند هم‌پوشانی داشته باشند
  • کلید "language_versions" اختیاری است
  • مقدار "language_versions" باید یک رشته باشد
  • کلید "test_runner" اختیاری است
  • مقدار "test_runner" باید منطقی باشد
  • کلید "representer.version" اختیاری است
  • مقدار "representer.version" باید عدد صحیحی بزرگ‌تر از یا برابر ۱ باشد
  • کلید "icon" اختیاری است
  • مقدار "icon" باید یک رشته‌ی کیبابکیس² باشد

قاعده: معتبر بودن exercises/{concept|practice}/<slug>/.approaches/config.json

  • حضور این فایل اختیاری است، مگر اینکه یک introduction.md یا یک پوشه‌ی هم‌سطح وجود داشته باشد
  • فایل باید JSON معتبر باشد
  • ریشه‌ی JSON باید یک شیء باشد
  • کلید "introduction.authors" اختیاری است
  • مقدار "introduction.authors" باید یک آرایه باشد
  • مقادیر "introduction.authors" باید رشته‌های ناتهی¹ باشند
  • مقادیر "introduction.authors" نباید تکراری باشند
  • مقادیر "introduction.authors" بدون توجه به بزرگی و کوچکی حروف در نظر گرفته می‌شوند
  • اگر آرایه‌ی "introduction.authors" ناتهی باشد، باید یک فایل introduction.md ناتهی وجود داشته باشد
  • کلید "introduction.contributors" اختیاری است
  • مقدار "introduction.contributors" باید یک آرایه باشد
  • مقادیر "introduction.contributors" باید رشته‌های ناتهی¹ باشند
  • مقادیر "introduction.contributors" نباید تکراری باشند
  • مقادیر "introduction.contributors" بدون توجه به بزرگی و کوچکی حروف در نظر گرفته می‌شوند
  • اگر آرایه‌ی "introduction.contributors" ناتهی باشد، باید یک فایل introduction.md ناتهی وجود داشته باشد
  • کاربران را فقط می‌توان در یکی از آرایه‌های "introduction.authors" یا "introduction.contributors" فهرست کرد (بدون همپوشانی)
  • کلید "approaches" اختیاری است، مگر اینکه یک پوشه‌ی هم‌سطح وجود داشته باشد (که فایل‌های رویکرد را در خود دارد)
  • مقدار "approaches" باید آرایه‌ای از شیءها باشد
  • کلید "approaches[].uuid" الزامی است
  • مقدار "approaches[].uuid" باید یک رشته‌ی UUID یکتای نسخه‌ی ۴ باشد⁶
  • مقدار "approaches[].uuid" برای هر مفهوم هرگز نباید تغییر کند
  • کلید "approaches[].slug" الزامی است
  • مقدار "approaches[].slug" باید یک رشته‌ی کیبابکیس² با طول کمتر از یا برابر ۲۵۵ باشد
  • مقدار "approaches[].slug" باید یک فایل <slug>/content.md ناتهی متناظر داشته باشد
  • مقدار "approaches[].slug" باید یک فایل <slug>/snippet.txt ناتهی متناظر داشته باشد
  • کلید "approaches[].title" الزامی است
  • مقدار "approaches[].title" باید یک رشته‌ی تایتل‌کیس³ با طول کمتر از یا برابر ۲۵۵ باشد
  • کلید "approaches[].blurb" الزامی است
  • مقدار "approaches[].blurb" باید یک رشته‌ی ناتهی¹ با طول کمتر از یا برابر ۳۵۰ باشد
  • کلید "approaches[].authors" الزامی است
  • مقدار "approaches[].authors" باید آرایه‌ای ناتهی باشد
  • مقادیر "approaches[].authors" باید رشته‌های ناتهی¹ باشند
  • مقادیر "approaches[].authors" نباید تکراری باشند
  • مقادیر "approaches[].authors" بدون توجه به بزرگی و کوچکی حروف در نظر گرفته می‌شوند
  • کلید "approaches[].contributors" اختیاری است
  • مقدار "approaches[].contributors" باید یک آرایه باشد
  • مقادیر "approaches[].contributors" باید رشته‌های ناتهی¹ باشند
  • مقادیر "approaches[].contributors" نباید تکراری باشند
  • مقادیر "approaches[].contributors" بدون توجه به بزرگی و کوچکی حروف در نظر گرفته می‌شوند
  • کاربران را فقط می‌توان در یکی از آرایه‌های "approaches[].authors" یا "approaches[].contributors" فهرست کرد (بدون همپوشانی)
  • کلید "approaches[].tags" اختیاری است
  • کلید "approaches[].tags.all" اختیاری است، مگر اینکه "approaches[].tags.any" خالی باشد
  • مقدار "approaches[].tags.all" باید یک آرایه باشد
  • مقادیر "approaches[].tags.all" باید رشته‌های برچسب⁷ ناتهی با طول کمتر از یا برابر ۲۵۵ باشند
  • مقادیر "approaches[].tags.all" نباید تکراری باشند
  • کلید "approaches[].tags.any" اختیاری است، مگر اینکه "approaches[].tags.all" خالی باشد
  • مقدار "approaches[].tags.any" باید یک آرایه باشد
  • مقادیر "approaches[].tags.any" باید رشته‌های برچسب⁷ ناتهی با طول کمتر از یا برابر ۲۵۵ باشند
  • مقادیر "approaches[].tags.any" نباید تکراری باشند
  • کلید "approaches[].tags.not" اختیاری است
  • مقدار "approaches[].tags.not" باید یک آرایه باشد
  • مقادیر "approaches[].tags.not" باید رشته‌های برچسب⁷ ناتهی با طول کمتر از یا برابر ۲۵۵ باشند
  • مقادیر "approaches[].tags.not" نباید تکراری باشند

قاعده: معتبر بودن exercises/{concept|practice}/<slug>/.approaches/<approach-slug>/content.md

  • اگر مدخل متناظری برای "approaches[].slug" در فایل .approaches/config.json وجود داشته باشد، حضور این فایل الزامی است
  • Markdown باید با استانداردهای Markdown مطابقت داشته باشد
  • لینک‌ها باید مطلق باشند (لینک‌های نسبی مجاز نیستند)

قاعده: معتبر بودن exercises/{concept|practice}/<slug>/.approaches/<approach-slug>/snippet.<snippet-extension>

  • اگر مدخل متناظری برای "approaches[].slug" در فایل .approaches/config.json وجود داشته باشد، حضور این فایل الزامی است
  • قطعه‌کد باید حداکثر ۸ خط داشته باشد
  • پسوند قطعه‌کد از مقدار approaches.snippet_extension در فایل config.json ترک گرفته می‌شود

قاعده: معتبر بودن exercises/{concept|practice}/<slug>/.articles/config.json

  • حضور این فایل اختیاری است، مگر اینکه یک پوشه‌ی هم‌سطح وجود داشته باشد
  • فایل باید JSON معتبر باشد
  • ریشه‌ی JSON باید یک شیء باشد
  • کلید "articles" اختیاری است، مگر اینکه یک پوشه‌ی هم‌سطح وجود داشته باشد (که فایل‌های مقاله را در خود دارد)
  • مقدار "articles" باید آرایه‌ای از شیءها باشد
  • کلید "articles[].uuid" الزامی است
  • مقدار "articles[].uuid" باید یک رشته‌ی UUID یکتای نسخه‌ی ۴ باشد⁶
  • مقدار "articles[].uuid" برای هر مفهوم هرگز نباید تغییر کند
  • کلید "articles[].slug" الزامی است
  • مقدار "articles[].slug" باید یک رشته‌ی کیبابکیس² با طول کمتر از یا برابر ۲۵۵ باشد
  • مقدار "articles[].slug" باید یک فایل <slug>/content.md ناتهی متناظر داشته باشد
  • مقدار "articles[].slug" باید یک فایل <slug>/snippet.md ناتهی متناظر داشته باشد
  • کلید "articles[].title" الزامی است
  • مقدار "articles[].title" باید یک رشته‌ی تایتل‌کیس³ با طول کمتر از یا برابر ۲۵۵ باشد
  • کلید "articles[].blurb" الزامی است
  • مقدار "articles[].blurb" باید یک رشته‌ی ناتهی¹ با طول کمتر از یا برابر ۳۵۰ باشد
  • کلید "articles[].authors" الزامی است
  • مقدار "articles[].authors" باید آرایه‌ای ناتهی باشد
  • مقادیر "articles[].authors" باید رشته‌های ناتهی¹ باشند
  • مقادیر "articles[].authors" نباید تکراری باشند
  • مقادیر "articles[].authors" بدون توجه به بزرگی و کوچکی حروف در نظر گرفته می‌شوند
  • کلید "articles[].contributors" اختیاری است
  • مقدار "articles[].contributors" باید یک آرایه باشد
  • مقادیر "articles[].contributors" باید رشته‌های ناتهی¹ باشند
  • مقادیر "articles[].contributors" نباید تکراری باشند
  • مقادیر "articles[].contributors" بدون توجه به بزرگی و کوچکی حروف در نظر گرفته می‌شوند
  • کاربران را فقط می‌توان در یکی از آرایه‌های "articles[].authors" یا "articles[].contributors" فهرست کرد (بدون همپوشانی)

قاعده: معتبر بودن exercises/{concept|practice}/<slug>/.articles/<article-slug>/content.md

  • اگر مدخل متناظری برای "articles[].slug" در فایل .articles/config.json وجود داشته باشد، حضور این فایل الزامی است
  • Markdown باید با استانداردهای Markdown مطابقت داشته باشد
  • لینک‌ها باید مطلق باشند (لینک‌های نسبی مجاز نیستند)

قاعده: معتبر بودن exercises/{concept|practice}/<slug>/.articles/<article-slug>/snippet.md

  • اگر مدخل متناظری برای "articles[].slug" در فایل .articles/config.json وجود داشته باشد، حضور این فایل الزامی است
  • Markdown باید با استانداردهای Markdown مطابقت داشته باشد
  • قطعه‌کد باید حداکثر ۸ خط داشته باشد (نشانگرهای حصار کد در ابتدا و انتها نادیده گرفته می‌شوند)

قاعده: معتبر بودن exercises/shared/.docs/debug.md

  • حضور این فایل اختیاری است
  • Markdown باید با استانداردهای Markdown مطابقت داشته باشد
  • لینک‌ها باید مطلق باشند (لینک‌های نسبی مجاز نیستند)

قاعده: معتبر بودن exercises/shared/.docs/help.md

  • حضور این فایل الزامی است
  • Markdown باید با استانداردهای Markdown مطابقت داشته باشد
  • لینک‌ها باید مطلق باشند (لینک‌های نسبی مجاز نیستند)

قاعده: معتبر بودن exercises/shared/.docs/tests.md

  • حضور این فایل الزامی است
  • Markdown باید با استانداردهای Markdown مطابقت داشته باشد
  • لینک‌ها باید مطلق باشند (لینک‌های نسبی مجاز نیستند)

قاعده: معتبر بودن concepts/<slug>/about.md

  • Markdown باید با استانداردهای Markdown مطابقت داشته باشد
  • لینک‌ها باید مطلق باشند (لینک‌های نسبی مجاز نیستند)

قاعده: معتبر بودن concepts/<slug>/introduction.md

  • Markdown باید با استانداردهای Markdown مطابقت داشته باشد
  • لینک‌ها باید مطلق باشند (لینک‌های نسبی مجاز نیستند)
  • فایل باید JSON معتبر باشد
  • ریشه‌ی JSON باید یک آرایه باشد
  • ویژگی "[].url" الزامی است
  • مقدار "[].url" باید یک URL باشد
  • ویژگی "[].description" الزامی است
  • مقدار "[].description" باید یک رشته‌ی ناتهی¹ باشد
  • ویژگی "[].icon_url" اختیاری است
  • مقدار "[].icon_url" باید یک URL باشد

قاعده: معتبر بودن concept/<slug>/.meta/config.json

  • فایل باید JSON معتبر باشد
  • ریشه‌ی JSON باید یک شیء باشد
  • کلید "blurb" الزامی است
  • مقدار "blurb" باید یک رشته‌ی ناتهی¹ با طول کمتر از یا برابر ۳۵۰ باشد
  • کلید "authors" الزامی است
  • مقدار "authors" باید یک آرایه باشد
  • مقادیر "authors" باید رشته‌های ناتهی¹ باشند
  • مقادیر "authors" نباید تکراری باشند
  • مقادیر "authors" بدون توجه به بزرگی و کوچکی حروف در نظر گرفته می‌شوند
  • کلید "contributors" اختیاری است
  • مقدار "contributors" باید یک آرایه باشد
  • مقادیر "contributors" باید رشته‌های ناتهی¹ باشند
  • مقادیر "contributors" نباید تکراری باشند
  • مقادیر "contributors" بدون توجه به بزرگی و کوچکی حروف در نظر گرفته می‌شوند
  • کاربران را فقط می‌توان در یکی از آرایه‌های "authors" یا "contributors" فهرست کرد (بدون همپوشانی)

قاعده: معتبر بودن docs/ABOUT.md

  • حضور این فایل الزامی است
  • محتوای فایل باید ناتهی باشد
  • Markdown باید با استانداردهای Markdown مطابقت داشته باشد
  • لینک‌ها باید مطلق باشند (لینک‌های نسبی مجاز نیستند)

قاعده: معتبر بودن docs/INSTALLATION.md

  • حضور این فایل الزامی است
  • محتوای فایل باید ناتهی باشد
  • Markdown باید با استانداردهای Markdown مطابقت داشته باشد
  • لینک‌ها باید مطلق باشند (لینک‌های نسبی مجاز نیستند)

قاعده: معتبر بودن docs/LEARNING.md

  • حضور این فایل الزامی است
  • محتوای فایل باید ناتهی باشد
  • Markdown باید با استانداردهای Markdown مطابقت داشته باشد
  • لینک‌ها باید مطلق باشند (لینک‌های نسبی مجاز نیستند)

قاعده: معتبر بودن docs/RESOURCES.md

  • حضور این فایل الزامی است
  • محتوای فایل باید ناتهی باشد
  • Markdown باید با استانداردهای Markdown مطابقت داشته باشد
  • لینک‌ها باید مطلق باشند (لینک‌های نسبی مجاز نیستند)

قاعده: معتبر بودن docs/SNIPPET.txt

  • حضور این فایل الزامی است
  • محتوای فایل باید ناتهی باشد

قاعده: معتبر بودن docs/TESTS.md

  • حضور این فایل الزامی است
  • محتوای فایل باید ناتهی باشد
  • Markdown باید با استانداردهای Markdown مطابقت داشته باشد
  • لینک‌ها باید مطلق باشند (لینک‌های نسبی مجاز نیستند)

واژه‌نامه

  1. رشته‌ی ناتهی: رشته‌ای که دست‌کم یک نویسه‌ی غیرفاصله داشته باشد.

  2. رشته‌ی کیبابکیس: رشته‌ای که فقط شامل نویسه‌هایی در بازه‌ی [a-z0-9] است، که به‌صورت اختیاری با خط تیره جدا شده‌اند (مثلاً «two-fer»). باید با این عبارت باقاعده مطابقت داشته باشد: ^[a-z0-9]+(-[a-z0-9]+)*$

  3. رشته‌ی تایتل‌کیس: یک رشته‌ی ناتهی که از رهنمودهای زیر از شیوه‌نامه‌ی Chicago پیروی می‌کند:

    • واژه‌ی نخست و واژه‌ی آخر عنوان‌ها و زیرعنوان‌ها را با حرف بزرگ بنویسید.
    • واژه‌های «اصلی» را با حرف بزرگ بنویسید (اسم‌ها، ضمیرها، فعل‌ها، صفت‌ها، قیدها و برخی حروف ربط).
    • حروف ربط and، but، for، or و nor را با حرف کوچک بنویسید.
    • حروف تعریف the، a و an را با حرف کوچک بنویسید.
    • حروف اضافه را، فارغ از طولشان، با حرف کوچک بنویسید؛ مگر اینکه مورد تأکید باشند، یا به‌صورت قیدی یا وصفی به کار روند، یا به عنوان حرف ربط استفاده شوند.
    • واژه‌های to و as را با حرف کوچک بنویسید.
    • بخش دوم نام‌های گونه‌ای لاتین را با حرف کوچک بنویسید.
  4. رشته‌ی سنتنس‌کیس: یک رشته‌ی ناتهی که از رهنمودهای زیر پیروی می‌کند:

    • واژه‌ی نخست جمله را با حرف بزرگ بنویسید؛ همچنین اسم‌های خاص و سایر واژه‌هایی که یک قاعده‌ی دقیق‌تر تعیین می‌کند.
  5. الگوی معتبر files: یک رشته‌ی ناتهی¹ که مکان فایلی را که در یک تمرین استفاده می‌شود، نسبت به پوشه‌ی تمرین مشخص می‌کند. یک الگو می‌تواند از یکی از جانگهدارهای زیر استفاده کند:

    • %{kebab_slug}: اسلاگ تمرین به قالب kebab-case (مثلاً bit-manipulation)
    • %{snake_slug}: اسلاگ تمرین به قالب snake_case (مثلاً bit_manipulation)
    • %{camel_slug}: اسلاگ تمرین به قالب camelCase (مثلاً bitManipulation)
    • %{pascal_slug}: اسلاگ تمرین به قالب PascalCase (مثلاً BitManipulation)
  6. رشته‌ی UUID یکتای نسخه‌ی ۴: رشته‌ای که همه‌ی این شرط‌ها را برآورده می‌کند:

    • تنها یک بار در فایل config.json سطح ترک یک ترک Exercism مشخص وجود دارد
    • در فایل config.json سطح ترک هیچ ترک Exercism دیگری وجود ندارد
    • در هیچ فایل canonical-data.json در https://github.com/exercism/problem-specifications وجود ندارد
    • در هیچ جای دیگری در Exercism وجود ندارد
    • با این عبارت باقاعده مطابقت دارد:
    ^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$
    

    برای نمونه، UUID زیر شکل درست را دارد:

    d334ffe3-657e-4725-a950-290b284b6d9f
    

    می‌توانید برای تولید یک UUID مناسب دستور configlet uuid را اجرا کنید.

  7. tag معتبر تحلیلگر: یک رشته‌ی ناتهی¹ که به شکل <category>:<thing> قالب‌بندی شده است. مقدار <category> باید یکی از این‌ها باشد:

  • paradigm (مثلاً paradigm:functional)
  • technique (مثلاً technique:recursion)
  • construct (مثلاً construct:bitwise-and)
  • uses (مثلاً uses:DateTime.add_seconds)

مقدار <thing> باید یک رشته‌ی ناتهی¹ باشد.