3
g39                 @   s   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 d d	lmZ d
ZG dd dZdS )    N)StringIO)expectedFailureskip)apps)settings)serializers)router)atomic)import_stringZtest_c               @   s   e Zd ZdZdd Zdd Zdd Zd,ddZdd Zdd Z	dd Z
dd Zdd Zd-ddZd.ddZd/ddZdd Zd0dd Zd1d"d#Zd$d% Zd&d' Zd(d) Zd*d+ Zd!S )2BaseDatabaseCreationzs
    Encapsulate backend-specific differences pertaining to creation and
    destruction of the test database.
    c             C   s
   || _ d S )N)
connection)selfr    r   ^/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/db/backends/base/creation.py__init__   s    zBaseDatabaseCreation.__init__c             C   s
   | j j S )N)r   _nodb_cursor)r   r   r   r   r      s    z!BaseDatabaseCreation._nodb_cursorc             C   s   t jj|tj  d S )N)sysstderrwriteoslinesep)r   msgr   r   r   log   s    zBaseDatabaseCreation.log   FTc       	      C   s0  ddl m} | j }|dkrBd}|r(d}| jd|| j||f  | j||| | jj  |tj	| jj
 d< || jjd< zR| jjd d	 d
krtj}dd tj D t_|dt|d dd
| jj
dd W d| jjd d	 d
kr|t_X |r| j | j_|d| jj
d | jj  tjjddkr,| j  |S )z
        Create a test database, prompting the user for confirmation if the
        database already exists. Return the name of the test database created.
        r   )call_commandr   ZCreatingzUsing existingz %s test database for alias %s...NAMETESTZMIGRATEFc             S   s   i | ]}d |j qS )N)label).0Zappr   r   r   
<dictcomp>C   s   z7BaseDatabaseCreation.create_test_db.<locals>.<dictcomp>ZmigrateT)	verbosityinteractivedatabaseZ
run_syncdbNZcreatecachetable)r"   ZRUNNING_DJANGOS_TEST_SUITEtrue)Zdjango.core.managementr   _get_test_db_namer   _get_database_display_str_create_test_dbr   closer   	DATABASESaliassettings_dictZMIGRATION_MODULESr   get_app_configsmaxserialize_db_to_stringZ_test_serialized_contentsZensure_connectionr   environget mark_expected_failures_and_skips)	r   r    autoclobber	serializekeepdbr   test_database_nameactionZold_migration_modulesr   r   r   create_test_db    sB    

z#BaseDatabaseCreation.create_test_dbc             C   s   |d | j jd< dS )z
        Set this database up to be used in testing as a mirror of a primary
        database whose settings are given.
        r   N)r   r*   )r   Zprimary_settings_dictr   r   r   set_as_test_mirrorf   s    z'BaseDatabaseCreation.set_as_test_mirrorc                s.    fdd}t  }tjd| d|d |j S )z
        Serialize all data in the database into a JSON string.
        Designed only for test runner usage; will not handle large
        amounts of data.
        c              3   s   ddl m}  |  j}xtj D ]}|jd k	r |j|jkr |jt	j
kr xX|j D ]L}|jj jrPtj jj|rP|jj jjj|jjj}|j E d H  qPW q W d S )Nr   )MigrationLoader)Zdjango.db.migrations.loaderr8   r   r   r+   Zmodels_moduler   Zmigrated_appsnamer   ZTEST_NON_SERIALIZED_APPSZ
get_models_metaZcan_migrater   Zallow_migrate_modelr)   Z_base_managerusingZorder_bypkiterator)r8   loaderZ
app_configmodelZqueryset)r   r   r   get_objectst   s    


z@BaseDatabaseCreation.serialize_db_to_string.<locals>.get_objectsjsonN)indentstream)r   r   r2   getvalue)r   r@   outr   )r   r   r-   m   s    z+BaseDatabaseCreation.serialize_db_to_stringc             C   s   t |}t }t| jjdb | jj > x6tjd|| jjdD ]}|j  |j	|j
jjj q@W W dQ R X | jj|d W dQ R X dS )zw
        Reload the database with data from a string generated by
        the serialize_db_to_string() method.
        )r;   rA   N)table_names)r   setr	   r   r)   Zconstraint_checks_disabledr   Zdeserializesaveaddobject	__class__r:   Zdb_tableZcheck_constraints)r   datarF   objr   r   r   deserialize_db_from_string   s     z/BaseDatabaseCreation.deserialize_db_from_stringc             C   s    d| j j|dkrd| ndf S )zR
        Return display string for a database for use in various actions.
        z'%s'%s   z ('%s') )r   r)   )r   r    Zdatabase_namer   r   r   r%      s    z.BaseDatabaseCreation._get_database_display_strc             C   s0   | j jd d r | j jd d S t| j jd  S )z
        Internal implementation - return the name of the test DB that will be
        created. Only useful when called from create_test_db() and
        _create_test_db() and when no external munging is done with the 'NAME'
        settings.
        r   r   )r   r*   TEST_DATABASE_PREFIX)r   r   r   r   r$      s    z&BaseDatabaseCreation._get_test_db_namec             C   s   |j d|  d S )Nz%CREATE DATABASE %(dbname)s %(suffix)s)execute)r   cursor
parametersr3   r   r   r   _execute_create_test_db   s    z,BaseDatabaseCreation._execute_create_test_dbc       	   #   C   s:  | j  }| jjj|| j d}| j }y| j||| W n tk
r* } z|rZ|S | jd|  |sxt	d| }|s|dkry@|dkr| jd| j
||f  |jd|  | j||| W n< tk
r } z| jd|  tjd	 W Y d
d
}~X nX n| jd tjd W Y d
d
}~X nX W d
Q R X |S )zF
        Internal implementation - create the test db tables.
        )Zdbnamesuffixz+Got an error creating the test database: %szXType 'yes' if you would like to try deleting the test database '%s', or 'no' to cancel: yesr   z,Destroying old test database for alias %s...zDROP DATABASE %(dbname)sz-Got an error recreating the test database: %srO   NzTests cancelled.)r$   r   ops
quote_namesql_table_creation_suffixr   rU   	Exceptionr   inputr%   rR   r   exit)	r   r    r1   r3   r4   Ztest_db_paramsrS   eZconfirmr   r   r   r&      s6    
&z$BaseDatabaseCreation._create_test_dbc             C   sL   | j jd }|dkr:d}|r d}| jd|| j||f  | j||| dS )z(
        Clone a test database.
        r   r   zCloning test databasezUsing existing clonez%s for alias %s...N)r   r*   r   r%   _clone_test_db)r   rV   r    r1   r3   Zsource_database_namer5   r   r   r   clone_test_db   s    z"BaseDatabaseCreation.clone_test_dbc             C   s    | j j}|ddj|d |iS )zX
        Return a modified connection settings dict for the n-th clone of a DB.
        r   z{}_{})r   r*   format)r   rV   Zorig_settings_dictr   r   r   get_test_db_clone_settings   s    z/BaseDatabaseCreation.get_test_db_clone_settingsc             C   s   t ddS )zI
        Internal implementation - duplicate the test db tables.
        znThe database backend doesn't support cloning databases. Disable the option to run tests in parallel processes.N)NotImplementedError)r   rV   r    r3   r   r   r   r_      s    z#BaseDatabaseCreation._clone_test_dbNc             C   s   | j j  |dkr | j jd }n| j|d }|dkr\d}|rBd}| jd|| j||f  |sl| j|| |dk	r|tj| j j	 d< || j jd< dS )zv
        Destroy a test database, prompting the user for confirmation if the
        database already exists.
        Nr   r   Z
DestroyingZ
Preservingz %s test database for alias %s...)
r   r'   r*   rb   r   r%   _destroy_test_dbr   r(   r)   )r   Zold_database_namer    r3   rV   r4   r5   r   r   r   destroy_test_db  s     
z$BaseDatabaseCreation.destroy_test_dbc             C   s0   | j  }|jd| jjj|  W dQ R X dS )zF
        Internal implementation - remove the test db tables.
        zDROP DATABASE %sN)r   rR   r   rX   rY   )r   r4   r    rS   r   r   r   rd   !  s    
z%BaseDatabaseCreation._destroy_test_dbc       
      C   s   x\| j jjD ]N}|jd\}}}|jdd }|tjkrt|}t||}t	||t
| qW xv| j jjj D ]d\}}	xZ|	D ]R}|jd\}}}|jdd }|tjkr|t|}t||}t	||t|| q|W qnW dS )z
        Mark tests in Django's test suite which are expected failures on this
        database and test which should be skipped on this database.
        .r   N)r   featuresZdjango_test_expected_failures
rpartitionsplitr   ZINSTALLED_APPSr
   getattrsetattrr   Zdjango_test_skipsitemsr   )
r   Z	test_nameZtest_case_name_Ztest_method_nameZtest_appZ	test_caseZtest_methodreasontestsr   r   r   r0   -  s    




z5BaseDatabaseCreation.mark_expected_failures_and_skipsc             C   s   dS )zQ
        SQL to append to the end of the test table creation statements.
        rP   r   )r   r   r   r   rZ   D  s    z.BaseDatabaseCreation.sql_table_creation_suffixc             C   s$   | j j}|d |d |d | j fS )z
        Return a tuple with elements of self.connection.settings_dict (a
        DATABASES setting value) that uniquely identify a database
        accordingly to the RDBMS particularities.
        ZHOSTZPORTZENGINE)r   r*   r$   )r   r*   r   r   r   test_db_signatureJ  s
    z&BaseDatabaseCreation.test_db_signature)r   FTF)F)F)r   FF)F)Nr   FN)__name__
__module____qualname____doc__r   r   r   r6   r7   r-   rN   r%   r$   rU   r&   r`   rb   r_   re   rd   r0   rZ   rp   r   r   r   r   r      s(   
F	

)



r   )r   r   ior   Zunittestr   r   Zdjango.appsr   Zdjango.confr   Zdjango.corer   Z	django.dbr   Zdjango.db.transactionr	   Zdjango.utils.module_loadingr
   rQ   r   r   r   r   r   <module>   s   