diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2010-05-19 21:47:43 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2010-05-19 21:47:43 -0700 |
commit | 01b3d734cd685516ae4cba5bd4dbb7daab4931ee (patch) | |
tree | 577f044a119597140a826fb94a9d0416e05f6971 /lib/psych/stream.rb | |
parent | aa5e67a7dc7ba9e0d798d914f104f350f4d1969a (diff) | |
download | psych-01b3d734cd685516ae4cba5bd4dbb7daab4931ee.zip |
adding yaml streaming api
Diffstat (limited to 'lib/psych/stream.rb')
-rw-r--r-- | lib/psych/stream.rb | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/lib/psych/stream.rb b/lib/psych/stream.rb new file mode 100644 index 0000000..ac231aa --- /dev/null +++ b/lib/psych/stream.rb @@ -0,0 +1,53 @@ +module Psych + ### + # Psych::Stream is a streaming YAML emitter. It will not buffer your YAML, + # but send it straight to an IO. + # + # Here is an example use: + # + # stream = Psych::Stream.new($stdout) + # stream.start + # stream.push({:foo => 'bar'}) + # stream.finish + # + # YAML will be immediately emitted to $stdout with no buffering. + # + # Psych::Stream#start will take a block and ensure that Psych::Stream#finish + # is called, so you can do this form: + # + # stream = Psych::Stream.new($stdout) + # stream.start do |em| + # em.push(:foo => 'bar') + # end + # + class Stream < Psych::Visitors::YAMLTree + class Emitter < Psych::Emitter # :nodoc: + def end_document implicit_end = !streaming? + super + end + + def streaming? + true + end + end + + ### + # Create a new streaming emitter. Emitter will print to +io+. See + # Psych::Stream for an example. + def initialize io + super({}, Emitter.new(io)) + end + + ### + # Start streaming using +encoding+ + def start encoding = Nodes::Stream::UTF8 + super.tap { yield self if block_given? } + ensure + finish if block_given? + end + + private + def register target, obj + end + end +end |