config.json


Die Datei config.json beschreibt die Konfiguration eines Tracks. Sie enthält wichtige Informationen wie die Übungen und Konzepte des Tracks.

Metadaten

Die folgenden Eigenschaften der obersten Ebene enthalten allgemeine Metadaten zum Track:

  • language: die Sprache des Tracks (z. B. "C#"). Die Länge darf höchstens 255 betragen. (erforderlich)
  • slug: die Sprache des Tracks als kleingeschriebener Kebab-Case-String (z. B. "csharp"). Die Länge darf höchstens 255 betragen. (erforderlich)
  • active: ein boolean-Wert, der angibt, ob der Track aktiv ist (d. h. ob Lernende dem Track auf der Website beitreten können) (erforderlich)
  • blurb: eine kurze Beschreibung der Sprache. Die Länge darf höchstens 400 betragen. (erforderlich)
  • version: die Version der Datei config.json (derzeit fest auf 3 gesetzt) (erforderlich)
  • online_editor: ein Objekt, das die Einstellungen für den Online-Editor beschreibt: (erforderlich)
    • indent_style: entweder "space" oder "tab" (erforderlich)
    • indent_size: die Einrückungsgröße als Ganzzahl (z. B. 4) (erforderlich)
    • highlightjs_language: die Sprachkennung für Highlight.js (siehe die vollständige Liste der Bezeichner) (optional)
  • status: ein Objekt, das beschreibt, welche v3-Funktionen aktiviert werden sollen: (erforderlich)
    • concept_exercises: ein boolean-Wert, der angibt, ob Konzeptübungen erstellt wurden (erforderlich). Wenn true, ändert sich die Oberfläche der Exercism-Website so, dass sie anzeigt, dass für den Track Konzeptübungen verfügbar sind.
    • test_runner: ein boolean-Wert, der angibt, ob ein Test-Runner implementiert wurde (erforderlich). Wenn true, schicken wir eingereichte Lösungen durch unsere Testinfrastruktur und zeigen die Ergebnisse auf der Website an. Die Website ermöglicht es Lernenden außerdem, einen Testlauf direkt im Online-Editor zu starten.
    • representer: ein boolean-Wert, der angibt, ob ein Representer implementiert wurde (erforderlich)
    • analyzer: ein boolean-Wert, der angibt, ob ein Analyzer implementiert wurde (erforderlich)
  • files: die Muster für die Speicherorte der Dateien, die in einer Übung verwendet werden, relativ zum Verzeichnis der Übung. (optional)
    • solution: Muster für die Stub-Implementierungsdatei(en) (optional)
    • test: Muster für die Testdatei(en) (optional)
    • example: Muster für die Beispiel-Implementierungsdatei(en) (optional)
    • exemplar: Muster für die Exemplar-Implementierungsdatei(en) (optional)
    • editor: zusätzliche Muster für schreibgeschützte Editor-Datei(en) (optional)
  • test_runner: ein Objekt, das den Test-Runner des Tracks beschreibt (falls vorhanden): (erforderlich, wenn status.test_runner true ist)
    • average_run_time: ein ganzzahliger number-Wert für die Anzahl der Sekunden, die der Test-Runner im Durchschnitt benötigt (z. B. 4) (erforderlich, wenn status.test_runner true ist)
  • approaches: ein Objekt mit Metadaten zu den Ansätzen des Tracks: (erforderlich, wenn der Track Ansätze hat)
    • snippet_extension: ein String-Wert für die Dateiendung der Snippet-Datei (z. B. rb) (erforderlich, wenn der Track Ansätze hat)

Dateien

Dieser Schlüssel wird verwendet, um Dateispeicherorte für den gesamten Track festzulegen. Statt dass Maintainer den Schlüssel files in den config.json-Dateien der Übungen manuell pflegen müssen, kann configlet ihn automatisch anhand dieser trackweiten Muster befüllen.

Die im Objekt files definierten Dateimuster unterstützen die folgenden Platzhalter:

  • %{kebab_slug}: der Übungs-Slug im kebab-case (z. B. bit-manipulation)
  • %{snake_slug}: der Übungs-Slug im snake_case (z. B. bit_manipulation)
  • %{camel_slug}: der Übungs-Slug im camelCase (z. B. bitManipulation)
  • %{pascal_slug}: der Übungs-Slug im PascalCase (z. B. BitManipulation)

Es wird Unterstützung zu configlet hinzugefügt, damit diese Muster verwendet werden können, um den Schlüssel files in der Datei .meta/config.json einer Übung zu befüllen.

Beispiel

{
  "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"
    ]
  }
}

Übungen

