nokogiri 1.8.5 → 1.15.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of nokogiri might be problematic. Click here for more details.

Files changed (358) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +40 -18
  3. data/LICENSE-DEPENDENCIES.md +1636 -1024
  4. data/LICENSE.md +5 -28
  5. data/README.md +203 -90
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +33 -61
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +867 -417
  10. data/ext/nokogiri/gumbo.c +594 -0
  11. data/ext/nokogiri/html4_document.c +165 -0
  12. data/ext/nokogiri/html4_element_description.c +299 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +108 -0
  15. data/ext/nokogiri/html4_sax_push_parser.c +95 -0
  16. data/ext/nokogiri/libxml2_backwards_compat.c +121 -0
  17. data/ext/nokogiri/nokogiri.c +251 -105
  18. data/ext/nokogiri/nokogiri.h +215 -90
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +42 -37
  21. data/ext/nokogiri/xml_attribute_decl.c +22 -22
  22. data/ext/nokogiri/xml_cdata.c +40 -31
  23. data/ext/nokogiri/xml_comment.c +20 -27
  24. data/ext/nokogiri/xml_document.c +401 -237
  25. data/ext/nokogiri/xml_document_fragment.c +13 -17
  26. data/ext/nokogiri/xml_dtd.c +64 -58
  27. data/ext/nokogiri/xml_element_content.c +63 -55
  28. data/ext/nokogiri/xml_element_decl.c +31 -31
  29. data/ext/nokogiri/xml_encoding_handler.c +54 -21
  30. data/ext/nokogiri/xml_entity_decl.c +37 -35
  31. data/ext/nokogiri/xml_entity_reference.c +17 -19
  32. data/ext/nokogiri/xml_namespace.c +136 -62
  33. data/ext/nokogiri/xml_node.c +1387 -678
  34. data/ext/nokogiri/xml_node_set.c +246 -216
  35. data/ext/nokogiri/xml_processing_instruction.c +18 -20
  36. data/ext/nokogiri/xml_reader.c +347 -212
  37. data/ext/nokogiri/xml_relax_ng.c +86 -77
  38. data/ext/nokogiri/xml_sax_parser.c +149 -124
  39. data/ext/nokogiri/xml_sax_parser_context.c +145 -103
  40. data/ext/nokogiri/xml_sax_push_parser.c +64 -36
  41. data/ext/nokogiri/xml_schema.c +138 -81
  42. data/ext/nokogiri/xml_syntax_error.c +42 -21
  43. data/ext/nokogiri/xml_text.c +36 -26
  44. data/ext/nokogiri/xml_xpath_context.c +366 -178
  45. data/ext/nokogiri/xslt_stylesheet.c +335 -189
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +111 -0
  48. data/gumbo-parser/THANKS +27 -0
  49. data/gumbo-parser/src/Makefile +34 -0
  50. data/gumbo-parser/src/README.md +41 -0
  51. data/gumbo-parser/src/ascii.c +75 -0
  52. data/gumbo-parser/src/ascii.h +115 -0
  53. data/gumbo-parser/src/attribute.c +42 -0
  54. data/gumbo-parser/src/attribute.h +17 -0
  55. data/gumbo-parser/src/char_ref.c +22225 -0
  56. data/gumbo-parser/src/char_ref.h +29 -0
  57. data/gumbo-parser/src/char_ref.rl +2154 -0
  58. data/gumbo-parser/src/error.c +630 -0
  59. data/gumbo-parser/src/error.h +148 -0
  60. data/gumbo-parser/src/foreign_attrs.c +103 -0
  61. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  62. data/gumbo-parser/src/insertion_mode.h +33 -0
  63. data/gumbo-parser/src/macros.h +91 -0
  64. data/gumbo-parser/src/nokogiri_gumbo.h +944 -0
  65. data/gumbo-parser/src/parser.c +4891 -0
  66. data/gumbo-parser/src/parser.h +41 -0
  67. data/gumbo-parser/src/replacement.h +33 -0
  68. data/gumbo-parser/src/string_buffer.c +103 -0
  69. data/gumbo-parser/src/string_buffer.h +68 -0
  70. data/gumbo-parser/src/string_piece.c +48 -0
  71. data/gumbo-parser/src/svg_attrs.c +174 -0
  72. data/gumbo-parser/src/svg_attrs.gperf +77 -0
  73. data/gumbo-parser/src/svg_tags.c +137 -0
  74. data/gumbo-parser/src/svg_tags.gperf +55 -0
  75. data/gumbo-parser/src/tag.c +223 -0
  76. data/gumbo-parser/src/tag_lookup.c +382 -0
  77. data/gumbo-parser/src/tag_lookup.gperf +170 -0
  78. data/gumbo-parser/src/tag_lookup.h +13 -0
  79. data/gumbo-parser/src/token_buffer.c +79 -0
  80. data/gumbo-parser/src/token_buffer.h +71 -0
  81. data/gumbo-parser/src/token_type.h +17 -0
  82. data/gumbo-parser/src/tokenizer.c +3463 -0
  83. data/gumbo-parser/src/tokenizer.h +112 -0
  84. data/gumbo-parser/src/tokenizer_states.h +339 -0
  85. data/gumbo-parser/src/utf8.c +245 -0
  86. data/gumbo-parser/src/utf8.h +164 -0
  87. data/gumbo-parser/src/util.c +66 -0
  88. data/gumbo-parser/src/util.h +34 -0
  89. data/gumbo-parser/src/vector.c +111 -0
  90. data/gumbo-parser/src/vector.h +45 -0
  91. data/lib/nokogiri/class_resolver.rb +67 -0
  92. data/lib/nokogiri/css/node.rb +10 -8
  93. data/lib/nokogiri/css/parser.rb +397 -377
  94. data/lib/nokogiri/css/parser.y +250 -245
  95. data/lib/nokogiri/css/parser_extras.rb +54 -49
  96. data/lib/nokogiri/css/syntax_error.rb +3 -1
  97. data/lib/nokogiri/css/tokenizer.rb +107 -104
  98. data/lib/nokogiri/css/tokenizer.rex +3 -2
  99. data/lib/nokogiri/css/xpath_visitor.rb +224 -95
  100. data/lib/nokogiri/css.rb +56 -17
  101. data/lib/nokogiri/decorators/slop.rb +9 -7
  102. data/lib/nokogiri/encoding_handler.rb +57 -0
  103. data/lib/nokogiri/extension.rb +32 -0
  104. data/lib/nokogiri/gumbo.rb +15 -0
  105. data/lib/nokogiri/html.rb +38 -27
  106. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  107. data/lib/nokogiri/html4/document.rb +214 -0
  108. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  109. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  110. data/lib/nokogiri/html4/element_description_defaults.rb +2040 -0
  111. data/lib/nokogiri/html4/encoding_reader.rb +121 -0
  112. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  113. data/lib/nokogiri/{html → html4}/sax/parser.rb +17 -16
  114. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  115. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
  116. data/lib/nokogiri/html4.rb +47 -0
  117. data/lib/nokogiri/html5/document.rb +168 -0
  118. data/lib/nokogiri/html5/document_fragment.rb +90 -0
  119. data/lib/nokogiri/html5/node.rb +103 -0
  120. data/lib/nokogiri/html5.rb +392 -0
  121. data/lib/nokogiri/jruby/dependencies.rb +3 -0
  122. data/lib/nokogiri/jruby/nokogiri_jars.rb +43 -0
  123. data/lib/nokogiri/syntax_error.rb +2 -0
  124. data/lib/nokogiri/version/constant.rb +6 -0
  125. data/lib/nokogiri/version/info.rb +223 -0
  126. data/lib/nokogiri/version.rb +3 -108
  127. data/lib/nokogiri/xml/attr.rb +55 -3
  128. data/lib/nokogiri/xml/attribute_decl.rb +6 -2
  129. data/lib/nokogiri/xml/builder.rb +98 -54
  130. data/lib/nokogiri/xml/cdata.rb +3 -1
  131. data/lib/nokogiri/xml/character_data.rb +2 -0
  132. data/lib/nokogiri/xml/document.rb +312 -126
  133. data/lib/nokogiri/xml/document_fragment.rb +104 -48
  134. data/lib/nokogiri/xml/dtd.rb +4 -2
  135. data/lib/nokogiri/xml/element_content.rb +12 -2
  136. data/lib/nokogiri/xml/element_decl.rb +6 -2
  137. data/lib/nokogiri/xml/entity_decl.rb +7 -3
  138. data/lib/nokogiri/xml/entity_reference.rb +2 -0
  139. data/lib/nokogiri/xml/namespace.rb +45 -0
  140. data/lib/nokogiri/xml/node/save_options.rb +23 -8
  141. data/lib/nokogiri/xml/node.rb +1093 -411
  142. data/lib/nokogiri/xml/node_set.rb +173 -67
  143. data/lib/nokogiri/xml/notation.rb +13 -0
  144. data/lib/nokogiri/xml/parse_options.rb +145 -52
  145. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  146. data/lib/nokogiri/xml/pp/node.rb +42 -30
  147. data/lib/nokogiri/xml/pp.rb +4 -2
  148. data/lib/nokogiri/xml/processing_instruction.rb +4 -1
  149. data/lib/nokogiri/xml/reader.rb +21 -28
  150. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  151. data/lib/nokogiri/xml/sax/document.rb +45 -49
  152. data/lib/nokogiri/xml/sax/parser.rb +39 -36
  153. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  154. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  155. data/lib/nokogiri/xml/sax.rb +6 -4
  156. data/lib/nokogiri/xml/schema.rb +19 -9
  157. data/lib/nokogiri/xml/searchable.rb +120 -72
  158. data/lib/nokogiri/xml/syntax_error.rb +6 -4
  159. data/lib/nokogiri/xml/text.rb +2 -0
  160. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  161. data/lib/nokogiri/xml/xpath.rb +15 -4
  162. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  163. data/lib/nokogiri/xml.rb +38 -37
  164. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  165. data/lib/nokogiri/xslt.rb +101 -22
  166. data/lib/nokogiri.rb +59 -75
  167. data/lib/xsd/xmlparser/nokogiri.rb +29 -25
  168. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  169. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  170. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  171. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  172. data/patches/libxml2/0010-update-config.guess-and-config.sub-for-libxml2.patch +224 -0
  173. data/patches/libxml2/0011-rip-out-libxml2-s-libc_single_threaded-support.patch +30 -0
  174. data/patches/libxslt/0001-update-config.guess-and-config.sub-for-libxslt.patch +224 -0
  175. data/ports/archives/libxml2-2.11.4.tar.xz +0 -0
  176. data/ports/archives/libxslt-1.1.38.tar.xz +0 -0
  177. metadata +126 -399
  178. data/.autotest +0 -22
  179. data/.cross_rubies +0 -8
  180. data/.editorconfig +0 -17
  181. data/.gemtest +0 -0
  182. data/.travis.yml +0 -63
  183. data/CHANGELOG.md +0 -1368
  184. data/CONTRIBUTING.md +0 -42
  185. data/C_CODING_STYLE.rdoc +0 -33
  186. data/Gemfile-libxml-ruby +0 -3
  187. data/Manifest.txt +0 -370
  188. data/ROADMAP.md +0 -111
  189. data/Rakefile +0 -348
  190. data/SECURITY.md +0 -19
  191. data/STANDARD_RESPONSES.md +0 -47
  192. data/Y_U_NO_GEMSPEC.md +0 -155
  193. data/appveyor.yml +0 -29
  194. data/build_all +0 -44
  195. data/ext/nokogiri/html_document.c +0 -170
  196. data/ext/nokogiri/html_document.h +0 -10
  197. data/ext/nokogiri/html_element_description.c +0 -279
  198. data/ext/nokogiri/html_element_description.h +0 -10
  199. data/ext/nokogiri/html_entity_lookup.c +0 -32
  200. data/ext/nokogiri/html_entity_lookup.h +0 -8
  201. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  202. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  203. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  204. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  205. data/ext/nokogiri/xml_attr.h +0 -9
  206. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  207. data/ext/nokogiri/xml_cdata.h +0 -9
  208. data/ext/nokogiri/xml_comment.h +0 -9
  209. data/ext/nokogiri/xml_document.h +0 -23
  210. data/ext/nokogiri/xml_document_fragment.h +0 -10
  211. data/ext/nokogiri/xml_dtd.h +0 -10
  212. data/ext/nokogiri/xml_element_content.h +0 -10
  213. data/ext/nokogiri/xml_element_decl.h +0 -9
  214. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  215. data/ext/nokogiri/xml_entity_decl.h +0 -10
  216. data/ext/nokogiri/xml_entity_reference.h +0 -9
  217. data/ext/nokogiri/xml_io.c +0 -61
  218. data/ext/nokogiri/xml_io.h +0 -11
  219. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  220. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  221. data/ext/nokogiri/xml_namespace.h +0 -15
  222. data/ext/nokogiri/xml_node.h +0 -13
  223. data/ext/nokogiri/xml_node_set.h +0 -12
  224. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  225. data/ext/nokogiri/xml_reader.h +0 -10
  226. data/ext/nokogiri/xml_relax_ng.h +0 -9
  227. data/ext/nokogiri/xml_sax_parser.h +0 -39
  228. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  229. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  230. data/ext/nokogiri/xml_schema.h +0 -9
  231. data/ext/nokogiri/xml_syntax_error.h +0 -13
  232. data/ext/nokogiri/xml_text.h +0 -9
  233. data/ext/nokogiri/xml_xpath_context.h +0 -10
  234. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  235. data/lib/nokogiri/html/document.rb +0 -335
  236. data/lib/nokogiri/html/document_fragment.rb +0 -49
  237. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  238. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  239. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  240. data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
  241. data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
  242. data/patches/sort-patches-by-date +0 -25
  243. data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
  244. data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
  245. data/suppressions/README.txt +0 -1
  246. data/suppressions/nokogiri_ruby-2.supp +0 -10
  247. data/tasks/test.rb +0 -100
  248. data/test/css/test_nthiness.rb +0 -226
  249. data/test/css/test_parser.rb +0 -386
  250. data/test/css/test_tokenizer.rb +0 -215
  251. data/test/css/test_xpath_visitor.rb +0 -96
  252. data/test/decorators/test_slop.rb +0 -23
  253. data/test/files/2ch.html +0 -108
  254. data/test/files/GH_1042.html +0 -18
  255. data/test/files/address_book.rlx +0 -12
  256. data/test/files/address_book.xml +0 -10
  257. data/test/files/atom.xml +0 -344
  258. data/test/files/bar/bar.xsd +0 -4
  259. data/test/files/bogus.xml +0 -0
  260. data/test/files/dont_hurt_em_why.xml +0 -422
  261. data/test/files/encoding.html +0 -82
  262. data/test/files/encoding.xhtml +0 -84
  263. data/test/files/exslt.xml +0 -8
  264. data/test/files/exslt.xslt +0 -35
  265. data/test/files/foo/foo.xsd +0 -4
  266. data/test/files/metacharset.html +0 -10
  267. data/test/files/namespace_pressure_test.xml +0 -1684
  268. data/test/files/noencoding.html +0 -47
  269. data/test/files/po.xml +0 -32
  270. data/test/files/po.xsd +0 -66
  271. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  272. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  273. data/test/files/saml/xenc_schema.xsd +0 -146
  274. data/test/files/saml/xmldsig_schema.xsd +0 -318
  275. data/test/files/shift_jis.html +0 -10
  276. data/test/files/shift_jis.xml +0 -5
  277. data/test/files/shift_jis_no_charset.html +0 -9
  278. data/test/files/slow-xpath.xml +0 -25509
  279. data/test/files/snuggles.xml +0 -3
  280. data/test/files/staff.dtd +0 -10
  281. data/test/files/staff.xml +0 -59
  282. data/test/files/staff.xslt +0 -32
  283. data/test/files/test_document_url/bar.xml +0 -2
  284. data/test/files/test_document_url/document.dtd +0 -4
  285. data/test/files/test_document_url/document.xml +0 -6
  286. data/test/files/tlm.html +0 -851
  287. data/test/files/to_be_xincluded.xml +0 -2
  288. data/test/files/valid_bar.xml +0 -2
  289. data/test/files/xinclude.xml +0 -4
  290. data/test/helper.rb +0 -271
  291. data/test/html/sax/test_parser.rb +0 -168
  292. data/test/html/sax/test_parser_context.rb +0 -46
  293. data/test/html/sax/test_parser_text.rb +0 -163
  294. data/test/html/sax/test_push_parser.rb +0 -87
  295. data/test/html/test_attributes.rb +0 -85
  296. data/test/html/test_builder.rb +0 -164
  297. data/test/html/test_document.rb +0 -712
  298. data/test/html/test_document_encoding.rb +0 -143
  299. data/test/html/test_document_fragment.rb +0 -310
  300. data/test/html/test_element_description.rb +0 -105
  301. data/test/html/test_named_characters.rb +0 -14
  302. data/test/html/test_node.rb +0 -212
  303. data/test/html/test_node_encoding.rb +0 -91
  304. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  305. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  306. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  307. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  308. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  309. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  310. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  311. data/test/test_convert_xpath.rb +0 -135
  312. data/test/test_css_cache.rb +0 -47
  313. data/test/test_encoding_handler.rb +0 -48
  314. data/test/test_memory_leak.rb +0 -156
  315. data/test/test_nokogiri.rb +0 -138
  316. data/test/test_soap4r_sax.rb +0 -52
  317. data/test/test_xslt_transforms.rb +0 -314
  318. data/test/xml/node/test_save_options.rb +0 -28
  319. data/test/xml/node/test_subclass.rb +0 -44
  320. data/test/xml/sax/test_parser.rb +0 -402
  321. data/test/xml/sax/test_parser_context.rb +0 -115
  322. data/test/xml/sax/test_parser_text.rb +0 -202
  323. data/test/xml/sax/test_push_parser.rb +0 -265
  324. data/test/xml/test_attr.rb +0 -74
  325. data/test/xml/test_attribute_decl.rb +0 -86
  326. data/test/xml/test_builder.rb +0 -341
  327. data/test/xml/test_c14n.rb +0 -180
  328. data/test/xml/test_cdata.rb +0 -54
  329. data/test/xml/test_comment.rb +0 -40
  330. data/test/xml/test_document.rb +0 -982
  331. data/test/xml/test_document_encoding.rb +0 -31
  332. data/test/xml/test_document_fragment.rb +0 -298
  333. data/test/xml/test_dtd.rb +0 -187
  334. data/test/xml/test_dtd_encoding.rb +0 -31
  335. data/test/xml/test_element_content.rb +0 -56
  336. data/test/xml/test_element_decl.rb +0 -73
  337. data/test/xml/test_entity_decl.rb +0 -122
  338. data/test/xml/test_entity_reference.rb +0 -262
  339. data/test/xml/test_namespace.rb +0 -96
  340. data/test/xml/test_node.rb +0 -1325
  341. data/test/xml/test_node_attributes.rb +0 -115
  342. data/test/xml/test_node_encoding.rb +0 -75
  343. data/test/xml/test_node_inheritance.rb +0 -32
  344. data/test/xml/test_node_reparenting.rb +0 -592
  345. data/test/xml/test_node_set.rb +0 -809
  346. data/test/xml/test_parse_options.rb +0 -64
  347. data/test/xml/test_processing_instruction.rb +0 -30
  348. data/test/xml/test_reader.rb +0 -620
  349. data/test/xml/test_reader_encoding.rb +0 -134
  350. data/test/xml/test_relax_ng.rb +0 -60
  351. data/test/xml/test_schema.rb +0 -142
  352. data/test/xml/test_syntax_error.rb +0 -36
  353. data/test/xml/test_text.rb +0 -60
  354. data/test/xml/test_unparented_node.rb +0 -483
  355. data/test/xml/test_xinclude.rb +0 -83
  356. data/test/xml/test_xpath.rb +0 -470
  357. data/test/xslt/test_custom_functions.rb +0 -133
  358. data/test/xslt/test_exception_handling.rb +0 -37
@@ -1,620 +0,0 @@
1
- # -*- coding: utf-8 -*-
2
- require "helper"
3
-
4
- module Nokogiri
5
- module XML
6
- class TestReader < Nokogiri::TestCase
7
- class NonStringIO
8
- def read(size)
9
- :invalid_object
10
- end
11
- end
12
-
13
- def test_io_non_string
14
- io = NonStringIO.new
15
- reader = Nokogiri::XML::Reader(io)
16
- assert_equal io, reader.source
17
- end
18
-
19
- def test_from_io_sets_io_as_source
20
- io = File.open SNUGGLES_FILE
21
- reader = Nokogiri::XML::Reader.from_io(io)
22
- assert_equal io, reader.source
23
- end
24
-
25
- def test_empty_element?
26
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
27
- <xml><city>Paris</city><state/></xml>
28
- eoxml
29
-
30
- results = reader.map do |node|
31
- if node.node_type == Nokogiri::XML::Node::ELEMENT_NODE
32
- node.empty_element?
33
- end
34
- end
35
- assert_equal [false, false, nil, nil, true, nil], results
36
- end
37
-
38
- def test_self_closing?
39
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
40
- <xml><city>Paris</city><state/></xml>
41
- eoxml
42
-
43
- results = reader.map do |node|
44
- if node.node_type == Nokogiri::XML::Node::ELEMENT_NODE
45
- node.self_closing?
46
- end
47
- end
48
- assert_equal [false, false, nil, nil, true, nil], results
49
- end
50
-
51
- # Issue #831
52
- # Make sure that the reader doesn't block reading the entire input
53
- def test_reader_blocking
54
- rd, wr = IO.pipe()
55
- node_out = nil
56
- t = Thread.start do
57
- reader = Nokogiri::XML::Reader(rd, 'UTF-8')
58
- reader.each do |node|
59
- node_out = node
60
- break
61
- end
62
- rd.close
63
- end
64
- sleep(1) # sleep for one second to make sure the reader will actually block for input
65
- begin
66
- wr.puts "<foo>"
67
- wr.puts "<bar/>" * 10000
68
- wr.flush
69
- rescue Errno::EPIPE
70
- end
71
- res = t.join(5) # wait 5 seconds for the thread to finish
72
- wr.close
73
- refute_nil node_out, "Didn't read any nodes, exclude the trivial case"
74
- refute_nil res, "Reader blocks trying to read the entire stream"
75
- end
76
-
77
- def test_reader_takes_block
78
- options = nil
79
- Nokogiri::XML::Reader(File.read(XML_FILE), XML_FILE) do |cfg|
80
- options = cfg
81
- options.nonet.nowarning.dtdattr
82
- end
83
- assert options.nonet?
84
- assert options.nowarning?
85
- assert options.dtdattr?
86
- end
87
-
88
- def test_nil_raises
89
- assert_raises(ArgumentError) {
90
- Nokogiri::XML::Reader.from_memory(nil)
91
- }
92
- assert_raises(ArgumentError) {
93
- Nokogiri::XML::Reader.from_io(nil)
94
- }
95
- end
96
-
97
- def test_from_io
98
- io = File.open SNUGGLES_FILE
99
- reader = Nokogiri::XML::Reader.from_io(io)
100
- assert_equal false, reader.default?
101
- assert_equal [false, false, false, false, false, false, false],
102
- reader.map(&:default?)
103
- end
104
-
105
- def test_io
106
- io = File.open SNUGGLES_FILE
107
- reader = Nokogiri::XML::Reader(io)
108
- assert_equal false, reader.default?
109
- assert_equal [false, false, false, false, false, false, false],
110
- reader.map(&:default?)
111
- end
112
-
113
- def test_string_io
114
- io = StringIO.new(<<-eoxml)
115
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
116
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
117
- </x>
118
- eoxml
119
- reader = Nokogiri::XML::Reader(io)
120
- assert_equal false, reader.default?
121
- assert_equal [false, false, false, false, false, false, false],
122
- reader.map(&:default?)
123
- end
124
-
125
- class ReallyBadIO
126
- def read(size)
127
- 'a' * size ** 10
128
- end
129
- end
130
-
131
- class ReallyBadIO4Java
132
- def read(size=1)
133
- 'a' * size ** 10
134
- end
135
- end
136
-
137
- def test_io_that_reads_too_much
138
- if Nokogiri.jruby?
139
- io = ReallyBadIO4Java.new
140
- Nokogiri::XML::Reader(io)
141
- else
142
- io = ReallyBadIO.new
143
- Nokogiri::XML::Reader(io)
144
- end
145
- end
146
-
147
- def test_in_memory
148
- assert Nokogiri::XML::Reader(<<-eoxml)
149
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
150
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
151
- </x>
152
- eoxml
153
- end
154
-
155
- def test_reader_holds_on_to_string
156
- xml = <<-eoxml
157
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
158
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
159
- </x>
160
- eoxml
161
- reader = Nokogiri::XML::Reader(xml)
162
- assert_equal xml, reader.source
163
- end
164
-
165
- def test_default?
166
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
167
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
168
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
169
- </x>
170
- eoxml
171
- assert_equal false, reader.default?
172
- assert_equal [false, false, false, false, false, false, false],
173
- reader.map(&:default?)
174
- end
175
-
176
- def test_value?
177
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
178
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
179
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
180
- </x>
181
- eoxml
182
- assert_equal false, reader.value?
183
- assert_equal [false, true, false, true, false, true, false],
184
- reader.map(&:value?)
185
- end
186
-
187
- def test_read_error_document
188
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
189
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
190
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
191
- <foo>
192
- </x>
193
- eoxml
194
- assert_raises(Nokogiri::XML::SyntaxError) do
195
- reader.each { |node| }
196
- end
197
- assert 1, reader.errors.length
198
- end
199
-
200
- def test_errors_is_an_array
201
- reader = Nokogiri::XML::Reader(StringIO.new('&bogus;'))
202
- assert_raises(SyntaxError) {
203
- reader.read
204
- }
205
- assert_equal [SyntaxError], reader.errors.map(&:class)
206
- end
207
-
208
- def test_pushing_to_non_array_raises_TypeError
209
- skip "TODO: JRuby ext does not internally call `errors`" if Nokogiri.jruby?
210
- reader = Nokogiri::XML::Reader(StringIO.new('&bogus;'))
211
- def reader.errors
212
- 1
213
- end
214
- assert_raises(TypeError) {
215
- reader.read
216
- }
217
- end
218
-
219
- def test_attributes?
220
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
221
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
222
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
223
- </x>
224
- eoxml
225
- assert_equal false, reader.attributes?
226
- assert_equal [true, false, true, false, true, false, true],
227
- reader.map(&:attributes?)
228
- end
229
-
230
- def test_attributes
231
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
232
- <x xmlns:tenderlove='http://tenderlovemaking.com/'
233
- xmlns='http://mothership.connection.com/'
234
- >
235
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
236
- </x>
237
- eoxml
238
- assert_equal({}, reader.attributes)
239
- assert_equal [{'xmlns:tenderlove'=>'http://tenderlovemaking.com/',
240
- 'xmlns'=>'http://mothership.connection.com/'},
241
- {}, {"awesome"=>"true"}, {}, {"awesome"=>"true"}, {},
242
- {'xmlns:tenderlove'=>'http://tenderlovemaking.com/',
243
- 'xmlns'=>'http://mothership.connection.com/'}],
244
- reader.map(&:attributes)
245
- end
246
-
247
- def test_attribute_roundtrip
248
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
249
- <x xmlns:tenderlove='http://tenderlovemaking.com/'
250
- xmlns='http://mothership.connection.com/'
251
- >
252
- <tenderlove:foo awesome='true' size='giant'>snuggles!</tenderlove:foo>
253
- </x>
254
- eoxml
255
- reader.each do |node|
256
- node.attributes.each do |key, value|
257
- assert_equal value, node.attribute(key)
258
- end
259
- end
260
- end
261
-
262
- def test_attribute_at
263
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
264
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
265
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
266
- </x>
267
- eoxml
268
- assert_nil reader.attribute_at(nil)
269
- assert_nil reader.attribute_at(0)
270
- assert_equal ['http://tenderlovemaking.com/', nil, 'true', nil, 'true', nil, 'http://tenderlovemaking.com/'],
271
- reader.map { |x| x.attribute_at(0) }
272
- end
273
-
274
- def test_attribute
275
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
276
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
277
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
278
- </x>
279
- eoxml
280
- assert_nil reader.attribute(nil)
281
- assert_nil reader.attribute('awesome')
282
- assert_equal [nil, nil, 'true', nil, 'true', nil, nil],
283
- reader.map { |x| x.attribute('awesome') }
284
- end
285
-
286
- def test_attribute_length
287
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
288
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
289
- <tenderlove:foo awesome='true'>snuggles!</tenderlove:foo>
290
- </x>
291
- eoxml
292
- assert_equal 0, reader.attribute_count
293
- assert_equal [1, 0, 1, 0, 0, 0, 0], reader.map(&:attribute_count)
294
- end
295
-
296
- def test_depth
297
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
298
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
299
- <tenderlove:foo>snuggles!</tenderlove:foo>
300
- </x>
301
- eoxml
302
- assert_equal 0, reader.depth
303
- assert_equal [0, 1, 1, 2, 1, 1, 0], reader.map(&:depth)
304
- end
305
-
306
- def test_encoding
307
- string = <<-eoxml
308
- <awesome>
309
- <p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
310
- <p xml:lang="ja">日本語が上手です</p>
311
- </awesome>
312
- eoxml
313
- reader = Nokogiri::XML::Reader.from_memory(string, nil, 'UTF-8')
314
- assert_equal ['UTF-8'], reader.map(&:encoding).uniq
315
- end
316
-
317
- def test_xml_version
318
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
319
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
320
- <tenderlove:foo>snuggles!</tenderlove:foo>
321
- </x>
322
- eoxml
323
- assert_nil reader.xml_version
324
- assert_equal ['1.0'], reader.map(&:xml_version).uniq
325
- end
326
-
327
- def test_lang
328
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
329
- <awesome>
330
- <p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
331
- <p xml:lang="ja">日本語が上手です</p>
332
- </awesome>
333
- eoxml
334
- assert_nil reader.lang
335
- assert_equal [nil, nil, "en", "en", "en", nil, "ja", "ja", "ja", nil, nil],
336
- reader.map(&:lang)
337
- end
338
-
339
- def test_value
340
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
341
- <x xmlns:tenderlove='http://tenderlovemaking.com/'>
342
- <tenderlove:foo>snuggles!</tenderlove:foo>
343
- </x>
344
- eoxml
345
- assert_nil reader.value
346
- assert_equal [nil, "\n ", nil, "snuggles!", nil, "\n ", nil],
347
- reader.map(&:value)
348
- end
349
-
350
- def test_prefix
351
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
352
- <x xmlns:edi='http://ecommerce.example.org/schema'>
353
- <edi:foo>hello</edi:foo>
354
- </x>
355
- eoxml
356
- assert_nil reader.prefix
357
- assert_equal [nil, nil, "edi", nil, "edi", nil, nil],
358
- reader.map(&:prefix)
359
- end
360
-
361
- def test_node_type
362
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
363
- <x>
364
- <y>hello</y>
365
- </x>
366
- eoxml
367
- assert_equal 0, reader.node_type
368
- assert_equal [1, 14, 1, 3, 15, 14, 15], reader.map(&:node_type)
369
- end
370
-
371
- def test_inner_xml
372
- str = "<x><y>hello</y></x>"
373
- reader = Nokogiri::XML::Reader.from_memory(str)
374
-
375
- reader.read
376
-
377
- assert_equal "<y>hello</y>", reader.inner_xml
378
- end
379
-
380
- def test_outer_xml
381
- str = ["<x><y>hello</y></x>", "<y>hello</y>", "hello", "<y/>", "<x/>"]
382
- reader = Nokogiri::XML::Reader.from_memory(str.first)
383
-
384
- xml = []
385
- reader.map { |node| xml << node.outer_xml }
386
-
387
- assert_equal str, xml
388
- end
389
-
390
- def test_outer_xml_with_empty_nodes
391
- str = ["<x><y/></x>", "<y/>", "<x/>"]
392
- reader = Nokogiri::XML::Reader.from_memory(str.first)
393
-
394
- xml = []
395
- reader.map { |node| xml << node.outer_xml }
396
-
397
- assert_equal str, xml
398
- end
399
-
400
- def test_state
401
- reader = Nokogiri::XML::Reader.from_memory('<foo>bar</bar>')
402
- assert reader.state
403
- end
404
-
405
- def test_ns_uri
406
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
407
- <x xmlns:edi='http://ecommerce.example.org/schema'>
408
- <edi:foo>hello</edi:foo>
409
- </x>
410
- eoxml
411
- assert_nil reader.namespace_uri
412
- assert_equal([nil,
413
- nil,
414
- "http://ecommerce.example.org/schema",
415
- nil,
416
- "http://ecommerce.example.org/schema",
417
- nil,
418
- nil],
419
- reader.map(&:namespace_uri))
420
- end
421
-
422
- def test_namespaced_attributes
423
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
424
- <x xmlns:edi='http://ecommerce.example.org/schema' xmlns:commons="http://rets.org/xsd/RETSCommons">
425
- <edi:foo commons:street-number="43">hello</edi:foo>
426
- <y edi:name="francis" bacon="87"/>
427
- </x>
428
- eoxml
429
- attr_ns = []
430
- while reader.read
431
- if reader.node_type == Nokogiri::XML::Node::ELEMENT_NODE
432
- reader.attribute_nodes.each {|attr| attr_ns << (attr.namespace.nil? ? nil : attr.namespace.prefix) }
433
- end
434
- end
435
- assert_equal(['commons',
436
- 'edi',
437
- nil],
438
- attr_ns)
439
- end
440
-
441
- def test_local_name
442
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
443
- <x xmlns:edi='http://ecommerce.example.org/schema'>
444
- <edi:foo>hello</edi:foo>
445
- </x>
446
- eoxml
447
- assert_nil reader.local_name
448
- assert_equal(["x", "#text", "foo", "#text", "foo", "#text", "x"],
449
- reader.map(&:local_name))
450
- end
451
-
452
- def test_name
453
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
454
- <x xmlns:edi='http://ecommerce.example.org/schema'>
455
- <edi:foo>hello</edi:foo>
456
- </x>
457
- eoxml
458
- assert_nil reader.name
459
- assert_equal(["x", "#text", "edi:foo", "#text", "edi:foo", "#text", "x"],
460
- reader.map(&:name))
461
- end
462
-
463
- def test_base_uri
464
- reader = Nokogiri::XML::Reader.from_memory(<<-eoxml)
465
- <x xml:base="http://base.example.org/base/">
466
- <link href="link"/>
467
- <other xml:base="http://other.example.org/"/>
468
- <relative xml:base="relative">
469
- <link href="stuff" />
470
- </relative>
471
- </x>
472
- eoxml
473
-
474
- assert_nil reader.base_uri
475
- assert_equal(["http://base.example.org/base/",
476
- "http://base.example.org/base/",
477
- "http://base.example.org/base/",
478
- "http://base.example.org/base/",
479
- "http://other.example.org/",
480
- "http://base.example.org/base/",
481
- "http://base.example.org/base/relative",
482
- "http://base.example.org/base/relative",
483
- "http://base.example.org/base/relative",
484
- "http://base.example.org/base/relative",
485
- "http://base.example.org/base/relative",
486
- "http://base.example.org/base/",
487
- "http://base.example.org/base/"],
488
- reader.map(&:base_uri))
489
- end
490
-
491
- def test_xlink_href_without_base_uri
492
- reader = Nokogiri::XML::Reader(<<-eoxml)
493
- <x xmlns:xlink="http://www.w3.org/1999/xlink">
494
- <link xlink:href="#other">Link</link>
495
- <other id="other">Linked Element</other>
496
- </x>
497
- eoxml
498
-
499
- reader.each do |node|
500
- if node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT
501
- if node.name == 'link'
502
- assert_nil node.base_uri
503
- end
504
- end
505
- end
506
- end
507
-
508
- def test_xlink_href_with_base_uri
509
- reader = Nokogiri::XML::Reader(<<-eoxml)
510
- <x xml:base="http://base.example.org/base/"
511
- xmlns:xlink="http://www.w3.org/1999/xlink">
512
- <link xlink:href="#other">Link</link>
513
- <other id="other">Linked Element</other>
514
- </x>
515
- eoxml
516
-
517
- reader.each do |node|
518
- if node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT
519
- assert_equal node.base_uri, "http://base.example.org/base/"
520
- end
521
- end
522
- end
523
-
524
- def test_read_from_memory
525
- called = false
526
- reader = Nokogiri::XML::Reader.from_memory('<foo>bar</foo>')
527
- reader.each do |node|
528
- called = true
529
- assert node
530
- end
531
- assert called
532
- end
533
-
534
- def test_large_document_smoke_test
535
- # simply run on a large document to verify that there no GC issues
536
- xml = []
537
- xml << "<elements>"
538
- 10000.times { |j| xml << "<element id=\"#{j}\"/>" }
539
- xml << "</elements>"
540
- xml = xml.join("\n")
541
-
542
- Nokogiri::XML::Reader.from_memory(xml).each do |e|
543
- e.attributes
544
- end
545
- end
546
-
547
- def test_correct_outer_xml_inclusion
548
- xml = Nokogiri::XML::Reader.from_io(StringIO.new(<<-eoxml))
549
- <root-element>
550
- <children>
551
- <child n="1">
552
- <field>child-1</field>
553
- </child>
554
- <child n="2">
555
- <field>child-2</field>
556
- </child>
557
- <child n="3">
558
- <field>child-3</field>
559
- </child>
560
- </children>
561
- </root-element>
562
- eoxml
563
-
564
- nodelengths = []
565
- has_child2 = []
566
-
567
- xml.each do |node|
568
- if node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT and node.name == "child"
569
- nodelengths << node.outer_xml.length
570
- has_child2 << !!(node.outer_xml =~ /child-2/)
571
- end
572
- end
573
-
574
- assert_equal(nodelengths[0], nodelengths[1])
575
- assert(has_child2[1])
576
- assert(!has_child2[0])
577
- end
578
-
579
- def test_correct_inner_xml_inclusion
580
- xml = Nokogiri::XML::Reader.from_io(StringIO.new(<<-eoxml))
581
- <root-element>
582
- <children>
583
- <child n="1">
584
- <field>child-1</field>
585
- </child>
586
- <child n="2">
587
- <field>child-2</field>
588
- </child>
589
- <child n="3">
590
- <field>child-3</field>
591
- </child>
592
- </children>
593
- </root-element>
594
- eoxml
595
-
596
- nodelengths = []
597
- has_child2 = []
598
-
599
- xml.each do |node|
600
- if node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT and node.name == "child"
601
- nodelengths << node.inner_xml.length
602
- has_child2 << !!(node.inner_xml =~ /child-2/)
603
- end
604
- end
605
-
606
- assert_equal(nodelengths[0], nodelengths[1])
607
- assert(has_child2[1])
608
- assert(!has_child2[0])
609
- end
610
-
611
- def test_nonexistent_attribute
612
- require 'nokogiri'
613
- reader = Nokogiri::XML::Reader("<root xmlns='bob'><el attr='fred' /></root>")
614
- reader.read # root
615
- reader.read # el
616
- assert_nil reader.attribute('other')
617
- end
618
- end
619
- end
620
- end