* ext/psych/lib/psych/visitors/emitter.rb: sending emit options to

YAML emitter. [ruby-core:28318]
* ext/psych/emitter.c: updating documentation about emit options
* ext/psych/lib/psych/core_ext.rb: ditto
* ext/psych/lib/psych.rb (dump): passing emit options to emitter.
* ext/psych/lib/psych/nodes/node.rb: ditto

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28573 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
tenderlove 2010-07-07 23:05:45 +00:00
Родитель a5d37d10a9
Коммит 3a185ede69
8 изменённых файлов: 73 добавлений и 8 удалений

Просмотреть файл

@ -1,3 +1,16 @@
Thu Jul 8 08:01:03 2010 Aaron Patterson <aaron@tenderlovemaking.com>
* ext/psych/emitter.c: updating documentation about emit options
* ext/psych/lib/psych/core_ext.rb: ditto
* ext/psych/lib/psych.rb (dump): passing emit options to emitter.
* ext/psych/lib/psych/nodes/node.rb: ditto
* ext/psych/lib/psych/visitors/emitter.rb: sending emit options to
YAML emitter. [ruby-core:28318]
Thu Jul 8 06:05:58 2010 Tanaka Akira <akr@fsij.org>
* strftime.c (rb_strftime_with_timespec): support %:z and %::z.

Просмотреть файл

@ -435,7 +435,8 @@ static VALUE canonical(VALUE self)
/* call-seq: emitter.indentation = level
*
* Set the indentation level to +level+.
* Set the indentation level to +level+. The level must be less than 10 and
* greater than 1.
*/
static VALUE set_indentation(VALUE self, VALUE level)
{

Просмотреть файл

@ -155,11 +155,29 @@ module Psych
end
###
# Dump Ruby object +o+ to a YAML string using +options+.
# call-seq:
# Psych.dump(o) -> string of yaml
# Psych.dump(o, options) -> string of yaml
# Psych.dump(o, io) -> io object passed in
# Psych.dump(o, io, options) -> io object passed in
#
# Dump Ruby object +o+ to a YAML string. Optional +options+ may be passed in
# to control the output format. If an IO object is passed in, the YAML will
# be dumped to that IO object.
#
# Example:
#
# # Dump an array, get back a YAML string
# Psych.dump(['a', 'b']) # => "---\n- a\n- b\n"
#
# # Dump an array to an IO object
# Psych.dump(['a', 'b'], StringIO.new) # => #<StringIO:0x000001009d0890>
#
# # Dump an array with indentation set
# Psych.dump(['a', ['b']], :indentation => 3) # => "---\n- a\n- - b\n"
#
# # Dump an array to an IO with indentation set
# Psych.dump(['a', ['b']], StringIO.new, :indentation => 3)
def self.dump o, io = nil, options = {}
if Hash === io
options = io
@ -168,7 +186,7 @@ module Psych
visitor = Psych::Visitors::YAMLTree.new options
visitor << o
visitor.tree.to_yaml io
visitor.tree.to_yaml io, options
end
###

Просмотреть файл

@ -6,9 +6,10 @@ class Object
# FIXME: rename this to "to_yaml" when syck is removed
###
# call-seq: to_yaml
# call-seq: to_yaml(options = {})
#
# Convert an object to YAML
# Convert an object to YAML. See Psych.dump for more information on the
# available +options+.
def psych_to_yaml options = {}
Psych.dump self, options
end

Просмотреть файл

@ -30,10 +30,10 @@ module Psych
# Convert this node to YAML.
#
# See also Psych::Visitors::Emitter
def to_yaml io = nil
def to_yaml io = nil, options = {}
real_io = io || StringIO.new
Visitors::Emitter.new(real_io).accept self
Visitors::Emitter.new(real_io, options).accept self
return real_io.string unless io
io
end

Просмотреть файл

@ -1,8 +1,10 @@
module Psych
module Visitors
class Emitter < Psych::Visitors::Visitor
def initialize io
def initialize io, options = {}
@handler = Psych::Emitter.new io
@handler.indentation = options[:indentation] if options[:indentation]
@handler.canonical = options[:canonical] if options[:canonical]
end
def visit_Psych_Nodes_Stream o

Просмотреть файл

@ -8,6 +8,16 @@ class TestPsych < Psych::TestCase
Psych.domain_types.clear
end
def test_indent
yml = Psych.dump({:a => {'b' => 'c'}}, {:indentation => 5})
assert_match(/^[ ]{5}b/, yml)
end
def test_canonical
yml = Psych.dump({:a => {'b' => 'c'}}, {:canonical => true})
assert_match(/\? ! "b/, yml)
end
def test_load_argument_error
assert_raises(TypeError) do
Psych.load nil

Просмотреть файл

@ -9,6 +9,26 @@ module Psych
@visitor = Visitors::Emitter.new @io
end
def test_options
io = StringIO.new
visitor = Visitors::Emitter.new io, :indentation => 3
s = Nodes::Stream.new
doc = Nodes::Document.new
mapping = Nodes::Mapping.new
m2 = Nodes::Mapping.new
m2.children << Nodes::Scalar.new('a')
m2.children << Nodes::Scalar.new('b')
mapping.children << Nodes::Scalar.new('key')
mapping.children << m2
doc.children << mapping
s.children << doc
visitor.accept s
assert_match(/^[ ]{3}a/, io.string)
end
def test_stream
s = Nodes::Stream.new
@visitor.accept s