configlet lint


Το configlet χρησιμοποιείται κυρίως για έλεγχο με lint: ελέγχει αν τα αρχεία ρύθμισης ενός track είναι σωστά δομημένα, τόσο συντακτικά όσο και σημασιολογικά. Τα track με λανθασμένη ρύθμιση μπορεί να μη συγχρονίζονται σωστά, να φαίνονται λάθος στον ιστότοπο ή να προσφέρουν υποδεέστερη εμπειρία χρήστη, γι' αυτό οι έλεγχοι του configlet παίζουν σημαντικό ρόλο στη διατήρηση της ακεραιότητας του Exercism.

Χρήση

Μπορείς να χρησιμοποιήσεις την εντολή lint για να ελέγξεις ένα track.

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]

Κανόνες

Αυτοί είναι οι κανόνες που ελέγχει το lint.

Κανόνας: τα απαιτούμενα αρχεία υπάρχουν

Ο linter πρέπει να ελέγχει αν όλα τα απαιτούμενα αρχεία υπάρχουν. Τα αρχεία που δεν αφορούν συγκεκριμένη άσκηση και πρέπει να υπάρχουν είναι:

  • 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" πρέπει να είναι Boolean (λογική τιμή)
  • Το κλειδί "blurb" είναι υποχρεωτικό
  • Η τιμή του "blurb" πρέπει να είναι μη κενή συμβολοσειρά¹ με μήκος <= 400
  • Το κλειδί "version" είναι υποχρεωτικό
  • Η τιμή του "version" πρέπει να είναι ο ακέραιος 3
  • Το κλειδί "status.concept_exercises" είναι υποχρεωτικό
  • Η τιμή του "status.concept_exercises" πρέπει να είναι Boolean
  • Το κλειδί "status.test_runner" είναι υποχρεωτικό
  • Η τιμή του "status.test_runner" πρέπει να είναι Boolean
  • Το κλειδί "status.representer" είναι υποχρεωτικό
  • Η τιμή του "status.representer" πρέπει να είναι Boolean
  • Το κλειδί "status.analyzer" είναι υποχρεωτικό
  • Η τιμή του "status.analyzer" πρέπει να είναι Boolean
  • Το κλειδί "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" (χωρίς επικάλυψη)
    • Αν το track είναι 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" είναι υποχρεωτικό αν το track έχει μία ή περισσότερες προσεγγίσεις
  • Η τιμή του "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" δεν πρέπει να αντιστοιχούν σε κανένα από τα slug των ασκήσεων εννοιών ή εξάσκησης
  • Το κλειδί "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" πρέπει να είναι μη κενές συμβολοσειρές tag⁷ με μήκος <= 255
  • Οι τιμές του "concepts[].tags.all" δεν πρέπει να έχουν διπλότυπα
  • Το κλειδί "concepts[].tags.any" είναι προαιρετικό, εκτός αν το "concepts[].tags.all" είναι κενό
  • Η τιμή του "concepts[].tags.any" πρέπει να είναι πίνακας
  • Οι τιμές του "concepts[].tags.any" πρέπει να είναι μη κενές συμβολοσειρές tag⁷ με μήκος <= 255
  • Οι τιμές του "concepts[].tags.any" δεν πρέπει να έχουν διπλότυπα
  • Το κλειδί "concepts[].tags.not" είναι προαιρετικό
  • Η τιμή του "concepts[].tags.not" πρέπει να είναι πίνακας
  • Οι τιμές του "concepts[].tags.not" πρέπει να είναι μη κενές συμβολοσειρές tag⁷ με μήκος <= 255
  • Οι τιμές του "concepts[].tags.not" δεν πρέπει να έχουν διπλότυπα
  • Κάθε τιμή του "concepts" πρέπει να έχει ένα αρχείο concept/<concepts.slug>/about.md. Οι κανόνες ελέγχου με lint για αυτό το αρχείο ορίζονται παρακάτω.
  • Κάθε τιμή του "concepts" πρέπει να έχει ένα αρχείο concept/<concepts.slug>/introduction.md. Οι κανόνες ελέγχου με lint για αυτό το αρχείο ορίζονται παρακάτω.
  • Κάθε τιμή του "concepts" πρέπει να έχει ένα αρχείο concept/<concepts.slug>/links.json. Οι κανόνες ελέγχου με lint για αυτό το αρχείο ορίζονται παρακάτω.
  • Το κλειδί "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" πρέπει να χρησιμοποιούν μία από τις προκαθορισμένες τιμές tag

