diff --git a/cmd/lint.go b/cmd/lint.go index 1ee5056..dc0d2aa 100644 --- a/cmd/lint.go +++ b/cmd/lint.go @@ -89,6 +89,10 @@ func lintTrack(path string) bool { check: missingMetadata, msg: "An implementation for '%v' was found, but config.json does not reference this exercise.", }, + { + check: missingReadme, + msg: "The implementation for '%v' is missing a README.", + }, { check: missingSolution, msg: "The implementation for '%v' is missing an example solution.", @@ -201,6 +205,25 @@ func missingSolution(t track.Track) []string { return slugs } +func missingReadme(t track.Track) []string { + readmes := map[string]bool{} + for _, exercise := range t.Exercises { + readmes[exercise.Slug] = exercise.HasReadme() + } + // Don't complain about missing readmes in foregone exercises. + for _, slug := range t.Config.ForegoneSlugs { + readmes[slug] = true + } + + slugs := []string{} + for slug, ok := range readmes { + if !ok { + slugs = append(slugs, slug) + } + } + return slugs +} + func missingTestSuite(t track.Track) []string { tests := map[string]bool{} for _, exercise := range t.Exercises { diff --git a/cmd/lint_example_test.go b/cmd/lint_example_test.go index c2dac02..2c2083d 100644 --- a/cmd/lint_example_test.go +++ b/cmd/lint_example_test.go @@ -16,6 +16,7 @@ func ExampleLint() { lintTrack(filepath.FromSlash("../fixtures/numbers")) // Output: // -> An exercise with slug 'bajillion' is referenced in config.json, but no implementation was found. + // -> The implementation for 'four' is missing a README. // -> The implementation for 'three' is missing an example solution. // -> The implementation for 'two' is missing a test suite. // -> The exercise 'one' was found in config.json, but does not have a UUID. diff --git a/cmd/lint_test.go b/cmd/lint_test.go index 44ee1ae..e360631 100644 --- a/cmd/lint_test.go +++ b/cmd/lint_test.go @@ -110,6 +110,27 @@ func TestMissingMetadata(t *testing.T) { assert.Equal(t, "cherry", slugs[1]) } +func TestMissingReadme(t *testing.T) { + track := track.Track{ + Exercises: []track.Exercise{ + {Slug: "apple"}, + {Slug: "banana", ReadmePath: "README.md"}, + {Slug: "cherry"}, + }, + } + + slugs := missingReadme(track) + + if len(slugs) != 2 { + t.Fatalf("Expected missing solutions in 2 exercises, missing in %d", len(slugs)) + } + + sort.Strings(slugs) + + assert.Equal(t, "apple", slugs[0]) + assert.Equal(t, "cherry", slugs[1]) +} + func TestMissingSolution(t *testing.T) { track := track.Track{ Exercises: []track.Exercise{ diff --git a/fixtures/numbers/config.json b/fixtures/numbers/config.json index e8f36e9..73ae56c 100644 --- a/fixtures/numbers/config.json +++ b/fixtures/numbers/config.json @@ -23,6 +23,12 @@ "topics": [], "difficulty": 1 }, + { + "uuid": "444", + "slug": "four", + "topics": [], + "difficulty": 1 + }, { "uuid": "ddd", "slug": "bajillion", diff --git a/fixtures/numbers/exercises/four/example.ext b/fixtures/numbers/exercises/four/example.ext new file mode 100644 index 0000000..e69de29 diff --git a/fixtures/numbers/exercises/four/test.ext b/fixtures/numbers/exercises/four/test.ext new file mode 100644 index 0000000..e69de29 diff --git a/track/track_test.go b/track/track_test.go index 6eb5e1f..d77fd2f 100644 --- a/track/track_test.go +++ b/track/track_test.go @@ -19,6 +19,7 @@ func TestNewTrack(t *testing.T) { "one": false, "two": false, "three": false, + "four": false, } assert.Equal(t, len(slugs), len(track.Exercises))