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

Discussion in 'Ruby' started by Eric Promislow, Oct 31, 2006.

  1. 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
    Eric Promislow, Oct 31, 2006
    #1
    1. Advertising

  2. 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

    >
    > def get_class_info(clsName, info)
    > clsFile = "#{@sysdir}/#{clsName}/cdesc-#{clsName}.yaml"
    > puts "About to yaml <<#{clsFile}>>"
    > clsInfo = YAML.load(File.open(clsFile) { |io| io.read.gsub(/- !.*/, '- ') }
    > 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
    Eric Promislow, Oct 31, 2006
    #2
    1. Advertising

  3. Eric Promislow

    Ryan Davis Guest

    On Oct 31, 2006, at 1:05 PM, Eric Promislow wrote:

    > 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.
    Ryan Davis, Oct 31, 2006
    #3
  4. On Wed, Nov 01, 2006 at 06:05:12AM +0900, Eric Promislow wrote:
    > 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>

    --
    Mauricio Fernandez - http://eigenclass.org - singular Ruby
    Mauricio Fernandez, Oct 31, 2006
    #4
  5. 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
    Ryan Davis wrote:
    > On Oct 31, 2006, at 1:05 PM, Eric Promislow wrote:
    >
    > > 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.
    Eric Promislow, Oct 31, 2006
    #5
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.

Share This Page