YAMLTree builds a YAML ast given a ruby object. For example:
builder = Psych::Visitors::YAMLTree.new
builder << { :foo => 'bar' }
builder.tree # => #<Psych::Nodes::Stream .. }
Methods
- #
- A
- F
- N
- P
- S
- T
- V
-
- visit_Array,
- visit_BigDecimal,
- visit_Class,
- visit_Complex,
- visit_Date,
- visit_DateTime,
- visit_Exception,
- visit_FalseClass,
- visit_Float,
- visit_Hash,
- visit_Integer,
- visit_Module,
- visit_NilClass,
- visit_Object,
- visit_Psych_Omap,
- visit_Psych_Set,
- visit_Range,
- visit_Rational,
- visit_Regexp,
- visit_String,
- visit_Struct,
- visit_Symbol,
- visit_Time,
- visit_TrueClass
Attributes
[R] | finished | |
[R] | finished? | |
[R] | started | |
[R] | started? |
Class Public methods
new(options = {})
Link
# File ext/psych/lib/psych/visitors/yaml_tree.rb, line 39 def initialize options = {}, emitter = TreeBuilder.new, ss = ScalarScanner.new super() @started = false @finished = false @emitter = emitter @st = Registrar.new @ss = ss @options = options @coders = [] @dispatch_cache = Hash.new do |h,klass| method = "visit_#{(klass.name || '').split('::').join('_')}" method = respond_to?(method) ? method : h[klass.superclass] raise(TypeError, "Can't dump #{target.class}") unless method h[klass] = method end end
Instance Public methods
accept(target)
Link
# File ext/psych/lib/psych/visitors/yaml_tree.rb, line 97 def accept target # return any aliases we find if @st.key? target oid = @st.id_for target node = @st.node_for target anchor = oid.to_s node.anchor = anchor return @emitter.alias anchor end if target.respond_to?(:to_yaml) begin loc = target.method(:to_yaml).source_location.first if loc !~ /(syck\/rubytypes.rb|psych\/core_ext.rb)/ unless target.respond_to?(:encode_with) if $VERBOSE warn "implementing to_yaml is deprecated, please implement \"encode_with\"" end target.to_yaml(:nodump => true) end end rescue # public_method or source_location might be overridden, # and it's OK to skip it since it's only to emit a warning end end if target.respond_to?(:encode_with) dump_coder target else send(@dispatch_cache[target.class], target) end end
finish()
Link
push(object)
Link
Also aliased as: <<
# File ext/psych/lib/psych/visitors/yaml_tree.rb, line 77 def push object start unless started? version = [] version = [1,1] if @options[:header] case @options[:version] when Array version = @options[:version] when String version = @options[:version].split('.').map { |x| x.to_i } else version = [1,1] end if @options.key? :version @emitter.start_document version, [], false accept object @emitter.end_document !@emitter.streaming? end
start(encoding = Nodes::Stream::UTF8)
Link
tree()
Link
visit_Array(o)
Link
visit_BigDecimal(o)
Link
visit_Class(o)
Link
visit_Complex(o)
Link
# File ext/psych/lib/psych/visitors/yaml_tree.rb, line 215 def visit_Complex o register o, @emitter.start_mapping(nil, '!ruby/object:Complex', false, Nodes::Mapping::BLOCK) ['real', o.real.to_s, 'image', o.imag.to_s].each do |m| @emitter.scalar m, nil, nil, true, false, Nodes::Scalar::ANY end @emitter.end_mapping end
visit_DateTime(o)
Link
visit_Exception(o)
Link
# File ext/psych/lib/psych/visitors/yaml_tree.rb, line 168 def visit_Exception o tag = ['!ruby/exception', o.class.name].join ':' @emitter.start_mapping nil, tag, false, Nodes::Mapping::BLOCK { 'message' => private_iv_get(o, 'mesg'), 'backtrace' => private_iv_get(o, 'backtrace'), }.each do |k,v| next unless v @emitter.scalar k, nil, nil, true, false, Nodes::Scalar::ANY accept v end dump_ivars o @emitter.end_mapping end
visit_Float(o)
Link
# File ext/psych/lib/psych/visitors/yaml_tree.rb, line 232 def visit_Float o if o.nan? @emitter.scalar '.nan', nil, nil, true, false, Nodes::Scalar::ANY elsif o.infinite? @emitter.scalar((o.infinite? > 0 ? '.inf' : '-.inf'), nil, nil, true, false, Nodes::Scalar::ANY) else @emitter.scalar o.to_s, nil, nil, true, false, Nodes::Scalar::ANY end end
visit_Hash(o)
Link
# File ext/psych/lib/psych/visitors/yaml_tree.rb, line 316 def visit_Hash o tag = o.class == ::Hash ? nil : "!ruby/hash:#{o.class}" implicit = !tag register(o, @emitter.start_mapping(nil, tag, implicit, Psych::Nodes::Mapping::BLOCK)) o.each do |k,v| accept k accept v end @emitter.end_mapping end
visit_Integer(o)
Link
visit_Module(o)
Link
visit_NilClass(o)
Link
visit_Object(o)
Link
# File ext/psych/lib/psych/visitors/yaml_tree.rb, line 140 def visit_Object o tag = Psych.dump_tags[o.class] unless tag klass = o.class == Object ? nil : o.class.name tag = ['!ruby/object', klass].compact.join(':') end map = @emitter.start_mapping(nil, tag, false, Nodes::Mapping::BLOCK) register(o, map) dump_ivars o @emitter.end_mapping end
visit_Psych_Omap(o)
Link
visit_Psych_Set(o)
Link
visit_Range(o)
Link
visit_Rational(o)
Link
# File ext/psych/lib/psych/visitors/yaml_tree.rb, line 202 def visit_Rational o register o, @emitter.start_mapping(nil, '!ruby/object:Rational', false, Nodes::Mapping::BLOCK) [ 'denominator', o.denominator.to_s, 'numerator', o.numerator.to_s ].each do |m| @emitter.scalar m, nil, nil, true, false, Nodes::Scalar::ANY end @emitter.end_mapping end
visit_Regexp(o)
Link
visit_String(o)
Link
# File ext/psych/lib/psych/visitors/yaml_tree.rb, line 255 def visit_String o plain = true quote = true style = Nodes::Scalar::PLAIN tag = nil str = o if binary?(o) str = [o].pack('m').chomp tag = '!binary' # FIXME: change to below when syck is removed #tag = 'tag:yaml.org,2002:binary' style = Nodes::Scalar::LITERAL plain = false quote = false elsif o =~ /\n/ style = Nodes::Scalar::LITERAL else unless String === @ss.tokenize(o) style = Nodes::Scalar::SINGLE_QUOTED end end ivars = find_ivars o if ivars.empty? unless o.class == ::String tag = "!ruby/string:#{o.class}" end @emitter.scalar str, nil, tag, plain, quote, style else maptag = '!ruby/string' maptag << ":#{o.class}" unless o.class == ::String register o, @emitter.start_mapping(nil, maptag, false, Nodes::Mapping::BLOCK) @emitter.scalar 'str', nil, nil, true, false, Nodes::Scalar::ANY @emitter.scalar str, nil, tag, plain, quote, style dump_ivars o @emitter.end_mapping end end
visit_Struct(o)
Link
# File ext/psych/lib/psych/visitors/yaml_tree.rb, line 154 def visit_Struct o tag = ['!ruby/struct', o.class.name].compact.join(':') register o, @emitter.start_mapping(nil, tag, false, Nodes::Mapping::BLOCK) o.members.each do |member| @emitter.scalar member.to_s, nil, nil, true, false, Nodes::Scalar::ANY accept o[member] end dump_ivars o @emitter.end_mapping end
visit_Symbol(o)
Link
visit_Time(o)
Link