nokogiri 1.9.0.rc1 → 1.9.0

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 (137) hide show
  1. checksums.yaml +4 -4
  2. data/lib/nokogiri/css/parser.rb +61 -61
  3. data/lib/nokogiri/version.rb +1 -1
  4. metadata +4 -146
  5. data/.autotest +0 -22
  6. data/.cross_rubies +0 -8
  7. data/.editorconfig +0 -17
  8. data/.gemtest +0 -0
  9. data/.travis.yml +0 -63
  10. data/CHANGELOG.md +0 -1402
  11. data/CONTRIBUTING.md +0 -42
  12. data/C_CODING_STYLE.rdoc +0 -33
  13. data/Gemfile +0 -23
  14. data/Gemfile-libxml-ruby +0 -3
  15. data/Manifest.txt +0 -371
  16. data/ROADMAP.md +0 -111
  17. data/Rakefile +0 -358
  18. data/SECURITY.md +0 -19
  19. data/STANDARD_RESPONSES.md +0 -47
  20. data/Y_U_NO_GEMSPEC.md +0 -155
  21. data/appveyor.yml +0 -29
  22. data/build_all +0 -48
  23. data/patches/sort-patches-by-date +0 -25
  24. data/suppressions/README.txt +0 -1
  25. data/suppressions/nokogiri_ruby-2.supp +0 -10
  26. data/tasks/test.rb +0 -100
  27. data/test/css/test_nthiness.rb +0 -226
  28. data/test/css/test_parser.rb +0 -386
  29. data/test/css/test_tokenizer.rb +0 -215
  30. data/test/css/test_xpath_visitor.rb +0 -96
  31. data/test/decorators/test_slop.rb +0 -23
  32. data/test/files/2ch.html +0 -108
  33. data/test/files/GH_1042.html +0 -18
  34. data/test/files/address_book.rlx +0 -12
  35. data/test/files/address_book.xml +0 -10
  36. data/test/files/atom.xml +0 -344
  37. data/test/files/bar/bar.xsd +0 -4
  38. data/test/files/bogus.xml +0 -0
  39. data/test/files/dont_hurt_em_why.xml +0 -422
  40. data/test/files/encoding.html +0 -82
  41. data/test/files/encoding.xhtml +0 -84
  42. data/test/files/exslt.xml +0 -8
  43. data/test/files/exslt.xslt +0 -35
  44. data/test/files/foo/foo.xsd +0 -4
  45. data/test/files/metacharset.html +0 -10
  46. data/test/files/namespace_pressure_test.xml +0 -1684
  47. data/test/files/noencoding.html +0 -47
  48. data/test/files/po.xml +0 -32
  49. data/test/files/po.xsd +0 -66
  50. data/test/files/saml/saml20assertion_schema.xsd +0 -283
  51. data/test/files/saml/saml20protocol_schema.xsd +0 -302
  52. data/test/files/saml/xenc_schema.xsd +0 -146
  53. data/test/files/saml/xmldsig_schema.xsd +0 -318
  54. data/test/files/shift_jis.html +0 -10
  55. data/test/files/shift_jis.xml +0 -5
  56. data/test/files/shift_jis_no_charset.html +0 -9
  57. data/test/files/slow-xpath.xml +0 -25509
  58. data/test/files/snuggles.xml +0 -3
  59. data/test/files/staff.dtd +0 -10
  60. data/test/files/staff.xml +0 -59
  61. data/test/files/staff.xslt +0 -32
  62. data/test/files/test_document_url/bar.xml +0 -2
  63. data/test/files/test_document_url/document.dtd +0 -4
  64. data/test/files/test_document_url/document.xml +0 -6
  65. data/test/files/tlm.html +0 -851
  66. data/test/files/to_be_xincluded.xml +0 -2
  67. data/test/files/valid_bar.xml +0 -2
  68. data/test/files/xinclude.xml +0 -4
  69. data/test/helper.rb +0 -271
  70. data/test/html/sax/test_parser.rb +0 -168
  71. data/test/html/sax/test_parser_context.rb +0 -46
  72. data/test/html/sax/test_parser_text.rb +0 -163
  73. data/test/html/sax/test_push_parser.rb +0 -87
  74. data/test/html/test_attributes.rb +0 -85
  75. data/test/html/test_builder.rb +0 -164
  76. data/test/html/test_document.rb +0 -722
  77. data/test/html/test_document_encoding.rb +0 -143
  78. data/test/html/test_document_fragment.rb +0 -310
  79. data/test/html/test_element_description.rb +0 -105
  80. data/test/html/test_named_characters.rb +0 -14
  81. data/test/html/test_node.rb +0 -212
  82. data/test/html/test_node_encoding.rb +0 -91
  83. data/test/namespaces/test_additional_namespaces_in_builder_doc.rb +0 -14
  84. data/test/namespaces/test_namespaces_aliased_default.rb +0 -24
  85. data/test/namespaces/test_namespaces_in_builder_doc.rb +0 -75
  86. data/test/namespaces/test_namespaces_in_cloned_doc.rb +0 -31
  87. data/test/namespaces/test_namespaces_in_created_doc.rb +0 -75
  88. data/test/namespaces/test_namespaces_in_parsed_doc.rb +0 -80
  89. data/test/namespaces/test_namespaces_preservation.rb +0 -31
  90. data/test/test_convert_xpath.rb +0 -135
  91. data/test/test_css_cache.rb +0 -47
  92. data/test/test_encoding_handler.rb +0 -48
  93. data/test/test_memory_leak.rb +0 -226
  94. data/test/test_nokogiri.rb +0 -138
  95. data/test/test_soap4r_sax.rb +0 -52
  96. data/test/test_xslt_transforms.rb +0 -314
  97. data/test/xml/node/test_save_options.rb +0 -28
  98. data/test/xml/node/test_subclass.rb +0 -44
  99. data/test/xml/sax/test_parser.rb +0 -402
  100. data/test/xml/sax/test_parser_context.rb +0 -115
  101. data/test/xml/sax/test_parser_text.rb +0 -202
  102. data/test/xml/sax/test_push_parser.rb +0 -265
  103. data/test/xml/test_attr.rb +0 -96
  104. data/test/xml/test_attribute_decl.rb +0 -86
  105. data/test/xml/test_builder.rb +0 -353
  106. data/test/xml/test_c14n.rb +0 -180
  107. data/test/xml/test_cdata.rb +0 -54
  108. data/test/xml/test_comment.rb +0 -40
  109. data/test/xml/test_document.rb +0 -982
  110. data/test/xml/test_document_encoding.rb +0 -31
  111. data/test/xml/test_document_fragment.rb +0 -312
  112. data/test/xml/test_dtd.rb +0 -187
  113. data/test/xml/test_dtd_encoding.rb +0 -31
  114. data/test/xml/test_element_content.rb +0 -56
  115. data/test/xml/test_element_decl.rb +0 -73
  116. data/test/xml/test_entity_decl.rb +0 -122
  117. data/test/xml/test_entity_reference.rb +0 -262
  118. data/test/xml/test_namespace.rb +0 -96
  119. data/test/xml/test_node.rb +0 -1379
  120. data/test/xml/test_node_attributes.rb +0 -115
  121. data/test/xml/test_node_encoding.rb +0 -75
  122. data/test/xml/test_node_inheritance.rb +0 -32
  123. data/test/xml/test_node_reparenting.rb +0 -661
  124. data/test/xml/test_node_set.rb +0 -828
  125. data/test/xml/test_parse_options.rb +0 -64
  126. data/test/xml/test_processing_instruction.rb +0 -30
  127. data/test/xml/test_reader.rb +0 -620
  128. data/test/xml/test_reader_encoding.rb +0 -134
  129. data/test/xml/test_relax_ng.rb +0 -60
  130. data/test/xml/test_schema.rb +0 -142
  131. data/test/xml/test_syntax_error.rb +0 -36
  132. data/test/xml/test_text.rb +0 -69
  133. data/test/xml/test_unparented_node.rb +0 -483
  134. data/test/xml/test_xinclude.rb +0 -83
  135. data/test/xml/test_xpath.rb +0 -470
  136. data/test/xslt/test_custom_functions.rb +0 -133
  137. data/test/xslt/test_exception_handling.rb +0 -37
@@ -1,19 +0,0 @@
1
- # Security and Vulnerability Reporting
2
-
3
- The Nokogiri Core Contributors take security very seriously and investigate all reported vulnerabilities.
4
-
5
- If you would like to report a vulnerablity or have a security concern regarding Nokogiri or how Nokogiri is using any of its underlying platform-specific libraries (such as libxml2 or xerces), please [report it via HackerOne](https://hackerone.com/nokogiri/reports/new).
6
-
7
- Your report will be acknowledged within 24 hours, and you'll receive a more detailed response within 72 hours indicating next steps in handling your report.
8
-
9
- If you have not received a reply to your submission within 48 hours, there are a few steps you can take:
10
-
11
- * Contact the current security coordinator (Mike Dalessio <mike.dalessio@gmail.com>)
12
- * Contact the core contributor mailing list (nokogiri-core@googlegroups.com)
13
- * Join the [nokogiri-talk group](https://groups.google.com/d/forum/nokogiri-talk)
14
-
15
- Please note, the nokogiri-talk list is a public area. When escalating in that venue, please do not discuss your issue. Simply say that you're trying to get a hold of someone from the core team.
16
-
17
- The information you share with the Nokogiri Core Contributors as part of this process will be kept confidential within the team, unless or until we need to share information upstream with our dependent libraries' core teams, at which point we will notify you.
18
-
19
- If a vulnerability is first reported by you, we will credit you with the discovery in the public disclosure.
@@ -1,47 +0,0 @@
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.
@@ -1,155 +0,0 @@
1
- (note: this was originally a blog post published at http://blog.flavorjon.es/2012/03/y-u-no-gemspec.html)
2
-
3
- ## tl;dr
4
-
5
- 1. Team Nokogiri are not 10-foot-tall code-crunching robots, so `master` is usually unstable.
6
- 2. Unstable code can corrupt your data and crash your application, which would make everybody look bad.
7
- 3. Therefore, the _risk_ associated with using unstable code is severe; for you _and_ for Team Nokogiri.
8
- 4. The absence of a gemspec is a risk mitigation tactic.
9
- 5. You can always ask for an RC release.
10
-
11
-
12
- ## Why Isn't There a Gemspec!?
13
-
14
- OHAI! Thank you for asking this question!
15
-
16
- Team Nokogiri gets asked this pretty frequently. Just a sample from
17
- the historical record:
18
-
19
- * [Issue #274](https://github.com/sparklemotion/nokogiri/issues/274)
20
- * [Issue #371](https://github.com/sparklemotion/nokogiri/issues/371)
21
- * [A commit removing nokogiri.gemspec](https://github.com/sparklemotion/nokogiri/commit/7f17a643a05ca381d65131515b54d4a3a61ca2e1#commitcomment-667477)
22
- * [A nokogiri-talk thread](http://groups.google.com/group/nokogiri-talk/browse_thread/thread/4706b002e492d23f)
23
- * [Another nokogiri-talk thread](http://groups.google.com/group/nokogiri-talk/browse_thread/thread/0b201bb80ea3eea0)
24
-
25
- Sometimes people imply that we've forgotten, or that we don't know how to
26
- properly manage our codebase. Those people are super fun to respond
27
- to!
28
-
29
- We've gone back and forth a couple of times over the past few years,
30
- but the current policy of Team Nokogiri is to **not** provide a
31
- gemspec in the Github repo. This is a conscious choice, not an
32
- oversight.
33
-
34
-
35
- ## But You Didn't Answer the Question!
36
-
37
- Ah, I was hoping you wouldn't notice. Well, OK, let's do this, if
38
- you're serious about it.
39
-
40
- I'd like to start by talking about _risk_. Specifically, the risk
41
- associated with using a known-unstable version of Nokogiri.
42
-
43
-
44
- ### Risk
45
-
46
- One common way to evaluate the _risk_ of an incident is:
47
-
48
- risk = probability x impact
49
-
50
- You can read more about this on [the internets](http://en.wikipedia.org/wiki/Risk_Matrix).
51
-
52
- The _risk_ associated with a Nokogiri bug could be loosely defined by
53
- answering the questions:
54
-
55
- * "How likely is it that a bug exists?" (probability)
56
- * "How severe will the consequences of a bug be?" (impact)
57
-
58
-
59
- ### Probability
60
-
61
- The `master` branch should be considered unstable. Team Nokogiri are
62
- not 10-foot-tall code-crunching robots; we are humans. We make
63
- mistakes, and as a result, any arbitrary commit on `master` is likely
64
- to contain bugs.
65
-
66
- Just as an example, Nokogiri `master` was unstable for about five
67
- months between November 2011 and March 2012. It was unstable not
68
- because we were sloppy, or didn't care, but because the fixes were
69
- hard and unobvious.
70
-
71
- When we release Nokogiri, we test for memory leaks and invalid memory
72
- access on all kinds of platforms with many flavors of Ruby and lots of
73
- versions of libxml2. Because these tests are time-consuming, we don't
74
- run them on every commit. We run them often when preparing a release.
75
-
76
- If we're releasing Nokogiri, it means we think it's rock solid.
77
-
78
- And if we're not releasing it, it means there are probably bugs.
79
-
80
-
81
- ### Impact
82
-
83
- Nokogiri is a gem with native extensions. This means it's not pure
84
- Ruby -- there's C or Java code being compiled and run, which means
85
- that there's always a chance that the gem will crash your application,
86
- or worse. Possible outcomes include:
87
-
88
- * leaking memory
89
- * corrupting data
90
- * making benign code crash (due to memory corruption)
91
-
92
- So, then, a bug in a native extension can have much worse downside
93
- than you might think. It's not just going to do something unexpected;
94
- it's possibly going to do terrible, awful things to your application
95
- and data.
96
-
97
- **Nobody** wants that to happen. Especially Team Nokogiri.
98
-
99
-
100
- ### Risk, Redux
101
-
102
- So, if you accept the equation
103
-
104
- risk = probability x impact
105
-
106
- and you believe me when I say that:
107
-
108
- * the probablility of a bug in unreleased code is high, and
109
- * the impact of a bug is likely to be severe,
110
-
111
- then you should easily see that the _risk_ associated with a bug in
112
- Nokogiri is quite high.
113
-
114
- Part of Team Nokogiri's job is to try to mitigate this risk. We have a
115
- number of tactics that we use to accomplish this:
116
-
117
- * we respond quickly to bug reports, particularly when they are possible memory issues
118
- * we review each others' commits
119
- * we have a thorough test suite, and we test-drive new features
120
- * we discuss code design and issues on a core developer mailing list
121
- * we use valgrind to test for memory issues (leaks and invalid
122
- access) on multiple combinations of OS, libxml2 and Ruby
123
- * we package release candidates, and encourage devs to use them
124
- * **we do NOT commit a gemspec in our git repository**
125
-
126
- Yes, that's right, the absence of a gemspec is a risk mitigation
127
- tactic. Not only does Team Nokogiri not want to imply support for
128
- `master`, we want to **actively discourage** people from using
129
- it. Because it's not stable.
130
-
131
-
132
- ## But I Want to Do It Anyway
133
-
134
- Another option, is to email the [nokogiri-talk
135
- list](http://groups.google.com/group/nokogiri-talk) and ask for a
136
- release candidate to be built. We're pretty accommodating if there's a
137
- bugfix that's a blocker for you. And if we can't release an RC, we'll
138
- tell you why.
139
-
140
- And in the end, nothing is stopping you from cloning the repo and
141
- generating a private gemspec. This is an extra step or two, but it has
142
- the benefit of making sure developers have thought through the costs
143
- and risks involved; and it tends to select for developers who know
144
- what they're doing.
145
-
146
-
147
- ## In Conclusion
148
-
149
- Team Nokogiri takes stability very seriously. We want everybody who
150
- uses Nokogiri to have a pleasant experience. And so we want to make
151
- sure that you're using the best software we can make.
152
-
153
- Please keep in mind that we're trying very hard to do the right thing
154
- for all Nokogiri users out there in Rubyland. Nokogiri loves you very
155
- much, and we hope you love it back.
@@ -1,29 +0,0 @@
1
- install:
2
- - SET PATH=C:\ruby%ruby_version%\bin;%PATH%
3
- - ps: |
4
- if ($env:ruby_version -like "*head*") {
5
- $(new-object net.webclient).DownloadFile("https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-head/rubyinstaller-$env:ruby_version.exe", "$pwd/ruby-setup.exe")
6
- cmd /c ruby-setup.exe /verysilent /dir=C:/Ruby$env:ruby_version
7
- }
8
- - ruby --version
9
- - gem --version
10
- - gem install bundler --conservative
11
- - bundle install
12
-
13
- build: off
14
-
15
- test_script:
16
- - bundle exec rake -rdevkit
17
-
18
- environment:
19
- matrix:
20
- - ruby_version: head-x64
21
- - ruby_version: 24
22
- - ruby_version: 23-x64
23
- - ruby_version: 22
24
- - ruby_version: 21-x64
25
- - ruby_version: 200
26
-
27
- matrix:
28
- allow_failures:
29
- - ruby_version: head
data/build_all DELETED
@@ -1,48 +0,0 @@
1
- #! /usr/bin/env bash
2
- #
3
- # script to build gems for all relevant platforms:
4
- # - MRI et al (standard gem)
5
- # - windows (x86-mingw32 and x64-mingw32)
6
- # - jruby
7
- #
8
-
9
- # Load RVM into a shell session *as a function*
10
- if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
11
- source "$HOME/.rvm/scripts/rvm"
12
- elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then
13
- source "/usr/local/rvm/scripts/rvm"
14
- else
15
- echo "ERROR: An RVM installation was not found.\n"
16
- fi
17
-
18
- set -o errexit
19
-
20
- # check that we have the latest jruby
21
- rvm use jruby
22
- rvm use ruby
23
-
24
- rm -rf tmp pkg
25
- bundle exec rake clean clobber
26
-
27
- # holding pen
28
- rm -rf gems
29
- mkdir -p gems
30
-
31
- # windows
32
- bundle exec rake gem:windows
33
- cp -v pkg/nokogiri*{x86,x64}-mingw32*.gem gems
34
-
35
- # MRI
36
- bundle exec rake clean
37
- bundle exec rake gem
38
- cp -v pkg/nokogiri*.gem gems
39
-
40
- # jruby
41
- bundle exec rake clean clobber
42
- bundle exec rake generate
43
-
44
- rvm use jruby
45
- gem install bundler --conservative
46
- bundle install --quiet --local || bundle install
47
- bundle exec ruby -S rake gem
48
- cp -v pkg/nokogiri*java.gem gems
@@ -1,25 +0,0 @@
1
- #! /usr/bin/env ruby
2
-
3
- require "date"
4
-
5
- dir = ARGV[0] || raise("ERROR: arg1 must be dir")
6
-
7
- Dir.chdir dir
8
-
9
- files_and_times = {}
10
- Dir["*.patch"].sort.each do |filename|
11
- dateline = `cat #{filename} | grep "Date:"`
12
- datestr = dateline.split("Date:").last.strip
13
- time = DateTime.parse datestr
14
- files_and_times[filename] = time
15
- end
16
-
17
- count = 0
18
- files_and_times.sort_by {|k,v| v}.each do |filename, time|
19
- count += 1
20
- _, patch_name = filename.split("-", 2)
21
- new_filename = sprintf("%4.4d-%s", count, patch_name)
22
- printf "mv -f %s %s # %s\n", filename, new_filename, time
23
- end
24
-
25
- STDERR.print "\n**\n** REMEMBER TO UPDATE THE Manifest.txt FILE\n**\n"
@@ -1 +0,0 @@
1
- This directory contains valgrind suppression files generated by the hoe-debugging gem.
@@ -1,10 +0,0 @@
1
- {
2
- <insert_a_suppression_name_here>
3
- Memcheck:Free
4
- fun:free
5
- fun:__libc_freeres
6
- fun:_vgnU_freeres
7
- fun:__run_exit_handlers
8
- fun:exit
9
- fun:(below main)
10
- }
@@ -1,100 +0,0 @@
1
- namespace :test do
2
- desc "run test suite with aggressive GC"
3
- task :gc => :build do
4
- ENV['NOKOGIRI_GC'] = "true"
5
- Rake::Task["test"].invoke
6
- end
7
-
8
- task :installed do
9
- ENV['RUBY_FLAGS'] = "-w -Itest:."
10
- sh 'rake test'
11
- end
12
-
13
- desc "find call-seq in the rdoc"
14
- task :rdoc_call_seq => 'docs' do
15
- Dir['doc/**/*.html'].each { |docfile|
16
- next if docfile =~ /\.src/
17
- puts "FAIL: #{docfile}" if File.read(docfile) =~ /call-seq/
18
- }
19
- end
20
-
21
- desc "find all undocumented things"
22
- task :rdoc => 'docs' do
23
- base = File.expand_path(File.join(File.dirname(__FILE__), '..', 'doc'))
24
- require 'test/unit'
25
- test = Class.new(Test::Unit::TestCase)
26
- Dir["#{base}/**/*.html"].each { |docfile|
27
- test.class_eval(<<-eotest)
28
- def test_#{docfile.sub("#{base}/", '').gsub(/[\/\.-]/, '_')}
29
- assert_no_match(
30
- /Not documented/,
31
- File.read('#{docfile}'),
32
- '#{docfile} has undocumented things'
33
- )
34
- end
35
- eotest
36
- }
37
- end
38
-
39
- desc "Test against multiple versions of libxml2 (MULTIXML2_DIR=directory)"
40
- task :multixml2 do
41
- MULTI_XML = File.join(ENV['HOME'], '.multixml2')
42
- unless File.exists?(MULTI_XML)
43
- %w{ versions install build }.each { |x|
44
- FileUtils.mkdir_p(File.join(MULTI_XML, x))
45
- }
46
- Dir.chdir File.join(MULTI_XML, 'versions') do
47
- require 'net/ftp'
48
- puts "Contacting xmlsoft.org ..."
49
- ftp = Net::FTP.new('xmlsoft.org')
50
- ftp.login('anonymous', 'anonymous')
51
- ftp.chdir('libxml2')
52
- ftp.list('libxml2-2.*.tar.gz').each do |x|
53
- file = x[/[^\s]*$/]
54
- puts "Downloading #{file}"
55
- ftp.getbinaryfile(file)
56
- end
57
- end
58
- end
59
-
60
- # Build any libxml2 versions in $HOME/.multixml2/versions that
61
- # haven't been built yet
62
- Dir[File.join(MULTI_XML, 'versions','*.tar.gz')].each do |f|
63
- filename = File.basename(f, '.tar.gz')
64
-
65
- install_dir = File.join(MULTI_XML, 'install', filename)
66
- next if File.exists?(install_dir)
67
-
68
- Dir.chdir File.join(MULTI_XML, 'versions') do
69
- system "tar zxvf #{f} -C #{File.join(MULTI_XML, 'build')}"
70
- end
71
-
72
- Dir.chdir File.join(MULTI_XML, 'build', filename) do
73
- system "./configure --without-http --prefix=#{install_dir}"
74
- system "make && make install"
75
- end
76
- end
77
-
78
- test_results = {}
79
- libxslt = Dir[File.join(MULTI_XML, 'install', 'libxslt*')].first
80
-
81
- directories = ENV['MULTIXML2_DIR'] ? [ENV['MULTIXML2_DIR']] : Dir[File.join(MULTI_XML, 'install', '*')]
82
- directories.sort.reverse_each do |xml2_version|
83
- next unless xml2_version =~ /libxml2/
84
- extopts = "--with-xml2-include=#{xml2_version}/include/libxml2 --with-xml2-lib=#{xml2_version}/lib --with-xslt-dir=#{libxslt} --with-iconv-dir=/usr"
85
- cmd = "#{$0} clean test EXTOPTS='#{extopts}' LD_LIBRARY_PATH='#{xml2_version}/lib'"
86
-
87
- version = File.basename(xml2_version)
88
- result = system(cmd)
89
- test_results[version] = {
90
- :result => result,
91
- :cmd => cmd
92
- }
93
- end
94
- test_results.sort_by { |k,v| k }.each do |k,v|
95
- passed = v[:result]
96
- puts "#{k}: #{passed ? 'PASS' : 'FAIL'}"
97
- puts "repro: #{v[:cmd]}" unless passed
98
- end
99
- end
100
- end
@@ -1,226 +0,0 @@
1
- require "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 class="a">bold2 </b>
30
- <em class="a">emphasis1 </em>
31
- <i>italic2 </i>
32
- <p>para1 </p>
33
- <b class="a">bold3 </b>
34
- </div>
35
- <div>
36
- <i class="b">italic3 </i>
37
- <em>emphasis2 </em>
38
- <i class="b">italic4 </i>
39
- <em>emphasis3 </em>
40
- <i class="c">italic5 </i>
41
- <span><i class="b">italic6 </i></span>
42
- <i>italic7 </i>
43
- </div>
44
- <div>
45
- <p>para2 </p>
46
- <p>para3 </p>
47
- </div>
48
- <div>
49
- <p>para4 </p>
50
- </div>
51
-
52
- <div>
53
- <h2></h2>
54
- <h1 class='c'>header1 </h1>
55
- <h2></h2>
56
- </div>
57
- <div>
58
- <h1 class='c'>header2 </h1>
59
- <h1 class='c'>header3 </h1>
60
- </div>
61
- <div>
62
- <h1 class='c'>header4</h1>
63
- </div>
64
-
65
- <p class='empty'></p>
66
- <p class='not-empty'><b></b></p>
67
- </html>
68
- EOF
69
- @parser = Nokogiri.HTML doc
70
- end
71
-
72
-
73
- def test_even
74
- assert_result_rows [2,4,6,8,10,12,14], @parser.search("table//tr:nth(even)")
75
- end
76
-
77
- def test_odd
78
- assert_result_rows [1,3,5,7,9,11,13], @parser.search("table//tr:nth(odd)")
79
- end
80
-
81
- def test_n
82
- assert_result_rows((1..14).to_a, @parser.search("table//tr:nth(n)"))
83
- end
84
-
85
- def test_2n
86
- assert_equal @parser.search("table//tr:nth(even)").inner_text, @parser.search("table//tr:nth(2n)").inner_text
87
- end
88
-
89
- def test_2np1
90
- assert_equal @parser.search("table//tr:nth(odd)").inner_text, @parser.search("table//tr:nth(2n+1)").inner_text
91
- end
92
-
93
- def test_4np3
94
- assert_result_rows [3,7,11], @parser.search("table//tr:nth(4n+3)")
95
- end
96
-
97
- def test_3np4
98
- assert_result_rows [4,7,10,13], @parser.search("table//tr:nth(3n+4)")
99
- end
100
-
101
- def test_mnp3
102
- assert_result_rows [1,2,3], @parser.search("table//tr:nth(-n+3)")
103
- end
104
-
105
- def test_4nm1
106
- assert_result_rows [3,7,11], @parser.search("table//tr:nth(4n-1)")
107
- end
108
-
109
- def test_np3
110
- assert_result_rows [3,4,5,6,7,8,9,10,11,12,13,14], @parser.search("table//tr:nth(n+3)")
111
- end
112
-
113
- def test_first
114
- assert_result_rows [1], @parser.search("table//tr:first")
115
- assert_result_rows [1], @parser.search("table//tr:first()")
116
- end
117
-
118
- def test_last
119
- assert_result_rows [14], @parser.search("table//tr:last")
120
- assert_result_rows [14], @parser.search("table//tr:last()")
121
- end
122
-
123
- def test_first_child
124
- assert_result_rows [1], @parser.search("div/b:first-child"), "bold"
125
- assert_result_rows [1], @parser.search("table//tr:first-child")
126
- assert_result_rows [2,4], @parser.search("div/h1.c:first-child"), "header"
127
- end
128
-
129
- def test_last_child
130
- assert_result_rows [3], @parser.search("div/b:last-child"), "bold"
131
- assert_result_rows [14], @parser.search("table//tr:last-child")
132
- assert_result_rows [3,4], @parser.search("div/h1.c:last-child"), "header"
133
- end
134
-
135
- def test_nth_child
136
- assert_result_rows [2], @parser.search("div/b:nth-child(3)"), "bold"
137
- assert_result_rows [5], @parser.search("table//tr:nth-child(5)")
138
- assert_result_rows [1,3], @parser.search("div/h1.c:nth-child(2)"), "header"
139
- assert_result_rows [3,4], @parser.search("div/i.b:nth-child(2n+1)"), "italic"
140
- end
141
-
142
- def test_first_of_type
143
- assert_result_rows [1], @parser.search("table//tr:first-of-type")
144
- assert_result_rows [1], @parser.search("div/b:first-of-type"), "bold"
145
- assert_result_rows [2], @parser.search("div/b.a:first-of-type"), "bold"
146
- assert_result_rows [3], @parser.search("div/i.b:first-of-type"), "italic"
147
- end
148
-
149
- def test_last_of_type
150
- assert_result_rows [14], @parser.search("table//tr:last-of-type")
151
- assert_result_rows [3], @parser.search("div/b:last-of-type"), "bold"
152
- assert_result_rows [2,7], @parser.search("div/i:last-of-type"), "italic"
153
- assert_result_rows [2,6,7], @parser.search("div i:last-of-type"), "italic"
154
- assert_result_rows [4], @parser.search("div/i.b:last-of-type"), "italic"
155
- end
156
-
157
- def test_nth_of_type
158
- assert_result_rows [1], @parser.search("div/b:nth-of-type(1)"), "bold"
159
- assert_result_rows [2], @parser.search("div/b:nth-of-type(2)"), "bold"
160
- assert_result_rows [2], @parser.search("div/.a:nth-of-type(1)"), "bold"
161
- assert_result_rows [2,4,7], @parser.search("div i:nth-of-type(2n)"), "italic"
162
- assert_result_rows [1,3,5,6], @parser.search("div i:nth-of-type(2n+1)"), "italic"
163
- assert_result_rows [1], @parser.search("div .a:nth-of-type(2n)"), "emphasis"
164
- assert_result_rows [2,3], @parser.search("div .a:nth-of-type(2n+1)"), "bold"
165
- end
166
-
167
- def test_nth_last_of_type
168
- assert_result_rows [14], @parser.search("table//tr:nth-last-of-type(1)")
169
- assert_result_rows [12], @parser.search("table//tr:nth-last-of-type(3)")
170
- assert_result_rows [2,6,7], @parser.search("div i:nth-last-of-type(1)"), "italic"
171
- assert_result_rows [1,5], @parser.search("div i:nth-last-of-type(2)"), "italic"
172
- assert_result_rows [4], @parser.search("div/i.b:nth-last-of-type(1)"), "italic"
173
- assert_result_rows [3], @parser.search("div/i.b:nth-last-of-type(2)"), "italic"
174
- end
175
-
176
- def test_only_of_type
177
- assert_result_rows [1,4], @parser.search("div/p:only-of-type"), "para"
178
- assert_result_rows [5], @parser.search("div/i.c:only-of-type"), "italic"
179
- end
180
-
181
- def test_only_child
182
- assert_result_rows [4], @parser.search("div/p:only-child"), "para"
183
- assert_result_rows [4], @parser.search("div/h1.c:only-child"), "header"
184
- end
185
-
186
- def test_empty
187
- result = @parser.search("p:empty")
188
- assert_equal 1, result.size, "unexpected number of rows returned: '#{result.inner_text}'"
189
- assert_equal 'empty', result.first['class']
190
- end
191
-
192
- def test_parent
193
- result = @parser.search("p:parent")
194
- assert_equal 5, result.size
195
- 0.upto(3) do |j|
196
- assert_equal "para#{j+1} ", result[j].inner_text
197
- end
198
- assert_equal "not-empty", result[4]['class']
199
- end
200
-
201
- def test_siblings
202
- doc = <<-EOF
203
- <html><body><div>
204
- <p id="1">p1 </p>
205
- <p id="2">p2 </p>
206
- <p id="3">p3 </p>
207
- <p id="4">p4 </p>
208
- <p id="5">p5 </p>
209
- EOF
210
- parser = Nokogiri.HTML doc
211
- assert_equal 2, parser.search("#3 ~ p").size
212
- assert_equal "p4 p5 ", parser.search("#3 ~ p").inner_text
213
- assert_equal 0, parser.search("#5 ~ p").size
214
-
215
- assert_equal 1, parser.search("#3 + p").size
216
- assert_equal "p4 ", parser.search("#3 + p").inner_text
217
- assert_equal 0, parser.search("#5 + p").size
218
- end
219
-
220
- def assert_result_rows intarray, result, word="row"
221
- assert_equal intarray.size, result.size, "unexpected number of rows returned: '#{result.inner_text}'"
222
- assert_equal intarray.map{|j| "#{word}#{j}"}.join(' '), result.inner_text.strip, result.inner_text
223
- end
224
- end
225
- end
226
- end