Puzzling over why ri can open the std ruby/ri .yaml files, but raw yaml can't

E

Eric Promislow

If I run <<ri Abbrev>>, no problem.

But with this code:

##########
require 'yaml'
require 'pp'

class RiFinder
def initialize(sysdir)
@sysdir = sysdir
end

def get_class_info(clsName, info)
clsFile = "#{@sysdir}/#{clsName}/cdesc-#{clsName}.yaml"
puts "About to yaml <<#{clsFile}>>"
clsInfo = File.open(clsFile) { |io| YAML.load(io) }
pp clsInfo
end
end

rifinder = RiFinder.new("c:/ruby/share/ri/1.8/system", nil, nil)
rifinder.get_class_info("Abbrev", nil)

#===========

About to yaml <<c:/ruby/share/ri/1.8/system/Abbrev/cdesc-Abbrev.yaml>>
I get this error:
c:/ruby/lib/ruby/1.8/yaml.rb:133:in `transfer': invalid subclass
(TypeError)
from c:/ruby/lib/ruby/1.8/yaml.rb:133:in `load'
from get_yaml_info.rb:19:in `get_class_info'
from get_yaml_info.rb:19:in `get_class_info'
from get_yaml_info.rb:25

ruby 1.8.4 (2006-04-14) [i386-mswin32]

It's the same code, and I don't see ri setting any options in the YAML
namespace
telling it to process types like "!ruby/struct:SM::Flow::p"
differently, although I gather
this is the problem.

Any advice?

I can use yaml.rb to read back files I've written out with it. The
problem is with the
rdoc files. But it works when I go through ri (after adding the bug
fix at line 99
of ri_descriptions.rb given in
http://ruby.about.com/od/gettingstarted/qt/ruby_ri.htm).

Thanks,
Eric
 
E

Eric Promislow

Simple workaround...

clsInfo = YAML.load(File.open(clsFile) { |io| io.read.gsub(/- !.*/, '-
') }

But I'd still appreciate hearing the cause for this bug.

Happens with the stock Ruby 1.8.2 on OS X 10.4 running on an i386,
but with a different error message.

- Eric
 
R

Ryan Davis

If I run <<ri Abbrev>>, no problem.

But with this code:

##########
require 'yaml'
require 'pp'

class RiFinder
def initialize(sysdir)
@sysdir = sysdir
end

def get_class_info(clsName, info)
clsFile = "#{@sysdir}/#{clsName}/cdesc-#{clsName}.yaml"
puts "About to yaml <<#{clsFile}>>"
clsInfo = File.open(clsFile) { |io| YAML.load(io) }
pp clsInfo
end
end

rifinder = RiFinder.new("c:/ruby/share/ri/1.8/system", nil, nil)
rifinder.get_class_info("Abbrev", nil)

Because you need to load/define all the classes it is trying to
deserialize. yaml doesn't know where they are. Just pop in the
appropriate requires up top and get rid of your munger.

FWIW, I went the munging route for risearch and for that matter...
you seem to be writing much of the same sort of thing. Check my blog
for the code. I'll release it to seattlerb sooner or later.
 
M

Mauricio Fernandez

About to yaml <<c:/ruby/share/ri/1.8/system/Abbrev/cdesc-Abbrev.yaml>>
I get this error:
c:/ruby/lib/ruby/1.8/yaml.rb:133:in `transfer': invalid subclass
(TypeError)
from c:/ruby/lib/ruby/1.8/yaml.rb:133:in `load'
from get_yaml_info.rb:19:in `get_class_info'
from get_yaml_info.rb:19:in `get_class_info'
from get_yaml_info.rb:25

ruby 1.8.4 (2006-04-14) [i386-mswin32]

It's the same code, and I don't see ri setting any options in the YAML
namespace telling it to process types like "!ruby/struct:SM::Flow::p"
differently, although I gather this is the problem.

Any advice?

$ cat ri-problem.rb
require 'yaml'
require 'pp'

class RiFinder
def initialize(sysdir)
@sysdir = sysdir
end

def get_class_info(clsName, info)
clsFile = "#{@sysdir}/#{clsName}/cdesc-#{clsName}.yaml"
puts "About to yaml <<#{clsFile}>>"
clsInfo = File.open(clsFile) { |io| YAML.load(io) }
pp clsInfo
end
end

rifinder = RiFinder.new("/usr/share/ri/1.8/system/")
rifinder.get_class_info("Abbrev", nil)

$ ruby ri-problem.rb
About to yaml <</usr/share/ri/1.8/system//Abbrev/cdesc-Abbrev.yaml>>
/home/batsman/usr//lib/ruby/1.8/yaml.rb:133:in `transfer': invalid subclass (TypeError)
from /home/batsman/usr//lib/ruby/1.8/yaml.rb:133:in `node_import'
from /home/batsman/usr//lib/ruby/1.8/yaml.rb:133:in `load'
from /home/batsman/usr//lib/ruby/1.8/yaml.rb:133:in `load'
from ri-problem.rb:12:in `get_class_info'
from ri-problem.rb:12:in `open'
from ri-problem.rb:12:in `get_class_info'
from ri-problem.rb:18
$ echo 'require "rdoc/ri/ri_reader"' | cat - ri-problem.rb > ri-no-problem.rb
$ ruby ri-no-problem.rb
About to yaml <</usr/share/ri/1.8/system//Abbrev/cdesc-Abbrev.yaml>>
#<RI::ClassDescription:0xa7db27f0
@attributes=[],
@class_methods=[],
@comment=
[#<struct SM::Flow::p
body=
"Calculate the set of unique abbreviations for a given set of strings.">,
#<struct SM::Flow::VERB
body=
" require 'abbrev'\n require 'pp'\n\n pp Abbrev::abbrev(['ruby', 'rules']).sort\n">,
#<struct SM::Flow::p body="<em>Generates:</em>">,
#<struct SM::Flow::VERB
body=
" [[&quot;rub&quot;, &quot;ruby&quot;],\n [&quot;ruby&quot;, &quot;ruby&quot;],\n [&quot;rul&quot;, &quot;rules&quot;],\n [&quot;rule&quot;, &quot;rules&quot;],\n [&quot;rules&quot;, &quot;rules&quot;]]\n">,
#<struct SM::Flow::p
body="Also adds an <tt>abbrev</tt> method to class <tt>Array</tt>.">],
@constants=[],
@full_name="Abbrev",
@includes=[],
@instance_methods=[#<RI::MethodSummary:0xa7db3024 @name="abbrev">],
@name="Abbrev",
@superclass=nil>
 
E

Eric Promislow

Thanks, Ryan,

require 'rdoc/markup/simple_markup/to_flow'

does it, no munging needed. Now if you can tell me how to setup the
current release of cygwin on a win box to build mozilla you'll have
totally made my day. In the meantime, running a find script to zap
all the 13s out of each .sh file seems to be the way to go. Right,
wrong newsgroup...

- Eric

This seems wrong though. I want to load a set of YAML descriptions
I didn't write, and I need to know all possible subtypes
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,056
Latest member
GlycogenSupporthealth

Latest Threads

Top