Skip to content
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: begin linting concept exercise config.json #169

Merged
merged 8 commits into from
Feb 5, 2021

Conversation

ee7
Copy link
Member

@ee7 ee7 commented Feb 2, 2021

WIP proof-of-concept with templates, rather than a macro as done previously.

The error messages are currently bad. I'll write more later.

Copy link
Member

@ErikSchierboom ErikSchierboom left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great first step towards linting the config.json file.

Comment on lines 30 to 35
let j =
try:
parseFile(configPath)
except:
writeError("JSON parsing error", getCurrentExceptionMsg())
continue
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can probably extract this to a helper function too as we'll have similar code for other files too.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed - let's do it after this PR. We can refactor this code to use the helper function too:

proc isValidTrackConfig(trackDir: string): bool =
result = true
let configJsonPath = trackDir / "config.json"
if fileExists(configJsonPath):
try:
let j = parseFile(configJsonPath)
except:
writeError("JSON parsing error", getCurrentExceptionMsg())

This code should be improved later too - it currently assumes that any exception raised during parseFile is a parsing error, even if it's an IOError.

src/lint/validators.nim Outdated Show resolved Hide resolved
src/lint/concept_exercises.nim Outdated Show resolved Hide resolved
@ee7 ee7 force-pushed the lint-concept-exercise-configs branch from 7d2e999 to 41f7e4c Compare February 3, 2021 15:13
@ee7
Copy link
Member Author

ee7 commented Feb 3, 2021

I fixed some of the bugs. It might be worthwhile now to checkout this code locally and test it a bit.

Note that this PR is still missing the rules that aren't purely schema-like checks. I'll suggest adding those in another PR if it doesn't end up being convenient to do it here.

The error messages look particularly bad when there's more than one error in a single file. I'm leaning towards combining them per-file under that file's name.

@ee7
Copy link
Member Author

ee7 commented Feb 4, 2021

What should the exit code of configlet lint be if the exercises/concept directory does not exist?

@ErikSchierboom
Copy link
Member

What should the exit code of configlet lint be if the exercises/concept directory does not exist?

For now, it should be a success exit code (0). Once we check to see if the concept directories and their config.json entries are in sync, we can error.

@ee7
Copy link
Member Author

ee7 commented Feb 4, 2021

Some example output with up-to-date track repos:

bash
Directory does not exist:
exercises/concept

Basic linting finished successfully:
- config.json exists and is valid JSON
- Every concept has the required .md files and links.json file
- Every concept exercise has the required .md files and a .meta/config.json file
- Every concept exercise .meta/config.json file is valid
csharp/fsharp/elixir
Basic linting finished successfully:
- config.json exists and is valid JSON
- Every concept has the required .md files and links.json file
- Every concept exercise has the required .md files and a .meta/config.json file
- Every concept exercise .meta/config.json file is valid
go
Array is empty: 'files.test':
exercises/concept/comments/.meta/config.json

Missing key: 'exercism_username':
exercises/concept/conditionals/.meta/config.json

Array is empty: 'forked_from':
exercises/concept/conditionals/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/constants/.meta/config.json

Array is empty: 'files.test':
exercises/concept/constants/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/errors/.meta/config.json

Array is empty: 'files.test':
exercises/concept/errors/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/errors/.meta/config.json
julia
Missing file:
exercises/concept/annalyns-infiltration/.docs/hints.md

Missing file:
exercises/concept/annalyns-infiltration/.docs/introduction.md

Missing file:
exercises/concept/annalyns-infiltration2/.docs/hints.md

Missing file:
exercises/concept/annalyns-infiltration2/.docs/introduction.md

Missing file:
exercises/concept/emoji-times/.docs/introduction.md

Missing file:
exercises/concept/exercism-matrix/.docs/hints.md

Missing file:
exercises/concept/vehicle-purchase/.docs/hints.md

Missing file:
concepts/abstract-types/introduction.md

Missing file:
concepts/composite-types/introduction.md

Missing file:
concepts/constants/introduction.md

