[BioRuby] Beautiful code for Bioinformatics
Pjotr Prins
pjotr.public14 at thebird.nl
Sat Feb 11 17:46:16 UTC 2012
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/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
> _______________________________________________
> 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