-
-
Notifications
You must be signed in to change notification settings - Fork 14
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
lint: add initial checks for approaches and articles #704
Merged
Merged
Changes from 2 commits
Commits
Show all changes
13 commits
Select commit
Hold shift + click to select a range
d8a8c7d
lint: check approaches and articles
ee7 0e70d2b
lint(approaches_and_articles): inline `isDirValid`
ee7 d79953b
clint(approaches_and_articles): add dots to `DirKind` strings
ee7 6cc4380
lint(approaches_and_articles): error for 8 newlines then non-newline
ee7 3adba39
lint(approaches_and_articles): do not error for missing `introduction`
ee7 a260510
lint(articles_and_approaches): error for missing `config.json`
ee7 6747ce1
lint: print that approaches/articles were linted
ee7 c5ee39e
lint(approaches_and_articles), helpers: error for missing slug dir
ee7 0300ae6
lint(approaches_and_articles): improve msg for missing dir
ee7 fe94cf2
lint(approaches_and_articles): error for missing intro/content/snippet
ee7 5e710b2
lint(approaches_and_articles): remove an `if result`
ee7 abe6d59
lint(approaches_and_articles): error for dir not in config slugs
ee7 fe35e86
lint(approaches_and_articles): fix whitespace
ee7 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
import std/[json, strformat, strutils] | ||
import ".."/helpers | ||
import "."/validators | ||
|
||
type | ||
DirKind = enum | ||
dkApproaches = "approaches" | ||
dkArticles = "articles" | ||
ee7 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
proc hasValidIntroduction(data: JsonNode, path: Path): bool = | ||
ee7 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
const k = "introduction" | ||
if hasObject(data, k, path): | ||
let d = data[k] | ||
let checks = [ | ||
hasArrayOfStrings(d, "authors", path, k, uniqueValues = true), | ||
hasArrayOfStrings(d, "contributors", path, k, isRequired = false), | ||
] | ||
result = allTrue(checks) | ||
|
||
proc isValidApproachOrArticle(data: JsonNode, context: string, | ||
path: Path): bool = | ||
if isObject(data, context, path): | ||
let checks = [ | ||
hasString(data, "uuid", path, context, checkIsUuid = true), | ||
hasString(data, "slug", path, context, checkIsKebab = true), | ||
ee7 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
hasString(data, "title", path, context, maxLen = 255), | ||
hasString(data, "blurb", path, context, maxLen = 280), | ||
hasArrayOfStrings(data, "authors", path, context, uniqueValues = true), | ||
hasArrayOfStrings(data, "contributors", path, context, | ||
isRequired = false), | ||
] | ||
result = allTrue(checks) | ||
|
||
proc isValidConfig(data: JsonNode, path: Path, dk: DirKind): bool = | ||
if isObject(data, jsonRoot, path): | ||
let checks = [ | ||
if dk == dkApproaches: hasValidIntroduction(data, path) else: true, | ||
hasArrayOf(data, $dk, path, isValidApproachOrArticle, isRequired = false), | ||
] | ||
result = allTrue(checks) | ||
|
||
proc isConfigMissingOrValid(dir: Path, dk: DirKind): bool = | ||
result = true | ||
let configPath = dir / &".{dk}" / "config.json" | ||
if fileExists(configPath): | ||
let j = parseJsonFile(configPath, result) | ||
if j != nil: | ||
if not isValidConfig(j, configPath, dk): | ||
result = false | ||
|
||
proc isEverySnippetValid(exerciseDir: Path, dk: DirKind): bool = | ||
result = true | ||
for dir in getSortedSubdirs(exerciseDir / &".{dk}"): | ||
let snippetPath = block: | ||
let ext = if dk == dkApproaches: "txt" else: "md" | ||
dir / &"snippet.{ext}" | ||
if fileExists(snippetPath): | ||
let contents = readFile(snippetPath) | ||
var numLines = 0 | ||
for line in contents.splitLines(): | ||
if not (line.startsWith("```") and dk == dkArticles): | ||
ee7 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
inc numLines | ||
dec numLines # Allow 8 lines with a final newline. | ||
ee7 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
const maxNumLines = 8 | ||
if numLines > maxNumLines: | ||
let msg = &"The file is {numLines} lines long, but it must be at " & | ||
&"most {maxNumLines} lines long" | ||
result.setFalseAndPrint(msg, snippetPath) | ||
|
||
proc isEveryApproachAndArticleValid*(trackDir: Path): bool = | ||
result = true | ||
for exerciseKind in ["concept", "practice"]: | ||
for exerciseDir in getSortedSubdirs(trackDir / "exercises" / exerciseKind): | ||
for dk in DirKind: | ||
if not isConfigMissingOrValid(exerciseDir, dk): | ||
result = false | ||
if not isEverySnippetValid(exerciseDir, dk): | ||
result = false |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
DirKind
isn't a great name. Do we have a name for something that is an approach or article?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
They are part of the Dig Deeper section, maybe something like that?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We could do something like
DigDeeperKind
, but then dots in the enum string representations are bad.If this is blocking, please suggest a name.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
DigDeeperDirKind
? That's bad too. This is not blocking