nokogiri-maglev- 1.5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.autotest +26 -0
- data/.gemtest +0 -0
- data/CHANGELOG.ja.rdoc +544 -0
- data/CHANGELOG.rdoc +532 -0
- data/Manifest.txt +283 -0
- data/README.ja.rdoc +106 -0
- data/README.rdoc +174 -0
- data/Rakefile +171 -0
- data/bin/nokogiri +53 -0
- data/ext/nokogiri/depend +358 -0
- data/ext/nokogiri/extconf.rb +124 -0
- data/ext/nokogiri/html_document.c +154 -0
- data/ext/nokogiri/html_document.h +10 -0
- data/ext/nokogiri/html_element_description.c +276 -0
- data/ext/nokogiri/html_element_description.h +10 -0
- data/ext/nokogiri/html_entity_lookup.c +32 -0
- data/ext/nokogiri/html_entity_lookup.h +8 -0
- data/ext/nokogiri/html_sax_parser_context.c +94 -0
- data/ext/nokogiri/html_sax_parser_context.h +11 -0
- data/ext/nokogiri/nokogiri.c +115 -0
- data/ext/nokogiri/nokogiri.h +160 -0
- data/ext/nokogiri/st.c +576 -0
- data/ext/nokogiri/xml_attr.c +94 -0
- data/ext/nokogiri/xml_attr.h +9 -0
- data/ext/nokogiri/xml_attribute_decl.c +70 -0
- data/ext/nokogiri/xml_attribute_decl.h +9 -0
- data/ext/nokogiri/xml_cdata.c +56 -0
- data/ext/nokogiri/xml_cdata.h +9 -0
- data/ext/nokogiri/xml_comment.c +54 -0
- data/ext/nokogiri/xml_comment.h +9 -0
- data/ext/nokogiri/xml_document.c +478 -0
- data/ext/nokogiri/xml_document.h +23 -0
- data/ext/nokogiri/xml_document_fragment.c +48 -0
- data/ext/nokogiri/xml_document_fragment.h +10 -0
- data/ext/nokogiri/xml_dtd.c +202 -0
- data/ext/nokogiri/xml_dtd.h +10 -0
- data/ext/nokogiri/xml_element_content.c +123 -0
- data/ext/nokogiri/xml_element_content.h +10 -0
- data/ext/nokogiri/xml_element_decl.c +69 -0
- data/ext/nokogiri/xml_element_decl.h +9 -0
- data/ext/nokogiri/xml_encoding_handler.c +79 -0
- data/ext/nokogiri/xml_encoding_handler.h +8 -0
- data/ext/nokogiri/xml_entity_decl.c +110 -0
- data/ext/nokogiri/xml_entity_decl.h +10 -0
- data/ext/nokogiri/xml_entity_reference.c +52 -0
- data/ext/nokogiri/xml_entity_reference.h +9 -0
- data/ext/nokogiri/xml_io.c +56 -0
- data/ext/nokogiri/xml_io.h +11 -0
- data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
- data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
- data/ext/nokogiri/xml_namespace.c +84 -0
- data/ext/nokogiri/xml_namespace.h +13 -0
- data/ext/nokogiri/xml_node.c +1397 -0
- data/ext/nokogiri/xml_node.h +13 -0
- data/ext/nokogiri/xml_node_set.c +418 -0
- data/ext/nokogiri/xml_node_set.h +9 -0
- data/ext/nokogiri/xml_processing_instruction.c +56 -0
- data/ext/nokogiri/xml_processing_instruction.h +9 -0
- data/ext/nokogiri/xml_reader.c +684 -0
- data/ext/nokogiri/xml_reader.h +10 -0
- data/ext/nokogiri/xml_relax_ng.c +162 -0
- data/ext/nokogiri/xml_relax_ng.h +9 -0
- data/ext/nokogiri/xml_sax_parser.c +293 -0
- data/ext/nokogiri/xml_sax_parser.h +39 -0
- data/ext/nokogiri/xml_sax_parser_context.c +199 -0
- data/ext/nokogiri/xml_sax_parser_context.h +10 -0
- data/ext/nokogiri/xml_sax_push_parser.c +115 -0
- data/ext/nokogiri/xml_sax_push_parser.h +9 -0
- data/ext/nokogiri/xml_schema.c +205 -0
- data/ext/nokogiri/xml_schema.h +9 -0
- data/ext/nokogiri/xml_syntax_error.c +58 -0
- data/ext/nokogiri/xml_syntax_error.h +13 -0
- data/ext/nokogiri/xml_text.c +50 -0
- data/ext/nokogiri/xml_text.h +9 -0
- data/ext/nokogiri/xml_xpath_context.c +315 -0
- data/ext/nokogiri/xml_xpath_context.h +9 -0
- data/ext/nokogiri/xslt_stylesheet.c +265 -0
- data/ext/nokogiri/xslt_stylesheet.h +9 -0
- data/lib/nokogiri.rb +127 -0
- data/lib/nokogiri/css.rb +27 -0
- data/lib/nokogiri/css/node.rb +99 -0
- data/lib/nokogiri/css/parser.rb +677 -0
- data/lib/nokogiri/css/parser.y +237 -0
- data/lib/nokogiri/css/parser_extras.rb +91 -0
- data/lib/nokogiri/css/syntax_error.rb +7 -0
- data/lib/nokogiri/css/tokenizer.rb +152 -0
- data/lib/nokogiri/css/tokenizer.rex +55 -0
- data/lib/nokogiri/css/xpath_visitor.rb +171 -0
- data/lib/nokogiri/decorators/slop.rb +35 -0
- data/lib/nokogiri/html.rb +36 -0
- data/lib/nokogiri/html/builder.rb +35 -0
- data/lib/nokogiri/html/document.rb +213 -0
- data/lib/nokogiri/html/document_fragment.rb +41 -0
- data/lib/nokogiri/html/element_description.rb +23 -0
- data/lib/nokogiri/html/element_description_defaults.rb +671 -0
- data/lib/nokogiri/html/entity_lookup.rb +13 -0
- data/lib/nokogiri/html/sax/parser.rb +52 -0
- data/lib/nokogiri/html/sax/parser_context.rb +16 -0
- data/lib/nokogiri/syntax_error.rb +4 -0
- data/lib/nokogiri/version.rb +88 -0
- data/lib/nokogiri/xml.rb +67 -0
- data/lib/nokogiri/xml/attr.rb +14 -0
- data/lib/nokogiri/xml/attribute_decl.rb +18 -0
- data/lib/nokogiri/xml/builder.rb +426 -0
- data/lib/nokogiri/xml/cdata.rb +11 -0
- data/lib/nokogiri/xml/character_data.rb +7 -0
- data/lib/nokogiri/xml/document.rb +234 -0
- data/lib/nokogiri/xml/document_fragment.rb +98 -0
- data/lib/nokogiri/xml/dtd.rb +22 -0
- data/lib/nokogiri/xml/element_content.rb +36 -0
- data/lib/nokogiri/xml/element_decl.rb +13 -0
- data/lib/nokogiri/xml/entity_decl.rb +19 -0
- data/lib/nokogiri/xml/namespace.rb +13 -0
- data/lib/nokogiri/xml/node.rb +915 -0
- data/lib/nokogiri/xml/node/save_options.rb +61 -0
- data/lib/nokogiri/xml/node_set.rb +357 -0
- data/lib/nokogiri/xml/notation.rb +6 -0
- data/lib/nokogiri/xml/parse_options.rb +93 -0
- data/lib/nokogiri/xml/pp.rb +2 -0
- data/lib/nokogiri/xml/pp/character_data.rb +18 -0
- data/lib/nokogiri/xml/pp/node.rb +56 -0
- data/lib/nokogiri/xml/processing_instruction.rb +8 -0
- data/lib/nokogiri/xml/reader.rb +112 -0
- data/lib/nokogiri/xml/relax_ng.rb +32 -0
- data/lib/nokogiri/xml/sax.rb +4 -0
- data/lib/nokogiri/xml/sax/document.rb +164 -0
- data/lib/nokogiri/xml/sax/parser.rb +115 -0
- data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
- data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
- data/lib/nokogiri/xml/schema.rb +63 -0
- data/lib/nokogiri/xml/syntax_error.rb +47 -0
- data/lib/nokogiri/xml/text.rb +9 -0
- data/lib/nokogiri/xml/xpath.rb +10 -0
- data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
- data/lib/nokogiri/xml/xpath_context.rb +16 -0
- data/lib/nokogiri/xslt.rb +52 -0
- data/lib/nokogiri/xslt/stylesheet.rb +25 -0
- data/lib/xsd/xmlparser/nokogiri.rb +90 -0
- data/nokogiri_help_responses.md +40 -0
- data/tasks/cross_compile.rb +152 -0
- data/tasks/nokogiri.org.rb +18 -0
- data/tasks/test.rb +94 -0
- data/test/css/test_nthiness.rb +159 -0
- data/test/css/test_parser.rb +303 -0
- data/test/css/test_tokenizer.rb +198 -0
- data/test/css/test_xpath_visitor.rb +85 -0
- data/test/decorators/test_slop.rb +16 -0
- data/test/files/2ch.html +108 -0
- data/test/files/address_book.rlx +12 -0
- data/test/files/address_book.xml +10 -0
- data/test/files/bar/bar.xsd +4 -0
- data/test/files/dont_hurt_em_why.xml +422 -0
- data/test/files/encoding.html +82 -0
- data/test/files/encoding.xhtml +84 -0
- data/test/files/exslt.xml +8 -0
- data/test/files/exslt.xslt +35 -0
- data/test/files/foo/foo.xsd +4 -0
- data/test/files/metacharset.html +10 -0
- data/test/files/noencoding.html +47 -0
- data/test/files/po.xml +32 -0
- data/test/files/po.xsd +66 -0
- data/test/files/shift_jis.html +10 -0
- data/test/files/shift_jis.xml +5 -0
- data/test/files/snuggles.xml +3 -0
- data/test/files/staff.dtd +10 -0
- data/test/files/staff.xml +59 -0
- data/test/files/staff.xslt +32 -0
- data/test/files/tlm.html +850 -0
- data/test/files/valid_bar.xml +2 -0
- data/test/helper.rb +173 -0
- data/test/html/sax/test_parser.rb +139 -0
- data/test/html/sax/test_parser_context.rb +48 -0
- data/test/html/test_builder.rb +165 -0
- data/test/html/test_document.rb +472 -0
- data/test/html/test_document_encoding.rb +138 -0
- data/test/html/test_document_fragment.rb +255 -0
- data/test/html/test_element_description.rb +101 -0
- data/test/html/test_named_characters.rb +14 -0
- data/test/html/test_node.rb +193 -0
- data/test/html/test_node_encoding.rb +27 -0
- data/test/test_convert_xpath.rb +135 -0
- data/test/test_css_cache.rb +45 -0
- data/test/test_encoding_handler.rb +46 -0
- data/test/test_memory_leak.rb +72 -0
- data/test/test_nokogiri.rb +133 -0
- data/test/test_reader.rb +425 -0
- data/test/test_soap4r_sax.rb +52 -0
- data/test/test_xslt_transforms.rb +193 -0
- data/test/xml/node/test_save_options.rb +28 -0
- data/test/xml/node/test_subclass.rb +44 -0
- data/test/xml/sax/test_parser.rb +338 -0
- data/test/xml/sax/test_parser_context.rb +113 -0
- data/test/xml/sax/test_push_parser.rb +156 -0
- data/test/xml/test_attr.rb +65 -0
- data/test/xml/test_attribute_decl.rb +86 -0
- data/test/xml/test_builder.rb +227 -0
- data/test/xml/test_cdata.rb +50 -0
- data/test/xml/test_comment.rb +29 -0
- data/test/xml/test_document.rb +697 -0
- data/test/xml/test_document_encoding.rb +26 -0
- data/test/xml/test_document_fragment.rb +192 -0
- data/test/xml/test_dtd.rb +107 -0
- data/test/xml/test_dtd_encoding.rb +33 -0
- data/test/xml/test_element_content.rb +56 -0
- data/test/xml/test_element_decl.rb +73 -0
- data/test/xml/test_entity_decl.rb +122 -0
- data/test/xml/test_entity_reference.rb +21 -0
- data/test/xml/test_namespace.rb +70 -0
- data/test/xml/test_node.rb +917 -0
- data/test/xml/test_node_attributes.rb +34 -0
- data/test/xml/test_node_encoding.rb +107 -0
- data/test/xml/test_node_reparenting.rb +334 -0
- data/test/xml/test_node_set.rb +742 -0
- data/test/xml/test_parse_options.rb +52 -0
- data/test/xml/test_processing_instruction.rb +30 -0
- data/test/xml/test_reader_encoding.rb +126 -0
- data/test/xml/test_relax_ng.rb +60 -0
- data/test/xml/test_schema.rb +94 -0
- data/test/xml/test_syntax_error.rb +12 -0
- data/test/xml/test_text.rb +47 -0
- data/test/xml/test_unparented_node.rb +381 -0
- data/test/xml/test_xpath.rb +237 -0
- data/test/xslt/test_custom_functions.rb +94 -0
- data/test/xslt/test_exception_handling.rb +37 -0
- metadata +548 -0
@@ -0,0 +1,72 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class TestMemoryLeak < Nokogiri::TestCase
|
4
|
+
if ENV['NOKOGIRI_GC'] # turning these off by default for now
|
5
|
+
def test_dont_hurt_em_why
|
6
|
+
content = File.open("#{File.dirname(__FILE__)}/files/dont_hurt_em_why.xml").read
|
7
|
+
ndoc = Nokogiri::XML(content)
|
8
|
+
2.times do
|
9
|
+
ndoc.search('status text').first.inner_text
|
10
|
+
ndoc.search('user name').first.inner_text
|
11
|
+
GC.start
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class BadIO
|
16
|
+
def read(*args)
|
17
|
+
raise 'hell'
|
18
|
+
end
|
19
|
+
|
20
|
+
def write(*args)
|
21
|
+
raise 'chickens'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_for_mem_leak_on_io_callbacks
|
26
|
+
io = File.open SNUGGLES_FILE
|
27
|
+
Nokogiri::XML.parse(io)
|
28
|
+
|
29
|
+
(10**10).times do
|
30
|
+
Nokogiri::XML.parse(BadIO.new) rescue nil
|
31
|
+
doc.write BadIO.new rescue nil
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_for_memory_leak
|
36
|
+
begin
|
37
|
+
# we don't use Dike in any tests, but requiring it has side effects
|
38
|
+
# that can create memory leaks, and that's what we're testing for.
|
39
|
+
require 'rubygems'
|
40
|
+
require 'dike' # do not remove!
|
41
|
+
|
42
|
+
count_start = count_object_space_documents
|
43
|
+
xml_data = <<-EOS
|
44
|
+
<test>
|
45
|
+
<items>
|
46
|
+
<item>abc</item>
|
47
|
+
<item>1234</item>
|
48
|
+
<item>Zzz</item>
|
49
|
+
<items>
|
50
|
+
</test>
|
51
|
+
EOS
|
52
|
+
20.times do
|
53
|
+
doc = Nokogiri::XML(xml_data)
|
54
|
+
doc.xpath("//item")
|
55
|
+
end
|
56
|
+
2.times { GC.start }
|
57
|
+
count_end = count_object_space_documents
|
58
|
+
assert((count_end - count_start) <= 2, "memory leak detected")
|
59
|
+
rescue LoadError
|
60
|
+
puts "\ndike is not installed, skipping memory leak test"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end # if NOKOGIRI_GC
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def count_object_space_documents
|
68
|
+
count = 0
|
69
|
+
ObjectSpace.each_object {|j| count += 1 if j.is_a?(Nokogiri::XML::Document) }
|
70
|
+
count
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
lpx = $LOAD_PATH
|
2
|
+
require "helper"
|
3
|
+
|
4
|
+
class TestNokogiri < Nokogiri::TestCase
|
5
|
+
def test_versions
|
6
|
+
version_match = /\d+\.\d+\.\d+/
|
7
|
+
assert_match version_match, Nokogiri::VERSION
|
8
|
+
|
9
|
+
assert_equal Nokogiri::VERSION_INFO['ruby']['version'], ::RUBY_VERSION
|
10
|
+
assert_equal Nokogiri::VERSION_INFO['ruby']['platform'], ::RUBY_PLATFORM
|
11
|
+
|
12
|
+
if Nokogiri.uses_libxml?
|
13
|
+
assert_match version_match, Nokogiri::LIBXML_VERSION
|
14
|
+
assert_equal 'extension', Nokogiri::VERSION_INFO['libxml']['binding']
|
15
|
+
|
16
|
+
assert_match version_match, Nokogiri::VERSION_INFO['libxml']['compiled']
|
17
|
+
assert_equal Nokogiri::LIBXML_VERSION, Nokogiri::VERSION_INFO['libxml']['compiled']
|
18
|
+
|
19
|
+
assert_match version_match, Nokogiri::VERSION_INFO['libxml']['loaded']
|
20
|
+
Nokogiri::LIBXML_PARSER_VERSION =~ /(\d)(\d{2})(\d{2})/
|
21
|
+
major = $1.to_i
|
22
|
+
minor = $2.to_i
|
23
|
+
bug = $3.to_i
|
24
|
+
assert_equal "#{major}.#{minor}.#{bug}", Nokogiri::VERSION_INFO['libxml']['loaded']
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_libxml_iconv
|
29
|
+
assert Nokogiri.const_defined?(:LIBXML_ICONV_ENABLED) if Nokogiri.uses_libxml?
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_parse_with_io
|
33
|
+
doc = Nokogiri.parse(
|
34
|
+
StringIO.new("<html><head><title></title><body></body></html>")
|
35
|
+
)
|
36
|
+
assert_instance_of Nokogiri::HTML::Document, doc
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_xml?
|
40
|
+
doc = Nokogiri.parse(File.read(XML_FILE))
|
41
|
+
assert doc.xml?
|
42
|
+
assert !doc.html?
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_html?
|
46
|
+
doc = Nokogiri.parse(File.read(HTML_FILE))
|
47
|
+
assert !doc.xml?
|
48
|
+
assert doc.html?
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_nokogiri_method_with_html
|
52
|
+
doc1 = Nokogiri(File.read(HTML_FILE))
|
53
|
+
doc2 = Nokogiri.parse(File.read(HTML_FILE))
|
54
|
+
assert_equal doc1.serialize, doc2.serialize
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_nokogiri_method_with_block
|
58
|
+
doc = Nokogiri { b "bold tag" }
|
59
|
+
assert_equal('<b>bold tag</b>', doc.to_html.chomp)
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_make_with_html
|
63
|
+
doc = Nokogiri.make("<b>bold tag</b>")
|
64
|
+
assert_equal('<b>bold tag</b>', doc.to_html.chomp)
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_make_with_block
|
68
|
+
doc = Nokogiri.make { b "bold tag" }
|
69
|
+
assert_equal('<b>bold tag</b>', doc.to_html.chomp)
|
70
|
+
end
|
71
|
+
|
72
|
+
SLOP_HTML = <<-END
|
73
|
+
<html>
|
74
|
+
<body>
|
75
|
+
<ul>
|
76
|
+
<li class='red'>one</li>
|
77
|
+
<li class='blue'>two</li>
|
78
|
+
</ul>
|
79
|
+
<div>
|
80
|
+
one
|
81
|
+
<div>div two</div>
|
82
|
+
</div>
|
83
|
+
</body>
|
84
|
+
</html>
|
85
|
+
END
|
86
|
+
|
87
|
+
def test_slop_css
|
88
|
+
doc = Nokogiri::Slop(<<-eohtml)
|
89
|
+
<html>
|
90
|
+
<body>
|
91
|
+
<div>
|
92
|
+
one
|
93
|
+
<div class='foo'>
|
94
|
+
div two
|
95
|
+
<div class='foo'>
|
96
|
+
div three
|
97
|
+
</div>
|
98
|
+
</div>
|
99
|
+
</div>
|
100
|
+
</body>
|
101
|
+
</html>
|
102
|
+
eohtml
|
103
|
+
assert_equal "div", doc.html.body.div.div('.foo').name
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_slop
|
107
|
+
doc = Nokogiri::Slop(SLOP_HTML)
|
108
|
+
|
109
|
+
assert_equal "one", doc.html.body.ul.li.first.text
|
110
|
+
assert_equal "two", doc.html.body.ul.li(".blue").text
|
111
|
+
assert_equal "div two", doc.html.body.div.div.text
|
112
|
+
|
113
|
+
assert_equal "two", doc.html.body.ul.li(:css => ".blue").text
|
114
|
+
|
115
|
+
assert_equal "two", doc.html.body.ul.li(:xpath => "position()=2").text
|
116
|
+
assert_equal "one", doc.html.body.ul.li(:xpath => ["contains(text(),'o')"]).first.text
|
117
|
+
assert_equal "two", doc.html.body.ul.li(:xpath => ["contains(text(),'o')","contains(text(),'t')"]).text
|
118
|
+
|
119
|
+
assert_raise(NoMethodError) { doc.nonexistent }
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_slop_decorator
|
123
|
+
doc = Nokogiri(SLOP_HTML)
|
124
|
+
assert !doc.decorators(Nokogiri::XML::Node).include?(Nokogiri::Decorators::Slop)
|
125
|
+
|
126
|
+
doc.slop!
|
127
|
+
assert doc.decorators(Nokogiri::XML::Node).include?(Nokogiri::Decorators::Slop)
|
128
|
+
|
129
|
+
doc.slop!
|
130
|
+
assert_equal 1, doc.decorators(Nokogiri::XML::Node).select { |d| d == Nokogiri::Decorators::Slop }.size
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
data/test/test_reader.rb
ADDED
@@ -0,0 +1,425 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require "helper"
|
3
|
+
|
4
|
+
class TestReader < Nokogiri::TestCase
|
5
|
+
def test_from_io_sets_io_as_source
|
6
|
+
io = File.open SNUGGLES_FILE
|
7
|
+
reader = Nokogiri::XML::Reader.from_io(io)
|
8
|
+
assert_equal io, reader.source
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_empty_element?
|
12
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
13
|
+
<xml><city>Paris</city><state/></xml>
|
14
|
+
eoxml
|
15
|
+
|
16
|
+
results = reader.map do |node|
|
17
|
+
if node.node_type == Nokogiri::XML::Node::ELEMENT_NODE
|
18
|
+
node.empty_element?
|
19
|
+
end
|
20
|
+
end
|
21
|
+
assert_equal [false, false, nil, nil, true, nil], results
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_self_closing?
|
25
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
26
|
+
<xml><city>Paris</city><state/></xml>
|
27
|
+
eoxml
|
28
|
+
|
29
|
+
results = reader.map do |node|
|
30
|
+
if node.node_type == Nokogiri::XML::Node::ELEMENT_NODE
|
31
|
+
node.self_closing?
|
32
|
+
end
|
33
|
+
end
|
34
|
+
assert_equal [false, false, nil, nil, true, nil], results
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_reader_takes_block
|
38
|
+
options = nil
|
39
|
+
Nokogiri::XML::Reader(File.read(XML_FILE), XML_FILE) do |cfg|
|
40
|
+
options = cfg
|
41
|
+
options.nonet.nowarning.dtdattr
|
42
|
+
end
|
43
|
+
assert options.nonet?
|
44
|
+
assert options.nowarning?
|
45
|
+
assert options.dtdattr?
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_nil_raises
|
49
|
+
assert_raises(ArgumentError) {
|
50
|
+
Nokogiri::XML::Reader.from_memory(nil)
|
51
|
+
}
|
52
|
+
assert_raises(ArgumentError) {
|
53
|
+
Nokogiri::XML::Reader.from_io(nil)
|
54
|
+
}
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_from_io
|
58
|
+
io = File.open SNUGGLES_FILE
|
59
|
+
reader = Nokogiri::XML::Reader.from_io(io)
|
60
|
+
assert_equal false, reader.default?
|
61
|
+
assert_equal [false, false, false, false, false, false, false],
|
62
|
+
reader.map { |x| x.default? }
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_io
|
66
|
+
io = File.open SNUGGLES_FILE
|
67
|
+
reader = Nokogiri::XML::Reader(io)
|
68
|
+
assert_equal false, reader.default?
|
69
|
+
assert_equal [false, false, false, false, false, false, false],
|
70
|
+
reader.map { |x| x.default? }
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_string_io
|
74
|
+
io = StringIO.new(<<-eoxml)
|
75
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
76
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
77
|
+
</x>
|
78
|
+
eoxml
|
79
|
+
reader = Nokogiri::XML::Reader(io)
|
80
|
+
assert_equal false, reader.default?
|
81
|
+
assert_equal [false, false, false, false, false, false, false],
|
82
|
+
reader.map { |x| x.default? }
|
83
|
+
end
|
84
|
+
|
85
|
+
class ReallyBadIO
|
86
|
+
def read(size)
|
87
|
+
'a' * size ** 10
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
class ReallyBadIO4Java
|
92
|
+
def read(size=1)
|
93
|
+
'a' * size ** 10
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_io_that_reads_too_much
|
98
|
+
if Nokogiri.jruby?
|
99
|
+
io = ReallyBadIO4Java.new
|
100
|
+
Nokogiri::XML::Reader(io)
|
101
|
+
else
|
102
|
+
io = ReallyBadIO.new
|
103
|
+
Nokogiri::XML::Reader(io)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_in_memory
|
108
|
+
assert Nokogiri::XML::Reader(<<-eoxml)
|
109
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
110
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
111
|
+
</x>
|
112
|
+
eoxml
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_reader_holds_on_to_string
|
116
|
+
xml = <<-eoxml
|
117
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
118
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
119
|
+
</x>
|
120
|
+
eoxml
|
121
|
+
reader = Nokogiri::XML::Reader(xml)
|
122
|
+
assert_equal xml, reader.source
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_default?
|
126
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
127
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
128
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
129
|
+
</x>
|
130
|
+
eoxml
|
131
|
+
assert_equal false, reader.default?
|
132
|
+
assert_equal [false, false, false, false, false, false, false],
|
133
|
+
reader.map { |x| x.default? }
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_value?
|
137
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
138
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
139
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
140
|
+
</x>
|
141
|
+
eoxml
|
142
|
+
assert_equal false, reader.value?
|
143
|
+
assert_equal [false, true, false, true, false, true, false],
|
144
|
+
reader.map { |x| x.value? }
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_read_error_document
|
148
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
149
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
150
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
151
|
+
<foo>
|
152
|
+
</x>
|
153
|
+
eoxml
|
154
|
+
assert_raises(Nokogiri::XML::SyntaxError) do
|
155
|
+
reader.each { |node| }
|
156
|
+
end
|
157
|
+
assert 1, reader.errors.length
|
158
|
+
end
|
159
|
+
|
160
|
+
def test_attributes?
|
161
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
162
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
163
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
164
|
+
</x>
|
165
|
+
eoxml
|
166
|
+
assert_equal false, reader.attributes?
|
167
|
+
assert_equal [true, false, true, false, true, false, true],
|
168
|
+
reader.map { |x| x.attributes? }
|
169
|
+
end
|
170
|
+
|
171
|
+
def test_z_attributes # non-NULL dmark needed
|
172
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
173
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'
|
174
|
+
xmlns='http://mothership.connection.com/'
|
175
|
+
>
|
176
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
177
|
+
</x>
|
178
|
+
eoxml
|
179
|
+
assert_equal({}, reader.attributes)
|
180
|
+
assert_equal [{'xmlns:tenderlove'=>'http://tenderlovemaking.com/',
|
181
|
+
'xmlns'=>'http://mothership.connection.com/'},
|
182
|
+
{}, {"awesome"=>"true"}, {}, {"awesome"=>"true"}, {},
|
183
|
+
{'xmlns:tenderlove'=>'http://tenderlovemaking.com/',
|
184
|
+
'xmlns'=>'http://mothership.connection.com/'}],
|
185
|
+
reader.map { |x| x.attributes }
|
186
|
+
end
|
187
|
+
|
188
|
+
def test_z_attribute_roundtrip # non-NULL dmark needed
|
189
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
190
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'
|
191
|
+
xmlns='http://mothership.connection.com/'
|
192
|
+
>
|
193
|
+
<tenderlove:foo awesome='true' size='giant'>snuggles!</tenderlove:foo>
|
194
|
+
</x>
|
195
|
+
eoxml
|
196
|
+
reader.each do |node|
|
197
|
+
node.attributes.each do |key, value|
|
198
|
+
assert_equal value, node.attribute(key)
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
def test_attribute_at
|
204
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
205
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
206
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
207
|
+
</x>
|
208
|
+
eoxml
|
209
|
+
assert_nil reader.attribute_at(nil)
|
210
|
+
assert_nil reader.attribute_at(0)
|
211
|
+
assert_equal ['http://tenderlovemaking.com/', nil, 'true', nil, 'true', nil, 'http://tenderlovemaking.com/'],
|
212
|
+
reader.map { |x| x.attribute_at(0) }
|
213
|
+
end
|
214
|
+
|
215
|
+
def test_attribute
|
216
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
217
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
218
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
219
|
+
</x>
|
220
|
+
eoxml
|
221
|
+
assert_nil reader.attribute(nil)
|
222
|
+
assert_nil reader.attribute('awesome')
|
223
|
+
assert_equal [nil, nil, 'true', nil, 'true', nil, nil],
|
224
|
+
reader.map { |x| x.attribute('awesome') }
|
225
|
+
end
|
226
|
+
|
227
|
+
def test_attribute_length
|
228
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
229
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
230
|
+
<tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
|
231
|
+
</x>
|
232
|
+
eoxml
|
233
|
+
assert_equal 0, reader.attribute_count
|
234
|
+
assert_equal [1, 0, 1, 0, 0, 0, 0], reader.map { |x| x.attribute_count }
|
235
|
+
end
|
236
|
+
|
237
|
+
def test_depth
|
238
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
239
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
240
|
+
<tenderlove:foo>snuggles!</tenderlove:foo>
|
241
|
+
</x>
|
242
|
+
eoxml
|
243
|
+
assert_equal 0, reader.depth
|
244
|
+
assert_equal [0, 1, 1, 2, 1, 1, 0], reader.map { |x| x.depth }
|
245
|
+
end
|
246
|
+
|
247
|
+
def test_encoding
|
248
|
+
string = <<-eoxml
|
249
|
+
<awesome>
|
250
|
+
<p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
|
251
|
+
<p xml:lang="ja">日本語が上手です</p>
|
252
|
+
</awesome>
|
253
|
+
eoxml
|
254
|
+
reader = Nokogiri::XML::Reader.from_memory(string, nil, 'UTF-8')
|
255
|
+
assert_equal ['UTF-8'], reader.map { |x| x.encoding }.uniq
|
256
|
+
end
|
257
|
+
|
258
|
+
def test_xml_version
|
259
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
260
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
261
|
+
<tenderlove:foo>snuggles!</tenderlove:foo>
|
262
|
+
</x>
|
263
|
+
eoxml
|
264
|
+
assert_nil reader.xml_version
|
265
|
+
assert_equal ['1.0'], reader.map { |x| x.xml_version }.uniq
|
266
|
+
end
|
267
|
+
|
268
|
+
def test_lang
|
269
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
270
|
+
<awesome>
|
271
|
+
<p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
|
272
|
+
<p xml:lang="ja">日本語が上手です</p>
|
273
|
+
</awesome>
|
274
|
+
eoxml
|
275
|
+
assert_nil reader.lang
|
276
|
+
assert_equal [nil, nil, "en", "en", "en", nil, "ja", "ja", "ja", nil, nil],
|
277
|
+
reader.map { |x| x.lang }
|
278
|
+
end
|
279
|
+
|
280
|
+
def test_value
|
281
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
282
|
+
<x xmlns:tenderlove='http://tenderlovemaking.com/'>
|
283
|
+
<tenderlove:foo>snuggles!</tenderlove:foo>
|
284
|
+
</x>
|
285
|
+
eoxml
|
286
|
+
assert_nil reader.value
|
287
|
+
assert_equal [nil, "\n ", nil, "snuggles!", nil, "\n ", nil],
|
288
|
+
reader.map { |x| x.value }
|
289
|
+
end
|
290
|
+
|
291
|
+
def test_prefix
|
292
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
293
|
+
<x xmlns:edi='http://ecommerce.example.org/schema'>
|
294
|
+
<edi:foo>hello</edi:foo>
|
295
|
+
</x>
|
296
|
+
eoxml
|
297
|
+
assert_nil reader.prefix
|
298
|
+
assert_equal [nil, nil, "edi", nil, "edi", nil, nil],
|
299
|
+
reader.map { |n| n.prefix }
|
300
|
+
end
|
301
|
+
|
302
|
+
def test_node_type
|
303
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
304
|
+
<x>
|
305
|
+
<y>hello</y>
|
306
|
+
</x>
|
307
|
+
eoxml
|
308
|
+
assert_equal 0, reader.node_type
|
309
|
+
assert_equal [1, 14, 1, 3, 15, 14, 15], reader.map { |n| n.node_type }
|
310
|
+
end
|
311
|
+
|
312
|
+
def test_inner_xml
|
313
|
+
str = "<x><y>hello</y></x>"
|
314
|
+
reader = Nokogiri::XML::Reader.from_memory(str)
|
315
|
+
|
316
|
+
reader.read
|
317
|
+
|
318
|
+
assert_equal "<y>hello</y>", reader.inner_xml
|
319
|
+
end
|
320
|
+
|
321
|
+
def test_outer_xml
|
322
|
+
str = "<x><y>hello</y></x>"
|
323
|
+
reader = Nokogiri::XML::Reader.from_memory(str)
|
324
|
+
|
325
|
+
reader.read
|
326
|
+
|
327
|
+
assert_equal str, reader.outer_xml
|
328
|
+
end
|
329
|
+
|
330
|
+
def test_state
|
331
|
+
reader = Nokogiri::XML::Reader.from_memory('<foo>bar</bar>')
|
332
|
+
assert reader.state
|
333
|
+
end
|
334
|
+
|
335
|
+
def test_ns_uri
|
336
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
337
|
+
<x xmlns:edi='http://ecommerce.example.org/schema'>
|
338
|
+
<edi:foo>hello</edi:foo>
|
339
|
+
</x>
|
340
|
+
eoxml
|
341
|
+
assert_nil reader.namespace_uri
|
342
|
+
assert_equal([nil,
|
343
|
+
nil,
|
344
|
+
"http://ecommerce.example.org/schema",
|
345
|
+
nil,
|
346
|
+
"http://ecommerce.example.org/schema",
|
347
|
+
nil,
|
348
|
+
nil],
|
349
|
+
reader.map { |n| n.namespace_uri })
|
350
|
+
end
|
351
|
+
|
352
|
+
def test_local_name
|
353
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
354
|
+
<x xmlns:edi='http://ecommerce.example.org/schema'>
|
355
|
+
<edi:foo>hello</edi:foo>
|
356
|
+
</x>
|
357
|
+
eoxml
|
358
|
+
assert_nil reader.local_name
|
359
|
+
assert_equal(["x", "#text", "foo", "#text", "foo", "#text", "x"],
|
360
|
+
reader.map { |n| n.local_name })
|
361
|
+
end
|
362
|
+
|
363
|
+
def test_name
|
364
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
365
|
+
<x xmlns:edi='http://ecommerce.example.org/schema'>
|
366
|
+
<edi:foo>hello</edi:foo>
|
367
|
+
</x>
|
368
|
+
eoxml
|
369
|
+
assert_nil reader.name
|
370
|
+
assert_equal(["x", "#text", "edi:foo", "#text", "edi:foo", "#text", "x"],
|
371
|
+
reader.map { |n| n.name })
|
372
|
+
end
|
373
|
+
|
374
|
+
def test_base_uri
|
375
|
+
reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
|
376
|
+
<x xml:base="http://base.example.org/base/">
|
377
|
+
<link href="link"/>
|
378
|
+
<other xml:base="http://other.example.org/"/>
|
379
|
+
<relative xml:base="relative">
|
380
|
+
<link href="stuff" />
|
381
|
+
</relative>
|
382
|
+
</x>
|
383
|
+
eoxml
|
384
|
+
|
385
|
+
assert_nil reader.base_uri
|
386
|
+
assert_equal(["http://base.example.org/base/",
|
387
|
+
"http://base.example.org/base/",
|
388
|
+
"http://base.example.org/base/",
|
389
|
+
"http://base.example.org/base/",
|
390
|
+
"http://other.example.org/",
|
391
|
+
"http://base.example.org/base/",
|
392
|
+
"http://base.example.org/base/relative",
|
393
|
+
"http://base.example.org/base/relative",
|
394
|
+
"http://base.example.org/base/relative",
|
395
|
+
"http://base.example.org/base/relative",
|
396
|
+
"http://base.example.org/base/relative",
|
397
|
+
"http://base.example.org/base/",
|
398
|
+
"http://base.example.org/base/"],
|
399
|
+
reader.map {|n| n.base_uri })
|
400
|
+
end
|
401
|
+
|
402
|
+
def test_read_from_memory
|
403
|
+
called = false
|
404
|
+
reader = Nokogiri::XML::Reader.from_memory('<foo>bar</foo>')
|
405
|
+
reader.each do |node|
|
406
|
+
called = true
|
407
|
+
assert node
|
408
|
+
end
|
409
|
+
assert called
|
410
|
+
end
|
411
|
+
|
412
|
+
def test_z_large_document_smoke_test # non-null dmark needed
|
413
|
+
# simply run on a large document to verify that there no GC issues
|
414
|
+
xml = []
|
415
|
+
xml << "<elements>"
|
416
|
+
10000.times { |j| xml << "<element id=\"#{j}\"/>" }
|
417
|
+
xml << "</elements>"
|
418
|
+
xml = xml.join("\n")
|
419
|
+
|
420
|
+
Nokogiri::XML::Reader.from_memory(xml).each do |e|
|
421
|
+
e.attributes
|
422
|
+
end
|
423
|
+
end
|
424
|
+
|
425
|
+
end
|