nokogiri-backupify 1.5.0.beta.4

Sign up to get free protection for your applications and to get access to all the features.
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