From 97a731b4ecdbc83d067cca97edb6e5655ad12859 Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Sat, 1 May 2021 18:55:59 +0200 Subject: [PATCH] lint: require some arrays to have unique items (#296) With this commit, `configlet lint` now checks that the value of each of the below keys is an array with distinct elements. Track config: - `exercises.concept.concepts` - `exercises.concept.prerequisites` - `exercises.practice.practices` - `exercises.practice.prerequisites` Concept Exercise config: - `authors` - `contributors` - `forked_from` Practice Exercise config: - `authors` - `contributors` --- src/lint/concept_exercises.nim | 8 +++++--- src/lint/practice_exercises.nim | 6 ++++-- src/lint/track_config.nim | 12 ++++++++---- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/lint/concept_exercises.nim b/src/lint/concept_exercises.nim index e5c2dc1c..d62dc1c6 100644 --- a/src/lint/concept_exercises.nim +++ b/src/lint/concept_exercises.nim @@ -17,10 +17,12 @@ proc isValidConceptExerciseConfig(data: JsonNode, path: Path): bool = if isObject(data, "", path): let checks = [ hasString(data, "blurb", path, maxLen = 350), - hasArrayOfStrings(data, "authors", path), - hasArrayOfStrings(data, "contributors", path, isRequired = false), + hasArrayOfStrings(data, "authors", path, uniqueValues = true), + hasArrayOfStrings(data, "contributors", path, isRequired = false, + uniqueValues = true), hasValidFiles(data, path), - hasArrayOfStrings(data, "forked_from", path, isRequired = false), + hasArrayOfStrings(data, "forked_from", path, isRequired = false, + uniqueValues = true), hasString(data, "language_versions", path, isRequired = false), hasString(data, "icon", path, isRequired = false, checkIsKebab = true), ] diff --git a/src/lint/practice_exercises.nim b/src/lint/practice_exercises.nim index 53f14054..46a13f81 100644 --- a/src/lint/practice_exercises.nim +++ b/src/lint/practice_exercises.nim @@ -18,8 +18,10 @@ proc isValidPracticeExerciseConfig(data: JsonNode, path: Path): bool = # TODO: Enable the `files` checks after the tracks have had some time to update. let checks = [ hasString(data, "blurb", path, maxLen = 350), - hasArrayOfStrings(data, "authors", path, isRequired = false), - hasArrayOfStrings(data, "contributors", path, isRequired = false), + hasArrayOfStrings(data, "authors", path, isRequired = false, + uniqueValues = true), + hasArrayOfStrings(data, "contributors", path, isRequired = false, + uniqueValues = true), if false: hasValidFiles(data, path) else: true, hasString(data, "language_versions", path, isRequired = false), ] diff --git a/src/lint/track_config.nim b/src/lint/track_config.nim index 2bc00bc1..85829241 100644 --- a/src/lint/track_config.nim +++ b/src/lint/track_config.nim @@ -81,9 +81,11 @@ proc isValidConceptExercise(data: JsonNode; context: string; path: Path): bool = hasString(data, "uuid", path, context, checkIsUuid = true), hasBoolean(data, "deprecated", path, context, isRequired = false), hasArrayOfStrings(data, "concepts", path, context, - allowedArrayLen = 0..int.high, checkIsKebab = true), + allowedArrayLen = 0..int.high, checkIsKebab = true, + uniqueValues = true), hasArrayOfStrings(data, "prerequisites", path, context, - allowedArrayLen = 0..int.high, checkIsKebab = true), + allowedArrayLen = 0..int.high, checkIsKebab = true, + uniqueValues = true), hasString(data, "status", path, context, isRequired = false, allowed = statuses), ] @@ -99,9 +101,11 @@ proc isValidPracticeExercise(data: JsonNode; context: string; hasBoolean(data, "deprecated", path, context, isRequired = false), hasInteger(data, "difficulty", path, context, allowed = 0..10), hasArrayOfStrings(data, "practices", path, context, - allowedArrayLen = 0..int.high, checkIsKebab = true), + allowedArrayLen = 0..int.high, checkIsKebab = true, + uniqueValues = true), hasArrayOfStrings(data, "prerequisites", path, context, - allowedArrayLen = 0..int.high, checkIsKebab = true), + allowedArrayLen = 0..int.high, checkIsKebab = true, + uniqueValues = true), hasString(data, "status", path, context, isRequired = false, allowed = statuses), ]