diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/yaml.rb | 102 | ||||
-rw-r--r-- | lib/yaml/loader.rb | 14 |
2 files changed, 87 insertions, 29 deletions
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 diff --git a/lib/yaml/loader.rb b/lib/yaml/loader.rb new file mode 100644 index 0000000000..eb0709e103 --- /dev/null +++ b/lib/yaml/loader.rb @@ -0,0 +1,14 @@ +# +# YAML::Loader class +# .. type handling .. +# +module YAML + class Loader + TRANSFER_DOMAINS = { + 'yaml.org,2002' => {}, + 'ruby.yaml.org,2002' => {} + } + PRIVATE_TYPES = {} + IMPLICIT_TYPES = [ 'null', 'bool', 'time', 'int', 'float' ] + end +end |