diff --git a/src/lint/concepts.nim b/src/lint/concepts.nim index c32df6820..cbc48e8e0 100644 --- a/src/lint/concepts.nim +++ b/src/lint/concepts.nim @@ -36,6 +36,27 @@ proc isEveryConceptLinksFileValid*(trackDir: string): bool = if not isValidLinksFile(j, linksPath): result = false +proc isValidConceptConfig(data: JsonNode, path: string): bool = + if isObject(data, "", path): + let checks = [ + hasString(data, "blurb", path, maxLen = 350), + hasArrayOfStrings(data, "", "authors", path), + hasArrayOfStrings(data, "", "contributors", path, isRequired = false), + ] + result = allTrue(checks) + +proc isEveryConceptConfigValid*(trackDir: string): bool = + let conceptsDir = trackDir / "concepts" + result = true + + if dirExists(conceptsDir): + for subdir in getSortedSubdirs(conceptsDir): + let configPath = subdir / ".meta" / "config.json" + let j = parseJsonFile(configPath, result) + if j != nil: + if not isValidConceptConfig(j, configPath): + result = false + proc conceptDocsExist*(trackDir: string): bool = ## Returns true if every subdirectory in `trackDir/concepts` has the required ## Markdown files. diff --git a/src/lint/lint.nim b/src/lint/lint.nim index 4465c6744..2a9f49e39 100644 --- a/src/lint/lint.nim +++ b/src/lint/lint.nim @@ -12,6 +12,7 @@ proc allChecksPass(trackDir: string): bool = practiceExerciseDocsExist(trackDir), conceptDocsExist(trackDir), isEveryConceptLinksFileValid(trackDir), + isEveryConceptConfigValid(trackDir), isEveryConceptExerciseConfigValid(trackDir), isEveryPracticeExerciseConfigValid(trackDir), ] @@ -32,6 +33,7 @@ Basic linting finished successfully: language, slug, active, blurb, version, status, online_editor, key_features, tags - Every concept has the required .md files - Every concept has a valid links.json file +- Every concept has a valid .meta/config.json file - Every concept exercise has the required .md files - Every concept exercise has a valid .meta/config.json file - Every practice exercise has the required .md files