Type:
Module

Overview

When using Psych.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 Psych.dump, the Ruby object graph is translated to an intermediary AST which is then converted to a YAML document.

Psych::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 Psych::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:

1
2
3
4
5
6
7
8
9
10
# 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:

1
stream.to_yaml => "---\n- foo\n"

Or convert it to Ruby:

1
stream.to_ruby => [["foo"]]

YAML AST Requirements

A valid YAML AST must have one Psych::Nodes::Stream at the root. A Psych::Nodes::Stream node must have 1 or more Psych::Nodes::Document nodes as children.

Psych::Nodes::Document nodes must have one and only one child. That child may be one of:

Psych::Nodes::Sequence and Psych::Nodes::Mapping nodes may have many children, but Psych::Nodes::Mapping nodes should have an even number of children.

All of these are valid children for Psych::Nodes::Sequence and Psych::Nodes::Mapping nodes:

Psych::Nodes::Scalar and Psych::Nodes::Alias are both terminal nodes and should not have any children.

transform
  • References/Ruby on Rails/Ruby/Classes/Psych/Psych::Nodes/Psych::Nodes::Node

transform() Instance Public methods Alias for:

2025-01-10 15:47:30
new
  • References/Ruby on Rails/Ruby/Classes/Psych/Psych::Nodes/Psych::Nodes::Scalar

new(value, anchor = nil, tag = nil, plain = true, quoted = false, style = ANY) Class Public methods

2025-01-10 15:47:30
yaml
  • References/Ruby on Rails/Ruby/Classes/Psych/Psych::Nodes/Psych::Nodes::Node

yaml(io = nil, options = {}) Instance Public methods Convert this node to YAML

2025-01-10 15:47:30
to_ruby
  • References/Ruby on Rails/Ruby/Classes/Psych/Psych::Nodes/Psych::Nodes::Node

to_ruby() Instance Public methods Convert this node to Ruby.

2025-01-10 15:47:30
new
  • References/Ruby on Rails/Ruby/Classes/Psych/Psych::Nodes/Psych::Nodes::Stream

new(encoding = UTF8) Class Public methods Create a new

2025-01-10 15:47:30
each
  • References/Ruby on Rails/Ruby/Classes/Psych/Psych::Nodes/Psych::Nodes::Node

each(&block) Instance Public methods Iterate over each node in the tree

2025-01-10 15:47:30
root
  • References/Ruby on Rails/Ruby/Classes/Psych/Psych::Nodes/Psych::Nodes::Document

root() Instance Public methods Returns the root node. A

2025-01-10 15:47:30
new
  • References/Ruby on Rails/Ruby/Classes/Psych/Psych::Nodes/Psych::Nodes::Node

new() Class Public methods Create a new

2025-01-10 15:47:30
to_yaml
  • References/Ruby on Rails/Ruby/Classes/Psych/Psych::Nodes/Psych::Nodes::Node

to_yaml(io = nil, options = {}) Instance Public methods Alias for:

2025-01-10 15:47:30
new
  • References/Ruby on Rails/Ruby/Classes/Psych/Psych::Nodes/Psych::Nodes::Document

new(version = [], tag_directives = [], implicit = false) Class Public methods Create

2025-01-10 15:47:30