يصف ملف config.json إعدادات المسار. وهو يحتوي على معلومات بالغة الأهمية مثل تمارين المسار ومفاهيمه.
تحتوي الخصائص التالية في المستوى الأعلى على بيانات وصفية عامة عن المسار:
language: لغة المسار (مثل "C#"). يجب ألا يزيد طوله على 255. (مطلوب)slug: لغة المسار مكتوبةً بسلسلة نصية بحروف صغيرة بصيغة kebab-case (مثل "csharp"). يجب ألا يزيد طوله على 255. (مطلوب)active: قيمة boolean تشير إلى ما إذا كان المسار نشطًا (أي أن الطلاب يمكنهم الانضمام إلى المسار على الموقع) (مطلوب)blurb: وصف مختصر للغة. يجب ألا يزيد طوله على 400. (مطلوب)version: إصدار ملف config.json (مثبَّت حاليًا على 3) (مطلوب)online_editor: كائن يصف الإعدادات المستخدمة في المحرر الإلكتروني: (مطلوب)
indent_style: إما "space" أو "tab" (مطلوب)indent_size: حجم الإزاحة كعدد صحيح (مثل 4) (مطلوب)highlightjs_language: معرّف اللغة في Highlight.js (راجع القائمة الكاملة للمعرّفات) (اختياري)status: كائن يصف ميزات v3 التي ينبغي تفعيلها: (مطلوب)
concept_exercises: قيمة boolean تشير إلى ما إذا كانت تمارين المفاهيم قد بُنيت (مطلوب). عندما تكون true تتغيّر واجهة موقع Exercism لتدلّ على أن تمارين المفاهيم متاحة للمسار.test_runner: قيمة boolean تشير إلى ما إذا كان مشغّل الاختبارات قد نُفِّذ (مطلوب). عندما تكون true نمرّر الحلول المُقدَّمة عبر بنية الاختبار لدينا ونعرض النتائج على الموقع. كما يتيح الموقع للطلاب بدء تشغيل اختبار من داخل المحرر الإلكتروني.representer: قيمة boolean تشير إلى ما إذا كان المُمثِّل قد نُفِّذ (مطلوب)analyzer: قيمة boolean تشير إلى ما إذا كان المحلّل قد نُفِّذ (مطلوب)files: الأنماط التي تحدّد مواقع الملفات المستخدمة في التمرين، نسبةً إلى مجلد التمرين. (اختياري)
solution: نمط ملف (ملفات) التنفيذ المبدئي (اختياري)test: نمط ملف (ملفات) الاختبار (اختياري)example: نمط ملف (ملفات) التنفيذ المِثال (اختياري)exemplar: نمط ملف (ملفات) التنفيذ النموذجي (اختياري)editor: أنماط إضافية لملف (ملفات) المحرر للقراءة فقط (اختياري)test_runner: كائن يصف مشغّل الاختبارات الخاص بالمسار (إن وُجد): (مطلوب إذا كانت status.test_runner تساوي true)
average_run_time: قيمة number صحيحة تمثّل عدد الثواني التي يستغرقها مشغّل الاختبارات في المتوسط (مثل 4) (مطلوب إذا كانت status.test_runner تساوي true)approaches: كائن يحتوي على بيانات وصفية عن أساليب المسار: (مطلوب إذا كان للمسار أي أساليب)
snippet_extension: قيمة من نوع سلسلة نصية تُستخدم كامتداد لملف المقتطف (مثل rb) (مطلوب إذا كان للمسار أي أساليب)يُستخدم هذا المفتاح لتحديد مواقع الملفات على مستوى المسار كله. فبدلًا من أن يضطر مسؤولو الصيانة إلى ضبط مفتاح files يدويًا في ملفات config.json الخاصة بالتمارين، يمكن لـ configlet تعبئته تلقائيًا باستخدام هذه الأنماط على مستوى المسار.
تدعم أنماط الملفات المعرّفة في كائن files العناصر النائبة التالية:
%{kebab_slug}: معرّف التمرين بصيغة kebab-case (مثل bit-manipulation)%{snake_slug}: معرّف التمرين بصيغة snake_case (مثل bit_manipulation)%{camel_slug}: معرّف التمرين بصيغة camelCase (مثل bitManipulation)%{pascal_slug}: معرّف التمرين بصيغة PascalCase (مثل BitManipulation)ستُضاف دعم إلى configlet لاستخدام هذه الأنماط لتعبئة مفتاح files في ملف .meta/config.json الخاص بالتمرين.
{
"language": "C#",
"slug": "csharp",
"active": true,
"status": {
"concept_exercises": true,
"test_runner": true,
"representer": false,
"analyzer": false
},
"blurb": "C# is a modern, object-oriented language with lots of great features, such as type-inference and async/await. The tooling is excellent, and there is extensive, well-written documentation.",
"version": 3,
"online_editor": {
"indent_style": "space",
"indent_size": 4,
"highlightjs_language": "csharp"
},
"test_runner": {
"average_run_time": 2
},
"files": {
"solution": [
"%{pascal_slug}.cs"
],
"test": [
"%{pascal_slug}Tests.cs"
],
"example": [
".meta/Example.cs"
],
"exemplar": [
".meta/Exemplar.cs"
]
}
}
مفتاح exercises في المستوى الأعلى كائن يمكن أن يضم ثلاثة مفاتيح:
concept: مصفوفة تسرد تمارين المفاهيم في المسارpractice: مصفوفة تسرد التمارين التطبيقية في المسارforegone: مصفوفة تسرد معرّفات التمارين التي لن ينفّذها المساركل تمرين مفاهيمي هو عنصر في مصفوفة exercises.concept.
تُرتَّب التمارين على الموقع بالترتيب نفسه الذي ترد به في هذا الملف، وينبغي أن يوافق الترتيب المعتاد لحلّها.
يتكوّن التمرين المفاهيمي من الحقول التالية:
uuid: معرّف UUID من الإصدار V4 يميّز التمرين تمييزًا فريدًا. ويجب أن يكون هذا المعرّف فريدًا داخل المسار وفي كل المسارات معًا، ويجب ألا يتغيّر أبدًاslug: معرّف التمرين، وهو سلسلة نصية بحروف صغيرة بصيغة kebab-case. ويجب أن يكون المعرّف فريدًا بين جميع معرّفات تمارين المفاهيم والتمارين التطبيقية داخل المسار. ويجب ألا يزيد طوله على 255.name: اسم التمرين. يجب ألا يزيد طوله على 255.concepts: مصفوفة من معرّفات المفاهيم التي يعلّمها تمرين المفاهيم هذاprerequisites: مصفوفة من معرّفات المفاهيم التي يجب فتحها قبل أن يتمكّن الطالب من بدء هذا التمرينstatus (اختياري): حالة التمرين، وهي إحدى "wip" أو "beta" أو "active" أو "deprecated"؛ وتكون "active" افتراضيًا إذا لم تُحدَّد
wip: تمرين قيد الإنجاز لم يجهز بعد للاستخدام العام. لن تُعرض التمارين الموسومة بهذا الوسم على الطلاب في واجهة المستخدم، ولن تُستخدم في منطق الفتح. وقد تظهر لمسؤولي الصيانة.beta: يدلّ على تمارين نشطة جديدة نرغب في الحصول على ملاحظات بشأنها. ونعرض على الموقع وسم beta لهذه التمارين، مع دعوة إلى الإجراء نصّها «من فضلكم شاركونا ملاحظاتكم».active: الحالة الطبيعية للتمارين النشطةdeprecated: التمارين التي لم تعد تُعرض على الطلاب الذين لم يبدؤوها (غير قابلة للاستخدام في هذه المرحلة). راجع التمارين المهملة لمزيد من المعلومات.{
"exercises": {
"concept": [
{
"slug": "cars-assemble",
"name": "Cars, Assemble!",
"uuid": "93fbc7cf-3a7e-4450-ad22-e30129c36bb9",
"concepts": [
"if-statements",
"numbers"
],
"prerequisites": [
"basics"
]
},
...
]
}
}
{
"exercises": {
"concept": [
{
"slug": "cars-assemble",
"name": "Cars, Assemble!",
"uuid": "93fbc7cf-3a7e-4450-ad22-e30129c36bb9",
"concepts": [
"if-statements",
"numbers"
],
"prerequisites": [
"basics"
],
"status": "wip"
},
...
]
}
}
كل تمرين تطبيقي هو عنصر في مصفوفة exercises.practice. ويتكوّن التمرين التطبيقي من الحقول التالية:
uuid: معرّف UUID من الإصدار V4 يميّز التمرين تمييزًا فريدًا. ويجب أن يكون هذا المعرّف فريدًا داخل المسار وفي كل المسارات معًا، ويجب ألا يتغيّر أبدًاslug: معرّف التمرين، وهو سلسلة نصية بحروف صغيرة بصيغة kebab-case. ويجب أن يكون المعرّف فريدًا بين جميع معرّفات تمارين المفاهيم والتمارين التطبيقية داخل المسار. ويجب ألا يزيد طوله على 255.name: اسم التمرين. يجب ألا يزيد طوله على 255.practices: مصفوفة من معرّفات المفاهيم التي يساعد التمرين الطلاب على التدرّب عليهاprerequisites: مصفوفة من معرّفات المفاهيم التي يجب فتحها قبل أن يتمكّن الطالب من بدء التمرينdifficulty: عدد يشير إلى صعوبة التمرين. ويجب أن يكون هذا العدد في النطاق من 1 (الأسهل) إلى 10 (الأصعب). ويفسّر الموقع درجة الصعوبة على النحو التالي:
status (اختياري): حالة التمرين، وهي إما "wip" أو "beta" أو "active" أو "deprecated"؛ وتكون "active" افتراضيًا إذا لم تُحدَّد
wip: تمرين قيد الإنجاز لم يجهز بعد للاستخدام العام. لن تُعرض التمارين الموسومة بهذا الوسم على الطلاب في واجهة المستخدم، ولن تُستخدم في منطق الفتح. وقد تظهر لمسؤولي الصيانة.beta: يدلّ على تمارين نشطة جديدة نرغب في الحصول على ملاحظات بشأنها. ونعرض على الموقع وسم beta لهذه التمارين، مع دعوة إلى الإجراء نصّها «من فضلكم شاركونا ملاحظاتكم»active: الحالة الطبيعية للتمارين النشطةdeprecated: التمارين التي لم تعد تُعرض على الطلاب الذين لم يبدؤوها (غير قابلة للاستخدام في هذه المرحلة).يتوافق «الترتيب الموصى به» للتمارين التطبيقية على الموقع مع ترتيب التمارين في مصفوفة practice.
{
"exercises": {
"practice": [
{
"slug": "leap",
"name": "Leap",
"uuid": "8ba15933-29a2-49b1-a9ce-70474bad3007",
"practices": [
"if-statements",
"numbers",
"operator-precedence"
],
"prerequisites": [
"if-statements",
"numbers"
],
"difficulty": 1
},
...
]
}
}
{
"exercises": {
"practice": [
{
"slug": "leap",
"name": "Leap",
"uuid": "8ba15933-29a2-49b1-a9ce-70474bad3007",
"practices": [
"if-statements",
"numbers",
"operator-precedence"
],
"prerequisites": [
"if-statements",
"numbers"
],
"difficulty": 1,
"status": "beta"
},
...
]
}
}
إذا عرف المسار أنه لا يريد تنفيذ تمرين معرّف في مستودع Problem Specifications، فيمكن إضافة معرّف ذلك التمرين إلى المفتاح exercises.foregone. وسيتجاهل configlet التمارين المستبعَدة عند إخراج التمارين غير المنفَّذة في المسار.
قد تكون الأسباب التي تجعل مسارًا لا يرغب في تنفيذ تمرين ما كالتالي:
{
"exercises": {
"foregone": [
"lens-person"
]
}
}
كل مفهوم هو عنصر في مصفوفة concepts في المستوى الأعلى. ويتكوّن المفهوم من الحقول التالية:
uuid: معرّف UUID من الإصدار V4 يميّز المفهوم تمييزًا فريدًا. ويجب أن يكون هذا المعرّف فريدًا داخل المسار وفي كل المسارات معًا، ويجب ألا يتغيّر أبدًاslug: معرّف المفهوم، وهو سلسلة نصية بحروف صغيرة بصيغة kebab-case. ويجب أن يكون المعرّف فريدًا بين جميع المفاهيم داخل المسار. ويجب ألا يزيد طوله على 255.name: اسم المفهوم. يجب ألا يزيد طوله على 255.tags: حدّد الشروط التي يُربط بها الحل المُقدَّم بأحد الأساليب. (اختياري)
all: مصفوفة وسوم يجب أن تكون جميعها موجودة في الحل المُقدَّم (اختياري، ما لم تكن any بلا عناصر)any: مصفوفة وسوم يجب أن يكون أحدها على الأقل موجودًا في الحل المُقدَّم (اختياري، ما لم تكن all بلا عناصر)not: يجب ألا يكون أي من الوسوم موجودًا في الحل المُقدَّم (اختياري){
"concepts": [
{
"uuid": "b9a421b2-c5ff-4213-bd6d-b886da31ea0d",
"slug": "numbers",
"name": "Numbers",
"tags": {
"all": [
"concept:number"
]
}
}
]
}
تصف الميزات الرئيسية للغة بإيجاز أهم ما تتميّز به اللغة. والغرض منها إبراز الميزات الأكثر إثارة للاهتمام في اللغة للطلاب المحتملين. وينبغي أن تسعى العناوين إلى استخدام أقل قدر ممكن من المصطلحات التقنية، مع الأخذ في الاعتبار أن الطلاب قد لا يعرفون معنى المصطلحات الخاصة بلغة ما قبل تعلّم تلك اللغة.
تُحدَّد الميزات الرئيسية في حقل key_features في المستوى الأعلى، وهو معرّف كمصفوفة من الكائنات بالحقول التالية:
title: عنوان موجز للميزة الرئيسية. يجب ألا يزيد طوله على 25. صيغة Markdown غير مدعومة.content: وصف للميزة الرئيسية. يجب ألا يزيد طوله على 100. صيغة Markdown غير مدعومة.icon: الأيقونة التي تُعرض للميزة. يمكنك اختيار أيقونة تراها مناسبة، بغض النظر عن اسمها. ويمكن استخدام الأيقونات التالية:
communityconcurrencycross-platformdocumentationdynamically-typedeasyembeddableevolvingexpressiveextensiblefastfunfunctionalgarbage-collectedgeneral-purposehomoiconicimmutableinteractiveinteropmulti-paradigmportablepowerfulproductivesafescientificsmallstablestatically-typedtoolingwebwidely-usedيمكنك الاطّلاع على الشكل المرئي لهذه الأيقونات في قسم أيقونات الميزات الرئيسية.
يجب تحديد 6 ميزات رئيسية بالضبط.
{
"key_features": [
{
"title": "Fault-tolerant",
"content": "Elixir runs on the Erlang VM, known for running low-latency, distributed and fault-tolerant systems.",
"icon": "safe"
},
...
],
}
يمكن وسم المسارات بوسوم، ما يتيح البحث عن المسارات ذات مجموعة وسوم معيّنة.
ينبغي أن يختار المسار وسومه بناءً على الاستخدام العام للغة. فمثلًا، تخيّل طالبًا يفكّر: «أرغب في العمل في تعلّم الآلة، فما اللغة التي أختارها؟»، أو «أرغب في تعلّم البرمجة الوظيفية، فما اللغة التي أختارها؟». إذا كانت لغتك مرشّحًا جيدًا، فأضف إليها ذلك الوسم. أما إذا كانت لغتك تدعم بعض الأفكار الوظيفية لكنها نادرًا ما تُستخدم، أو يستخدم قلة من الناس تعلّم الآلة بها لكن ذلك نادر، فلا تُضِف تلك الوسوم.
تُحدَّد الوسوم في حقل tags في المستوى الأعلى، وهو معرّف كمصفوفة من السلاسل النصية. ويمكن استخدام الوسوم التالية (مجمّعة حسب الفئة):
paradigm/array: اللغة لغة برمجة مصفوفيةparadigm/declarative: اللغة تدعم أسلوب البرمجة التصريحيparadigm/functional: اللغة تدعم أسلوب البرمجة الوظيفيةparadigm/imperative: اللغة تدعم أسلوب البرمجة الأمريةparadigm/logic: اللغة تدعم أسلوب البرمجة المنطقيةparadigm/object_oriented: اللغة تدعم أسلوب البرمجة كائنية التوجهparadigm/procedural: اللغة تدعم أسلوب البرمجة الإجرائيةparadigm/stack-oriented: اللغة تدعم أسلوب البرمجة الموجّه نحو المكدّسtyping/static: اللغة تستخدم التنميط الساكنtyping/gradual: اللغة تستخدم التنميط التدريجيtyping/dynamic: اللغة تستخدم التنميط الديناميكيtyping/strong: اللغة تستخدم التنميط القويtyping/weak: اللغة تستخدم التنميط الضعيفexecution_mode/compiled: يُترجم الكود أولًا قبل تنفيذهexecution_mode/interpreted: يُفسَّر الكود مباشرةplatform/windows: يعمل على Windowsplatform/mac: يعمل على Macplatform/linux: يعمل على Linuxplatform/ios: يعمل على iOSplatform/android: يعمل على Androidplatform/web: يعمل في المتصفحruntime/standalone_executable: يعمل كملف تنفيذي مستقلruntime/language_specific: يعمل على بيئة تشغيل خاصة باللغةruntime/clr: يعمل على Common Language Runtime (.NET)runtime/jvm: يعمل على JVM (Java)runtime/beam: يعمل على BEAM (Erlang)runtime/wasmtime: يعمل على Wasmtime (WebAssembly)used_for/artificial_intelligence: الذكاء الاصطناعيused_for/backends: Backendsused_for/cross_platform_development: التطوير متعدد المنصّاتused_for/embedded_systems: الأنظمة المدمجةused_for/financial_systems: الأنظمة الماليةused_for/frontends: Frontendsused_for/games: الألعابused_for/guis: واجهات المستخدم الرسوميةused_for/mobile: الأجهزة المحمولةused_for/robotics: الروبوتاتused_for/scientific_calculations: الحسابات العلميةused_for/scripts: النصوص البرمجيةused_for/web_development: تطوير الويبلاحظ أنه لا بأس إطلاقًا في تضمين عدة وسوم من فئة واحدة.
مثال
{
"tags": [
"paradigm/declarative",
"paradigm/functional",
"paradigm/object_oriented",
"platform/linux",
"platform/windows",
"runtime/jvm"
]
}
هذا مثال لما يمكن أن يبدو عليه ملف config.json صالح:
{
"language": "C#",
"slug": "csharp",
"active": true,
"status": {
"concept_exercises": true,
"test_runner": true,
"representer": false,
"analyzer": false
},
"blurb": "C# is a modern, object-oriented language with lots of great features, such as type-inference and async/await. The tooling is excellent, and there is extensive, well-written documentation.",
"version": 3,
"online_editor": {
"indent_style": "space",
"indent_size": 4,
"highlightjs_language": "csharp"
},
"test_runner": {
"average_run_time": 2
},
"files": {
"solution": [
"%{pascal_slug}.cs"
],
"test": [
"%{pascal_slug}Tests.cs"
],
"example": [
".meta/Example.cs"
],
"exemplar": [
".meta/Exemplar.cs"
]
},
"exercises": {
"concept": [
{
"slug": "lucians-luscious-lasagna",
"name": "Lucian's Luscious Lasagna",
"uuid": "7d358894-4fbd-4c91-b49f-d68f1c5aa6bc",
"concepts": [
"basics"
],
"prerequisites": []
},
{
"slug": "cars-assemble",
"name": "Cars, Assemble!",
"uuid": "93fbc7cf-3a7e-4450-ad22-e30129c36bb9",
"concepts": [
"if-statements",
"numbers"
],
"prerequisites": [
"basics"
],
"status": "wip"
}
],
"practice": [
{
"slug": "hello-world",
"name": "Hello, World!",
"uuid": "6c88f46b-5acb-4fae-a6ec-b48ae3f8168f",
"practices": [
"strings"
],
"prerequisites": [
"basics"
],
"difficulty": 1
},
{
"slug": "leap",
"name": "Leap",
"uuid": "8ba15933-29a2-49b1-a9ce-70474bad3007",
"practices": [
"if-statements",
"numbers",
"operator-precedence"
],
"prerequisites": [
"if-statements",
"numbers"
],
"difficulty": 2,
"status": "beta"
}
]
},
"concepts": [
{
"uuid": "2eb4a463-355f-46ef-ac55-a75ec5afdf86",
"slug": "basics",
"name": "Basics"
},
{
"uuid": "4466e33e-dcd2-4b1f-9d9d-2c4315bf5188",
"slug": "if-statements",
"name": "If Statements"
},
{
"uuid": "b9a421b2-c5ff-4213-bd6d-b886da31ea0d",
"slug": "numbers",
"name": "Numbers"
},
{
"uuid": "7a86561d-173b-45c0-a53c-1ffd7b9ff259",
"slug": "strings",
"name": "Strings"
}
],
"key_features": [
{
"title": "Modern",
"content": "C# is a modern, fast-evolving language.",
"icon": "expressive"
},
{
"title": "Cross-platform",
"content": "C# runs on almost any platform and chipset.",
"icon": "cross-platform"
},
{
"title": "Multi-paradigm",
"content": "C# is primarily an object-oriented language, but also has lots of functional features.",
"icon": "multi-paradigm"
},
{
"title": "General purpose",
"content": "C# can be used for a wide variety of workloads, like websites, console applications, and even games.",
"icon": "general-purpose"
},
{
"title": "Tooling",
"content": "C# has excellent tooling, with linting and advanced refactoring options built-in.",
"icon": "tooling"
},
{
"title": "Documentation",
"content": "Documentation is excellent and exhaustive, making it easy to get started with C#.",
"icon": "documentation"
}
],
"tags": [
"paradigm/declarative",
"paradigm/functional",
"paradigm/object_oriented",
"platform/linux",
"platform/windows",
"runtime/jvm"
]
}