REXML (1.8.6-p110) backwards compatibility problem with rcov

Discussion in 'Ruby' started by Brian Candler, Oct 22, 2007.

  1. When I upgraded my Ubuntu 6.06.1 system from its stock ruby-1.8.4 to
    ruby-1.8.6-p110, I found that the previously working rcov-0.8.0.2 was
    raising REXML exceptions when it tried to generate its output (*)

    I needed to make a couple of patches to REXML to fix this. The first patch
    is because rcov passes Fixnums as attribute values, e.g.

    table_:)cellpadding => 0, :cellspacing => 0, :align => "right")

    This could have been fixed at the rcov side, but since it *did* used to work
    with rexml, I consider this a backwards-compatibility failure. The fix is
    trivial:

    --- rexml/text.rb.orig 2007-10-22 08:00:04.000000000 +0100
    +++ rexml/text.rb 2007-10-22 08:00:33.000000000 +0100
    @@ -286,7 +286,7 @@
    EREFERENCE = /&(?!#{Entity::NAME};)/
    # Escapes all possible entities
    def Text::normalize( input, doctype=nil, entity_filter=nil )
    - copy = input
    + copy = input.to_s
    # Doing it like this rather than in a loop improves the speed
    #copy = copy.gsub( EREFERENCE, '&' )
    copy = copy.gsub( "&", "&" )

    (Note that there are other places in this file which might benefit from a
    to_s as well)

    The second is almost certainly a bug in REXML: it's a misnamed local
    variable.

    --- rexml/document.rb.orig 2007-10-22 08:02:36.000000000 +0100
    +++ rexml/document.rb 2007-10-22 08:03:01.000000000 +0100
    @@ -183,7 +183,7 @@
    output = Output.new( output, xml_decl.encoding )
    end
    formatter = if indent > -1
    - if transitive
    + if trans
    REXML::Formatters::Transitive.new( indent, ie_hack )
    else
    REXML::Formatters::pretty.new( indent, ie_hack )

    After these changes, rcov seems to run happily.

    I wasn't sure where best to post this problem and its solution: ruby-core
    (since REXML is in the ruby standard library), the REXML home site, or the
    rcov home site. So I'm posting it here instead :)

    Regards,

    Brian.

    (*) The exception I saw initially was:

    /usr/local/lib/ruby/1.8/rexml/text.rb:292:in `normalize': private method `gsub' called for 0:Fixnum (NoMethodError)
    from /usr/local/lib/ruby/1.8/rexml/element.rb:1084:in `[]='
    from /usr/local/lib/ruby/1.8/rexml/element.rb:586:in `add_attribute'
    from (eval):490:in `table_'
    from (eval):490:in `each'
    from (eval):490:in `table_'
    from (eval):490:in `each'
    from (eval):490:in `table_'
    from /usr/local/lib/ruby/gems/1.8/gems/rcov-0.8.0.2/lib/rcov/report.rb:702:in `format_overview'
    ... 61 levels...

    After I fixed this by adding to_s in Text::normalize, I got

    /usr/local/lib/ruby/1.8/rexml/document.rb:186:in `write': undefined local variable or method `transitive' for <UNDEFINED> ... </>:REXML::Document (NameError)
    from (eval):93:in `pretty'
    from /usr/local/lib/ruby/gems/1.8/gems/rcov-0.8.0.2/lib/rcov/report.rb:727:in `format_overview'
    from /usr/local/lib/ruby/gems/1.8/gems/rcov-0.8.0.2/lib/rcov/report.rb:758:in `create_index'
    from (eval):104:in `create'
    from (eval):80:in `tracking_additions'
    from (eval):103:in `create'
    from (eval):372:in `x_'
    from /usr/local/lib/ruby/gems/1.8/gems/rcov-0.8.0.2/lib/rcov/report.rb:758:in `create_index'
    ... 21 levels...
     
    Brian Candler, Oct 22, 2007
    #1
    1. Advertising

  2. On Mon, Oct 22, 2007 at 08:50:24AM +0100, Brian Candler wrote:
    > The second is almost certainly a bug in REXML: it's a misnamed local
    > variable.


    Oh, I see there's a fix for this in trunk already, committed 9 days ago:
    http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rexml/document.rb?r1=13597&r2=13686
    (but I don't think it has been merged to branches/ruby_1_8_6)

    I can't see a fix for Fixnum attribute values though.

    Regards,

    Brian.
     
    Brian Candler, Oct 22, 2007
    #2
    1. Advertising

  3. Brian Candler

    Sean Hussey Guest

    Nice catch!

    After applying both fixes, I now get this:

    /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `[]': no
    implicit conversion from nil to integer (TypeError)
    from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `wrap'
    from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `wrap'
    from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:90:in
    `write_text'
    from /usr/local/lib/ruby/1.8/rexml/formatters/default.rb:50:in `write'
    from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:75:in
    `write_element'
    from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:73:in `each'
    from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:73:in
    `write_element'
    from /usr/local/lib/ruby/1.8/rexml/formatters/default.rb:31:in `write'
    ... 16 levels...

    rcov outputs the index.html file and the first few controller files,
    so I can trace it to which file it's getting choked on, but were there
    any other fixes you had to put in?

    Thanks,

    Sean

    On 10/22/07, Brian Candler <> wrote:
    > On Mon, Oct 22, 2007 at 08:50:24AM +0100, Brian Candler wrote:
    > > The second is almost certainly a bug in REXML: it's a misnamed local
    > > variable.

    >
    > Oh, I see there's a fix for this in trunk already, committed 9 days ago:
    > http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rexml/document.rb?r1=13597&r2=13686
    > (but I don't think it has been merged to branches/ruby_1_8_6)
    >
    > I can't see a fix for Fixnum attribute values though.
    >
    > Regards,
    >
    > Brian.
    >
    >
     
    Sean Hussey, Oct 30, 2007
    #3
  4. Brian Candler

    Guest

    Ive also applied both fixes and Im seeing exactly the same problem.
    Any updates on this?

    /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `[]': no
    > implicit conversion from nil to integer (TypeError)
    > from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `wrap'
    > from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `wrap'
    > from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:90:in
    > `write_text'
    > from /usr/local/lib/ruby/1.8/rexml/formatters/default.rb:50:in `write'
    > from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:75:in
    > `write_element'
    > from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:73:in `each'
    > from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:73:in
    > `write_element'
    > from /usr/local/lib/ruby/1.8/rexml/formatters/default.rb:31:in `write'
    > ... 16 levels...


    Thanks,

    On Oct 30, 6:09 pm, "Sean Hussey" <> wrote:
    > Nice catch!
    >
    > After applying both fixes, I now get this:
    >
    > /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `[]': no
    > implicit conversion from nil to integer (TypeError)
    > from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `wrap'
    > from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `wrap'
    > from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:90:in
    > `write_text'
    > from /usr/local/lib/ruby/1.8/rexml/formatters/default.rb:50:in `write'
    > from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:75:in
    > `write_element'
    > from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:73:in `each'
    > from /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:73:in
    > `write_element'
    > from /usr/local/lib/ruby/1.8/rexml/formatters/default.rb:31:in `write'
    > ... 16 levels...
    >
    > rcov outputs the index.html file and the first few controller files,
    > so I can trace it to which file it's getting choked on, but were there
    > any other fixes you had to put in?
    >
    > Thanks,
    >
    > Sean
    >
    > On 10/22/07, Brian Candler <> wrote:
    >
    > > On Mon, Oct 22, 2007 at 08:50:24AM +0100, Brian Candler wrote:
    > > > The second is almost certainly a bug in REXML: it's a misnamed local
    > > > variable.

    >
    > > Oh, I see there's a fix for this in trunk already, committed 9 days ago:
    > >http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/lib/rexml/document....
    > > (but I don't think it has been merged to branches/ruby_1_8_6)

    >
    > > I can't see a fix for Fixnum attribute values though.

    >
    > > Regards,

    >
    > > Brian.
     
    , Oct 31, 2007
    #4
  5. Brian Candler

    Guest

    Re: REXML (1.8.6-p110) backwards compatibility problem with

    I got these string of errors in the order reported also. I solved this
    by editing the following files:

    ...prefix.../ruby/gems/1.8/gems/rspec-1.0.8/lib/spec/rake/verify_rcov.rb
    ...prefix.../ruby/1.8/rexml/formatters/pretty.rb

    Plus the files already patched by this point. It seems like if your
    stack trace says formatters/default.rb instead of formatters/pretty.rb
    then that is the file you need to patch.

    My formatters/pretty.rb patch looks like the following:
    > place = string.rindex(' ', width) || width # Position in string with last ' ' before cutoff

    < place = string.rindex(' ', width) # Position in string with last ' '
    before cutoff

    My rake/verify_rcov.rb patch looks like:
    > if line =~ /<tt class='coverage_total'> (\d+\.\d+)% <\/tt> &nbsp; <\/td>/

    < if line =~ /<tt.*?>(\d+\.\d+)%<\/tt>&nbsp;<\/td>/

    Hope that helps someone,
    Susan

    unknown wrote:
    > Ive also applied both fixes and Im seeing exactly the same problem.
    > Any updates on this?
    >
    > /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `[]': no
    >> `write_element'
    >> from /usr/local/lib/ruby/1.8/rexml/formatters/default.rb:31:in `write'
    >> ... 16 levels...

    >
    > Thanks,


    --
    Posted via http://www.ruby-forum.com/.
     
    , Nov 4, 2007
    #5
  6. Brian Candler

    Jim Flanagan Guest

    Re: REXML (1.8.6-p110) backwards compatibility problem with

    Thanks Susan.

    For the record, I'm running "rake test:functionals" on a Rails 2.1
    project using:

    ruby 1.8.7-p22 from Macports 1.600 on OS X (Tiger)
    rcov 0.8.1.2.0

    and getting the error:
    /opt/local/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `[]': no
    implicit conversion from nil to integer (TypeError)

    until I applied the patch below to pretty.rb

    S. Potter wrote:
    > My formatters/pretty.rb patch looks like the following:
    >> place = string.rindex(' ', width) || width # Position in string with last ' ' before cutoff

    --
    Posted via http://www.ruby-forum.com/.
     
    Jim Flanagan, Jul 16, 2008
    #6
  7. Brian Candler

    Jeff Mr Guest

    Re: REXML (1.8.6-p110) backwards compatibility problem with

    S. Potter wrote:
    > I got these string of errors in the order reported also. I solved this
    > by editing the following files:
    >
    > ...prefix.../ruby/gems/1.8/gems/rspec-1.0.8/lib/spec/rake/verify_rcov.rb
    > ...prefix.../ruby/1.8/rexml/formatters/pretty.rb
    >
    > Plus the files already patched by this point. It seems like if your
    > stack trace says formatters/default.rb instead of formatters/pretty.rb
    > then that is the file you need to patch.
    >
    > My formatters/pretty.rb patch looks like the following:
    >> place = string.rindex(' ', width) || width # Position in string with last ' ' before cutoff

    > < place = string.rindex(' ', width) # Position in string with last ' '
    > before cutoff
    >
    > My rake/verify_rcov.rb patch looks like:
    >> if line =~ /<tt class='coverage_total'> (\d+\.\d+)% <\/tt> &nbsp; <\/td>/

    > < if line =~ /<tt.*?>(\d+\.\d+)%<\/tt>&nbsp;<\/td>/
    >
    > Hope that helps someone,
    > Susan
    >
    > unknown wrote:
    >> Ive also applied both fixes and Im seeing exactly the same problem.
    >> Any updates on this?
    >>
    >> /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `[]': no
    >>> `write_element'
    >>> from /usr/local/lib/ruby/1.8/rexml/formatters/default.rb:31:in `write'
    >>> ... 16 levels...

    >>
    >> Thanks,


    I have done all the fixes except for the fix to:
    ...prefix.../ruby/gems/1.8/gems/rspec-1.0.8/lib/spec/rake/verify_rcov.rb


    Cant find the right file to modify to try that fix...

    After doing the fix to:
    ...prefix.../ruby/1.8/rexml/formatters/pretty.rb
    I am now getting this for an error:
    572 tests, 115117 assertions, 0 failures, 0 errors
    /usr/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `wrap': stack level
    too deep (SystemStackError)
    from /usr/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `wrap'
    from /usr/lib/ruby/1.8/rexml/formatters/pretty.rb:90:in `write_text'
    from /usr/lib/ruby/1.8/rexml/formatters/default.rb:50:in `write'
    from /usr/lib/ruby/1.8/rexml/formatters/pretty.rb:75:in
    `write_element'
    from /usr/lib/ruby/1.8/rexml/formatters/pretty.rb:73:in `each'
    from /usr/lib/ruby/1.8/rexml/formatters/pretty.rb:73:in
    `write_element'
    from /usr/lib/ruby/1.8/rexml/formatters/default.rb:31:in `write'
    from /usr/lib/ruby/1.8/rexml/formatters/pretty.rb:75:in
    `write_element'
    ... 12 levels...
    from /usr/lib/ruby/1.8/rcov.rb:628:in `each'
    from /usr/lib/ruby/1.8/rcov.rb:628:in `dump_coverage_info'
    from /usr/bin/rcov:405
    from /usr/lib/ruby/1.8/test/unit.rb:278


    Any suggestions or help you guys can give me?
    --
    Posted via http://www.ruby-forum.com/.
     
    Jeff Mr, Aug 21, 2008
    #7
  8. Brian Candler

    Josh Sharpe Guest

    Re: REXML (1.8.6-p110) backwards compatibility problem with

    >
    >
    > Any suggestions or help you guys can give me?


    I'm having the same issues as Jeff but am running ruby 1.8.7
    --
    Posted via http://www.ruby-forum.com/.
     
    Josh Sharpe, Feb 6, 2009
    #8
  9. Brian Candler

    Roy Truelove Guest

    Sean Hussey wrote:
    > Nice catch!
    >
    > After applying both fixes, I now get this:
    >
    > /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `[]': no
    > implicit conversion from nil to integer (TypeError)


    Hey Sean, it looks like the rexml code is assuming that there'll be a '
    ' somewhere in the code to wrap on. I was able to fix this with the
    following patch to the pretty.rb file :

    --- /opt/ruby-1.8.7-p72/lib/ruby/1.8/rexml/formatters/pretty.rb.OLD
    2009-02-15 14:47:32.000000000 -0600
    +++ /opt/ruby-1.8.7-p72/lib/ruby/1.8/rexml/formatters/pretty.rb
    2009-02-15 14:48:50.000000000 -0600
    @@ -126,10 +126,11 @@

    def wrap(string, width)
    # Recursively wrap string at width.
    return string if string.length <= width
    place = string.rindex(' ', width) # Position in string with
    last ' ' before cutoff
    + return string if place.nil? # there aren't any ' 's before
    cutoff, nothing to split on.
    return string[0,place] + "\n" + wrap(string[place+1..-1],
    width)
    end

    end
    end

    --
    Posted via http://www.ruby-forum.com/.
     
    Roy Truelove, Feb 15, 2009
    #9
  10. Brian Candler

    John Doxey Guest

    Re: REXML (1.8.6-p110) backwards compatibility problem with

    Roy Truelove wrote:
    > Sean Hussey wrote:
    >> Nice catch!
    >>
    >> After applying both fixes, I now get this:
    >>
    >> /usr/local/lib/ruby/1.8/rexml/formatters/pretty.rb:131:in `[]': no
    >> implicit conversion from nil to integer (TypeError)

    >
    > Hey Sean, it looks like the rexml code is assuming that there'll be a '
    > ' somewhere in the code to wrap on. I was able to fix this with the
    > following patch to the pretty.rb file :
    >
    > --- /opt/ruby-1.8.7-p72/lib/ruby/1.8/rexml/formatters/pretty.rb.OLD
    > 2009-02-15 14:47:32.000000000 -0600
    > +++ /opt/ruby-1.8.7-p72/lib/ruby/1.8/rexml/formatters/pretty.rb
    > 2009-02-15 14:48:50.000000000 -0600
    > @@ -126,10 +126,11 @@
    >
    > def wrap(string, width)
    > # Recursively wrap string at width.
    > return string if string.length <= width
    > place = string.rindex(' ', width) # Position in string with
    > last ' ' before cutoff
    > + return string if place.nil? # there aren't any ' 's before
    > cutoff, nothing to split on.
    > return string[0,place] + "\n" + wrap(string[place+1..-1],
    > width)
    > end
    >
    > end
    > end


    There might still be spaces in the string, how about,

    --- pretty.rb.old 2009-05-06 10:50:37.000000000 +1000
    +++ pretty.rb 2009-05-06 10:55:37.000000000 +1000
    @@ -128,6 +128,8 @@
    # Recursively wrap string at width.
    return string if string.length <= width
    place = string.rindex(' ', width) # Position in string with
    last ' ' before cutoff
    + place = string.index(' ') if place.nil?
    + return string if place.nil? # there aren't any ' 's before
    cutoff, nothing to split on.
    return string[0,place] + "\n" + wrap(string[place+1..-1],
    width)
    end


    --
    Posted via http://www.ruby-forum.com/.
     
    John Doxey, May 6, 2009
    #10
    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.
Similar Threads
  1. Sonny
    Replies:
    7
    Views:
    373
    Roger Leigh
    Feb 10, 2004
  2. Urabe Shyouhei

    Ruby 1.8.6-p110 released.

    Urabe Shyouhei, Sep 23, 2007, in forum: Ruby
    Replies:
    3
    Views:
    96
    Jayson Williams
    Sep 24, 2007
  3. Luis Lavena
    Replies:
    6
    Views:
    122
    Luis Lavena
    Oct 19, 2007
  4. Mauricio Fernandez
    Replies:
    6
    Views:
    110
    Michel Demazure
    Nov 20, 2007
  5. Gaspard Bucher

    rcov fails with errors related to rexml

    Gaspard Bucher, Oct 3, 2008, in forum: Ruby
    Replies:
    1
    Views:
    126
    Rob Sanheim
    Oct 5, 2008
Loading...

Share This Page