Missing file:
concepts/matrices-concatenation/introduction.md

Missing file:
concepts/matrices-indices/introduction.md

Missing file:
concepts/matrices-iteration/introduction.md

Missing file:
concepts/matrices-mutation/introduction.md

Missing file:
concepts/methods/introduction.md

Missing file:
concepts/symbols/introduction.md

Not an array: 'forked_from':
exercises/concept/annalyns-infiltration/.meta/config.json

Not an array: 'forked_from':
exercises/concept/annalyns-infiltration2/.meta/config.json

Array is empty: 'contributors':
exercises/concept/emoji-times/.meta/config.json

Not an array: 'forked_from':
exercises/concept/emoji-times/.meta/config.json

Array is empty: 'contributors':
exercises/concept/encounters/.meta/config.json

Not an array: 'forked_from':
exercises/concept/encounters/.meta/config.json

Array is empty: 'contributors':
exercises/concept/exercism-matrix/.meta/config.json

Not an array: 'forked_from':
exercises/concept/exercism-matrix/.meta/config.json

Array is empty: 'contributors':
exercises/concept/fibonacci-iterator/.meta/config.json

Not an array: 'forked_from':
exercises/concept/fibonacci-iterator/.meta/config.json

Array is empty: 'contributors':
exercises/concept/lasagna/.meta/config.json

Not an array: 'forked_from':
exercises/concept/lasagna/.meta/config.json

Array is empty: 'contributors':
exercises/concept/leap/.meta/config.json

Not an array: 'forked_from':
exercises/concept/leap/.meta/config.json

Array is empty: 'contributors':
exercises/concept/vehicle-purchase/.meta/config.json

Not an array: 'forked_from':
exercises/concept/vehicle-purchase/.meta/config.json
python
Missing file:
concepts/lists/introduction.md

Missing file:
concepts/str-methods/introduction.md

Missing file:
concepts/string-formatting/introduction.md

Missing key: 'files':
exercises/concept/conditionals/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/pretty-leaflet/.meta/config.json

Array is empty: 'files.test':
exercises/concept/pretty-leaflet/.meta/config.json
ruby
Missing file:
concepts/exceptions/introduction.md

Array is empty: 'files.solution':
exercises/concept/amusement-park-rides/.meta/config.json

Array is empty: 'files.test':
exercises/concept/amusement-park-rides/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/arrays/.meta/config.json

Array is empty: 'files.test':
exercises/concept/arrays/.meta/config.json

Missing key: 'authors':
exercises/concept/conditionals-ternary/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/exceptions/.meta/config.json

Array is empty: 'files.test':
exercises/concept/exceptions/.meta/config.json

Missing key: 'authors':
exercises/concept/floating-point-numbers/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/floating-point-numbers/.meta/config.json

Array is empty: 'files.test':
exercises/concept/floating-point-numbers/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/instance-variables/.meta/config.json

Array is empty: 'files.test':
exercises/concept/instance-variables/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/numbers/.meta/config.json

Array is empty: 'files.test':
exercises/concept/numbers/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/strings/.meta/config.json

Array is empty: 'files.test':
exercises/concept/strings/.meta/config.json
rust
Missing file:
concepts/floats/introduction.md

Missing file:
concepts/hashmaps/introduction.md

Missing file:
concepts/intro-fn/introduction.md

Missing file:
concepts/intro-option/introduction.md

Missing file:
concepts/intro-types/introduction.md

Missing file:
concepts/match.pattern-matching/introduction.md

Missing file:
concepts/numbers/introduction.md

Missing file:
concepts/signedness/introduction.md

Missing file:
concepts/string-use/introduction.md

Missing file:
concepts/strings-basic/introduction.md

Missing key: 'authors':
exercises/concept/entry-api/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/entry-api/.meta/config.json

Array is empty: 'files.test':
exercises/concept/entry-api/.meta/config.json

Missing key: 'authors':
exercises/concept/enums/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/enums/.meta/config.json

Array is empty: 'files.test':
exercises/concept/enums/.meta/config.json

