class Psych::Visitors::ToRuby
This class walks aYAML AST, converting each node to Ruby
Attributes
Public Class Methods
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 15defself.create(symbolize_names:false,freeze:false,strict_integer:false)class_loader =ClassLoader.newscanner =ScalarScanner.newclass_loader,strict_integer:strict_integernew(scanner,class_loader,symbolize_names:symbolize_names,freeze:freeze)end
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 23definitializess,class_loader,symbolize_names:false,freeze:falsesuper()@st = {}@ss =ss@load_tags =Psych.load_tags@domain_types =Psych.domain_types@class_loader =class_loader@symbolize_names =symbolize_names@freeze =freezeend
Calls superclass method
BasicObject::newPublic Instance Methods
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 34defaccepttargetresult =superunless@domain_types.empty?||!target.tagkey =target.tag.sub(/^[!\/]*/,'').sub(/(,\d+)\//,'\1:')key ="tag:#{key}"unlesskey.match?(/^(?:tag:|x-private)/)if@domain_types.key?keyvalue,block =@domain_types[key]result =block.callvalue,resultendendresult =deduplicate(result).freezeif@freezeresultend
Calls superclass method
Psych::Visitors::Visitor#acceptSource
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 352defvisit_Psych_Nodes_Aliaso@st.fetch(o.anchor) {raiseAnchorNotDefined,o.anchor }end
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 344defvisit_Psych_Nodes_Documentoaccepto.rootend
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 164defvisit_Psych_Nodes_Mappingoif@load_tags[o.tag]returnrevive(resolve_class(@load_tags[o.tag]),o)endreturnrevive_hash(register(o, {}),o)unlesso.tagcaseo.tagwhen/^!ruby\/struct:?(.*)?$/klass =resolve_class($1)if$1ifklasss =register(o,klass.allocate)members = {}struct_members =s.members.map {|x|class_loader.symbolizex }o.children.each_slice(2)do|k,v|member =accept(k)value =accept(v)ifstruct_members.include?(class_loader.symbolize(member))s.send("#{member}=",value)elsemembers[member.to_s.sub(/^@/,'')] =valueendendinit_with(s,members,o)elseklass =class_loader.structmembers =o.children.map {|c|acceptc }h =Hash[*members]s =klass.new(*h.map {|k,v|class_loader.symbolizek }).new(*h.map {|k,v|v })register(o,s)sendwhen/^!ruby\/data(-with-ivars)?(?::(.*))?$/data =register(o,resolve_class($2).allocate)if$2members = {}if$1# data-with-ivarsivars = {}o.children.each_slice(2)do|type,vars|caseaccept(type)when'members'revive_data_members(members,vars)data||=allocate_anon_data(o,members)when'ivars'revive_hash(ivars,vars)endendivars.eachdo|ivar,v|data.instance_variable_setivar,vendelserevive_data_members(members,o)enddata||=allocate_anon_data(o,members)init_struct(data,**members)data.freezedatawhen/^!ruby\/object:?(.*)?$/name =$1||'Object'ifname=='Complex'class_loader.complexh =Hash[*o.children.map {|c|acceptc }]registero,Complex(h['real'],h['image'])elsifname=='Rational'class_loader.rationalh =Hash[*o.children.map {|c|acceptc }]registero,Rational(h['numerator'],h['denominator'])elsifname=='Hash'revive_hash(register(o, {}),o)elseobj =revive((resolve_class(name)||class_loader.object),o)objendwhen/^!(?:str|ruby\/string)(?::(.*))?$/,'tag:yaml.org,2002:str'klass =resolve_class($1)members = {}string =nilo.children.each_slice(2)do|k,v|key =acceptkvalue =acceptvifkey=='str'ifklassstring =klass.allocate.replacevalueelsestring =valueendregister(o,string)elsemembers[key] =valueendendinit_with(string,members.map {|k,v| [k.to_s.sub(/^@/,''),v] },o)when/^!ruby\/array:(.*)$/klass =resolve_class($1)list =register(o,klass.allocate)members =Hash[o.children.map {|c|acceptc }.each_slice(2).to_a]list.replacemembers['internal']members['ivars'].eachdo|ivar,v|list.instance_variable_setivar,vendlistwhen'!ruby/range'klass =class_loader.rangeh =Hash[*o.children.map {|c|acceptc }]registero,klass.new(h['begin'],h['end'],h['excl'])when/^!ruby\/exception:?(.*)?$/h =Hash[*o.children.map {|c|acceptc }]e =build_exception((resolve_class($1)||class_loader.exception),h.delete('message'))e.set_backtraceh.delete('backtrace')ifh.key?'backtrace'init_with(e,h,o)when'!set','tag:yaml.org,2002:set'set =class_loader.psych_set.new@st[o.anchor] =setifo.anchoro.children.each_slice(2)do|k,v|set[accept(k)] =accept(v)endsetwhen/^!ruby\/hash-with-ivars(?::(.*))?$/hash =$1?resolve_class($1).allocate: {}registero,hasho.children.each_slice(2)do|key,value|casekey.valuewhen'elements'revive_hashhash,valuewhen'ivars'value.children.each_slice(2)do|k,v|hash.instance_variable_setaccept(k),accept(v)endendendhashwhen/^!map:(.*)$/,/^!ruby\/hash:(.*)$/revive_hashregister(o,resolve_class($1).allocate),owhen'!omap','tag:yaml.org,2002:omap'map =register(o,class_loader.psych_omap.new)o.children.each_slice(2)do|l,r|map[accept(l)] =acceptrendmapwhen/^!ruby\/marshalable:(.*)$/name =$1klass =resolve_class(name)obj =register(o,klass.allocate)ifobj.respond_to?(:init_with)init_with(obj,revive_hash({},o),o)elsifobj.respond_to?(:marshal_load)marshal_data =o.children.map(&method(:accept))obj.marshal_load(marshal_data)objelseraiseArgumentError,"Cannot deserialize #{name}"endelserevive_hash(register(o, {}),o)endend
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 128defvisit_Psych_Nodes_Scalaroregistero,deserialize(o)end
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 132defvisit_Psych_Nodes_Sequenceoifklass =resolve_class(@load_tags[o.tag])instance =klass.allocateifinstance.respond_to?(:init_with)coder =Psych::Coder.new(o.tag)coder.seq =o.children.map {|c|acceptc }instance.init_withcoderendreturninstanceendcaseo.tagwhennilregister_empty(o)when'!omap','tag:yaml.org,2002:omap'map =register(o,Psych::Omap.new)o.children.each {|a|map[accept(a.children.first)] =accepta.children.last }mapwhen/^!(?:seq|ruby\/array):(.*)$/klass =resolve_class($1)list =register(o,klass.allocate)o.children.each {|c|list.pushacceptc }listelseregister_empty(o)endend
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 348defvisit_Psych_Nodes_Streamoo.children.map {|c|acceptc }end
Private Instance Methods
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 369defallocate_anon_datanode,membersklass =class_loader.data.define(*members.keys)register(node,klass.allocate)end
Source
static VALUE build_exception(VALUE self, VALUE klass, VALUE mesg){ VALUE e = rb_obj_alloc(klass); rb_iv_set(e, "mesg", mesg); return e;}Create an exception with classklass andmessage
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 424defdeduplicatekeyifkey.is_a?(String)# It is important to untaint the string, otherwise it won't# be deduplicated into an fstring, but simply frozen.-(key.untaint)elsekeyendend
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 51defdeserializeoifklass =resolve_class(@load_tags[o.tag])instance =klass.allocateifinstance.respond_to?(:init_with)coder =Psych::Coder.new(o.tag)coder.scalar =o.valueinstance.init_withcoderendreturninstanceendreturno.valueifo.quotedreturn@ss.tokenize(o.value)unlesso.tagcaseo.tagwhen'!binary','tag:yaml.org,2002:binary'o.value.unpack('m').firstwhen/^!(?:str|ruby\/string)(?::(.*))?$/,'tag:yaml.org,2002:str'klass =resolve_class($1)ifklassklass.allocate.replaceo.valueelseo.valueendwhen'!ruby/object:BigDecimal'require'bigdecimal'unlessdefined?BigDecimalclass_loader.big_decimal._loado.valuewhen"!ruby/object:DateTime"class_loader.date_timet =@ss.parse_time(o.value)DateTime.civil(*t.to_a[0,6].reverse,Rational(t.utc_offset,86400))+ (t.subsec/86400)when'!ruby/encoding'::Encoding.findo.valuewhen"!ruby/object:Complex"class_loader.complexComplex(o.value)when"!ruby/object:Rational"class_loader.rationalRational(o.value)when"!ruby/class","!ruby/module"resolve_classo.valuewhen"tag:yaml.org,2002:float","!float"Float(@ss.tokenize(o.value))when"!ruby/regexp"klass =class_loader.regexpmatches =/^\/(?<string>.*)\/(?<options>[mixn]*)$/m.match(o.value)source =matches[:string].gsub('\/','/')options =0lang =nilmatches[:options].each_chardo|option|caseoptionwhen'x'thenoptions|=Regexp::EXTENDEDwhen'i'thenoptions|=Regexp::IGNORECASEwhen'm'thenoptions|=Regexp::MULTILINEwhen'n'thenoptions|=Regexp::NOENCODINGelselang =optionendendklass.new(*[source,options,lang].compact)when"!ruby/range"klass =class_loader.rangeargs =o.value.split(/([.]{2,3})/,2).map {|s|acceptNodes::Scalar.new(s) }args.push(args.delete_at(1)=='...')klass.new(*args)when/^!ruby\/sym(bol)?:?(.*)?$/class_loader.symbolizeo.valueelse@ss.tokenizeo.valueendend
Source
static VALUE init_struct(VALUE self, VALUE data, VALUE attrs){ VALUE args = rb_ary_new2(1); rb_ary_push(args, attrs); rb_struct_initialize(data, args); return data;}Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 451definit_witho,h,nodec =Psych::Coder.new(node.tag)c.map =hifo.respond_to?(:init_with)o.init_withcelseh.each {|k,v|o.instance_variable_set(:"@#{k}",v) }endoend
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 443defmerge_keyhash,key,valend
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 358defregisternode,object@st[node.anchor] =objectifnode.anchorobjectend
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 363defregister_emptyobjectlist =register(object, [])object.children.each {|c|list.pushacceptc }listend
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 464defresolve_classklassnameclass_loader.loadklassnameend
Convertklassname to a Class
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 446defreviveklass,nodes =register(node,klass.allocate)init_with(s,revive_hash({},node,true),node)end
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 374defrevive_data_membershash,oo.children.each_slice(2)do|k,v|name =accept(k)value =accept(v)hash[class_loader.symbolize(name)] =valueendhashend
Source
# File ext/psych/lib/psych/visitors/to_ruby.rb, line 383defrevive_hashhash,o,tagged=falseo.children.each_slice(2) {|k,v|key =accept(k)val =accept(v)ifkey=='<<'&&k.tag!="tag:yaml.org,2002:str"casevwhenNodes::Alias,Nodes::Mappingbeginhash.merge!valrescueTypeErrorhash[key] =valendwhenNodes::Sequencebeginh = {}val.reverse_eachdo|value|h.merge!valueendhash.merge!hrescueTypeErrorhash[key] =valendelsehash[key] =valendelseif!tagged&&@symbolize_names&&key.is_a?(String)key =key.to_symelsif!@freezekey =deduplicate(key)endhash[key] =valend }hashend