الاستخدام الأساسي لـ 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.jsondocs/ABOUT.mddocs/INSTALLATION.mddocs/LEARNING.mddocs/RESOURCES.mddocs/SNIPPET.txtdocs/TESTS.mdexercises/shared/.docs/help.mdexercises/shared/.docs/tests.mdالملفات الخاصة بتمارين المفاهيم والتي يجب أن تكون موجودة هي:
exercises/concept/<slug>/.docs/hints.mdexercises/concept/<slug>/.docs/instructions.mdexercises/concept/<slug>/.docs/introduction.mdexercises/concept/<slug>/.meta/config.jsonستكون هناك قائمة مماثلة لتمارين التدريب، لكننا لم نحدّد المواصفات لذلك بعد.
يجب أن يحتوي كل مفهوم مُدرج في config.json على الملفات التالية:
concepts/<slug>/about.mdconcepts/<slug>/introduction.mdconcepts/<slug>/links.jsonيجب أن يخضع ملف config.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" إحدى قيم الوسوم المعرّفة مسبقًا
"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²## General أو ## X. <task>، حيث يطابق X عنوان رقم المهمة في instructions.md
## 1. Do X
"concepts.slug" لأحد المفاهيم في ملف config.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²introduction.md أو مجلد شقيق"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" على تكرارات"approaches[].slug" في ملف .approaches/config.json
"approaches[].slug" في ملف .approaches/config.json
approaches.snippet_extension في ملف config.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" (دون تداخل)"articles[].slug" في ملف .articles/config.json
"articles[].slug" في ملف .articles/config.json
"[].url" مطلوبة"[].url" URL"[].description" مطلوبة"[].description" سلسلة نصية غير فارغة¹"[].icon_url" اختيارية"[].icon_url" URL"blurb" مطلوب"blurb" سلسلة نصية غير فارغة¹ بطول <= 350"authors" مطلوب"authors" مصفوفة"authors" سلاسل نصية غير فارغة¹"authors" على تكرارات"authors" دون حساسية لحالة الأحرف"contributors" اختياري"contributors" مصفوفة"contributors" سلاسل نصية غير فارغة¹"contributors" على تكرارات"contributors" دون حساسية لحالة الأحرف"authors" أو "contributors" (دون تداخل)سلسلة نصية غير فارغة: سلسلة تحتوي على حرف واحد على الأقل غير مسافة بيضاء.
سلسلة بصيغة kebab-case: سلسلة تحتوي فقط على محارف ضمن النطاق [a-z0-9]، مفصولة اختياريًا بشرطات (مثل "two-fer"). يجب أن تطابق التعبير النمطي: ^[a-z0-9]+(-[a-z0-9]+)*$
سلسلة بصيغة Title Case: سلسلة نصية غير فارغة تتبع الإرشادات التالية من دليل شيكاغو للأنماط:
سلسلة بصيغة Sentence Case: سلسلة نصية غير فارغة تتبع الإرشادات أدناه:
نمط 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)سلسلة UUID فريدة من الإصدار 4: سلسلة تستوفي جميع الشروط التالية:
config.json على مستوى المسار لمسار Exercism معيّنconfig.json على مستوى المسار لأي مسار Exercism آخرcanonical-data.json في https://github.com/exercism/problem-specifications^[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 مناسب.
الوسم tag الصالح للمحلّل: سلسلة نصية غير فارغة¹ منسّقة على شكل <category>:<thing>.
يجب أن تكون قيمة <category> واحدة من:
paradigm (مثل paradigm:functional)technique (مثل technique:recursion)construct (مثل construct:bitwise-and)uses (مثل uses:DateTime.add_seconds)يجب أن تكون قيمة <thing> سلسلة نصية غير فارغة¹.