[BioRuby] Beautiful code for Bioinformatics

Pjotr Prins pjotr.public14 at thebird.nl
Thu Feb 9 05:03:54 EST 2012


We would like to highlight a project which sets a shining example for
using Ruby for bioinformatics. We will vote on that on this list.

Hereby I invite everyone to have a look at the projects on
http://biogems.info/ and pick out a code snippet you really like.
Send it to the mailing list, and explain why you think you like it.

You can put forward one of your own projects :)

~~~

As an example, I am going to propose an implementation feature in the
biogem tool, which represents a bit of Ruby meta-programming. It is
called opening classes, and can be useful in overriding BioRuby
itself, something I'll show below.

Biogem does not implement everything from scratch. It uses a library
from the Jeweler project, which was never designed to be shared(!).
I.e. Jeweler was subverted for our purposes.

Raoul put this together. The code I refer to lives, for example, in my
forked project:

  https://github.com/pjotrp/bioruby-gem/blob/master/lib/bio-gem/mod/jeweler.rb

what you see here is that Biogem reopens the Jeweler::Generator class with

  class Jeweler
    class Generator 

      (...)

next, it overrides methods in that class. Because the file
(jeweler.rb) gets included *later* than the original class, the
overridden methods get called. The original methods can be renamed,
e.g.

  alias original_render_template render_template

and can be called from the overriding method.

This technique of reopening classes and overriding behaviour is used
in Ruby on Rails (indeed), but also in bio-logger and the
bio-alignment gems. In bio-alignment it is used to make the BioRuby
Bio::Sequence object enumerable, see

  https://github.com/pjotrp/bioruby-alignment/blob/master/lib/bio-alignment/bioruby.rb

Having Bio::Sequence enumerable allows you to use enumerable
functional methods, such as 'map'. For example I can now write

  @seq.map { |codon| codon.to_s }.join(' ')

There is a case to be made to have standard BioRuby use Enumerable.
However BioRuby has to support Ruby 1.8, which differs in this area.
By reopening the class I can make it look like it is part of BioRuby
anyway. I think it is a very powerful feature, and Raoul did the
right thing in making Jeweler work for Biogem. I think it is an
impressive example of beautiful code.

Pj


More information about the BioRuby mailing list