summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-10-28 05:59:59 +0000
committerkou <kou@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-10-28 05:59:59 +0000
commitde2e09e0bcf61fa54572feb6ed2e432ac003fe3d (patch)
treebc03ff3e692bc029fb8e50224f89bc167eb8b03c
parent134ded5d7720544f28c8949743ec4d64cc9b8b9d (diff)
* lib/rexml/document.rb (REXML::Document#write): Accept options
Hash as argument. * test/rexml/test_document.rb: Add tests for the above change. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37353 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog6
-rw-r--r--lib/rexml/document.rb42
-rw-r--r--test/rexml/test_document.rb95
3 files changed, 138 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 455dfa0345..2d09ca1e21 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sun Oct 28 14:59:14 2012 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/document.rb (REXML::Document#write): Accept options
+ Hash as argument.
+ * test/rexml/test_document.rb: Add tests for the above change.
+
Sun Oct 28 14:09:44 2012 Kouhei Sutou <kou@cozmixng.org>
* lib/rexml/document.rb (REXML::Document#write): Fix wrong usage
diff --git a/lib/rexml/document.rb b/lib/rexml/document.rb
index bbcc72fcca..6be13be4c5 100644
--- a/lib/rexml/document.rb
+++ b/lib/rexml/document.rb
@@ -144,6 +144,10 @@ module REXML
xml_decl().stand_alone?
end
+ # :call-seq:
+ # doc.write(output=$stdout, indent=-1, transtive=false, ie_hack=false)
+ # doc.write(options={:output => $stdout, :indent => -1, :transtive => false, :ie_hack => false})
+ #
# Write the XML tree out, optionally with indent. This writes out the
# entire XML document, including XML declarations, doctype declarations,
# and processing instructions (if any are given).
@@ -154,15 +158,27 @@ module REXML
# specified, because it adds unnecessary bandwidth to applications such
# as XML-RPC.
#
- # See also the classes in the rexml/formatters package for the proper way
- # to change the default formatting of XML output
+ # Accept Nth argument style and options Hash style as argument.
+ # The recommended style is options Hash style for one or more
+ # arguments case.
#
# _Examples_
# Document.new("<a><b/></a>").write
#
- # output_string = ""
+ # output = ""
+ # Document.new("<a><b/></a>").write(output)
+ #
+ # output = ""
+ # Document.new("<a><b/></a>").write(:output => output, :indent => 2)
+ #
+ # See also the classes in the rexml/formatters package for the proper way
+ # to change the default formatting of XML output.
+ #
+ # _Examples_
+ #
+ # output = ""
# tr = Transitive.new
- # tr.write(Document.new("<a><b/></a>"), output_string)
+ # tr.write(Document.new("<a><b/></a>"), output)
#
# output::
# output an object which supports '<< string'; this is where the
@@ -183,7 +199,23 @@ module REXML
# unable to parse proper XML, we have to provide a hack to generate XML
# that IE's limited abilities can handle. This hack inserts a space
# before the /> on empty tags. Defaults to false
- def write( output=$stdout, indent=-1, transitive=false, ie_hack=false )
+ def write(*arguments)
+ if arguments.size == 1 and arguments[0].class == Hash
+ options = arguments[0]
+
+ output = options[:output]
+ indent = options[:indent]
+ transitive = options[:transitive]
+ ie_hack = options[:ie_hack]
+ else
+ output, indent, transitive, ie_hack, = *arguments
+ end
+
+ output ||= $stdout
+ indent ||= -1
+ transitive = false if transitive.nil?
+ ie_hack = false if ie_hack.nil?
+
if xml_decl.encoding != 'UTF-8' && !output.kind_of?(Output)
output = Output.new( output, xml_decl.encoding )
end
diff --git a/test/rexml/test_document.rb b/test/rexml/test_document.rb
index ab0b1e4e96..e8ca2e1c24 100644
--- a/test/rexml/test_document.rb
+++ b/test/rexml/test_document.rb
@@ -106,4 +106,99 @@ EOX
doc = REXML::Document.new('<?xml version="1.0" standalone= "no" ?>')
assert_equal('no', doc.stand_alone?, bug2539)
end
+
+ class WriteTest < Test::Unit::TestCase
+ def setup
+ @document = REXML::Document.new(<<-EOX)
+<?xml version="1.0" encoding="UTF-8"?>
+<message>Hello world!</message>
+EOX
+ end
+
+ class ArgumentsTest < self
+ def test_output
+ output = ""
+ @document.write(output)
+ assert_equal(<<-EOX, output)
+<?xml version='1.0' encoding='UTF-8'?>
+<message>Hello world!</message>
+EOX
+ end
+
+ def test_indent
+ output = ""
+ indent = 2
+ @document.write(output, indent)
+ assert_equal(<<-EOX.chomp, output)
+<?xml version='1.0' encoding='UTF-8'?>
+<message>
+ Hello world!
+</message>
+EOX
+ end
+
+ def test_transitive
+ output = ""
+ indent = 2
+ transitive = true
+ @document.write(output, indent, transitive)
+ assert_equal(<<-EOX, output)
+<?xml version='1.0' encoding='UTF-8'?>
+<message
+>Hello world!</message
+>
+EOX
+ end
+
+ def test_ie_hack
+ output = ""
+ indent = -1
+ transitive = false
+ ie_hack = true
+ document = REXML::Document.new("<empty/>")
+ document.write(output, indent, transitive, ie_hack)
+ assert_equal("<empty />", output)
+ end
+ end
+
+ class OptionsTest < self
+ def test_output
+ output = ""
+ @document.write(:output => output)
+ assert_equal(<<-EOX, output)
+<?xml version='1.0' encoding='UTF-8'?>
+<message>Hello world!</message>
+EOX
+ end
+
+ def test_indent
+ output = ""
+ @document.write(:output => output, :indent => 2)
+ assert_equal(<<-EOX.chomp, output)
+<?xml version='1.0' encoding='UTF-8'?>
+<message>
+ Hello world!
+</message>
+EOX
+ end
+
+ def test_transitive
+ output = ""
+ @document.write(:output => output, :indent => 2, :transitive => true)
+ assert_equal(<<-EOX, output)
+<?xml version='1.0' encoding='UTF-8'?>
+<message
+>Hello world!</message
+>
+EOX
+ end
+
+ def test_ie_hack
+ output = ""
+ document = REXML::Document.new("<empty/>")
+ document.write(:output => output, :ie_hack => true)
+ assert_equal("<empty />", output)
+ end
+ end
+ end
end