[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

[YAML] serializing Class and Module objects

Joel VanderWerf

2/3/2006 8:11:00 PM


Hey, _why, what do you think about allowing YAML to dump/load Class and
Module objects rather than gagging? I've posted code like the following
(different versions for 1.8.2 and 1.8.4) several times in response to
inquiries on ruby-talk, and found it useful myself.



=====================================================
Test code:

enum_y = [Enumerable, Comparable, String, File].to_yaml
puts enum_y
p YAML.load(enum_y)

=====================================================
Test output:

---
- !ruby/module Enumerable
- !ruby/module Comparable
- !ruby/class String
- !ruby/class File
[Enumerable, Comparable, String, File]

=====================================================
require 'yaml'

if defined?(YAML.type_tag) # old version of YAML

class Module
def is_complex_yaml?
false
end
def to_yaml( opts = {} )
YAML::quick_emit( nil, opts ) { |out|
out << "!ruby/module "
self.name.to_yaml( :Emitter => out )
}
end
end
YAML.add_ruby_type(/^module/) do |type, val|
subtype, subclass = YAML.read_type_class(type, Module)
val.split(/::/).inject(Object) { |p, n| p.const_get(n)}
end

class Class
def to_yaml( opts = {} )
YAML::quick_emit( nil, opts ) { |out|
out << "!ruby/class "
self.name.to_yaml( :Emitter => out )
}
end
end
YAML.add_ruby_type(/^class/) do |type, val|
subtype, subclass = YAML.read_type_class(type, Class)
val.split(/::/).inject(Object) { |p, n| p.const_get(n)}
end

else

class Module
yaml_as "tag:ruby.yaml.org,2002:module"

def Module.yaml_new( klass, tag, val )
if String === val
val.split(/::/).inject(Object) {|m, n| m.const_get(n)}
else
raise YAML::TypeError, "Invalid Module: " + val.inspect
end
end

def to_yaml( opts = {} )
YAML::quick_emit( nil, opts ) { |out|
out.scalar( "tag:ruby.yaml.org,2002:module", self.name, :plain )
}
end
end

class Class
yaml_as "tag:ruby.yaml.org,2002:class"

def Class.yaml_new( klass, tag, val )
if String === val
val.split(/::/).inject(Object) {|m, n| m.const_get(n)}
else
raise YAML::TypeError, "Invalid Class: " + val.inspect
end
end

def to_yaml( opts = {} )
YAML::quick_emit( nil, opts ) { |out|
out.scalar( "tag:ruby.yaml.org,2002:class", self.name, :plain )
}
end
end

end

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407


4 Answers

why the lucky stiff

2/3/2006 8:22:00 PM

0

Joel VanderWerf wrote:

>Hey, _why, what do you think about allowing YAML to dump/load Class and
>Module objects rather than gagging? I've posted code like the following
>(different versions for 1.8.2 and 1.8.4) several times in response to
>inquiries on ruby-talk, and found it useful myself.
>
>
I've been reluctant, because reloading these objects causes trouble if
you haven't required the right libraries. But I think if YAML's error
message was okay, it would work.

Oh and the best place for getting Syck requests through is now here:
http://code.whytheluckystiff.net/syck...

_why


Joel VanderWerf

2/3/2006 8:34:00 PM

0

why the lucky stiff wrote:
> Joel VanderWerf wrote:
>
>> Hey, _why, what do you think about allowing YAML to dump/load Class and
>> Module objects rather than gagging? I've posted code like the following
>> (different versions for 1.8.2 and 1.8.4) several times in response to
>> inquiries on ruby-talk, and found it useful myself.
>>
>>
> I've been reluctant, because reloading these objects causes trouble if
> you haven't required the right libraries. But I think if YAML's error
> message was okay, it would work.

I thought about rescuing and re-raising the exception as a different
exception class, but maybe it is better to leave it as it is:

NameError: uninitialized constant Foo

This is the same exception you would get if you loaded a script file.

The way Marshal does it (in the case of a dumped class that is loaded
without having the class definition required) is:

ArgumentError: undefined class/module Foo

Maybe that's how YAML should do it for consistency?

I'd be happy with either way.

> Oh and the best place for getting Syck requests through is now here:
> http://code.whytheluckystiff.net/syck...

Thanks!

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407


Joel VanderWerf

2/11/2006 7:52:00 PM

0

why the lucky stiff wrote:
> Joel VanderWerf wrote:
>
>> Hey, _why, what do you think about allowing YAML to dump/load Class and
>> Module objects rather than gagging? I've posted code like the following
>> (different versions for 1.8.2 and 1.8.4) several times in response to
>> inquiries on ruby-talk, and found it useful myself.
>>
>>
> I've been reluctant, because reloading these objects causes trouble if
> you haven't required the right libraries. But I think if YAML's error
> message was okay, it would work.
>
> Oh and the best place for getting Syck requests through is now here:
> http://code.whytheluckystiff.net/syck...

Ok. I've submitted this patch and also the :SortKeys issue to the Syck Trak.

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407


DVH

2/14/2010 12:05:00 PM

0


"smurf" <smurf@smurf.com> wrote in message
news:7tq343F136U1@mid.individual.net...
> Delta wrote:
>> On Sat, 13 Feb 2010 16:02:38 +0000, smurf wrote:
>>
>>> Chris X wrote:
>>>> http://news.bbc.co.uk/1/hi/uk/8...
>>>
>>>
>>>> It claimed that members of the Israel Defence Forces (IDF), sent to
>>>> help with the humanitarian effort after Haiti's devastating quake,
>>>> were selling human organs.
>>>>
>>>>
>>> So who would they be selling them to?
>>
>> so, you feigning stupidity or what....?
>
> No, i want to know who you are going to sell organs to, that are taken
> from people in Haiti. For an organ to be transpantable it needs to have a
> matching tissue type, tissue types will fall on racial grounds (or
> isolated communities).
>
> So, without feigning stupidity, who would they be selling them to?

Hmm. Now I never knew that.

"By regression analysis, the non-black recipients who received a kidney from
black donors had a significant lower survival rate compared to those who
received a kidney from a non-black donor (hazard ratio 1.111, p=0.014) after
adjusting for all known variables."

http://www.sciencedaily.com/releases/2009/10/091030...

"The chances of finding a suitable match for a transplant recipient are
greatly increased if the donor is of the same ethnic background."

http://www.lifepassiton.org/pages.cfm?...

Any comment, Delta?