treefmt: add configuration wrappers

- `treefmt.withConfig` builds a treefmt package wrapped with a config
- `treefmt.buildConfig` builds a treefmt.toml file using a freeform module
This commit is contained in:
Matt Sturgeon
2025-03-18 13:27:08 +00:00
parent cc720d106f
commit 447f275222
4 changed files with 204 additions and 0 deletions
+29
View File
@@ -0,0 +1,29 @@
{
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;
};
}
+34
View File
@@ -1,6 +1,8 @@
{
lib,
buildGoModule,
callPackage,
callPackages,
fetchFromGitHub,
}:
buildGoModule rec {
@@ -27,6 +29,38 @@ 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";
+110
View File
@@ -0,0 +1,110 @@
{
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
View File
@@ -0,0 +1,31 @@
{
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"
''