[前][次][番号順一覧][スレッド一覧]

ruby-changes:51014

From: kou <ko1@a...>
Date: Sat, 21 Apr 2018 15:39:49 +0900 (JST)
Subject: [ruby-changes:51014] kou:r63221 (trunk): rexml: Fix XPath string() implementation

kou	2018-04-21 15:39:43 +0900 (Sat, 21 Apr 2018)

  New Revision: 63221

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=63221

  Log:
    rexml: Fix XPath string() implementation
    
    * lib/rexml/functions.rb( REXML::Functions.string):
      * Support context node.
      * Fix implementation for document node to remove out of root nodes.
      * Support processing instruction node.
      * Improve implementation for integer to omit decimals.
    
    * test/rexml/test_jaxen.rb: Enable processing instruction test.

  Modified files:
    trunk/lib/rexml/functions.rb
    trunk/test/rexml/test_jaxen.rb
Index: test/rexml/test_jaxen.rb
===================================================================
--- test/rexml/test_jaxen.rb	(revision 63220)
+++ test/rexml/test_jaxen.rb	(revision 63221)
@@ -28,7 +28,7 @@ module REXMLTests https://github.com/ruby/ruby/blob/trunk/test/rexml/test_jaxen.rb#L28
     def _test_namespaces ; process_test_case("namespaces") ; end
     def _test_nitf ; process_test_case("nitf") ; end
     def _test_numbers ; process_test_case("numbers") ; end
-    def _test_pi ; process_test_case("pi") ; end
+    def test_pi ; process_test_case("pi") ; end
     def _test_pi2 ; process_test_case("pi2") ; end
     def _test_simple ; process_test_case("simple") ; end
     def _test_testNamespaces ; process_test_case("testNamespaces") ; end
@@ -79,29 +79,12 @@ module REXMLTests https://github.com/ruby/ruby/blob/trunk/test/rexml/test_jaxen.rb#L79
     def process_value_of(context, variables, namespaces, value_of)
       expected = value_of.text
       xpath = value_of.attributes["select"]
-      matched = XPath.first(context, xpath, namespaces, variables)
+      matched = XPath.match(context, xpath, namespaces, variables)
 
       message = user_message(context, xpath, matched)
-
-      if expected.nil?
-        assert_nil(matched, message)
-      else
-        case matched
-        when Element
-          assert_equal(expected, matched.text, message)
-        when Attribute, Text, Comment, TrueClass, FalseClass
-          assert_equal(expected, matched.to_s, message)
-        when Instruction
-          assert_equal(expected, matched.content, message)
-        when Integer, Float
-          assert_equal(expected.to_f, matched, message)
-        when String
-          assert_equal(expected, matched, message)
-        else
-          flunk("#{message}\n" +
-                "Unexpected match value: <#{matched.inspect}>")
-        end
-      end
+      assert_equal(expected || "",
+                   REXML::Functions.string(matched),
+                   message)
     end
 
     # processes a tests/document/context/test node ( where @exception is false or doesn't exist )
Index: lib/rexml/functions.rb
===================================================================
--- lib/rexml/functions.rb	(revision 63220)
+++ lib/rexml/functions.rb	(revision 63221)
@@ -136,21 +136,36 @@ module REXML https://github.com/ruby/ruby/blob/trunk/lib/rexml/functions.rb#L136
     # An object of a type other than the four basic types is converted to a
     # string in a way that is dependent on that type.
     def Functions::string( object=nil )
-      #object = @context unless object
-      if object.instance_of? Array
-        string( object[0] )
-      elsif defined? object.node_type
-        if object.node_type == :attribute
+      object = @@context[:node] if object.nil?
+      if object.respond_to?(:node_type)
+        case object.node_type
+        when :attribute
           object.value
-        elsif object.node_type == :element || object.node_type == :document
+        when :element
           string_value(object)
+        when :document
+          string_value(object.root)
+        when :processing_instruction
+          object.content
         else
           object.to_s
         end
-      elsif object.nil?
-        return ""
       else
-        object.to_s
+        case object
+        when Array
+          string(object[0])
+        when Numeric
+          integer = object.to_i
+          if object == integer
+            "%d" % integer
+          else
+            object.to_s
+          end
+        when nil
+          ""
+        else
+          object.to_s
+        end
       end
     end
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]