nokogiri 1.2.3-x86-mswin32-60 → 1.4.5-x86-mswin32-60

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 (319) hide show
  1. data/.autotest +18 -7
  2. data/.gemtest +0 -0
  3. data/CHANGELOG.ja.rdoc +297 -3
  4. data/CHANGELOG.rdoc +289 -0
  5. data/Manifest.txt +148 -37
  6. data/README.ja.rdoc +20 -20
  7. data/README.rdoc +53 -22
  8. data/Rakefile +127 -211
  9. data/bin/nokogiri +54 -0
  10. data/ext/nokogiri/depend +358 -0
  11. data/ext/nokogiri/extconf.rb +89 -54
  12. data/ext/nokogiri/html_document.c +34 -27
  13. data/ext/nokogiri/html_document.h +1 -1
  14. data/ext/nokogiri/html_element_description.c +276 -0
  15. data/ext/nokogiri/html_element_description.h +10 -0
  16. data/ext/nokogiri/html_entity_lookup.c +7 -5
  17. data/ext/nokogiri/html_entity_lookup.h +1 -1
  18. data/ext/nokogiri/html_sax_parser_context.c +94 -0
  19. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  20. data/ext/nokogiri/{native.c → nokogiri.c} +31 -7
  21. data/ext/nokogiri/{native.h → nokogiri.h} +68 -41
  22. data/ext/nokogiri/xml_attr.c +20 -9
  23. data/ext/nokogiri/xml_attr.h +1 -1
  24. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  25. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  26. data/ext/nokogiri/xml_cdata.c +21 -9
  27. data/ext/nokogiri/xml_cdata.h +1 -1
  28. data/ext/nokogiri/xml_comment.c +18 -6
  29. data/ext/nokogiri/xml_comment.h +1 -1
  30. data/ext/nokogiri/xml_document.c +247 -68
  31. data/ext/nokogiri/xml_document.h +5 -3
  32. data/ext/nokogiri/xml_document_fragment.c +15 -7
  33. data/ext/nokogiri/xml_document_fragment.h +1 -1
  34. data/ext/nokogiri/xml_dtd.c +110 -10
  35. data/ext/nokogiri/xml_dtd.h +3 -1
  36. data/ext/nokogiri/xml_element_content.c +123 -0
  37. data/ext/nokogiri/xml_element_content.h +10 -0
  38. data/ext/nokogiri/xml_element_decl.c +69 -0
  39. data/ext/nokogiri/xml_element_decl.h +9 -0
  40. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  41. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  42. data/ext/nokogiri/xml_entity_decl.c +110 -0
  43. data/ext/nokogiri/xml_entity_decl.h +10 -0
  44. data/ext/nokogiri/xml_entity_reference.c +16 -5
  45. data/ext/nokogiri/xml_entity_reference.h +1 -1
  46. data/ext/nokogiri/xml_io.c +40 -8
  47. data/ext/nokogiri/xml_io.h +2 -1
  48. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  49. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  50. data/ext/nokogiri/xml_namespace.c +84 -0
  51. data/ext/nokogiri/xml_namespace.h +13 -0
  52. data/ext/nokogiri/xml_node.c +782 -225
  53. data/ext/nokogiri/xml_node.h +2 -4
  54. data/ext/nokogiri/xml_node_set.c +253 -34
  55. data/ext/nokogiri/xml_node_set.h +2 -2
  56. data/ext/nokogiri/xml_processing_instruction.c +17 -5
  57. data/ext/nokogiri/xml_processing_instruction.h +1 -1
  58. data/ext/nokogiri/xml_reader.c +277 -85
  59. data/ext/nokogiri/xml_reader.h +1 -1
  60. data/ext/nokogiri/xml_relax_ng.c +168 -0
  61. data/ext/nokogiri/xml_relax_ng.h +9 -0
  62. data/ext/nokogiri/xml_sax_parser.c +183 -111
  63. data/ext/nokogiri/xml_sax_parser.h +30 -1
  64. data/ext/nokogiri/xml_sax_parser_context.c +199 -0
  65. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  66. data/ext/nokogiri/xml_sax_push_parser.c +42 -12
  67. data/ext/nokogiri/xml_sax_push_parser.h +1 -1
  68. data/ext/nokogiri/xml_schema.c +205 -0
  69. data/ext/nokogiri/xml_schema.h +9 -0
  70. data/ext/nokogiri/xml_syntax_error.c +28 -173
  71. data/ext/nokogiri/xml_syntax_error.h +2 -1
  72. data/ext/nokogiri/xml_text.c +16 -6
  73. data/ext/nokogiri/xml_text.h +1 -1
  74. data/ext/nokogiri/xml_xpath_context.c +104 -47
  75. data/ext/nokogiri/xml_xpath_context.h +1 -1
  76. data/ext/nokogiri/xslt_stylesheet.c +161 -19
  77. data/ext/nokogiri/xslt_stylesheet.h +1 -1
  78. data/lib/nokogiri.rb +47 -8
  79. data/lib/nokogiri/1.8/nokogiri.so +0 -0
  80. data/lib/nokogiri/1.9/nokogiri.so +0 -0
  81. data/lib/nokogiri/css.rb +6 -3
  82. data/lib/nokogiri/css/node.rb +14 -12
  83. data/lib/nokogiri/css/parser.rb +665 -62
  84. data/lib/nokogiri/css/parser.y +20 -10
  85. data/lib/nokogiri/css/parser_extras.rb +91 -0
  86. data/lib/nokogiri/css/tokenizer.rb +148 -5
  87. data/lib/nokogiri/css/tokenizer.rex +10 -9
  88. data/lib/nokogiri/css/xpath_visitor.rb +47 -44
  89. data/lib/nokogiri/decorators/slop.rb +8 -4
  90. data/lib/nokogiri/ffi/encoding_handler.rb +42 -0
  91. data/lib/nokogiri/ffi/html/document.rb +28 -0
  92. data/lib/nokogiri/ffi/html/element_description.rb +81 -0
  93. data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
  94. data/lib/nokogiri/ffi/html/sax/parser_context.rb +38 -0
  95. data/lib/nokogiri/ffi/io_callbacks.rb +42 -0
  96. data/lib/nokogiri/ffi/libxml.rb +420 -0
  97. data/lib/nokogiri/ffi/structs/common_node.rb +38 -0
  98. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
  99. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
  100. data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
  101. data/lib/nokogiri/ffi/structs/xml_attr.rb +20 -0
  102. data/lib/nokogiri/ffi/structs/xml_attribute.rb +27 -0
  103. data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
  104. data/lib/nokogiri/ffi/structs/xml_char_encoding_handler.rb +11 -0
  105. data/lib/nokogiri/ffi/structs/xml_document.rb +117 -0
  106. data/lib/nokogiri/ffi/structs/xml_dtd.rb +28 -0
  107. data/lib/nokogiri/ffi/structs/xml_element.rb +26 -0
  108. data/lib/nokogiri/ffi/structs/xml_element_content.rb +17 -0
  109. data/lib/nokogiri/ffi/structs/xml_entity.rb +32 -0
  110. data/lib/nokogiri/ffi/structs/xml_enumeration.rb +12 -0
  111. data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
  112. data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
  113. data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
  114. data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
  115. data/lib/nokogiri/ffi/structs/xml_parser_context.rb +20 -0
  116. data/lib/nokogiri/ffi/structs/xml_parser_input.rb +19 -0
  117. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
  118. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
  119. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +124 -0
  120. data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
  121. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
  122. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
  123. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +38 -0
  124. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
  125. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
  126. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
  127. data/lib/nokogiri/ffi/weak_bucket.rb +40 -0
  128. data/lib/nokogiri/ffi/xml/attr.rb +41 -0
  129. data/lib/nokogiri/ffi/xml/attribute_decl.rb +27 -0
  130. data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
  131. data/lib/nokogiri/ffi/xml/comment.rb +18 -0
  132. data/lib/nokogiri/ffi/xml/document.rb +174 -0
  133. data/lib/nokogiri/ffi/xml/document_fragment.rb +21 -0
  134. data/lib/nokogiri/ffi/xml/dtd.rb +67 -0
  135. data/lib/nokogiri/ffi/xml/element_content.rb +43 -0
  136. data/lib/nokogiri/ffi/xml/element_decl.rb +19 -0
  137. data/lib/nokogiri/ffi/xml/entity_decl.rb +36 -0
  138. data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
  139. data/lib/nokogiri/ffi/xml/namespace.rb +44 -0
  140. data/lib/nokogiri/ffi/xml/node.rb +559 -0
  141. data/lib/nokogiri/ffi/xml/node_set.rb +150 -0
  142. data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
  143. data/lib/nokogiri/ffi/xml/reader.rb +236 -0
  144. data/lib/nokogiri/ffi/xml/relax_ng.rb +85 -0
  145. data/lib/nokogiri/ffi/xml/sax/parser.rb +143 -0
  146. data/lib/nokogiri/ffi/xml/sax/parser_context.rb +79 -0
  147. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +51 -0
  148. data/lib/nokogiri/ffi/xml/schema.rb +109 -0
  149. data/lib/nokogiri/ffi/xml/syntax_error.rb +98 -0
  150. data/lib/nokogiri/ffi/xml/text.rb +18 -0
  151. data/lib/nokogiri/ffi/xml/xpath.rb +9 -0
  152. data/lib/nokogiri/ffi/xml/xpath_context.rb +153 -0
  153. data/lib/nokogiri/ffi/xslt/stylesheet.rb +77 -0
  154. data/lib/nokogiri/html.rb +13 -47
  155. data/lib/nokogiri/html/builder.rb +27 -1
  156. data/lib/nokogiri/html/document.rb +201 -7
  157. data/lib/nokogiri/html/document_fragment.rb +41 -0
  158. data/lib/nokogiri/html/element_description.rb +23 -0
  159. data/lib/nokogiri/html/entity_lookup.rb +2 -0
  160. data/lib/nokogiri/html/sax/parser.rb +34 -3
  161. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  162. data/lib/nokogiri/nokogiri.rb +1 -0
  163. data/lib/nokogiri/version.rb +40 -1
  164. data/lib/nokogiri/version_warning.rb +14 -0
  165. data/lib/nokogiri/xml.rb +32 -53
  166. data/lib/nokogiri/xml/attr.rb +5 -0
  167. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  168. data/lib/nokogiri/xml/builder.rb +349 -29
  169. data/lib/nokogiri/xml/cdata.rb +3 -1
  170. data/lib/nokogiri/xml/character_data.rb +7 -0
  171. data/lib/nokogiri/xml/document.rb +166 -14
  172. data/lib/nokogiri/xml/document_fragment.rb +76 -1
  173. data/lib/nokogiri/xml/dtd.rb +16 -3
  174. data/lib/nokogiri/xml/element_content.rb +36 -0
  175. data/lib/nokogiri/xml/element_decl.rb +13 -0
  176. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  177. data/lib/nokogiri/xml/namespace.rb +13 -0
  178. data/lib/nokogiri/xml/node.rb +561 -166
  179. data/lib/nokogiri/xml/node/save_options.rb +22 -2
  180. data/lib/nokogiri/xml/node_set.rb +202 -40
  181. data/lib/nokogiri/xml/parse_options.rb +93 -0
  182. data/lib/nokogiri/xml/pp.rb +2 -0
  183. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  184. data/lib/nokogiri/xml/pp/node.rb +56 -0
  185. data/lib/nokogiri/xml/processing_instruction.rb +2 -0
  186. data/lib/nokogiri/xml/reader.rb +93 -8
  187. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  188. data/lib/nokogiri/xml/sax.rb +1 -7
  189. data/lib/nokogiri/xml/sax/document.rb +107 -2
  190. data/lib/nokogiri/xml/sax/parser.rb +57 -7
  191. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  192. data/lib/nokogiri/xml/sax/push_parser.rb +13 -1
  193. data/lib/nokogiri/xml/schema.rb +63 -0
  194. data/lib/nokogiri/xml/syntax_error.rb +25 -1
  195. data/lib/nokogiri/xml/text.rb +4 -1
  196. data/lib/nokogiri/xml/xpath.rb +1 -1
  197. data/lib/nokogiri/xml/xpath/syntax_error.rb +3 -0
  198. data/lib/nokogiri/xml/xpath_context.rb +2 -0
  199. data/lib/nokogiri/xslt.rb +26 -2
  200. data/lib/nokogiri/xslt/stylesheet.rb +19 -0
  201. data/lib/xsd/xmlparser/nokogiri.rb +45 -9
  202. data/tasks/cross_compile.rb +173 -0
  203. data/tasks/test.rb +25 -69
  204. data/test/css/test_nthiness.rb +3 -4
  205. data/test/css/test_parser.rb +75 -20
  206. data/test/css/test_tokenizer.rb +23 -1
  207. data/test/css/test_xpath_visitor.rb +10 -1
  208. data/test/decorators/test_slop.rb +16 -0
  209. data/test/ffi/test_document.rb +35 -0
  210. data/test/files/2ch.html +108 -0
  211. data/test/files/address_book.rlx +12 -0
  212. data/test/files/address_book.xml +10 -0
  213. data/test/files/bar/bar.xsd +4 -0
  214. data/test/files/encoding.html +82 -0
  215. data/test/files/encoding.xhtml +84 -0
  216. data/test/files/foo/foo.xsd +4 -0
  217. data/test/files/po.xml +32 -0
  218. data/test/files/po.xsd +66 -0
  219. data/test/files/shift_jis.html +10 -0
  220. data/test/files/shift_jis.xml +5 -0
  221. data/test/files/snuggles.xml +3 -0
  222. data/test/files/staff.dtd +10 -0
  223. data/test/files/valid_bar.xml +2 -0
  224. data/test/helper.rb +101 -23
  225. data/test/html/sax/test_parser.rb +81 -2
  226. data/test/html/sax/test_parser_context.rb +48 -0
  227. data/test/html/test_builder.rb +39 -8
  228. data/test/html/test_document.rb +186 -23
  229. data/test/html/test_document_encoding.rb +78 -1
  230. data/test/html/test_document_fragment.rb +253 -0
  231. data/test/html/test_element_description.rb +98 -0
  232. data/test/html/test_named_characters.rb +1 -1
  233. data/test/html/test_node.rb +124 -36
  234. data/test/html/test_node_encoding.rb +27 -0
  235. data/test/test_convert_xpath.rb +1 -52
  236. data/test/test_css_cache.rb +2 -13
  237. data/test/test_encoding_handler.rb +46 -0
  238. data/test/test_memory_leak.rb +88 -19
  239. data/test/test_nokogiri.rb +38 -5
  240. data/test/test_reader.rb +188 -6
  241. data/test/test_soap4r_sax.rb +52 -0
  242. data/test/test_xslt_transforms.rb +183 -83
  243. data/test/xml/node/test_save_options.rb +1 -1
  244. data/test/xml/node/test_subclass.rb +44 -0
  245. data/test/xml/sax/test_parser.rb +175 -4
  246. data/test/xml/sax/test_parser_context.rb +113 -0
  247. data/test/xml/sax/test_push_parser.rb +90 -2
  248. data/test/xml/test_attr.rb +35 -1
  249. data/test/xml/test_attribute_decl.rb +82 -0
  250. data/test/xml/test_builder.rb +186 -1
  251. data/test/xml/test_cdata.rb +32 -1
  252. data/test/xml/test_comment.rb +13 -1
  253. data/test/xml/test_document.rb +415 -43
  254. data/test/xml/test_document_encoding.rb +1 -1
  255. data/test/xml/test_document_fragment.rb +173 -5
  256. data/test/xml/test_dtd.rb +61 -6
  257. data/test/xml/test_dtd_encoding.rb +3 -1
  258. data/test/xml/test_element_content.rb +56 -0
  259. data/test/xml/test_element_decl.rb +73 -0
  260. data/test/xml/test_entity_decl.rb +120 -0
  261. data/test/xml/test_entity_reference.rb +5 -1
  262. data/test/xml/test_namespace.rb +68 -0
  263. data/test/xml/test_node.rb +546 -201
  264. data/test/xml/test_node_attributes.rb +34 -0
  265. data/test/xml/test_node_encoding.rb +33 -3
  266. data/test/xml/test_node_reparenting.rb +321 -0
  267. data/test/xml/test_node_set.rb +538 -2
  268. data/test/xml/test_parse_options.rb +52 -0
  269. data/test/xml/test_processing_instruction.rb +6 -1
  270. data/test/xml/test_reader_encoding.rb +1 -1
  271. data/test/xml/test_relax_ng.rb +60 -0
  272. data/test/xml/test_schema.rb +94 -0
  273. data/test/xml/test_syntax_error.rb +12 -0
  274. data/test/xml/test_text.rb +35 -1
  275. data/test/xml/test_unparented_node.rb +5 -5
  276. data/test/xml/test_xpath.rb +142 -11
  277. data/test/xslt/test_custom_functions.rb +94 -0
  278. metadata +328 -92
  279. data/ext/nokogiri/html_sax_parser.c +0 -57
  280. data/ext/nokogiri/html_sax_parser.h +0 -11
  281. data/ext/nokogiri/iconv.dll +0 -0
  282. data/ext/nokogiri/libexslt.dll +0 -0
  283. data/ext/nokogiri/libxml2.dll +0 -0
  284. data/ext/nokogiri/libxslt.dll +0 -0
  285. data/ext/nokogiri/native.so +0 -0
  286. data/ext/nokogiri/xml_xpath.c +0 -53
  287. data/ext/nokogiri/xml_xpath.h +0 -11
  288. data/ext/nokogiri/zlib1.dll +0 -0
  289. data/lib/action-nokogiri.rb +0 -30
  290. data/lib/nokogiri/css/generated_parser.rb +0 -713
  291. data/lib/nokogiri/css/generated_tokenizer.rb +0 -144
  292. data/lib/nokogiri/decorators.rb +0 -2
  293. data/lib/nokogiri/decorators/hpricot.rb +0 -3
  294. data/lib/nokogiri/decorators/hpricot/node.rb +0 -56
  295. data/lib/nokogiri/decorators/hpricot/node_set.rb +0 -54
  296. data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +0 -28
  297. data/lib/nokogiri/hpricot.rb +0 -51
  298. data/lib/nokogiri/xml/comment.rb +0 -6
  299. data/lib/nokogiri/xml/element.rb +0 -6
  300. data/lib/nokogiri/xml/entity_declaration.rb +0 -9
  301. data/lib/nokogiri/xml/fragment_handler.rb +0 -34
  302. data/test/hpricot/files/basic.xhtml +0 -17
  303. data/test/hpricot/files/boingboing.html +0 -2266
  304. data/test/hpricot/files/cy0.html +0 -3653
  305. data/test/hpricot/files/immob.html +0 -400
  306. data/test/hpricot/files/pace_application.html +0 -1320
  307. data/test/hpricot/files/tenderlove.html +0 -16
  308. data/test/hpricot/files/uswebgen.html +0 -220
  309. data/test/hpricot/files/utf8.html +0 -1054
  310. data/test/hpricot/files/week9.html +0 -1723
  311. data/test/hpricot/files/why.xml +0 -19
  312. data/test/hpricot/load_files.rb +0 -11
  313. data/test/hpricot/test_alter.rb +0 -68
  314. data/test/hpricot/test_builder.rb +0 -20
  315. data/test/hpricot/test_parser.rb +0 -426
  316. data/test/hpricot/test_paths.rb +0 -15
  317. data/test/hpricot/test_preserved.rb +0 -77
  318. data/test/hpricot/test_xml.rb +0 -30
  319. data/test/test_gc.rb +0 -15
