Module: Psych::Nodes
Relationships & Source Files | |
Namespace Children | |
Classes:
| |
Defined in: | ext/psych/lib/psych/nodes.rb, ext/psych/lib/psych/nodes/alias.rb, ext/psych/lib/psych/nodes/document.rb, ext/psych/lib/psych/nodes/mapping.rb, ext/psych/lib/psych/nodes/node.rb, ext/psych/lib/psych/nodes/scalar.rb, ext/psych/lib/psych/nodes/sequence.rb, ext/psych/lib/psych/nodes/stream.rb |
Overview
When using load to deserialize a YAML document, the document is translated to an intermediary AST. That intermediary AST is then translated in to a Ruby object graph.
In the opposite direction, when using dump, the Ruby object graph is translated to an intermediary AST which is then converted to a YAML document.
Nodes
contains all of the classes that make up the nodes of a YAML AST. You can manually build an AST and use one of the visitors (see Visitors) to convert that AST to either a YAML document or to a Ruby object graph.
Here is an example of building an AST that represents a list with one scalar:
# Create our nodes
stream = Psych::Nodes::Stream.new
doc = Psych::Nodes::Document.new
seq = Psych::Nodes::Sequence.new
scalar = Psych::Nodes::Scalar.new('foo')
# Build up our tree
stream.children << doc
doc.children << seq
seq.children << scalar
The stream is the root of the tree. We can then convert the tree to YAML:
stream.to_yaml => "---\n- foo\n"
Or convert it to Ruby:
stream.to_ruby => [["foo"]]
YAML AST Requirements
A valid YAML AST must have one Stream at the root. A Stream node must have 1 or more Document nodes as children.
Document nodes must have one and only one child. That child may be one of:
Sequence and Mapping nodes may have many children, but Mapping nodes should have an even number of children.
All of these are valid children for Sequence and Mapping nodes:
Scalar and Alias are both terminal nodes and should not have any children.