lib.attrsets: Introduce showAttrPath
This commit is contained in:
parent
671a068a01
commit
71b130c581
3 changed files with 38 additions and 2 deletions
|
@ -4,7 +4,7 @@
|
||||||
let
|
let
|
||||||
inherit (builtins) head tail length;
|
inherit (builtins) head tail length;
|
||||||
inherit (lib.trivial) id;
|
inherit (lib.trivial) id;
|
||||||
inherit (lib.strings) concatStringsSep sanitizeDerivationName;
|
inherit (lib.strings) concatStringsSep concatMapStringsSep escapeNixIdentifier sanitizeDerivationName;
|
||||||
inherit (lib.lists) foldr foldl' concatMap concatLists elemAt all;
|
inherit (lib.lists) foldr foldl' concatMap concatLists elemAt all;
|
||||||
in
|
in
|
||||||
|
|
||||||
|
@ -477,6 +477,20 @@ rec {
|
||||||
overrideExisting = old: new:
|
overrideExisting = old: new:
|
||||||
mapAttrs (name: value: new.${name} or value) old;
|
mapAttrs (name: value: new.${name} or value) old;
|
||||||
|
|
||||||
|
/* Turns a list of strings into a human-readable description of those
|
||||||
|
strings represented as an attribute path. The result of this function is
|
||||||
|
not intended to be machine-readable.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
showAttrPath [ "foo" "10" "bar" ]
|
||||||
|
=> "foo.\"10\".bar"
|
||||||
|
showAttrPath []
|
||||||
|
=> "<root attribute path>"
|
||||||
|
*/
|
||||||
|
showAttrPath = path:
|
||||||
|
if path == [] then "<root attribute path>"
|
||||||
|
else concatMapStringsSep "." escapeNixIdentifier path;
|
||||||
|
|
||||||
/* Get a package output.
|
/* Get a package output.
|
||||||
If no output is found, fallback to `.out` and then to the default.
|
If no output is found, fallback to `.out` and then to the default.
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,7 @@ let
|
||||||
mapAttrs' mapAttrsToList mapAttrsRecursive mapAttrsRecursiveCond
|
mapAttrs' mapAttrsToList mapAttrsRecursive mapAttrsRecursiveCond
|
||||||
genAttrs isDerivation toDerivation optionalAttrs
|
genAttrs isDerivation toDerivation optionalAttrs
|
||||||
zipAttrsWithNames zipAttrsWith zipAttrs recursiveUpdateUntil
|
zipAttrsWithNames zipAttrsWith zipAttrs recursiveUpdateUntil
|
||||||
recursiveUpdate matchAttrs overrideExisting getOutput getBin
|
recursiveUpdate matchAttrs overrideExisting showAttrPath getOutput getBin
|
||||||
getLib getDev getMan chooseDevOutputs zipWithNames zip
|
getLib getDev getMan chooseDevOutputs zipWithNames zip
|
||||||
recurseIntoAttrs dontRecurseIntoAttrs cartesianProductOfSets;
|
recurseIntoAttrs dontRecurseIntoAttrs cartesianProductOfSets;
|
||||||
inherit (self.lists) singleton forEach foldr fold foldl foldl' imap0 imap1
|
inherit (self.lists) singleton forEach foldr fold foldl foldl' imap0 imap1
|
||||||
|
|
|
@ -761,4 +761,26 @@ runTests {
|
||||||
{ a = 3; b = 30; c = 300; }
|
{ a = 3; b = 30; c = 300; }
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# The example from the showAttrPath documentation
|
||||||
|
testShowAttrPathExample = {
|
||||||
|
expr = showAttrPath [ "foo" "10" "bar" ];
|
||||||
|
expected = "foo.\"10\".bar";
|
||||||
|
};
|
||||||
|
|
||||||
|
testShowAttrPathEmpty = {
|
||||||
|
expr = showAttrPath [];
|
||||||
|
expected = "<root attribute path>";
|
||||||
|
};
|
||||||
|
|
||||||
|
testShowAttrPathVarious = {
|
||||||
|
expr = showAttrPath [
|
||||||
|
"."
|
||||||
|
"foo"
|
||||||
|
"2"
|
||||||
|
"a2-b"
|
||||||
|
"_bc'de"
|
||||||
|
];
|
||||||
|
expected = "\".\".foo.\"2\".a2-b._bc'de";
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue