[BioRuby] restriction enzyme module

Toshiaki Katayama ktym at hgc.jp
Tue Apr 3 20:30:20 UTC 2007


Trevor,

I think that we are ready for the next release on core part,
but I have some requests on the coding style of your modules
to be included in the release.

Firstly, your code is well documented but you have a lot of
sub classes under the Bio::RestrictionEnzyme name space.
It looks very complicated and I still don't understand which
class to use depending on the situations.
Could you describe the typical use cases?
I hope to include your description in the tutorial, if possible.

module Bio
  class RestrictionEnzyme
    module CutSymbol
      class CutSymbol__
    module StringFormatting
    class Fragments < Array
    class Analysis
    class DoubleStranded
      class EnzymeAction (empty?)
      class AlignedStrands
      class CutLocationPair < Array
      class CutLocationPairInEnzymeNotation < CutLocationPair
      class CutLocations < Array
      class CutLocationsInEnzymeNotation < CutLocations
    class SingleStrand < Bio::Sequence::NA
      class CutLocationsInEnzymeNotation < Array
    class SingleStrandComplement < SingleStrand (only def orientation; [3, 5]; end)
    class Range
      class CutRange (empty?)
      class CutRanges < Array
      class HorizontalCutRange < CutRange
      class SequenceRange
        class CalculatedCuts
        class Fragment
        class Fragments < Array
      class VerticalCutRange < CutRange


Secondly, I don't like to have code to modify the RUBYLIB in the library.

lib/bio/util/restriction_enzyme/analysis.rb
lib/bio/util/restriction_enzyme/analysis_basic.rb
lib/bio/util/restriction_enzyme/double_stranded.rb
lib/bio/util/restriction_enzyme/double_stranded/aligned_strands.rb
lib/bio/util/restriction_enzyme/double_stranded/cut_location_pair.rb
lib/bio/util/restriction_enzyme/double_stranded/cut_location_pair_in_enzyme_notation.rb
lib/bio/util/restriction_enzyme/double_stranded/cut_locations.rb
lib/bio/util/restriction_enzyme/double_stranded/cut_locations_in_enzyme_notation.rb
lib/bio/util/restriction_enzyme/range/cut_range.rb
lib/bio/util/restriction_enzyme/range/cut_ranges.rb
lib/bio/util/restriction_enzyme/range/horizontal_cut_range.rb
lib/bio/util/restriction_enzyme/range/sequence_range.rb
lib/bio/util/restriction_enzyme/range/sequence_range/calculated_cuts.rb
lib/bio/util/restriction_enzyme/range/sequence_range/fragment.rb
lib/bio/util/restriction_enzyme/range/sequence_range/fragments.rb
lib/bio/util/restriction_enzyme/range/vertical_cut_range.rb
lib/bio/util/restriction_enzyme/single_strand.rb
lib/bio/util/restriction_enzyme/single_strand/cut_locations_in_enzyme_notation.rb
lib/bio/util/restriction_enzyme/single_strand_complement.rb
lib/bio/util/restriction_enzyme/string_formatting.rb
--------------------------------------------------
require 'pathname'
libpath = Pathname.new(File.join(File.dirname(__FILE__), ['..'] * 4, 'lib')).cleanpath.to_s
$:.unshift(libpath) unless $:.include?(libpath)
--------------------------------------------------

Why these lines are needed?
Loading all modules under the restriction_enzyme directory in
lib/bio/util/restriction_enzyme.rb isn't enough?


lib/bio/util/restriction_enzyme/integer.rb
--------------------------------------------------
class Integer #:nodoc:
  def negative?
    self < 0
  end
end
--------------------------------------------------

I don't like to modify the Ruby's build-in classes in BioRuby library.
Besides, this file only contains the above definition and
the method doesn't seem to worth to be added.
You used this method only few times and

  if (a != nil and a.negative?) or (b != nil and b.negative?)

is enough to be

  if (a != nil and a < 0) or (b != nil and b < 0)

How do you think?


lib/bio/util/restriction_enzyme/analysis_basic.rb
--------------------------------------------------
require 'pp'
--------------------------------------------------

Why you need 'pp' library here? (It seems that the module is not used.)


lib/bio/util/restriction_enzyme/range/cut_range.rb
--------------------------------------------------
module Bio; end
class Bio::RestrictionEnzyme
class Range
class CutRange
end # CutRange
end # Range
end # Bio::RestrictionEnzyme
--------------------------------------------------

Why this empty class need to be present?


lib/bio/util/restriction_enzyme/analysis_basic.rb
--------------------------------------------------
  # Creates an array of EnzymeActions based on the DNA sequence and supplied enz
