nokogiri-backupify 1.5.0.beta.4

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.
Files changed (275) hide show
  1. data/.autotest +26 -0
  2. data/CHANGELOG.ja.rdoc +509 -0
  3. data/CHANGELOG.rdoc +490 -0
  4. data/Manifest.txt +274 -0
  5. data/README.ja.rdoc +106 -0
  6. data/README.rdoc +150 -0
  7. data/Rakefile +217 -0
  8. data/bin/nokogiri +54 -0
  9. data/deps.rip +5 -0
  10. data/ext/java/nokogiri/EncodingHandler.java +124 -0
  11. data/ext/java/nokogiri/HtmlDocument.java +146 -0
  12. data/ext/java/nokogiri/HtmlElementDescription.java +145 -0
  13. data/ext/java/nokogiri/HtmlEntityLookup.java +79 -0
  14. data/ext/java/nokogiri/HtmlSaxParserContext.java +256 -0
  15. data/ext/java/nokogiri/NokogiriService.java +466 -0
  16. data/ext/java/nokogiri/XmlAttr.java +183 -0
  17. data/ext/java/nokogiri/XmlAttributeDecl.java +130 -0
  18. data/ext/java/nokogiri/XmlCdata.java +89 -0
  19. data/ext/java/nokogiri/XmlComment.java +84 -0
  20. data/ext/java/nokogiri/XmlDocument.java +514 -0
  21. data/ext/java/nokogiri/XmlDocumentFragment.java +216 -0
  22. data/ext/java/nokogiri/XmlDtd.java +464 -0
  23. data/ext/java/nokogiri/XmlElement.java +221 -0
  24. data/ext/java/nokogiri/XmlElementContent.java +382 -0
  25. data/ext/java/nokogiri/XmlElementDecl.java +147 -0
  26. data/ext/java/nokogiri/XmlEntityDecl.java +161 -0
  27. data/ext/java/nokogiri/XmlEntityReference.java +75 -0
  28. data/ext/java/nokogiri/XmlNamespace.java +127 -0
  29. data/ext/java/nokogiri/XmlNode.java +1392 -0
  30. data/ext/java/nokogiri/XmlNodeSet.java +284 -0
  31. data/ext/java/nokogiri/XmlProcessingInstruction.java +103 -0
  32. data/ext/java/nokogiri/XmlReader.java +409 -0
  33. data/ext/java/nokogiri/XmlRelaxng.java +199 -0
  34. data/ext/java/nokogiri/XmlSaxParserContext.java +353 -0
  35. data/ext/java/nokogiri/XmlSaxPushParser.java +182 -0
  36. data/ext/java/nokogiri/XmlSchema.java +175 -0
  37. data/ext/java/nokogiri/XmlSyntaxError.java +114 -0
  38. data/ext/java/nokogiri/XmlText.java +135 -0
  39. data/ext/java/nokogiri/XmlXpathContext.java +175 -0
  40. data/ext/java/nokogiri/XsltStylesheet.java +181 -0
  41. data/ext/java/nokogiri/internals/HtmlDomParserContext.java +205 -0
  42. data/ext/java/nokogiri/internals/NokogiriDocumentCache.java +73 -0
  43. data/ext/java/nokogiri/internals/NokogiriErrorHandler.java +80 -0
  44. data/ext/java/nokogiri/internals/NokogiriHandler.java +326 -0
  45. data/ext/java/nokogiri/internals/NokogiriHelpers.java +583 -0
  46. data/ext/java/nokogiri/internals/NokogiriNamespaceCache.java +170 -0
  47. data/ext/java/nokogiri/internals/NokogiriNamespaceContext.java +118 -0
  48. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler.java +73 -0
  49. data/ext/java/nokogiri/internals/NokogiriNonStrictErrorHandler4NekoHtml.java +121 -0
  50. data/ext/java/nokogiri/internals/NokogiriStrictErrorHandler.java +78 -0
  51. data/ext/java/nokogiri/internals/NokogiriXPathFunction.java +120 -0
  52. data/ext/java/nokogiri/internals/NokogiriXPathFunctionResolver.java +56 -0
  53. data/ext/java/nokogiri/internals/ParserContext.java +278 -0
  54. data/ext/java/nokogiri/internals/PushInputStream.java +411 -0
  55. data/ext/java/nokogiri/internals/ReaderNode.java +473 -0
  56. data/ext/java/nokogiri/internals/SaveContext.java +282 -0
  57. data/ext/java/nokogiri/internals/SchemaErrorHandler.java +68 -0
  58. data/ext/java/nokogiri/internals/XmlDeclHandler.java +42 -0
  59. data/ext/java/nokogiri/internals/XmlDomParser.java +77 -0
  60. data/ext/java/nokogiri/internals/XmlDomParserContext.java +233 -0
  61. data/ext/java/nokogiri/internals/XmlSaxParser.java +65 -0
  62. data/ext/java/nokogiri/internals/XsltExtensionFunction.java +72 -0
  63. data/ext/nokogiri/depend +358 -0
  64. data/ext/nokogiri/extconf.rb +124 -0
  65. data/ext/nokogiri/html_document.c +154 -0
  66. data/ext/nokogiri/html_document.h +10 -0
  67. data/ext/nokogiri/html_element_description.c +276 -0
  68. data/ext/nokogiri/html_element_description.h +10 -0
  69. data/ext/nokogiri/html_entity_lookup.c +32 -0
  70. data/ext/nokogiri/html_entity_lookup.h +8 -0
  71. data/ext/nokogiri/html_sax_parser_context.c +94 -0
  72. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  73. data/ext/nokogiri/nokogiri.c +92 -0
  74. data/ext/nokogiri/nokogiri.h +160 -0
  75. data/ext/nokogiri/xml_attr.c +94 -0
  76. data/ext/nokogiri/xml_attr.h +9 -0
  77. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  78. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  79. data/ext/nokogiri/xml_cdata.c +56 -0
  80. data/ext/nokogiri/xml_cdata.h +9 -0
  81. data/ext/nokogiri/xml_comment.c +54 -0
  82. data/ext/nokogiri/xml_comment.h +9 -0
  83. data/ext/nokogiri/xml_document.c +478 -0
  84. data/ext/nokogiri/xml_document.h +23 -0
  85. data/ext/nokogiri/xml_document_fragment.c +48 -0
  86. data/ext/nokogiri/xml_document_fragment.h +10 -0
  87. data/ext/nokogiri/xml_dtd.c +202 -0
  88. data/ext/nokogiri/xml_dtd.h +10 -0
  89. data/ext/nokogiri/xml_element_content.c +123 -0
  90. data/ext/nokogiri/xml_element_content.h +10 -0
  91. data/ext/nokogiri/xml_element_decl.c +69 -0
  92. data/ext/nokogiri/xml_element_decl.h +9 -0
  93. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  94. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  95. data/ext/nokogiri/xml_entity_decl.c +110 -0
  96. data/ext/nokogiri/xml_entity_decl.h +10 -0
  97. data/ext/nokogiri/xml_entity_reference.c +52 -0
  98. data/ext/nokogiri/xml_entity_reference.h +9 -0
  99. data/ext/nokogiri/xml_io.c +31 -0
  100. data/ext/nokogiri/xml_io.h +11 -0
  101. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  102. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  103. data/ext/nokogiri/xml_namespace.c +84 -0
  104. data/ext/nokogiri/xml_namespace.h +13 -0
  105. data/ext/nokogiri/xml_node.c +1384 -0
  106. data/ext/nokogiri/xml_node.h +13 -0
  107. data/ext/nokogiri/xml_node_set.c +418 -0
  108. data/ext/nokogiri/xml_node_set.h +9 -0
  109. data/ext/nokogiri/xml_processing_instruction.c +56 -0
  110. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  111. data/ext/nokogiri/xml_reader.c +684 -0
  112. data/ext/nokogiri/xml_reader.h +10 -0
  113. data/ext/nokogiri/xml_relax_ng.c +161 -0
  114. data/ext/nokogiri/xml_relax_ng.h +9 -0
  115. data/ext/nokogiri/xml_sax_parser.c +288 -0
  116. data/ext/nokogiri/xml_sax_parser.h +39 -0
  117. data/ext/nokogiri/xml_sax_parser_context.c +199 -0
  118. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  119. data/ext/nokogiri/xml_sax_push_parser.c +115 -0
  120. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  121. data/ext/nokogiri/xml_schema.c +205 -0
  122. data/ext/nokogiri/xml_schema.h +9 -0
  123. data/ext/nokogiri/xml_syntax_error.c +58 -0
  124. data/ext/nokogiri/xml_syntax_error.h +13 -0
  125. data/ext/nokogiri/xml_text.c +50 -0
  126. data/ext/nokogiri/xml_text.h +9 -0
  127. data/ext/nokogiri/xml_xpath_context.c +309 -0
  128. data/ext/nokogiri/xml_xpath_context.h +9 -0
  129. data/ext/nokogiri/xslt_stylesheet.c +258 -0
  130. data/ext/nokogiri/xslt_stylesheet.h +9 -0
  131. data/lib/isorelax.jar +0 -0
  132. data/lib/jing.jar +0 -0
  133. data/lib/nekodtd.jar +0 -0
  134. data/lib/nekohtml.jar +0 -0
  135. data/lib/nokogiri.rb +143 -0
  136. data/lib/nokogiri/css.rb +23 -0
  137. data/lib/nokogiri/css/node.rb +99 -0
  138. data/lib/nokogiri/css/parser.rb +677 -0
  139. data/lib/nokogiri/css/parser.y +237 -0
  140. data/lib/nokogiri/css/parser_extras.rb +91 -0
  141. data/lib/nokogiri/css/syntax_error.rb +7 -0
  142. data/lib/nokogiri/css/tokenizer.rb +152 -0
  143. data/lib/nokogiri/css/tokenizer.rex +55 -0
  144. data/lib/nokogiri/css/xpath_visitor.rb +171 -0
  145. data/lib/nokogiri/decorators/slop.rb +35 -0
  146. data/lib/nokogiri/html.rb +36 -0
  147. data/lib/nokogiri/html/builder.rb +35 -0
  148. data/lib/nokogiri/html/document.rb +221 -0
  149. data/lib/nokogiri/html/document_fragment.rb +41 -0
  150. data/lib/nokogiri/html/element_description.rb +23 -0
  151. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  152. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  153. data/lib/nokogiri/html/sax/parser.rb +52 -0
  154. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  155. data/lib/nokogiri/syntax_error.rb +4 -0
  156. data/lib/nokogiri/version.rb +35 -0
  157. data/lib/nokogiri/xml.rb +67 -0
  158. data/lib/nokogiri/xml/attr.rb +14 -0
  159. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  160. data/lib/nokogiri/xml/builder.rb +418 -0
  161. data/lib/nokogiri/xml/cdata.rb +11 -0
  162. data/lib/nokogiri/xml/character_data.rb +7 -0
  163. data/lib/nokogiri/xml/document.rb +218 -0
  164. data/lib/nokogiri/xml/document_fragment.rb +84 -0
  165. data/lib/nokogiri/xml/dtd.rb +22 -0
  166. data/lib/nokogiri/xml/element_content.rb +36 -0
  167. data/lib/nokogiri/xml/element_decl.rb +13 -0
  168. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  169. data/lib/nokogiri/xml/namespace.rb +13 -0
  170. data/lib/nokogiri/xml/node.rb +907 -0
  171. data/lib/nokogiri/xml/node/save_options.rb +45 -0
  172. data/lib/nokogiri/xml/node_set.rb +350 -0
  173. data/lib/nokogiri/xml/notation.rb +6 -0
  174. data/lib/nokogiri/xml/parse_options.rb +85 -0
  175. data/lib/nokogiri/xml/pp.rb +2 -0
  176. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  177. data/lib/nokogiri/xml/pp/node.rb +56 -0
  178. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  179. data/lib/nokogiri/xml/reader.rb +112 -0
  180. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  181. data/lib/nokogiri/xml/sax.rb +4 -0
  182. data/lib/nokogiri/xml/sax/document.rb +164 -0
  183. data/lib/nokogiri/xml/sax/parser.rb +115 -0
  184. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  185. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  186. data/lib/nokogiri/xml/schema.rb +57 -0
  187. data/lib/nokogiri/xml/syntax_error.rb +47 -0
  188. data/lib/nokogiri/xml/text.rb +9 -0
  189. data/lib/nokogiri/xml/xpath.rb +10 -0
  190. data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
  191. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  192. data/lib/nokogiri/xslt.rb +52 -0
  193. data/lib/nokogiri/xslt/stylesheet.rb +25 -0
  194. data/lib/xercesImpl.jar +0 -0
  195. data/lib/xsd/xmlparser/nokogiri.rb +90 -0
  196. data/tasks/cross_compile.rb +177 -0
  197. data/tasks/test.rb +94 -0
  198. data/test/css/test_nthiness.rb +159 -0
  199. data/test/css/test_parser.rb +303 -0
  200. data/test/css/test_tokenizer.rb +198 -0
  201. data/test/css/test_xpath_visitor.rb +85 -0
  202. data/test/decorators/test_slop.rb +16 -0
  203. data/test/files/2ch.html +108 -0
  204. data/test/files/address_book.rlx +12 -0
  205. data/test/files/address_book.xml +10 -0
  206. data/test/files/bar/bar.xsd +4 -0
  207. data/test/files/dont_hurt_em_why.xml +422 -0
  208. data/test/files/exslt.xml +8 -0
  209. data/test/files/exslt.xslt +35 -0
  210. data/test/files/foo/foo.xsd +4 -0
  211. data/test/files/po.xml +32 -0
  212. data/test/files/po.xsd +66 -0
  213. data/test/files/shift_jis.html +10 -0
  214. data/test/files/shift_jis.xml +5 -0
  215. data/test/files/snuggles.xml +3 -0
  216. data/test/files/staff.dtd +10 -0
  217. data/test/files/staff.xml +59 -0
  218. data/test/files/staff.xslt +32 -0
  219. data/test/files/tlm.html +850 -0
  220. data/test/files/valid_bar.xml +2 -0
  221. data/test/helper.rb +171 -0
  222. data/test/html/sax/test_parser.rb +136 -0
  223. data/test/html/sax/test_parser_context.rb +48 -0
  224. data/test/html/test_builder.rb +164 -0
  225. data/test/html/test_document.rb +457 -0
  226. data/test/html/test_document_encoding.rb +123 -0
  227. data/test/html/test_document_fragment.rb +255 -0
  228. data/test/html/test_element_description.rb +100 -0
  229. data/test/html/test_named_characters.rb +14 -0
  230. data/test/html/test_node.rb +190 -0
  231. data/test/html/test_node_encoding.rb +27 -0
  232. data/test/test_convert_xpath.rb +135 -0
  233. data/test/test_css_cache.rb +45 -0
  234. data/test/test_encoding_handler.rb +46 -0
  235. data/test/test_memory_leak.rb +52 -0
  236. data/test/test_nokogiri.rb +132 -0
  237. data/test/test_reader.rb +403 -0
  238. data/test/test_soap4r_sax.rb +52 -0
  239. data/test/test_xslt_transforms.rb +189 -0
  240. data/test/xml/node/test_save_options.rb +20 -0
  241. data/test/xml/node/test_subclass.rb +44 -0
  242. data/test/xml/sax/test_parser.rb +338 -0
  243. data/test/xml/sax/test_parser_context.rb +113 -0
  244. data/test/xml/sax/test_push_parser.rb +156 -0
  245. data/test/xml/test_attr.rb +65 -0
  246. data/test/xml/test_attribute_decl.rb +86 -0
  247. data/test/xml/test_builder.rb +210 -0
  248. data/test/xml/test_cdata.rb +50 -0
  249. data/test/xml/test_comment.rb +29 -0
  250. data/test/xml/test_document.rb +675 -0
  251. data/test/xml/test_document_encoding.rb +26 -0
  252. data/test/xml/test_document_fragment.rb +192 -0
  253. data/test/xml/test_dtd.rb +107 -0
  254. data/test/xml/test_dtd_encoding.rb +33 -0
  255. data/test/xml/test_element_content.rb +56 -0
  256. data/test/xml/test_element_decl.rb +73 -0
  257. data/test/xml/test_entity_decl.rb +122 -0
  258. data/test/xml/test_entity_reference.rb +21 -0
  259. data/test/xml/test_namespace.rb +70 -0
  260. data/test/xml/test_node.rb +899 -0
  261. data/test/xml/test_node_attributes.rb +34 -0
  262. data/test/xml/test_node_encoding.rb +107 -0
  263. data/test/xml/test_node_reparenting.rb +321 -0
  264. data/test/xml/test_node_set.rb +708 -0
  265. data/test/xml/test_parse_options.rb +52 -0
  266. data/test/xml/test_processing_instruction.rb +30 -0
  267. data/test/xml/test_reader_encoding.rb +126 -0
  268. data/test/xml/test_relax_ng.rb +60 -0
  269. data/test/xml/test_schema.rb +89 -0
  270. data/test/xml/test_syntax_error.rb +12 -0
  271. data/test/xml/test_text.rb +47 -0
  272. data/test/xml/test_unparented_node.rb +381 -0
  273. data/test/xml/test_xpath.rb +237 -0
  274. data/test/xslt/test_custom_functions.rb +94 -0
  275. metadata +525 -0
@@ -0,0 +1,52 @@
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
+ def test_for_memory_leak
16
+ begin
17
+ # we don't use Dike in any tests, but requiring it has side effects
18
+ # that can create memory leaks, and that's what we're testing for.
19
+ require 'rubygems'
20
+ require 'dike' # do not remove!
21
+
22
+ count_start = count_object_space_documents
23
+ xml_data = <<-EOS
24
+ <test>
25
+ <items>
26
+ <item>abc</item>
27
+ <item>1234</item>
28
+ <item>Zzz</item>
29
+ <items>
30
+ </test>
31
+ EOS
32
+ 20.times do
33
+ doc = Nokogiri::XML(xml_data)
34
+ doc.xpath("//item")
35
+ end
36
+ 2.times { GC.start }
37
+ count_end = count_object_space_documents
38
+ assert((count_end - count_start) <= 2, "memory leak detected")
39
+ rescue LoadError
40
+ puts "\ndike is not installed, skipping memory leak test"
41
+ end
42
+ end
43
+ end # if NOKOGIRI_GC
44
+
45
+ private
46
+
47
+ def count_object_space_documents
48
+ count = 0
49
+ ObjectSpace.each_object {|j| count += 1 if j.is_a?(Nokogiri::XML::Document) }
50
+ count
51
+ end
52
+ end
@@ -0,0 +1,132 @@
1
+ require "helper"
2
+
3
+ class TestNokogiri < Nokogiri::TestCase
4
+ def test_versions
5
+ version_match = /\d+\.\d+\.\d+/
6
+ assert_match version_match, Nokogiri::VERSION
7
+
8
+ assert_equal Nokogiri::VERSION_INFO['ruby']['version'], ::RUBY_VERSION
9
+ assert_equal Nokogiri::VERSION_INFO['ruby']['platform'], ::RUBY_PLATFORM
10
+
11
+ if Nokogiri.uses_libxml?
12
+ assert_match version_match, Nokogiri::LIBXML_VERSION
13
+ assert_equal 'extension', Nokogiri::VERSION_INFO['libxml']['binding']
14
+
15
+ assert_match version_match, Nokogiri::VERSION_INFO['libxml']['compiled']
16
+ assert_equal Nokogiri::LIBXML_VERSION, Nokogiri::VERSION_INFO['libxml']['compiled']
17
+
18
+ assert_match version_match, Nokogiri::VERSION_INFO['libxml']['loaded']
19
+ Nokogiri::LIBXML_PARSER_VERSION =~ /(\d)(\d{2})(\d{2})/
20
+ major = $1.to_i
21
+ minor = $2.to_i
22
+ bug = $3.to_i
23
+ assert_equal "#{major}.#{minor}.#{bug}", Nokogiri::VERSION_INFO['libxml']['loaded']
24
+ end
25
+ end
26
+
27
+ def test_libxml_iconv
28
+ assert Nokogiri.const_defined?(:LIBXML_ICONV_ENABLED) if Nokogiri.uses_libxml?
29
+ end
30
+
31
+ def test_parse_with_io
32
+ doc = Nokogiri.parse(
33
+ StringIO.new("<html><head><title></title><body></body></html>")
34
+ )
35
+ assert_instance_of Nokogiri::HTML::Document, doc
36
+ end
37
+
38
+ def test_xml?
39
+ doc = Nokogiri.parse(File.read(XML_FILE))
40
+ assert doc.xml?
41
+ assert !doc.html?
42
+ end
43
+
44
+ def test_html?
45
+ doc = Nokogiri.parse(File.read(HTML_FILE))
46
+ assert !doc.xml?
47
+ assert doc.html?
48
+ end
49
+
50
+ def test_nokogiri_method_with_html
51
+ doc1 = Nokogiri(File.read(HTML_FILE))
52
+ doc2 = Nokogiri.parse(File.read(HTML_FILE))
53
+ assert_equal doc1.serialize, doc2.serialize
54
+ end
55
+
56
+ def test_nokogiri_method_with_block
57
+ doc = Nokogiri { b "bold tag" }
58
+ assert_equal('<b>bold tag</b>', doc.to_html.chomp)
59
+ end
60
+
61
+ def test_make_with_html
62
+ doc = Nokogiri.make("<b>bold tag</b>")
63
+ assert_equal('<b>bold tag</b>', doc.to_html.chomp)
64
+ end
65
+
66
+ def test_make_with_block
67
+ doc = Nokogiri.make { b "bold tag" }
68
+ assert_equal('<b>bold tag</b>', doc.to_html.chomp)
69
+ end
70
+
71
+ SLOP_HTML = <<-END
72
+ <html>
73
+ <body>
74
+ <ul>
75
+ <li class='red'>one</li>
76
+ <li class='blue'>two</li>
77
+ </ul>
78
+ <div>
79
+ one
80
+ <div>div two</div>
81
+ </div>
82
+ </body>
83
+ </html>
84
+ END
85
+
86
+ def test_slop_css
87
+ doc = Nokogiri::Slop(<<-eohtml)
88
+ <html>
89
+ <body>
90
+ <div>
91
+ one
92
+ <div class='foo'>
93
+ div two
94
+ <div class='foo'>
95
+ div three
96
+ </div>
97
+ </div>
98
+ </div>
99
+ </body>
100
+ </html>
101
+ eohtml
102
+ assert_equal "div", doc.html.body.div.div('.foo').name
103
+ end
104
+
105
+ def test_slop
106
+ doc = Nokogiri::Slop(SLOP_HTML)
107
+
108
+ assert_equal "one", doc.html.body.ul.li.first.text
109
+ assert_equal "two", doc.html.body.ul.li(".blue").text
110
+ assert_equal "div two", doc.html.body.div.div.text
111
+
112
+ assert_equal "two", doc.html.body.ul.li(:css => ".blue").text
113
+
114
+ assert_equal "two", doc.html.body.ul.li(:xpath => "position()=2").text
115
+ assert_equal "one", doc.html.body.ul.li(:xpath => ["contains(text(),'o')"]).first.text
116
+ assert_equal "two", doc.html.body.ul.li(:xpath => ["contains(text(),'o')","contains(text(),'t')"]).text
117
+
118
+ assert_raise(NoMethodError) { doc.nonexistent }
119
+ end
120
+
121
+ def test_slop_decorator
122
+ doc = Nokogiri(SLOP_HTML)
123
+ assert !doc.decorators(Nokogiri::XML::Node).include?(Nokogiri::Decorators::Slop)
124
+
125
+ doc.slop!
126
+ assert doc.decorators(Nokogiri::XML::Node).include?(Nokogiri::Decorators::Slop)
127
+
128
+ doc.slop!
129
+ assert_equal 1, doc.decorators(Nokogiri::XML::Node).select { |d| d == Nokogiri::Decorators::Slop }.size
130
+ end
131
+
132
+ end
@@ -0,0 +1,403 @@
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
+ def test_in_memory
86
+ assert Nokogiri::XML::Reader(<<-eoxml)
87
+ <x xmlns:tenderlove='http://tenderlovemaking.com/'>
88
+ <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
89
+ </x>
90
+ eoxml
91
+ end
92
+
93
+ def test_reader_holds_on_to_string
94
+ xml = <<-eoxml
95
+ <x xmlns:tenderlove='http://tenderlovemaking.com/'>
96
+ <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
97
+ </x>
98
+ eoxml
99
+ reader = Nokogiri::XML::Reader(xml)
100
+ assert_equal xml, reader.source
101
+ end
102
+
103
+ def test_default?
104
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
105
+ <x xmlns:tenderlove='http://tenderlovemaking.com/'>
106
+ <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
107
+ </x>
108
+ eoxml
109
+ assert_equal false, reader.default?
110
+ assert_equal [false, false, false, false, false, false, false],
111
+ reader.map { |x| x.default? }
112
+ end
113
+
114
+ def test_value?
115
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
116
+ <x xmlns:tenderlove='http://tenderlovemaking.com/'>
117
+ <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
118
+ </x>
119
+ eoxml
120
+ assert_equal false, reader.value?
121
+ assert_equal [false, true, false, true, false, true, false],
122
+ reader.map { |x| x.value? }
123
+ end
124
+
125
+ def test_read_error_document
126
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
127
+ <x xmlns:tenderlove='http://tenderlovemaking.com/'>
128
+ <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
129
+ <foo>
130
+ </x>
131
+ eoxml
132
+ assert_raises(Nokogiri::XML::SyntaxError) do
133
+ reader.each { |node| }
134
+ end
135
+ assert 1, reader.errors.length
136
+ end
137
+
138
+ def test_attributes?
139
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
140
+ <x xmlns:tenderlove='http://tenderlovemaking.com/'>
141
+ <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
142
+ </x>
143
+ eoxml
144
+ assert_equal false, reader.attributes?
145
+ assert_equal [true, false, true, false, true, false, true],
146
+ reader.map { |x| x.attributes? }
147
+ end
148
+
149
+ def test_attributes
150
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
151
+ <x xmlns:tenderlove='http://tenderlovemaking.com/'
152
+ xmlns='http://mothership.connection.com/'
153
+ >
154
+ <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
155
+ </x>
156
+ eoxml
157
+ assert_equal({}, reader.attributes)
158
+ assert_equal [{'xmlns:tenderlove'=>'http://tenderlovemaking.com/',
159
+ 'xmlns'=>'http://mothership.connection.com/'},
160
+ {}, {"awesome"=>"true"}, {}, {"awesome"=>"true"}, {},
161
+ {'xmlns:tenderlove'=>'http://tenderlovemaking.com/',
162
+ 'xmlns'=>'http://mothership.connection.com/'}],
163
+ reader.map { |x| x.attributes }
164
+ end
165
+
166
+ def test_attribute_roundtrip
167
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
168
+ <x xmlns:tenderlove='http://tenderlovemaking.com/'
169
+ xmlns='http://mothership.connection.com/'
170
+ >
171
+ <tenderlove:foo awesome='true' size='giant'>snuggles!</tenderlove:foo>
172
+ </x>
173
+ eoxml
174
+ reader.each do |node|
175
+ node.attributes.each do |key, value|
176
+ assert_equal value, node.attribute(key)
177
+ end
178
+ end
179
+ end
180
+
181
+ def test_attribute_at
182
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
183
+ <x xmlns:tenderlove='http://tenderlovemaking.com/'>
184
+ <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
185
+ </x>
186
+ eoxml
187
+ assert_nil reader.attribute_at(nil)
188
+ assert_nil reader.attribute_at(0)
189
+ assert_equal ['http://tenderlovemaking.com/', nil, 'true', nil, 'true', nil, 'http://tenderlovemaking.com/'],
190
+ reader.map { |x| x.attribute_at(0) }
191
+ end
192
+
193
+ def test_attribute
194
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
195
+ <x xmlns:tenderlove='http://tenderlovemaking.com/'>
196
+ <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
197
+ </x>
198
+ eoxml
199
+ assert_nil reader.attribute(nil)
200
+ assert_nil reader.attribute('awesome')
201
+ assert_equal [nil, nil, 'true', nil, 'true', nil, nil],
202
+ reader.map { |x| x.attribute('awesome') }
203
+ end
204
+
205
+ def test_attribute_length
206
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
207
+ <x xmlns:tenderlove='http://tenderlovemaking.com/'>
208
+ <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
209
+ </x>
210
+ eoxml
211
+ assert_equal 0, reader.attribute_count
212
+ assert_equal [1, 0, 1, 0, 0, 0, 0], reader.map { |x| x.attribute_count }
213
+ end
214
+
215
+ def test_depth
216
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
217
+ <x xmlns:tenderlove='http://tenderlovemaking.com/'>
218
+ <tenderlove:foo>snuggles!</tenderlove:foo>
219
+ </x>
220
+ eoxml
221
+ assert_equal 0, reader.depth
222
+ assert_equal [0, 1, 1, 2, 1, 1, 0], reader.map { |x| x.depth }
223
+ end
224
+
225
+ def test_encoding
226
+ string = <<-eoxml
227
+ <awesome>
228
+ <p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
229
+ <p xml:lang="ja">日本語が上手です</p>
230
+ </awesome>
231
+ eoxml
232
+ reader = Nokogiri::XML::Reader.from_memory(string, nil, 'UTF-8')
233
+ assert_equal ['UTF-8'], reader.map { |x| x.encoding }.uniq
234
+ end
235
+
236
+ def test_xml_version
237
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
238
+ <x xmlns:tenderlove='http://tenderlovemaking.com/'>
239
+ <tenderlove:foo>snuggles!</tenderlove:foo>
240
+ </x>
241
+ eoxml
242
+ assert_nil reader.xml_version
243
+ assert_equal ['1.0'], reader.map { |x| x.xml_version }.uniq
244
+ end
245
+
246
+ def test_lang
247
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
248
+ <awesome>
249
+ <p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
250
+ <p xml:lang="ja">日本語が上手です</p>
251
+ </awesome>
252
+ eoxml
253
+ assert_nil reader.lang
254
+ assert_equal [nil, nil, "en", "en", "en", nil, "ja", "ja", "ja", nil, nil],
255
+ reader.map { |x| x.lang }
256
+ end
257
+
258
+ def test_value
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.value
265
+ assert_equal [nil, "\n ", nil, "snuggles!", nil, "\n ", nil],
266
+ reader.map { |x| x.value }
267
+ end
268
+
269
+ def test_prefix
270
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
271
+ <x xmlns:edi='http://ecommerce.example.org/schema'>
272
+ <edi:foo>hello</edi:foo>
273
+ </x>
274
+ eoxml
275
+ assert_nil reader.prefix
276
+ assert_equal [nil, nil, "edi", nil, "edi", nil, nil],
277
+ reader.map { |n| n.prefix }
278
+ end
279
+
280
+ def test_node_type
281
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
282
+ <x>
283
+ <y>hello</y>
284
+ </x>
285
+ eoxml
286
+ assert_equal 0, reader.node_type
287
+ assert_equal [1, 14, 1, 3, 15, 14, 15], reader.map { |n| n.node_type }
288
+ end
289
+
290
+ def test_inner_xml
291
+ str = "<x><y>hello</y></x>"
292
+ reader = Nokogiri::XML::Reader.from_memory(str)
293
+
294
+ reader.read
295
+
296
+ assert_equal "<y>hello</y>", reader.inner_xml
297
+ end
298
+
299
+ def test_outer_xml
300
+ str = "<x><y>hello</y></x>"
301
+ reader = Nokogiri::XML::Reader.from_memory(str)
302
+
303
+ reader.read
304
+
305
+ assert_equal str, reader.outer_xml
306
+ end
307
+
308
+ def test_state
309
+ reader = Nokogiri::XML::Reader.from_memory('<foo>bar</bar>')
310
+ assert reader.state
311
+ end
312
+
313
+ def test_ns_uri
314
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
315
+ <x xmlns:edi='http://ecommerce.example.org/schema'>
316
+ <edi:foo>hello</edi:foo>
317
+ </x>
318
+ eoxml
319
+ assert_nil reader.namespace_uri
320
+ assert_equal([nil,
321
+ nil,
322
+ "http://ecommerce.example.org/schema",
323
+ nil,
324
+ "http://ecommerce.example.org/schema",
325
+ nil,
326
+ nil],
327
+ reader.map { |n| n.namespace_uri })
328
+ end
329
+
330
+ def test_local_name
331
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
332
+ <x xmlns:edi='http://ecommerce.example.org/schema'>
333
+ <edi:foo>hello</edi:foo>
334
+ </x>
335
+ eoxml
336
+ assert_nil reader.local_name
337
+ assert_equal(["x", "#text", "foo", "#text", "foo", "#text", "x"],
338
+ reader.map { |n| n.local_name })
339
+ end
340
+
341
+ def test_name
342
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
343
+ <x xmlns:edi='http://ecommerce.example.org/schema'>
344
+ <edi:foo>hello</edi:foo>
345
+ </x>
346
+ eoxml
347
+ assert_nil reader.name
348
+ assert_equal(["x", "#text", "edi:foo", "#text", "edi:foo", "#text", "x"],
349
+ reader.map { |n| n.name })
350
+ end
351
+
352
+ def test_base_uri
353
+ reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
354
+ <x xml:base="http://base.example.org/base/">
355
+ <link href="link"/>
356
+ <other xml:base="http://other.example.org/"/>
357
+ <relative xml:base="relative">
358
+ <link href="stuff" />
359
+ </relative>
360
+ </x>
361
+ eoxml
362
+
363
+ assert_nil reader.base_uri
364
+ assert_equal(["http://base.example.org/base/",
365
+ "http://base.example.org/base/",
366
+ "http://base.example.org/base/",
367
+ "http://base.example.org/base/",
368
+ "http://other.example.org/",
369
+ "http://base.example.org/base/",
370
+ "http://base.example.org/base/relative",
371
+ "http://base.example.org/base/relative",
372
+ "http://base.example.org/base/relative",
373
+ "http://base.example.org/base/relative",
374
+ "http://base.example.org/base/relative",
375
+ "http://base.example.org/base/",
376
+ "http://base.example.org/base/"],
377
+ reader.map {|n| n.base_uri })
378
+ end
379
+
380
+ def test_read_from_memory
381
+ called = false
382
+ reader = Nokogiri::XML::Reader.from_memory('<foo>bar</foo>')
383
+ reader.each do |node|
384
+ called = true
385
+ assert node
386
+ end
387
+ assert called
388
+ end
389
+
390
+ def test_large_document_smoke_test
391
+ # simply run on a large document to verify that there no GC issues
392
+ xml = []
393
+ xml << "<elements>"
394
+ 10000.times { |j| xml << "<element id=\"#{j}\"/>" }
395
+ xml << "</elements>"
396
+ xml = xml.join("\n")
397
+
398
+ Nokogiri::XML::Reader.from_memory(xml).each do |e|
399
+ e.attributes
400
+ end
401
+ end
402
+
403
+ end