[BioRuby] Beautiful code for Bioinformatics

Raoul Bonnal bonnal at ingm.org
Sun Feb 12 18:35:05 EST 2012


I like this idea and commenting or posting snipped code is the chance to
discuss about Ruby and design patterns or obscure techniques. Pjotr
commented the way I reopened a class -thanks!- and that is called Monkey
Patch technique http://en.wikipedia.org/wiki/Monkey_patch ; Metaprogramming
Ruby by Paolo Perrotta  it's something every Ruby developer should read.

So +1 to use this ml for basic/advanced ruby questions not only for bio
stuffs and the talented/skilled coders will provide support for sure.

PS: I'm studing D :-)
 


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