ymes.
  #
  # ---
  # *Arguments*
  # * +sequence+: The string of DNA to match the enzyme recognition sites agains
t
  # * +args+:: The enzymes to use.
  # *Returns*:: +Array+ with the first element being an array of EnzymeAction ob
jects that +sometimes_cut+, and are subject to competition.  The second is an ar
ray of EnzymeAction objects that +always_cut+ and are not subject to competition
.
--------------------------------------------------

Could you fold your RDoc documents less than 80 columns as long as possible?
Or should I use larger terminal width...?


And, you looks to have different strategies for RDoc documentation on each file.
Which is the best practice?

lib/bio/util/restriction_enzyme.rb
--------------------------------------------------
module Bio #:nodoc:
--------------------------------------------------

or

lib/bio/util/restriction_enzyme/double_stranded/cut_location_pair.rb
--------------------------------------------------
module Bio; end
--------------------------------------------------

or

lib/bio/util/restrction_enzyme/cut_symbol.rb
--------------------------------------------------
nil # to separate file-level rdoc from following statement # !> useless use of n
il in void context
--------------------------------------------------

Besides, many of your modules have duplicated header lines
(module name, authors, copyright etc.).
However, this is not the way documented in the README.DEV file
(included in the BioRuby distribution).
Why you do so?

lib/bio/util/color_scheme.rb
lib/bio/util/contingency_table.rb
lib/bio/util/restriction_enzyme.rb
lib/bio/util/restrction_enzyme/analysis.rb
lib/bio/util/restriction_enzyme/analysis_basic.rb
lib/bio/util/restriction_enzyme/cut_symbol.rb
lib/bio/util/restriction_enzyme/double_stranded.rb
lib/bio/util/restriction_enzyme/double_stranded/aligned_strands.rb
lib/bio/util/restriction_enzyme/double_stranded/cut_location_pair.rb
lib/bio/util/restriction_enzyme/double_stranded/cut_location_pair_in_enzyme_notation.rb
lib/bio/util/restriction_enzyme/double_stranded/cut_locations.rb
lib/bio/util/restriction_enzyme/double_stranded/cut_locations_in_enzyme_notation.rb
lib/bio/util/restriction_enzyme/range/cut_range.rb
lib/bio/util/restriction_enzyme/range/cut_ranges.rb
lib/bio/util/restriction_enzyme/range/horizontal_cut_range.rb
lib/bio/util/restriction_enzyme/range/sequence_range.rb
lib/bio/util/restriction_enzyme/range/sequence_range/calculated_cuts.rb
lib/bio/util/restriction_enzyme/range/sequence_range/fragment.rb
lib/bio/util/restriction_enzyme/range/sequence_range/fragments.rb
lib/bio/util/restriction_enzyme/range/vertical_cut_range.rb
lib/bio/util/restriction_enzyme/single_strand.rb
lib/bio/util/restriction_enzyme/single_strand/cut_locations_in_enzyme_notation.rb
lib/bio/util/restriction_enzyme/single_strand_complement.rb
lib/bio/util/restriction_enzyme/string_formatting.rb
--------------------------------------------------
#
# bio/util/restrction_enzyme/cut_symbol.rb - Defines the symbol used to mark a c
ut in an enzyme sequence
#
# Author::    Trevor Wennblom  <mailto:trevor at corevx.com>
# Copyright:: Copyright (c) 2005-2007 Midwinter Laboratories, LLC (http://midwin
terlabs.com)
# License::   Distributes under the same terms as Ruby
#
#  $Id: cut_symbol.rb,v 1.4 2007/01/01 05:07:04 trevor Exp $
#

(snip)

#
# bio/util/restrction_enzyme/cut_symbol.rb - Defines the symbol used to mark a c
ut in an enzyme sequence
#
# Author::    Trevor Wennblom  <mailto:trevor at corevx.com>
# Copyright:: Copyright (c) 2005-2007 Midwinter Laboratories, LLC (http://midwin
terlabs.com)
# License::   Distributes under the same terms as Ruby
#
--------------------------------------------------


lib/bio/util/restriction_enzyme/analysis_basic.rb
--------------------------------------------------
class Bio::Sequence::NA
  # NOTE: move this into Bio::Sequence::NA
  def cut_with_enzyme(*args)
    Bio::RestrictionEnzyme::Analysis.cut(self, *args)
  end
  alias cut_with_enzymes cut_with_enzyme
end
--------------------------------------------------

When do you plan to move this into lib/bio/sequence.rb?


Sorry for many questions and thanks in advance.

Toshiaki





More information about the BioRuby mailing list