Der Schlüssel exercises auf oberster Ebene ist ein Objekt mit drei möglichen Schlüsseln:

  • concept: ein Array, das die Konzeptübungen des Tracks auflistet
  • practice: ein Array, das die Praxisübungen des Tracks auflistet
  • foregone: ein Array, das die Slugs der Übungen auflistet, die der Track nicht implementieren wird

Konzeptübungen

Jede Konzeptübung ist ein Eintrag im Array exercises.concept. Die Übungen werden auf der Website in derselben Reihenfolge angezeigt, in der sie in dieser Datei aufgelistet sind, und sollten der üblichen Reihenfolge entsprechen, in der sie gelöst werden sollten. Eine Konzeptübung besteht aus den folgenden Feldern:

  • uuid: eine V4-UUID, die die Übung eindeutig identifiziert. Die UUID muss sowohl innerhalb des Tracks als auch über alle Tracks hinweg eindeutig sein und darf sich niemals ändern
  • slug: der Slug der Übung, ein kleingeschriebener Kebab-Case-String. Der Slug muss innerhalb des Tracks über alle Slugs von Konzept- und Praxisübungen hinweg eindeutig sein. Die Länge darf höchstens 255 betragen.
  • name: der Name der Übung. Die Länge darf höchstens 255 betragen.
  • concepts: ein Array von Konzept-Slugs, die durch diese Konzeptübung vermittelt werden
  • prerequisites: ein Array von Konzept-Slugs, die freigeschaltet sein müssen, bevor Lernende mit dieser Übung beginnen können
  • status (optional): der Status der Übung, einer von "wip", "beta" "active" oder "deprecated"; Standard ist "active", wenn nichts angegeben wird
    • wip: Eine Übung in Arbeit, die noch nicht für die Öffentlichkeit bestimmt ist. Übungen mit diesem Tag werden Lernenden weder in der Benutzeroberfläche angezeigt noch für die Freischaltungslogik verwendet. Für Maintainer können sie sichtbar sein.
    • beta: Dies kennzeichnet aktive Übungen, die neu sind und zu denen wir Feedback möchten. Für diese Übungen zeigen wir auf der Website ein Beta-Label an, mit einer Handlungsaufforderung: „Bitte gib uns Feedback."
    • active: der normale Status aktiver Übungen
    • deprecated: Übungen, die Lernenden, die sie noch nicht begonnen haben, nicht mehr angezeigt werden (in diesem Stadium nicht nutzbar). Siehe Veraltete Übungen für weitere Informationen.

Beispiel

{
  "exercises": {
    "concept": [
      {
        "slug": "cars-assemble",
        "name": "Cars, Assemble!",
        "uuid": "93fbc7cf-3a7e-4450-ad22-e30129c36bb9",
        "concepts": [
          "if-statements",
          "numbers"
        ],
        "prerequisites": [
          "basics"
        ]
      },
      ...
    ]
  }
}

Beispiel für eine Übung in Arbeit

{
  "exercises": {
    "concept": [
      {
        "slug": "cars-assemble",
        "name": "Cars, Assemble!",
        "uuid": "93fbc7cf-3a7e-4450-ad22-e30129c36bb9",
        "concepts": [
          "if-statements",
          "numbers"
        ],
        "prerequisites": [
          "basics"
        ],
        "status": "wip"
      },
      ...
    ]
  }
}

Praxisübungen

Jede Praxisübung ist ein Eintrag im Array exercises.practice. Eine Praxisübung besteht aus den folgenden Feldern:

  • uuid: eine V4-UUID, die die Übung eindeutig identifiziert. Die UUID muss sowohl innerhalb des Tracks als auch über alle Tracks hinweg eindeutig sein und darf sich niemals ändern
  • slug: der Slug der Übung, ein kleingeschriebener Kebab-Case-String. Der Slug muss innerhalb des Tracks über alle Slugs von Konzept- und Praxisübungen hinweg eindeutig sein. Die Länge darf höchstens 255 betragen.
  • name: der Name der Übung. Die Länge darf höchstens 255 betragen.
  • practices: ein Array von Konzept-Slugs, bei denen die Übung Lernenden hilft, sie zu üben
  • prerequisites: ein Array von Konzept-Slugs, die freigeschaltet sein müssen, bevor Lernende mit der Übung beginnen können
  • difficulty: eine Zahl, die die Schwierigkeit der Übung angibt. Die Zahl muss im Bereich von 1 (am einfachsten) bis 10 (am schwierigsten) liegen. Die Website interpretiert die Schwierigkeit wie folgt:
    • 1,2,3: leicht
    • 4,5,6,7: mittel
    • 8,9,10: schwer
  • status (optional): der Status der Übung, entweder "wip", "beta", "active" oder "deprecated"; Standard ist "active", wenn nichts angegeben wird
    • wip: Eine Übung in Arbeit, die noch nicht für die Öffentlichkeit bestimmt ist. Übungen mit diesem Tag werden Lernenden weder in der Benutzeroberfläche angezeigt noch für die Freischaltungslogik verwendet. Für Maintainer können sie sichtbar sein.
    • beta: Dies kennzeichnet aktive Übungen, die neu sind und zu denen wir Feedback möchten. Für diese Übungen zeigen wir auf der Website ein Beta-Label an, mit einer Handlungsaufforderung: „Bitte gib uns Feedback"
    • active: der normale Status aktiver Übungen
    • deprecated: Übungen, die Lernenden, die sie noch nicht begonnen haben, nicht mehr angezeigt werden (in diesem Stadium nicht nutzbar).

