lib.options.mkPackageOption: use lib.showAttrPath (#398066)

Changed files
+33 -5
lib
+6 -4
lib/options.nix
···
inherit (lib.attrsets)
attrByPath
optionalAttrs
+
showAttrPath
;
inherit (lib.strings)
concatMapStrings
···
;
inherit (lib.lists)
last
+
toList
;
prioritySuggestion = ''
Use `lib.mkForce value` or `lib.mkDefault value` to change the priority on any of these definitions.
···
}:
let
name' = if isList name then last name else name;
-
default' = if isList default then default else [ default ];
-
defaultText = concatStringsSep "." default';
+
default' = toList default;
+
defaultText = showAttrPath default';
defaultValue = attrByPath default' (throw "${defaultText} cannot be found in ${pkgsText}") pkgs;
defaults =
if default != null then
{
default = defaultValue;
-
defaultText = literalExpression ("${pkgsText}." + defaultText);
+
defaultText = literalExpression "${pkgsText}.${defaultText}";
}
else
optionalAttrs nullable {
···
}
// optionalAttrs (example != null) {
example = literalExpression (
-
if isList example then "${pkgsText}." + concatStringsSep "." example else example
+
if isList example then "${pkgsText}.${showAttrPath example}" else example
);
}
);
+13 -1
lib/tests/modules.sh
···
checkConfigOutput '^"hello"$' config.package.pname ./declare-mkPackageOption.nix
checkConfigOutput '^"hello"$' config.namedPackage.pname ./declare-mkPackageOption.nix
checkConfigOutput '^".*Hello.*"$' options.namedPackage.description ./declare-mkPackageOption.nix
+
checkConfigOutput '^"literalExpression"$' options.namedPackage.defaultText._type ./declare-mkPackageOption.nix
+
checkConfigOutput '^"pkgs\.hello"$' options.namedPackage.defaultText.text ./declare-mkPackageOption.nix
+
checkConfigOutput '^"hello"$' config.namedPackageSingletonDefault.pname ./declare-mkPackageOption.nix
+
checkConfigOutput '^".*Hello.*"$' options.namedPackageSingletonDefault.description ./declare-mkPackageOption.nix
+
checkConfigOutput '^"pkgs\.hello"$' options.namedPackageSingletonDefault.defaultText.text ./declare-mkPackageOption.nix
checkConfigOutput '^"hello"$' config.pathPackage.pname ./declare-mkPackageOption.nix
+
checkConfigOutput '^"literalExpression"$' options.packageWithExample.example._type ./declare-mkPackageOption.nix
checkConfigOutput '^"pkgs\.hello\.override \{ stdenv = pkgs\.clangStdenv; \}"$' options.packageWithExample.example.text ./declare-mkPackageOption.nix
+
checkConfigOutput '^"literalExpression"$' options.packageWithPathExample.example._type ./declare-mkPackageOption.nix
+
checkConfigOutput '^"pkgs\.hello"$' options.packageWithPathExample.example.text ./declare-mkPackageOption.nix
checkConfigOutput '^".*Example extra description\..*"$' options.packageWithExtraDescription.description ./declare-mkPackageOption.nix
checkConfigError 'The option .undefinedPackage. was accessed but has no value defined. Try setting the option.' config.undefinedPackage ./declare-mkPackageOption.nix
checkConfigOutput '^null$' config.nullablePackage ./declare-mkPackageOption.nix
-
checkConfigOutput '^"null or package"$' options.nullablePackageWithDefault.type.description ./declare-mkPackageOption.nix
+
checkConfigOutput '^"null or package"$' options.nullablePackage.type.description ./declare-mkPackageOption.nix
+
checkConfigOutput '^"hello"$' config.nullablePackageWithDefault.pname ./declare-mkPackageOption.nix
checkConfigOutput '^"myPkgs\.hello"$' options.packageWithPkgsText.defaultText.text ./declare-mkPackageOption.nix
checkConfigOutput '^"hello-other"$' options.packageFromOtherSet.default.pname ./declare-mkPackageOption.nix
+
checkConfigOutput '^"hello"$' config.packageInvalidIdentifier.pname ./declare-mkPackageOption.nix
+
checkConfigOutput '^"pkgs\.\\"123\\"\.\\"with\\\\\\"quote\\"\.hello"$' options.packageInvalidIdentifier.defaultText.text ./declare-mkPackageOption.nix
+
checkConfigOutput '^"pkgs\.\\"123\\"\.\\"with\\\\\\"quote\\"\.hello"$' options.packageInvalidIdentifierExample.example.text ./declare-mkPackageOption.nix
# submoduleWith
+14
lib/tests/modules/declare-mkPackageOption.nix
···
};
in
lib.mkPackageOption myPkgs "hello" { };
+
+
packageInvalidIdentifier =
+
let
+
myPkgs."123"."with\"quote" = { inherit (pkgs) hello; };
+
in
+
lib.mkPackageOption myPkgs [ "123" "with\"quote" "hello" ] { };
+
+
packageInvalidIdentifierExample = lib.mkPackageOption pkgs "hello" {
+
example = [
+
"123"
+
"with\"quote"
+
"hello"
+
];
+
};
};
}