nokogiri 1.0.0 → 1.6.8.1

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 (309) hide show
  1. checksums.yaml +7 -0
  2. data/.autotest +26 -0
  3. data/.cross_rubies +9 -0
  4. data/.editorconfig +17 -0
  5. data/.gemtest +0 -0
  6. data/.travis.yml +51 -0
  7. data/CHANGELOG.rdoc +1160 -0
  8. data/CONTRIBUTING.md +42 -0
  9. data/C_CODING_STYLE.rdoc +33 -0
  10. data/Gemfile +22 -0
  11. data/LICENSE.txt +31 -0
  12. data/Manifest.txt +284 -40
  13. data/README.md +166 -0
  14. data/ROADMAP.md +111 -0
  15. data/Rakefile +310 -199
  16. data/STANDARD_RESPONSES.md +47 -0
  17. data/Y_U_NO_GEMSPEC.md +155 -0
  18. data/appveyor.yml +22 -0
  19. data/bin/nokogiri +118 -0
  20. data/build_all +45 -0
  21. data/dependencies.yml +29 -0
  22. data/ext/nokogiri/depend +358 -0
  23. data/ext/nokogiri/extconf.rb +664 -34
  24. data/ext/nokogiri/html_document.c +120 -33
  25. data/ext/nokogiri/html_document.h +1 -1
  26. data/ext/nokogiri/html_element_description.c +279 -0
  27. data/ext/nokogiri/html_element_description.h +10 -0
  28. data/ext/nokogiri/html_entity_lookup.c +32 -0
  29. data/ext/nokogiri/html_entity_lookup.h +8 -0
  30. data/ext/nokogiri/html_sax_parser_context.c +116 -0
  31. data/ext/nokogiri/html_sax_parser_context.h +11 -0
  32. data/ext/nokogiri/html_sax_push_parser.c +87 -0
  33. data/ext/nokogiri/html_sax_push_parser.h +9 -0
  34. data/ext/nokogiri/nokogiri.c +145 -0
  35. data/ext/nokogiri/nokogiri.h +131 -0
  36. data/ext/nokogiri/xml_attr.c +94 -0
  37. data/ext/nokogiri/xml_attr.h +9 -0
  38. data/ext/nokogiri/xml_attribute_decl.c +70 -0
  39. data/ext/nokogiri/xml_attribute_decl.h +9 -0
  40. data/ext/nokogiri/xml_cdata.c +23 -19
  41. data/ext/nokogiri/xml_cdata.h +1 -1
  42. data/ext/nokogiri/xml_comment.c +69 -0
  43. data/ext/nokogiri/xml_comment.h +9 -0
  44. data/ext/nokogiri/xml_document.c +501 -54
  45. data/ext/nokogiri/xml_document.h +14 -1
  46. data/ext/nokogiri/xml_document_fragment.c +48 -0
  47. data/ext/nokogiri/xml_document_fragment.h +10 -0
  48. data/ext/nokogiri/xml_dtd.c +109 -24
  49. data/ext/nokogiri/xml_dtd.h +3 -1
  50. data/ext/nokogiri/xml_element_content.c +123 -0
  51. data/ext/nokogiri/xml_element_content.h +10 -0
  52. data/ext/nokogiri/xml_element_decl.c +69 -0
  53. data/ext/nokogiri/xml_element_decl.h +9 -0
  54. data/ext/nokogiri/xml_encoding_handler.c +79 -0
  55. data/ext/nokogiri/xml_encoding_handler.h +8 -0
  56. data/ext/nokogiri/xml_entity_decl.c +110 -0
  57. data/ext/nokogiri/xml_entity_decl.h +10 -0
  58. data/ext/nokogiri/xml_entity_reference.c +52 -0
  59. data/ext/nokogiri/xml_entity_reference.h +9 -0
  60. data/ext/nokogiri/xml_io.c +60 -0
  61. data/ext/nokogiri/xml_io.h +11 -0
  62. data/ext/nokogiri/xml_libxml2_hacks.c +112 -0
  63. data/ext/nokogiri/xml_libxml2_hacks.h +12 -0
  64. data/ext/nokogiri/xml_namespace.c +117 -0
  65. data/ext/nokogiri/xml_namespace.h +13 -0
  66. data/ext/nokogiri/xml_node.c +1285 -315
  67. data/ext/nokogiri/xml_node.h +4 -6
  68. data/ext/nokogiri/xml_node_set.c +415 -54
  69. data/ext/nokogiri/xml_node_set.h +6 -2
  70. data/ext/nokogiri/xml_processing_instruction.c +56 -0
  71. data/ext/nokogiri/xml_processing_instruction.h +9 -0
  72. data/ext/nokogiri/xml_reader.c +316 -77
  73. data/ext/nokogiri/xml_reader.h +1 -1
  74. data/ext/nokogiri/xml_relax_ng.c +161 -0
  75. data/ext/nokogiri/xml_relax_ng.h +9 -0
  76. data/ext/nokogiri/xml_sax_parser.c +215 -80
  77. data/ext/nokogiri/xml_sax_parser.h +30 -1
  78. data/ext/nokogiri/xml_sax_parser_context.c +262 -0
  79. data/ext/nokogiri/xml_sax_parser_context.h +10 -0
  80. data/ext/nokogiri/xml_sax_push_parser.c +115 -0
  81. data/ext/nokogiri/xml_sax_push_parser.h +9 -0
  82. data/ext/nokogiri/xml_schema.c +205 -0
  83. data/ext/nokogiri/xml_schema.h +9 -0
  84. data/ext/nokogiri/xml_syntax_error.c +45 -175
  85. data/ext/nokogiri/xml_syntax_error.h +4 -2
  86. data/ext/nokogiri/xml_text.c +37 -14
  87. data/ext/nokogiri/xml_text.h +1 -1
  88. data/ext/nokogiri/xml_xpath_context.c +230 -13
  89. data/ext/nokogiri/xml_xpath_context.h +2 -1
  90. data/ext/nokogiri/xslt_stylesheet.c +196 -34
  91. data/ext/nokogiri/xslt_stylesheet.h +6 -1
  92. data/lib/nokogiri/css/node.rb +18 -61
  93. data/lib/nokogiri/css/parser.rb +725 -17
  94. data/lib/nokogiri/css/parser.y +126 -63
  95. data/lib/nokogiri/css/parser_extras.rb +91 -0
  96. data/lib/nokogiri/css/syntax_error.rb +7 -0
  97. data/lib/nokogiri/css/tokenizer.rb +148 -5
  98. data/lib/nokogiri/css/tokenizer.rex +31 -39
  99. data/lib/nokogiri/css/xpath_visitor.rb +109 -51
  100. data/lib/nokogiri/css.rb +24 -3
  101. data/lib/nokogiri/decorators/slop.rb +42 -0
  102. data/lib/nokogiri/html/builder.rb +27 -1
  103. data/lib/nokogiri/html/document.rb +329 -3
  104. data/lib/nokogiri/html/document_fragment.rb +39 -0
  105. data/lib/nokogiri/html/element_description.rb +23 -0
  106. data/lib/nokogiri/html/element_description_defaults.rb +671 -0
  107. data/lib/nokogiri/html/entity_lookup.rb +13 -0
  108. data/lib/nokogiri/html/sax/parser.rb +35 -4
  109. data/lib/nokogiri/html/sax/parser_context.rb +16 -0
  110. data/lib/nokogiri/html/sax/push_parser.rb +36 -0
  111. data/lib/nokogiri/html.rb +18 -76
  112. data/lib/nokogiri/syntax_error.rb +4 -0
  113. data/lib/nokogiri/version.rb +106 -1
  114. data/lib/nokogiri/xml/attr.rb +14 -0
  115. data/lib/nokogiri/xml/attribute_decl.rb +18 -0
  116. data/lib/nokogiri/xml/builder.rb +395 -31
  117. data/lib/nokogiri/xml/cdata.rb +4 -2
  118. data/lib/nokogiri/xml/character_data.rb +7 -0
  119. data/lib/nokogiri/xml/document.rb +267 -12
  120. data/lib/nokogiri/xml/document_fragment.rb +149 -0
  121. data/lib/nokogiri/xml/dtd.rb +27 -1
  122. data/lib/nokogiri/xml/element_content.rb +36 -0
  123. data/lib/nokogiri/xml/element_decl.rb +13 -0
  124. data/lib/nokogiri/xml/entity_decl.rb +19 -0
  125. data/lib/nokogiri/xml/namespace.rb +13 -0
  126. data/lib/nokogiri/xml/node/save_options.rb +61 -0
  127. data/lib/nokogiri/xml/node.rb +748 -109
  128. data/lib/nokogiri/xml/node_set.rb +200 -72
  129. data/lib/nokogiri/xml/parse_options.rb +120 -0
  130. data/lib/nokogiri/xml/pp/character_data.rb +18 -0
  131. data/lib/nokogiri/xml/pp/node.rb +56 -0
  132. data/lib/nokogiri/xml/pp.rb +2 -0
  133. data/lib/nokogiri/xml/processing_instruction.rb +8 -0
  134. data/lib/nokogiri/xml/reader.rb +102 -4
  135. data/lib/nokogiri/xml/relax_ng.rb +32 -0
  136. data/lib/nokogiri/xml/sax/document.rb +114 -2
  137. data/lib/nokogiri/xml/sax/parser.rb +97 -7
  138. data/lib/nokogiri/xml/sax/parser_context.rb +16 -0
  139. data/lib/nokogiri/xml/sax/push_parser.rb +60 -0
  140. data/lib/nokogiri/xml/sax.rb +2 -7
  141. data/lib/nokogiri/xml/schema.rb +63 -0
  142. data/lib/nokogiri/xml/searchable.rb +221 -0
  143. data/lib/nokogiri/xml/syntax_error.rb +27 -1
  144. data/lib/nokogiri/xml/text.rb +4 -1
  145. data/lib/nokogiri/xml/xpath/syntax_error.rb +11 -0
  146. data/lib/nokogiri/xml/xpath.rb +4 -0
  147. data/lib/nokogiri/xml/xpath_context.rb +3 -1
  148. data/lib/nokogiri/xml.rb +45 -38
  149. data/lib/nokogiri/xslt/stylesheet.rb +19 -0
  150. data/lib/nokogiri/xslt.rb +47 -2
  151. data/lib/nokogiri.rb +117 -24
  152. data/lib/xsd/xmlparser/nokogiri.rb +102 -0
  153. data/patches/sort-patches-by-date +25 -0
  154. data/ports/archives/libxml2-2.9.4.tar.gz +0 -0
  155. data/ports/archives/libxslt-1.1.29.tar.gz +0 -0
  156. data/suppressions/README.txt +1 -0
  157. data/suppressions/nokogiri_ree-1.8.7.358.supp +61 -0
  158. data/suppressions/nokogiri_ruby-1.8.7.370.supp +0 -0
  159. data/suppressions/nokogiri_ruby-1.9.2.320.supp +28 -0
  160. data/suppressions/nokogiri_ruby-1.9.3.327.supp +28 -0
  161. data/tasks/test.rb +100 -0
  162. data/test/css/test_nthiness.rb +73 -6
  163. data/test/css/test_parser.rb +184 -39
  164. data/test/css/test_tokenizer.rb +72 -19
  165. data/test/css/test_xpath_visitor.rb +44 -2
  166. data/test/decorators/test_slop.rb +20 -0
  167. data/test/files/2ch.html +108 -0
  168. data/test/files/GH_1042.html +18 -0
  169. data/test/files/address_book.rlx +12 -0
  170. data/test/files/address_book.xml +10 -0
  171. data/test/files/atom.xml +344 -0
  172. data/test/files/bar/bar.xsd +4 -0
  173. data/test/files/bogus.xml +0 -0
  174. data/test/files/dont_hurt_em_why.xml +422 -0
  175. data/test/files/encoding.html +82 -0
  176. data/test/files/encoding.xhtml +84 -0
  177. data/test/files/exslt.xml +8 -0
  178. data/test/files/exslt.xslt +35 -0
  179. data/test/files/foo/foo.xsd +4 -0
  180. data/test/files/metacharset.html +10 -0
  181. data/test/files/namespace_pressure_test.xml +1684 -0
  182. data/test/files/noencoding.html +47 -0
  183. data/test/files/po.xml +32 -0
  184. data/test/files/po.xsd +66 -0
  185. data/test/files/saml/saml20assertion_schema.xsd +283 -0
  186. data/test/files/saml/saml20protocol_schema.xsd +302 -0
  187. data/test/files/saml/xenc_schema.xsd +146 -0
  188. data/test/files/saml/xmldsig_schema.xsd +318 -0
  189. data/test/files/shift_jis.html +10 -0
  190. data/test/files/shift_jis.xml +5 -0
  191. data/test/files/shift_jis_no_charset.html +9 -0
  192. data/test/files/slow-xpath.xml +25509 -0
  193. data/test/files/snuggles.xml +3 -0
  194. data/test/files/staff.dtd +10 -0
  195. data/test/files/test_document_url/bar.xml +2 -0
  196. data/test/files/test_document_url/document.dtd +4 -0
  197. data/test/files/test_document_url/document.xml +6 -0
  198. data/test/files/tlm.html +2 -1
  199. data/test/files/to_be_xincluded.xml +2 -0
  200. data/test/files/valid_bar.xml +2 -0
  201. data/test/files/xinclude.xml +4 -0
  202. data/test/helper.rb +124 -13
  203. data/test/html/sax/test_parser.rb +118 -4
  204. data/test/html/sax/test_parser_context.rb +46 -0
  205. data/test/html/sax/test_push_parser.rb +87 -0
  206. data/test/html/test_builder.rb +94 -8
  207. data/test/html/test_document.rb +626 -11
  208. data/test/html/test_document_encoding.rb +145 -0
  209. data/test/html/test_document_fragment.rb +301 -0
  210. data/test/html/test_element_description.rb +105 -0
  211. data/test/html/test_named_characters.rb +14 -0
  212. data/test/html/test_node.rb +212 -0
  213. data/test/html/test_node_encoding.rb +85 -0
  214. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +14 -0
  215. data/test/namespaces/test_namespaces_aliased_default.rb +24 -0
  216. data/test/namespaces/test_namespaces_in_builder_doc.rb +75 -0
  217. data/test/namespaces/test_namespaces_in_cloned_doc.rb +31 -0
  218. data/test/namespaces/test_namespaces_in_created_doc.rb +75 -0
  219. data/test/namespaces/test_namespaces_in_parsed_doc.rb +80 -0
  220. data/test/namespaces/test_namespaces_preservation.rb +31 -0
  221. data/test/test_convert_xpath.rb +2 -47
  222. data/test/test_css_cache.rb +45 -0
  223. data/test/test_encoding_handler.rb +48 -0
  224. data/test/test_memory_leak.rb +156 -0
  225. data/test/test_nokogiri.rb +103 -1
  226. data/test/test_soap4r_sax.rb +52 -0
  227. data/test/test_xslt_transforms.rb +293 -8
  228. data/test/xml/node/test_save_options.rb +28 -0
  229. data/test/xml/node/test_subclass.rb +44 -0
  230. data/test/xml/sax/test_parser.rb +309 -8
  231. data/test/xml/sax/test_parser_context.rb +115 -0
  232. data/test/xml/sax/test_push_parser.rb +157 -0
  233. data/test/xml/test_attr.rb +67 -0
  234. data/test/xml/test_attribute_decl.rb +86 -0
  235. data/test/xml/test_builder.rb +327 -2
  236. data/test/xml/test_c14n.rb +180 -0
  237. data/test/xml/test_cdata.rb +32 -2
  238. data/test/xml/test_comment.rb +40 -0
  239. data/test/xml/test_document.rb +846 -35
  240. data/test/xml/test_document_encoding.rb +31 -0
  241. data/test/xml/test_document_fragment.rb +271 -0
  242. data/test/xml/test_dtd.rb +153 -9
  243. data/test/xml/test_dtd_encoding.rb +31 -0
  244. data/test/xml/test_element_content.rb +56 -0
  245. data/test/xml/test_element_decl.rb +73 -0
  246. data/test/xml/test_entity_decl.rb +122 -0
  247. data/test/xml/test_entity_reference.rb +251 -0
  248. data/test/xml/test_namespace.rb +96 -0
  249. data/test/xml/test_node.rb +1126 -105
  250. data/test/xml/test_node_attributes.rb +115 -0
  251. data/test/xml/test_node_encoding.rb +69 -0
  252. data/test/xml/test_node_inheritance.rb +32 -0
  253. data/test/xml/test_node_reparenting.rb +549 -0
  254. data/test/xml/test_node_set.rb +668 -9
  255. data/test/xml/test_parse_options.rb +64 -0
  256. data/test/xml/test_processing_instruction.rb +30 -0
  257. data/test/xml/test_reader.rb +589 -0
  258. data/test/xml/test_reader_encoding.rb +134 -0
  259. data/test/xml/test_relax_ng.rb +60 -0
  260. data/test/xml/test_schema.rb +142 -0
  261. data/test/xml/test_syntax_error.rb +30 -0
  262. data/test/xml/test_text.rb +49 -2
  263. data/test/xml/test_unparented_node.rb +440 -0
  264. data/test/xml/test_xinclude.rb +83 -0
  265. data/test/xml/test_xpath.rb +445 -0
  266. data/test/xslt/test_custom_functions.rb +133 -0
  267. data/test/xslt/test_exception_handling.rb +37 -0
  268. data/test_all +107 -0
  269. metadata +459 -115
  270. data/History.txt +0 -6
  271. data/README.ja.txt +0 -86
  272. data/README.txt +0 -87
  273. data/ext/nokogiri/html_sax_parser.c +0 -32
  274. data/ext/nokogiri/html_sax_parser.h +0 -11
  275. data/ext/nokogiri/native.c +0 -40
  276. data/ext/nokogiri/native.h +0 -51
  277. data/ext/nokogiri/xml_xpath.c +0 -46
  278. data/ext/nokogiri/xml_xpath.h +0 -11
  279. data/lib/nokogiri/css/generated_parser.rb +0 -653
  280. data/lib/nokogiri/css/generated_tokenizer.rb +0 -159
  281. data/lib/nokogiri/decorators/hpricot/node.rb +0 -58
  282. data/lib/nokogiri/decorators/hpricot/node_set.rb +0 -14
  283. data/lib/nokogiri/decorators/hpricot/xpath_visitor.rb +0 -17
  284. data/lib/nokogiri/decorators/hpricot.rb +0 -3
  285. data/lib/nokogiri/decorators.rb +0 -1
  286. data/lib/nokogiri/hpricot.rb +0 -47
  287. data/lib/nokogiri/xml/after_handler.rb +0 -18
  288. data/lib/nokogiri/xml/before_handler.rb +0 -32
  289. data/lib/nokogiri/xml/element.rb +0 -6
  290. data/lib/nokogiri/xml/entity_declaration.rb +0 -9
  291. data/nokogiri.gemspec +0 -34
  292. data/test/hpricot/files/basic.xhtml +0 -17
  293. data/test/hpricot/files/boingboing.html +0 -2266
  294. data/test/hpricot/files/cy0.html +0 -3653
  295. data/test/hpricot/files/immob.html +0 -400
  296. data/test/hpricot/files/pace_application.html +0 -1320
  297. data/test/hpricot/files/tenderlove.html +0 -16
  298. data/test/hpricot/files/uswebgen.html +0 -220
  299. data/test/hpricot/files/utf8.html +0 -1054
  300. data/test/hpricot/files/week9.html +0 -1723
  301. data/test/hpricot/files/why.xml +0 -19
  302. data/test/hpricot/load_files.rb +0 -7
  303. data/test/hpricot/test_alter.rb +0 -67
  304. data/test/hpricot/test_builder.rb +0 -27
  305. data/test/hpricot/test_parser.rb +0 -423
  306. data/test/hpricot/test_paths.rb +0 -15
  307. data/test/hpricot/test_preserved.rb +0 -78
  308. data/test/hpricot/test_xml.rb +0 -30
  309. data/test/test_reader.rb +0 -222
data/Rakefile CHANGED
@@ -1,199 +1,289 @@
1
1
  # -*- ruby -*-
2
-
3
2
  require 'rubygems'
4
- require 'hoe'
3
+ require 'shellwords'
5
4
 
6
- kind = Config::CONFIG['DLEXT']
7
- windows = RUBY_PLATFORM =~ /mswin/i ? true : false
5
+ gem 'hoe'
6
+ require 'hoe'
7
+ Hoe.plugin :debugging
8
+ Hoe.plugin :git
9
+ Hoe.plugin :gemspec
10
+ Hoe.plugin :bundler
8
11
 
9
- LIB_DIR = File.expand_path(File.join(File.dirname(__FILE__), 'lib'))
10
- $LOAD_PATH << LIB_DIR
12
+ GENERATED_PARSER = "lib/nokogiri/css/parser.rb"
13
+ GENERATED_TOKENIZER = "lib/nokogiri/css/tokenizer.rb"
11
14
 
12
- GENERATED_PARSER = "lib/nokogiri/css/generated_parser.rb"
13
- GENERATED_TOKENIZER = "lib/nokogiri/css/generated_tokenizer.rb"
15
+ def java?
16
+ /java/ === RUBY_PLATFORM
17
+ end
14
18
 
15
- EXT = "ext/nokogiri/native.#{kind}"
19
+ ENV['LANG'] = "en_US.UTF-8" # UBUNTU 10.04, Y U NO DEFAULT TO UTF-8?
16
20
 
17
- require 'nokogiri/version'
21
+ CrossRuby = Struct.new(:version, :host) {
22
+ def ver
23
+ @ver ||= version[/\A[^-]+/]
24
+ end
18
25
 
19
- HOE = Hoe.new('nokogiri', Nokogiri::VERSION) do |p|
20
- p.developer('Aaron Patterson', 'aaronp@rubyforge.org')
21
- p.clean_globs = [
22
- 'ext/nokogiri/Makefile',
23
- 'ext/nokogiri/*.{o,so,bundle,a,log,dll}',
24
- 'ext/nokogiri/conftest.dSYM',
25
- GENERATED_PARSER,
26
- GENERATED_TOKENIZER,
27
- 'cross',
28
- ]
29
- p.spec_extras = { :extensions => ["Rakefile"] }
30
- end
26
+ def minor_ver
27
+ @minor_ver ||= ver[/\A\d\.\d(?=\.)/]
28
+ end
31
29
 
32
- namespace :gem do
33
- namespace :dev do
34
- task :spec do
35
- File.open("#{HOE.name}.gemspec", 'w') do |f|
36
- HOE.spec.version = "#{HOE.version}.#{Time.now.strftime("%Y%m%d%H%M%S")}"
37
- f.write(HOE.spec.to_ruby)
38
- end
30
+ def api_ver_suffix
31
+ case minor_ver
32
+ when nil
33
+ raise "unsupported version: #{ver}"
34
+ when '1.9'
35
+ '191'
36
+ else
37
+ minor_ver.delete('.') << '0'
39
38
  end
40
39
  end
41
40
 
42
- namespace :win32 do
43
- task :spec do
44
- File.open("#{HOE.name}.gemspec", 'w') do |f|
45
- HOE.spec.files += Dir['ext/nokogiri/**.{dll,so}']
46
- if windows
47
- HOE.spec.platform = Gem::Platform::CURRENT
48
- else
49
- HOE.spec.platform = 'x86-mswin32-60'
50
- end
51
- HOE.spec.extensions = []
52
- f.write(HOE.spec.to_ruby)
41
+ def platform
42
+ @platform ||=
43
+ case host
44
+ when /\Ax86_64-/
45
+ 'x64-mingw32'
46
+ when /\Ai[3-6]86-/
47
+ 'x86-mingw32'
48
+ else
49
+ raise "unsupported host: #{host}"
53
50
  end
51
+ end
52
+
53
+ def tool(name)
54
+ (@binutils_prefix ||=
55
+ case platform
56
+ when 'x64-mingw32'
57
+ 'x86_64-w64-mingw32-'
58
+ when 'x86-mingw32'
59
+ 'i686-w64-mingw32-'
60
+ end) + name
61
+ end
62
+
63
+ def target
64
+ case platform
65
+ when 'x64-mingw32'
66
+ 'pei-x86-64'
67
+ when 'x86-mingw32'
68
+ 'pei-i386'
54
69
  end
55
70
  end
56
71
 
57
- namespace :unix do
58
- task :spec do
59
- File.open("#{HOE.name}.gemspec", 'w') do |f|
60
- f.write(HOE.spec.to_ruby)
61
- end
72
+ def libruby_dll
73
+ case platform
74
+ when 'x64-mingw32'
75
+ "x64-msvcrt-ruby#{api_ver_suffix}.dll"
76
+ when 'x86-mingw32'
77
+ "msvcrt-ruby#{api_ver_suffix}.dll"
62
78
  end
63
79
  end
64
80
 
65
- task :spec => ['gem:dev:spec']
66
- end
81
+ def dlls
82
+ [
83
+ 'kernel32.dll',
84
+ 'msvcrt.dll',
85
+ 'ws2_32.dll',
86
+ *(case
87
+ when ver >= '2.0.0'
88
+ 'user32.dll'
89
+ end),
90
+ libruby_dll
91
+ ]
92
+ end
93
+ }
94
+
95
+ CROSS_RUBIES = File.read('.cross_rubies').lines.flat_map { |line|
96
+ case line
97
+ when /\A([^#]+):([^#]+)/
98
+ CrossRuby.new($1, $2)
99
+ else
100
+ []
101
+ end
102
+ }
67
103
 
68
- desc "Run code-coverage analysis"
69
- task :coverage do
70
- rm_rf "coverage"
71
- sh "rcov -x Library -I lib:test #{Dir[*HOE.test_globs].join(' ')}"
72
- end
104
+ ENV['RUBY_CC_VERSION'] ||= CROSS_RUBIES.map(&:ver).uniq.join(":")
73
105
 
74
- file GENERATED_PARSER => "lib/nokogiri/css/parser.y" do |t|
75
- sh "racc -o #{t.name} #{t.prerequisites.first}"
76
- end
106
+ HOE = Hoe.spec 'nokogiri' do
107
+ developer 'Aaron Patterson', 'aaronp@rubyforge.org'
108
+ developer 'Mike Dalessio', 'mike.dalessio@gmail.com'
109
+ developer 'Yoko Harada', 'yokolet@gmail.com'
110
+ developer 'Tim Elliott', 'tle@holymonkey.com'
111
+ developer 'Akinori MUSHA', 'knu@idaemons.org'
77
112
 
78
- file GENERATED_TOKENIZER => "lib/nokogiri/css/tokenizer.rex" do |t|
79
- sh "frex -i --independent -o #{t.name} #{t.prerequisites.first}"
80
- end
113
+ license "MIT"
114
+
115
+ self.readme_file = "README.md"
116
+ self.history_file = ['CHANGELOG', ENV['HLANG'], 'rdoc'].compact.join('.')
117
+
118
+ self.extra_rdoc_files = FileList['*.rdoc','ext/nokogiri/*.c']
81
119
 
82
- task 'ext/nokogiri/Makefile' do
83
- Dir.chdir('ext/nokogiri') do
84
- ruby "extconf.rb"
120
+
121
+ self.clean_globs += [
122
+ 'nokogiri.gemspec',
123
+ 'lib/nokogiri/nokogiri.{bundle,jar,rb,so}',
124
+ 'lib/nokogiri/[0-9].[0-9]'
125
+ ]
126
+ self.clean_globs += Dir.glob("ports/*").reject { |d| d =~ %r{/archives$} }
127
+
128
+ unless java?
129
+ self.extra_deps += [
130
+ ["mini_portile2", "~> 2.1.0"], # keep version in sync with extconf.rb
131
+ ]
85
132
  end
86
- end
87
133
 
88
- task EXT => 'ext/nokogiri/Makefile' do
89
- Dir.chdir('ext/nokogiri') do
90
- sh 'make'
134
+ self.extra_dev_deps += [
135
+ ["hoe-bundler", "~> 1.2.0"],
136
+ ["hoe-debugging", "~> 1.2.1"],
137
+ ["hoe-gemspec", "~> 1.0.0"],
138
+ ["hoe-git", "~> 1.6.0"],
139
+ ["minitest", "~> 5.8.4"],
140
+ ["rake", "~> 10.5.0"],
141
+ ["rake-compiler", "~> 0.9.2"],
142
+ ["rake-compiler-dock", "~> 0.5.1"],
143
+ ["racc", "~> 1.4.14"],
144
+ ["rexical", "~> 1.0.5"]
145
+ ]
146
+
147
+ if java?
148
+ self.spec_extras = { :platform => 'java' }
149
+ else
150
+ self.spec_extras = {
151
+ :extensions => ["ext/nokogiri/extconf.rb"],
152
+ :required_ruby_version => '>= 1.9.2'
153
+ }
91
154
  end
155
+
156
+ self.testlib = :minitest
92
157
  end
93
158
 
94
- task :build => [EXT, GENERATED_PARSER, GENERATED_TOKENIZER]
95
-
96
- namespace :build do
97
- namespace :win32 do
98
- file 'cross/bin/ruby.exe' => ['cross/ruby-1.8.6-p287'] do
99
- Dir.chdir('cross/ruby-1.8.6-p287') do
100
- str = ''
101
- File.open('Makefile.in', 'rb') do |f|
102
- f.each_line do |line|
103
- if line =~ /^\s*ALT_SEPARATOR =/
104
- str += "\t\t " + 'ALT_SEPARATOR = "\\\\\"; \\'
105
- str += "\n"
106
- else
107
- str += line
108
- end
109
- end
110
- end
111
- File.open('Makefile.in', 'wb') { |f| f.write str }
112
- buildopts = if File.exists?('/usr/bin/i586-mingw32msvc-gcc')
113
- "--host=i586-mingw32msvc --target=i386-mingw32 --build=i686-linux"
114
- else
115
- "--host=i386-mingw32 --target=i386-mingw32"
116
- end
117
- sh(<<-eocommand)
118
- env ac_cv_func_getpgrp_void=no \
119
- ac_cv_func_setpgrp_void=yes \
120
- rb_cv_negative_time_t=no \
121
- ac_cv_func_memcmp_working=yes \
122
- rb_cv_binary_elf=no \
123
- ./configure \
124
- #{buildopts} \
125
- --prefix=#{File.expand_path(File.join(Dir.pwd, '..'))}
126
- eocommand
127
- sh 'make'
128
- sh 'make install'
129
- end
130
- end
159
+ # ----------------------------------------
131
160
 
132
- desc 'build cross compiled ruby'
133
- task :ruby => 'cross/bin/ruby.exe'
161
+ def add_file_to_gem relative_path
162
+ target_path = File.join gem_build_path, relative_path
163
+ target_dir = File.dirname(target_path)
164
+ mkdir_p target_dir unless File.directory?(target_dir)
165
+ rm_f target_path
166
+ safe_ln relative_path, target_path
167
+ HOE.spec.files += [relative_path]
168
+ end
169
+
170
+ def gem_build_path
171
+ File.join 'pkg', HOE.spec.full_name
172
+ end
173
+
174
+ if java?
175
+ # TODO: clean this section up.
176
+ require "rake/javaextensiontask"
177
+ Rake::JavaExtensionTask.new("nokogiri", HOE.spec) do |ext|
178
+ jruby_home = RbConfig::CONFIG['prefix']
179
+ ext.ext_dir = 'ext/java'
180
+ ext.lib_dir = 'lib/nokogiri'
181
+ ext.source_version = '1.6'
182
+ ext.target_version = '1.6'
183
+ jars = ["#{jruby_home}/lib/jruby.jar"] + FileList['lib/*.jar']
184
+ ext.classpath = jars.map { |x| File.expand_path x }.join ':'
185
+ ext.debug = true if ENV['JAVA_DEBUG']
134
186
  end
135
187
 
136
- desc 'build nokogiri for win32'
137
- task :win32 => [GENERATED_PARSER, GENERATED_TOKENIZER, 'build:externals', 'build:win32:ruby'] do
138
- dash_i = File.expand_path(
139
- File.join(File.dirname(__FILE__), 'cross/lib/ruby/1.8/i386-mingw32/')
140
- )
141
- Dir.chdir('ext/nokogiri') do
142
- ruby " -I #{dash_i} extconf.rb"
143
- sh 'make'
144
- end
145
- dlls = Dir[File.join(File.dirname(__FILE__), 'cross', '**/*.dll')]
146
- dlls.each do |dll|
147
- next if dll =~ /ruby/
148
- cp dll, 'ext/nokogiri'
188
+ task gem_build_path => [:compile] do
189
+ add_file_to_gem 'lib/nokogiri/nokogiri.jar'
190
+ end
191
+ else
192
+ begin
193
+ require 'rake/extensioncompiler'
194
+ # Ensure mingw compiler is installed
195
+ Rake::ExtensionCompiler.mingw_host
196
+ mingw_available = true
197
+ rescue
198
+ mingw_available = false
199
+ end
200
+ require "rake/extensiontask"
201
+
202
+ HOE.spec.files.reject! { |f| f =~ %r{\.(java|jar)$} }
203
+
204
+ dependencies = YAML.load_file("dependencies.yml")
205
+
206
+ task gem_build_path do
207
+ %w[libxml2 libxslt].each do |lib|
208
+ version = dependencies[lib]["version"]
209
+ archive = File.join("ports", "archives", "#{lib}-#{version}.tar.gz")
210
+ add_file_to_gem archive
211
+ patchesdir = File.join("patches", lib)
212
+ patches = `#{['git', 'ls-files', patchesdir].shelljoin}`.split("\n").grep(/\.patch\z/)
213
+ patches.each { |patch|
214
+ add_file_to_gem patch
215
+ }
216
+ (untracked = Dir[File.join(patchesdir, '*.patch')] - patches).empty? or
217
+ at_exit {
218
+ untracked.each { |patch|
219
+ puts "** WARNING: untracked patch file not added to gem: #{patch}"
220
+ }
221
+ }
149
222
  end
150
223
  end
151
224
 
152
- libs = %w{
153
- iconv-1.9.2.win32
154
- zlib-1.2.3.win32
155
- libxml2-2.7.2.win32
156
- libxslt-1.1.24.win32
157
- }
158
-
159
- libs.each do |lib|
160
- file "stash/#{lib}.zip" do |t|
161
- puts "downloading #{lib}"
162
- FileUtils.mkdir_p('stash')
163
- Dir.chdir('stash') do
164
- url = "http://www.zlatkovic.com/pub/libxml/#{lib}.zip"
165
- system("wget #{url} || curl -O #{url}")
166
- end
167
- end
168
- file "cross/#{lib}" => ["stash/#{lib}.zip"] do |t|
169
- puts "unzipping #{lib}.zip"
170
- FileUtils.mkdir_p('cross')
171
- Dir.chdir('cross') do
172
- sh "unzip ../stash/#{lib}.zip"
173
- sh "touch #{lib}"
225
+ Rake::ExtensionTask.new("nokogiri", HOE.spec) do |ext|
226
+ ext.lib_dir = File.join(*['lib', 'nokogiri', ENV['FAT_DIR']].compact)
227
+ ext.config_options << ENV['EXTOPTS']
228
+ if mingw_available
229
+ ext.cross_compile = true
230
+ ext.cross_platform = CROSS_RUBIES.map(&:platform).uniq
231
+ ext.cross_config_options << "--enable-cross-build"
232
+ ext.cross_compiling do |spec|
233
+ libs = dependencies.map { |name, dep| "#{name}-#{dep["version"]}" }.join(', ')
234
+
235
+ spec.required_ruby_version = [
236
+ '>= 1.9.2',
237
+ "< #{CROSS_RUBIES.max_by(&:ver).minor_ver.succ}"
238
+ ]
239
+
240
+ spec.post_install_message = <<-EOS
241
+ Nokogiri is built with the packaged libraries: #{libs}.
242
+ EOS
243
+ spec.files.reject! { |path| File.fnmatch?('ports/*', path) }
174
244
  end
175
245
  end
176
246
  end
247
+ end
177
248
 
178
- file "stash/ruby-1.8.6-p287.tar.gz" do |t|
179
- puts "downloading ruby"
180
- FileUtils.mkdir_p('stash')
181
- Dir.chdir('stash') do
182
- url = ("ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6-p287.tar.gz")
183
- system("wget #{url} || curl -O #{url}")
184
- end
185
- end
186
- file 'cross/ruby-1.8.6-p287' => ["stash/ruby-1.8.6-p287.tar.gz"] do |t|
187
- puts "unzipping ruby"
188
- FileUtils.mkdir_p('cross')
189
- Dir.chdir('cross') do
190
- sh "tar zxvf ../stash/ruby-1.8.6-p287.tar.gz"
191
- end
249
+ # ----------------------------------------
250
+
251
+ desc "Generate css/parser.rb and css/tokenizer.rex"
252
+ task 'generate' => [GENERATED_PARSER, GENERATED_TOKENIZER]
253
+ task 'gem:spec' => 'generate' if Rake::Task.task_defined?("gem:spec")
254
+
255
+ # This is a big hack to make sure that the racc and rexical
256
+ # dependencies in the Gemfile are constrainted to ruby platforms
257
+ # (i.e. MRI and Rubinius). There's no way to do that through hoe,
258
+ # and any solution will require changing hoe and hoe-bundler.
259
+ old_gemfile_task = Rake::Task['bundler:gemfile'] rescue nil
260
+ task 'bundler:gemfile' do
261
+ old_gemfile_task.invoke if old_gemfile_task
262
+
263
+ lines = File.open('Gemfile', 'r') { |f| f.readlines }.map do |line|
264
+ line =~ /racc|rexical/ ? "#{line.strip}, :platform => :ruby" : line
192
265
  end
266
+ File.open('Gemfile', 'w') { |f| lines.each { |line| f.puts line } }
267
+ end
193
268
 
194
- task :externals => libs.map { |x| "cross/#{x}" } + ['cross/ruby-1.8.6-p287']
269
+ file GENERATED_PARSER => "lib/nokogiri/css/parser.y" do |t|
270
+ racc = RbConfig::CONFIG['target_os'] =~ /mswin32/ ? '' : `which racc`.strip
271
+ racc = "#{::RbConfig::CONFIG['bindir']}/racc" if racc.empty?
272
+ racc = %x{command -v racc}.strip if racc.empty?
273
+ sh "#{racc} -l -o #{t.name} #{t.prerequisites.first}"
195
274
  end
196
275
 
276
+ file GENERATED_TOKENIZER => "lib/nokogiri/css/tokenizer.rex" do |t|
277
+ sh "rex --independent -o #{t.name} #{t.prerequisites.first}"
278
+ end
279
+
280
+ [:compile, :check_manifest].each do |task_name|
281
+ Rake::Task[task_name].prerequisites << GENERATED_PARSER
282
+ Rake::Task[task_name].prerequisites << GENERATED_TOKENIZER
283
+ end
284
+
285
+ # ----------------------------------------
286
+
197
287
  desc "set environment variables to build and/or test with debug options"
198
288
  task :debug do
199
289
  ENV['NOKOGIRI_DEBUG'] = "true"
@@ -201,64 +291,85 @@ task :debug do
201
291
  ENV['CFLAGS'] += " -DDEBUG"
202
292
  end
203
293
 
204
- def test_suite_cmdline
205
- require 'find'
206
- files = []
207
- Find.find("test") do |f|
208
- files << f if File.basename(f) =~ /.*test.*\.rb$/
209
- end
210
- cmdline = "ruby -w -I.:lib:ext:test -rtest/unit -e '%w[#{files.join(' ')}].each {|f| require f}'"
294
+ require File.join File.dirname(__FILE__), 'tasks/test'
295
+
296
+ task :java_debug do
297
+ ENV['JRUBY_OPTS'] = "#{ENV['JRUBY_OPTS']} --debug --dev"
298
+ ENV['JAVA_OPTS'] = '-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y' if ENV['JAVA_DEBUG']
211
299
  end
212
300
 
213
- namespace :test do
214
- # partial-loads-ok and undef-value-errors necessary to ignore
215
- # spurious (and eminently ignorable) warnings from the ruby
216
- # interpreter
217
- VALGRIND_BASIC_OPTS = "--num-callers=50 --error-limit=no --partial-loads-ok=yes --undef-value-errors=no"
218
-
219
- desc "run test suite under valgrind with basic ruby options"
220
- task :valgrind => :build do
221
- cmdline = "valgrind #{VALGRIND_BASIC_OPTS} #{test_suite_cmdline}"
222
- puts cmdline
223
- system cmdline
301
+ if java?
302
+ task :test_19 => :test
303
+ task :test_20 do
304
+ ENV['JRUBY_OPTS'] = "--2.0"
305
+ Rake::Task["test"].invoke
224
306
  end
307
+ end
308
+
309
+ Rake::Task[:test].prerequisites << :compile
310
+ Rake::Task[:test].prerequisites << :java_debug
311
+ Rake::Task[:test].prerequisites << :check_extra_deps unless java?
225
312
 
226
- desc "run test suite under valgrind with memory-fill ruby options"
227
- task :valgrind_mem => :build do
228
- # fill malloced memory with "m" and freed memory with "f"
229
- cmdline = "valgrind #{VALGRIND_BASIC_OPTS} --freelist-vol=100000000 --malloc-fill=6D --free-fill=66 #{test_suite_cmdline}"
230
- puts cmdline
231
- system cmdline
313
+ if Hoe.plugins.include?(:debugging)
314
+ ['valgrind', 'valgrind:mem', 'valgrind:mem0'].each do |task_name|
315
+ Rake::Task["test:#{task_name}"].prerequisites << :compile
232
316
  end
317
+ end
318
+
319
+ task "test:libxml-ruby" do
320
+ ENV['TEST_NOKOGIRI_WITH_LIBXML_RUBY'] = "1"
321
+ warn "#{__FILE__}:#{__LINE__}: --- running tests with libxml-ruby loaded ---"
322
+ Rake::Task[:test].execute
323
+ ENV['TEST_NOKOGIRI_WITH_LIBXML_RUBY'] = nil
324
+ end
325
+
326
+ Rake::Task["test:libxml-ruby"].prerequisites << :compile
233
327
 
234
- desc "run test suite under valgrind with memory-zero ruby options"
235
- task :valgrind_mem0 => :build do
236
- # fill malloced and freed memory with 0
237
- cmdline = "valgrind #{VALGRIND_BASIC_OPTS} --freelist-vol=100000000 --malloc-fill=00 --free-fill=00 #{test_suite_cmdline}"
238
- puts cmdline
239
- system cmdline
328
+ task "test:valgrind:libxml-ruby" do
329
+ ENV['TEST_NOKOGIRI_WITH_LIBXML_RUBY'] = "1"
330
+ warn "#{__FILE__}:#{__LINE__}: --- running tests with libxml-ruby loaded ---"
331
+ Rake::Task["test:valgrind"].execute
332
+ ENV['TEST_NOKOGIRI_WITH_LIBXML_RUBY'] = nil
333
+ end
334
+
335
+ Rake::Task["test:valgrind:libxml-ruby"].prerequisites << :compile
336
+
337
+ # ----------------------------------------
338
+
339
+ def verify_dll(dll, cross_ruby)
340
+ dll_imports = cross_ruby.dlls
341
+ dump = `#{['env', 'LANG=C', cross_ruby.tool('objdump'), '-p', dll].shelljoin}`
342
+ raise "unexpected file format for generated dll #{dll}" unless /file format #{Regexp.quote(cross_ruby.target)}\s/ === dump
343
+ raise "export function Init_nokogiri not in dll #{dll}" unless /Table.*\sInit_nokogiri\s/mi === dump
344
+
345
+ # Verify that the expected DLL dependencies match the actual dependencies
346
+ # and that no further dependencies exist.
347
+ dll_imports_is = dump.scan(/DLL Name: (.*)$/).map(&:first).map(&:downcase).uniq
348
+ if dll_imports_is.sort != dll_imports.sort
349
+ raise "unexpected dll imports #{dll_imports_is.inspect} in #{dll}"
240
350
  end
351
+ puts "#{dll}: Looks good!"
352
+ end
241
353
 
242
- desc "run test suite under gdb"
243
- task :gdb => :build do
244
- cmdline = "gdb --args #{test_suite_cmdline}"
245
- puts cmdline
246
- system cmdline
354
+ task :cross do
355
+ rake_compiler_config_path = File.expand_path("~/.rake-compiler/config.yml")
356
+ unless File.exists? rake_compiler_config_path
357
+ raise "rake-compiler has not installed any cross rubies. Try using rake-compiler-dev-box for building binary windows gems.'"
247
358
  end
248
359
 
249
- desc "run test suite with aggressive GC"
250
- task :gc => :build do
251
- ENV['NOKOGIRI_GC'] = "true"
252
- Rake::Task["test"].invoke
360
+ CROSS_RUBIES.each do |cross_ruby|
361
+ task "tmp/#{cross_ruby.platform}/nokogiri/#{cross_ruby.ver}/nokogiri.so" do |t|
362
+ # To reduce the gem file size strip mingw32 dlls before packaging
363
+ sh [cross_ruby.tool('strip'), '-S', t.name].shelljoin
364
+ verify_dll t.name, cross_ruby
365
+ end
253
366
  end
254
367
  end
255
368
 
256
-
257
- # Only do this on unix, since we can't build on windows
258
- unless windows
259
- Rake::Task[:test].prerequisites << :build
260
- Rake::Task[:check_manifest].prerequisites << GENERATED_PARSER
261
- Rake::Task[:check_manifest].prerequisites << GENERATED_TOKENIZER
369
+ desc "build a windows gem without all the ceremony."
370
+ task "gem:windows" do
371
+ require "rake_compiler_dock"
372
+ RakeCompilerDock.sh "bundle && rake cross native gem MAKE='nice make -j`nproc`' RUBY_CC_VERSION=#{ENV['RUBY_CC_VERSION']}"
262
373
  end
263
374
 
264
375
  # vim: syntax=Ruby
@@ -0,0 +1,47 @@
1
+ # Standard Responses to Requests
2
+
3
+ These responses are needed often enough that I figured, let's just
4
+ check them in for future reference and use.
5
+
6
+
7
+ # Not enough information to help
8
+
9
+ Hello!
10
+
11
+ Thanks for asking this question! However, without more information,
12
+ Team Nokogiri cannot reproduce your issue, and so we cannot offer much
13
+ help.
14
+
15
+ Please provide us with:
16
+
17
+ * A self-contained script (one that we can run without modification,
18
+ and preferably without making external network connections).
19
+
20
+ * Please note that you need to include the XML/HTML that you are
21
+ operating on.
22
+
23
+ * The output of `nokogiri -v`, which will provide details about your
24
+ platform and versions of ruby, libxml2 and nokogiri.
25
+
26
+ For more information about requesting help or reporting bugs, please
27
+ take a look at http://bit.ly/nokohelp
28
+
29
+ Thank you so much!
30
+
31
+
32
+ # Not a bug
33
+
34
+ Hello!
35
+
36
+ Thanks for asking this question! Your request for assistance using
37
+ Nokogiri will not go unanswered!
38
+
39
+ However, Nokogiri's Github Issues is reserved for reporting bugs or
40
+ submitting patches. If you ask your question on the mailing list, Team
41
+ Nokogiri promises someone will provide you with an answer in a timely
42
+ manner.
43
+
44
+ If you'd like to read up on Team Nokogiri's rationale for this policy,
45
+ please go to http://bit.ly/nokohelp.
46
+
47
+ Thank you so much for understanding! And thank you for using Nokogiri.