Missing key: 'authors':
exercises/concept/numbers/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/numbers/.meta/config.json

Array is empty: 'files.test':
exercises/concept/numbers/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/options/.meta/config.json

Array is empty: 'files.test':
exercises/concept/options/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/string-vs-str/.meta/config.json

Array is empty: 'files.test':
exercises/concept/string-vs-str/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/structs/.meta/config.json

Array is empty: 'files.test':
exercises/concept/structs/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/tuples/.meta/config.json

Array is empty: 'files.test':
exercises/concept/tuples/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/vec-macro/.meta/config.json

Array is empty: 'files.test':
exercises/concept/vec-macro/.meta/config.json

@ee7
Copy link
Member Author

ee7 commented Feb 4, 2021

@ErikSchierboom
Regarding #160, could you suggest what you'd like to see for, say, the Python output above?

And would you like to group output per-file like this?

exercises/concept/pretty-leaflet/.meta/config.json
- The 'files.solution' array in the concept exercise config.json file must contain at least one file
- The 'files.test' array in the concept exercise config.json file must contain at least one file

Copy link
Member

@ErikSchierboom ErikSchierboom left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regarding the sample output, I'm not finding things out about my spec :)

bash

Directory does not exist:
exercises/concept

I think it's better if we don't show this because it is not really a requirement at the moment.

go

Array is empty: 'forked_from':
exercises/concept/conditionals/.meta/config.json

I think I was too harsh in the spec. We should allow an empty array for optional array properties. I've submitted a spec update PR.

Missing key: 'exercism_username':
exercises/concept/conditionals/.meta/config.json

The spec was outdated, this field should be optional. PR submitted

julia

Missing file:
exercises/concept/annalyns-infiltration/.docs/hints.md

