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" سلسلة نصية غير فارغة¹ بطول <= 255
  • مفتاح "slug" مطلوب
  • يجب أن تكون قيمة "slug" سلسلة بصيغة kebab-case² بطول <= 255
  • مفتاح "active" مطلوب
  • يجب أن تكون قيمة "active" قيمة منطقية
  • مفتاح "blurb" مطلوب
  • يجب أن تكون قيمة "blurb" سلسلة نصية غير فارغة¹ بطول <= 400
  • مفتاح "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" عددًا صحيحًا >= 0 و <= 8
  • مفتاح "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" عددًا صحيحًا > 0
  • مفتاح "approaches.snippet_extension" مطلوب إذا كان للمسار مقاربة واحدة أو أكثر
  • يجب أن تكون قيمة "approaches.snippet_extension" سلسلة نصية غير فارغة¹
  • مفتاح "exercises" مطلوب
  • مفتاح "exercises.concept" مطلوب
  • يجب أن تكون قيمة "exercises.concept" مصفوفة
  • مفتاح "exercises.concept[].slug" مطلوب
  • يجب أن تكون قيمة "exercises.concept[].slug" سلسلة بصيغة kebab-case² بطول <= 255
  • يجب أن تكون قيمة "exercises.concept[].slug" فريدة في "exercises.concept[].slug" وألا توجد في "exercises.practice[].slug"
  • مفتاح "exercises.concept[].name" مطلوب
  • يجب أن تكون قيمة "exercises.concept[].name" سلسلة بصيغة Title Case³ بطول <= 255
  • مفتاح "exercises.concept[].uuid" مطلوب
  • يجب أن تكون قيمة "exercises.concept[].uuid" سلسلة UUID فريدة من الإصدار 4⁶
  • يجب ألا تتغير قيمة "exercises.concept[].uuid" لأي تمرين أبدًا
  • مفتاح "exercises.concept[].concepts" مطلوب
  • يجب أن تكون قيمة "exercises.concept[].concepts" مصفوفة غير فارغة من السلاسل النصية إذا كانت قيمة "exercises.concept[].status" لا تساوي deprecated
  • يجب أن تكون قيمة "exercises.concept[].concepts" مصفوفة فارغة إذا كانت قيمة "exercises.concept[].status" تساوي deprecated
  • يجب أن تكون قيم "exercises.concept[].concepts" سلاسل بصيغة kebab-case²
  • يجب ألا تحتوي قيم "exercises.concept[].concepts" على تكرارات
  • يجب ألا توجد قيم "exercises.concept[].concepts" في خاصية "concepts" لأي تمرين مفاهيم آخر
  • يجب أن تطابق قيم "exercises.concept[].concepts" خاصية "concepts.slug" لأحد المفاهيم
  • مفتاح "exercises.concept[].prerequisites" مطلوب
  • يجب أن تكون قيمة "exercises.concept[].prerequisites" مصفوفة غير فارغة من السلاسل النصية إذا كانت قيمة "exercises.concept[].status" لا تساوي deprecated، باستثناء تمرين واحد بالضبط يُسمح له بأن تكون قيمة مصفوفته فارغة
  • يجب أن تكون قيمة "exercises.concept[].prerequisites" مصفوفة فارغة إذا كانت قيمة "exercises.concept[].status" تساوي deprecated
  • يجب أن تكون قيم "exercises.concept[].prerequisites" سلاسل بصيغة kebab-case²
  • يجب ألا تحتوي قيم "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" سلسلة بصيغة kebab-case² بطول <= 255
  • يجب أن تكون قيمة "exercises.practice[].slug" فريدة في "exercises.practice[].slug" وألا توجد في "exercises.concept[].slug"
  • يجب أن توجد قيمة واحدة بالضبط لـ "exercises.practice[].slug" تكون السلسلة hello-world
  • مفتاح "exercises.practice[].name" مطلوب
  • يجب أن تكون قيمة "exercises.practice[].name" سلسلة بصيغة Title Case³ بطول <= 255
  • مفتاح "exercises.practice[].uuid" مطلوب
  • يجب أن تكون قيمة "exercises.practice[].uuid" سلسلة UUID فريدة من الإصدار 4⁶
  • يجب ألا تتغير قيمة "exercises.practice[].uuid" لأي تمرين أبدًا
  • مفتاح "exercises.practice[].difficulty" مطلوب
  • يجب أن تكون قيمة "exercises.practice[].difficulty" عددًا صحيحًا >= 1 و <= 10
  • مفتاح "exercises.practice[].practices" مطلوب
  • يجب أن تكون قيمة "exercises.practice[].practices" مصفوفة غير فارغة من السلاسل النصية إذا كانت قيمة "exercises.practice[].status" لا تساوي deprecated
  • يجب أن تكون قيمة "exercises.practice[].practices" مصفوفة فارغة إذا كانت قيمة "exercises.practice[].status" تساوي deprecated
  • يجب أن تكون قيم "exercises.practice[].practices" سلاسل بصيغة kebab-case²
  • يجب ألا تحتوي قيم "exercises.practice[].practices" على تكرارات
  • يجب أن تطابق قيم "exercises.practice[].practices" خاصية "concepts[].slug" لأحد المفاهيم
  • يجب ألا تشير قيم "exercises.practice[].practices" إلى slug مفهوم فردي أكثر من 10 مرات (عبر جميع التمارين)
  • مفتاح "exercises.practice[].prerequisites" مطلوب
  • يجب أن تكون قيمة "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" سلاسل بصيغة kebab-case²
  • يجب ألا تحتوي قيم "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[].status"، إذا كانت قيمة "exercises.practice[].slug" تساوي hello-world، إما محذوفة أو السلسلة active
  • مفتاح "exercises.foregone" اختياري
  • يجب أن تكون قيمة "exercises.foregone" مصفوفة
  • يجب أن تكون قيم "exercises.foregone" سلاسل بصيغة kebab-case²
  • يجب ألا تحتوي قيم "exercises.foregone" على تكرارات
  • يجب ألا تطابق قيم "exercises.foregone" أيًا من slugs تمارين المفاهيم أو التدريب
  • مفتاح "concepts" مطلوب
  • يجب أن تكون قيمة "concepts" مصفوفة
  • مفتاح "concepts[].uuid" مطلوب
  • يجب أن تكون قيمة "concepts[].uuid" سلسلة UUID فريدة من الإصدار 4⁶
  • يجب ألا تتغير قيمة "concepts[].uuid" لأي مفهوم أبدًا
  • مفتاح "concepts[].slug" مطلوب
  • يجب أن تكون قيمة "concepts[].slug" سلسلة بصيغة kebab-case² بطول <= 255
  • مفتاح "concepts[].name" مطلوب
  • يجب أن تكون قيمة "concepts[].name" سلسلة بصيغة Title Case³ بطول <= 255
  • مفتاح "concepts[].tags" اختياري
  • مفتاح "concepts[].tags.all" اختياري، إلا إذا كانت قيمة "concepts[].tags.any" فارغة
  • يجب أن تكون قيمة "concepts[].tags.all" مصفوفة
  • يجب أن تكون قيم "concepts[].tags.all" سلاسل وسوم⁷ غير فارغة بطول <= 255
  • يجب ألا تحتوي قيم "concepts[].tags.all" على تكرارات
  • مفتاح "concepts[].tags.any" اختياري، إلا إذا كانت قيمة "concepts[].tags.all" فارغة
  • يجب أن تكون قيمة "concepts[].tags.any" مصفوفة
  • يجب أن تكون قيم "concepts[].tags.any" سلاسل وسوم⁷ غير فارغة بطول <= 255
  • يجب ألا تحتوي قيم "concepts[].tags.any" على تكرارات
  • مفتاح "concepts[].tags.not" اختياري
  • يجب أن تكون قيمة "concepts[].tags.not" مصفوفة
  • يجب أن تكون قيم "concepts[].tags.not" سلاسل وسوم⁷ غير فارغة بطول <= 255
  • يجب ألا تحتوي قيم "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" مصفوفة بطول = 6
  • مفتاح "key_features[].icon" مطلوب
  • يجب أن تستخدم قيمة "key_features[].icon" إحدى قيم الأيقونات المعرّفة مسبقًا
  • مفتاح "key_features[].title" مطلوب
  • يجب أن تكون قيمة "key_features[].title" سلسلة بصيغة Sentence Case⁴ بطول <= 25
  • مفتاح "key_features[].content" مطلوب
  • يجب أن تكون قيمة "key_features[].content" سلسلة نصية غير فارغة¹ بطول <= 100
  • مفتاح "tags" مطلوب
  • يجب أن تكون قيمة "tags" مصفوفة من السلاسل النصية
  • يجب ألا تحتوي قيم "tags" على تكرارات
  • يجب أن تستخدم قيم "tags" إحدى قيم الوسوم المعرّفة مسبقًا

