From 84a44c924655f582fc5f0060e904d800a820cdc6 Mon Sep 17 00:00:00 2001 From: ee7 <45465154+ee7@users.noreply.github.com> Date: Thu, 16 Sep 2021 23:37:12 +0200 Subject: [PATCH 1/2] lint(track_config): check for empty `practices` With this commit, `configlet lint` now checks that a track-level `config.json` file follows the below rule: - The `exercises.practice[].practices` value must be a non-empty array of strings if `exercises.practice[].status` is not equal to `deprecated` The check is currently implemented as a warning. That is, a violation does not by itself cause configlet to exit with a non-zero exit code. --- src/lint/track_config.nim | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/lint/track_config.nim b/src/lint/track_config.nim index bd409c95..0c0f7479 100644 --- a/src/lint/track_config.nim +++ b/src/lint/track_config.nim @@ -542,6 +542,8 @@ proc checkExercisesPCP(exercises: seq[ConceptExercise] | seq[PracticeExercise]; when exercises is seq[ConceptExercise]: var conceptExercisesWithEmptyPrereqs = newSeq[string]() + else: + var countPracticeExercisesWithEmptyPractices = 0 for exercise in exercises: let conceptsOrPractices = @@ -555,11 +557,13 @@ proc checkExercisesPCP(exercises: seq[ConceptExercise] | seq[PracticeExercise]; case status of sMissing, sBeta, sActive: # Check either `concepts` or `practices` - # TODO: enable the `practices` check when more tracks have populated them. - when exercise is ConceptExercise: - if conceptsOrPractices.len == 0: + if conceptsOrPractices.len == 0: + when exercise is ConceptExercise: let msg = statusMsg(exercise, &"an empty array of `{conceptsOrPracticesStr}`") b.setFalseAndPrint(msg, path) + else: + # TODO: Make each empty `practices` an error, not a warning. + inc countPracticeExercisesWithEmptyPractices # Check `prerequisites` when exercise is ConceptExercise: @@ -601,6 +605,11 @@ proc checkExercisesPCP(exercises: seq[ConceptExercise] | seq[PracticeExercise]; msg.add " each have an empty array of `prerequisites`, but only one " & "Concept Exercise is allowed to have that" b.setFalseAndPrint(msg, path) + else: + if countPracticeExercisesWithEmptyPractices > 0: + let msg = &"{countPracticeExercisesWithEmptyPractices} user-facing " & + "Practice Exercises have an empty `practices` array" + warn(msg, path) proc checkExerciseSlugsAndForegone(exercises: Exercises; b: var bool; path: Path) = From 862ebfe7bd23be8e26772c723f23f9c96450dace Mon Sep 17 00:00:00 2001 From: ee7 <45465154+ee7@users.noreply.github.com> Date: Thu, 16 Sep 2021 23:37:13 +0200 Subject: [PATCH 2/2] lint(track_config): check for empty PE `prerequisites` With this commit, `configlet lint` now checks that a track-level `config.json` file follows the below rule: - The `exercises.practice[].prerequisites` value must be a non-empty array of strings if `exercises.practice[].status` is not equal to `deprecated` The check is currently implemented as a warning. That is, a violation does not by itself cause configlet to exit with a non-zero exit code. --- src/lint/track_config.nim | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/lint/track_config.nim b/src/lint/track_config.nim index 0c0f7479..20d5d714 100644 --- a/src/lint/track_config.nim +++ b/src/lint/track_config.nim @@ -544,6 +544,7 @@ proc checkExercisesPCP(exercises: seq[ConceptExercise] | seq[PracticeExercise]; var conceptExercisesWithEmptyPrereqs = newSeq[string]() else: var countPracticeExercisesWithEmptyPractices = 0 + var countPracticeExercisesWithEmptyPrereqs = 0 for exercise in exercises: let conceptsOrPractices = @@ -576,12 +577,10 @@ proc checkExercisesPCP(exercises: seq[ConceptExercise] | seq[PracticeExercise]; "empty array of `prerequisites`" b.setFalseAndPrint(msg, path) else: - # TODO: enable the Practice Exercise `prerequisites` check when more - # tracks have populated them. - if false: - if exercise.prerequisites.len == 0: - let msg = statusMsg(exercise, "an empty array of `prerequisites`") - b.setFalseAndPrint(msg, path) + # TODO: Make an empty Practice Exercise `prerequisites` array an error, + # not a warning + if exercise.prerequisites.len == 0: + inc countPracticeExercisesWithEmptyPrereqs of sDeprecated: # Check either `concepts` or `practices` @@ -610,6 +609,10 @@ proc checkExercisesPCP(exercises: seq[ConceptExercise] | seq[PracticeExercise]; let msg = &"{countPracticeExercisesWithEmptyPractices} user-facing " & "Practice Exercises have an empty `practices` array" warn(msg, path) + if countPracticeExercisesWithEmptyPrereqs > 0: + let msg = &"{countPracticeExercisesWithEmptyPrereqs} user-facing " & + "Practice Exercises have an empty `prerequisites` array" + warn(msg, path) proc checkExerciseSlugsAndForegone(exercises: Exercises; b: var bool; path: Path) =