Module yaml
The yaml module takes strings in YAML format and decodes them, or takes a
series of non-YAML values and encodes them.
Below is a list of all yaml functions and members.
| Name | Use |
|---|---|
| yaml.encode() | Convert a Lua object to a YAML string |
| yaml.decode() | Convert a YAML string to a Lua object |
| __serialize parameter | Output structure specification |
| yaml.cfg() | Change configuration |
| yaml.NULL | Analog of Lua’s “nil” |
-
yaml.encode(lua_value)¶ Convert a Lua object to a YAML string.
Parameters: - lua_value – either a scalar value or a Lua table value.
Return: the original value reformatted as a YAML string.
Rtype:
-
yaml.decode(string)¶ Convert a YAML string to a Lua object.
Parameters: - string – a string formatted as YAML.
Return: the original contents formatted as a Lua table.
Rtype:
__serialize parameter:
The YAML output structure can be specified with __serialize:
'seq','sequence','array': table encoded as an array'map','mapping': table encoded as a mapfunction: the meta-method called to unpack serializable representation of table, cdata, or userdata objects
'seq' or 'map' also enable the flow (compact) mode for the YAML serializer
(flow="[1,2,3]" vs block=" - 1\n - 2\n - 3\n").
Serializing 'A' and 'B' with different __serialize values brings different
results:
tarantool> yaml.encode(setmetatable({'A', 'B'}, { __serialize="seq"}))
---
- '["A","B"]'
...
tarantool> yaml.encode(setmetatable({'A', 'B'}, { __serialize="map"}))
---
- '{"1":"A","2":"B"}'
...
tarantool> yaml.encode({setmetatable({f1 = 'A', f2 = 'B'}, { __serialize="map"})})
---
- '[{"f2":"B","f1":"A"}]'
...
tarantool> yaml.encode({setmetatable({f1 = 'A', f2 = 'B'}, { __serialize="seq"})})
---
- '[[]]'
...
-
yaml.cfg(table)¶ Set values affecting the behavior of encode and decode functions.
The values are all either integers or boolean
true/false.Option Default Use cfg.encode_invalid_numberstrue A flag saying whether to enable encoding of NaN and Inf numbers cfg.encode_number_precision14 Precision of floating point numbers cfg.encode_load_metatablestrue A flag saying whether the serializer will follow __serialize metatable field cfg.encode_use_tostringfalse A flag saying whether to use tostring()for unknown typescfg.encode_invalid_as_nilfalse A flag saying whether to use NULL for non-recognized types cfg.encode_sparse_converttrue A flag saying whether to handle excessively sparse arrays as maps. See detailed description below cfg.encode_sparse_ratio2 1/ encode_sparse_ratiois the permissible percentage of missing values in a sparse arraycfg.encode_sparse_safe10 A limit ensuring that small Lua arrays are always encoded as sparse arrays (instead of generating an error or encoding as map) cfg.decode_invalid_numberstrue A flag saying whether to enable decoding of NaN and Inf numbers cfg.decode_save_metatablestrue A flag saying whether to set metatables for all arrays and maps
Sparse arrays features:
During encoding, The YAML encoder tries to classify table into one of four kinds:
- Map: at least one table index is not unsigned integer.
- Regular array: all array indexes are available.
- Sparse array: at least one array index is missing.
- Excessively sparse array: the number of values missing exceeds the configured ratio.
An array is excessively sparse when all the following conditions are met:
encode_sparse_ratio> 0max(table)>encode_sparse_safemax(table)>count(table)*encode_sparse_ratio
The YAML encoder will never consider an array to be excessively sparse
when encode_sparse_ratio = 0. The encode_sparse_safe limit ensures
that small Lua arrays are always encoded as sparse arrays.
By default, attempting to encode an excessively sparse array will
generate an error. If encode_sparse_convert is set to true,
excessively sparse arrays will be handled as maps.
yaml.cfg() example 1:
The following code will encode 0/0 as NaN (“not a number”) and 1/0 as Inf (“infinity”), rather than returning nil or an error message:
yaml = require('yaml')
yaml.cfg{encode_invalid_numbers = true}
x = 0/0
y = 1/0
yaml.encode({1, x, y, 2})
The result of the yaml.encode() request will look like this:
tarantool> yaml.encode({1, x, y, 2})
---
- '[1,nan,inf,2]
...
yaml.cfg example 2:
To avoid generating errors on attempts to encode unknown data types as userdata/cdata, you can use this code:
tarantool> httpc = require('http.client').new()
---
...
tarantool> yaml.encode(httpc.curl)
---
- error: unsupported Lua type 'userdata'
...
tarantool> yaml.encode(httpc.curl, {encode_use_tostring=true})
---
- '"userdata: 0x010a4ef2a0"'
...
Note
To achieve the same effect for only one call to yaml.encode()
(i.e. without changing the configuration permanently), you can use
yaml.encode({1, x, y, 2}, {encode_invalid_numbers = true}).
Similar configuration settings exist for JSON and MsgPack.
-
yaml.NULL¶ A value comparable to Lua “nil” which may be useful as a placeholder in a tuple.
tarantool> yaml = require('yaml')
---
...
tarantool> y = yaml.encode({'a', 1, 'b', 2})
---
...
tarantool> z = yaml.decode(y)
---
...
tarantool> z[1], z[2], z[3], z[4]
---
- a
- 1
- b
- 2
...
tarantool> if yaml.NULL == nil then print('hi') end
hi
---
...
The YAML collection style can be
specified with __serialize:
__serialize="sequence"for a Block Sequence array,__serialize="seq"for a Flow Sequence array,__serialize="mapping"for a Block Mapping map,__serialize="map"for a Flow Mapping map.
Serializing 'A' and 'B' with different __serialize values causes
different results:
tarantool> yaml = require('yaml')
---
...
tarantool> print(yaml.encode(setmetatable({'A', 'B'}, { __serialize="sequence"})))
---
- A
- B
...
---
...
tarantool> print(yaml.encode(setmetatable({'A', 'B'}, { __serialize="seq"})))
--- ['A', 'B']
...
---
...
tarantool> print(yaml.encode({setmetatable({f1 = 'A', f2 = 'B'}, { __serialize="map"})}))
---
- {'f2': 'B', 'f1': 'A'}
...
---
...