Die „empfohlene Reihenfolge" der Praxisübungen auf der Website entspricht der Reihenfolge der Übungen im Array practice.

Beispiel

{
  "exercises": {
    "practice": [
      {
        "slug": "leap",
        "name": "Leap",
        "uuid": "8ba15933-29a2-49b1-a9ce-70474bad3007",
        "practices": [
          "if-statements",
          "numbers",
          "operator-precedence"
        ],
        "prerequisites": [
          "if-statements",
          "numbers"
        ],
        "difficulty": 1
      },
      ...
    ]
  }
}

Beispiel für 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"
      },
      ...
    ]
  }
}

Ausgelassene Übungen

Wenn ein Track weiß, dass er eine Übung nicht implementieren möchte, die im Problem-Specifications-Repository definiert ist, kann der Slug dieser Übung zum Schlüssel exercises.foregone hinzugefügt werden. configlet ignoriert ausgelassene Übungen, wenn es die nicht implementierten Übungen des Tracks ausgibt.

Gründe, warum ein Track eine Übung nicht implementieren möchte, könnten sein:

  • Die Übung lässt sich mit der Sprache nicht sinnvoll implementieren. Ein Beispiel: Die lens-person-Übung erfordert, dass die Sprache Lenses unterstützt.
  • Das Thema der Übung passt nicht zur Sprache. Für manche High-Level-Sprachen ergibt eine Bit-Manipulationsübung auf niedriger Ebene beispielsweise keinen Sinn.

Beispiel

{
  "exercises": {
    "foregone": [
      "lens-person"
    ]
  }
}

Konzepte

Jedes Konzept ist ein Eintrag im Array concepts auf oberster Ebene. Ein Konzept besteht aus den folgenden Feldern:

  • uuid: eine V4-UUID, die das Konzept eindeutig identifiziert. Die UUID muss sowohl innerhalb des Tracks als auch über alle Tracks hinweg eindeutig sein und darf sich niemals ändern
  • slug: der Slug des Konzepts, ein kleingeschriebener Kebab-Case-String. Der Slug muss innerhalb des Tracks über alle Konzepte hinweg eindeutig sein. Die Länge darf höchstens 255 betragen.
  • name: der Name des Konzepts. Die Länge darf höchstens 255 betragen.
  • tags: legt die Bedingungen fest, unter denen eine Einsendung mit einem Ansatz verknüpft wird. (optional)
    • all: ein Array von Tags, die alle in einer Einsendung vorhanden sein müssen (optional, es sei denn, any hat keine Elemente)
    • any: ein Array von Tags, von denen mindestens einer in einer Einsendung vorhanden sein muss (optional, es sei denn, all hat keine Elemente)
    • not: keiner der Tags darf in einer Einsendung vorhanden sein (optional)

Beispiel

{
  "concepts": [
    {
      "uuid": "b9a421b2-c5ff-4213-bd6d-b886da31ea0d",
      "slug": "numbers",
      "name": "Numbers",
      "tags": {
        "all": [
          "concept:number"
        ]
      }
    }
  ]
}

Hauptmerkmale

Die Hauptmerkmale einer Sprache beschreiben knapp, was die wichtigsten Merkmale der Sprache sind. Sie sollen die interessanteren Merkmale einer Sprache potenziellen Lernenden näherbringen. Die Titel sollten möglichst wenig Fachjargon verwenden, denn Lernende kennen die Bedeutung sprachspezifischen Jargons möglicherweise nicht, bevor sie diese Sprache lernen.

