nokogiri 1.8.5 → 1.13.6

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 (356) 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 +750 -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 +191 -89
  19. data/ext/nokogiri/test_global_handlers.c +40 -0
  20. data/ext/nokogiri/xml_attr.c +41 -36
  21. data/ext/nokogiri/xml_attribute_decl.c +18 -18
  22. data/ext/nokogiri/xml_cdata.c +13 -18
  23. data/ext/nokogiri/xml_comment.c +19 -26
  24. data/ext/nokogiri/xml_document.c +291 -216
  25. data/ext/nokogiri/xml_document_fragment.c +12 -16
  26. data/ext/nokogiri/xml_dtd.c +56 -50
  27. data/ext/nokogiri/xml_element_content.c +31 -26
  28. data/ext/nokogiri/xml_element_decl.c +22 -22
  29. data/ext/nokogiri/xml_encoding_handler.c +43 -18
  30. data/ext/nokogiri/xml_entity_decl.c +32 -30
  31. data/ext/nokogiri/xml_entity_reference.c +16 -18
  32. data/ext/nokogiri/xml_namespace.c +61 -52
  33. data/ext/nokogiri/xml_node.c +1044 -616
  34. data/ext/nokogiri/xml_node_set.c +174 -162
  35. data/ext/nokogiri/xml_processing_instruction.c +17 -19
  36. data/ext/nokogiri/xml_reader.c +226 -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 +112 -33
  42. data/ext/nokogiri/xml_syntax_error.c +42 -21
  43. data/ext/nokogiri/xml_text.c +13 -17
  44. data/ext/nokogiri/xml_xpath_context.c +223 -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 +23 -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/0004-use-glibc-strlen.patch +53 -0
  169. data/patches/libxml2/0005-avoid-isnan-isinf.patch +81 -0
  170. data/patches/libxml2/0006-update-automake-files-for-arm64.patch +3040 -0
  171. data/patches/libxml2/0008-htmlParseComment-handle-abruptly-closed-comments.patch +61 -0
  172. data/patches/libxml2/0009-allow-wildcard-namespaces.patch +77 -0
  173. data/patches/libxslt/0001-update-automake-files-for-arm64.patch +3037 -0
  174. data/ports/archives/libxml2-2.9.14.tar.xz +0 -0
  175. data/ports/archives/libxslt-1.1.35.tar.xz +0 -0
  176. metadata +220 -266
  177. data/.autotest +0 -22
  178. data/.cross_rubies +0 -8
  179. data/.editorconfig +0 -17
  180. data/.gemtest +0 -0
  181. data/.travis.yml +0 -63
  182. data/CHANGELOG.md +0 -1368
  183. data/CONTRIBUTING.md +0 -42
  184. data/C_CODING_STYLE.rdoc +0 -33
  185. data/Gemfile-libxml-ruby +0 -3
  186. data/Manifest.txt +0 -370
  187. data/ROADMAP.md +0 -111
  188. data/Rakefile +0 -348
  189. data/SECURITY.md +0 -19
  190. data/STANDARD_RESPONSES.md +0 -47
  191. data/Y_U_NO_GEMSPEC.md +0 -155
  192. data/appveyor.yml +0 -29
  193. data/build_all +0 -44
  194. data/ext/nokogiri/html_document.c +0 -170
  195. data/ext/nokogiri/html_document.h +0 -10
  196. data/ext/nokogiri/html_element_description.c +0 -279
  197. data/ext/nokogiri/html_element_description.h +0 -10
  198. data/ext/nokogiri/html_entity_lookup.c +0 -32
  199. data/ext/nokogiri/html_entity_lookup.h +0 -8
  200. data/ext/nokogiri/html_sax_parser_context.c +0 -116
  201. data/ext/nokogiri/html_sax_parser_context.h +0 -11
  202. data/ext/nokogiri/html_sax_push_parser.c +0 -87
  203. data/ext/nokogiri/html_sax_push_parser.h +0 -9
  204. data/ext/nokogiri/xml_attr.h +0 -9
  205. data/ext/nokogiri/xml_attribute_decl.h +0 -9
  206. data/ext/nokogiri/xml_cdata.h +0 -9
  207. data/ext/nokogiri/xml_comment.h +0 -9
  208. data/ext/nokogiri/xml_document.h +0 -23
  209. data/ext/nokogiri/xml_document_fragment.h +0 -10
  210. data/ext/nokogiri/xml_dtd.h +0 -10
  211. data/ext/nokogiri/xml_element_content.h +0 -10
  212. data/ext/nokogiri/xml_element_decl.h +0 -9
  213. data/ext/nokogiri/xml_encoding_handler.h +0 -8
  214. data/ext/nokogiri/xml_entity_decl.h +0 -10
  215. data/ext/nokogiri/xml_entity_reference.h +0 -9
  216. data/ext/nokogiri/xml_io.c +0 -61
  217. data/ext/nokogiri/xml_io.h +0 -11
  218. data/ext/nokogiri/xml_libxml2_hacks.c +0 -112
  219. data/ext/nokogiri/xml_libxml2_hacks.h +0 -12
  220. data/ext/nokogiri/xml_namespace.h +0 -15
  221. data/ext/nokogiri/xml_node.h +0 -13
  222. data/ext/nokogiri/xml_node_set.h +0 -12
  223. data/ext/nokogiri/xml_processing_instruction.h +0 -9
  224. data/ext/nokogiri/xml_reader.h +0 -10
  225. data/ext/nokogiri/xml_relax_ng.h +0 -9
  226. data/ext/nokogiri/xml_sax_parser.h +0 -39
  227. data/ext/nokogiri/xml_sax_parser_context.h +0 -10
  228. data/ext/nokogiri/xml_sax_push_parser.h +0 -9
  229. data/ext/nokogiri/xml_schema.h +0 -9
  230. data/ext/nokogiri/xml_syntax_error.h +0 -13
  231. data/ext/nokogiri/xml_text.h +0 -9
  232. data/ext/nokogiri/xml_xpath_context.h +0 -10
  233. data/ext/nokogiri/xslt_stylesheet.h +0 -14
  234. data/lib/nokogiri/html/document_fragment.rb +0 -49
  235. data/lib/nokogiri/html/element_description_defaults.rb +0 -671
  236. data/lib/nokogiri/html/sax/parser_context.rb +0 -16
  237. data/patches/libxml2/0001-Revert-Do-not-URI-escape-in-server-side-includes.patch +0 -78
  238. data/patches/libxml2/0002-Fix-nullptr-deref-with-XPath-logic-ops.patch +0 -54
  239. data/patches/libxml2/0003-Fix-infinite-loop-in-LZMA-decompression.patch +0 -50
  240. data/patches/sort-patches-by-date +0 -25
  241. data/ports/archives/libxml2-2.9.8.tar.gz +0 -0
  242. data/ports/archives/libxslt-1.1.32.tar.gz +0 -0
  243. data/suppressions/README.txt +0 -1
  244. data/suppressions/nokogiri_ruby-2.supp +0 -10
  245. data/tasks/test.rb +0 -100
  246. data/test/css/test_nthiness.rb +0 -226
  247. data/test/css/test_parser.rb +0 -386
  248. data/test/css/test_tokenizer.rb +0 -215
  249. data/test/css/test_xpath_visitor.rb +0 -96
  250. data/test/decorators/test_slop.rb +0 -23
  251. data/test/files/2ch.html +0 -108
  252. data/test/files/GH_1042.html +0 -18
  253. data/test/files/address_book.rlx +0 -12
  254. data/test/files/address_book.xml +0 -10
  255. data/test/files/atom.xml +0 -344
  256. data/test/files/bar/bar.xsd +0 -4
  257. data/test/files/bogus.xml +0 -0
  258. data/test/files/dont_hurt_em_why.xml +0 -422
  259. data/test/files/encoding.html +0 -82
  260. data/test/files/encoding.xhtml +0 -84
  261. data/test/files/exslt.xml +0 -8
  262. data/test/files/exslt.xslt +0 -35
  263. data/test/files/foo/foo.xsd +0 -4
  264. data/test/files/metacharset.html +0 -10
  265. data/test/files/namespace_pressure_test.xml +0 -1684
  266. data/test/files/noencoding.html +0 -47
  267. data/test/files/po.xml +0 -32
  268. data/test/files/po.xsd +0 -66
  269. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  270. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  271. data/test/files/saml/xenc_schema.xsd +0 -146
  272. data/test/files/saml/xmldsig_schema.xsd +0 -318
  273. data/test/files/shift_jis.html +0 -10
  274. data/test/files/shift_jis.xml +0 -5
  275. data/test/files/shift_jis_no_charset.html +0 -9
  276. data/test/files/slow-xpath.xml +0 -25509
  277. data/test/files/snuggles.xml +0 -3
  278. data/test/files/staff.dtd +0 -10
  279. data/test/files/staff.xml +0 -59
  280. data/test/files/staff.xslt +0 -32
  281. data/test/files/test_document_url/bar.xml +0 -2
  282. data/test/files/test_document_url/document.dtd +0 -4
  283. data/test/files/test_document_url/document.xml +0 -6
  284. data/test/files/tlm.html +0 -851
  285. data/test/files/to_be_xincluded.xml +0 -2
  286. data/test/files/valid_bar.xml +0 -2
  287. data/test/files/xinclude.xml +0 -4
  288. data/test/helper.rb +0 -271
  289. data/test/html/sax/test_parser.rb +0 -168
  290. data/test/html/sax/test_parser_context.rb +0 -46
  291. data/test/html/sax/test_parser_text.rb +0 -163
  292. data/test/html/sax/test_push_parser.rb +0 -87
  293. data/test/html/test_attributes.rb +0 -85
  294. data/test/html/test_builder.rb +0 -164
  295. data/test/html/test_document.rb +0 -712
  296. data/test/html/test_document_encoding.rb +0 -143
  297. data/test/html/test_document_fragment.rb +0 -310
  298. data/test/html/test_element_description.rb +0 -105
  299. data/test/html/test_named_characters.rb +0 -14
  300. data/test/html/test_node.rb +0 -212
  301. data/test/html/test_node_encoding.rb +0 -91
  302. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  303. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  304. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  305. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  306. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  307. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  308. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  309. data/test/test_convert_xpath.rb +0 -135
  310. data/test/test_css_cache.rb +0 -47
  311. data/test/test_encoding_handler.rb +0 -48
  312. data/test/test_memory_leak.rb +0 -156
  313. data/test/test_nokogiri.rb +0 -138
  314. data/test/test_soap4r_sax.rb +0 -52
  315. data/test/test_xslt_transforms.rb +0 -314
  316. data/test/xml/node/test_save_options.rb +0 -28
  317. data/test/xml/node/test_subclass.rb +0 -44
  318. data/test/xml/sax/test_parser.rb +0 -402
  319. data/test/xml/sax/test_parser_context.rb +0 -115
  320. data/test/xml/sax/test_parser_text.rb +0 -202
  321. data/test/xml/sax/test_push_parser.rb +0 -265
  322. data/test/xml/test_attr.rb +0 -74
  323. data/test/xml/test_attribute_decl.rb +0 -86
  324. data/test/xml/test_builder.rb +0 -341
  325. data/test/xml/test_c14n.rb +0 -180
  326. data/test/xml/test_cdata.rb +0 -54
  327. data/test/xml/test_comment.rb +0 -40
  328. data/test/xml/test_document.rb +0 -982
  329. data/test/xml/test_document_encoding.rb +0 -31
  330. data/test/xml/test_document_fragment.rb +0 -298
  331. data/test/xml/test_dtd.rb +0 -187
  332. data/test/xml/test_dtd_encoding.rb +0 -31
  333. data/test/xml/test_element_content.rb +0 -56
  334. data/test/xml/test_element_decl.rb +0 -73
  335. data/test/xml/test_entity_decl.rb +0 -122
  336. data/test/xml/test_entity_reference.rb +0 -262
  337. data/test/xml/test_namespace.rb +0 -96
  338. data/test/xml/test_node.rb +0 -1325
  339. data/test/xml/test_node_attributes.rb +0 -115
  340. data/test/xml/test_node_encoding.rb +0 -75
  341. data/test/xml/test_node_inheritance.rb +0 -32
  342. data/test/xml/test_node_reparenting.rb +0 -592
  343. data/test/xml/test_node_set.rb +0 -809
  344. data/test/xml/test_parse_options.rb +0 -64
  345. data/test/xml/test_processing_instruction.rb +0 -30
  346. data/test/xml/test_reader.rb +0 -620
  347. data/test/xml/test_reader_encoding.rb +0 -134
  348. data/test/xml/test_relax_ng.rb +0 -60
  349. data/test/xml/test_schema.rb +0 -142
  350. data/test/xml/test_syntax_error.rb +0 -36
  351. data/test/xml/test_text.rb +0 -60
  352. data/test/xml/test_unparented_node.rb +0 -483
  353. data/test/xml/test_xinclude.rb +0 -83
  354. data/test/xml/test_xpath.rb +0 -470
  355. data/test/xslt/test_custom_functions.rb +0 -133
  356. data/test/xslt/test_exception_handling.rb +0 -37