Κανόνας: το 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" (χωρίς επικάλυψη)
    • Αν το track είναι 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 είναι έγκυρο (αν υπάρχει)

  • Η έννοια κάθε placeholder έννοιας πρέπει να αντιστοιχεί στην ιδιότητα "concepts.slug" μίας από τις έννοιες στο config.json του track.

Κανόνας: το 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" (χωρίς επικάλυψη)
    • Αν το track είναι d ή plsql, τα αρχεία των "files.solution" και "files.test" μπορούν να επικαλύπτονται
  • Το κλειδί "language_versions" είναι προαιρετικό
  • Η τιμή του "language_versions" πρέπει να είναι συμβολοσειρά
  • Το κλειδί "test_runner" είναι προαιρετικό
  • Η τιμή του "test_runner" πρέπει να είναι Boolean
  • Το κλειδί "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" πρέπει να είναι μη κενές συμβολοσειρές tag⁷ με μήκος <= 255
  • Οι τιμές του "approaches[].tags.all" δεν πρέπει να έχουν διπλότυπα
  • Το κλειδί "approaches[].tags.any" είναι προαιρετικό, εκτός αν το "approaches[].tags.all" είναι κενό
  • Η τιμή του "approaches[].tags.any" πρέπει να είναι πίνακας
  • Οι τιμές του "approaches[].tags.any" πρέπει να είναι μη κενές συμβολοσειρές tag⁷ με μήκος <= 255
  • Οι τιμές του "approaches[].tags.any" δεν πρέπει να έχουν διπλότυπα
  • Το κλειδί "approaches[].tags.not" είναι προαιρετικό
  • Η τιμή του "approaches[].tags.not" πρέπει να είναι πίνακας
  • Οι τιμές του "approaches[].tags.not" πρέπει να είναι μη κενές συμβολοσειρές tag⁷ με μήκος <= 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 του track

Κανόνας: το 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: μια μη κενή συμβολοσειρά που ακολουθεί τις παρακάτω οδηγίες από το Chicago Manual of Style:

    • Γράφε με κεφαλαίο την πρώτη και την τελευταία λέξη τίτλων και υπότιτλων.
    • Γράφε με κεφαλαίο τις "σημαντικές" λέξεις (ουσιαστικά, αντωνυμίες, ρήματα, επίθετα, επιρρήματα και μερικούς συνδέσμους).
    • Γράφε με πεζό τους συνδέσμους and, but, for, or και nor.
    • Γράφε με πεζό τα άρθρα the, a και an.
    • Γράφε με πεζό τις προθέσεις, ανεξαρτήτως μήκους, εκτός όταν τονίζονται, χρησιμοποιούνται επιρρηματικά ή επιθετικά ή λειτουργούν ως σύνδεσμοι.
    • Γράφε με πεζό τις λέξεις to και as.
    • Γράφε με πεζό το δεύτερο μέρος των λατινικών ονομάτων ειδών.
  4. Συμβολοσειρά Sentence Case: μια μη κενή συμβολοσειρά που ακολουθεί τις παρακάτω οδηγίες:

    • Γράφε με κεφαλαίο την πρώτη λέξη της πρότασης, καθώς και τα κύρια ονόματα και άλλες λέξεις όπως απαιτείται από πιο συγκεκριμένο κανόνα.
  5. Έγκυρο μοτίβο files: Μια μη κενή συμβολοσειρά¹ που καθορίζει τη θέση ενός αρχείου που χρησιμοποιείται σε μια άσκηση, σχετική με τον κατάλογο της άσκησης. Ένα μοτίβο μπορεί να χρησιμοποιεί έναν από τους παρακάτω placeholders:

    • %{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 επιπέδου track ενός δεδομένου track του Exercism
    • Δεν υπάρχει στο αρχείο config.json επιπέδου track κανενός άλλου track του 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> πρέπει να είναι μη κενή συμβολοσειρά¹.