config.json


يصف ملف 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 (الأصعب). ويفسّر الموقع درجة الصعوبة على النحو التالي:
    • 1، 2، 3: سهل
    • 4، 5، 6، 7: متوسط
    • 8، 9، 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
      },
      ...
    ]
  }
}

مثال على حالة beta

{
  "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 التمارين المستبعَدة عند إخراج التمارين غير المنفَّذة في المسار.

قد تكون الأسباب التي تجعل مسارًا لا يرغب في تنفيذ تمرين ما كالتالي:

  • لا يمكن للغة أن تنفّذ التمرين تنفيذًا معقولًا. فمثلًا، يتطلّب تمرين lens-person أن تدعم اللغة العدسات.
  • لا يناسب موضوع التمرين اللغة. فمثلًا، قد لا يكون تمرين منخفض المستوى للتلاعب بالبتات منطقيًا في بعض اللغات عالية المستوى.

مثال

{
  "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: الأيقونة التي تُعرض للميزة. يمكنك اختيار أيقونة تراها مناسبة، بغض النظر عن اسمها. ويمكن استخدام الأيقونات التالية:
    • community
    • concurrency
    • cross-platform
    • documentation
    • dynamically-typed
    • easy
    • embeddable
    • evolving
    • expressive
    • extensible
    • fast
    • fun
    • functional
    • garbage-collected
    • general-purpose
    • homoiconic
    • immutable
    • interactive
    • interop
    • multi-paradigm
    • portable
    • powerful
    • productive
    • safe
    • scientific
    • small
    • stable
    • statically-typed
    • tooling
    • web
    • widely-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: يعمل على Windows
  • platform/mac: يعمل على Mac
  • platform/linux: يعمل على Linux
  • platform/ios: يعمل على iOS
  • platform/android: يعمل على Android
  • platform/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: Backends
  • used_for/cross_platform_development: التطوير متعدد المنصّات
  • used_for/embedded_systems: الأنظمة المدمجة
  • used_for/financial_systems: الأنظمة المالية
  • used_for/frontends: Frontends
  • used_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"
  ]
}