ruby-changes:15387
From: tenderlove <ko1@a...>
Date: Sat, 10 Apr 2010 05:33:20 +0900 (JST)
Subject: [ruby-changes:15387] Ruby:r27279 (trunk): * ext/psych/lib/psych/deprecated.rb: implementing Psych.quick_emit and
tenderlove 2010-04-10 05:33:10 +0900 (Sat, 10 Apr 2010) New Revision: 27279 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=27279 Log: * ext/psych/lib/psych/deprecated.rb: implementing Psych.quick_emit and adding deprecation warnings. * ext/psych/lib/psych/visitors/to_ruby.rb: supporting deprecated yaml_initialize api. * ext/psych/lib/psych/visitors/yaml_tree.rb: supporting deprecated to_yaml api. Added files: trunk/ext/psych/lib/psych/deprecated.rb trunk/test/psych/test_deprecated.rb Index: ext/psych/lib/psych/deprecated.rb =================================================================== --- ext/psych/lib/psych/deprecated.rb (revision 0) +++ ext/psych/lib/psych/deprecated.rb (revision 27279) @@ -0,0 +1,19 @@ +module Psych + module DeprecatedMethods # :nodoc: + attr_accessor :taguri + attr_accessor :to_yaml_style + end + + def self.quick_emit thing, opts = {}, &block # :nodoc: + warn "#{caller[0]}: YAML.quick_emit is deprecated" if $VERBOSE && !caller[0].start_with?(File.dirname(__FILE__)) + target = eval 'self', block.binding + target.extend DeprecatedMethods + metaclass = class << target; self; end + metaclass.send(:define_method, :encode_with) do |coder| + target.taguri = coder.tag + target.to_yaml_style = coder.style + block.call coder + end + target.psych_to_yaml unless opts[:nodump] + end +end Index: test/psych/test_deprecated.rb =================================================================== --- test/psych/test_deprecated.rb (revision 0) +++ test/psych/test_deprecated.rb (revision 27279) @@ -0,0 +1,135 @@ +require_relative 'helper' + +module Psych + class TestDeprecated < TestCase + class QuickEmitter + attr_reader :name + attr_reader :value + + def initialize + @name = 'hello!!' + @value = 'Friday!' + end + + def to_yaml opts = {} + Psych.quick_emit object_id, opts do |out| + out.map taguri, to_yaml_style do |map| + map.add 'name', @name + map.add 'value', nil + end + end + end + end + + def setup + @qe = QuickEmitter.new + end + + def test_quick_emit + qe2 = Psych.load @qe.to_yaml + assert_equal @qe.name, qe2.name + assert_instance_of QuickEmitter, qe2 + assert_nil qe2.value + end + + def test_recursive_quick_emit + hash = { :qe => @qe } + hash2 = Psych.load Psych.dump hash + qe = hash2[:qe] + + assert_equal @qe.name, qe.name + assert_instance_of QuickEmitter, qe + assert_nil qe.value + end + + class QuickEmitterEncodeWith + attr_reader :name + attr_reader :value + + def initialize + @name = 'hello!!' + @value = 'Friday!' + end + + def encode_with coder + coder.map do |map| + map.add 'name', @name + map.add 'value', nil + end + end + + def to_yaml opts = {} + raise + end + end + + ### + # An object that defines both to_yaml and encode_with should only call + # encode_with. + def test_recursive_quick_emit_encode_with + qeew = QuickEmitterEncodeWith.new + hash = { :qe => qeew } + hash2 = Psych.load Psych.dump hash + qe = hash2[:qe] + + assert_equal qeew.name, qe.name + assert_instance_of QuickEmitterEncodeWith, qe + assert_nil qe.value + end + + class YamlInit + attr_reader :name + attr_reader :value + + def initialize + @name = 'hello!!' + @value = 'Friday!' + end + + def yaml_initialize tag, vals + vals.each { |ivar, val| instance_variable_set "@#{ivar}", 'TGIF!' } + end + end + + def test_yaml_initialize + hash = { :yi => YamlInit.new } + hash2 = Psych.load Psych.dump hash + yi = hash2[:yi] + + assert_equal 'TGIF!', yi.name + assert_equal 'TGIF!', yi.value + assert_instance_of YamlInit, yi + end + + class YamlInitAndInitWith + attr_reader :name + attr_reader :value + + def initialize + @name = 'shaners' + @value = 'Friday!' + end + + def init_with coder + coder.map.each { |ivar, val| instance_variable_set "@#{ivar}", 'TGIF!' } + end + + def yaml_initialize tag, vals + raise + end + end + + ### + # An object that implements both yaml_initialize and init_with should not + # receive the yaml_initialize call. + def test_yaml_initialize_and_init_with + hash = { :yi => YamlInitAndInitWith.new } + hash2 = Psych.load Psych.dump hash + yi = hash2[:yi] + + assert_equal 'TGIF!', yi.name + assert_equal 'TGIF!', yi.value + assert_instance_of YamlInitAndInitWith, yi + end + end +end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/