mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/psych/lib/psych/nodes/node.rb: Make Psych::Nodes::Node
enumerable. * ext/psych/lib/psych/visitors/depth_first.rb: Add a depth-first visitor to enumerate over a YAML AST in a depth-first fashion * test/psych/nodes/test_enumerable.rb: test for enumerating nodes * test/psych/visitors/test_depth_first.rb: test for depth-first visitor git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30624 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
5f710e22cc
commit
960720ef4f
6 changed files with 142 additions and 0 deletions
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
||||||
|
Sat Jan 22 04:09:22 2011 Aaron Patterson <aaron@tenderlovemaking.com>
|
||||||
|
|
||||||
|
* ext/psych/lib/psych/nodes/node.rb: Make Psych::Nodes::Node
|
||||||
|
enumerable.
|
||||||
|
|
||||||
|
* ext/psych/lib/psych/visitors/depth_first.rb: Add a depth-first
|
||||||
|
visitor to enumerate over a YAML AST in a depth-first fashion
|
||||||
|
|
||||||
|
* test/psych/nodes/test_enumerable.rb: test for enumerating nodes
|
||||||
|
|
||||||
|
* test/psych/visitors/test_depth_first.rb: test for depth-first
|
||||||
|
visitor
|
||||||
|
|
||||||
Sat Jan 22 00:53:42 2011 Tanaka Akira <akr@fsij.org>
|
Sat Jan 22 00:53:42 2011 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
* vm_core.h: parenthesize macro arguments.
|
* vm_core.h: parenthesize macro arguments.
|
||||||
|
|
|
@ -6,6 +6,8 @@ module Psych
|
||||||
# The base class for any Node in a YAML parse tree. This class should
|
# The base class for any Node in a YAML parse tree. This class should
|
||||||
# never be instantiated.
|
# never be instantiated.
|
||||||
class Node
|
class Node
|
||||||
|
include Enumerable
|
||||||
|
|
||||||
# The children of this node
|
# The children of this node
|
||||||
attr_reader :children
|
attr_reader :children
|
||||||
|
|
||||||
|
@ -17,6 +19,14 @@ module Psych
|
||||||
@children = []
|
@children = []
|
||||||
end
|
end
|
||||||
|
|
||||||
|
###
|
||||||
|
# Iterate over each node in the tree. Yields each node to +block+ depth
|
||||||
|
# first.
|
||||||
|
def each &block
|
||||||
|
return enum_for :each unless block_given?
|
||||||
|
Visitors::DepthFirst.new(block).accept self
|
||||||
|
end
|
||||||
|
|
||||||
###
|
###
|
||||||
# Convert this node to Ruby.
|
# Convert this node to Ruby.
|
||||||
#
|
#
|
||||||
|
|
|
@ -3,3 +3,4 @@ require 'psych/visitors/to_ruby'
|
||||||
require 'psych/visitors/emitter'
|
require 'psych/visitors/emitter'
|
||||||
require 'psych/visitors/yaml_tree'
|
require 'psych/visitors/yaml_tree'
|
||||||
require 'psych/visitors/json_tree'
|
require 'psych/visitors/json_tree'
|
||||||
|
require 'psych/visitors/depth_first'
|
||||||
|
|
26
ext/psych/lib/psych/visitors/depth_first.rb
Normal file
26
ext/psych/lib/psych/visitors/depth_first.rb
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
module Psych
|
||||||
|
module Visitors
|
||||||
|
class DepthFirst < Psych::Visitors::Visitor
|
||||||
|
def initialize block
|
||||||
|
@block = block
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def nary o
|
||||||
|
o.children.each { |x| visit x }
|
||||||
|
@block.call o
|
||||||
|
end
|
||||||
|
alias :visit_Psych_Nodes_Stream :nary
|
||||||
|
alias :visit_Psych_Nodes_Document :nary
|
||||||
|
alias :visit_Psych_Nodes_Sequence :nary
|
||||||
|
alias :visit_Psych_Nodes_Mapping :nary
|
||||||
|
|
||||||
|
def terminal o
|
||||||
|
@block.call o
|
||||||
|
end
|
||||||
|
alias :visit_Psych_Nodes_Scalar :terminal
|
||||||
|
alias :visit_Psych_Nodes_Alias :terminal
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
43
test/psych/nodes/test_enumerable.rb
Normal file
43
test/psych/nodes/test_enumerable.rb
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
require_relative '../helper'
|
||||||
|
|
||||||
|
module Psych
|
||||||
|
module Nodes
|
||||||
|
class TestEnumerable < TestCase
|
||||||
|
def test_includes_enumerable
|
||||||
|
yaml = '--- hello'
|
||||||
|
assert_equal 3, Psych.parse_stream(yaml).to_a.length
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_returns_enumerator
|
||||||
|
yaml = '--- hello'
|
||||||
|
assert_equal 3, Psych.parse_stream(yaml).each.map { |x| x }.length
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_scalar
|
||||||
|
assert_equal 3, calls('--- hello').length
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_sequence
|
||||||
|
assert_equal 4, calls("---\n- hello").length
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_mapping
|
||||||
|
assert_equal 5, calls("---\nhello: world").length
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_alias
|
||||||
|
assert_equal 5, calls("--- &yay\n- foo\n- *yay\n").length
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def calls yaml
|
||||||
|
calls = []
|
||||||
|
Psych.parse_stream(yaml).each do |node|
|
||||||
|
calls << node
|
||||||
|
end
|
||||||
|
calls
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
49
test/psych/visitors/test_depth_first.rb
Normal file
49
test/psych/visitors/test_depth_first.rb
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
require_relative '../helper'
|
||||||
|
|
||||||
|
module Psych
|
||||||
|
module Visitors
|
||||||
|
class TestDepthFirst < TestCase
|
||||||
|
class Collector < Struct.new(:calls)
|
||||||
|
def initialize(calls = [])
|
||||||
|
super
|
||||||
|
end
|
||||||
|
|
||||||
|
def call obj
|
||||||
|
calls << obj
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_scalar
|
||||||
|
collector = Collector.new
|
||||||
|
visitor = Visitors::DepthFirst.new collector
|
||||||
|
visitor.accept Psych.parse_stream '--- hello'
|
||||||
|
|
||||||
|
assert_equal 3, collector.calls.length
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_sequence
|
||||||
|
collector = Collector.new
|
||||||
|
visitor = Visitors::DepthFirst.new collector
|
||||||
|
visitor.accept Psych.parse_stream "---\n- hello"
|
||||||
|
|
||||||
|
assert_equal 4, collector.calls.length
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_mapping
|
||||||
|
collector = Collector.new
|
||||||
|
visitor = Visitors::DepthFirst.new collector
|
||||||
|
visitor.accept Psych.parse_stream "---\nhello: world"
|
||||||
|
|
||||||
|
assert_equal 5, collector.calls.length
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_alias
|
||||||
|
collector = Collector.new
|
||||||
|
visitor = Visitors::DepthFirst.new collector
|
||||||
|
visitor.accept Psych.parse_stream "--- &yay\n- foo\n- *yay\n"
|
||||||
|
|
||||||
|
assert_equal 5, collector.calls.length
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Add table
Reference in a new issue