There are a lot of missing files. These exercises are almost all in a wip state (which we've only recently added). I need to update the spec to indicate what to do in this case (probably a warning instead of an error).

Array is empty: 'contributors':
exercises/concept/encounters/.meta/config.json

See above comment on allowing an empty array for optional array properties.

Not an array: 'forked_from':
exercises/concept/encounters/.meta/config.json

This is a good catch!

Comment on lines 7 to 17
proc isObject*(data: JsonNode, key: string, path: string,
isRequired = true): bool =
result = true
if key.len == 0:
if data.kind != JObject:
writeError("JSON root is not an object", path)
elif data.hasKey(key):
if data[key].kind != JObject:
writeError("Not an object: " & q(key), path)
elif isRequired:
writeError("Missing key: " & q(key), path)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure about allowing the key parameter to be empty. I did not understand what the empty string did in if isObject(data, "", path):. I came up with two alternatives:

  • Split this up into two functions
  • Make the context a parameter with a default value

I personally prefer the second option, as the checkArrayOfStrings template has the same property (and empty context being specified).

Comment on lines 22 to 23
if data[key].getStr().len == 0:
writeError("String is zero-length: " & q(key), path)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I noticed that the spec did not indicate that non-empty strings also not be non-blank (as in: not consist of only white space). I've just updated the spec. Could you update this check to reflect that the string not be empty after trimming?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

Comment on lines 45 to 46
elif item.getStr().len == 0:
writeError("Array contains zero-length string: " & format(context, key), path)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment regarding non-blank strings.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

@ee7
Copy link
Member Author

ee7 commented Feb 4, 2021

Pushed some new commits.

I've run configlet lint on every track repo - see below for the configlet output with 7e6f2ed using up-to-date track repos.

The first list looks suspiciously short, but I haven't checked how many tracks have merged the v3 PR.

Tracks that exit with 1

go
Array is empty: 'files.test':
exercises/concept/comments/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/constants/.meta/config.json

Array is empty: 'files.test':
exercises/concept/constants/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/errors/.meta/config.json

Array is empty: 'files.test':
exercises/concept/errors/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/errors/.meta/config.json
java
Array is empty: 'files.exemplar':
exercises/concept/basics/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/bird-watcher/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/booleans/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/chars/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/classes/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/conditionals/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/constructors/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/inheritance/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/interfaces/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/numbers/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/strings/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/switch-statement/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/ternary-operators/.meta/config.json
julia
Missing file:
exercises/concept/annalyns-infiltration/.docs/hints.md

Missing file:
exercises/concept/annalyns-infiltration/.docs/introduction.md

Missing file:
exercises/concept/annalyns-infiltration2/.docs/hints.md

Missing file:
exercises/concept/annalyns-infiltration2/.docs/introduction.md

Missing file:
exercises/concept/emoji-times/.docs/introduction.md

Missing file:
exercises/concept/exercism-matrix/.docs/hints.md

Missing file:
exercises/concept/vehicle-purchase/.docs/hints.md

Missing file:
concepts/abstract-types/introduction.md

Missing file:
concepts/composite-types/introduction.md

Missing file:
concepts/constants/introduction.md

Missing file:
concepts/matrices-concatenation/introduction.md

Missing file:
concepts/matrices-indices/introduction.md

Missing file:
concepts/matrices-iteration/introduction.md

Missing file:
concepts/matrices-mutation/introduction.md

Missing file:
concepts/methods/introduction.md

Missing file:
concepts/symbols/introduction.md

Not an array: 'forked_from':
exercises/concept/annalyns-infiltration/.meta/config.json

Not an array: 'forked_from':
exercises/concept/annalyns-infiltration2/.meta/config.json

Not an array: 'forked_from':
exercises/concept/emoji-times/.meta/config.json

Not an array: 'forked_from':
exercises/concept/encounters/.meta/config.json

Not an array: 'forked_from':
exercises/concept/exercism-matrix/.meta/config.json

Not an array: 'forked_from':
exercises/concept/fibonacci-iterator/.meta/config.json

Not an array: 'forked_from':
exercises/concept/lasagna/.meta/config.json

Not an array: 'forked_from':
exercises/concept/leap/.meta/config.json

Not an array: 'forked_from':
exercises/concept/vehicle-purchase/.meta/config.json
python
Missing file:
concepts/lists/introduction.md

Missing file:
concepts/str-methods/introduction.md

Missing file:
concepts/string-formatting/introduction.md

Missing key: 'files':
exercises/concept/conditionals/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/pretty-leaflet/.meta/config.json

Array is empty: 'files.test':
exercises/concept/pretty-leaflet/.meta/config.json
ruby
Missing file:
concepts/exceptions/introduction.md

Array is empty: 'files.solution':
exercises/concept/amusement-park-rides/.meta/config.json

Array is empty: 'files.test':
exercises/concept/amusement-park-rides/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/arrays/.meta/config.json

Array is empty: 'files.test':
exercises/concept/arrays/.meta/config.json

Missing key: 'authors':
exercises/concept/conditionals-ternary/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/exceptions/.meta/config.json

Array is empty: 'files.test':
exercises/concept/exceptions/.meta/config.json

Missing key: 'authors':
exercises/concept/floating-point-numbers/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/floating-point-numbers/.meta/config.json

Array is empty: 'files.test':
exercises/concept/floating-point-numbers/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/instance-variables/.meta/config.json

Array is empty: 'files.test':
exercises/concept/instance-variables/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/numbers/.meta/config.json

Array is empty: 'files.test':
exercises/concept/numbers/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/strings/.meta/config.json

Array is empty: 'files.test':
exercises/concept/strings/.meta/config.json
rust
Missing file:
concepts/floats/introduction.md

Missing file:
concepts/hashmaps/introduction.md

Missing file:
concepts/intro-fn/introduction.md

Missing file:
concepts/intro-option/introduction.md

Missing file:
concepts/intro-types/introduction.md

Missing file:
concepts/match.pattern-matching/introduction.md

Missing file:
concepts/numbers/introduction.md

Missing file:
concepts/signedness/introduction.md

Missing file:
concepts/string-use/introduction.md

Missing file:
concepts/strings-basic/introduction.md

Missing key: 'authors':
exercises/concept/entry-api/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/entry-api/.meta/config.json

Array is empty: 'files.test':
exercises/concept/entry-api/.meta/config.json

Missing key: 'authors':
exercises/concept/enums/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/enums/.meta/config.json

Array is empty: 'files.test':
exercises/concept/enums/.meta/config.json

Missing key: 'authors':
exercises/concept/numbers/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/numbers/.meta/config.json

Array is empty: 'files.test':
exercises/concept/numbers/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/options/.meta/config.json

Array is empty: 'files.test':
exercises/concept/options/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/string-vs-str/.meta/config.json

Array is empty: 'files.test':
exercises/concept/string-vs-str/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/structs/.meta/config.json

Array is empty: 'files.test':
exercises/concept/structs/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/tuples/.meta/config.json

Array is empty: 'files.test':
exercises/concept/tuples/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/vec-macro/.meta/config.json

Array is empty: 'files.test':
exercises/concept/vec-macro/.meta/config.json

Tracks that exit with 0

Click to expand
05ab1e
ada
arm64-assembly
babashka
ballerina
bash
c
ceylon
cfml
clojure
clojurescript
coffeescript
common-lisp
coq
cpp
crystal
csharp
d
dart
delphi
elixir
elm
emacs-lisp
erlang
factor
forth
fortran
fsharp
gleam
gnu-apl
groovy
haskell
haxe
idris
io
j
javascript
kotlin
lfe
lua
mips
nim
nix
objective-c
ocaml
perl5
pharo-smalltalk
php
plsql
pony
powershell
prolog
purescript
r
racket
raku
reasonml
research_experiment_1
scala
scheme
shen
sml
solidity
swift
system-verilog
tcl
typescript
vbnet
vimscript
x86-64-assembly
zig

@ee7
Copy link
Member Author

ee7 commented Feb 5, 2021

I hear that the v3 PRs have been merged for every track repo apart from javascript.

Here's this PR's configlet lint output as of right now:

Tracks that exit with 1

clojure
Missing file:
exercises/concept/bird-watcher/.docs/hints.md

Missing file:
exercises/concept/cars-assemble/.docs/hints.md

Missing file:
exercises/concept/interest-is-interesting/.docs/hints.md

Missing file:
exercises/concept/interest-is-interesting/.meta/config.json

Missing file:
exercises/concept/international-calling-connoisseur/.docs/hints.md

Missing file:
exercises/concept/international-calling-connoisseur/.docs/introduction.md

Missing file:
exercises/concept/international-calling-connoisseur/.meta/config.json

Missing file:
exercises/concept/log-levels/.docs/hints.md

Array is empty: 'files.solution':
exercises/concept/annalyns-infiltration/.meta/config.json

Array is empty: 'files.test':
exercises/concept/annalyns-infiltration/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/bird-watcher/.meta/config.json

Array is empty: 'files.test':
exercises/concept/bird-watcher/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/bird-watcher/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/cars-assemble/.meta/config.json

Array is empty: 'files.test':
exercises/concept/cars-assemble/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/log-levels/.meta/config.json

Array is empty: 'files.test':
exercises/concept/log-levels/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/lucians-luscious-lasagna/.meta/config.json

Array is empty: 'files.test':
exercises/concept/lucians-luscious-lasagna/.meta/config.json

Missing key: 'authors':
exercises/concept/tracks-on-tracks-on-tracks/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/tracks-on-tracks-on-tracks/.meta/config.json

Array is empty: 'files.test':
exercises/concept/tracks-on-tracks-on-tracks/.meta/config.json
cpp
Array is empty: 'files.solution':
exercises/concept/strings/.meta/config.json

Array is empty: 'files.test':
exercises/concept/strings/.meta/config.json
dart
Missing file:
exercises/concept/futures/.meta/config.json

Missing file:
exercises/concept/numbers/.meta/config.json

Missing file:
exercises/concept/strings/.meta/config.json
go
Array is empty: 'files.test':
exercises/concept/comments/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/constants/.meta/config.json

Array is empty: 'files.test':
exercises/concept/constants/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/errors/.meta/config.json

Array is empty: 'files.test':
exercises/concept/errors/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/errors/.meta/config.json
java
Array is empty: 'files.exemplar':
exercises/concept/basics/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/bird-watcher/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/booleans/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/chars/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/classes/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/conditionals/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/constructors/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/inheritance/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/interfaces/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/numbers/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/strings/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/switch-statement/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/ternary-operators/.meta/config.json
julia
Missing file:
exercises/concept/annalyns-infiltration/.docs/hints.md

Missing file:
exercises/concept/annalyns-infiltration/.docs/introduction.md

Missing file:
exercises/concept/annalyns-infiltration2/.docs/hints.md

Missing file:
exercises/concept/annalyns-infiltration2/.docs/introduction.md

Missing file:
exercises/concept/emoji-times/.docs/introduction.md

Missing file:
exercises/concept/exercism-matrix/.docs/hints.md

Missing file:
exercises/concept/vehicle-purchase/.docs/hints.md

Missing file:
concepts/abstract-types/introduction.md

Missing file:
concepts/composite-types/introduction.md

Missing file:
concepts/constants/introduction.md

Missing file:
concepts/matrices-concatenation/introduction.md

Missing file:
concepts/matrices-indices/introduction.md

Missing file:
concepts/matrices-iteration/introduction.md

Missing file:
concepts/matrices-mutation/introduction.md

Missing file:
concepts/methods/introduction.md

Missing file:
concepts/symbols/introduction.md

Not an array: 'forked_from':
exercises/concept/annalyns-infiltration/.meta/config.json

Not an array: 'forked_from':
exercises/concept/annalyns-infiltration2/.meta/config.json

Not an array: 'forked_from':
exercises/concept/emoji-times/.meta/config.json

Not an array: 'forked_from':
exercises/concept/encounters/.meta/config.json

Not an array: 'forked_from':
exercises/concept/exercism-matrix/.meta/config.json

Not an array: 'forked_from':
exercises/concept/fibonacci-iterator/.meta/config.json

Not an array: 'forked_from':
exercises/concept/lasagna/.meta/config.json

Not an array: 'forked_from':
exercises/concept/leap/.meta/config.json

Not an array: 'forked_from':
exercises/concept/vehicle-purchase/.meta/config.json
kotlin
Array is empty: 'files.solution':
exercises/concept/annalyns-infiltration/.meta/config.json

Array is empty: 'files.test':
exercises/concept/annalyns-infiltration/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/annalyns-infiltration/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/basics/.meta/config.json

Array is empty: 'files.test':
exercises/concept/basics/.meta/config.json

Array is empty: 'files.exemplar':
exercises/concept/basics/.meta/config.json
purescript
Array is empty: 'files.solution':
exercises/concept/booleans/.meta/config.json

Array is empty: 'files.test':
exercises/concept/booleans/.meta/config.json
python
Missing file:
concepts/lists/introduction.md

Missing file:
concepts/str-methods/introduction.md

Missing file:
concepts/string-formatting/introduction.md

Missing key: 'files':
exercises/concept/conditionals/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/pretty-leaflet/.meta/config.json

Array is empty: 'files.test':
exercises/concept/pretty-leaflet/.meta/config.json
ruby
Missing file:
concepts/exceptions/introduction.md

Array is empty: 'files.solution':
exercises/concept/amusement-park-rides/.meta/config.json

Array is empty: 'files.test':
exercises/concept/amusement-park-rides/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/arrays/.meta/config.json

Array is empty: 'files.test':
exercises/concept/arrays/.meta/config.json

Missing key: 'authors':
exercises/concept/conditionals-ternary/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/exceptions/.meta/config.json

Array is empty: 'files.test':
exercises/concept/exceptions/.meta/config.json

Missing key: 'authors':
exercises/concept/floating-point-numbers/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/floating-point-numbers/.meta/config.json

Array is empty: 'files.test':
exercises/concept/floating-point-numbers/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/instance-variables/.meta/config.json

Array is empty: 'files.test':
exercises/concept/instance-variables/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/numbers/.meta/config.json

Array is empty: 'files.test':
exercises/concept/numbers/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/strings/.meta/config.json

Array is empty: 'files.test':
exercises/concept/strings/.meta/config.json
rust
Missing file:
concepts/floats/introduction.md

Missing file:
concepts/hashmaps/introduction.md

Missing file:
concepts/intro-fn/introduction.md

Missing file:
concepts/intro-option/introduction.md

Missing file:
concepts/intro-types/introduction.md

Missing file:
concepts/match.pattern-matching/introduction.md

Missing file:
concepts/numbers/introduction.md

Missing file:
concepts/signedness/introduction.md

Missing file:
concepts/string-use/introduction.md

Missing file:
concepts/strings-basic/introduction.md

Missing key: 'authors':
exercises/concept/entry-api/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/entry-api/.meta/config.json

Array is empty: 'files.test':
exercises/concept/entry-api/.meta/config.json

Missing key: 'authors':
exercises/concept/enums/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/enums/.meta/config.json

Array is empty: 'files.test':
exercises/concept/enums/.meta/config.json

Missing key: 'authors':
exercises/concept/numbers/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/numbers/.meta/config.json

Array is empty: 'files.test':
exercises/concept/numbers/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/options/.meta/config.json

Array is empty: 'files.test':
exercises/concept/options/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/string-vs-str/.meta/config.json

Array is empty: 'files.test':
exercises/concept/string-vs-str/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/structs/.meta/config.json

Array is empty: 'files.test':
exercises/concept/structs/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/tuples/.meta/config.json

Array is empty: 'files.test':
exercises/concept/tuples/.meta/config.json

Array is empty: 'files.solution':
exercises/concept/vec-macro/.meta/config.json

Array is empty: 'files.test':
exercises/concept/vec-macro/.meta/config.json
scala
Array is empty: 'files.solution':
exercises/concept/basics/.meta/config.json

Array is empty: 'files.test':
exercises/concept/basics/.meta/config.json
swift
Missing file:
concepts/capturing/introduction.md

Missing file:
concepts/characters/about.md

Missing file:
concepts/characters/links.json

Missing file:
concepts/classes/about.md

Missing file:
concepts/classes/links.json

Missing file:
concepts/closures/introduction.md

Missing file:
concepts/constants-and-variables/introduction.md

Missing file:
concepts/initializers/about.md

Missing file:
concepts/initializers/links.json

Missing file:
concepts/opaque-indices/about.md

Missing file:
concepts/opaque-indices/links.json

Missing file:
concepts/shorthand-arguments/introduction.md

Missing file:
concepts/strings/about.md

Missing file:
concepts/strings/links.json

Missing file:
concepts/structs/about.md

Missing file:
concepts/structs/links.json

Missing file:
concepts/trailing-closures/introduction.md
x86-64-assembly
Array is empty: 'files.solution':
exercises/concept/basics/.meta/config.json

Array is empty: 'files.test':
exercises/concept/basics/.meta/config.json

Tracks that exit with 0

click to expand
05ab1e
ada
arm64-assembly
babashka
ballerina
bash
c
ceylon
cfml
clojurescript
coffeescript
common-lisp
coq
crystal
csharp
d
delphi
elixir
elm
emacs-lisp
erlang
factor
forth
fortran
fsharp
gleam
gnu-apl
groovy
haskell
haxe
idris
io
j
javascript
lfe
lua
mips
nim
nix
objective-c
ocaml
perl5
pharo-smalltalk
php
plsql
pony
powershell
prolog
r
racket
raku
reasonml
research_experiment_1
scheme
shen
sml
solidity
system-verilog
tcl
typescript
vbnet
vimscript
zig

Copy link
Member

@ErikSchierboom ErikSchierboom left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! I've checked the current lint output you've conveniently posted and those look good.

@ee7 ee7 marked this pull request as ready for review February 5, 2021 14:09
@ee7 ee7 merged commit 056fd8a into exercism:main Feb 5, 2021
@ee7 ee7 deleted the lint-concept-exercise-configs branch February 5, 2021 14:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants