diff options
-rw-r--r-- | lib/rexml/xpath.rb | 12 | ||||
-rw-r--r-- | lib/rexml/xpath_parser.rb | 15 | ||||
-rw-r--r-- | spec/ruby/library/rexml/element/namespace_spec.rb | 3 | ||||
-rw-r--r-- | spec/ruby/library/rexml/element/namespaces_spec.rb | 2 | ||||
-rw-r--r-- | spec/ruby/library/rexml/element/prefixes_spec.rb | 2 | ||||
-rw-r--r-- | test/rexml/test_contrib.rb | 2 | ||||
-rw-r--r-- | test/rexml/test_jaxen.rb | 6 | ||||
-rw-r--r-- | test/rexml/xpath/test_base.rb | 10 | ||||
-rw-r--r-- | test/rss/test_1.0.rb | 8 | ||||
-rw-r--r-- | test/rss/test_dublincore.rb | 2 |
10 files changed, 28 insertions, 34 deletions
diff --git a/lib/rexml/xpath.rb b/lib/rexml/xpath.rb index f1cb99baea..300d063fc5 100644 --- a/lib/rexml/xpath.rb +++ b/lib/rexml/xpath.rb @@ -28,10 +28,10 @@ module REXML # XPath.first( doc, "//b"} ) # XPath.first( node, "a/x:b", { "x"=>"http://doofus" } ) # XPath.first( node, '/book/publisher/text()=$publisher', {}, {"publisher"=>"O'Reilly"}) - def XPath::first element, path=nil, namespaces=nil, variables={} + def XPath::first(element, path=nil, namespaces=nil, variables={}, options={}) raise "The namespaces argument, if supplied, must be a hash object." unless namespaces.nil? or namespaces.kind_of?(Hash) raise "The variables argument, if supplied, must be a hash object." unless variables.kind_of?(Hash) - parser = XPathParser.new + parser = XPathParser.new(**options) parser.namespaces = namespaces parser.variables = variables path = "*" unless path @@ -57,10 +57,10 @@ module REXML # XPath.each( node, 'ancestor::x' ) { |el| ... } # XPath.each( node, '/book/publisher/text()=$publisher', {}, {"publisher"=>"O'Reilly"}) \ # {|el| ... } - def XPath::each element, path=nil, namespaces=nil, variables={}, &block + def XPath::each(element, path=nil, namespaces=nil, variables={}, options={}, &block) raise "The namespaces argument, if supplied, must be a hash object." unless namespaces.nil? or namespaces.kind_of?(Hash) raise "The variables argument, if supplied, must be a hash object." unless variables.kind_of?(Hash) - parser = XPathParser.new + parser = XPathParser.new(**options) parser.namespaces = namespaces parser.variables = variables path = "*" unless path @@ -69,8 +69,8 @@ module REXML end # Returns an array of nodes matching a given XPath. - def XPath::match element, path=nil, namespaces=nil, variables={} - parser = XPathParser.new + def XPath::match(element, path=nil, namespaces=nil, variables={}, options={}) + parser = XPathParser.new(**options) parser.namespaces = namespaces parser.variables = variables path = "*" unless path diff --git a/lib/rexml/xpath_parser.rb b/lib/rexml/xpath_parser.rb index 2d21f68416..54e641591d 100644 --- a/lib/rexml/xpath_parser.rb +++ b/lib/rexml/xpath_parser.rb @@ -47,11 +47,12 @@ module REXML include XMLTokens LITERAL = /^'([^']*)'|^"([^"]*)"/u - def initialize( ) + def initialize(strict: false) @parser = REXML::Parsers::XPathParser.new @namespaces = nil @variables = {} @nest = 0 + @strict = strict end def namespaces=( namespaces={} ) @@ -139,7 +140,9 @@ module REXML end private - + def strict? + @strict + end # Returns a String namespace for a node, given a prefix # The rules are: @@ -474,7 +477,13 @@ module REXML if prefix.nil? raw_node.name == name elsif prefix.empty? - raw_node.name == name and raw_node.namespace == "" + if strict? + raw_node.name == name and raw_node.namespace == "" + else + # FIXME: This DOUBLES the time XPath searches take + ns = get_namespace(raw_node, prefix) + raw_node.name == name and raw_node.namespace == ns + end else # FIXME: This DOUBLES the time XPath searches take ns = get_namespace(raw_node, prefix) diff --git a/spec/ruby/library/rexml/element/namespace_spec.rb b/spec/ruby/library/rexml/element/namespace_spec.rb index 9e4edfb56f..89662f3599 100644 --- a/spec/ruby/library/rexml/element/namespace_spec.rb +++ b/spec/ruby/library/rexml/element/namespace_spec.rb @@ -1,8 +1,6 @@ require 'rexml/document' require_relative '../../../spec_helper' -=begin -# FIXME describe "REXML::Element#namespace" do before :each do @doc = REXML::Document.new("<a xmlns='1' xmlns:y='2'><b/><c xmlns:z='3'/></a>") @@ -27,4 +25,3 @@ describe "REXML::Element#namespace" do @elem.namespace("z").should be_nil end end -=end diff --git a/spec/ruby/library/rexml/element/namespaces_spec.rb b/spec/ruby/library/rexml/element/namespaces_spec.rb index dc6183d63b..0fba0a1cf6 100644 --- a/spec/ruby/library/rexml/element/namespaces_spec.rb +++ b/spec/ruby/library/rexml/element/namespaces_spec.rb @@ -7,7 +7,6 @@ describe "REXML::Element#namespaces" do @elem = doc.elements["//c"] end -=begin it "returns a hash of the namespaces" do ns = {"y"=>"2", "z"=>"3", "xmlns"=>"1"} @elem.namespaces.keys.sort.should == ns.keys.sort @@ -29,5 +28,4 @@ describe "REXML::Element#namespaces" do values = ["2", "3", "1"] @elem.namespaces.values.sort.should == values.sort end -=end end diff --git a/spec/ruby/library/rexml/element/prefixes_spec.rb b/spec/ruby/library/rexml/element/prefixes_spec.rb index 8a2bccd9b9..b6edf9a847 100644 --- a/spec/ruby/library/rexml/element/prefixes_spec.rb +++ b/spec/ruby/library/rexml/element/prefixes_spec.rb @@ -7,7 +7,6 @@ describe "REXML::Element#prefixes" do @elem = doc.elements["//c"] end -=begin it "returns an array of the prefixes of the namespaces" do @elem.prefixes.should == ["y", "z"] end @@ -15,7 +14,6 @@ describe "REXML::Element#prefixes" do it "does not include the default namespace" do @elem.prefixes.include?("xmlns").should == false end -=end it "returns an empty array if no namespace was defined" do doc = REXML::Document.new "<root><something/></root>" diff --git a/test/rexml/test_contrib.rb b/test/rexml/test_contrib.rb index 28b96a4972..8462b3c23f 100644 --- a/test/rexml/test_contrib.rb +++ b/test/rexml/test_contrib.rb @@ -451,7 +451,7 @@ EOL end def test_external_entity - xp = '//*:channel/*:title' + xp = '//channel/title' %w{working.rss broken.rss}.each do |path| File.open(File.join(fixture_path(path))) do |file| diff --git a/test/rexml/test_jaxen.rb b/test/rexml/test_jaxen.rb index 81cef500a3..9640b8290b 100644 --- a/test/rexml/test_jaxen.rb +++ b/test/rexml/test_jaxen.rb @@ -84,7 +84,7 @@ module REXMLTests def process_value_of(context, variables, namespaces, value_of) expected = value_of.text xpath = value_of.attributes["select"] - matched = XPath.match(context, xpath, namespaces, variables) + matched = XPath.match(context, xpath, namespaces, variables, strict: true) message = user_message(context, xpath, matched) assert_equal(expected || "", @@ -95,7 +95,7 @@ module REXMLTests # processes a tests/document/context/test node ( where @exception is false or doesn't exist ) def process_nominal_test(context, variables, namespaces, test) xpath = test.attributes["select"] - matched = XPath.match(context, xpath, namespaces, variables) + matched = XPath.match(context, xpath, namespaces, variables, strict: true) # might be a test with no count attribute, but nested valueOf elements expected = test.attributes["count"] if expected @@ -113,7 +113,7 @@ module REXMLTests def process_exceptional_test(context, variables, namespaces, test) xpath = test.attributes["select"] assert_raise(REXML::ParseException) do - XPath.match(context, xpath, namespaces, variables) + XPath.match(context, xpath, namespaces, variables, strict: true) end end diff --git a/test/rexml/xpath/test_base.rb b/test/rexml/xpath/test_base.rb index 790dcaea22..5a03087ca6 100644 --- a/test/rexml/xpath/test_base.rb +++ b/test/rexml/xpath/test_base.rb @@ -880,10 +880,12 @@ module REXMLTests <tada xmlns=''>xb</tada> </tag1> XML - x = d.root - num = 0 - x.each_element('tada') { num += 1 } - assert_equal(1, num) + actual = [] + d.root.each_element('tada') do |element| + actual << element.to_s + end + assert_equal(["<tada>xa</tada>", "<tada xmlns=''>xb</tada>"], + actual) end def test_ticket_39 diff --git a/test/rss/test_1.0.rb b/test/rss/test_1.0.rb index 5be6a0587f..33ae29141b 100644 --- a/test/rss/test_1.0.rb +++ b/test/rss/test_1.0.rb @@ -54,8 +54,6 @@ module RSS end def test_channel - skip # FIXME - about = "http://hoge.com" resource = "http://hoge.com/hoge.png" @@ -207,8 +205,6 @@ EOR end def test_image - skip # FIXME - about = "http://hoge.com" h = { 'title' => "fugafuga", @@ -234,8 +230,6 @@ EOR end def test_item - skip # FIXME - about = "http://hoge.com" h = { 'title' => "fugafuga", @@ -261,8 +255,6 @@ EOR end def test_textinput - skip # FIXME - about = "http://hoge.com" h = { 'title' => "fugafuga", diff --git a/test/rss/test_dublincore.rb b/test/rss/test_dublincore.rb index cd22a00bc4..37ef177199 100644 --- a/test/rss/test_dublincore.rb +++ b/test/rss/test_dublincore.rb @@ -103,8 +103,6 @@ EOR end def test_to_s - skip # FIXME - assert_dc_to_s(@rss10_source, @rss10_parents, false) assert_dc_to_s(@rss10_source, @rss10_parents, true) |