diff --git a/src/lint/concepts.nim b/src/lint/concepts.nim index 8926723b..fbbe9e34 100644 --- a/src/lint/concepts.nim +++ b/src/lint/concepts.nim @@ -36,6 +36,28 @@ proc isEveryConceptLinksFileValid*(trackDir: Path): bool = if not isValidLinksFile(j, linksPath): result = false +proc isValidConceptConfig(data: JsonNode, path: Path): bool = + if isObject(data, "", path): + let checks = [ + hasString(data, "blurb", path, maxLen = 350), + hasArrayOfStrings(data, "authors", path, uniqueValues = true), + hasArrayOfStrings(data, "contributors", path, isRequired = false, + uniqueValues = true), + ] + result = allTrue(checks) + +proc isEveryConceptConfigValid*(trackDir: Path): bool = + let conceptsDir = trackDir / "concepts" + result = true + + if dirExists(conceptsDir): + for conceptDir in getSortedSubdirs(conceptsDir): + let configPath = conceptDir / ".meta" / "config.json" + let j = parseJsonFile(configPath, result) + if j != nil: + if not isValidConceptConfig(j, configPath): + result = false + proc conceptDocsExist*(trackDir: Path): 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 6500d4c8..7fdcbc6c 100644 --- a/src/lint/lint.nim +++ b/src/lint/lint.nim @@ -12,6 +12,7 @@ proc allChecksPass(trackDir: Path): 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