القاعدة: الملف exercises/concept/<slug>/.meta/config.json صالح

  • يجب أن يكون الملف JSON صالحًا
  • يجب أن يكون الجذر JSON كائنًا
  • مفتاح "blurb" مطلوب
  • يجب أن تكون قيمة "blurb" سلسلة نصية غير فارغة¹ بطول <= 350
  • مفتاح "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" عددًا صحيحًا >= 1
  • مفتاح "icon" اختياري
  • يجب أن تكون قيمة "icon" سلسلة بصيغة kebab-case²

القاعدة: الملف 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" سلسلة نصية غير فارغة¹ بطول <= 350
  • مفتاح "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" عددًا صحيحًا >= 1
  • مفتاح "icon" اختياري
  • يجب أن تكون قيمة "icon" سلسلة بصيغة kebab-case²

القاعدة: الملف 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 فريدة من الإصدار 4⁶
  • يجب ألا تتغير قيمة "approaches[].uuid" لأي مفهوم أبدًا
  • مفتاح "approaches[].slug" مطلوب
  • يجب أن تكون قيمة "approaches[].slug" سلسلة بصيغة kebab-case² بطول <= 255
  • يجب أن يكون لقيمة "approaches[].slug" ملف <slug>/content.md غير فارغ مقابل
  • يجب أن يكون لقيمة "approaches[].slug" ملف <slug>/snippet.txt غير فارغ مقابل
  • مفتاح "approaches[].title" مطلوب
  • يجب أن تكون قيمة "approaches[].title" سلسلة بصيغة Title Case³ بطول <= 255
  • مفتاح "approaches[].blurb" مطلوب
  • يجب أن تكون قيمة "approaches[].blurb" سلسلة نصية غير فارغة¹ بطول <= 350
  • مفتاح "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" سلاسل وسوم⁷ غير فارغة بطول <= 255
  • يجب ألا تحتوي قيم "approaches[].tags.all" على تكرارات
  • مفتاح "approaches[].tags.any" اختياري، إلا إذا كانت قيمة "approaches[].tags.all" فارغة
  • يجب أن تكون قيمة "approaches[].tags.any" مصفوفة
  • يجب أن تكون قيم "approaches[].tags.any" سلاسل وسوم⁷ غير فارغة بطول <= 255
  • يجب ألا تحتوي قيم "approaches[].tags.any" على تكرارات
  • مفتاح "approaches[].tags.not" اختياري
  • يجب أن تكون قيمة "approaches[].tags.not" مصفوفة
  • يجب أن تكون قيم "approaches[].tags.not" سلاسل وسوم⁷ غير فارغة بطول <= 255
  • يجب ألا تحتوي قيم "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
  • يجب ألا يزيد المقتطف عن 8 أسطر
  • يُؤخذ امتداد المقتطف من قيمة approaches.snippet_extension في ملف config.json الخاص بالمسار

