Skip to contents

zuyaml 0.1.0

First release. The API is complete and the package is well tested, but it is not frozen: names, defaults and return types may still change. Pin the version if you depend on it.

Features

  • yaml_parse() / yaml_parse_all() parse YAML 1.2 from a string or a raw vector, yaml_emit() / yaml_emit_all() convert R objects back to YAML, and yaml_read() / yaml_read_all() / yaml_write() / yaml_write_all() do the same for files. Throughout, _all means a YAML stream: several documents separated by ---, which is a different thing from a sequence.

  • Scalars follow the YAML 1.2 core schema, so yes and no are strings and dates are not coerced. Quoted scalars are always strings, and a quoted empty string never becomes NULL.

  • Integers beyond 2^53 are preserved as zuyaml_bigint rather than silently rounded. big_integers selects a different policy.

  • Tags override schema resolution, so !!str 12 is the string "12", in every spelling a core tag has: the shorthand, the verbatim form, and a handle bound by a %TAG directive. Application tags such as !duration are ignored by default; tags = "error" refuses them.

  • Mappings whose keys are sequences or mappings become zuyaml_map rather than having their structure flattened into names. This is parse-only.

  • Errors are classed conditions carrying a stable code, line and column, so callers never have to match on message text.

  • max_size, max_depth and max_nodes bound untrusted input. The last of these is what stops alias-expansion bombs, which are small and shallow by construction and so escape the first two.

  • A value emitted with yaml_emit() parses back to the same value. Strings containing a line break, and strings with leading or trailing whitespace, are quoted so that neither is lost; a double with an integral value emits as 1.0, so it does not come back as an integer; and mapping keys are treated exactly like values. Asserted over the whole yaml-test-suite and over generated input. The exceptions are listed in vignette("zuyaml").

  • A literal NUL byte in the input is refused with an embedded_nul condition and a position. The underlying library treats one as end of input, so the rest of the document – including any later documents in the stream – would otherwise be discarded without a word.

  • A UTF-8 byte order mark at the start of a stream is not part of the document.

  • A float outside the range of a double converts to the nearest one: 1e309 is Inf, 1e-324 is 0, and 1e-323 is the subnormal it names. One extreme value never changes the R type of a field.

Notes

  • simplify defaults to FALSE: the shape of the result never depends on the contents of the document.

  • The cyaml C library is bundled and pinned to v0.1.3. See inst/COPYRIGHTS for licensing and the modifications made for R compatibility, and tools/patches/README.md for why each one is required.