diff options
| author | Johannes Kirschbauer <hsjobeki@gmail.com> | 2025-04-07 14:52:48 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-07 14:52:48 +0200 |
| commit | 0196e5372b8b7a282cb3bbe5cbf446617141ce38 (patch) | |
| tree | 64f84d854902ccbf4d12b3eeb2942c1a7b84d244 /lib | |
| parent | python3Packages.pyghmi: init at 1.5.77 (#383866) (diff) | |
| parent | lib.modules: init test for lib.mkDefinition (diff) | |
| download | nixpkgs-0196e5372b8b7a282cb3bbe5cbf446617141ce38.tar.gz | |
lib/modules: Init lib.mkDefinition (#390983)
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/default.nix | 1 | ||||
| -rw-r--r-- | lib/modules.nix | 20 | ||||
| -rwxr-xr-x | lib/tests/modules.sh | 8 | ||||
| -rw-r--r-- | lib/tests/modules/mkDefinition.nix | 71 |
4 files changed, 96 insertions, 4 deletions
diff --git a/lib/default.nix b/lib/default.nix index e671fcf9546d..19316addb8cb 100644 --- a/lib/default.nix +++ b/lib/default.nix @@ -446,6 +446,7 @@ let fixupOptionType mkIf mkAssert + mkDefinition mkMerge mkOverride mkOptionDefault diff --git a/lib/modules.nix b/lib/modules.nix index a9ddaf7bda02..7716e855ebb2 100644 --- a/lib/modules.nix +++ b/lib/modules.nix @@ -1097,10 +1097,16 @@ let # Process mkMerge and mkIf properties. defs' = concatMap ( m: - map (value: { - inherit (m) file; - inherit value; - }) (addErrorContext "while evaluating definitions from `${m.file}':" (dischargeProperties m.value)) + map ( + value: + if value._type or null == "definition" then + value + else + { + inherit (m) file; + inherit value; + } + ) (addErrorContext "while evaluating definitions from `${m.file}':" (dischargeProperties m.value)) ) defs; # Process mkOverride properties. @@ -1365,6 +1371,11 @@ let inherit contents; }; + /** + Return a definition with file location information. + */ + mkDefinition = args@{ file, value, ... }: args // { _type = "definition"; }; + mkOverride = priority: content: { _type = "override"; inherit priority content; @@ -2095,6 +2106,7 @@ private mkBefore mkChangedOptionModule mkDefault + mkDefinition mkDerivedConfig mkFixStrictness mkForce diff --git a/lib/tests/modules.sh b/lib/tests/modules.sh index e623c0fb55b8..9df6e61797b7 100755 --- a/lib/tests/modules.sh +++ b/lib/tests/modules.sh @@ -673,6 +673,14 @@ checkConfigError 'The option .conflictingPathOptionType. in .*/pathWith.nix. is # types.pathWith { inStore = true; absolute = false; } 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 ====== module tests ====== $pass Pass diff --git a/lib/tests/modules/mkDefinition.nix b/lib/tests/modules/mkDefinition.nix new file mode 100644 index 000000000000..0a807090fa28 --- /dev/null +++ b/lib/tests/modules/mkDefinition.nix @@ -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; + }; + }; + } + ]; +} |
