Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions pkgs/by-name/tr/treefmt/build-config.nix
Original file line number Diff line number Diff line change
@@ -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;
};
}
41 changes: 38 additions & 3 deletions pkgs/by-name/tr/treefmt/package.nix
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
{
lib,
buildGoModule,
callPackage,
callPackages,
fetchFromGitHub,
}:
buildGoModule rec {
Expand All @@ -27,13 +29,46 @@ 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";
};
Expand Down
110 changes: 110 additions & 0 deletions pkgs/by-name/tr/treefmt/tests.nix
Original file line number Diff line number Diff line change
@@ -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 changes: 31 additions & 0 deletions pkgs/by-name/tr/treefmt/with-config.nix
Original file line number Diff line number Diff line change
@@ -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"
''