nokogiri 1.8.5 → 1.13.9

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 (353) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -21
  3. data/LICENSE-DEPENDENCIES.md +1159 -868
  4. data/LICENSE.md +5 -28
  5. data/README.md +196 -90
  6. data/bin/nokogiri +63 -50
  7. data/dependencies.yml +13 -59
  8. data/ext/nokogiri/depend +38 -358
  9. data/ext/nokogiri/extconf.rb +765 -420
  10. data/ext/nokogiri/gumbo.c +584 -0
  11. data/ext/nokogiri/html4_document.c +166 -0
  12. data/ext/nokogiri/html4_element_description.c +294 -0
  13. data/ext/nokogiri/html4_entity_lookup.c +37 -0
  14. data/ext/nokogiri/html4_sax_parser_context.c +119 -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 +228 -91
  18. data/ext/nokogiri/nokogiri.h +199 -88
  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 +21 -21
  22. data/ext/nokogiri/xml_cdata.c +14 -19
  23. data/ext/nokogiri/xml_comment.c +19 -26
  24. data/ext/nokogiri/xml_document.c +296 -217
  25. data/ext/nokogiri/xml_document_fragment.c +12 -16
  26. data/ext/nokogiri/xml_dtd.c +64 -58
  27. data/ext/nokogiri/xml_element_content.c +31 -26
  28. data/ext/nokogiri/xml_element_decl.c +25 -25
  29. data/ext/nokogiri/xml_encoding_handler.c +43 -18
  30. data/ext/nokogiri/xml_entity_decl.c +37 -35
  31. data/ext/nokogiri/xml_entity_reference.c +16 -18
  32. data/ext/nokogiri/xml_namespace.c +99 -54
  33. data/ext/nokogiri/xml_node.c +1107 -658
  34. data/ext/nokogiri/xml_node_set.c +178 -166
  35. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  36. data/ext/nokogiri/xml_reader.c +277 -175
  37. data/ext/nokogiri/xml_relax_ng.c +52 -28
  38. data/ext/nokogiri/xml_sax_parser.c +112 -112
  39. data/ext/nokogiri/xml_sax_parser_context.c +112 -86
  40. data/ext/nokogiri/xml_sax_push_parser.c +36 -27
  41. data/ext/nokogiri/xml_schema.c +114 -35
  42. data/ext/nokogiri/xml_syntax_error.c +42 -21
  43. data/ext/nokogiri/xml_text.c +14 -18
  44. data/ext/nokogiri/xml_xpath_context.c +226 -115
  45. data/ext/nokogiri/xslt_stylesheet.c +265 -173
  46. data/gumbo-parser/CHANGES.md +63 -0
  47. data/gumbo-parser/Makefile +101 -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 +626 -0
  59. data/gumbo-parser/src/error.h +148 -0
  60. data/gumbo-parser/src/foreign_attrs.c +104 -0
  61. data/gumbo-parser/src/foreign_attrs.gperf +27 -0
  62. data/gumbo-parser/src/gumbo.h +943 -0
  63. data/gumbo-parser/src/insertion_mode.h +33 -0
  64. data/gumbo-parser/src/macros.h +91 -0
  65. data/gumbo-parser/src/parser.c +4875 -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 +222 -0
  76. data/gumbo-parser/src/tag_lookup.c +382 -0
  77. data/gumbo-parser/src/tag_lookup.gperf +169 -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 +68 -0
  88. data/gumbo-parser/src/util.h +30 -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 +218 -91
  100. data/lib/nokogiri/css.rb +50 -17
  101. data/lib/nokogiri/decorators/slop.rb +9 -7
  102. data/lib/nokogiri/extension.rb +31 -0
  103. data/lib/nokogiri/gumbo.rb +15 -0
  104. data/lib/nokogiri/html.rb +38 -27
  105. data/lib/nokogiri/{html → html4}/builder.rb +4 -2
  106. data/lib/nokogiri/{html → html4}/document.rb +103 -105
  107. data/lib/nokogiri/html4/document_fragment.rb +54 -0
  108. data/lib/nokogiri/{html → html4}/element_description.rb +3 -1
  109. data/lib/nokogiri/html4/element_description_defaults.rb +578 -0
  110. data/lib/nokogiri/{html → html4}/entity_lookup.rb +4 -2
  111. data/lib/nokogiri/{html → html4}/sax/parser.rb +17 -16
  112. data/lib/nokogiri/html4/sax/parser_context.rb +20 -0
  113. data/lib/nokogiri/{html → html4}/sax/push_parser.rb +12 -11
  114. data/lib/nokogiri/html4.rb +46 -0
  115. data/lib/nokogiri/html5/document.rb +91 -0
  116. data/lib/nokogiri/html5/document_fragment.rb +83 -0
  117. data/lib/nokogiri/html5/node.rb +100 -0
  118. data/lib/nokogiri/html5.rb +478 -0
  119. data/lib/nokogiri/jruby/dependencies.rb +21 -0
  120. data/lib/nokogiri/syntax_error.rb +2 -0
  121. data/lib/nokogiri/version/constant.rb +6 -0
  122. data/lib/nokogiri/version/info.rb +222 -0
  123. data/lib/nokogiri/version.rb +3 -108
  124. data/lib/nokogiri/xml/attr.rb +6 -3
  125. data/lib/nokogiri/xml/attribute_decl.rb +3 -1
  126. data/lib/nokogiri/xml/builder.rb +97 -53
  127. data/lib/nokogiri/xml/cdata.rb +3 -1
  128. data/lib/nokogiri/xml/character_data.rb +2 -0
  129. data/lib/nokogiri/xml/document.rb +224 -86
  130. data/lib/nokogiri/xml/document_fragment.rb +57 -44
  131. data/lib/nokogiri/xml/dtd.rb +4 -2
  132. data/lib/nokogiri/xml/element_content.rb +2 -0
  133. data/lib/nokogiri/xml/element_decl.rb +3 -1
  134. data/lib/nokogiri/xml/entity_decl.rb +4 -2
  135. data/lib/nokogiri/xml/entity_reference.rb +2 -0
  136. data/lib/nokogiri/xml/namespace.rb +3 -0
  137. data/lib/nokogiri/xml/node/save_options.rb +10 -5
  138. data/lib/nokogiri/xml/node.rb +895 -377
  139. data/lib/nokogiri/xml/node_set.rb +92 -65
  140. data/lib/nokogiri/xml/notation.rb +13 -0
  141. data/lib/nokogiri/xml/parse_options.rb +22 -8
  142. data/lib/nokogiri/xml/pp/character_data.rb +9 -6
  143. data/lib/nokogiri/xml/pp/node.rb +25 -26
  144. data/lib/nokogiri/xml/pp.rb +4 -2
  145. data/lib/nokogiri/xml/processing_instruction.rb +3 -1
  146. data/lib/nokogiri/xml/reader.rb +21 -28
  147. data/lib/nokogiri/xml/relax_ng.rb +8 -2
  148. data/lib/nokogiri/xml/sax/document.rb +45 -49
  149. data/lib/nokogiri/xml/sax/parser.rb +38 -34
  150. data/lib/nokogiri/xml/sax/parser_context.rb +8 -3
  151. data/lib/nokogiri/xml/sax/push_parser.rb +6 -5
  152. data/lib/nokogiri/xml/sax.rb +6 -4
  153. data/lib/nokogiri/xml/schema.rb +19 -9
  154. data/lib/nokogiri/xml/searchable.rb +112 -72
  155. data/lib/nokogiri/xml/syntax_error.rb +6 -4
  156. data/lib/nokogiri/xml/text.rb +2 -0
  157. data/lib/nokogiri/xml/xpath/syntax_error.rb +4 -2
  158. data/lib/nokogiri/xml/xpath.rb +15 -4
  159. data/lib/nokogiri/xml/xpath_context.rb +3 -3
  160. data/lib/nokogiri/xml.rb +38 -37
  161. data/lib/nokogiri/xslt/stylesheet.rb +3 -1
  162. data/lib/nokogiri/xslt.rb +29 -20
  163. data/lib/nokogiri.rb +49 -65
  164. data/lib/xsd/xmlparser/nokogiri.rb +26 -24
  165. data/patches/libxml2/0001-Remove-script-macro-support.patch +40 -0
  166. data/patches/libxml2/0002-Update-entities-to-remove-handling-of-ssi.patch +44 -0
  167. data/patches/libxml2/0003-libxml2.la-is-in-top_builddir.patch +25 -0
  168. data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
  169. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  170. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +3037 -0
  171. data/ports/archives/libxml2-2.10.3.tar.xz +0 -0
  172. data/ports/archives/libxslt-1.1.37.tar.xz +0 -0
  173. metadata +211 -266
  174. data/.autotest +0 -22
  175. data/.cross_rubies +0 -8
  176. data/.editorconfig +0 -17
  177. data/.gemtest +0 -0
  178. data/.travis.yml +0 -63
  179. data/CHANGELOG.md +0 -1368
  180. data/CONTRIBUTING.md +0 -42
  181. data/C_CODING_STYLE.rdoc +0 -33
  182. data/Gemfile-libxml-ruby +0 -3
  183. data/Manifest.txt +0 -370
  184. data/ROADMAP.md +0 -111
  185. data/Rakefile +0 -348
  186. data/SECURITY.md +0 -19
  187. data/STANDARD_RESPONSES.md +0 -47
  188. data/Y_U_NO_GEMSPEC.md +0 -155
  189. data/appveyor.yml +0 -29
  190. data/build_all +0 -44
  191. data/ext/nokogiri/html_document.c +0 -170
  192. data/ext/nokogiri/html_document.h +0 -10
  193. data/ext/nokogiri/html_element_description.c +0 -279
  194. data/ext/nokogiri/html_element_description.h +0 -10
  195. data/ext/nokogiri/html_entity_lookup.c +0 -32
  196. data/ext/nokogiri/html_entity_lookup.h +0 -8
  197. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  198. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  199. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  200. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  201. data/ext/nokogiri/xml_attr.h +0 -9
  202. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  203. data/ext/nokogiri/xml_cdata.h +0 -9
  204. data/ext/nokogiri/xml_comment.h +0 -9
  205. data/ext/nokogiri/xml_document.h +0 -23
  206. data/ext/nokogiri/xml_document_fragment.h +0 -10
  207. data/ext/nokogiri/xml_dtd.h +0 -10
  208. data/ext/nokogiri/xml_element_content.h +0 -10
  209. data/ext/nokogiri/xml_element_decl.h +0 -9
  210. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  211. data/ext/nokogiri/xml_entity_decl.h +0 -10
  212. data/ext/nokogiri/xml_entity_reference.h +0 -9
  213. data/ext/nokogiri/xml_io.c +0 -61
  214. data/ext/nokogiri/xml_io.h +0 -11
  215. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  216. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  217. data/ext/nokogiri/xml_namespace.h +0 -15
  218. data/ext/nokogiri/xml_node.h +0 -13
  219. data/ext/nokogiri/xml_node_set.h +0 -12
  220. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  221. data/ext/nokogiri/xml_reader.h +0 -10
  222. data/ext/nokogiri/xml_relax_ng.h +0 -9
  223. data/ext/nokogiri/xml_sax_parser.h +0 -39
  224. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  225. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  226. data/ext/nokogiri/xml_schema.h +0 -9
  227. data/ext/nokogiri/xml_syntax_error.h +0 -13
  228. data/ext/nokogiri/xml_text.h +0 -9
  229. data/ext/nokogiri/xml_xpath_context.h +0 -10
  230. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  231. data/lib/nokogiri/html/document_fragment.rb +0 -49
  232. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  233. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  234. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  235. data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
  236. data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
  237. data/patches/sort-patches-by-date +0 -25
  238. data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
  239. data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
  240. data/suppressions/README.txt +0 -1
  241. data/suppressions/nokogiri_ruby-2.supp +0 -10
  242. data/tasks/test.rb +0 -100
  243. data/test/css/test_nthiness.rb +0 -226
  244. data/test/css/test_parser.rb +0 -386
  245. data/test/css/test_tokenizer.rb +0 -215
  246. data/test/css/test_xpath_visitor.rb +0 -96
  247. data/test/decorators/test_slop.rb +0 -23
  248. data/test/files/2ch.html +0 -108
  249. data/test/files/GH_1042.html +0 -18
  250. data/test/files/address_book.rlx +0 -12
  251. data/test/files/address_book.xml +0 -10
  252. data/test/files/atom.xml +0 -344
  253. data/test/files/bar/bar.xsd +0 -4
  254. data/test/files/bogus.xml +0 -0
  255. data/test/files/dont_hurt_em_why.xml +0 -422
  256. data/test/files/encoding.html +0 -82
  257. data/test/files/encoding.xhtml +0 -84
  258. data/test/files/exslt.xml +0 -8
  259. data/test/files/exslt.xslt +0 -35
  260. data/test/files/foo/foo.xsd +0 -4
  261. data/test/files/metacharset.html +0 -10
  262. data/test/files/namespace_pressure_test.xml +0 -1684
  263. data/test/files/noencoding.html +0 -47
  264. data/test/files/po.xml +0 -32
  265. data/test/files/po.xsd +0 -66
  266. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  267. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  268. data/test/files/saml/xenc_schema.xsd +0 -146
  269. data/test/files/saml/xmldsig_schema.xsd +0 -318
  270. data/test/files/shift_jis.html +0 -10
  271. data/test/files/shift_jis.xml +0 -5
  272. data/test/files/shift_jis_no_charset.html +0 -9
  273. data/test/files/slow-xpath.xml +0 -25509
  274. data/test/files/snuggles.xml +0 -3
  275. data/test/files/staff.dtd +0 -10
  276. data/test/files/staff.xml +0 -59
  277. data/test/files/staff.xslt +0 -32
  278. data/test/files/test_document_url/bar.xml +0 -2
  279. data/test/files/test_document_url/document.dtd +0 -4
  280. data/test/files/test_document_url/document.xml +0 -6
  281. data/test/files/tlm.html +0 -851
  282. data/test/files/to_be_xincluded.xml +0 -2
  283. data/test/files/valid_bar.xml +0 -2
  284. data/test/files/xinclude.xml +0 -4
  285. data/test/helper.rb +0 -271
  286. data/test/html/sax/test_parser.rb +0 -168
  287. data/test/html/sax/test_parser_context.rb +0 -46
  288. data/test/html/sax/test_parser_text.rb +0 -163
  289. data/test/html/sax/test_push_parser.rb +0 -87
  290. data/test/html/test_attributes.rb +0 -85
  291. data/test/html/test_builder.rb +0 -164
  292. data/test/html/test_document.rb +0 -712
  293. data/test/html/test_document_encoding.rb +0 -143
  294. data/test/html/test_document_fragment.rb +0 -310
  295. data/test/html/test_element_description.rb +0 -105
  296. data/test/html/test_named_characters.rb +0 -14
  297. data/test/html/test_node.rb +0 -212
  298. data/test/html/test_node_encoding.rb +0 -91
  299. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  300. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  301. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  302. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  303. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  304. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  305. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  306. data/test/test_convert_xpath.rb +0 -135
  307. data/test/test_css_cache.rb +0 -47
  308. data/test/test_encoding_handler.rb +0 -48
  309. data/test/test_memory_leak.rb +0 -156
  310. data/test/test_nokogiri.rb +0 -138
  311. data/test/test_soap4r_sax.rb +0 -52
  312. data/test/test_xslt_transforms.rb +0 -314
  313. data/test/xml/node/test_save_options.rb +0 -28
  314. data/test/xml/node/test_subclass.rb +0 -44
  315. data/test/xml/sax/test_parser.rb +0 -402
  316. data/test/xml/sax/test_parser_context.rb +0 -115
  317. data/test/xml/sax/test_parser_text.rb +0 -202
  318. data/test/xml/sax/test_push_parser.rb +0 -265
  319. data/test/xml/test_attr.rb +0 -74
  320. data/test/xml/test_attribute_decl.rb +0 -86
  321. data/test/xml/test_builder.rb +0 -341
  322. data/test/xml/test_c14n.rb +0 -180
  323. data/test/xml/test_cdata.rb +0 -54
  324. data/test/xml/test_comment.rb +0 -40
  325. data/test/xml/test_document.rb +0 -982
  326. data/test/xml/test_document_encoding.rb +0 -31
  327. data/test/xml/test_document_fragment.rb +0 -298
  328. data/test/xml/test_dtd.rb +0 -187
  329. data/test/xml/test_dtd_encoding.rb +0 -31
  330. data/test/xml/test_element_content.rb +0 -56
  331. data/test/xml/test_element_decl.rb +0 -73
  332. data/test/xml/test_entity_decl.rb +0 -122
  333. data/test/xml/test_entity_reference.rb +0 -262
  334. data/test/xml/test_namespace.rb +0 -96
  335. data/test/xml/test_node.rb +0 -1325
  336. data/test/xml/test_node_attributes.rb +0 -115
  337. data/test/xml/test_node_encoding.rb +0 -75
  338. data/test/xml/test_node_inheritance.rb +0 -32
  339. data/test/xml/test_node_reparenting.rb +0 -592
  340. data/test/xml/test_node_set.rb +0 -809
  341. data/test/xml/test_parse_options.rb +0 -64
  342. data/test/xml/test_processing_instruction.rb +0 -30
  343. data/test/xml/test_reader.rb +0 -620
  344. data/test/xml/test_reader_encoding.rb +0 -134
  345. data/test/xml/test_relax_ng.rb +0 -60
  346. data/test/xml/test_schema.rb +0 -142
  347. data/test/xml/test_syntax_error.rb +0 -36
  348. data/test/xml/test_text.rb +0 -60
  349. data/test/xml/test_unparented_node.rb +0 -483
  350. data/test/xml/test_xinclude.rb +0 -83
  351. data/test/xml/test_xpath.rb +0 -470
  352. data/test/xslt/test_custom_functions.rb +0 -133
  353. 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