diff options
author | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-05-20 04:03:47 +0000 |
---|---|---|
committer | tenderlove <tenderlove@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-05-20 04:03:47 +0000 |
commit | 5256d1026505b01f75669c1087c74c04dacd05ba (patch) | |
tree | fef5fef33aed5c2a8398f42f53b32212f3ca3568 /ext/psych/lib/psych/visitors | |
parent | f0b0dd2912b7223fe8dd62d7b2531e26870a9def (diff) |
* ext/psych/lib/psych/stream.rb: adding YAML streaming API for
infinite length streams.
* ext/psych/lib/psych.rb: refactoring for streaming API
* ext/psych/lib/psych/{handler, stream, tree_builder}.rb: ditto
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27912 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'ext/psych/lib/psych/visitors')
-rw-r--r-- | ext/psych/lib/psych/visitors/visitor.rb | 9 | ||||
-rw-r--r-- | ext/psych/lib/psych/visitors/yaml_tree.rb | 28 |
2 files changed, 29 insertions, 8 deletions
diff --git a/ext/psych/lib/psych/visitors/visitor.rb b/ext/psych/lib/psych/visitors/visitor.rb index ccd8c3bd55..3471c43dfa 100644 --- a/ext/psych/lib/psych/visitors/visitor.rb +++ b/ext/psych/lib/psych/visitors/visitor.rb @@ -1,6 +1,15 @@ module Psych module Visitors class Visitor + attr_reader :started, :finished + alias :finished? :finished + alias :started? :started + + def initialize + @started = false + @finished = false + end + def accept target case target when Psych::Nodes::Scalar then visit_Psych_Nodes_Scalar target diff --git a/ext/psych/lib/psych/visitors/yaml_tree.rb b/ext/psych/lib/psych/visitors/yaml_tree.rb index 4adb8d4c66..93ccc5832b 100644 --- a/ext/psych/lib/psych/visitors/yaml_tree.rb +++ b/ext/psych/lib/psych/visitors/yaml_tree.rb @@ -10,11 +10,9 @@ module Psych class YAMLTree < Psych::Visitors::Visitor def initialize options = {}, emitter = Psych::TreeBuilder.new super() - @emitter = emitter - @st = {} - @ss = ScalarScanner.new - - @emitter.start_stream Psych::Nodes::Stream::UTF8 + @emitter = emitter + @st = {} + @ss = ScalarScanner.new @dispatch_cache = Hash.new do |h,klass| method = "visit_#{(klass.name || '').split('::').join('_')}" @@ -27,15 +25,29 @@ module Psych end end + def start encoding = Nodes::Stream::UTF8 + @emitter.start_stream(encoding).tap do + @started = true + end + end + + def finish + @emitter.end_stream.tap do + @finished = true + end + end + def tree - @emitter.end_stream + finish unless finished? end - def << object + def push object + start unless started? @emitter.start_document [], [], false accept object - @emitter.end_document true + @emitter.end_document end + alias :<< :push def accept target # return any aliases we find |