Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

supporting add_ruby_type

  • Loading branch information...
commit 3bfd17a39c2ff3cdb76251e4ff327fee05376d44 1 parent 432ae1b
@tenderlove authored
View
2  Rakefile
@@ -46,7 +46,7 @@ namespace :merge do
[basedir, 'test', 'psych/'] => [rubydir, 'test', 'psych/'],
}
- rsync = 'rsync -av --exclude extconf.rb --exclude lib --delete'
+ rsync = 'rsync -av --exclude extconf.rb --exclude lib --exclude ".*" --delete'
task :to_ruby do
mergedirs.each do |from, to|
View
15 lib/psych.rb
@@ -207,11 +207,22 @@ def self.load_file filename
# :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
View
10 lib/psych/visitors/to_ruby.rb
@@ -16,10 +16,12 @@ def accept target
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
View
16 test/psych/test_deprecated.rb
@@ -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 @@ class YamlAs
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
View
23 test/psych/test_psych.rb
@@ -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 @@ def test_add_builtin_type
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 @@ def test_degenerate_strings
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
Please sign in to comment.
Something went wrong with that request. Please try again.