@@ -0,0 +1,52 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestParseOptions < Nokogiri::TestCase
6
+ def test_new
7
+ options = Nokogiri::XML::ParseOptions.new
8
+ assert_equal 0, options.options
9
+ end
10
+
11
+ def test_to_i
12
+ options = Nokogiri::XML::ParseOptions.new
13
+ assert_equal 0, options.to_i
14
+ end
15
+
16
+ ParseOptions.constants.each do |constant|
17
+ next if constant == 'STRICT'
18
+ class_eval %{
19
+ def test_predicate_#{constant.downcase}
20
+ options = ParseOptions.new(ParseOptions::#{constant})
21
+ assert options.#{constant.downcase}?
22
+
23
+ assert ParseOptions.new.#{constant.downcase}.#{constant.downcase}?
24
+ end
25
+ }
26
+ end
27
+
28
+ def test_strict_noent
29
+ options = ParseOptions.new.recover.noent
30
+ assert !options.strict?
31
+ end
32
+
33
+ def test_new_with_argument
34
+ options = Nokogiri::XML::ParseOptions.new 1 << 1
35
+ assert_equal 1 << 1, options.options
36
+ end
37
+
38
+ def test_chaining
39
+ options = Nokogiri::XML::ParseOptions.new.recover.noent
40
+ assert options.recover?
41
+ assert options.noent?
42
+ end
43
+
44
+ def test_inspect
45
+ options = Nokogiri::XML::ParseOptions.new.recover.noent
46
+ ins = options.inspect
47
+ assert_match(/recover/, ins)
48
+ assert_match(/noent/, ins)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
1
+ require "helper"
2
2
 
3
3
  module Nokogiri
4
4
  module XML
@@ -20,6 +20,11 @@ module Nokogiri
20
20
  assert ref = ProcessingInstruction.new(@xml, 'name', 'content')
21
21
  assert_instance_of ProcessingInstruction, ref
22
22
  end
23
+
24
+ def test_many_new
25
+ 100.times { ProcessingInstruction.new(@xml, 'foo', 'bar') }
26
+ @xml.root << ProcessingInstruction.new(@xml, 'foo', 'bar')
27
+ end
23
28
  end
24
29
  end
25
30
  end
@@ -1,5 +1,5 @@
1
1
  # -*- coding: utf-8 -*-
2
- require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
2
+ require "helper"
3
3
 
4
4
  module Nokogiri
5
5
  module XML
@@ -0,0 +1,60 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestRelaxNG < Nokogiri::TestCase
6
+ def setup
7
+ assert @schema = Nokogiri::XML::RelaxNG(File.read(ADDRESS_SCHEMA_FILE))
8
+ end
9
+
10
+ def test_parse_with_memory
11
+ assert_instance_of Nokogiri::XML::RelaxNG, @schema
12
+ assert_equal 0, @schema.errors.length
13
+ end
14
+
15
+ def test_new
16
+ assert schema = Nokogiri::XML::RelaxNG.new(
17
+ File.read(ADDRESS_SCHEMA_FILE))
18
+ assert_instance_of Nokogiri::XML::RelaxNG, schema
19
+ end
20
+
21
+ def test_parse_with_io
22
+ xsd = nil
23
+ File.open(ADDRESS_SCHEMA_FILE, 'rb') { |f|
24
+ assert xsd = Nokogiri::XML::RelaxNG(f)
25
+ }
26
+ assert_equal 0, xsd.errors.length
27
+ end
28
+
29
+ def test_parse_with_errors
30
+ xml = File.read(ADDRESS_SCHEMA_FILE).sub(/name="/, 'name=')
31
+ assert_raises(Nokogiri::XML::SyntaxError) {
32
+ Nokogiri::XML::RelaxNG(xml)
33
+ }
34
+ end
35
+
36
+ def test_validate_document
37
+ doc = Nokogiri::XML(File.read(ADDRESS_XML_FILE))
38
+ assert errors = @schema.validate(doc)
39
+ assert_equal 0, errors.length
40
+ end
41
+
42
+ def test_validate_invalid_document
43
+ # Empty address book is not allowed
44
+ read_doc = '<addressBook></addressBook>'
45
+
46
+ assert errors = @schema.validate(Nokogiri::XML(read_doc))
47
+ assert_equal 1, errors.length
48
+ end
49
+
50
+ def test_valid?
51
+ valid_doc = Nokogiri::XML(File.read(ADDRESS_XML_FILE))
52
+
53
+ invalid_doc = Nokogiri::XML('<addressBook></addressBook>')
54
+
55
+ assert(@schema.valid?(valid_doc))
56
+ assert(!@schema.valid?(invalid_doc))
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,94 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestSchema < Nokogiri::TestCase
6
+ def setup
7
+ assert @xsd = Nokogiri::XML::Schema(File.read(PO_SCHEMA_FILE))
8
+ end
9
+
10
+ def test_schema_from_document
11
+ doc = Nokogiri::XML(File.open(PO_SCHEMA_FILE))
12
+ assert doc
13
+ xsd = Nokogiri::XML::Schema.from_document doc
14
+ assert_instance_of Nokogiri::XML::Schema, xsd
15
+ end
16
+
17
+ def test_schema_from_document_node
18
+ doc = Nokogiri::XML(File.open(PO_SCHEMA_FILE))
19
+ assert doc
20
+ xsd = Nokogiri::XML::Schema.from_document doc.root
21
+ assert_instance_of Nokogiri::XML::Schema, xsd
22
+ end
23
+
24
+ def test_schema_validates_with_relative_paths
25
+ xsd = File.join(ASSETS_DIR, 'foo', 'foo.xsd')
26
+ xml = File.join(ASSETS_DIR, 'valid_bar.xml')
27
+ doc = Nokogiri::XML(File.open(xsd))
28
+ xsd = Nokogiri::XML::Schema.from_document doc
29
+
30
+ doc = Nokogiri::XML(File.open(xml))
31
+ assert xsd.valid?(doc)
32
+ end
33
+
34
+ def test_parse_with_memory
35
+ assert_instance_of Nokogiri::XML::Schema, @xsd
36
+ assert_equal 0, @xsd.errors.length
37
+ end
38
+
39
+ def test_new
40
+ assert xsd = Nokogiri::XML::Schema.new(File.read(PO_SCHEMA_FILE))
41
+ assert_instance_of Nokogiri::XML::Schema, xsd
42
+ end
43
+
44
+ def test_parse_with_io
45
+ xsd = nil
46
+ File.open(PO_SCHEMA_FILE, 'rb') { |f|
47
+ assert xsd = Nokogiri::XML::Schema(f)
48
+ }
49
+ assert_equal 0, xsd.errors.length
50
+ end
51
+
52
+ def test_parse_with_errors
53
+ xml = File.read(PO_SCHEMA_FILE).sub(/name="/, 'name=')
54
+ assert_raises(Nokogiri::XML::SyntaxError) {
55
+ Nokogiri::XML::Schema(xml)
56
+ }
57
+ end
58
+
59
+ def test_validate_document
60
+ doc = Nokogiri::XML(File.read(PO_XML_FILE))
61
+ assert errors = @xsd.validate(doc)
62
+ assert_equal 0, errors.length
63
+ end
64
+
65
+ def test_validate_file
66
+ assert errors = @xsd.validate(PO_XML_FILE)
67
+ assert_equal 0, errors.length
68
+ end
69
+
70
+ def test_validate_invalid_document
71
+ read_doc = File.read(PO_XML_FILE).gsub(/<city>[^<]*<\/city>/, '')
72
+
73
+ assert errors = @xsd.validate(Nokogiri::XML(read_doc))
74
+ assert_equal 2, errors.length
75
+ end
76
+
77
+ def test_validate_non_document
78
+ string = File.read(PO_XML_FILE)
79
+ assert_raise(ArgumentError) {@xsd.validate(string)}
80
+ end
81
+
82
+ def test_valid?
83
+ valid_doc = Nokogiri::XML(File.read(PO_XML_FILE))
84
+
85
+ invalid_doc = Nokogiri::XML(
86
+ File.read(PO_XML_FILE).gsub(/<city>[^<]*<\/city>/, '')
87
+ )
88
+
89
+ assert(@xsd.valid?(valid_doc))
90
+ assert(!@xsd.valid?(invalid_doc))
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,12 @@
1
+ require "helper"
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class TestSyntaxError < Nokogiri::TestCase
6
+ def test_new
7
+ error = Nokogiri::XML::SyntaxError.new 'hello'
8
+ assert_equal 'hello', error.message
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,12 +1,46 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
1
+ require "helper"
2
2
 
3
3
  module Nokogiri
4
4
  module XML
5
5
  class TestText < Nokogiri::TestCase
6
+ def test_css_path
7
+ doc = Nokogiri.XML "<root> foo <a>something</a> bar bazz </root>"
8
+ node = doc.root.children[2]
9
+ assert_instance_of Nokogiri::XML::Text, node
10
+ assert_equal node, doc.at_css(node.css_path)
11
+ end
12
+
13
+ def test_inspect
14
+ node = Text.new('hello world', Document.new)
15
+ assert_equal "#<#{node.class.name}:#{sprintf("0x%x",node.object_id)} #{node.text.inspect}>", node.inspect
16
+ end
17
+
6
18
  def test_new
7
19
  node = Text.new('hello world', Document.new)
8
20
  assert node
9
21
  assert_equal('hello world', node.content)
22
+ assert_instance_of Nokogiri::XML::Text, node
23
+ end
24
+
25
+ def test_lots_of_text
26
+ 100.times { Text.new('hello world', Document.new) }
27
+ end
28
+
29
+ def test_new_without_document
30
+ doc = Document.new
31
+ node = Nokogiri::XML::Element.new('foo', doc)
32
+
33
+ assert_nothing_raised do
34
+ Text.new('hello world', node)
35
+ end
36
+ end
37
+
38
+ def test_content=
39
+ node = Text.new('foo', Document.new)
40
+ assert_equal('foo', node.content)
41
+ node.content = '& <foo> &amp;'
42
+ assert_equal('& <foo> &amp;', node.content)
43
+ assert_equal('&amp; &lt;foo&gt; &amp;amp;', node.to_xml)
10
44
  end
11
45
  end
12
46
  end
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
1
+ require "helper"
2
2
 
3
3
  require 'stringio'
4
4
 
@@ -47,7 +47,7 @@ module Nokogiri
47
47
  end
48
48
  io.rewind
49
49
  assert called
50
- assert_equal @node.serialize(nil, conf.options), io.read
50
+ assert_equal @node.serialize(:save_with => conf.options), io.read
51
51
  end
52
52
 
53
53
  %w{ xml html xhtml }.each do |type|
@@ -100,8 +100,8 @@ module Nokogiri
100
100
 
101
101
  def test_ancestors
102
102
  assert(address = @node.xpath('.//address').first)
103
- assert_equal 3, address.ancestors.length
104
- assert_equal ['employee', 'staff', nil],
103
+ assert_equal 2, address.ancestors.length
104
+ assert_equal ['employee', 'staff'],
105
105
  address.ancestors.map { |x| x ? x.name : x }
106
106
  end
107
107
 
@@ -129,7 +129,7 @@ module Nokogiri
129
129
  def test_add_child_in_same_document
130
130
  child = @node.css('employee').first
131
131
 
132
- assert previous_last_child = child.children.last
132
+ assert child.children.last
133
133
  assert new_child = child.children.first
134
134
 
135
135
  last = child.children.last
@@ -1,12 +1,39 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
1
+ require "helper"
2
2
 
3
3
  module Nokogiri
4
4
  module XML
5
5
  class TestXPath < Nokogiri::TestCase
6
+
7
+ # ** WHY ALL THOSE _if Nokogiri.uses_libxml?_ **
8
+ # Hi, my dear readers,
9
+ #
10
+ # After reading these tests you may be wondering why all those ugly
11
+ # if Nokogiri.uses_libxml? sparsed over the whole document. Well, let
12
+ # me explain it. While using XPath in Java, you need the extension
13
+ # functions to be in a namespace. This is not required by XPath, afaik,
14
+ # but it is an usual convention though.
15
+ #
16
+ # Furthermore, CSS does not support extension functions but it does in
17
+ # Nokogiri. Result: you cannot use them in JRuby impl. At least, until
18
+ # the CSS to XPath parser is patched, and let me say that there are more
19
+ # important features to add before that happens. I hope you will forgive
20
+ # me.
21
+ #
22
+ # Yours truly,
23
+ #
24
+ # The guy whose headaches belong to Nokogiri JRuby impl.
25
+
26
+
6
27
  def setup
7
28
  super
29
+
8
30
  @xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
9
31
 
32
+ @ns = @xml.root.namespaces
33
+
34
+ # TODO: Maybe I should move this to the original code.
35
+ @ns["nokogiri"] = "http://www.nokogiri.org/default_ns/ruby/extensions_functions"
36
+
10
37
  @handler = Class.new {
11
38
  attr_reader :things
12
39
 
@@ -27,11 +54,40 @@ module Nokogiri
27
54
  def my_filter set, attribute, value
28
55
  set.find_all { |x| x[attribute] == value }
29
56
  end
57
+
58
+ def saves_node_set node_set
59
+ @things = node_set
60
+ end
30
61
  }.new
31
62
  end
32
63
 
64
+ def test_variable_binding
65
+ assert_equal 4, @xml.xpath('//address[@domestic=$value]', nil, :value => 'Yes').length
66
+ end
67
+
68
+ def test_unknown_attribute
69
+ assert_equal 0, @xml.xpath('//employee[@id="asdfasdf"]/@fooo').length
70
+ assert_nil @xml.xpath('//employee[@id="asdfasdf"]/@fooo')[0]
71
+ end
72
+
73
+ def test_boolean
74
+ assert_equal false, @xml.xpath('1 = 2')
75
+ end
76
+
77
+ def test_number
78
+ assert_equal 2, @xml.xpath('1 + 1')
79
+ end
80
+
81
+ def test_string
82
+ assert_equal 'foo', @xml.xpath('concat("fo", "o")')
83
+ end
84
+
33
85
  def test_css_search_uses_custom_selectors_with_arguments
34
- set = @xml.css('employee > address:my_filter("domestic", "Yes")', @handler)
86
+ set = if Nokogiri.uses_libxml?
87
+ @xml.css('employee > address:my_filter("domestic", "Yes")', @handler)
88
+ else
89
+ @xml.xpath("//employee/address[nokogiri:my_filter(., \"domestic\", \"Yes\")]", @ns, @handler)
90
+ end
35
91
  assert set.length > 0
36
92
  set.each do |node|
37
93
  assert_equal 'Yes', node['domestic']
@@ -40,13 +96,23 @@ module Nokogiri
40
96
 
41
97
  def test_css_search_uses_custom_selectors
42
98
  set = @xml.xpath('//employee')
43
- css_set = @xml.css('employee:thing()', @handler)
99
+ assert_nothing_raised do
100
+ if Nokogiri.uses_libxml?
101
+ @xml.css('employee:thing()', @handler)
102
+ else
103
+ @xml.xpath("//employee[nokogiri:thing(.)]", @ns, @handler)
104
+ end
105
+ end
44
106
  assert_equal(set.length, @handler.things.length)
45
107
  assert_equal(set.to_a, @handler.things.flatten)
46
108
  end
47
109
 
48
110
  def test_pass_self_to_function
49
- set = @xml.xpath('//employee/address[my_filter(., "domestic", "Yes")]', @handler)
111
+ set = if Nokogiri.uses_libxml?
112
+ @xml.xpath('//employee/address[my_filter(., "domestic", "Yes")]', @handler)
113
+ else
114
+ @xml.xpath('//employee/address[nokogiri:my_filter(., "domestic", "Yes")]', @ns, @handler)
115
+ end
50
116
  assert set.length > 0
51
117
  set.each do |node|
52
118
  assert_equal 'Yes', node['domestic']
@@ -55,51 +121,116 @@ module Nokogiri
55
121
 
56
122
  def test_custom_xpath_function_gets_strings
57
123
  set = @xml.xpath('//employee')
58
- @xml.xpath('//employee[thing("asdf")]', @handler)
124
+ if Nokogiri.uses_libxml?
125
+ @xml.xpath('//employee[thing("asdf")]', @handler)
126
+ else
127
+ @xml.xpath('//employee[nokogiri:thing("asdf")]', @ns, @handler)
128
+ end
59
129
  assert_equal(set.length, @handler.things.length)
60
130
  assert_equal(['asdf'] * set.length, @handler.things)
61
131
  end
62
132
 
63
133
  def test_custom_xpath_gets_true_booleans
64
134
  set = @xml.xpath('//employee')
65
- @xml.xpath('//employee[thing(true())]', @handler)
135
+ if Nokogiri.uses_libxml?
136
+ @xml.xpath('//employee[thing(true())]', @handler)
137
+ else
138
+ @xml.xpath("//employee[nokogiri:thing(true())]", @ns, @handler)
139
+ end
66
140
  assert_equal(set.length, @handler.things.length)
67
141
  assert_equal([true] * set.length, @handler.things)
68
142
  end
69
143
 
70
144
  def test_custom_xpath_gets_false_booleans
71
145
  set = @xml.xpath('//employee')
72
- @xml.xpath('//employee[thing(false())]', @handler)
146
+ if Nokogiri.uses_libxml?
147
+ @xml.xpath('//employee[thing(false())]', @handler)
148
+ else
149
+ @xml.xpath("//employee[nokogiri:thing(false())]", @ns, @handler)
150
+ end
73
151
  assert_equal(set.length, @handler.things.length)
74
152
  assert_equal([false] * set.length, @handler.things)
75
153
  end
76
154
 
77
155
  def test_custom_xpath_gets_numbers
78
156
  set = @xml.xpath('//employee')
79
- @xml.xpath('//employee[thing(10)]', @handler)
157
+ if Nokogiri.uses_libxml?
158
+ @xml.xpath('//employee[thing(10)]', @handler)
159
+ else
160
+ @xml.xpath('//employee[nokogiri:thing(10)]', @ns, @handler)
161
+ end
80
162
  assert_equal(set.length, @handler.things.length)
81
163
  assert_equal([10] * set.length, @handler.things)
82
164
  end
83
165
 
84
166
  def test_custom_xpath_gets_node_sets
85
167
  set = @xml.xpath('//employee/name')
86
- @xml.xpath('//employee[thing(name)]', @handler)
168
+ if Nokogiri.uses_libxml?
169
+ @xml.xpath('//employee[thing(name)]', @handler)
170
+ else
171
+ @xml.xpath('//employee[nokogiri:thing(name)]', @ns, @handler)
172
+ end
87
173
  assert_equal(set.length, @handler.things.length)
88
174
  assert_equal(set.to_a, @handler.things.flatten)
89
175
  end
90
176
 
91
177
  def test_custom_xpath_gets_node_sets_and_returns_array
92
178
  set = @xml.xpath('//employee/name')
93
- @xml.xpath('//employee[returns_array(name)]', @handler)
179
+ if Nokogiri.uses_libxml?
180
+ @xml.xpath('//employee[returns_array(name)]', @handler)
181
+ else
182
+ @xml.xpath('//employee[nokogiri:returns_array(name)]', @ns, @handler)
183
+ end
94
184
  assert_equal(set.length, @handler.things.length)
95
185
  assert_equal(set.to_a, @handler.things.flatten)
96
186
  end
97
187
 
188
+ def test_custom_xpath_handler_is_passed_a_decorated_node_set
189
+ x = Module.new do
190
+ def awesome! ; end
191
+ end
192
+ util_decorate(@xml, x)
193
+
194
+ assert @xml.xpath('//employee/name')
195
+
196
+ @xml.xpath('//employee[saves_node_set(name)]', @handler)
197
+ assert_equal @xml, @handler.things.document
198
+ assert @handler.things.respond_to?(:awesome!)
199
+ end
200
+
98
201
  def test_code_that_invokes_OP_RESET_inside_libxml2
99
202
  doc = "<html><body id='foo'><foo>hi</foo></body></html>"
100
203
  xpath = 'id("foo")//foo'
101
204
  nokogiri = Nokogiri::HTML.parse(doc)
102
- tree = nokogiri.xpath(xpath)
205
+ assert nokogiri.xpath(xpath)
206
+ end
207
+
208
+ def test_custom_xpath_handler_with_args_under_gc_pressure
209
+ # see http://github.com/tenderlove/nokogiri/issues/#issue/345
210
+ tool_inspector = Class.new do
211
+ def name_equals(nodeset, name, *args)
212
+ nodeset.all? do |node|
213
+ args.each { |thing| thing.inspect }
214
+ node["name"] == name
215
+ end
216
+ end
217
+ end.new
218
+
219
+ xml = <<-EOXML
220
+ <toolbox>
221
+ #{"<tool name='hammer'/><tool name='wrench'/>" * 10}
222
+ </toolbox>
223
+ EOXML
224
+ doc = Nokogiri::XML xml
225
+
226
+ # long list of long arguments, to apply GC pressure during
227
+ # ruby_funcall argument marshalling
228
+ xpath = ["//tool[name_equals(.,'hammer'"]
229
+ 1000.times { xpath << "'unused argument #{'x' * 1000}'" }
230
+ xpath << "'unused argument')]"
231
+ xpath = xpath.join(',')
232
+
233
+ assert_equal doc.xpath("//tool[@name='hammer']"), doc.xpath(xpath, tool_inspector)
103
234
  end
104
235
  end
105
236
  end