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

ruby-changes:15563

From: tenderlove <ko1@a...>
Date: Sat, 24 Apr 2010 13:11:38 +0900 (JST)
Subject: [ruby-changes:15563] Ruby:r27469 (trunk): * ext/psych/lib/psych.rb: supporting deprecated syck method

tenderlove	2010-04-24 13:11:27 +0900 (Sat, 24 Apr 2010)

  New Revision: 27469

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=27469

  Log:
    * ext/psych/lib/psych.rb: supporting deprecated syck method
      add_ruby_type
    * ext/psych/lib/psych/visitors/to_ruby.rb: ditto
    * test/psych/test_deprecated.rb: ditto
    * test/psych/test_psych.rb: ditto

  Modified files:
    trunk/ext/psych/lib/psych/visitors/to_ruby.rb
    trunk/ext/psych/lib/psych.rb
    trunk/test/psych/test_deprecated.rb
    trunk/test/psych/test_psych.rb

Index: ext/psych/lib/psych/visitors/to_ruby.rb
===================================================================
--- ext/psych/lib/psych/visitors/to_ruby.rb	(revision 27468)
+++ ext/psych/lib/psych/visitors/to_ruby.rb	(revision 27469)
@@ -16,10 +16,12 @@
         result = super
         return result if @domain_types.empty? || !target.tag
 
-        short_name = target.tag.sub(/^!/, '').split('/', 2).last
-        if Psych.domain_types.key? short_name
-          url, block = Psych.domain_types[short_name]
-          return block.call "#{url}:#{short_name}", result
+        key = target.tag.sub(/^[!\/]*/, '').sub(/(,\d+)\//, '\1:')
+        key = "tag:#{key}" unless key.start_with?('tag:')
+
+        if @domain_types.key? key
+          value, block = @domain_types[key]
+          return block.call value, result
         end
 
         result
Index: ext/psych/lib/psych.rb
===================================================================
--- ext/psych/lib/psych.rb	(revision 27468)
+++ ext/psych/lib/psych.rb	(revision 27469)
@@ -207,13 +207,24 @@
   # :stopdoc:
   @domain_types = {}
   def self.add_domain_type domain, type_tag, &block
-    @domain_types[type_tag] = ["http://#{domain}", block]
+    key = ['tag', domain, type_tag].join ':'
+    @domain_types[key] = [key, block]
+    @domain_types["tag:#{type_tag}"] = [key, block]
   end
 
   def self.add_builtin_type type_tag, &block
-    @domain_types[type_tag] = ['yaml.org', block]
+    domain = 'yaml.org,2002'
+    key = ['tag', domain, type_tag].join ':'
+    @domain_types[key] = [key, block]
   end
 
+  def self.add_ruby_type type_tag, &block
+    warn "#{caller[0]}: add_ruby_type is deprecated, use add_domain_type" if $VERBOSE && !caller[0].start_with?(File.dirname(__FILE__))
+    domain = 'ruby.yaml.org,2002'
+    key = ['tag', domain, type_tag].join ':'
+    @domain_types[key] = [key, block]
+  end
+
   def self.remove_type type_tag
     @domain_types.delete type_tag
   end
Index: test/psych/test_psych.rb
===================================================================
--- test/psych/test_psych.rb	(revision 27468)
+++ test/psych/test_psych.rb	(revision 27469)
@@ -4,6 +4,10 @@
 require 'tempfile'
 
 class TestPsych < Psych::TestCase
+  def teardown
+    Psych.domain_types.clear
+  end
+
   def test_load_argument_error
     assert_raises(TypeError) do
       Psych.load nil
@@ -56,7 +60,7 @@
     Psych.add_builtin_type 'omap', do |type, val|
       got = val
     end
-    Psych.load('--- !omap hello')
+    Psych.load('--- !!omap hello')
     assert_equal 'hello', got
   ensure
     Psych.remove_type 'omap'
@@ -98,4 +102,21 @@
     assert_equal false, Psych.load('')
     assert_equal false, Psych.parse('')
   end
+
+  def test_callbacks
+    types = []
+    appender = lambda { |*args| types << args }
+
+    Psych.add_builtin_type('foo', &appender)
+    Psych.add_domain_type('example.com,2002', 'foo', &appender)
+    Psych.load <<-eoyml
+- !tag:yaml.org,2002:foo bar
+- !tag:example.com,2002:foo bar
+    eoyml
+
+    assert_equal [
+      ["tag:yaml.org,2002:foo", "bar"],
+      ["tag:example.com,2002:foo", "bar"]
+    ], types
+  end
 end
Index: test/psych/test_deprecated.rb
===================================================================
--- test/psych/test_deprecated.rb	(revision 27468)
+++ test/psych/test_deprecated.rb	(revision 27469)
@@ -2,6 +2,10 @@
 
 module Psych
   class TestDeprecated < TestCase
+    def teardown
+      Psych.domain_types.clear
+    end
+
     class QuickEmitter
       attr_reader :name
       attr_reader :value
@@ -147,5 +151,17 @@
     def test_yaml_as
       assert_match(/helloworld/, Psych.dump(YamlAs.new))
     end
+
+    def test_ruby_type
+      types = []
+      appender = lambda { |*args| types << args }
+
+      Psych.add_ruby_type('foo', &appender)
+      Psych.load <<-eoyml
+- !ruby.yaml.org,2002/foo bar
+      eoyml
+
+      assert_equal [["tag:ruby.yaml.org,2002:foo", "bar"]], types
+    end
   end
 end

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

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