Die Hauptmerkmale werden im Feld key_features auf oberster Ebene angegeben, das als Array von Objekten mit den folgenden Feldern definiert ist:

  • title: eine knappe Überschrift für das Hauptmerkmal. Die Länge darf höchstens 25 betragen. Markdown wird nicht unterstützt.
  • content: eine Beschreibung des Hauptmerkmals. Die Länge darf höchstens 100 betragen. Markdown wird nicht unterstützt.
  • icon: das Symbol, das für das Merkmal angezeigt wird. Du kannst ein Symbol auswählen, das deiner Meinung nach passt, unabhängig von seinem Namen. Die folgenden Symbole können verwendet werden:
    • 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

Du kannst dir das visuelle Erscheinungsbild dieser Symbole im Abschnitt zu den Symbolen der Hauptmerkmale ansehen.

Es müssen genau 6 Hauptmerkmale angegeben werden.

Beispiel

{
  "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

Tracks können mit Tags versehen werden, was die Suche nach Tracks mit einer bestimmten Tag-Kombination ermöglicht.

Ein Track sollte seine Tags anhand der allgemeinen Verwendung seiner Sprache wählen. Stell dir zum Beispiel vor, eine lernende Person denkt: „Ich möchte maschinelles Lernen machen, welche Sprache sollte ich wählen?", oder „Ich möchte funktionale Programmierung lernen, welche Sprache sollte ich wählen?". Wenn deine Sprache ein guter Kandidat wäre, gib ihr dieses Tag. Wenn deine Sprache einige funktionale Ideen unterstützt, diese aber selten genutzt werden, oder nur wenige Leute maschinelles Lernen damit machen, dann vergib diese Tags nicht.

Tags werden im Feld tags auf oberster Ebene angegeben, das als Array von Strings definiert ist. Die folgenden Tags können verwendet werden (nach Kategorie gruppiert):

Paradigmen

  • paradigm/array: die Sprache ist eine Array-Programmiersprache
  • paradigm/declarative: die Sprache unterstützt einen deklarativen Programmierstil
  • paradigm/functional: die Sprache unterstützt einen funktionalen Programmierstil
  • paradigm/imperative: die Sprache unterstützt einen imperativen Programmierstil
  • paradigm/logic: die Sprache unterstützt einen logikbasierten Programmierstil
  • paradigm/object_oriented: die Sprache unterstützt einen objektorientierten Programmierstil
  • paradigm/procedural: die Sprache unterstützt einen prozeduralen Programmierstil
  • paradigm/stack-oriented: die Sprache unterstützt einen stapelorientierten Programmierstil

Typisierung

  • typing/static: die Sprache verwendet statische Typisierung
  • typing/gradual: die Sprache verwendet graduelle Typisierung
  • typing/dynamic: die Sprache verwendet dynamische Typisierung
  • typing/strong: die Sprache verwendet starke Typisierung
  • typing/weak: die Sprache verwendet schwache Typisierung

Ausführungsmodus

  • execution_mode/compiled: der Code wird zuerst kompiliert, bevor er ausgeführt wird
  • execution_mode/interpreted: der Code wird direkt interpretiert

Plattform

  • platform/windows: läuft unter Windows
  • platform/mac: läuft unter Mac
  • platform/linux: läuft unter Linux
  • platform/ios: läuft unter iOS
  • platform/android: läuft unter Android
  • platform/web: läuft im Browser

Laufzeitumgebung

  • runtime/standalone_executable: läuft als eigenständige ausführbare Datei
  • runtime/language_specific: läuft auf einer sprachspezifischen Laufzeitumgebung
  • runtime/clr: läuft auf der Common Language Runtime (.NET)
  • runtime/jvm: läuft auf der JVM (Java)
  • runtime/beam: läuft auf der BEAM (Erlang)
  • runtime/wasmtime: läuft auf Wasmtime (WebAssembly)

Verwendet für

  • used_for/artificial_intelligence: Künstliche Intelligenz
  • used_for/backends: Backends
  • used_for/cross_platform_development: Cross-Platform-Entwicklung
  • used_for/embedded_systems: Eingebettete Systeme
  • used_for/financial_systems: Finanzsysteme
  • used_for/frontends: Frontends
  • used_for/games: Spiele
  • used_for/guis: GUIs
  • used_for/mobile: Mobile
  • used_for/robotics: Robotik
  • used_for/scientific_calculations: Wissenschaftliche Berechnungen
  • used_for/scripts: Skripte
  • used_for/web_development: Webentwicklung

Beachte, dass es völlig in Ordnung ist, mehrere Tags aus einer einzigen Kategorie aufzunehmen.

Beispiel

{
  "tags": [
    "paradigm/declarative",
    "paradigm/functional",
    "paradigm/object_oriented",
    "platform/linux",
    "platform/windows",
    "runtime/jvm"
  ]
}

Beispiel

Dies ist ein Beispiel dafür, wie eine gültige config.json-Datei aussehen kann:

{
  "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"
  ]
}