nokogiri 1.6.5-java → 1.6.6.1-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of nokogiri might be problematic. Click here for more details.
- checksums.yaml +4 -4
 - data/.cross_rubies +5 -0
 - data/.travis.yml +10 -20
 - data/CHANGELOG.ja.rdoc +28 -1
 - data/CHANGELOG.rdoc +28 -1
 - data/Gemfile +1 -1
 - data/Manifest.txt +5 -1
 - data/README.ja.rdoc +10 -9
 - data/README.rdoc +6 -9
 - data/ROADMAP.md +15 -3
 - data/Rakefile +1 -3
 - data/bin/nokogiri +48 -8
 - data/ext/java/nokogiri/HtmlSaxParserContext.java +1 -1
 - data/ext/java/nokogiri/HtmlSaxPushParser.java +244 -0
 - data/ext/java/nokogiri/NokogiriService.java +9 -0
 - data/ext/java/nokogiri/XmlComment.java +2 -0
 - data/ext/java/nokogiri/XmlNode.java +57 -30
 - data/ext/java/nokogiri/XmlSyntaxError.java +11 -9
 - data/ext/nokogiri/extconf.rb +18 -3
 - data/ext/nokogiri/xml_comment.c +17 -2
 - data/ext/nokogiri/xml_node.c +66 -6
 - data/ext/nokogiri/xml_syntax_error.c +4 -0
 - data/ext/nokogiri/xml_syntax_error.h +1 -0
 - data/lib/nokogiri.rb +2 -2
 - data/lib/nokogiri/decorators/slop.rb +7 -8
 - data/lib/nokogiri/html/document_fragment.rb +0 -2
 - data/lib/nokogiri/html/sax/push_parser.rb +22 -2
 - data/lib/nokogiri/nokogiri.jar +0 -0
 - data/lib/nokogiri/version.rb +1 -1
 - data/lib/nokogiri/xml.rb +1 -0
 - data/lib/nokogiri/xml/document.rb +4 -4
 - data/lib/nokogiri/xml/document_fragment.rb +39 -2
 - data/lib/nokogiri/xml/node.rb +11 -181
 - data/lib/nokogiri/xml/node_set.rb +41 -85
 - data/lib/nokogiri/xml/searchable.rb +221 -0
 - data/ports/patches/sort-patches-by-date +25 -0
 - data/test/css/test_nthiness.rb +1 -1
 - data/test/html/sax/test_push_parser.rb +87 -0
 - data/test/html/test_document.rb +20 -5
 - data/test/html/test_document_fragment.rb +25 -0
 - data/test/xml/test_attr.rb +5 -2
 - data/test/xml/test_builder.rb +27 -1
 - data/test/xml/test_comment.rb +11 -0
 - data/test/xml/test_document.rb +34 -0
 - data/test/xml/test_document_fragment.rb +40 -9
 - data/test/xml/test_namespace.rb +1 -0
 - data/test/xml/test_node.rb +37 -1
 - data/test/xml/test_node_set.rb +56 -36
 - data/test/xml/test_xpath.rb +65 -19
 - data/test_all +11 -1
 - metadata +12 -7
 - data/tasks/nokogiri.org.rb +0 -24
 
    
        data/test/html/test_document.rb
    CHANGED
    
    | 
         @@ -355,7 +355,7 @@ eohtml 
     | 
|
| 
       355 
355 
     | 
    
         
             
                    File.open(HTML_FILE, 'rb') { |f| temp_html_file.write f.read }
         
     | 
| 
       356 
356 
     | 
    
         
             
                    temp_html_file.close
         
     | 
| 
       357 
357 
     | 
    
         
             
                    temp_html_file.open
         
     | 
| 
       358 
     | 
    
         
            -
                    assert_equal Nokogiri::HTML.parse(File.read(HTML_FILE)).xpath('//div/a').length, 
     | 
| 
      
 358 
     | 
    
         
            +
                    assert_equal Nokogiri::HTML.parse(File.read(HTML_FILE)).xpath('//div/a').length,
         
     | 
| 
       359 
359 
     | 
    
         
             
                      Nokogiri::HTML.parse(temp_html_file).xpath('//div/a').length
         
     | 
| 
       360 
360 
     | 
    
         
             
                  end
         
     | 
| 
       361 
361 
     | 
    
         | 
| 
         @@ -450,7 +450,7 @@ eohtml 
     | 
|
| 
       450 
450 
     | 
    
         
             
                    assert_equal "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd", html.internal_subset.system_id
         
     | 
| 
       451 
451 
     | 
    
         
             
                    assert_equal "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">", html.to_s[0,97]
         
     | 
| 
       452 
452 
     | 
    
         
             
                  end
         
     | 
| 
       453 
     | 
    
         
            -
             
     | 
| 
      
 453 
     | 
    
         
            +
             
     | 
| 
       454 
454 
     | 
    
         
             
                  def test_content_size
         
     | 
| 
       455 
455 
     | 
    
         
             
                    html = Nokogiri::HTML("<div>\n</div>")
         
     | 
| 
       456 
456 
     | 
    
         
             
                    assert_equal 1, html.content.size
         
     | 
| 
         @@ -613,15 +613,30 @@ eohtml 
     | 
|
| 
       613 
613 
     | 
    
         
             
                    assert_equal "", Nokogiri::HTML.parse("").text
         
     | 
| 
       614 
614 
     | 
    
         
             
                  end
         
     | 
| 
       615 
615 
     | 
    
         | 
| 
       616 
     | 
    
         
            -
                  def  
     | 
| 
      
 616 
     | 
    
         
            +
                  def test_capturing_nonparse_errors_during_document_clone
         
     | 
| 
       617 
617 
     | 
    
         
             
                    # see https://github.com/sparklemotion/nokogiri/issues/1196 for background
         
     | 
| 
       618 
618 
     | 
    
         
             
                    original = Nokogiri::HTML.parse("<div id='unique'></div><div id='unique'></div>")
         
     | 
| 
       619 
     | 
    
         
            -
                    original_errors = original.errors
         
     | 
| 
      
 619 
     | 
    
         
            +
                    original_errors = original.errors.dup
         
     | 
| 
       620 
620 
     | 
    
         | 
| 
       621 
621 
     | 
    
         
             
                    copy = original.dup
         
     | 
| 
       622 
622 
     | 
    
         
             
                    assert_equal original_errors, copy.errors
         
     | 
| 
       623 
623 
     | 
    
         
             
                  end
         
     | 
| 
      
 624 
     | 
    
         
            +
             
     | 
| 
      
 625 
     | 
    
         
            +
                  def test_capturing_nonparse_errors_during_node_copy_between_docs
         
     | 
| 
      
 626 
     | 
    
         
            +
                    skip("JRuby HTML parse errors are different than libxml2's") if Nokogiri.jruby?
         
     | 
| 
      
 627 
     | 
    
         
            +
             
     | 
| 
      
 628 
     | 
    
         
            +
                    doc1 = Nokogiri::HTML("<div id='unique'>one</div>")
         
     | 
| 
      
 629 
     | 
    
         
            +
                    doc2 = Nokogiri::HTML("<div id='unique'>two</div>")
         
     | 
| 
      
 630 
     | 
    
         
            +
                    node1 = doc1.at_css("#unique")
         
     | 
| 
      
 631 
     | 
    
         
            +
                    node2 = doc2.at_css("#unique")
         
     | 
| 
      
 632 
     | 
    
         
            +
             
     | 
| 
      
 633 
     | 
    
         
            +
                    original_errors = doc1.errors.dup
         
     | 
| 
      
 634 
     | 
    
         
            +
             
     | 
| 
      
 635 
     | 
    
         
            +
                    node1.add_child node2
         
     | 
| 
      
 636 
     | 
    
         
            +
             
     | 
| 
      
 637 
     | 
    
         
            +
                    assert_equal original_errors.length+1, doc1.errors.length
         
     | 
| 
      
 638 
     | 
    
         
            +
                    assert_match(/ID unique already defined/, doc1.errors.last.to_s)
         
     | 
| 
      
 639 
     | 
    
         
            +
                  end
         
     | 
| 
       624 
640 
     | 
    
         
             
                end
         
     | 
| 
       625 
641 
     | 
    
         
             
              end
         
     | 
| 
       626 
642 
     | 
    
         
             
            end
         
     | 
| 
       627 
     | 
    
         
            -
             
     | 
| 
         @@ -267,6 +267,31 @@ module Nokogiri 
     | 
|
| 
       267 
267 
     | 
    
         
             
                    assert frag.errors.any?{|err| err.to_s =~ /Tag hello invalid/}, "errors should be on the context node's document"
         
     | 
| 
       268 
268 
     | 
    
         
             
                    assert frag.errors.none?{|err| err.to_s =~ /jimmy/}, "errors should not include pre-existing document errors"
         
     | 
| 
       269 
269 
     | 
    
         
             
                  end
         
     | 
| 
      
 270 
     | 
    
         
            +
             
     | 
| 
      
 271 
     | 
    
         
            +
                  def test_capturing_nonparse_errors_during_fragment_clone
         
     | 
| 
      
 272 
     | 
    
         
            +
                    # see https://github.com/sparklemotion/nokogiri/issues/1196 for background
         
     | 
| 
      
 273 
     | 
    
         
            +
                    original = Nokogiri::HTML.fragment("<div id='unique'></div>")
         
     | 
| 
      
 274 
     | 
    
         
            +
                    original_errors = original.errors.dup
         
     | 
| 
      
 275 
     | 
    
         
            +
             
     | 
| 
      
 276 
     | 
    
         
            +
                    copy = original.dup
         
     | 
| 
      
 277 
     | 
    
         
            +
                    assert_equal original_errors, copy.errors
         
     | 
| 
      
 278 
     | 
    
         
            +
                  end
         
     | 
| 
      
 279 
     | 
    
         
            +
             
     | 
| 
      
 280 
     | 
    
         
            +
                  def test_capturing_nonparse_errors_during_node_copy_between_fragments
         
     | 
| 
      
 281 
     | 
    
         
            +
                    skip("JRuby HTML parse errors are different than libxml2's") if Nokogiri.jruby?
         
     | 
| 
      
 282 
     | 
    
         
            +
             
     | 
| 
      
 283 
     | 
    
         
            +
                    frag1 = Nokogiri::HTML.fragment("<div id='unique'>one</div>")
         
     | 
| 
      
 284 
     | 
    
         
            +
                    frag2 = Nokogiri::HTML.fragment("<div id='unique'>two</div>")
         
     | 
| 
      
 285 
     | 
    
         
            +
                    node1 = frag1.at_css("#unique")
         
     | 
| 
      
 286 
     | 
    
         
            +
                    node2 = frag2.at_css("#unique")
         
     | 
| 
      
 287 
     | 
    
         
            +
             
     | 
| 
      
 288 
     | 
    
         
            +
                    original_errors = frag1.errors.dup
         
     | 
| 
      
 289 
     | 
    
         
            +
             
     | 
| 
      
 290 
     | 
    
         
            +
                    node1.add_child node2 # we should also not see an error on stderr
         
     | 
| 
      
 291 
     | 
    
         
            +
             
     | 
| 
      
 292 
     | 
    
         
            +
                    assert_equal original_errors.length+1, frag1.errors.length
         
     | 
| 
      
 293 
     | 
    
         
            +
                    assert_match(/ID unique already defined/, frag1.errors.last.to_s)
         
     | 
| 
      
 294 
     | 
    
         
            +
                  end
         
     | 
| 
       270 
295 
     | 
    
         
             
                end
         
     | 
| 
       271 
296 
     | 
    
         
             
              end
         
     | 
| 
       272 
297 
     | 
    
         
             
            end
         
     | 
    
        data/test/xml/test_attr.rb
    CHANGED
    
    | 
         @@ -27,12 +27,15 @@ module Nokogiri 
     | 
|
| 
       27 
27 
     | 
    
         
             
                    assert_equal "Y&ent1;", street.value
         
     | 
| 
       28 
28 
     | 
    
         
             
                  end
         
     | 
| 
       29 
29 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
                  def test_unlink
         
     | 
| 
      
 30 
     | 
    
         
            +
                  def test_unlink # aliased as :remove
         
     | 
| 
       31 
31 
     | 
    
         
             
                    xml = Nokogiri::XML.parse(File.read(XML_FILE), XML_FILE)
         
     | 
| 
       32 
32 
     | 
    
         
             
                    address = xml.xpath('/staff/employee/address').first
         
     | 
| 
       33 
33 
     | 
    
         
             
                    assert_equal 'Yes', address['domestic']
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
                    attr = address.attribute_nodes.first
         
     | 
| 
      
 36 
     | 
    
         
            +
                    return_val = attr.unlink
         
     | 
| 
       35 
37 
     | 
    
         
             
                    assert_nil address['domestic']
         
     | 
| 
      
 38 
     | 
    
         
            +
                    assert_equal attr, return_val
         
     | 
| 
       36 
39 
     | 
    
         
             
                  end
         
     | 
| 
       37 
40 
     | 
    
         | 
| 
       38 
41 
     | 
    
         
             
                  def test_parsing_attribute_namespace
         
     | 
    
        data/test/xml/test_builder.rb
    CHANGED
    
    | 
         @@ -305,7 +305,33 @@ module Nokogiri 
     | 
|
| 
       305 
305 
     | 
    
         
             
                      builder.to_xml.gsub(/\n/, ''))
         
     | 
| 
       306 
306 
     | 
    
         
             
                  end
         
     | 
| 
       307 
307 
     | 
    
         | 
| 
       308 
     | 
    
         
            -
             
     | 
| 
      
 308 
     | 
    
         
            +
                  def test_builder_can_inherit_parent_namespace
         
     | 
| 
      
 309 
     | 
    
         
            +
                    builder = Nokogiri::XML::Builder.new
         
     | 
| 
      
 310 
     | 
    
         
            +
                    builder.products {
         
     | 
| 
      
 311 
     | 
    
         
            +
                      builder.parent.default_namespace = "foo"
         
     | 
| 
      
 312 
     | 
    
         
            +
                      builder.product {
         
     | 
| 
      
 313 
     | 
    
         
            +
                        builder.parent.default_namespace = nil
         
     | 
| 
      
 314 
     | 
    
         
            +
                      }
         
     | 
| 
      
 315 
     | 
    
         
            +
                    }
         
     | 
| 
      
 316 
     | 
    
         
            +
                    doc = builder.doc
         
     | 
| 
      
 317 
     | 
    
         
            +
                    ['product', 'products'].each do |n|
         
     | 
| 
      
 318 
     | 
    
         
            +
                      assert_equal doc.at_xpath("//*[local-name() = '#{n}']").namespace.href, 'foo'
         
     | 
| 
      
 319 
     | 
    
         
            +
                    end
         
     | 
| 
      
 320 
     | 
    
         
            +
                  end
         
     | 
| 
      
 321 
     | 
    
         
            +
             
     | 
| 
      
 322 
     | 
    
         
            +
                  def test_builder_can_handle_namespace_override
         
     | 
| 
      
 323 
     | 
    
         
            +
                    builder = Nokogiri::XML::Builder.new
         
     | 
| 
      
 324 
     | 
    
         
            +
                    builder.products('xmlns:foo' => 'bar') {
         
     | 
| 
      
 325 
     | 
    
         
            +
                      builder.product('xmlns:foo' => 'baz')
         
     | 
| 
      
 326 
     | 
    
         
            +
                    }
         
     | 
| 
      
 327 
     | 
    
         
            +
             
     | 
| 
      
 328 
     | 
    
         
            +
                    doc = builder.doc
         
     | 
| 
      
 329 
     | 
    
         
            +
                    assert_equal doc.at_xpath("//*[local-name() = 'product']").namespaces['xmlns:foo'], 'baz'
         
     | 
| 
      
 330 
     | 
    
         
            +
                    assert_equal doc.at_xpath("//*[local-name() = 'products']").namespaces['xmlns:foo'], 'bar'
         
     | 
| 
      
 331 
     | 
    
         
            +
                    assert_nil doc.at_xpath("//*[local-name() = 'products']").namespace
         
     | 
| 
      
 332 
     | 
    
         
            +
                  end
         
     | 
| 
      
 333 
     | 
    
         
            +
             
     | 
| 
      
 334 
     | 
    
         
            +
                  private
         
     | 
| 
       309 
335 
     | 
    
         | 
| 
       310 
336 
     | 
    
         
             
                  def namespaces_defined_on(node)
         
     | 
| 
       311 
337 
     | 
    
         
             
                    Hash[*node.namespace_definitions.collect{|n| ["xmlns:" + n.prefix, n.href]}.flatten]
         
     | 
    
        data/test/xml/test_comment.rb
    CHANGED
    
    | 
         @@ -19,6 +19,17 @@ module Nokogiri 
     | 
|
| 
       19 
19 
     | 
    
         
             
                    assert(!@xml.root.comment?)
         
     | 
| 
       20 
20 
     | 
    
         
             
                  end
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
      
 22 
     | 
    
         
            +
                  def test_passing_a_node_uses_the_node_document
         
     | 
| 
      
 23 
     | 
    
         
            +
                    comment = Nokogiri::XML::Comment.new(@xml.at_css("employee"), 'hello world')
         
     | 
| 
      
 24 
     | 
    
         
            +
                    assert_equal @xml, comment.document
         
     | 
| 
      
 25 
     | 
    
         
            +
                  end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  def test_passing_anything_else
         
     | 
| 
      
 28 
     | 
    
         
            +
                    assert_raises ArgumentError do
         
     | 
| 
      
 29 
     | 
    
         
            +
                      Nokogiri::XML::Comment.new("NOT A NOKOGIRI CLASS", 'hello world')
         
     | 
| 
      
 30 
     | 
    
         
            +
                    end
         
     | 
| 
      
 31 
     | 
    
         
            +
                  end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
       22 
33 
     | 
    
         
             
                  def test_many_comments
         
     | 
| 
       23 
34 
     | 
    
         
             
                    100.times {
         
     | 
| 
       24 
35 
     | 
    
         
             
                      Nokogiri::XML::Comment.new(@xml, 'hello world')
         
     | 
    
        data/test/xml/test_document.rb
    CHANGED
    
    | 
         @@ -701,6 +701,26 @@ module Nokogiri 
     | 
|
| 
       701 
701 
     | 
    
         
             
                    assert_equal 0, ns.length
         
     | 
| 
       702 
702 
     | 
    
         
             
                  end
         
     | 
| 
       703 
703 
     | 
    
         | 
| 
      
 704 
     | 
    
         
            +
                  def test_document_search_with_multiple_queries
         
     | 
| 
      
 705 
     | 
    
         
            +
                    xml = '<document>
         
     | 
| 
      
 706 
     | 
    
         
            +
                             <thing>
         
     | 
| 
      
 707 
     | 
    
         
            +
                               <div class="title">important thing</div>
         
     | 
| 
      
 708 
     | 
    
         
            +
                             </thing>
         
     | 
| 
      
 709 
     | 
    
         
            +
                             <thing>
         
     | 
| 
      
 710 
     | 
    
         
            +
                               <div class="content">stuff</div>
         
     | 
| 
      
 711 
     | 
    
         
            +
                             </thing>
         
     | 
| 
      
 712 
     | 
    
         
            +
                             <thing>
         
     | 
| 
      
 713 
     | 
    
         
            +
                               <p class="blah">more stuff</div>
         
     | 
| 
      
 714 
     | 
    
         
            +
                             </thing>
         
     | 
| 
      
 715 
     | 
    
         
            +
                           </document>'
         
     | 
| 
      
 716 
     | 
    
         
            +
                    document = Nokogiri::XML(xml)
         
     | 
| 
      
 717 
     | 
    
         
            +
                    assert_kind_of Nokogiri::XML::Document, document
         
     | 
| 
      
 718 
     | 
    
         
            +
             
     | 
| 
      
 719 
     | 
    
         
            +
                    assert_equal 3, document.xpath('.//div', './/p').length
         
     | 
| 
      
 720 
     | 
    
         
            +
                    assert_equal 3, document.css('.title', '.content', 'p').length
         
     | 
| 
      
 721 
     | 
    
         
            +
                    assert_equal 3, document.search('.//div', 'p.blah').length
         
     | 
| 
      
 722 
     | 
    
         
            +
                  end
         
     | 
| 
      
 723 
     | 
    
         
            +
             
     | 
| 
       704 
724 
     | 
    
         
             
                  def test_bad_xpath_raises_syntax_error
         
     | 
| 
       705 
725 
     | 
    
         
             
                    assert_raises(XML::XPath::SyntaxError) {
         
     | 
| 
       706 
726 
     | 
    
         
             
                      @xml.xpath('\\')
         
     | 
| 
         @@ -832,6 +852,13 @@ module Nokogiri 
     | 
|
| 
       832 
852 
     | 
    
         
             
                    assert_equal 1, doc.xpath("//a:foo").length
         
     | 
| 
       833 
853 
     | 
    
         
             
                    assert_equal 1, doc.xpath("//x:foo", "x" => "http://c.flavorjon.es/").length
         
     | 
| 
       834 
854 
     | 
    
         
             
                    assert_match %r{foo c:attr}, doc.to_xml
         
     | 
| 
      
 855 
     | 
    
         
            +
                    doc.at_xpath("//x:foo", "x" => "http://c.flavorjon.es/").tap do |node|
         
     | 
| 
      
 856 
     | 
    
         
            +
                      assert_equal nil,          node["attr"]
         
     | 
| 
      
 857 
     | 
    
         
            +
                      assert_equal "attr-value", node["c:attr"]
         
     | 
| 
      
 858 
     | 
    
         
            +
                      assert_equal nil,          node.attribute_with_ns("attr", nil)
         
     | 
| 
      
 859 
     | 
    
         
            +
                      assert_equal "attr-value", node.attribute_with_ns("attr", "http://c.flavorjon.es/").value
         
     | 
| 
      
 860 
     | 
    
         
            +
                      assert_equal "attr-value", node.attributes["attr"].value
         
     | 
| 
      
 861 
     | 
    
         
            +
                    end
         
     | 
| 
       835 
862 
     | 
    
         | 
| 
       836 
863 
     | 
    
         
             
                    doc.remove_namespaces!
         
     | 
| 
       837 
864 
     | 
    
         | 
| 
         @@ -842,6 +869,13 @@ module Nokogiri 
     | 
|
| 
       842 
869 
     | 
    
         
             
                    assert_equal 0, doc.xpath("//a:foo", namespaces).length
         
     | 
| 
       843 
870 
     | 
    
         
             
                    assert_equal 0, doc.xpath("//x:foo", "x" => "http://c.flavorjon.es/").length
         
     | 
| 
       844 
871 
     | 
    
         
             
                    assert_match %r{foo attr}, doc.to_xml
         
     | 
| 
      
 872 
     | 
    
         
            +
                    doc.at_xpath("//container/foo").tap do |node|
         
     | 
| 
      
 873 
     | 
    
         
            +
                      assert_equal "attr-value", node["attr"]
         
     | 
| 
      
 874 
     | 
    
         
            +
                      assert_equal nil,          node["c:attr"]
         
     | 
| 
      
 875 
     | 
    
         
            +
                      assert_equal "attr-value", node.attribute_with_ns("attr", nil).value
         
     | 
| 
      
 876 
     | 
    
         
            +
                      assert_equal nil,          node.attribute_with_ns("attr", "http://c.flavorjon.es/")
         
     | 
| 
      
 877 
     | 
    
         
            +
                      assert_equal "attr-value", node.attributes["attr"].value # doesn't change!
         
     | 
| 
      
 878 
     | 
    
         
            +
                    end
         
     | 
| 
       845 
879 
     | 
    
         
             
                  end
         
     | 
| 
       846 
880 
     | 
    
         | 
| 
       847 
881 
     | 
    
         
             
                  # issue #785
         
     | 
| 
         @@ -125,18 +125,49 @@ module Nokogiri 
     | 
|
| 
       125 
125 
     | 
    
         
             
                    fragment = Nokogiri::XML::Document.new.fragment(
         
     | 
| 
       126 
126 
     | 
    
         
             
                      '<div><p id="content">hi</p></div>'
         
     | 
| 
       127 
127 
     | 
    
         
             
                    )
         
     | 
| 
       128 
     | 
    
         
            -
                     
     | 
| 
       129 
     | 
    
         
            -
                     
     | 
| 
       130 
     | 
    
         
            -
             
     | 
| 
      
 128 
     | 
    
         
            +
                    expected = fragment.children.xpath('.//p')
         
     | 
| 
      
 129 
     | 
    
         
            +
                    assert_equal 1, expected.length
         
     | 
| 
      
 130 
     | 
    
         
            +
             
     | 
| 
      
 131 
     | 
    
         
            +
                    css          = fragment.children.css('p')
         
     | 
| 
      
 132 
     | 
    
         
            +
                    search_css   = fragment.children.search('p')
         
     | 
| 
      
 133 
     | 
    
         
            +
                    search_xpath = fragment.children.search('.//p')
         
     | 
| 
      
 134 
     | 
    
         
            +
                    assert_equal expected, css
         
     | 
| 
      
 135 
     | 
    
         
            +
                    assert_equal expected, search_css
         
     | 
| 
      
 136 
     | 
    
         
            +
                    assert_equal expected, search_xpath
         
     | 
| 
       131 
137 
     | 
    
         
             
                  end
         
     | 
| 
       132 
138 
     | 
    
         | 
| 
       133 
     | 
    
         
            -
                  def  
     | 
| 
       134 
     | 
    
         
            -
                    frag = Nokogiri::XML::Document.new.fragment '<p id="content"> 
     | 
| 
       135 
     | 
    
         
            -
             
     | 
| 
       136 
     | 
    
         
            -
                     
     | 
| 
       137 
     | 
    
         
            -
             
     | 
| 
      
 139 
     | 
    
         
            +
                  def test_fragment_search_three_ways
         
     | 
| 
      
 140 
     | 
    
         
            +
                    frag = Nokogiri::XML::Document.new.fragment '<p id="content">foo</p><p id="content">bar</p>'
         
     | 
| 
      
 141 
     | 
    
         
            +
                    expected = frag.xpath('./*[@id = "content"]')
         
     | 
| 
      
 142 
     | 
    
         
            +
                    assert_equal 2, expected.length
         
     | 
| 
      
 143 
     | 
    
         
            +
             
     | 
| 
      
 144 
     | 
    
         
            +
                    [
         
     | 
| 
      
 145 
     | 
    
         
            +
                      [:css, '#content'],
         
     | 
| 
      
 146 
     | 
    
         
            +
                      [:search, '#content'],
         
     | 
| 
      
 147 
     | 
    
         
            +
                      [:search, './*[@id = \'content\']'],
         
     | 
| 
      
 148 
     | 
    
         
            +
                    ].each do |method, query|
         
     | 
| 
      
 149 
     | 
    
         
            +
                      result = frag.send(method, query)
         
     | 
| 
      
 150 
     | 
    
         
            +
                      assert_equal(expected, result,
         
     | 
| 
      
 151 
     | 
    
         
            +
                        "fragment search with :#{method} using '#{query}' expected '#{expected}' got '#{result}'")
         
     | 
| 
      
 152 
     | 
    
         
            +
                    end
         
     | 
| 
      
 153 
     | 
    
         
            +
                  end
         
     | 
| 
       138 
154 
     | 
    
         | 
| 
       139 
     | 
    
         
            -
             
     | 
| 
      
 155 
     | 
    
         
            +
                  def test_fragment_search_with_multiple_queries
         
     | 
| 
      
 156 
     | 
    
         
            +
                    xml = '<thing>
         
     | 
| 
      
 157 
     | 
    
         
            +
                             <div class="title">important thing</div>
         
     | 
| 
      
 158 
     | 
    
         
            +
                           </thing>
         
     | 
| 
      
 159 
     | 
    
         
            +
                           <thing>
         
     | 
| 
      
 160 
     | 
    
         
            +
                             <div class="content">stuff</div>
         
     | 
| 
      
 161 
     | 
    
         
            +
                           </thing>
         
     | 
| 
      
 162 
     | 
    
         
            +
                           <thing>
         
     | 
| 
      
 163 
     | 
    
         
            +
                             <p class="blah">more stuff</div>
         
     | 
| 
      
 164 
     | 
    
         
            +
                           </thing>'
         
     | 
| 
      
 165 
     | 
    
         
            +
                    fragment = Nokogiri::XML.fragment(xml)
         
     | 
| 
      
 166 
     | 
    
         
            +
                    assert_kind_of Nokogiri::XML::DocumentFragment, fragment
         
     | 
| 
      
 167 
     | 
    
         
            +
             
     | 
| 
      
 168 
     | 
    
         
            +
                    assert_equal 3, fragment.xpath('.//div', './/p').length
         
     | 
| 
      
 169 
     | 
    
         
            +
                    assert_equal 3, fragment.css('.title', '.content', 'p').length
         
     | 
| 
      
 170 
     | 
    
         
            +
                    assert_equal 3, fragment.search('.//div', 'p.blah').length
         
     | 
| 
       140 
171 
     | 
    
         
             
                  end
         
     | 
| 
       141 
172 
     | 
    
         | 
| 
       142 
173 
     | 
    
         
             
                  def test_fragment_without_a_namespace_does_not_get_a_namespace
         
     | 
    
        data/test/xml/test_namespace.rb
    CHANGED
    
    | 
         @@ -69,6 +69,7 @@ module Nokogiri 
     | 
|
| 
       69 
69 
     | 
    
         
             
                  def test_remove_entity_namespace
         
     | 
| 
       70 
70 
     | 
    
         
             
                    s = %q{<?xml version='1.0'?><!DOCTYPE schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd" [<!ENTITY % p ''>]>}
         
     | 
| 
       71 
71 
     | 
    
         
             
                    Nokogiri::XML(s).remove_namespaces!
         
     | 
| 
      
 72 
     | 
    
         
            +
                    # TODO: we should probably assert something here. See commit 14d2f59.
         
     | 
| 
       72 
73 
     | 
    
         
             
                  end
         
     | 
| 
       73 
74 
     | 
    
         | 
| 
       74 
75 
     | 
    
         
             
                  def test_maintain_element_namespaces
         
     | 
    
        data/test/xml/test_node.rb
    CHANGED
    
    | 
         @@ -635,8 +635,17 @@ module Nokogiri 
     | 
|
| 
       635 
635 
     | 
    
         
             
                  def test_remove_attribute
         
     | 
| 
       636 
636 
     | 
    
         
             
                    address = @xml.xpath('/staff/employee/address').first
         
     | 
| 
       637 
637 
     | 
    
         
             
                    assert_equal 'Yes', address['domestic']
         
     | 
| 
       638 
     | 
    
         
            -
                    address. 
     | 
| 
      
 638 
     | 
    
         
            +
                    attr = address.attributes['domestic']
         
     | 
| 
      
 639 
     | 
    
         
            +
             
     | 
| 
      
 640 
     | 
    
         
            +
                    returned_attr = address.remove_attribute 'domestic'
         
     | 
| 
       639 
641 
     | 
    
         
             
                    assert_nil address['domestic']
         
     | 
| 
      
 642 
     | 
    
         
            +
                    assert_equal attr, returned_attr
         
     | 
| 
      
 643 
     | 
    
         
            +
                  end
         
     | 
| 
      
 644 
     | 
    
         
            +
             
     | 
| 
      
 645 
     | 
    
         
            +
                  def test_remove_attribute_when_not_found
         
     | 
| 
      
 646 
     | 
    
         
            +
                    address = @xml.xpath('/staff/employee/address').first
         
     | 
| 
      
 647 
     | 
    
         
            +
                    attr = address.remove_attribute 'not-an-attribute'
         
     | 
| 
      
 648 
     | 
    
         
            +
                    assert_nil attr
         
     | 
| 
       640 
649 
     | 
    
         
             
                  end
         
     | 
| 
       641 
650 
     | 
    
         | 
| 
       642 
651 
     | 
    
         
             
                  def test_attribute_setter_accepts_non_string
         
     | 
| 
         @@ -1192,6 +1201,33 @@ eoxml 
     | 
|
| 
       1192 
1201 
     | 
    
         
             
                    assert pi_node.processing_instruction?
         
     | 
| 
       1193 
1202 
     | 
    
         
             
                    assert ! div_node.processing_instruction?
         
     | 
| 
       1194 
1203 
     | 
    
         
             
                  end
         
     | 
| 
      
 1204 
     | 
    
         
            +
             
     | 
| 
      
 1205 
     | 
    
         
            +
                  def test_node_lang
         
     | 
| 
      
 1206 
     | 
    
         
            +
                    document = Nokogiri::XML <<-EOXML
         
     | 
| 
      
 1207 
     | 
    
         
            +
                      <root>
         
     | 
| 
      
 1208 
     | 
    
         
            +
                        <div class='english'  xml:lang='en'>
         
     | 
| 
      
 1209 
     | 
    
         
            +
                          <div class='english_child'>foo</div>
         
     | 
| 
      
 1210 
     | 
    
         
            +
                        </div>
         
     | 
| 
      
 1211 
     | 
    
         
            +
                        <div class='japanese' xml:lang='jp'>bar</div>
         
     | 
| 
      
 1212 
     | 
    
         
            +
                        <div class='unspecified'>bar</div>
         
     | 
| 
      
 1213 
     | 
    
         
            +
                      </root>
         
     | 
| 
      
 1214 
     | 
    
         
            +
                    EOXML
         
     | 
| 
      
 1215 
     | 
    
         
            +
                    assert_equal "en", document.at_css(".english").lang
         
     | 
| 
      
 1216 
     | 
    
         
            +
                    assert_equal "en", document.at_css(".english_child").lang
         
     | 
| 
      
 1217 
     | 
    
         
            +
                    assert_equal "jp", document.at_css(".japanese").lang
         
     | 
| 
      
 1218 
     | 
    
         
            +
                    assert_nil document.at_css(".unspecified").lang
         
     | 
| 
      
 1219 
     | 
    
         
            +
                  end
         
     | 
| 
      
 1220 
     | 
    
         
            +
             
     | 
| 
      
 1221 
     | 
    
         
            +
                  def test_set_node_lang
         
     | 
| 
      
 1222 
     | 
    
         
            +
                    document = Nokogiri::XML "<root><div class='subject'>foo</div></root>"
         
     | 
| 
      
 1223 
     | 
    
         
            +
                    subject = document.at_css(".subject")
         
     | 
| 
      
 1224 
     | 
    
         
            +
             
     | 
| 
      
 1225 
     | 
    
         
            +
                    subject.lang = "de"
         
     | 
| 
      
 1226 
     | 
    
         
            +
                    assert_equal "de", subject.lang
         
     | 
| 
      
 1227 
     | 
    
         
            +
             
     | 
| 
      
 1228 
     | 
    
         
            +
                    subject.lang = "fr"
         
     | 
| 
      
 1229 
     | 
    
         
            +
                    assert_equal "fr", subject.lang
         
     | 
| 
      
 1230 
     | 
    
         
            +
                  end
         
     | 
| 
       1195 
1231 
     | 
    
         
             
                end
         
     | 
| 
       1196 
1232 
     | 
    
         
             
              end
         
     | 
| 
       1197 
1233 
     | 
    
         
             
            end
         
     | 
    
        data/test/xml/test_node_set.rb
    CHANGED
    
    | 
         @@ -124,26 +124,54 @@ module Nokogiri 
     | 
|
| 
       124 
124 
     | 
    
         
             
                    assert_equal 0, set.search('foo').length
         
     | 
| 
       125 
125 
     | 
    
         
             
                  end
         
     | 
| 
       126 
126 
     | 
    
         | 
| 
       127 
     | 
    
         
            -
                  def  
     | 
| 
      
 127 
     | 
    
         
            +
                  def test_node_set_search_with_multiple_queries
         
     | 
| 
      
 128 
     | 
    
         
            +
                    xml = '<document>
         
     | 
| 
      
 129 
     | 
    
         
            +
                             <thing>
         
     | 
| 
      
 130 
     | 
    
         
            +
                               <div class="title">important thing</div>
         
     | 
| 
      
 131 
     | 
    
         
            +
                             </thing>
         
     | 
| 
      
 132 
     | 
    
         
            +
                             <thing>
         
     | 
| 
      
 133 
     | 
    
         
            +
                               <div class="content">stuff</div>
         
     | 
| 
      
 134 
     | 
    
         
            +
                             </thing>
         
     | 
| 
      
 135 
     | 
    
         
            +
                             <thing>
         
     | 
| 
      
 136 
     | 
    
         
            +
                               <p class="blah">more stuff</div>
         
     | 
| 
      
 137 
     | 
    
         
            +
                             </thing>
         
     | 
| 
      
 138 
     | 
    
         
            +
                           </document>'
         
     | 
| 
      
 139 
     | 
    
         
            +
                    set = Nokogiri::XML(xml).xpath(".//thing")
         
     | 
| 
      
 140 
     | 
    
         
            +
                    assert_kind_of Nokogiri::XML::NodeSet, set
         
     | 
| 
      
 141 
     | 
    
         
            +
             
     | 
| 
      
 142 
     | 
    
         
            +
                    assert_equal 3, set.xpath('./div', './p').length
         
     | 
| 
      
 143 
     | 
    
         
            +
                    assert_equal 3, set.css('.title', '.content', 'p').length
         
     | 
| 
      
 144 
     | 
    
         
            +
                    assert_equal 3, set.search('./div', 'p.blah').length
         
     | 
| 
      
 145 
     | 
    
         
            +
                  end
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
      
 147 
     | 
    
         
            +
                  def test_search_with_custom_selector
         
     | 
| 
       128 
148 
     | 
    
         
             
                    set = @xml.xpath('//staff')
         
     | 
| 
       129 
     | 
    
         
            -
                    custom_employees = set.xpath('//*[awesome(.)]', Class.new {
         
     | 
| 
       130 
     | 
    
         
            -
                      def awesome ns
         
     | 
| 
       131 
     | 
    
         
            -
                        ns.select { |n| n.name == 'employee' }
         
     | 
| 
       132 
     | 
    
         
            -
                      end
         
     | 
| 
       133 
     | 
    
         
            -
                    }.new)
         
     | 
| 
       134 
149 
     | 
    
         | 
| 
       135 
     | 
    
         
            -
                     
     | 
| 
      
 150 
     | 
    
         
            +
                    [
         
     | 
| 
      
 151 
     | 
    
         
            +
                      [:xpath,  '//*[awesome(.)]'],
         
     | 
| 
      
 152 
     | 
    
         
            +
                      [:search, '//*[awesome(.)]'],
         
     | 
| 
      
 153 
     | 
    
         
            +
                      [:css,    '*:awesome'],
         
     | 
| 
      
 154 
     | 
    
         
            +
                      [:search, '*:awesome']
         
     | 
| 
      
 155 
     | 
    
         
            +
                    ].each do |method, query|
         
     | 
| 
      
 156 
     | 
    
         
            +
                      custom_employees = set.send(method, query, Class.new {
         
     | 
| 
      
 157 
     | 
    
         
            +
                          def awesome ns
         
     | 
| 
      
 158 
     | 
    
         
            +
                            ns.select { |n| n.name == 'employee' }
         
     | 
| 
      
 159 
     | 
    
         
            +
                          end
         
     | 
| 
      
 160 
     | 
    
         
            +
                        }.new)
         
     | 
| 
      
 161 
     | 
    
         
            +
             
     | 
| 
      
 162 
     | 
    
         
            +
                      assert_equal(@xml.xpath('//employee'), custom_employees,
         
     | 
| 
      
 163 
     | 
    
         
            +
                        "using #{method} with custom selector '#{query}'")
         
     | 
| 
      
 164 
     | 
    
         
            +
                    end
         
     | 
| 
       136 
165 
     | 
    
         
             
                  end
         
     | 
| 
       137 
166 
     | 
    
         | 
| 
       138 
     | 
    
         
            -
                  def  
     | 
| 
      
 167 
     | 
    
         
            +
                  def test_search_with_variable_bindings
         
     | 
| 
       139 
168 
     | 
    
         
             
                    set = @xml.xpath('//staff')
         
     | 
| 
       140 
     | 
    
         
            -
                    custom_employees = set.css('*:awesome', Class.new {
         
     | 
| 
       141 
     | 
    
         
            -
                      def awesome ns
         
     | 
| 
       142 
     | 
    
         
            -
                        ns.select { |n| n.name == 'employee' }
         
     | 
| 
       143 
     | 
    
         
            -
                      end
         
     | 
| 
       144 
     | 
    
         
            -
                    }.new)
         
     | 
| 
       145 
169 
     | 
    
         | 
| 
       146 
     | 
    
         
            -
                    assert_equal  
     | 
| 
      
 170 
     | 
    
         
            +
                    assert_equal(4, set.xpath('//address[@domestic=$value]', nil, :value => 'Yes').length,
         
     | 
| 
      
 171 
     | 
    
         
            +
                      "using #xpath with variable binding")
         
     | 
| 
      
 172 
     | 
    
         
            +
             
     | 
| 
      
 173 
     | 
    
         
            +
                    assert_equal(4, set.search('//address[@domestic=$value]', nil, :value => 'Yes').length,
         
     | 
| 
      
 174 
     | 
    
         
            +
                      "using #search with variable binding")
         
     | 
| 
       147 
175 
     | 
    
         
             
                  end
         
     | 
| 
       148 
176 
     | 
    
         | 
| 
       149 
177 
     | 
    
         
             
                  def test_search_self
         
     | 
| 
         @@ -151,26 +179,10 @@ module Nokogiri 
     | 
|
| 
       151 
179 
     | 
    
         
             
                    assert_equal set.to_a, set.search('.').to_a
         
     | 
| 
       152 
180 
     | 
    
         
             
                  end
         
     | 
| 
       153 
181 
     | 
    
         | 
| 
       154 
     | 
    
         
            -
                  def test_search_with_custom_object
         
     | 
| 
       155 
     | 
    
         
            -
                    set = @xml.xpath('//staff')
         
     | 
| 
       156 
     | 
    
         
            -
                    custom_employees = set.search('//*[awesome(.)]', Class.new {
         
     | 
| 
       157 
     | 
    
         
            -
                      def awesome ns
         
     | 
| 
       158 
     | 
    
         
            -
                        ns.select { |n| n.name == 'employee' }
         
     | 
| 
       159 
     | 
    
         
            -
                      end
         
     | 
| 
       160 
     | 
    
         
            -
                    }.new)
         
     | 
| 
       161 
     | 
    
         
            -
             
     | 
| 
       162 
     | 
    
         
            -
                    assert_equal @xml.xpath('//employee'), custom_employees
         
     | 
| 
       163 
     | 
    
         
            -
                  end
         
     | 
| 
       164 
     | 
    
         
            -
             
     | 
| 
       165 
182 
     | 
    
         
             
                  def test_css_searches_match_self
         
     | 
| 
       166 
183 
     | 
    
         
             
                    html = Nokogiri::HTML("<html><body><div class='a'></div></body></html>")
         
     | 
| 
       167 
184 
     | 
    
         
             
                    set = html.xpath("/html/body/div")
         
     | 
| 
       168 
185 
     | 
    
         
             
                    assert_equal set.first, set.css(".a").first
         
     | 
| 
       169 
     | 
    
         
            -
                  end
         
     | 
| 
       170 
     | 
    
         
            -
             
     | 
| 
       171 
     | 
    
         
            -
                  def test_search_with_css_matches_self
         
     | 
| 
       172 
     | 
    
         
            -
                    html = Nokogiri::HTML("<html><body><div class='a'></div></body></html>")
         
     | 
| 
       173 
     | 
    
         
            -
                    set = html.xpath("/html/body/div")
         
     | 
| 
       174 
186 
     | 
    
         
             
                    assert_equal set.first, set.search(".a").first
         
     | 
| 
       175 
187 
     | 
    
         
             
                  end
         
     | 
| 
       176 
188 
     | 
    
         | 
| 
         @@ -311,9 +323,22 @@ module Nokogiri 
     | 
|
| 
       311 
323 
     | 
    
         
             
                    assert_equal node_set.xpath('./employeeId'), (node_set > 'employeeId')
         
     | 
| 
       312 
324 
     | 
    
         
             
                  end
         
     | 
| 
       313 
325 
     | 
    
         | 
| 
       314 
     | 
    
         
            -
                  def  
     | 
| 
      
 326 
     | 
    
         
            +
                  def test_at_performs_a_search_with_css
         
     | 
| 
      
 327 
     | 
    
         
            +
                    assert node_set = @xml.search('//employee')
         
     | 
| 
      
 328 
     | 
    
         
            +
                    assert_equal node_set.first.first_element_child, node_set.at('employeeId')
         
     | 
| 
      
 329 
     | 
    
         
            +
                    assert_equal node_set.first.first_element_child, node_set.%('employeeId')
         
     | 
| 
      
 330 
     | 
    
         
            +
                  end
         
     | 
| 
      
 331 
     | 
    
         
            +
             
     | 
| 
      
 332 
     | 
    
         
            +
                  def test_at_performs_a_search_with_xpath
         
     | 
| 
      
 333 
     | 
    
         
            +
                    assert node_set = @xml.search('//employee')
         
     | 
| 
      
 334 
     | 
    
         
            +
                    assert_equal node_set.first.first_element_child, node_set.at('./employeeId')
         
     | 
| 
      
 335 
     | 
    
         
            +
                    assert_equal node_set.first.first_element_child, node_set.%('./employeeId')
         
     | 
| 
      
 336 
     | 
    
         
            +
                  end
         
     | 
| 
      
 337 
     | 
    
         
            +
             
     | 
| 
      
 338 
     | 
    
         
            +
                  def test_at_with_integer_index
         
     | 
| 
       315 
339 
     | 
    
         
             
                    assert node_set = @xml.search('//employee')
         
     | 
| 
       316 
340 
     | 
    
         
             
                    assert_equal node_set.first, node_set.at(0)
         
     | 
| 
      
 341 
     | 
    
         
            +
                    assert_equal node_set.first, node_set % 0
         
     | 
| 
       317 
342 
     | 
    
         
             
                  end
         
     | 
| 
       318 
343 
     | 
    
         | 
| 
       319 
344 
     | 
    
         
             
                  def test_at_xpath
         
     | 
| 
         @@ -326,11 +351,6 @@ module Nokogiri 
     | 
|
| 
       326 
351 
     | 
    
         
             
                    assert_equal node_set.first.first_element_child, node_set.at_css('employeeId')
         
     | 
| 
       327 
352 
     | 
    
         
             
                  end
         
     | 
| 
       328 
353 
     | 
    
         | 
| 
       329 
     | 
    
         
            -
                  def test_percent
         
     | 
| 
       330 
     | 
    
         
            -
                    assert node_set = @xml.search('//employee')
         
     | 
| 
       331 
     | 
    
         
            -
                    assert_equal node_set.first, node_set % 0
         
     | 
| 
       332 
     | 
    
         
            -
                  end
         
     | 
| 
       333 
     | 
    
         
            -
             
     | 
| 
       334 
354 
     | 
    
         
             
                  def test_to_ary
         
     | 
| 
       335 
355 
     | 
    
         
             
                    assert node_set = @xml.search('//employee')
         
     | 
| 
       336 
356 
     | 
    
         
             
                    foo = []
         
     |