lib.modules: init test for lib.mkDefinition

This commit is contained in:
Johannes Kirschbauer 2025-03-18 15:02:12 +00:00
parent c906064af1
commit 33daa3f4b9
No known key found for this signature in database
4 changed files with 98 additions and 3 deletions

View file

@ -1177,8 +1177,6 @@ let
map (mapAttrs (n: v: mkIf cfg.condition v)) (pushDownProperties cfg.content) map (mapAttrs (n: v: mkIf cfg.condition v)) (pushDownProperties cfg.content)
else if cfg._type or "" == "override" then else if cfg._type or "" == "override" then
map (mapAttrs (n: v: mkOverride cfg.priority v)) (pushDownProperties cfg.content) map (mapAttrs (n: v: mkOverride cfg.priority v)) (pushDownProperties cfg.content)
# else if cfg._type or "" == "definition" then
# map (mapAttrs (n: v: mkDefinition v)) (pushDownProperties cfg.content)
# FIXME: handle mkOrder? # FIXME: handle mkOrder?
else else
[ cfg ]; [ cfg ];

View file

@ -673,6 +673,14 @@ checkConfigError 'The option .conflictingPathOptionType. in .*/pathWith.nix. is
# types.pathWith { inStore = true; absolute = false; } # types.pathWith { inStore = true; absolute = false; }
checkConfigError 'In pathWith, inStore means the path must be absolute' config.impossiblePathOptionType ./pathWith.nix checkConfigError 'In pathWith, inStore means the path must be absolute' config.impossiblePathOptionType ./pathWith.nix
# mkDefinition
# check that mkDefinition 'file' is printed in the error message
checkConfigError 'Cannot merge definitions.*\n\s*- In .file.*\n\s*- In .other.*' config.conflict ./mkDefinition.nix
checkConfigError 'A definition for option .viaOptionDefault. is not of type .boolean.*' config.viaOptionDefault ./mkDefinition.nix
checkConfigOutput '^true$' config.viaConfig ./mkDefinition.nix
checkConfigOutput '^true$' config.mkMerge ./mkDefinition.nix
checkConfigOutput '^true$' config.mkForce ./mkDefinition.nix
cat <<EOF cat <<EOF
====== module tests ====== ====== module tests ======
$pass Pass $pass Pass

View file

@ -0,0 +1,71 @@
{ lib, ... }:
let
inherit (lib)
mkOption
mkDefinition
mkOptionDefault
;
in
{
imports = [
{
_file = "file";
options.conflict = mkOption {
default = 1;
};
config.conflict = mkDefinition {
file = "other";
value = mkOptionDefault 42;
};
}
{
# Check that mkDefinition works within 'config'
options.viaConfig = mkOption { };
config.viaConfig = mkDefinition {
file = "other";
value = true;
};
}
{
# Check mkMerge can wrap mkDefinitions
# Not the other way around
options.mkMerge = mkOption {
type = lib.types.bool;
};
config.mkMerge = lib.mkMerge [
(mkDefinition {
file = "a.nix";
value = true;
})
(mkDefinition {
file = "b.nix";
value = true;
})
];
}
{
# Check mkDefinition can use mkForce on the value
# Not the other way around
options.mkForce = mkOption {
type = lib.types.bool;
default = false;
};
config.mkForce = mkDefinition {
file = "other";
value = lib.mkForce true;
};
}
{
# Currently expects an error
# mkDefinition doesn't work on option default
# This is a limitation and might be resolved in the future
options.viaOptionDefault = mkOption {
type = lib.types.bool;
default = mkDefinition {
file = "other";
value = true;
};
};
}
];
}

View file

@ -139,7 +139,25 @@ A free-floating definition is created with `mkDefinition { file = ...; value = .
Preserving the file location creates better error messages, for example when copying definitions from one option to another. Preserving the file location creates better error messages, for example when copying definitions from one option to another.
Other properties like `mkOverride` `mkMerge` `mkAfter` can be used in the `value` attribute but not the other way around. Other properties like `mkOverride` `mkMerge` `mkAfter` can be used in the `value` attribute but not on the entire definition.
This is what would work
```nix
mkDefinition {
value = mkForce 42;
file = "somefile.nix";
}
```
While this would NOT work.
```nix
mkForce (mkDefinition {
value = 42;
file = "somefile.nix";
})
```
The following shows an example configuration that yields an error with the custom position information: The following shows an example configuration that yields an error with the custom position information: