Skip to content
Snippets Groups Projects
  1. Oct 13, 2015
  2. Oct 20, 2014
    • Vermaat's avatar
      Use unicode strings · 2a4dc3c1
      Vermaat authored
      Don't fix what ain't broken. Unfortunately, string handling in Mutalyzer
      really is broken. So we fix it.
      
      Internally, all strings should be represented by unicode strings as much as
      possible. The main exception are large reference sequence strings. These can
      often better be BioPython sequence objects, since that is how we usually get
      them in the first place.
      
      These changes will hopefully make Mutalyzer more reliable in working with
      incoming data. As a bonus, they're a first (small) step towards Python 3
      compatibility [1].
      
      Our strategy is as follows:
      
      1. We use `from __future__ import unicode_literals` at the top of every file.
      2. All incoming strings are decoded to unicode (if necessary) as soon as
         possible.
      3. Outgoing strings are encoded to UTF8 (if necessary) as late as possible.
      4. BioPython sequence objects can be based on byte strings as well as unicode
         strings.
      5. In the database, everything is UTF8.
      6. We worry about uploaded and downloaded reference files and batch jobs in a
         later commit.
      
      Point 1 will ensure that all string literals in our source code will be
      unicode strings [2].
      
      As for point 4, sometimes this may even change under our eyes (e.g., calling
      `.reverse_complement()` will change it to a byte string). We don't care as
      long as they're BioPython objects, only when we get the sequence out we must
      have it as unicode string. Their contents are always in the ASCII range
      anyway.
      
      Although `Bio.Seq.reverse_complement` works fine on Python byte strings (and
      we used to rely on that), it crashes on a Python unicode string. So we take
      care to only use it on BioPython sequence objects and wrote our own reverse
      complement function for unicode strings (`mutalyzer.util.reverse_complement`).
      
      As for point 5, SQLAlchemy already does a very good job at presenting decoding
      from and encoding to UTF8 for us.
      
      The Spyne documentation has the following to say about their `String` and
      `Unicode` types [3]:
      
      > There are two string types in Spyne: `spyne.model.primitive.Unicode` and
      > `spyne.model.primitive.String` whose native types are `unicode` and `str`
      > respectively.
      >
      > Unlike the Python `str`, the Spyne `String` is not for arbitrary byte
      > streams. You should not use it unless you are absolutely, positively sure
      > that you need to deal with text data with an unknown encoding. In all other
      > cases, you should just use the `Unicode` type. They actually look the same
      > from outside, this distinction is made just to properly deal with the quirks
      > surrounding Python-2's `unicode` type.
      >
      > Remember that you have the `ByteArray` and `File` types at your disposal
      > when you need to deal with arbitrary byte streams.
      >
      > The `String` type will be just an alias for `Unicode` once Spyne gets ported
      > to Python 3. It might even be deprecated and removed in the future, so make
      > sure you are using either `Unicode` or `ByteArray` in your interface
      > definitions.
      
      So let's not ignore that and never use `String` anymore in our webservice
      interface.
      
      For the command line interface it's a bit more complicated, since there seems
      to be no reliable way to get the encoding of command line arguments. We use
      `sys.stdin.encoding` as a best guess.
      
      For us to interpret a sequence of bytes as text, it's key to be aware of their
      encoding. Once decoded, a text string can be safely used without having to
      worry about bytes. Without unicode we're nothing, and nothing will help
      us. Maybe we're lying, then you better not stay. But we could be safer, just
      for one day. Oh-oh-oh-ohh, oh-oh-oh-ohh, just for one day.
      
      [1] https://docs.python.org/2.7/howto/pyporting.html
      [2] http://python-future.org/unicode_literals.html
      [3] http://spyne.io/docs/2.10/manual/03_types.html#strings
      2a4dc3c1
  3. Aug 27, 2014
  4. Jan 22, 2014
    • Vermaat's avatar
      Use fixtures in the unit tests · c49d49f0
      Vermaat authored
      This is The Good Stuff. The entire test suite can now be run without
      having to setup a database, running the batch checker, any of the web
      services or the website. It even passes without an internet connection.
      In, like, 30 seconds! Awesome!
      
      This means tests don't randomly fail after some reference sequence
      changes on the NCBI server and it doesn't take an entire configured
      server with mapping database setup to run the tests. Those are things
      of the past! No more frustrations, Mutalyzer is testable!
      
      Going down now...
      
      The mountain screamed three times today
      I guess it thought it'd like to play
      How much does one have to pay
      To fry a peak and melt away
      Launching titan's breath on mine
      The sweating measure lands on time
      
      And the old man, down by the river
      Well he walks up and he walks on down
      To the spaceship that's parked at your doorstep
      And it's waiting to take you away now
      
      Goin' down now
      Goin' down now
      
      Looking for the rate that crowed
      He's hooked up down in Mexico
      Slap my nerve now give me more
      It's my disaster friend, not yours
      
      And the old man, down by the river
      Well he walks up and he walks on down
      To the spaceship that's parked at your doorstep
      And it's waiting to take you away now
      
      And the last one, it's down by the river
      Where he gets up and he walks on down
      To the spaceship that's parked at your doorstep
      And it's waiting to take you away now
      
      It's down by the river, it's always this way now
      It's down by the river, it's always this way now
      
      Going down now
      Going down now
      now, now, now
      
      down, down, down
      c49d49f0
  5. Jan 04, 2014
  6. Dec 23, 2013
    • Vermaat's avatar
      Fix unit tests with SQLAlchemy · 94df7c07
      Vermaat authored
      This involves making the SQLAlchemy session reconfigurable at run-time,
      which is done automatically on updating the Mutalyzer configuration using
      configuration update callbacks.
      94df7c07
  7. Dec 19, 2013
  8. May 21, 2012
  9. May 14, 2012
  10. Nov 04, 2011
  11. Aug 19, 2011
  12. Apr 07, 2011
  13. Apr 05, 2011
  14. Apr 04, 2011
  15. Mar 29, 2011
  16. Mar 28, 2011
  17. Mar 25, 2011
  18. Mar 24, 2011
  19. Mar 23, 2011
  20. Mar 14, 2011
  21. Mar 08, 2011
    • Vermaat's avatar
      Try to handle whole-exon deletion and exon-fusion. · e301a743
      Vermaat authored
      src/Modules/Mutator.py:
      - Added method (add_removed_sites) to give splice sites that should be
        ignored. Now newSplice() does not process these splice sites.
      
      src/Mutalyzer.py:
      - Handle whole-exon deletions and exon-fusions by removing splice sites
        where we can. A notice is printed in this case. Otherwise, if splice
        sites are hit in some other way, no protein product is predicted. This
        fixes Trac issues #35 and #36.
      
      
      
      git-svn-id: https://humgenprojects.lumc.nl/svn/mutalyzer/trunk@195 eb6bd6ab-9ccd-42b9-aceb-e2899b4a52f1
      e301a743
  22. Feb 25, 2011
  23. Feb 24, 2011
    • Vermaat's avatar
      Reworked the calculation of new splice site positions. · 697c044e
      Vermaat authored
      src/Modules/Mutator.py:
      - For deletions, position shifts are now active from the first position
        following the deletion. Previous behaviour was from (but not including)
        the first position of the deletion itself.
      - Added method to check if the resulting shift gets smaller at some
        specific position: Mutator.shift_minus_at(position).
      - The positions in the shift list are now interpreted as a shift from
        (and including) the listed position. Previous behaviour was following
        (and not including) the listed position.
      - The Mutator.newSplice(sites) method has some additional logic. This
        fixes some bugs, including Trac bug #30.
      
      src/tests/test_mutator.py:
      - Written a lot of unit tests for the changes in Mutator.py.
      
      
      
      git-svn-id: https://humgenprojects.lumc.nl/svn/mutalyzer/trunk@188 eb6bd6ab-9ccd-42b9-aceb-e2899b4a52f1
      697c044e
Loading