From 4b25d0d2cb5e47907c3586ba86646b25bd25ceaf Mon Sep 17 00:00:00 2001 From: why Date: Sat, 10 May 2003 19:55:18 +0000 Subject: * ext/syck/gram.c ext/syck/handler.c ext/syck/implicit.c ext/syck/node.c ext/syck/rubyext.c ext/syck/syck.c ext/syck/syck.h ext/syck/token.c: updated to Syck 0.27 * lib/yaml/loader.rb: new YAML::Loader class * lib/yaml.rb: loading of type families leverages YAML::DefaultLoader git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@3778 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/yaml.rb | 102 +++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 73 insertions(+), 29 deletions(-) (limited to 'lib/yaml.rb') diff --git a/lib/yaml.rb b/lib/yaml.rb index 3b669d3723..1b2a4ea81f 100644 --- a/lib/yaml.rb +++ b/lib/yaml.rb @@ -10,53 +10,36 @@ module YAML begin require 'syck' - Parser = YAML::Syck::Parser + @@parser = YAML::Syck::Parser + @@loader = YAML::Syck::DefaultLoader rescue LoadError require 'yaml/parser' - Parser = YAML::Parser + @@parser = YAML::Parser + @@loader = YAML::DefaultLoader end require 'yaml/emitter' - require 'yaml/rubytypes' - - # - # Allocate blank object - # - def YAML.object_maker( obj_class, val ) - if Hash === val - name = obj_class.name - o = ::Marshal.load( sprintf( "\004\006o:%c%s\000", name.length + 5, name )) - val.each_pair { |k,v| - o.instance_eval "@#{k} = v" - } - o - else - raise YAML::Error, "Invalid object explicitly tagged !ruby/Object: " + val.inspect - end - end - - # - # Input methods - # + require 'yaml/loader' + require 'yaml/stream' # # Load a single document from the current stream # def YAML.load( io ) - yp = YAML::Parser.new.parse( io ) + yp = @@parser.new.load( io ) end # # Parse a single document from the current stream # def YAML.parse( io ) - yp = YAML::Parser.new( :Model => :Generic ).parse( io ) + yp = @@parser.new( :Model => :Generic ).load( io ) end # # Load all documents from the current stream # def YAML.each_document( io, &doc_proc ) - yp = YAML::Parser.new.parse_documents( io, &doc_proc ) + yp = @@parser.new.load_documents( io, &doc_proc ) end # @@ -70,7 +53,7 @@ module YAML # Parse all documents from the current stream # def YAML.each_node( io, &doc_proc ) - yp = YAML::Parser.new( :Model => :Generic ).parse_documents( io, &doc_proc ) + yp = @@parser.new( :Model => :Generic ).load_documents( io, &doc_proc ) end # @@ -84,17 +67,78 @@ module YAML # Load all documents from the current stream # def YAML.load_stream( io ) - yp = YAML::Parser.new + yp = @@parser.new d = nil - yp.parse_documents( io ) { |doc| + yp.load_documents( io ) { |doc| d = YAML::Stream.new( yp.options ) if not d d.add( doc ) } return d end + # + # Add a transfer method to a domain + # + def YAML.add_domain_type( domain, type_re, &transfer_proc ) + @@loader.add_domain_type( domain, type_re, &transfer_proc ) + end + + # + # Add a transfer method for a builtin type + # + def YAML.add_builtin_type( type_re, &transfer_proc ) + @@loader.add_builtin_type( type_re, &transfer_proc ) + end + + # + # Add a transfer method for a builtin type + # + def YAML.add_ruby_type( type, &transfer_proc ) + @@loader.add_ruby_type( type, &transfer_proc ) + end + + # + # Add a private document type + # + def YAML.add_private_type( type_re, &transfer_proc ) + @@loader.add_private_type( type_re, &transfer_proc ) + end + + # + # Method to extract colon-seperated type and class, returning + # the type and the constant of the class + # + def YAML.read_type_class( type, obj_class ) + type =~ /^([^:]+):(.+)/i + if $2 + type = $1 + $2.split( "::" ).each { |c| + obj_class = obj_class.const_get( c ) + } + end + return [ type, obj_class ] + end + + # + # Allocate blank object + # + def YAML.object_maker( obj_class, val ) + if Hash === val + name = obj_class.name + o = ::Marshal.load( sprintf( "\004\006o:%c%s\000", name.length + 5, name )) + val.each_pair { |k,v| + o.instance_eval "@#{k} = v" + } + o + else + raise YAML::Error, "Invalid object explicitly tagged !ruby/Object: " + val.inspect + end + end + end +require 'yaml/rubytypes' + # # ryan: You know how Kernel.p is a really convenient way to dump ruby # structures? The only downside is that it's not as legible as -- cgit v1.2.3