nokogiri 1.3.0-x86-mswin32

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 (256) hide show
  1. data/.autotest +27 -0
  2. data/CHANGELOG.ja.rdoc +233 -0
  3. data/CHANGELOG.rdoc +222 -0
  4. data/Manifest.txt +247 -0
  5. data/README.ja.rdoc +103 -0
  6. data/README.rdoc +117 -0
  7. data/Rakefile +205 -0
  8. data/bin/nokogiri +47 -0
  9. data/ext/nokogiri/extconf.rb +89 -0
  10. data/ext/nokogiri/html_document.c +183 -0
  11. data/ext/nokogiri/html_document.h +10 -0
  12. data/ext/nokogiri/html_element_description.c +272 -0
  13. data/ext/nokogiri/html_element_description.h +10 -0
  14. data/ext/nokogiri/html_entity_lookup.c +30 -0
  15. data/ext/nokogiri/html_entity_lookup.h +8 -0
  16. data/ext/nokogiri/html_sax_parser.c +57 -0
  17. data/ext/nokogiri/html_sax_parser.h +11 -0
  18. data/ext/nokogiri/iconv.dll +0 -0
  19. data/ext/nokogiri/libexslt.dll +0 -0
  20. data/ext/nokogiri/libxml2.dll +0 -0
  21. data/ext/nokogiri/libxslt.dll +0 -0
  22. data/ext/nokogiri/nokogiri.c +81 -0
  23. data/ext/nokogiri/nokogiri.h +149 -0
  24. data/ext/nokogiri/xml_attr.c +92 -0
  25. data/ext/nokogiri/xml_attr.h +9 -0
  26. data/ext/nokogiri/xml_cdata.c +53 -0
  27. data/ext/nokogiri/xml_cdata.h +9 -0
  28. data/ext/nokogiri/xml_comment.c +51 -0
  29. data/ext/nokogiri/xml_comment.h +9 -0
  30. data/ext/nokogiri/xml_document.c +308 -0
  31. data/ext/nokogiri/xml_document.h +21 -0
  32. data/ext/nokogiri/xml_document_fragment.c +48 -0
  33. data/ext/nokogiri/xml_document_fragment.h +10 -0
  34. data/ext/nokogiri/xml_dtd.c +102 -0
  35. data/ext/nokogiri/xml_dtd.h +8 -0
  36. data/ext/nokogiri/xml_entity_reference.c +50 -0
  37. data/ext/nokogiri/xml_entity_reference.h +9 -0
  38. data/ext/nokogiri/xml_io.c +24 -0
  39. data/ext/nokogiri/xml_io.h +10 -0
  40. data/ext/nokogiri/xml_namespace.c +69 -0
  41. data/ext/nokogiri/xml_namespace.h +12 -0
  42. data/ext/nokogiri/xml_node.c +928 -0
  43. data/ext/nokogiri/xml_node.h +14 -0
  44. data/ext/nokogiri/xml_node_set.c +386 -0
  45. data/ext/nokogiri/xml_node_set.h +9 -0
  46. data/ext/nokogiri/xml_processing_instruction.c +54 -0
  47. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  48. data/ext/nokogiri/xml_reader.c +572 -0
  49. data/ext/nokogiri/xml_reader.h +10 -0
  50. data/ext/nokogiri/xml_relax_ng.c +106 -0
  51. data/ext/nokogiri/xml_relax_ng.h +9 -0
  52. data/ext/nokogiri/xml_sax_parser.c +336 -0
  53. data/ext/nokogiri/xml_sax_parser.h +10 -0
  54. data/ext/nokogiri/xml_sax_push_parser.c +86 -0
  55. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  56. data/ext/nokogiri/xml_schema.c +107 -0
  57. data/ext/nokogiri/xml_schema.h +9 -0
  58. data/ext/nokogiri/xml_syntax_error.c +203 -0
  59. data/ext/nokogiri/xml_syntax_error.h +12 -0
  60. data/ext/nokogiri/xml_text.c +47 -0
  61. data/ext/nokogiri/xml_text.h +9 -0
  62. data/ext/nokogiri/xml_xpath.c +53 -0
  63. data/ext/nokogiri/xml_xpath.h +11 -0
  64. data/ext/nokogiri/xml_xpath_context.c +252 -0
  65. data/ext/nokogiri/xml_xpath_context.h +9 -0
  66. data/ext/nokogiri/xslt_stylesheet.c +131 -0
  67. data/ext/nokogiri/xslt_stylesheet.h +9 -0
  68. data/ext/nokogiri/zlib1.dll +0 -0
  69. data/lib/action-nokogiri.rb +36 -0
  70. data/lib/nokogiri.rb +110 -0
  71. data/lib/nokogiri/1.8/nokogiri.so +0 -0
  72. data/lib/nokogiri/1.9/nokogiri.so +0 -0
  73. data/lib/nokogiri/css.rb +25 -0
  74. data/lib/nokogiri/css/generated_parser.rb +748 -0
  75. data/lib/nokogiri/css/generated_tokenizer.rb +144 -0
  76. data/lib/nokogiri/css/node.rb +107 -0
  77. data/lib/nokogiri/css/parser.rb +82 -0
  78. data/lib/nokogiri/css/parser.y +227 -0
  79. data/lib/nokogiri/css/syntax_error.rb +7 -0
  80. data/lib/nokogiri/css/tokenizer.rb +11 -0
  81. data/lib/nokogiri/css/tokenizer.rex +54 -0
  82. data/lib/nokogiri/css/xpath_visitor.rb +172 -0
  83. data/lib/nokogiri/decorators.rb +2 -0
  84. data/lib/nokogiri/decorators/hpricot.rb +3 -0
  85. data/lib/nokogiri/decorators/hpricot/node.rb +56 -0
  86. data/lib/nokogiri/decorators/hpricot/node_set.rb +54 -0
  87. data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +30 -0
  88. data/lib/nokogiri/decorators/slop.rb +33 -0
  89. data/lib/nokogiri/ffi/html/document.rb +37 -0
  90. data/lib/nokogiri/ffi/html/element_description.rb +85 -0
  91. data/lib/nokogiri/ffi/html/entity_lookup.rb +16 -0
  92. data/lib/nokogiri/ffi/html/sax/parser.rb +21 -0
  93. data/lib/nokogiri/ffi/io_callbacks.rb +32 -0
  94. data/lib/nokogiri/ffi/libxml.rb +314 -0
  95. data/lib/nokogiri/ffi/structs/common_node.rb +26 -0
  96. data/lib/nokogiri/ffi/structs/html_elem_desc.rb +24 -0
  97. data/lib/nokogiri/ffi/structs/html_entity_desc.rb +13 -0
  98. data/lib/nokogiri/ffi/structs/xml_alloc.rb +16 -0
  99. data/lib/nokogiri/ffi/structs/xml_attr.rb +19 -0
  100. data/lib/nokogiri/ffi/structs/xml_buffer.rb +16 -0
  101. data/lib/nokogiri/ffi/structs/xml_document.rb +108 -0
  102. data/lib/nokogiri/ffi/structs/xml_dtd.rb +26 -0
  103. data/lib/nokogiri/ffi/structs/xml_node.rb +28 -0
  104. data/lib/nokogiri/ffi/structs/xml_node_set.rb +53 -0
  105. data/lib/nokogiri/ffi/structs/xml_notation.rb +11 -0
  106. data/lib/nokogiri/ffi/structs/xml_ns.rb +15 -0
  107. data/lib/nokogiri/ffi/structs/xml_relax_ng.rb +14 -0
  108. data/lib/nokogiri/ffi/structs/xml_sax_handler.rb +51 -0
  109. data/lib/nokogiri/ffi/structs/xml_sax_push_parser_context.rb +14 -0
  110. data/lib/nokogiri/ffi/structs/xml_schema.rb +13 -0
  111. data/lib/nokogiri/ffi/structs/xml_syntax_error.rb +31 -0
  112. data/lib/nokogiri/ffi/structs/xml_text_reader.rb +12 -0
  113. data/lib/nokogiri/ffi/structs/xml_xpath_context.rb +37 -0
  114. data/lib/nokogiri/ffi/structs/xml_xpath_object.rb +35 -0
  115. data/lib/nokogiri/ffi/structs/xml_xpath_parser_context.rb +20 -0
  116. data/lib/nokogiri/ffi/structs/xslt_stylesheet.rb +13 -0
  117. data/lib/nokogiri/ffi/xml/attr.rb +41 -0
  118. data/lib/nokogiri/ffi/xml/cdata.rb +19 -0
  119. data/lib/nokogiri/ffi/xml/comment.rb +18 -0
  120. data/lib/nokogiri/ffi/xml/document.rb +107 -0
  121. data/lib/nokogiri/ffi/xml/document_fragment.rb +26 -0
  122. data/lib/nokogiri/ffi/xml/dtd.rb +42 -0
  123. data/lib/nokogiri/ffi/xml/entity_reference.rb +19 -0
  124. data/lib/nokogiri/ffi/xml/namespace.rb +38 -0
  125. data/lib/nokogiri/ffi/xml/node.rb +380 -0
  126. data/lib/nokogiri/ffi/xml/node_set.rb +130 -0
  127. data/lib/nokogiri/ffi/xml/processing_instruction.rb +20 -0
  128. data/lib/nokogiri/ffi/xml/reader.rb +217 -0
  129. data/lib/nokogiri/ffi/xml/relax_ng.rb +51 -0
  130. data/lib/nokogiri/ffi/xml/sax/parser.rb +148 -0
  131. data/lib/nokogiri/ffi/xml/sax/push_parser.rb +38 -0
  132. data/lib/nokogiri/ffi/xml/schema.rb +55 -0
  133. data/lib/nokogiri/ffi/xml/syntax_error.rb +76 -0
  134. data/lib/nokogiri/ffi/xml/text.rb +18 -0
  135. data/lib/nokogiri/ffi/xml/xpath.rb +19 -0
  136. data/lib/nokogiri/ffi/xml/xpath_context.rb +135 -0
  137. data/lib/nokogiri/ffi/xslt/stylesheet.rb +47 -0
  138. data/lib/nokogiri/hpricot.rb +62 -0
  139. data/lib/nokogiri/html.rb +34 -0
  140. data/lib/nokogiri/html/builder.rb +35 -0
  141. data/lib/nokogiri/html/document.rb +71 -0
  142. data/lib/nokogiri/html/document_fragment.rb +15 -0
  143. data/lib/nokogiri/html/element_description.rb +23 -0
  144. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  145. data/lib/nokogiri/html/sax/parser.rb +47 -0
  146. data/lib/nokogiri/nokogiri.rb +1 -0
  147. data/lib/nokogiri/syntax_error.rb +4 -0
  148. data/lib/nokogiri/version.rb +29 -0
  149. data/lib/nokogiri/version_warning.rb +11 -0
  150. data/lib/nokogiri/xml.rb +62 -0
  151. data/lib/nokogiri/xml/attr.rb +9 -0
  152. data/lib/nokogiri/xml/builder.rb +254 -0
  153. data/lib/nokogiri/xml/cdata.rb +11 -0
  154. data/lib/nokogiri/xml/document.rb +100 -0
  155. data/lib/nokogiri/xml/document_fragment.rb +49 -0
  156. data/lib/nokogiri/xml/dtd.rb +11 -0
  157. data/lib/nokogiri/xml/entity_declaration.rb +11 -0
  158. data/lib/nokogiri/xml/fragment_handler.rb +55 -0
  159. data/lib/nokogiri/xml/namespace.rb +7 -0
  160. data/lib/nokogiri/xml/node.rb +745 -0
  161. data/lib/nokogiri/xml/node/save_options.rb +42 -0
  162. data/lib/nokogiri/xml/node_set.rb +238 -0
  163. data/lib/nokogiri/xml/notation.rb +6 -0
  164. data/lib/nokogiri/xml/parse_options.rb +80 -0
  165. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  166. data/lib/nokogiri/xml/reader.rb +66 -0
  167. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  168. data/lib/nokogiri/xml/sax.rb +3 -0
  169. data/lib/nokogiri/xml/sax/document.rb +143 -0
  170. data/lib/nokogiri/xml/sax/parser.rb +101 -0
  171. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  172. data/lib/nokogiri/xml/schema.rb +65 -0
  173. data/lib/nokogiri/xml/syntax_error.rb +34 -0
  174. data/lib/nokogiri/xml/xpath.rb +10 -0
  175. data/lib/nokogiri/xml/xpath/syntax_error.rb +8 -0
  176. data/lib/nokogiri/xml/xpath_context.rb +16 -0
  177. data/lib/nokogiri/xslt.rb +48 -0
  178. data/lib/nokogiri/xslt/stylesheet.rb +25 -0
  179. data/lib/xsd/xmlparser/nokogiri.rb +64 -0
  180. data/tasks/test.rb +161 -0
  181. data/test/css/test_nthiness.rb +160 -0
  182. data/test/css/test_parser.rb +277 -0
  183. data/test/css/test_tokenizer.rb +176 -0
  184. data/test/css/test_xpath_visitor.rb +76 -0
  185. data/test/ffi/test_document.rb +35 -0
  186. data/test/files/address_book.rlx +12 -0
  187. data/test/files/address_book.xml +10 -0
  188. data/test/files/dont_hurt_em_why.xml +422 -0
  189. data/test/files/exslt.xml +8 -0
  190. data/test/files/exslt.xslt +35 -0
  191. data/test/files/po.xml +32 -0
  192. data/test/files/po.xsd +66 -0
  193. data/test/files/staff.xml +59 -0
  194. data/test/files/staff.xslt +32 -0
  195. data/test/files/tlm.html +850 -0
  196. data/test/helper.rb +123 -0
  197. data/test/hpricot/files/basic.xhtml +17 -0
  198. data/test/hpricot/files/boingboing.html +2266 -0
  199. data/test/hpricot/files/cy0.html +3653 -0
  200. data/test/hpricot/files/immob.html +400 -0
  201. data/test/hpricot/files/pace_application.html +1320 -0
  202. data/test/hpricot/files/tenderlove.html +16 -0
  203. data/test/hpricot/files/uswebgen.html +220 -0
  204. data/test/hpricot/files/utf8.html +1054 -0
  205. data/test/hpricot/files/week9.html +1723 -0
  206. data/test/hpricot/files/why.xml +19 -0
  207. data/test/hpricot/load_files.rb +11 -0
  208. data/test/hpricot/test_alter.rb +68 -0
  209. data/test/hpricot/test_builder.rb +20 -0
  210. data/test/hpricot/test_parser.rb +426 -0
  211. data/test/hpricot/test_paths.rb +15 -0
  212. data/test/hpricot/test_preserved.rb +77 -0
  213. data/test/hpricot/test_xml.rb +30 -0
  214. data/test/html/sax/test_parser.rb +52 -0
  215. data/test/html/test_builder.rb +156 -0
  216. data/test/html/test_document.rb +361 -0
  217. data/test/html/test_document_encoding.rb +46 -0
  218. data/test/html/test_document_fragment.rb +97 -0
  219. data/test/html/test_element_description.rb +95 -0
  220. data/test/html/test_named_characters.rb +14 -0
  221. data/test/html/test_node.rb +165 -0
  222. data/test/test_convert_xpath.rb +186 -0
  223. data/test/test_css_cache.rb +56 -0
  224. data/test/test_gc.rb +15 -0
  225. data/test/test_memory_leak.rb +77 -0
  226. data/test/test_nokogiri.rb +127 -0
  227. data/test/test_reader.rb +316 -0
  228. data/test/test_xslt_transforms.rb +131 -0
  229. data/test/xml/node/test_save_options.rb +20 -0
  230. data/test/xml/node/test_subclass.rb +44 -0
  231. data/test/xml/sax/test_parser.rb +169 -0
  232. data/test/xml/sax/test_push_parser.rb +92 -0
  233. data/test/xml/test_attr.rb +38 -0
  234. data/test/xml/test_builder.rb +73 -0
  235. data/test/xml/test_cdata.rb +38 -0
  236. data/test/xml/test_comment.rb +23 -0
  237. data/test/xml/test_document.rb +397 -0
  238. data/test/xml/test_document_encoding.rb +26 -0
  239. data/test/xml/test_document_fragment.rb +76 -0
  240. data/test/xml/test_dtd.rb +42 -0
  241. data/test/xml/test_dtd_encoding.rb +31 -0
  242. data/test/xml/test_entity_reference.rb +21 -0
  243. data/test/xml/test_namespace.rb +43 -0
  244. data/test/xml/test_node.rb +808 -0
  245. data/test/xml/test_node_attributes.rb +34 -0
  246. data/test/xml/test_node_encoding.rb +84 -0
  247. data/test/xml/test_node_set.rb +368 -0
  248. data/test/xml/test_parse_options.rb +52 -0
  249. data/test/xml/test_processing_instruction.rb +30 -0
  250. data/test/xml/test_reader_encoding.rb +126 -0
  251. data/test/xml/test_relax_ng.rb +60 -0
  252. data/test/xml/test_schema.rb +65 -0
  253. data/test/xml/test_text.rb +18 -0
  254. data/test/xml/test_unparented_node.rb +381 -0
  255. data/test/xml/test_xpath.rb +106 -0
  256. metadata +409 -0
@@ -0,0 +1,10 @@
1
+ require 'nokogiri/xml/xpath/syntax_error'
2
+
3
+ module Nokogiri
4
+ module XML
5
+ class XPath
6
+ # The Nokogiri::XML::Document tied to this XPath instance
7
+ attr_accessor :document
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,8 @@
1
+ module Nokogiri
2
+ module XML
3
+ class XPath
4
+ class SyntaxError < XML::SyntaxError
5
+ end
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,16 @@
1
+ module Nokogiri
2
+ module XML
3
+ class XPathContext
4
+
5
+ ###
6
+ # Register namespaces in +namespaces+
7
+ def register_namespaces(namespaces)
8
+ namespaces.each do |k, v|
9
+ k = k.gsub(/.*:/,'') # strip off 'xmlns:' or 'xml:'
10
+ register_ns(k, v)
11
+ end
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,48 @@
1
+ require 'nokogiri/xslt/stylesheet'
2
+
3
+ module Nokogiri
4
+ class << self
5
+ ###
6
+ # Create a Nokogiri::XSLT::Stylesheet with +stylesheet+.
7
+ #
8
+ # Example:
9
+ #
10
+ # xslt = Nokogiri::XSLT(File.read(ARGV[0]))
11
+ #
12
+ def XSLT stylesheet
13
+ XSLT.parse(stylesheet)
14
+ end
15
+ end
16
+
17
+ ###
18
+ # See Nokogiri::XSLT::Stylesheet for creating and maniuplating
19
+ # Stylesheet object.
20
+ module XSLT
21
+ class << self
22
+ ###
23
+ # Parse the stylesheet in +string+
24
+ def parse string
25
+ Stylesheet.parse_stylesheet_doc(XML.parse(string))
26
+ end
27
+
28
+ ###
29
+ # Quote parameters in +params+ for stylesheet safety
30
+ def quote_params params
31
+ parray = (params.instance_of?(Hash) ? params.to_a.flatten : params).dup
32
+ parray.each_with_index do |v,i|
33
+ if i % 2 > 0
34
+ parray[i]=
35
+ if v =~ /'/
36
+ "concat('#{ v.gsub(/'/, %q{', "'", '}) }')"
37
+ else
38
+ "'#{v}'";
39
+ end
40
+ else
41
+ parray[i] = v.to_s
42
+ end
43
+ end
44
+ parray.flatten
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,25 @@
1
+ module Nokogiri
2
+ module XSLT
3
+ ###
4
+ # A Stylesheet represents an XSLT Stylesheet object. Stylesheet creation
5
+ # is done through Nokogiri.XSLT. Here is an example of transforming
6
+ # an XML::Document with a Stylesheet:
7
+ #
8
+ # doc = Nokogiri::XML(File.read('some_file.xml'))
9
+ # xslt = Nokogir::XSLT(File.read('some_transformer.xslt'))
10
+ #
11
+ # puts xslt.transform(doc)
12
+ #
13
+ # See Nokogiri::XSLT::Stylesheet#transform for more transformation
14
+ # information.
15
+ class Stylesheet
16
+ ###
17
+ # Apply an XSLT stylesheet to an XML::Document.
18
+ # +params+ is an array of strings used as XSLT parameters.
19
+ # returns serialized document
20
+ def apply_to document, params = []
21
+ serialize(transform(document, params))
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,64 @@
1
+ require 'nokogiri'
2
+
3
+ module XSD # :nodoc:
4
+ module XMLParser # :nodoc:
5
+ ###
6
+ # Nokogiri XML parser for soap4r.
7
+ #
8
+ # Nokogiri may be used as the XML parser in soap4r. Simply require
9
+ # 'xsd/xmlparser/nokogiri' in your soap4r applications, and soap4r
10
+ # will use Nokogiri as it's XML parser. No other changes should be
11
+ # required to use Nokogiri as the XML parser.
12
+ #
13
+ # Example (using UW ITS Web Services):
14
+ #
15
+ # require 'rubygems'
16
+ # gem 'soap4r'
17
+ # require 'nokogiri'
18
+ # require 'xsd/xmlparser/nokogiri'
19
+ # require 'defaultDriver'
20
+ #
21
+ # obj = AvlPortType.new
22
+ # obj.getLatestByRoute(obj.getAgencies, 8).each do |event|
23
+ # ...
24
+ # end
25
+ class Nokogiri < XSD::XMLParser::Parser
26
+ ###
27
+ # Create a new XSD parser with +host+ and +opt+
28
+ def initialize host, opt = {}
29
+ super
30
+ @parser = ::Nokogiri::XML::SAX::Parser.new(self, @charset || 'UTF-8')
31
+ end
32
+
33
+ ###
34
+ # Start parsing +string_or_readable+
35
+ def do_parse string_or_readable
36
+ @parser.parse(string_or_readable)
37
+ end
38
+
39
+ ###
40
+ # Handle the start_element event with +name+ and +attrs+
41
+ def start_element name, attrs = []
42
+ super(name, Hash[*attrs])
43
+ end
44
+
45
+ ###
46
+ # Handle errors with message +msg+
47
+ def error msg
48
+ raise ParseError.new(msg)
49
+ end
50
+ alias :warning :error
51
+
52
+ ###
53
+ # Handle cdata_blocks containing +string+
54
+ def cdata_block string
55
+ characters string
56
+ end
57
+
58
+ %w{ start_document end_document comment }.each do |name|
59
+ class_eval %{ def #{name}(*args); end }
60
+ end
61
+ add_factory(self)
62
+ end
63
+ end
64
+ end
data/tasks/test.rb ADDED
@@ -0,0 +1,161 @@
1
+ # partial-loads-ok and undef-value-errors necessary to ignore
2
+ # spurious (and eminently ignorable) warnings from the ruby
3
+ # interpreter
4
+ VALGRIND_BASIC_OPTS = "--num-callers=50 --error-limit=no --partial-loads-ok=yes --undef-value-errors=no"
5
+
6
+ class NokogiriTestTask < Rake::TestTask
7
+ def initialize *args
8
+ super
9
+ %w[ ext lib bin test ].each do |dir|
10
+ self.libs << dir
11
+ end
12
+ self.test_files = FileList['test/**/test_*.rb'] +
13
+ FileList['test/**/*_test.rb']
14
+ self.verbose = "verbose"
15
+ self.warning = true
16
+ end
17
+ end
18
+
19
+ desc "run test suite under valgrind with basic ruby options"
20
+ NokogiriTestTask.new('test:valgrind').extend(Module.new {
21
+ def ruby *args
22
+ run_with_env "valgrind #{VALGRIND_BASIC_OPTS} #{RUBY} #{args.join(' ')} test/test_nokogiri.rb --verbose=verbose"
23
+ end
24
+ })
25
+
26
+ desc "run test suite under valgrind with memory-fill ruby options"
27
+ NokogiriTestTask.new('test:valgrind_mem').extend(Module.new {
28
+ def ruby *args
29
+ run_with_env "valgrind #{VALGRIND_BASIC_OPTS} --freelist-vol=100000000 --malloc-fill=6D --free-fill=66 #{RUBY} #{args.join(' ')} test/test_nokogiri.rb --verbose=verbose"
30
+ end
31
+ })
32
+
33
+ desc "run test suite under valgrind with memory-zero ruby options"
34
+ NokogiriTestTask.new('test:valgrind_mem0').extend(Module.new {
35
+ def ruby *args
36
+ run_with_env "valgrind #{VALGRIND_BASIC_OPTS} --freelist-vol=100000000 --malloc-fill=00 --free-fill=00 #{RUBY} #{args.join(' ')} test/test_nokogiri.rb --verbose=verbose"
37
+ end
38
+ })
39
+
40
+ desc "run test suite under gdb"
41
+ NokogiriTestTask.new('test:gdb').extend(Module.new {
42
+ def ruby *args
43
+ run_with_env "gdb --args #{RUBY} #{args.join(' ')}"
44
+ end
45
+ })
46
+
47
+ desc "test coverage"
48
+ NokogiriTestTask.new('test:coverage').extend(Module.new {
49
+ def ruby *args
50
+ rm_rf "coverage"
51
+ run_with_env "rcov -x Library -I lib:ext:test #{args.join(' ')}"
52
+ end
53
+ })
54
+
55
+ desc "run test suite with verbose output"
56
+ NokogiriTestTask.new('test:verbose').extend(Module.new {
57
+ def ruby *args
58
+ run_with_env "#{RUBY} #{args.join(' ')} test/test_nokogiri.rb --verbose=verbose"
59
+ end
60
+ })
61
+
62
+ def run_with_env(cmd)
63
+ cmd = "LD_LIBRARY_PATH='#{ENV['LD_LIBRARY_PATH']}' #{cmd}"
64
+ puts "=> #{cmd}"
65
+ system cmd
66
+ end
67
+
68
+ namespace :test do
69
+ desc "run test suite with aggressive GC"
70
+ task :gc => :build do
71
+ ENV['NOKOGIRI_GC'] = "true"
72
+ Rake::Task["test"].invoke
73
+ end
74
+
75
+ desc "find call-seq in the rdoc"
76
+ task :rdoc_call_seq => 'docs' do
77
+ Dir['doc/**/*.html'].each { |docfile|
78
+ next if docfile =~ /\.src/
79
+ puts "FAIL: #{docfile}" if File.read(docfile) =~ /call-seq/
80
+ }
81
+ end
82
+
83
+ desc "find all undocumented things"
84
+ task :rdoc => 'docs' do
85
+ base = File.expand_path(File.join(File.dirname(__FILE__), '..', 'doc'))
86
+ require 'test/unit'
87
+ test = Class.new(Test::Unit::TestCase)
88
+ Dir["#{base}/**/*.html"].each { |docfile|
89
+ test.class_eval(<<-eotest)
90
+ def test_#{docfile.sub("#{base}/", '').gsub(/[\/\.-]/, '_')}
91
+ assert_no_match(
92
+ /Not documented/,
93
+ File.read('#{docfile}'),
94
+ '#{docfile} has undocumented things'
95
+ )
96
+ end
97
+ eotest
98
+ }
99
+ end
100
+
101
+ desc "Test against multiple versions of libxml2 (MULTIXML2_DIR=directory)"
102
+ task :multixml2 do
103
+ MULTI_XML = File.join(ENV['HOME'], '.multixml2')
104
+ unless File.exists?(MULTI_XML)
105
+ %w{ versions install build }.each { |x|
106
+ FileUtils.mkdir_p(File.join(MULTI_XML, x))
107
+ }
108
+ Dir.chdir File.join(MULTI_XML, 'versions') do
109
+ require 'net/ftp'
110
+ ftp = Net::FTP.new('xmlsoft.org')
111
+ ftp.login('anonymous', 'anonymous')
112
+ ftp.chdir('libxml2')
113
+ ftp.list('libxml2-2.*.tar.gz').each do |x|
114
+ file = x[/[^\s]*$/]
115
+ puts "Downloading #{file}"
116
+ ftp.getbinaryfile(file)
117
+ end
118
+ end
119
+ end
120
+
121
+ # Build any libxml2 versions in $HOME/.multixml2/versions that
122
+ # haven't been built yet
123
+ Dir[File.join(MULTI_XML, 'versions','*.tar.gz')].each do |f|
124
+ filename = File.basename(f, '.tar.gz')
125
+
126
+ install_dir = File.join(MULTI_XML, 'install', filename)
127
+ next if File.exists?(install_dir)
128
+
129
+ Dir.chdir File.join(MULTI_XML, 'versions') do
130
+ system "tar zxvf #{f} -C #{File.join(MULTI_XML, 'build')}"
131
+ end
132
+
133
+ Dir.chdir File.join(MULTI_XML, 'build', filename) do
134
+ system "./configure --prefix=#{install_dir}"
135
+ system "make && make install"
136
+ end
137
+ end
138
+
139
+ test_results = {}
140
+ libxslt = Dir[File.join(MULTI_XML, 'install', 'libxslt*')].first
141
+
142
+ directories = ENV['MULTIXML2_DIR'] ? [ENV['MULTIXML2_DIR']] : Dir[File.join(MULTI_XML, 'install', '*')]
143
+ directories.sort.reverse.each do |xml2_version|
144
+ next unless xml2_version =~ /libxml2/
145
+ extopts = "--with-xml2-include=#{xml2_version}/include/libxml2 --with-xml2-lib=#{xml2_version}/lib --with-xslt-dir=#{libxslt}"
146
+ cmd = "#{$0} clean test EXTOPTS='#{extopts}' LD_LIBRARY_PATH='#{xml2_version}/lib'"
147
+
148
+ version = File.basename(xml2_version)
149
+ result = system(cmd)
150
+ test_results[version] = {
151
+ :result => result,
152
+ :cmd => cmd
153
+ }
154
+ end
155
+ test_results.sort_by { |k,v| k }.each do |k,v|
156
+ passed = v[:result]
157
+ puts "#{k}: #{passed ? 'PASS' : 'FAIL'}"
158
+ puts "repro: #{v[:cmd]}" unless passed
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,160 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', "helper"))
2
+
3
+ module Nokogiri
4
+ module CSS
5
+ class TestNthiness < Nokogiri::TestCase
6
+ def setup
7
+ super
8
+ doc = <<EOF
9
+ <html>
10
+ <table>
11
+ <tr><td>row1 </td></tr>
12
+ <tr><td>row2 </td></tr>
13
+ <tr><td>row3 </td></tr>
14
+ <tr><td>row4 </td></tr>
15
+ <tr><td>row5 </td></tr>
16
+ <tr><td>row6 </td></tr>
17
+ <tr><td>row7 </td></tr>
18
+ <tr><td>row8 </td></tr>
19
+ <tr><td>row9 </td></tr>
20
+ <tr><td>row10 </td></tr>
21
+ <tr><td>row11 </td></tr>
22
+ <tr><td>row12 </td></tr>
23
+ <tr><td>row13 </td></tr>
24
+ <tr><td>row14 </td></tr>
25
+ </table>
26
+ <div>
27
+ <b>bold1 </b>
28
+ <i>italic1 </i>
29
+ <b>bold2 </b>
30
+ <i>italic2 </i>
31
+ <p>para1 </p>
32
+ <b>bold3 </b>
33
+ </div>
34
+ <div>
35
+ <p>para2 </p>
36
+ <p>para3 </p>
37
+ </div>
38
+ <div>
39
+ <p>para4 </p>
40
+ </div>
41
+ <p class='empty'></p>
42
+ <p class='not-empty'><b></b></p>
43
+ </html>
44
+ EOF
45
+ @parser = Nokogiri.Hpricot doc
46
+ end
47
+
48
+
49
+ def test_even
50
+ assert_result_rows [2,4,6,8,10,12,14], @parser.search("table/tr:nth(even)")
51
+ end
52
+
53
+ def test_odd
54
+ assert_result_rows [1,3,5,7,9,11,13], @parser.search("table/tr:nth(odd)")
55
+ end
56
+
57
+ def test_2n
58
+ assert_equal @parser.search("table/tr:nth(even)").inner_text, @parser.search("table/tr:nth(2n)").inner_text
59
+ end
60
+
61
+ def test_2np1
62
+ assert_equal @parser.search("table/tr:nth(odd)").inner_text, @parser.search("table/tr:nth(2n+1)").inner_text
63
+ end
64
+
65
+ def test_4np3
66
+ assert_result_rows [3,7,11], @parser.search("table/tr:nth(4n+3)")
67
+ end
68
+
69
+ def test_3np4
70
+ assert_result_rows [4,7,10,13], @parser.search("table/tr:nth(3n+4)")
71
+ end
72
+
73
+ def test_mnp3
74
+ assert_result_rows [1,2,3], @parser.search("table/tr:nth(-n+3)")
75
+ end
76
+
77
+ def test_np3
78
+ assert_result_rows [3,4,5,6,7,8,9,10,11,12,13,14], @parser.search("table/tr:nth(n+3)")
79
+ end
80
+
81
+ def test_first
82
+ assert_result_rows [1], @parser.search("table/tr:first")
83
+ assert_result_rows [1], @parser.search("table/tr:first()")
84
+ end
85
+
86
+ def test_last
87
+ assert_result_rows [14], @parser.search("table/tr:last")
88
+ assert_result_rows [14], @parser.search("table/tr:last()")
89
+ end
90
+
91
+ def test_first_child
92
+ assert_result_rows [1], @parser.search("div/b:first-child"), "bold"
93
+ assert_result_rows [1], @parser.search("table/tr:first-child")
94
+ end
95
+
96
+ def test_last_child
97
+ assert_result_rows [3], @parser.search("div/b:last-child"), "bold"
98
+ assert_result_rows [14], @parser.search("table/tr:last-child")
99
+ end
100
+
101
+ def test_first_of_type
102
+ assert_result_rows [1], @parser.search("table/tr:first-of-type")
103
+ assert_result_rows [1], @parser.search("div/b:first-of-type"), "bold"
104
+ end
105
+
106
+ def test_last_of_type
107
+ assert_result_rows [14], @parser.search("table/tr:last-of-type")
108
+ assert_result_rows [3], @parser.search("div/b:last-of-type"), "bold"
109
+ end
110
+
111
+ def test_only_of_type
112
+ assert_result_rows [1,4], @parser.search("div/p:only-of-type"), "para"
113
+ end
114
+
115
+ def test_only_child
116
+ assert_result_rows [4], @parser.search("div/p:only-child"), "para"
117
+ end
118
+
119
+ def test_empty
120
+ result = @parser.search("p:empty")
121
+ assert_equal 1, result.size, "unexpected number of rows returned: '#{result.inner_text}'"
122
+ assert_equal 'empty', result.first['class']
123
+ end
124
+
125
+ def test_parent
126
+ result = @parser.search("p:parent")
127
+ assert_equal 5, result.size
128
+ 0.upto(3) do |j|
129
+ assert_equal "para#{j+1} ", result[j].inner_text
130
+ end
131
+ assert_equal "not-empty", result[4]['class']
132
+ end
133
+
134
+ def test_siblings
135
+ doc = <<-EOF
136
+ <html><body><div>
137
+ <p id="1">p1 </p>
138
+ <p id="2">p2 </p>
139
+ <p id="3">p3 </p>
140
+ <p id="4">p4 </p>
141
+ <p id="5">p5 </p>
142
+ EOF
143
+ parser = Nokogiri.Hpricot doc
144
+
145
+ assert_equal 2, parser.search("#3 ~ p").size
146
+ assert_equal "p4 p5 ", parser.search("#3 ~ p").inner_text
147
+ assert_equal 0, parser.search("#5 ~ p").size
148
+
149
+ assert_equal 1, parser.search("#3 + p").size
150
+ assert_equal "p4 ", parser.search("#3 + p").inner_text
151
+ assert_equal 0, parser.search("#5 + p").size
152
+ end
153
+
154
+ def assert_result_rows intarray, result, word="row"
155
+ assert_equal intarray.size, result.size, "unexpected number of rows returned: '#{result.inner_text}'"
156
+ assert_equal intarray.map{|j| "#{word}#{j}"}.join(' '), result.inner_text.strip, result.inner_text
157
+ end
158
+ end
159
+ end
160
+ end