القاعدة: الملف exercises/{concept|practice}/<slug>/.articles/config.json صالح

  • وجود الملف اختياري، إلا إذا كان هناك مجلد شقيق
  • يجب أن يكون الملف JSON صالحًا
  • يجب أن يكون الجذر JSON كائنًا
  • مفتاح "articles" اختياري، إلا إذا كان هناك مجلد شقيق موجود (يحتوي على ملفات المقال)
  • يجب أن تكون قيمة "articles" مصفوفة من الكائنات
  • مفتاح "articles[].uuid" مطلوب
  • يجب أن تكون قيمة "articles[].uuid" سلسلة UUID فريدة من الإصدار 4⁶
  • يجب ألا تتغير قيمة "articles[].uuid" لأي مفهوم أبدًا
  • مفتاح "articles[].slug" مطلوب
  • يجب أن تكون قيمة "articles[].slug" سلسلة بصيغة kebab-case² بطول <= 255
  • يجب أن يكون لقيمة "articles[].slug" ملف <slug>/content.md غير فارغ مقابل
  • يجب أن يكون لقيمة "articles[].slug" ملف <slug>/snippet.md غير فارغ مقابل
  • مفتاح "articles[].title" مطلوب
  • يجب أن تكون قيمة "articles[].title" سلسلة بصيغة Title Case³ بطول <= 255
  • مفتاح "articles[].blurb" مطلوب
  • يجب أن تكون قيمة "articles[].blurb" سلسلة نصية غير فارغة¹ بطول <= 350
  • مفتاح "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
  • يجب ألا يزيد المقتطف عن 8 أسطر (تُتجاهل علامات سياج الكود البادئة واللاحقة)

