Loading doc/doc-support/package.nix +2 −4 Original line number Diff line number Diff line Loading @@ -57,10 +57,8 @@ stdenvNoCC.mkDerivation ( substituteInPlace ./languages-frameworks/python.section.md \ --subst-var-by python-interpreter-table "$(<"${pythonInterpreterTable}")" cat \ ./functions/library.md.in \ ${lib-docs}/index.md \ > ./functions/library.md cat ./functions/library.md.in ${lib-docs}/index.md > ./functions/library.md substitute ./manual.md.in ./manual.md \ --replace-fail '@MANUAL_VERSION@' '${lib.version}' Loading pkgs/pkgs-lib/formats.nix +87 −56 Original line number Diff line number Diff line { lib, pkgs }: let inherit (lib) concatStringsSep escape flatten id isAttrs isFloat isInt isList isString mapAttrs mapAttrsToList mkOption optionalAttrs optionalString pipe types singleton warn ; inherit (lib.generators) mkValueStringDefault toGitINI toINI toINIWithGlobalSection toKeyValue toLua mkLuaInline ; inherit (lib.types) attrsOf atom bool coercedTo either Loading @@ -15,13 +47,14 @@ let oneOf path str submodule ; # Attributes added accidentally in https://github.com/NixOS/nixpkgs/pull/335232 (2024-08-18) # Deprecated in https://github.com/NixOS/nixpkgs/pull/415666 (2025-06) aliases = lib.mapAttrs (name: lib.warn "`formats.${name}` is deprecated; use `lib.types.${name}` instead.") { allowAliases = pkgs.config.allowAliases or false; aliasWarning = name: warn "`formats.${name}` is deprecated; use `lib.types.${name}` instead."; aliases = mapAttrs aliasWarning { inherit attrsOf bool Loading @@ -40,7 +73,7 @@ let ; }; in lib.optionalAttrs pkgs.config.allowAliases aliases optionalAttrs allowAliases aliases // rec { /* Loading Loading @@ -188,7 +221,7 @@ lib.optionalAttrs pkgs.config.allowAliases aliases }: let singleIniAtomOr = if atomsCoercedToLists then coercedTo singleIniAtom lib.singleton else either singleIniAtom; if atomsCoercedToLists then coercedTo singleIniAtom singleton else either singleIniAtom; in if listsAsDuplicateKeys then singleIniAtomOr (listOf singleIniAtom) Loading @@ -212,9 +245,9 @@ lib.optionalAttrs pkgs.config.allowAliases aliases maybeToList = listToValue: if listToValue != null then lib.mapAttrs (key: val: if lib.isList val then listToValue val else val) mapAttrs (key: val: if isList val then listToValue val else val) else lib.id; id; in { ini = Loading @@ -239,14 +272,14 @@ lib.optionalAttrs pkgs.config.allowAliases aliases in { type = lib.types.attrsOf (iniSection atom); type = attrsOf (iniSection atom); lib.types.atom = atom; generate = name: value: lib.pipe value [ (lib.mapAttrs (_: maybeToList listToValue)) (lib.generators.toINI ( pipe value [ (mapAttrs (_: maybeToList listToValue)) (toINI ( removeAttrs args [ "listToValue" "atomsCoercedToLists" Loading Loading @@ -277,14 +310,14 @@ lib.optionalAttrs pkgs.config.allowAliases aliases }; in { type = lib.types.submodule { type = submodule { options = { sections = lib.mkOption rec { type = lib.types.attrsOf (iniSection atom); sections = mkOption rec { type = attrsOf (iniSection atom); default = { }; description = type.description; }; globalSection = lib.mkOption rec { globalSection = mkOption rec { type = iniSection atom; default = { }; description = "global " + type.description; Loading @@ -300,14 +333,14 @@ lib.optionalAttrs pkgs.config.allowAliases aliases ... }: pkgs.writeText name ( lib.generators.toINIWithGlobalSection toINIWithGlobalSection (removeAttrs args [ "listToValue" "atomsCoercedToLists" ]) { globalSection = maybeToList listToValue globalSection; sections = lib.mapAttrs (_: maybeToList listToValue) sections; sections = mapAttrs (_: maybeToList listToValue) sections; } ); }; Loading @@ -327,7 +360,7 @@ lib.optionalAttrs pkgs.config.allowAliases aliases { type = attrsOf (attrsOf (either atom (attrsOf atom))); lib.types.atom = atom; generate = name: value: pkgs.writeText name (lib.generators.toGitINI value); generate = name: value: pkgs.writeText name (toGitINI value); }; } Loading @@ -343,7 +376,7 @@ lib.optionalAttrs pkgs.config.allowAliases aliases # optional config options. systemd = let mkValueString = lib.generators.mkValueStringDefault { }; mkValueString = mkValueStringDefault { }; mkKeyValue = k: v: if v == null then "# ${k} is unset" else "${k} = ${mkValueString v}"; in ini { Loading Loading @@ -379,12 +412,12 @@ lib.optionalAttrs pkgs.config.allowAliases aliases atom = if listsAsDuplicateKeys then coercedTo singleAtom lib.singleton (listOf singleAtom) coercedTo singleAtom singleton (listOf singleAtom) // { description = singleAtom.description + " or a list of them for duplicate keys"; } else if listToValue != null then coercedTo singleAtom lib.singleton (nonEmptyListOf singleAtom) coercedTo singleAtom singleton (nonEmptyListOf singleAtom) // { description = singleAtom.description + " or a non-empty list of them"; } Loading @@ -399,13 +432,11 @@ lib.optionalAttrs pkgs.config.allowAliases aliases let transformedValue = if listToValue != null then lib.mapAttrs (key: val: if lib.isList val then listToValue val else val) value mapAttrs (key: val: if isList val then listToValue val else val) value else value; in pkgs.writeText name ( lib.generators.toKeyValue (removeAttrs args [ "listToValue" ]) transformedValue ); pkgs.writeText name (toKeyValue (removeAttrs args [ "listToValue" ]) transformedValue); }; Loading Loading @@ -543,18 +574,18 @@ lib.optionalAttrs pkgs.config.allowAliases aliases "true" else if value == false then "false" else if lib.isInt value || lib.isFloat value then else if isInt value || isFloat value then toString value else if lib.isString value then else if isString value then string value else if lib.isAttrs value then else if isAttrs value then attrs value else if lib.isList value then else if isList value then list value else abort "formats.elixirConf: should never happen (value = ${value})"; escapeElixir = lib.escape [ escapeElixir = escape [ "\\" "#" "\"" Loading @@ -568,11 +599,11 @@ lib.optionalAttrs pkgs.config.allowAliases aliases else let toKeyword = name: value: "${name}: ${toElixir value}"; keywordList = lib.concatStringsSep ", " (lib.mapAttrsToList toKeyword set); keywordList = concatStringsSep ", " (mapAttrsToList toKeyword set); in "[" + keywordList + "]"; listContent = values: lib.concatStringsSep ", " (map toElixir values); listContent = values: concatStringsSep ", " (map toElixir values); list = values: "[" + (listContent values) + "]"; Loading @@ -593,7 +624,7 @@ lib.optionalAttrs pkgs.config.allowAliases aliases set: let toEntry = name: value: "${toElixir name} => ${toElixir value}"; entries = lib.concatStringsSep ", " (lib.mapAttrsToList toEntry set); entries = concatStringsSep ", " (mapAttrsToList toEntry set); in "%{${entries}}"; Loading @@ -605,13 +636,13 @@ lib.optionalAttrs pkgs.config.allowAliases aliases keyConfig = rootKey: key: value: "config ${rootKey}, ${key}, ${toElixir value}"; keyConfigs = rootKey: values: lib.mapAttrsToList (keyConfig rootKey) values; rootConfigs = lib.flatten (lib.mapAttrsToList keyConfigs values); keyConfigs = rootKey: values: mapAttrsToList (keyConfig rootKey) values; rootConfigs = flatten (mapAttrsToList keyConfigs values); in '' import Config ${lib.concatStringsSep "\n" rootConfigs} ${concatStringsSep "\n" rootConfigs} ''; in { Loading Loading @@ -715,7 +746,7 @@ lib.optionalAttrs pkgs.config.allowAliases aliases # Wrap standard types, since anything in the Elixir configuration # can be raw Elixir } // lib.mapAttrs (_name: type: elixirOr type) lib.types; // mapAttrs (_name: type: elixirOr type) types; }; generate = Loading Loading @@ -771,12 +802,12 @@ lib.optionalAttrs pkgs.config.allowAliases aliases inherit columnWidth; inherit indentWidth; indentType = if indentUsingTabs then "Tabs" else "Spaces"; value = lib.generators.toLua { inherit asBindings multiline; } value; value = toLua { inherit asBindings multiline; } value; passAsFile = [ "value" ]; preferLocalBuild = true; } '' ${lib.optionalString (!asBindings) '' ${optionalString (!asBindings) '' echo -n 'return ' >> $out ''} cat $valuePath >> $out Loading Loading
doc/doc-support/package.nix +2 −4 Original line number Diff line number Diff line Loading @@ -57,10 +57,8 @@ stdenvNoCC.mkDerivation ( substituteInPlace ./languages-frameworks/python.section.md \ --subst-var-by python-interpreter-table "$(<"${pythonInterpreterTable}")" cat \ ./functions/library.md.in \ ${lib-docs}/index.md \ > ./functions/library.md cat ./functions/library.md.in ${lib-docs}/index.md > ./functions/library.md substitute ./manual.md.in ./manual.md \ --replace-fail '@MANUAL_VERSION@' '${lib.version}' Loading
pkgs/pkgs-lib/formats.nix +87 −56 Original line number Diff line number Diff line { lib, pkgs }: let inherit (lib) concatStringsSep escape flatten id isAttrs isFloat isInt isList isString mapAttrs mapAttrsToList mkOption optionalAttrs optionalString pipe types singleton warn ; inherit (lib.generators) mkValueStringDefault toGitINI toINI toINIWithGlobalSection toKeyValue toLua mkLuaInline ; inherit (lib.types) attrsOf atom bool coercedTo either Loading @@ -15,13 +47,14 @@ let oneOf path str submodule ; # Attributes added accidentally in https://github.com/NixOS/nixpkgs/pull/335232 (2024-08-18) # Deprecated in https://github.com/NixOS/nixpkgs/pull/415666 (2025-06) aliases = lib.mapAttrs (name: lib.warn "`formats.${name}` is deprecated; use `lib.types.${name}` instead.") { allowAliases = pkgs.config.allowAliases or false; aliasWarning = name: warn "`formats.${name}` is deprecated; use `lib.types.${name}` instead."; aliases = mapAttrs aliasWarning { inherit attrsOf bool Loading @@ -40,7 +73,7 @@ let ; }; in lib.optionalAttrs pkgs.config.allowAliases aliases optionalAttrs allowAliases aliases // rec { /* Loading Loading @@ -188,7 +221,7 @@ lib.optionalAttrs pkgs.config.allowAliases aliases }: let singleIniAtomOr = if atomsCoercedToLists then coercedTo singleIniAtom lib.singleton else either singleIniAtom; if atomsCoercedToLists then coercedTo singleIniAtom singleton else either singleIniAtom; in if listsAsDuplicateKeys then singleIniAtomOr (listOf singleIniAtom) Loading @@ -212,9 +245,9 @@ lib.optionalAttrs pkgs.config.allowAliases aliases maybeToList = listToValue: if listToValue != null then lib.mapAttrs (key: val: if lib.isList val then listToValue val else val) mapAttrs (key: val: if isList val then listToValue val else val) else lib.id; id; in { ini = Loading @@ -239,14 +272,14 @@ lib.optionalAttrs pkgs.config.allowAliases aliases in { type = lib.types.attrsOf (iniSection atom); type = attrsOf (iniSection atom); lib.types.atom = atom; generate = name: value: lib.pipe value [ (lib.mapAttrs (_: maybeToList listToValue)) (lib.generators.toINI ( pipe value [ (mapAttrs (_: maybeToList listToValue)) (toINI ( removeAttrs args [ "listToValue" "atomsCoercedToLists" Loading Loading @@ -277,14 +310,14 @@ lib.optionalAttrs pkgs.config.allowAliases aliases }; in { type = lib.types.submodule { type = submodule { options = { sections = lib.mkOption rec { type = lib.types.attrsOf (iniSection atom); sections = mkOption rec { type = attrsOf (iniSection atom); default = { }; description = type.description; }; globalSection = lib.mkOption rec { globalSection = mkOption rec { type = iniSection atom; default = { }; description = "global " + type.description; Loading @@ -300,14 +333,14 @@ lib.optionalAttrs pkgs.config.allowAliases aliases ... }: pkgs.writeText name ( lib.generators.toINIWithGlobalSection toINIWithGlobalSection (removeAttrs args [ "listToValue" "atomsCoercedToLists" ]) { globalSection = maybeToList listToValue globalSection; sections = lib.mapAttrs (_: maybeToList listToValue) sections; sections = mapAttrs (_: maybeToList listToValue) sections; } ); }; Loading @@ -327,7 +360,7 @@ lib.optionalAttrs pkgs.config.allowAliases aliases { type = attrsOf (attrsOf (either atom (attrsOf atom))); lib.types.atom = atom; generate = name: value: pkgs.writeText name (lib.generators.toGitINI value); generate = name: value: pkgs.writeText name (toGitINI value); }; } Loading @@ -343,7 +376,7 @@ lib.optionalAttrs pkgs.config.allowAliases aliases # optional config options. systemd = let mkValueString = lib.generators.mkValueStringDefault { }; mkValueString = mkValueStringDefault { }; mkKeyValue = k: v: if v == null then "# ${k} is unset" else "${k} = ${mkValueString v}"; in ini { Loading Loading @@ -379,12 +412,12 @@ lib.optionalAttrs pkgs.config.allowAliases aliases atom = if listsAsDuplicateKeys then coercedTo singleAtom lib.singleton (listOf singleAtom) coercedTo singleAtom singleton (listOf singleAtom) // { description = singleAtom.description + " or a list of them for duplicate keys"; } else if listToValue != null then coercedTo singleAtom lib.singleton (nonEmptyListOf singleAtom) coercedTo singleAtom singleton (nonEmptyListOf singleAtom) // { description = singleAtom.description + " or a non-empty list of them"; } Loading @@ -399,13 +432,11 @@ lib.optionalAttrs pkgs.config.allowAliases aliases let transformedValue = if listToValue != null then lib.mapAttrs (key: val: if lib.isList val then listToValue val else val) value mapAttrs (key: val: if isList val then listToValue val else val) value else value; in pkgs.writeText name ( lib.generators.toKeyValue (removeAttrs args [ "listToValue" ]) transformedValue ); pkgs.writeText name (toKeyValue (removeAttrs args [ "listToValue" ]) transformedValue); }; Loading Loading @@ -543,18 +574,18 @@ lib.optionalAttrs pkgs.config.allowAliases aliases "true" else if value == false then "false" else if lib.isInt value || lib.isFloat value then else if isInt value || isFloat value then toString value else if lib.isString value then else if isString value then string value else if lib.isAttrs value then else if isAttrs value then attrs value else if lib.isList value then else if isList value then list value else abort "formats.elixirConf: should never happen (value = ${value})"; escapeElixir = lib.escape [ escapeElixir = escape [ "\\" "#" "\"" Loading @@ -568,11 +599,11 @@ lib.optionalAttrs pkgs.config.allowAliases aliases else let toKeyword = name: value: "${name}: ${toElixir value}"; keywordList = lib.concatStringsSep ", " (lib.mapAttrsToList toKeyword set); keywordList = concatStringsSep ", " (mapAttrsToList toKeyword set); in "[" + keywordList + "]"; listContent = values: lib.concatStringsSep ", " (map toElixir values); listContent = values: concatStringsSep ", " (map toElixir values); list = values: "[" + (listContent values) + "]"; Loading @@ -593,7 +624,7 @@ lib.optionalAttrs pkgs.config.allowAliases aliases set: let toEntry = name: value: "${toElixir name} => ${toElixir value}"; entries = lib.concatStringsSep ", " (lib.mapAttrsToList toEntry set); entries = concatStringsSep ", " (mapAttrsToList toEntry set); in "%{${entries}}"; Loading @@ -605,13 +636,13 @@ lib.optionalAttrs pkgs.config.allowAliases aliases keyConfig = rootKey: key: value: "config ${rootKey}, ${key}, ${toElixir value}"; keyConfigs = rootKey: values: lib.mapAttrsToList (keyConfig rootKey) values; rootConfigs = lib.flatten (lib.mapAttrsToList keyConfigs values); keyConfigs = rootKey: values: mapAttrsToList (keyConfig rootKey) values; rootConfigs = flatten (mapAttrsToList keyConfigs values); in '' import Config ${lib.concatStringsSep "\n" rootConfigs} ${concatStringsSep "\n" rootConfigs} ''; in { Loading Loading @@ -715,7 +746,7 @@ lib.optionalAttrs pkgs.config.allowAliases aliases # Wrap standard types, since anything in the Elixir configuration # can be raw Elixir } // lib.mapAttrs (_name: type: elixirOr type) lib.types; // mapAttrs (_name: type: elixirOr type) types; }; generate = Loading Loading @@ -771,12 +802,12 @@ lib.optionalAttrs pkgs.config.allowAliases aliases inherit columnWidth; inherit indentWidth; indentType = if indentUsingTabs then "Tabs" else "Spaces"; value = lib.generators.toLua { inherit asBindings multiline; } value; value = toLua { inherit asBindings multiline; } value; passAsFile = [ "value" ]; preferLocalBuild = true; } '' ${lib.optionalString (!asBindings) '' ${optionalString (!asBindings) '' echo -n 'return ' >> $out ''} cat $valuePath >> $out Loading