tests: Install all efmls-configs tools (#709)

This requires to pass the efmls-configs file to the derivation helpers,
if we try to import it from the test file directly it fails.

We then look into the types to find the available languages &
corresponding tools, to enable them all.

We then filter out the broken tools or the unpackaged tools, in order to
detect more easily the introduction of future tools.
This commit is contained in:
traxys 2023-11-17 12:17:13 +01:00 committed by GitHub
parent fbe5169271
commit 1b44fe37a1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 67 additions and 2 deletions

View file

@ -44,7 +44,13 @@
then args
else {
# cases is a function
cases = cases {inherit pkgs helpers;};
cases = cases {
inherit pkgs helpers;
efmls-options = import ../plugins/lsp/language-servers/efmls-configs.nix {
inherit pkgs lib helpers;
config = {};
};
};
inherit namespace;
})
testsList;

View file

@ -1,8 +1,67 @@
{
{efmls-options, ...}: {
empty = {
plugins.efmls-configs.enable = true;
};
all = {
plugins.efmls-configs = let
options = efmls-options.options.plugins.efmls-configs;
# toolOptions is an attrsets of the form:
# { <lang> = { linter = tools; formatter = tools; }; }
# Where tools is the option type representing the valid tools for this language
toolOptions = (builtins.head options.setup.type.getSubModules).options;
brokenTools = [
#Broken as of 16 of November 2023
"phpstan"
];
unpackaged = [
"blade_formatter"
"cspell"
"dartanalyzer"
"debride"
"fecs"
"fixjson"
"forge_fmt"
"gersemi"
"js_standard"
"pint"
"prettier_eslint"
"prettier_standard"
"redpen"
"reek"
"rome"
"slim_lint"
"solhint"
"sorbet"
"xo"
];
# Fetch the valid enum members from the tool options
toolsFromOptions = opt: let
# tool options are a `either toolType (listOf toolType)`
# Look into `nestedTypes.left` to get a `toolType` option.
toolType = opt.type.nestedTypes.left;
# toolType is a `either (enum possible) helpers.rawType
# Look into `nestedTypes.left` for the enum
possible = toolType.nestedTypes.left;
# possible is an enum, look into functor.payload for the variants
toolList = possible.functor.payload;
in
builtins.filter (t: !builtins.elem t (brokenTools ++ unpackaged)) toolList;
in {
enable = true;
# Replace the { <lang> = { linter = tools; formatter = tools; } };
# With { <lang> = {
# linter = [<all valid linters for lang>];
# formatter = [<all valid formatters for lang>];
# };}
setup = builtins.mapAttrs (_: builtins.mapAttrs (_: toolsFromOptions)) toolOptions;
};
};
example = {
extraConfigLuaPre = ''
local efm_fs = require('efmls-configs.fs')