treefmt: add configuration wrappers (#390147)

Changed files
+208 -3
pkgs
+29
pkgs/by-name/tr/treefmt/build-config.nix
···
+
{
+
lib,
+
formats,
+
}:
+
module:
+
let
+
settingsFormat = formats.toml { };
+
configuration = lib.evalModules {
+
modules = [
+
{
+
_file = ./build-config.nix;
+
freeformType = settingsFormat.type;
+
}
+
{
+
# Wrap user's modules with a default file location
+
_file = "<treefmt.buildConfig args>";
+
imports = lib.toList module;
+
}
+
];
+
};
+
settingsFile = settingsFormat.generate "treefmt.toml" configuration.config;
+
in
+
settingsFile.overrideAttrs {
+
passthru = {
+
format = settingsFormat;
+
settings = configuration.config;
+
inherit (configuration) _module options type;
+
};
+
}
+38 -3
pkgs/by-name/tr/treefmt/package.nix
···
{
lib,
buildGoModule,
+
callPackage,
+
callPackages,
fetchFromGitHub,
}:
buildGoModule rec {
···
"-X github.com/numtide/treefmt/v2/build.Version=v${version}"
];
+
passthru = {
+
/**
+
Wrap treefmt, configured using structured settings.
+
+
# Type
+
+
```
+
AttrSet -> Derivation
+
```
+
+
# Inputs
+
+
- `name`: `String` (default `"treefmt-configured"`)
+
- `settings`: `Module` (default `{ }`)
+
- `runtimeInputs`: `[Derivation]` (default `[ ]`)
+
*/
+
withConfig = callPackage ./with-config.nix { };
+
+
/**
+
Build a treefmt config file from structured settings.
+
+
# Type
+
+
```
+
Module -> Derivation
+
```
+
*/
+
buildConfig = callPackage ./build-config.nix { };
+
+
tests = callPackages ./tests.nix { };
+
};
+
meta = {
description = "one CLI to format the code tree";
homepage = "https://github.com/numtide/treefmt";
license = lib.licenses.mit;
-
maintainers = [
-
lib.maintainers.brianmcgee
-
lib.maintainers.zimbatm
+
maintainers = with lib.maintainers; [
+
brianmcgee
+
MattSturgeon
+
zimbatm
];
mainProgram = "treefmt";
};
+110
pkgs/by-name/tr/treefmt/tests.nix
···
+
{
+
lib,
+
runCommand,
+
testers,
+
treefmt,
+
nixfmt-rfc-style,
+
}:
+
let
+
inherit (treefmt) buildConfig withConfig;
+
+
testEqualContents =
+
args:
+
testers.testEqualContents (
+
args
+
// lib.optionalAttrs (builtins.isString args.expected) {
+
expected = builtins.toFile "expected" args.expected;
+
}
+
);
+
+
nixfmtExampleConfig = {
+
on-unmatched = "info";
+
tree-root-file = ".git/index";
+
+
formatter.nixfmt = {
+
command = "nixfmt";
+
includes = [ "*.nix" ];
+
};
+
};
+
+
nixfmtExamplePackage = withConfig {
+
settings = nixfmtExampleConfig;
+
runtimeInputs = [ nixfmt-rfc-style ];
+
};
+
in
+
{
+
buildConfigEmpty = testEqualContents {
+
assertion = "`buildConfig { }` builds an empty config file";
+
actual = buildConfig { };
+
expected = "";
+
};
+
+
buildConfigExample = testEqualContents {
+
assertion = "`buildConfig` builds the example config";
+
actual = buildConfig nixfmtExampleConfig;
+
expected = ''
+
on-unmatched = "info"
+
tree-root-file = ".git/index"
+
[formatter.nixfmt]
+
command = "nixfmt"
+
includes = ["*.nix"]
+
'';
+
};
+
+
buildConfigModules = testEqualContents {
+
assertion = "`buildConfig` evaluates modules to build a config";
+
actual = buildConfig [
+
nixfmtExampleConfig
+
{ tree-root-file = lib.mkForce "overridden"; }
+
];
+
expected = ''
+
on-unmatched = "info"
+
tree-root-file = "overridden"
+
[formatter.nixfmt]
+
command = "nixfmt"
+
includes = ["*.nix"]
+
'';
+
};
+
+
runNixfmtExample =
+
runCommand "run-nixfmt-example"
+
{
+
nativeBuildInputs = [ nixfmtExamplePackage ];
+
passAsFile = [
+
"input"
+
"expected"
+
];
+
input = ''
+
{
+
foo="bar";
+
attrs={};
+
list=[];
+
}
+
'';
+
expected = ''
+
{
+
foo = "bar";
+
attrs = { };
+
list = [ ];
+
}
+
'';
+
}
+
''
+
export XDG_CACHE_HOME=$(mktemp -d)
+
# The example config assumes the tree root has a .git/index file
+
mkdir .git && touch .git/index
+
+
# Copy the input file, then format it using the wrapped treefmt
+
cp $inputPath input.nix
+
treefmt
+
+
# Assert that input.nix now matches expected
+
if diff -u $expectedPath input.nix; then
+
touch $out
+
else
+
echo
+
echo "treefmt did not format input.nix as expected"
+
exit 1
+
fi
+
'';
+
}
+31
pkgs/by-name/tr/treefmt/with-config.nix
···
+
{
+
lib,
+
runCommand,
+
treefmt,
+
makeBinaryWrapper,
+
}:
+
{
+
name ? "treefmt-with-config",
+
settings ? { },
+
runtimeInputs ? [ ],
+
}:
+
runCommand name
+
{
+
nativeBuildInputs = [ makeBinaryWrapper ];
+
treefmtExe = lib.getExe treefmt;
+
binPath = lib.makeBinPath runtimeInputs;
+
configFile = treefmt.buildConfig {
+
# Wrap user's modules with a default file location
+
_file = "<treefmt.withConfig settings arg>";
+
imports = lib.toList settings;
+
};
+
inherit (treefmt) meta version;
+
}
+
''
+
mkdir -p $out/bin
+
makeWrapper \
+
$treefmtExe \
+
$out/bin/treefmt \
+
--prefix PATH : "$binPath" \
+
--add-flags "--config-file $configFile"
+
''