القاعدة: الملف 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" سلسلة نصية غير فارغة¹ بطول <= 350
  • مفتاح "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. سلسلة بصيغة kebab-case: سلسلة تحتوي فقط على محارف ضمن النطاق [a-z0-9]، مفصولة اختياريًا بشرطات (مثل "two-fer"). يجب أن تطابق التعبير النمطي: ^[a-z0-9]+(-[a-z0-9]+)*$

  3. سلسلة بصيغة Title Case: سلسلة نصية غير فارغة تتبع الإرشادات التالية من دليل شيكاغو للأنماط:

    • اكتب الكلمة الأولى والأخيرة من العناوين والعناوين الفرعية بحرف كبير.
    • اكتب الكلمات "الرئيسية" (الأسماء والضمائر والأفعال والصفات والظروف وبعض أدوات الربط) بحرف كبير.
    • اكتب أدوات الربط and و but و for و or و nor بحروف صغيرة.
    • اكتب أدوات التعريف the و a و an بحروف صغيرة.
    • اكتب حروف الجر بحروف صغيرة، بغض النظر عن طولها، إلا عندما تكون مُشدّدة، أو مستخدمة كظرف أو صفة، أو مستخدمة كأداة ربط.
    • اكتب الكلمتين to و as بحروف صغيرة.
    • اكتب الجزء الثاني من أسماء الأنواع اللاتينية بحروف صغيرة.
  4. سلسلة بصيغة Sentence Case: سلسلة نصية غير فارغة تتبع الإرشادات أدناه:

    • اكتب الكلمة الأولى من الجملة بحرف كبير، وكذلك أسماء الأعلام والكلمات الأخرى حسب ما تتطلبه قاعدة أكثر تحديدًا.
  5. نمط files صالح: سلسلة نصية غير فارغة¹ تحدّد موقع ملف مستخدم في تمرين، نسبةً إلى مجلد التمرين. يمكن للنمط استخدام أحد العناصر النائبة التالية:

    • %{kebab_slug}: slug التمرين بصيغة kebab-case (مثل bit-manipulation)
    • %{snake_slug}: slug التمرين بصيغة snake_case (مثل bit_manipulation)
    • %{camel_slug}: slug التمرين بصيغة camelCase (مثل bitManipulation)
    • %{pascal_slug}: slug التمرين بصيغة PascalCase (مثل BitManipulation)
  6. سلسلة UUID فريدة من الإصدار 4: سلسلة تستوفي جميع الشروط التالية:

    • توجد مرة واحدة فقط في ملف 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
    

    يمكنك تشغيل configlet uuid لإنشاء UUID مناسب.

  7. الوسم tag الصالح للمحلّل: سلسلة نصية غير فارغة¹ منسّقة على شكل <category>:<thing>. يجب أن تكون قيمة <category> واحدة من:

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

يجب أن تكون قيمة <thing> سلسلة نصية غير فارغة¹.