[BioRuby] Beautiful code for Bioinformatics
Raoul Bonnal
bonnal at ingm.org
Sat Feb 11 15:15:02 EST 2012
LOL
On 11/02/12 18.46, "Pjotr Prins" <pjotr.public14 at thebird.nl> wrote:
> Correct me if I am wrong, but has everyone moved across to BioPython
> now? Or even to the dark side?
>
> Pj.
>
> On Thu, Feb 09, 2012 at 11:03:54AM +0100, Pjotr Prins wrote:
>> 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/bio
>> ruby.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
>> _______________________________________________
>> BioRuby Project - http://www.bioruby.org/
>> BioRuby mailing list
>> BioRuby at lists.open-bio.org
>> http://lists.open-bio.org/mailman/listinfo/bioruby
>>
> _______________________________________________
> BioRuby Project - http://www.bioruby.org/
> BioRuby mailing list
> BioRuby at lists.open-bio.org
> http://lists.open-bio.org/mailman/listinfo/bioruby
More information about the BioRuby
mailing list