@@ -1,483 +0,0 @@
1
- require "helper"
2
-
3
- require 'stringio'
4
-
5
- module Nokogiri
6
- module XML
7
- class TestUnparentedNode < Nokogiri::TestCase
8
- def setup
9
- begin
10
- xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
11
- @node = xml.at('staff')
12
- @node.unlink
13
- end
14
- GC.start # try to GC the document
15
- end
16
-
17
- def test_node_still_has_document
18
- assert @node.document
19
- end
20
-
21
- def test_add_namespace
22
- node = @node.at('address')
23
- node.unlink
24
- node.add_namespace('foo', 'http://tenderlovemaking.com')
25
- assert_equal 'http://tenderlovemaking.com', node.namespaces['xmlns:foo']
26
- end
27
-
28
- def test_write_to
29
- io = StringIO.new
30
- @node.write_to io
31
- io.rewind
32
- assert_equal @node.to_xml, io.read
33
- end
34
-
35
- def test_attribute_with_symbol
36
- assert_equal 'Yes', @node.css('address').first[:domestic]
37
- end
38
-
39
- def test_write_to_with_block
40
- called = false
41
- io = StringIO.new
42
- conf = nil
43
- @node.write_to io do |config|
44
- called = true
45
- conf = config
46
- config.format.as_html.no_empty_tags
47
- end
48
- io.rewind
49
- assert called
50
- assert_equal @node.serialize(:save_with => conf.options), io.read
51
- end
52
-
53
- %w{ xml html xhtml }.each do |type|
54
- define_method(:"test_write_#{type}_to") do
55
- io = StringIO.new
56
- assert @node.send(:"write_#{type}_to", io)
57
- io.rewind
58
- assert_match @node.send(:"to_#{type}"), io.read
59
- end
60
- end
61
-
62
- def test_serialize_with_block
63
- called = false
64
- conf = nil
65
- string = @node.serialize do |config|
66
- called = true
67
- conf = config
68
- config.format.as_html.no_empty_tags
69
- end
70
- assert called
71
- assert_equal @node.serialize(nil, conf.options), string
72
- end
73
-
74
- def test_values
75
- assert_equal %w{ Yes Yes }, @node.xpath('.//address')[1].values
76
- end
77
-
78
- def test_keys
79
- assert_equal %w{ domestic street }, @node.xpath('.//address')[1].keys
80
- end
81
-
82
- def test_each
83
- attributes = []
84
- @node.xpath('.//address')[1].each do |key, value|
85
- attributes << [key, value]
86
- end
87
- assert_equal [['domestic', 'Yes'], ['street', 'Yes']], attributes
88
- end
89
-
90
- def test_new
91
- assert node = Nokogiri::XML::Node.new('input', @node)
92
- assert_equal 1, node.node_type
93
- end
94
-
95
- def test_to_str
96
- assert name = @node.xpath('.//name').first
97
- assert_match(/Margaret/, '' + name)
98
- assert_equal('Margaret Martin', '' + name.children.first)
99
- end
100
-
101
- def test_ancestors
102
- assert(address = @node.xpath('.//address').first)
103
- assert_equal 2, address.ancestors.length
104
- assert_equal ['employee', 'staff'],
105
- address.ancestors.map { |x| x ? x.name : x }
106
- end
107
-
108
- def test_read_only?
109
- assert entity_decl = @node.internal_subset.children.find { |x|
110
- x.type == Node::ENTITY_DECL
111
- }
112
- assert entity_decl.read_only?
113
- end
114
-
115
- def test_remove_attribute
116
- address = @node.xpath('./employee/address').first
117
- assert_equal 'Yes', address['domestic']
118
- address.remove_attribute 'domestic'
119
- assert_nil address['domestic']
120
- end
121
-
122
- def test_delete
123
- address = @node.xpath('./employee/address').first
124
- assert_equal 'Yes', address['domestic']
125
- address.delete 'domestic'
126
- assert_nil address['domestic']
127
- end
128
-
129
- def test_add_child_in_same_document
130
- child = @node.css('employee').first
131
-
132
- assert child.children.last
133
- assert new_child = child.children.first
134
-
135
- last = child.children.last
136
-
137
- child.add_child(new_child)
138
- assert_equal new_child, child.children.last
139
- assert_equal last, child.children.last
140
- end
141
-
142
- def test_add_child_from_other_document
143
- d1 = Nokogiri::XML("<root><item>1</item><item>2</item></root>")
144
- d2 = Nokogiri::XML("<root><item>3</item><item>4</item></root>")
145
-
146
- d2.at('root').search('item').each do |i|
147
- d1.at('root').add_child i
148
- end
149
-
150
- assert_equal 0, d2.search('item').size
151
- assert_equal 4, d1.search('item').size
152
- end
153
-
154
- def test_add_child
155
- xml = Nokogiri::XML(<<-eoxml)
156
- <root>
157
- <a>Hello world</a>
158
- </root>
159
- eoxml
160
- text_node = Nokogiri::XML::Text.new('hello', xml)
161
- assert_equal Nokogiri::XML::Node::TEXT_NODE, text_node.type
162
- xml.root.add_child text_node
163
- assert_match 'hello', xml.to_s
164
- end
165
-
166
- def test_chevron_works_as_add_child
167
- xml = Nokogiri::XML(<<-eoxml)
168
- <root>
169
- <a>Hello world</a>
170
- </root>
171
- eoxml
172
- text_node = Nokogiri::XML::Text.new('hello', xml)
173
- xml.root << text_node
174
- assert_match 'hello', xml.to_s
175
- end
176
-
177
- def test_add_previous_sibling
178
- xml = Nokogiri::XML(<<-eoxml)
179
- <root>
180
- <a>Hello world</a>
181
- </root>
182
- eoxml
183
- b_node = Nokogiri::XML::Node.new('a', xml)
184
- assert_equal Nokogiri::XML::Node::ELEMENT_NODE, b_node.type
185
- b_node.content = 'first'
186
- a_node = xml.xpath('.//a').first
187
- a_node.add_previous_sibling(b_node)
188
- assert_equal('first', xml.xpath('.//a').first.text)
189
- end
190
-
191
- def test_add_previous_sibling_merge
192
- xml = Nokogiri::XML(<<-eoxml)
193
- <root>
194
- <a>Hello world</a>
195
- </root>
196
- eoxml
197
-
198
- assert a_tag = xml.css('a').first
199
-
200
- left_space = a_tag.previous
201
- right_space = a_tag.next
202
- assert left_space.text?
203
- assert right_space.text?
204
-
205
- left_space.add_previous_sibling(right_space)
206
- assert_equal left_space, right_space
207
- end
208
-
209
- def test_add_next_sibling_merge
210
- xml = Nokogiri::XML(<<-eoxml)
211
- <root>
212
- <a>Hello world</a>
213
- </root>
214
- eoxml
215
-
216
- assert a_tag = xml.css('a').first
217
-
218
- left_space = a_tag.previous
219
- right_space = a_tag.next
220
- assert left_space.text?
221
- assert right_space.text?
222
-
223
- right_space.add_next_sibling(left_space)
224
- assert_equal left_space, right_space
225
- end
226
-
227
- def test_add_next_sibling_to_root_raises_exception
228
- xml = Nokogiri::XML(<<-eoxml)
229
- <root />
230
- eoxml
231
-
232
- node = Nokogiri::XML::Node.new 'child', xml
233
-
234
- assert_raise(ArgumentError) do
235
- xml.root.add_next_sibling(node)
236
- end
237
- end
238
-
239
- def test_add_previous_sibling_to_root_raises_exception
240
- xml = Nokogiri::XML(<<-eoxml)
241
- <root />
242
- eoxml
243
-
244
- node = Nokogiri::XML::Node.new 'child', xml
245
-
246
- assert_raise(ArgumentError) do
247
- xml.root.add_previous_sibling(node)
248
- end
249
- end
250
-
251
- def test_document_root_can_have_a_comment_sibling_via_add_child
252
- doc = Nokogiri::XML "<root>foo</root>"
253
- comment = Nokogiri::XML::Comment.new(doc, "this is a comment")
254
- doc.add_child comment
255
- assert_equal [doc.root, comment], doc.children.to_a
256
- end
257
-
258
- def test_document_root_can_have_a_comment_sibling_via_prepend_child
259
- doc = Nokogiri::XML "<root>foo</root>"
260
- comment = Nokogiri::XML::Comment.new(doc, "this is a comment")
261
- doc.prepend_child comment
262
- assert_equal [comment, doc.root], doc.children.to_a
263
- end
264
-
265
- def test_document_root_can_have_a_comment_sibling_via_add_next_sibling
266
- doc = Nokogiri::XML "<root>foo</root>"
267
- comment = Nokogiri::XML::Comment.new(doc, "this is a comment")
268
- doc.root.add_next_sibling comment
269
- assert_equal [doc.root, comment], doc.children.to_a
270
- end
271
-
272
- def test_document_root_can_have_a_comment_sibling_via_add_previous_sibling
273
- doc = Nokogiri::XML "<root>foo</root>"
274
- comment = Nokogiri::XML::Comment.new(doc, "this is a comment")
275
- doc.root.add_previous_sibling comment
276
- assert_equal [comment, doc.root], doc.children.to_a
277
- end
278
-
279
- def test_document_root_can_have_a_processing_instruction_sibling_via_add_child
280
- doc = Nokogiri::XML "<root>foo</root>"
281
- pi = Nokogiri::XML::ProcessingInstruction.new(doc, "xml-stylesheet", %q{type="text/xsl" href="foo.xsl"})
282
- doc.add_child pi
283
- assert_equal [doc.root, pi], doc.children.to_a
284
- end
285
-
286
- def test_document_root_can_have_a_processing_instruction_sibling_via_prepend_child
287
- doc = Nokogiri::XML "<root>foo</root>"
288
- pi = Nokogiri::XML::ProcessingInstruction.new(doc, "xml-stylesheet", %q{type="text/xsl" href="foo.xsl"})
289
- doc.prepend_child pi
290
- assert_equal [pi, doc.root], doc.children.to_a
291
- end
292
-
293
- def test_document_root_can_have_a_processing_instruction_sibling_via_add_next_sibling
294
- doc = Nokogiri::XML "<root>foo</root>"
295
- pi = Nokogiri::XML::ProcessingInstruction.new(doc, "xml-stylesheet", %q{type="text/xsl" href="foo.xsl"})
296
- doc.root.add_next_sibling pi
297
- assert_equal [doc.root, pi], doc.children.to_a
298
- end
299
-
300
- def test_document_root_can_have_a_processing_instruction_sibling_via_add_previous_sibling
301
- doc = Nokogiri::XML "<root>foo</root>"
302
- pi = Nokogiri::XML::ProcessingInstruction.new(doc, "xml-stylesheet", %q{type="text/xsl" href="foo.xsl"})
303
- doc.root.add_previous_sibling pi
304
- assert_equal [pi, doc.root], doc.children.to_a
305
- end
306
-
307
- def test_find_by_css_with_tilde_eql
308
- xml = Nokogiri::XML.parse(<<-eoxml)
309
- <root>
310
- <a>Hello world</a>
311
- <a class='foo bar'>Bar</a>
312
- <a class='bar foo'>Bar</a>
313
- <a class='bar'>Bar</a>
314
- <a class='baz bar foo'>Bar</a>
315
- <a class='bazbarfoo'>Awesome</a>
316
- <a class='bazbar'>Awesome</a>
317
- </root>
318
- eoxml
319
- set = xml.css('a[@class~="bar"]')
320
- assert_equal 4, set.length
321
- assert_equal ['Bar'], set.map { |node| node.content }.uniq
322
- end
323
-
324
- def test_unlink
325
- xml = Nokogiri::XML.parse(<<-eoxml)
326
- <root>
327
- <a class='foo bar'>Bar</a>
328
- <a class='bar foo'>Bar</a>
329
- <a class='bar'>Bar</a>
330
- <a>Hello world</a>
331
- <a class='baz bar foo'>Bar</a>
332
- <a class='bazbarfoo'>Awesome</a>
333
- <a class='bazbar'>Awesome</a>
334
- </root>
335
- eoxml
336
- node = xml.xpath('.//a')[3]
337
- assert_equal('Hello world', node.text)
338
- assert_match(/Hello world/, xml.to_s)
339
- assert node.parent
340
- assert node.document
341
- assert node.previous_sibling
342
- assert node.next_sibling
343
- node.unlink
344
- assert !node.parent
345
- # assert !node.document
346
- assert !node.previous_sibling
347
- assert !node.next_sibling
348
- assert_no_match(/Hello world/, xml.to_s)
349
- end
350
-
351
- def test_next_sibling
352
- assert sibling = @node.child.next_sibling
353
- assert_equal('employee', sibling.name)
354
- end
355
-
356
- def test_previous_sibling
357
- assert sibling = @node.child.next_sibling
358
- assert_equal('employee', sibling.name)
359
- assert_equal(sibling.previous_sibling, @node.child)
360
- end
361
-
362
- def test_name=
363
- @node.name = 'awesome'
364
- assert_equal('awesome', @node.name)
365
- end
366
-
367
- def test_child
368
- assert child = @node.child
369
- assert_equal('text', child.name)
370
- end
371
-
372
- def test_key?
373
- assert node = @node.search('.//address').first
374
- assert(!node.key?('asdfasdf'))
375
- end
376
-
377
- def test_set_property
378
- assert node = @node.search('.//address').first
379
- node['foo'] = 'bar'
380
- assert_equal('bar', node['foo'])
381
- end
382
-
383
- def test_attributes
384
- assert node = @node.search('.//address').first
385
- assert_nil(node['asdfasdfasdf'])
386
- assert_equal('Yes', node['domestic'])
387
-
388
- assert node = @node.search('.//address')[2]
389
- attr = node.attributes
390
- assert_equal 2, attr.size
391
- assert_equal 'Yes', attr['domestic'].value
392
- assert_equal 'Yes', attr['domestic'].to_s
393
- assert_equal 'No', attr['street'].value
394
- end
395
-
396
- def test_path
397
- assert set = @node.search('.//employee')
398
- assert node = set.first
399
- assert_equal('/staff/employee[1]', node.path)
400
- end
401
-
402
- def test_search_by_symbol
403
- assert set = @node.search(:employee)
404
- assert 5, set.length
405
-
406
- assert node = @node.at(:employee)
407
- assert node.text =~ /EMP0001/
408
- end
409
-
410
- def test_new_node
411
- node = Nokogiri::XML::Node.new('form', @node.document)
412
- assert_equal('form', node.name)
413
- assert(node.document)
414
- end
415
-
416
- def test_encode_special_chars
417
- foo = @node.css('employee').first.encode_special_chars('&')
418
- assert_equal '&amp;', foo
419
- end
420
-
421
- def test_content
422
- node = Nokogiri::XML::Node.new('form', @node)
423
- assert_equal('', node.content)
424
-
425
- node.content = 'hello world!'
426
- assert_equal('hello world!', node.content)
427
- end
428
-
429
- def test_whitespace_nodes
430
- doc = Nokogiri::XML.parse("<root><b>Foo</b>\n<i>Bar</i> <p>Bazz</p></root>")
431
- children = doc.at('.//root').children.collect(&:to_s)
432
- assert_equal "\n", children[1]
433
- assert_equal " ", children[3]
434
- end
435
-
436
- def test_replace
437
- set = @node.search('.//employee')
438
- assert 5, set.length
439
- assert 0, @node.search('.//form').length
440
-
441
- first = set[0]
442
- second = set[1]
443
-
444
- node = Nokogiri::XML::Node.new('form', @node)
445
- first.replace(node)
446
-
447
- assert set = @node.search('.//employee')
448
- assert_equal 4, set.length
449
- assert 1, @node.search('.//form').length
450
-
451
- assert_equal set[0].to_xml, second.to_xml
452
- end
453
-
454
- def test_replace_on_unparented_node
455
- foo = Node.new('foo', @node.document)
456
- if Nokogiri.jruby? # JRuby Nokogiri doesn't raise an exception
457
- @node.replace(foo)
458
- else
459
- assert_raises(RuntimeError){ @node.replace(foo) }
460
- end
461
- end
462
-
463
- def test_illegal_replace_of_node_with_doc
464
- new_node = Nokogiri::XML.parse('<foo>bar</foo>')
465
- old_node = @node.at('.//employee')
466
- assert_raises(ArgumentError){ old_node.replace new_node }
467
- end
468
-
469
- def test_unlink_on_unlinked_node_1
470
- node = Nokogiri::XML::Node.new 'div', Nokogiri::XML::Document.new
471
- node.unlink # must_not_raise
472
- assert_nil node.parent
473
- end
474
-
475
- def test_unlink_on_unlinked_node_2
476
- node = Nokogiri::XML('<div>foo</div>').at_css("div")
477
- node.unlink
478
- node.unlink # must_not_raise
479
- assert_nil node.parent
480
- end
481
- end
482
- end
483
- end
@@ -1,83 +0,0 @@
1
- require "helper"
2
-
3
- module Nokogiri
4
- module XML
5
- class TestXInclude < Nokogiri::TestCase
6
- def setup
7
- super
8
- @xml = Nokogiri::XML.parse(File.read(XML_XINCLUDE_FILE), XML_XINCLUDE_FILE)
9
- @included = "this snippet is to be included from xinclude.xml"
10
- end
11
-
12
- def test_xinclude_on_document_parse
13
- skip("Pure Java version XInlcude has a conflict with NekoDTD setting. This will be fixed later.") if Nokogiri.jruby?
14
- # first test that xinclude works when requested
15
- xml_doc = nil
16
-
17
- File.open(XML_XINCLUDE_FILE) do |fp|
18
- xml_doc = Nokogiri::XML(fp) do |conf|
19
- conf.strict.dtdload.noent.nocdata.xinclude
20
- end
21
- end
22
-
23
- assert_not_nil xml_doc
24
- assert_not_nil included = xml_doc.at_xpath('//included')
25
- assert_equal @included, included.content
26
-
27
- # no xinclude should happen when not requested
28
- xml_doc = nil
29
-
30
- File.open(XML_XINCLUDE_FILE) do |fp|
31
- xml_doc = Nokogiri::XML(fp) do |conf|
32
- conf.strict.dtdload.noent.nocdata
33
- end
34
- end
35
-
36
- assert_not_nil xml_doc
37
- assert_nil xml_doc.at_xpath('//included')
38
- end
39
-
40
- def test_xinclude_on_document_node
41
- skip("Pure Java version turns XInlcude on against a parser.") if Nokogiri.jruby?
42
- assert_nil @xml.at_xpath('//included')
43
- @xml.do_xinclude
44
- assert_not_nil included = @xml.at_xpath('//included')
45
- assert_equal @included, included.content
46
- end
47
-
48
- def test_xinclude_on_element_subtree
49
- skip("Pure Java version turns XInlcude on against a parser.") if Nokogiri.jruby?
50
- assert_nil @xml.at_xpath('//included')
51
- @xml.root.do_xinclude
52
- assert_not_nil included = @xml.at_xpath('//included')
53
- assert_equal @included, included.content
54
- end
55
-
56
- def test_do_xinclude_accepts_block
57
- non_default_options = Nokogiri::XML::ParseOptions::NOBLANKS | \
58
- Nokogiri::XML::ParseOptions::XINCLUDE
59
-
60
- @xml.do_xinclude(non_default_options) do |options|
61
- assert_equal non_default_options, options.to_i
62
- end
63
- end
64
-
65
- def test_include_nonexistent_throws_exception
66
- skip("Pure Java version behaves differently") if Nokogiri.jruby?
67
- # break inclusion deliberately
68
- @xml.at_xpath('//xi:include')['href'] = "nonexistent.xml"
69
-
70
- exception_raised = false
71
- begin
72
- @xml.do_xinclude { |opts| opts.nowarning }
73
- rescue Exception => e
74
- assert_equal Nokogiri::XML::SyntaxError, e.class
75
- exception_raised = true
76
- end
77
-
78
- assert exception_raised
79
- end
80
-
81
- end
82
- end
83
- end