ó
,ÍÃIc        	   @   s  d  Z  d d l Z d d l Z d d l m Z d d l m Z m Z d d l m	 Z	 d d l m
 Z
 d d l m Z d d l m Z d d	 l m Z yR d d
 l m Z m Z d d l m Z m Z m Z m Z d d l m Z m Z Wn) e e f k
 rd Z e e ƒ ‚ n Xy+ e j d e d e d e d e ƒ Z [ Wn/ e k
 rnZ d e e ƒ Z e e ƒ ‚ n Xd „  Z  d „  Z! d e j" f d „  ƒ  YZ# d e j" f d „  ƒ  YZ$ d e j" f d „  ƒ  YZ% d e j" f d „  ƒ  YZ& e' d k re j( d d ƒ Z) e j* d  e) ƒ n  d S(!   sH   Tests for dealing with storage of biopython objects in a relational db.
iÿÿÿÿN(   t   MissingExternalDependencyError(   t   Seqt
   MutableSeq(   t
   SeqFeature(   t   Alphabet(   t   GenBank(   t   BioSeqDatabase(   t   BioSeq(   t   DBDRIVERt   DBTYPE(   t   DBHOSTt   DBUSERt   DBPASSWDt   TESTDB(   t   DBSCHEMAt   SQL_FILEsB   Check settings in Tests/setup_BioSQL.py if you plan to use BioSQL.t   drivert   usert   passwdt   hostsX   Connection failed, check settings in Tests/setup_BioSQL.py if you plan to use BioSQL: %sc          C   s_  t  j d t d t d t d t ƒ }  y |  j j ƒ  Wn t k
 rH n Xy= d d l	 } | j
 d ƒ d t } |  j j j | d ƒ Wn` |  j j k
 rŸ nJ |  j j |  j j f k
 rè } t | ƒ j d	 t ƒ d k ré ‚  qé n Xd
 t } |  j j | d ƒ |  j ƒ  t  j d t d t d t d t d t ƒ }  |  j t ƒ |  j ƒ  |  j ƒ  d S(   s    Create an empty BioSQL database.R   R   R   R   iÿÿÿÿNi   s   DROP DATABASE s   database "%s" does not exists   CREATE DATABASE t   db(    (    (   R   t   open_databaseR   R   R   R
   t   adaptort
   autocommitt   AttributeErrort   timet   sleepR   t   cursort   executet   modulet   OperationalErrort   IntegrityErrort   ProgrammingErrort   strt   findt   closet   load_database_sqlR   t   commit(   t   serverR   t   sqlt   e(    (    s   test_BioSQL.pyt   create_database)   s6    	





c         C   s‰   t  ƒ  d } t j d t d t d t d t d t ƒ } | j | ƒ } t	 j
 ƒ  } t	 j |  | ƒ } | j | ƒ | j ƒ  | j ƒ  d S(   s|   Load a GenBank file into a BioSQL database.
    
    This is useful for running tests against a newly created database.
    s   biosql-testR   R   R   R   R   N(   R)   R   R   R   R   R   R
   R   t   new_databaseR   t   FeatureParsert   Iteratort   loadR%   R#   (   t	   gb_handlet   db_nameR&   R   t   parsert   iterator(    (    s   test_BioSQL.pyt   load_databaseT   s    
t   ReadTestc           B   s8   e  Z d  Z d Z d „  Z d „  Z d „  Z d „  Z RS(   s<   Test reading a database from an already built database.
    i    c         C   s‚   t  j j t  j ƒ  d d ƒ } t | d ƒ } t | ƒ | j ƒ  t j d t	 d t
 d t d t d t ƒ |  _ |  j d	 |  _ d
 S(   s-   Connect to and load up the database.
        R   s	   cor6_6.gbt   rR   R   R   R   R   s   biosql-testN(   t   ost   patht   joint   getcwdt   openR2   R#   R   R   R   R   R   R
   R   R&   R   (   t   selft   gb_fileR.   (    (    s   test_BioSQL.pyt   setUpo   s    

c         C   s   |  j  j ƒ  |  ` |  `  d  S(   N(   R&   R#   R   (   R:   (    (    s   test_BioSQL.pyt   tearDown~   s    c         C   s   |  j  j ƒ  } d S(   s1   Get a list of all items in the database.
        N(   R   t   values(   R:   t   items(    (    s   test_BioSQL.pyt   test_get_db_itemsƒ   s    c         C   sî   |  j  j d d ƒ } y% |  j  j d d ƒ } t d ƒ ‚ Wn t k
 rM n X|  j  j d d ƒ } y% |  j  j d d ƒ } t d ƒ ‚ Wn t k
 r› n X|  j  j d d ƒ } y% |  j  j d d	 ƒ } t d
 ƒ ‚ Wn t k
 ré n Xd S(   s3   Test retrieval of items using various ids.
        t	   accessiont   X62281s   Not reals   No problem on fake id retrievalt
   display_idt   ATKIN2t
   primary_idt   16353s   Not Reals'   No problem on fake primary id retrievalN(   R   t   lookupt   Assertionerrort
   IndexErrort   AssertionError(   R:   t   item(    (    s   test_BioSQL.pyt   test_lookup_itemsˆ   s$    (   t   __name__t
   __module__t   __doc__t	   loaded_dbR<   R=   R@   RL   (    (    (    s   test_BioSQL.pyR3   j   s   			t   SeqInterfaceTestc           B   sV   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 RS(	   sM   Make sure the BioSQL objects implement the expected biopython interfaces
    c         C   sš   t  j j t  j ƒ  d d ƒ } t | d ƒ } t | ƒ | j ƒ  t j d t	 d t
 d t d t d t ƒ |  _ |  j d	 |  _ |  j j d
 d ƒ |  _ d S(   s   Load a database.
        R   s	   cor6_6.gbR4   R   R   R   R   R   s   biosql-testRA   RB   N(   R5   R6   R7   R8   R9   R2   R#   R   R   R   R   R   R
   R   R&   R   RG   RK   (   R:   R;   R.   (    (    s   test_BioSQL.pyR<   £   s    

c         C   s#   |  j  j ƒ  |  ` |  ` |  `  d  S(   N(   R&   R#   R   RK   (   R:   (    (    s   test_BioSQL.pyR=   ±   s    c         C   s¨   |  j  } t | j t j ƒ s* t d ƒ ‚ | j d k sH t | j ƒ ‚ | j d k s] t ‚ | j d k sr t ‚ | j	 } x& | j
 D] } t | t ƒ s… t ‚ q… Wd S(   sH   Make sure SeqRecords from BioSQL implement the right interface.
        s   Seq retrieval is not corrects   X62281.1RD   s   A.thaliana kin2 gene.N(   RK   t
   isinstancet   seqR   t   DBSeqRJ   t   idt   namet   descriptiont   annotationst   featuresR   (   R:   t   test_recordRX   t   feature(    (    s   test_BioSQL.pyt   test_seq_record·   s    			c         C   s¦   |  j  j } | j } t | t j ƒ s- t ‚ | j } t | ƒ t d ƒ k sT t ‚ | j ƒ  } t | ƒ t d ƒ k s~ t ‚ t	 | ƒ d k s¢ t t	 | ƒ ƒ ‚ d S(   sB   Make sure Seqs from BioSQL implement the right interface.
        t    ip  N(
   RK   RS   t   alphabetRR   R   RJ   t   datat   typet   tostringt   len(   R:   t   test_seqR^   R_   t
   string_rep(    (    s   test_BioSQL.pyRc   Ç   s    		c         C   s¾   |  j  j } | j ƒ  } t | ƒ t | ƒ k s6 t ‚ | j | j k sN t ‚ t | t ƒ sc t ‚ | j ƒ  } t | ƒ t | ƒ k s t ‚ | j | j k s¥ t ‚ t | t	 ƒ sº t ‚ d S(   s7   Check can turn a DBSeq object into a Seq or MutableSeq.N(
   RK   RS   t   toseqR!   RJ   R^   RR   R   t	   tomutableR   (   R:   Rc   t   other(    (    s   test_BioSQL.pyt   test_convertÖ   s    c         C   sÄ   |  j  j } x± t d | j ƒ t d | j ƒ d | g D]… } | | } t | ƒ t | ƒ t | ƒ k so t ‚ t | t ƒ sŠ t | ƒ ‚ | | } t | ƒ t | ƒ t | ƒ k s7 t ‚ q7 Wd S(   s%   Check can add DBSeq objects together.t   ACGTN(   RK   RS   R   R^   R   R!   RJ   RR   (   R:   Rc   Rg   t   test(    (    s   test_BioSQL.pyt   test_additionå   s    
(
c         C   s  |  j  j } | d  } t | t j ƒ s. t ‚ | d  j ƒ  d k sJ t ‚ | d d !j ƒ  d k si t ‚ | d d !j ƒ  d k sˆ t ‚ | d d !j ƒ  d	 k s§ t ‚ | d
 j ƒ  d k sÃ t ‚ | d d k sÙ t ‚ | d d k sï t ‚ | d d j ƒ  d k st ‚ d S(   s?   Check that slices of sequences are retrieved properly.
        i
   i   t   ATTTGi    i   i   t   Ti   t   TTif  t
   TTGAATTATAiÿÿÿÿt   Ai   iöÿÿÿt   TTATAN(   RK   RS   RR   R   RT   RJ   Ra   (   R:   Rc   t   new_seq(    (    s   test_BioSQL.pyt   test_seq_slicingô   s    
c         C   s˜  |  j  j } | d } | j d k s4 t | j ƒ ‚ t | j ƒ d k s^ t t | j ƒ ƒ ‚ x; | j D]0 } | j d k sƒ t ‚ | j d k sh t ‚ qh WyX | j d d g k s» t ‚ | j d d g k s× t ‚ | j d	 d
 g k só t ‚ Wn0 t	 k
 r&t
 s't d t | j ƒ ƒ ‚ n Xd | j k sKt | j j ƒ  ƒ ‚ | j d } t | ƒ d k spt ‚ d | k s‚t ‚ d | k s”t ‚ d S(   s)   Check SeqFeatures of a sequence.
        i   t   CDSs	   [103:579]R7   t   genet   kin2t
   protein_ids
   CAA44171.1t   codon_startt   1s!   Missing expected entries, have %st   db_xrefi   s   GI:16354s   SWISS-PROT:P31169N(   RK   RY   R`   RJ   R!   t   locationt   sub_featurest   location_operatort
   qualifierst   KeyErrort   Falset   reprt   keysRb   (   R:   t   test_featurest   cds_featuret   sub_featuret	   multi_ann(    (    s   test_BioSQL.pyt   test_seq_features  s*    
 	(   RM   RN   RO   R<   R=   R\   Rc   Rh   Rk   Rs   R‡   (    (    (    s   test_BioSQL.pyRQ       s   							t
   LoaderTestc           B   s)   e  Z d  Z d „  Z d „  Z d „  Z RS(   s)   Load a database from a GenBank file.
    c         C   sÔ   t  ƒ  d } t j d t d t d t d t d t ƒ |  _ y |  j | |  j j	 | ƒ Wn t
 k
 rl n X|  j j | ƒ |  _ t j j t j ƒ  d d ƒ } t | d	 ƒ } t j ƒ  } t j | | ƒ |  _ d  S(
   Ns   biosql-testR   R   R   R   R   R   s	   cor6_6.gbR4   (   R)   R   R   R   R   R   R
   R   R&   t   remove_databaseR   R*   R   R5   R6   R7   R8   R9   R   R+   R,   R1   (   R:   R/   t
   input_filet   handleR0   (    (    s   test_BioSQL.pyR<   %  s    c         C   s   |  j  j ƒ  |  ` |  `  d  S(   N(   R&   R#   R   (   R:   (    (    s   test_BioSQL.pyR=   >  s    c         C   sÝ   |  j  j |  j ƒ |  j  j ƒ  } t | ƒ d k s: t ‚ g  } g  } x. | D]& } | j | j ƒ | j | j ƒ qM W| j	 ƒ  | j	 ƒ  | d d d d d d g k s¯ t ‚ | d d	 d
 d d d g k sÙ t | ƒ ‚ d S(   s7   Load SeqRecord objects into a BioSQL database.
        i   t   AF297471t	   ARU237582t   ATCOR66MRD   t   BNAKINIt   BRRBIF72s
   AF297471.1s
   AJ237582.1s   L31939.1s   M81224.1s   X55053.1s   X62281.1N(
   R   R-   R1   R>   Rb   RJ   t   appendRV   RU   t   sort(   R:   R?   t
   item_namest   item_idsRK   (    (    s   test_BioSQL.pyt   test_load_databaseC  s    

(   RM   RN   RO   R<   R=   R•   (    (    (    s   test_BioSQL.pyRˆ   "  s   		t   InDepthLoadTestc           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   sH   Make sure we are loading and retreiving in a semi-lossless fashion.
    c         C   s‚   t  j j t  j ƒ  d d ƒ } t | d ƒ } t | ƒ | j ƒ  t j d t	 d t
 d t d t d t ƒ |  _ |  j d	 |  _ d  S(
   NR   s	   cor6_6.gbR4   R   R   R   R   R   s   biosql-test(   R5   R6   R7   R8   R9   R2   R#   R   R   R   R   R   R
   R   R&   R   (   R:   R;   R.   (    (    s   test_BioSQL.pyR<   [  s    

c         C   s   |  j  j ƒ  |  ` |  `  d  S(   N(   R&   R#   R   (   R:   (    (    s   test_BioSQL.pyR=   f  s    c         C   s8  |  j  j d d ƒ } | j d k s* t ‚ | j d k sH t | j ƒ ‚ | j d k s] t ‚ t | j j t	 j
 ƒ s{ t ‚ | j d  j ƒ  d k sš t ‚ |  j  j d d ƒ } | j d	 k sÄ t ‚ | j d
 k sâ t | j ƒ ‚ | j d k s÷ t ‚ t | j j t	 j
 ƒ st ‚ | j d  j ƒ  d k s4t ‚ d S(   s4   Make sure all records are correctly loaded.
        RA   t   X55053RŽ   s   X55053.1s   A.thaliana cor6.6 mRNA.i
   t
   AACAAAACACRB   RD   s   X62281.1s   A.thaliana kin2 gene.t
   ATTTGGCCTAN(   R   RG   RV   RJ   RU   RW   RR   RS   R^   R   t   DNAAlphabetRa   (   R:   RZ   (    (    s   test_BioSQL.pyt   test_record_loadingk  s    c         C   sâ  |  j  j d d ƒ } | j } t | ƒ d k s6 t ‚ | d } | j d k sU t ‚ t | j ƒ d k sp t ‚ t | j j	 ƒ  ƒ d k sª t d t
 | j j	 ƒ  ƒ ƒ ‚ d	 | j k s¿ t ‚ | j d	 d
 g k sÛ t ‚ d | j k sð t ‚ | j d d g k st ‚ d | j k s!t ‚ | j d d g k sNt d | j d ƒ ‚ | d } | j d k svt | j ƒ ‚ t | j ƒ d k s‘t ‚ t | j ƒ d k s¬t ‚ t | j d j ƒ d k sÎt ‚ | j d j d k sêt ‚ | j d j d k st ‚ t | j d j ƒ d k s(t ‚ | j d j d k sDt ‚ | j d j d k s`t ‚ t | j j	 ƒ  ƒ d k st ‚ d | j k s–t ‚ | j d d g k s²t ‚ | j d d g k sÎt ‚ | j d d g k sêt ‚ | j d d g k st ‚ | j d d  g k s"t ‚ | j d! d" g k s>t ‚ |  j  j d d ƒ } | j d } | j d k sut ‚ x& | j D] } | j d k st ‚ qW|  j  j d d# ƒ } | j d } | j d k sÞt | j ƒ ‚ d$ S(%   sG   Indepth check that SeqFeatures are transmitted through the db.
        RA   t   AJ237582i   i    t   sources   [0:206]i   s   Expected three keys, have %st   countrys   Russia:Bashkortostant   organisms   Armoracia rusticanaRz   s
   taxon:3704s   %s != ['taxon:3704']i   Rt   i   s   [0:48]R7   i   s	   [142:206]i   t   productRu   t   csp14Rx   t   2s   cold shock proteinRw   s
   CAB39890.1s
   GI:4538893t   translationt%   DKAKDAAAAAGASAQQAGKNISDAAAGGVNFVKEKTGR—   N(   R   RG   RY   Rb   RJ   R`   R!   R{   R~   R‚   R   R|   R}   t   strand(   R:   RZ   RY   t   test_featureR…   (    (    s   test_BioSQL.pyt   test_seq_feature|  sT    	

""!
(   RM   RN   RO   R<   R=   R›   R§   (    (    (    s   test_BioSQL.pyR–   X  s
   			t   __main__t	   verbosityi   t
   testRunner(+   RO   R5   t   unittestt   BioR    t   Bio.SeqR   R   t   Bio.SeqFeatureR   R   R   t   BioSQLR   R   t   setup_BioSQLR   R	   R
   R   R   R   R   R   t	   NameErrort   ImportErrort   messageR   R&   t	   ExceptionR(   R!   R)   R2   t   TestCaseR3   RQ   Rˆ   R–   RM   t   TextTestRunnert   runnert   main(    (    (    s   test_BioSQL.pyt   <module>   sD   "		+	6‚6[