lib.formats.yaml: use well known YAML format

The way `(lib.formats.yaml {}).generate` generates YAML is compliant
because on YAML 1.2 spec JSON is a subset of YAML but it bugs people's
minds and can lead to problems with software that is not compatible with
YAML 1.2.

This commit also changes the test of the generation function. Data
validation/typing remains the same.

See #133802.

Signed-off-by: lucasew <lucas59356@gmail.com>
This commit is contained in:
lucasew 2021-08-13 16:31:14 -03:00 committed by Robert Helgesson
parent 346d5ce8a0
commit 83514ae7a9
4 changed files with 43 additions and 21 deletions

View File

@ -1058,6 +1058,13 @@ Superuser created successfully.
sign OCSP responses and server certificates.
</para>
</listitem>
<listitem>
<para>
<literal>lib.formats.yaml</literal>s
<literal>generate</literal> will not generate JSON anymore,
but instead use more of the YAML-specific syntax.
</para>
</listitem>
</itemizedlist>
</section>
</section>

View File

@ -302,3 +302,5 @@ To be able to access the web UI this port needs to be opened in the firewall.
- Zfs: `latestCompatibleLinuxPackages` is now exported on the zfs package. One can use `boot.kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;` to always track the latest compatible kernel with a given version of zfs.
- Nginx will use the value of `sslTrustedCertificate` if provided for a virtual host, even if `enableACME` is set. This is useful for providers not using the same certificate to sign OCSP responses and server certificates.
- `lib.formats.yaml`'s `generate` will not generate JSON anymore, but instead use more of the YAML-specific syntax.

View File

@ -48,14 +48,31 @@ rec {
};
# YAML has been a strict superset of JSON since 1.2
yaml = {}:
let jsonSet = json {};
in jsonSet // {
type = jsonSet.type // {
yaml = {}: {
generate = name: value: pkgs.runCommand name {
nativeBuildInputs = [ pkgs.remarshal ];
value = builtins.toJSON value;
passAsFile = [ "value" ];
} ''
json2yaml "$valuePath" "$out"
'';
type = with lib.types; let
valueType = nullOr (oneOf [
bool
int
float
str
path
(attrsOf valueType)
(listOf valueType)
]) // {
description = "YAML value";
};
};
in valueType;
};
ini = {
# Represents lists as duplicate keys

View File

@ -72,21 +72,17 @@ in runBuildTests {
path = ./formats.nix;
};
expected = ''
{
"attrs": {
"foo": null
},
"false": false,
"float": 3.141,
"list": [
null,
null
],
"null": null,
"path": "${./formats.nix}",
"str": "foo",
"true": true
}
attrs:
foo: null
'false': false
float: 3.141
list:
- null
- null
'null': null
path: ${./formats.nix}
str: foo
'true': true
'';
};