U
    hy                      @   s\  zd dl mZ W n ek
r(   eZY nX d dl mZ d dlmZ d dlZd dlZd dl	T 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 zd dlmZ W n> ek
r   zd dlmZ W n ek
r   dZY nX Y nX zd dlmZ W n ek
r   dZY nX zd dlmZ W n ek
rH   dZY nX edddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-gZG d.d/ d/eZG d0d1 d1eZG d2d3 d3eZG d4d5 d5eZG d6d7 d7eZG d8d9 d9eZG d:d; d;eZ ed<d=Z!G d>d? d?e!Z"G d@dA dAeZ#dNdBdCZ$dOdDdEZ%dPdHdIZ&dJdK Z'dLdM Z(dS )Q    )OrderedDict)
namedtuple)isclassN)*)_StringField)_query_val_transform)CommaNodeList)SCOPE_VALUES)make_snake_case)	text_type)
FIELD_TYPE)postgres_ext)CockroachDatabaseandasassertbreakclasscontinuedefdelelifelseexceptexecfinallyforfromglobalifimportinislambdanotorpassprintraisereturntrywhilewithyieldc                   @   s   e Zd ZdS )UnknownFieldN)__name__
__module____qualname__ r2   r2   8/tmp/pip-unpacked-wheel-5j60pwdk/playhouse/reflection.pyr.   )   s   r.   c                   @   s\   e Zd ZdZeef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 ZdS )Columnz1
    Store metadata about a database column.
    FNc                 C   sR   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	d | _
d | _d | _d S N)namefield_classraw_column_typenullableprimary_keycolumn_nameindexuniquedefaultextra_parameters	rel_modelrelated_nameto_field)selfr6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r2   r2   r3   __init__3   s    zColumn.__init__c                    s4   dddddg}d  fdd|D }d	 j|f S )
Nr7   r8   r9   r:   r;   , c                 3   s    | ]}d |t  |f V  qdS z%s=%sN)getattr).0attrrC   r2   r3   	<genexpr>M   s   z"Column.__repr__.<locals>.<genexpr>zColumn(%s, %s))joinr6   )rC   attrsZkeyword_argsr2   rJ   r3   __repr__F   s    zColumn.__repr__c                 C   s   i }| j d k	r|| j  | jr(d|d< | jtks>| j| jkrLd| j |d< | jrft| jt	sfd|d< | j
d k	rd| j
dd |d	< |  r| j|d
< | jrd| j |d< | jrd| j |d< |  s| jrd|d< n| jr|  sd|d< |S )NTnull'%s'r;   r:   z[SQL("DEFAULT %s")]"z\"constraintsmodelfieldbackrefTruer=   r<   )r?   updater9   r7   ForeignKeyFieldr6   r;   r:   
issubclass	AutoFieldr>   replaceis_foreign_keyr@   rB   rA   is_primary_keyr=   r<   )rC   paramsr2   r2   r3   get_field_parametersR   s2    



zColumn.get_field_parametersc                 C   s   | j tkp| jS r5   )r7   rZ   r:   rJ   r2   r2   r3   r]   s   s    zColumn.is_primary_keyc                 C   s
   | j tkS r5   )r7   rX   rJ   r2   r2   r3   r\   v   s    zColumn.is_foreign_keyc                 C   s   | j tko| jdkS Nz'self')r7   rX   r@   rJ   r2   r2   r3   is_self_referential_fky   s    
zColumn.is_self_referential_fkc                 C   sJ   || _ t| _|j|jkr d| _n||j | _|r6|jp8d | _|pBd | _d S r`   )	foreign_keyrX   r7   
dest_tabletabler@   r6   rB   rA   )rC   rb   model_namesdestrA   r2   r2   r3   set_foreign_key}   s    zColumn.set_foreign_keyc                 C   s   i }|    D ](\}}t|r0t|tr0|j}|||< qddd t| D }d| j| j	j|f }| j	t
krd|| jf }|S )NrE   c                 s   s   | ]\}}d ||f V  qdS rF   r2   )rH   kvr2   r2   r3   rK      s   z#Column.get_field.<locals>.<genexpr>z%s = %s(%s)z%s  # %s)r_   itemsr   rY   ZFieldr/   rL   sortedr6   r7   r.   r8   )rC   Zfield_paramskeyvalueZ	param_strrT   r2   r2   r3   	get_field   s     



zColumn.get_field)FNFFNN)NN)r/   r0   r1   __doc__IntegerFieldrZ   Zprimary_key_typesrD   rN   r_   r]   r\   ra   rg   rn   r2   r2   r2   r3   r4   -   s$             
!  
r4   c                   @   s^   e Zd Zi ZdZdd Zdd ZdddZdd	d
Zdd Z	dddZ
dddZdddZdS )Metadata c                 C   s   || _ d| _d S )NF)databaserequires_extension)rC   rs   r2   r2   r3   rD      s    zMetadata.__init__c                 G   s   | j ||S r5   )rs   Zexecute_sql)rC   sqlr^   r2   r2   r3   execute   s    zMetadata.executeNc                 C   s   t dd | j||D }| ||\}}| ||}t|dkrv|d }|| tkrbt||< n|| tkrvt	||< t  }|
 D ]F\}	}
||	 }| ||
j}t|	||
j|
j|
j|	|||	d||	< q|S )Nc                 s   s   | ]}|j |fV  qd S r5   r6   )rH   metadatar2   r2   r3   rK      s   z'Metadata.get_columns.<locals>.<genexpr>   r   )r7   r8   r9   r:   r;   r>   r?   )r   rs   get_columnsget_column_typesget_primary_keyslenrp   rZ   BigIntegerFieldBigAutoFieldrj   _clean_defaultr>   r4   	data_typerO   r:   get)rC   rd   schemarx   column_typesextra_paramsZpk_namespkcolumnsr6   Zcolumn_datar7   r>   r2   r2   r3   rz      s4    

zMetadata.get_columnsc                 C   s   t d S r5   )NotImplementedErrorrC   rd   r   r2   r2   r3   r{      s    zMetadata.get_column_typesc                 C   sR   |d ks |t tfks | dkr$d S t|trJt|trJ|dsJd| }|pPdS )NrO   'rP   z'')rZ   r   lowerrY   r   
isinstancer   
startswith)rC   r7   r>   r2   r2   r3   r      s    

zMetadata._clean_defaultc                 C   s   | j ||S r5   )rs   get_foreign_keysr   r2   r2   r3   r      s    zMetadata.get_foreign_keysc                 C   s   | j ||S r5   )rs   r|   r   r2   r2   r3   r|      s    zMetadata.get_primary_keysc                 C   s   | j ||S r5   )rs   get_indexesr   r2   r2   r3   r      s    zMetadata.get_indexes)N)N)N)N)N)r/   r0   r1   
column_mapextension_importrD   rv   rz   r{   r   r   r|   r   r2   r2   r2   r3   rq      s   
"
	

rq   c                       s   e Zd Zeeeeeee	e
eeeeeeeeedZeeeeeeeeeeeedZdZ fddZdd Zd fd	d
	Zd fdd	Zd fdd	Zd fdd	Z  ZS )PostgresqlMetadata)                  i  i  i  i  i:  iZ  i  i;  i  i  i  )i  i  i  i  i  i  i    i[  i  i  i  z$from playhouse.postgres_ext import *c                    s   t t| | td k	r| d}| }|D ]`\}}}|dkrNtj| j|< q.|dkrdtj| j|< q.|dkrztj	| j|< q.|dkr.tj
| j|< q.| jD ]}tj| j|< qd S )N9select oid, typname, format_type(oid, NULL) from pg_type;jsonjsonbZhstoreZtsvector)superr   rD   r   rv   fetchall	JSONFieldr   BinaryJSONFieldHStoreFieldTSVectorFieldarray_types
ArrayFieldrC   rs   cursorresultsoidZtypnameZformatted_type	__class__r2   r3   rD     s    

zPostgresqlMetadata.__init__c           
      C   s   i }i }t d k	r,tt jt jt jt jt jfnt }d||f }| d|d}| D ]H\}}	| j	
|	t||< || |krd| _|	| jkrTd| j|	 i||< qT||fS )Nz%s."%s"zcSELECT attname, atttypid FROM pg_catalog.pg_attribute WHERE attrelid = %s::regclass AND attnum > %sr   Tr7   )r   setr   r   r   r   r   rv   r   r   r   r.   rt   r   )
rC   rd   r   r   r   Zextension_types
identifierr   r6   r   r2   r2   r3   r{     s2     
z#PostgresqlMetadata.get_column_typesNc                    s   |pd}t t| ||S Npublic)r   r   rz   r   r   r2   r3   rz   4  s    zPostgresqlMetadata.get_columnsc                    s   |pd}t t| ||S r   )r   r   r   r   r   r2   r3   r   8  s    z#PostgresqlMetadata.get_foreign_keysc                    s   |pd}t t| ||S r   )r   r   r|   r   r   r2   r3   r|   <  s    z#PostgresqlMetadata.get_primary_keysc                    s   |pd}t t| ||S r   )r   r   r   r   r   r2   r3   r   @  s    zPostgresqlMetadata.get_indexes)N)N)N)N)r/   r0   r1   BooleanField	BlobFieldr~   ZSmallIntegerFieldrp   	TextField
FloatFieldZDoubleField	CharField	DateFieldDateTimeField	TimeFieldDecimalFieldZ	UUIDFieldr   r   r   rD   r{   rz   r   r|   r   __classcell__r2   r2   r   r3   r      sL   r   c                   @   s<   e Zd Zej Zeed< ej Zeed< dZdd Z	dS )CockroachDBMetadatar   r   z#from playhouse.cockroachdb import *c                 C   sl   t | | d| _td k	rh| d}| }|D ]\}}}|dkr0tj| j|< q0| jD ]}tj	| j|< qVd S )NTr   r   )
rq   rD   rt   r   rv   r   r   r   r   r   r   r2   r2   r3   rD   N  s    

zCockroachDBMetadata.__init__N)
r/   r0   r1   r   r   copyrp   r   r   rD   r2   r2   r2   r3   r   E  s   

r   c                (       s   e Zd Zedkri Zn|ejeejeej	e
ejeejeejeejeejeejeejeejeejeejeejeejeejeejeejeej eej!eiZ fddZ"dddZ#  Z$S )MySQLMetadataNc                    s.   d|kr| d|d< tt| j|f| d S )Npasswordpasswd)popr   r   rD   )rC   rs   kwargsr   r2   r3   rD   {  s    zMySQLMetadata.__init__c                 C   sH   i }|  d| }|jD ]&}|d d \}}| j|t||< q|i fS )NzSELECT * FROM `%s` LIMIT 1   )rv   descriptionr   r   r.   )rC   rd   r   r   r   Zcolumn_descriptionr6   Z	type_coder2   r2   r3   r{     s    
zMySQLMetadata.get_column_types)N)%r/   r0   r1   r   r   ZBLOBr   ZCHARr   ZDATEr   ZDATETIMEr   ZDECIMALr   ZDOUBLEr   FLOATZINT24rp   Z	LONG_BLOBLONGZLONGLONGr~   ZMEDIUM_BLOBZ
NEWDECIMALZSHORTSTRING	TIMESTAMPZTIMEr   Z	TINY_BLOBZTINYZ
VAR_STRINGrD   r{   r   r2   r2   r   r3   r   `  sZ                       r   c                   @   sh   e Zd Zeeeeeeee	e
eeeee	e
eeeeeedZdZdZdjeedZdZdd Zdd
dZd	S )SqliteMetadata)ZbigintZblobboolbooleanchardatedatetimedecimalfloatintegerzinteger unsignedintlongnumericrealZsmallintegerZsmallintzsmallint unsignedtexttimeZvarcharz(?:["\[\(]+)?z(?:["\]\)]+)?zi(?:FOREIGN KEY\s*)?{begin}(.+?){end}\s+(?:.+\s+)?references\s+{begin}(.+?){end}\s*\(["|\[]?(.+?)["|\]]?\))beginendz&^\s*(?:var)?char\s*\(\s*(\d+)\s*\)\s*$c                 C   s`   |  }|| jkr| j| }n>t| j|r2t}n*tdd|}|dkrNt}n| j|t	}|S )Nz\(.+\)rr   )
r   r   research
re_varcharr   sub	BareFieldr   r.   )rC   Zcolumn_typer8   r7   r2   r2   r3   _map_col  s    
zSqliteMetadata._map_colNc                 C   s4   i }| j |}|D ]}| |j||j< q|i fS r5   )rs   rz   r   r   r6   )rC   rd   r   r   r   columnr2   r2   r3   r{     s
    zSqliteMetadata.get_column_types)N)r/   r0   r1   r~   r   r   r   r   r   r   r   rp   r   r   r   r   r   formatZre_foreign_keyr   r   r{   r2   r2   r2   r3   r     s@    r   _DatabaseMetadata)r   primary_keysforeign_keysre   indexesc                   @   s   e Zd Zdd Zdd ZdS )DatabaseMetadatac                    sL   g } j  D ]8}t|jdkr fdd|jD }|||jf q|S )Nry   c                    s*   g | ]"}| j  kr j  | jqS r2   )r   r6   rH   r   rC   rd   r2   r3   
<listcomp>  s   z9DatabaseMetadata.multi_column_indexes.<locals>.<listcomp>)r   r}   r   appendr=   )rC   rd   accumr<   field_namesr2   r   r3   multi_column_indexes  s    z%DatabaseMetadata.multi_column_indexesc                 C   s6   i }| j | D ]"}t|jdkr|j||jd < q|S )Nry   r   )r   r}   r   r=   )rC   rd   r   r<   r2   r2   r3   column_indexes  s
    zDatabaseMetadata.column_indexesN)r/   r0   r1   r   r   r2   r2   r2   r3   r     s   
r   c                   @   s|   e Zd ZeegZdddZdd Zed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dZdS ) IntrospectorNc                 C   s   || _ || _d S r5   )rx   r   )rC   rx   r   r2   r2   r3   rD     s    zIntrospector.__init__c                 C   s   d| j j S )Nz<Introspector: %s>rx   rs   rJ   r2   r2   r3   rN     s    zIntrospector.__repr__c                 C   s   t |tr"|jd krtd|j}tr:t |tr:t|}nHt |trNt|}n4t |trbt	|}n t |t
rvt|}ntd| | ||dS )Nz)Cannot introspect an uninitialized Proxy.z"Introspection not supported for %rr   )r   ZProxyobj
ValueErrorr   r   ZPostgresqlDatabaser   ZMySQLDatabaser   ZSqliteDatabaser   )clsrs   r   rx   r2   r2   r3   from_database  s    








zIntrospector.from_databasec                 C   s   t | jjS r5   )typerx   rs   rJ   r2   r2   r3   get_database_class  s    zIntrospector.get_database_classc                 C   s
   | j jjS r5   r   rJ   r2   r2   r3   get_database_name  s    zIntrospector.get_database_namec                 C   s
   | j jjS r5   )rx   rs   Zconnect_paramsrJ   r2   r2   r3   get_database_kwargs  s    z Introspector.get_database_kwargsc                 C   s   | j jrd| j j S dS )N
rr   )rx   rt   r   rJ   r2   r2   r3   get_additional_imports  s    z#Introspector.get_additional_importsTc                 C   sL   |rt |}tdd|}ddd |dD }|d  sHd| }|S )N[^\w]+rr   c                 s   s   | ]}|  V  qd S r5   )title)rH   r   r2   r2   r3   rK     s     z/Introspector.make_model_name.<locals>.<genexpr>_r   T)r
   r   r   rL   splitisalpha)rC   rd   
snake_caserS   Z
model_namer2   r2   r3   make_model_name  s    zIntrospector.make_model_nameFc                 C   sp   |  }|rt|}| }|r2tdd|p0|}tdd|}|tkrP|d7 }t|rl|d  rld| }|S )Nz_id$rr   r   r   r   )stripr
   r   r   r   RESERVED_WORDSr}   isdigit)rC   r   r\   r   r2   r2   r3   make_column_name  s    zIntrospector.make_column_namec                    s>  | j jj| jd}|r<| j jj| jd}|dd |D   d k	rV fdd|D }t|}i }i }	i }
i }i }|D ]}| j || j}| j || j}z| j 	|| j|
|< W n* t
k
r } zg |
|< W 5 d }~X Y n<X  d k	r|
| D ]&}|j|kr||j ||j q| ||||< tdd |D }tdd |
| D }| D ]^\}}|rxtdd	|}n| |||k|}| }|d
r||kr| }||_qZ|D ]@}t|jdkr|jd }||kr|j|| _d|| _q| j || j|	|< |||< |||< qvi }dd }|D ]}t }t|
| |dD ]d}z|| |j }W n tk
r   Y qPY nX |j}||krd||jf ||< n
|| qPq6|D ]n}|
| D ]^}||j |j }z||j |j }W n tk
r   d }Y nX |j ||||!|d qʐqt"||	|
||S )Nr   c                 S   s   g | ]
}|j qS r2   rw   )rH   viewr2   r2   r3   r   .  s     z+Introspector.introspect.<locals>.<listcomp>c                    s   g | ]}| kr|qS r2   r2   )rH   rd   table_namesr2   r3   r   1  s      c                 s   s   | ]}|  V  qd S r5   )r   )rH   r;   r2   r2   r3   rK   Y  s   z*Introspector.introspect.<locals>.<genexpr>c                 s   s   | ]}|j V  qd S r5   r   )rH   Zfk_colr2   r2   r3   rK   [  s     r   r   Z_idry   r   Tc                 S   s   | j S r5   r  )rb   r2   r2   r3   <lambda>|      z)Introspector.introspect.<locals>.<lambda>)rl   z	%s_%s_set)rb   re   rf   rA   )#rx   rs   Z
get_tablesr   Z	get_viewsextendr   r   rz   r   r   rc   r   addr   rj   r   r   r  r   endswithr6   r}   r   r=   r<   r|   rk   r   KeyErrorrd   Zdest_columnrg   r   r   )rC   r  literal_column_namesinclude_viewsr   ZtablesZviewsZ	table_setr   r   r   re   r   rd   Ztable_indexesZtable_columnsexcrb   Zlower_col_namesZfksZcol_namer   new_nameZ
lower_namer<   Zrelated_namesZsort_fnZmodels_referencedrc   srcrf   r2   r  r3   
introspect(  s    
 




 


zIntrospector.introspectc           	         sp    |||i }G fdddt t  fddtj D ]\}}||krP|| qP|S )Nc                       s   e Zd ZG  fdddZdS )z/Introspector.generate_models.<locals>.BaseModelc                       s   e Zd Z jjZ jZdS )z4Introspector.generate_models.<locals>.BaseModel.MetaN)r/   r0   r1   rx   rs   r   r2   rJ   r2   r3   Meta  s   r  N)r/   r0   r1   r  r2   rJ   r2   r3   	BaseModel  s   r  c              	      s    j D ]@}|j}||kr|kr|krJtd|f  q|| qg j }| D ]\}}|jrl|j	 ql
 }G  fddd}d}	tdkrd|krd|_n| tdkrtfdd	| D  |_d
}	d|i}
| D ]d\}}|j}|tk	r<r<t}n|tkrJt}||jd}|jr||	r||tkrrt}d|d< n|jr|tk	rd
|d< | r| rd|d< n,|jj}||kr|| |d< nt}||d< |jr|j|d< d|f |d< |jd k	r&td|j }|g|d< | sj||krb|| rNd
|d< n| sjd
|d< nd|d< |f ||
|j	< qz>ztt f|
|< W n t!k
r   s Y nX W 5 kr҈ X d S )Nz0Possible reference cycle found between %s and %sc                       s   e Zd Z ZZdS )zAIntrospector.generate_models.<locals>._create_model.<locals>.MetaN)r/   r0   r1   r   Z
table_namer2   )r   rd   r2   r3   r    s   r  Fr   idry   c                    s   g | ]\}}| kr|j qS r2   rw   )rH   colrT   )r   r2   r3   r     s   zGIntrospector.generate_models.<locals>._create_model.<locals>.<listcomp>T)r;   rO   r:   rC   rS   Zrel_model_namerT   z	%s_%s_relrU   z
DEFAULT %srR   r=   r<   )"r  r   rc   warningswarnr   rj   r:   r   r6   r   r   r}   keysZCompositeKeyr7   rX   r   r.   r9   rZ   rp   r\   ra   rb   ZDeferredForeignKeyrB   r>   ZSQLr]   remover   strr   )rd   modelsrb   rf   r   r;   r   r   r  Zcomposite_keyrM   Z
FieldClassr^   rc   
constraint)r  _create_modelbare_fieldsrs   pendingskip_invalid)r   r   rd   r3   r     s    




















z3Introspector.generate_models.<locals>._create_model)r  ZModelr   rk   re   rj   )	rC   r#  r  r  r!  r  r  rd   rS   r2   )r  r   r!  rs   r"  rC   r#  r3   generate_models  s    azIntrospector.generate_models)N)N)T)FT)NFFT)FNFFF)r/   r0   r1   rZ   rp   Z
pk_classesrD   rN   classmethodr   r   r   r   r   r   r  r  r$  r2   r2   r2   r3   r     s(   

	
    
|     r   c                 C   s   t j| |d}| S Nr   )r   r   r  )rs   r   introspectorr2   r2   r3   r    s    r  c                 K   s   t j| |d}|jf |S r&  )r   r   r$  )rs   r   optionsr'  r2   r2   r3   r$    s    r$  TFc              
   C   sn  t | jj | jjD ]}d|j|jf g}|jr<|d n&|rb|jrR|d n|jrb|d t	|t
r|d|jj|jjf  t d| q|rj| j }|sd S t d |D ]}dg}| jj }|jd	d
d@ |t|j |jr|d ||j | \}}	W 5 Q R X |ttt|	 }
||
dd |jrZ|d t d| qd S )Nz  %s %sz PKz UNIQUEz INDEXz
 FK: %s.%srr   z

index(es)z  %sz"")paramquotez WHERE rQ   )r'   _metar6   Zsorted_fieldsZ
field_typer:   r   r=   r<   r   rX   r@   r/   Z	rel_fieldrL   Zfields_to_indexrs   Zget_sql_contextZscope_valuesru   r   Z_expressionsZ_whereliteralquerytuplemapr   r[   _unique)rS   r   Zinline_indexesrT   partsZ
index_listr<   ctxru   r^   cleanr2   r2   r3   print_model$  sD    




r5  c           	      C   s   | j   \}}| jjjdkr2|| jjjd}td|}|	 \}}}d
dd |dD }d
|||f }|ttt| S )Nr)  z^(.+?\()(.+)(\).*)z,
c                 s   s   | ]}d | V  qdS )z  %sNr2   r   r2   r2   r3   rK   T  s     z get_table_sql.<locals>.<genexpr>rE   r   )Z_schemaZ_create_tabler.  r,  rs   r*  r[   r   matchgroupsrL   r   r  r/  r0  r   )	rS   ru   r^   Z	match_objcreater   extraZindentedr4  r2   r2   r3   get_table_sqlL  s    r:  c                 C   s   t t|  d S r5   )r'   r:  )rS   r2   r2   r3   print_table_sqlY  s    r;  )N)N)TF))collectionsr   ImportErrordictr   inspectr   r   r  Zpeeweer   r   r   r	   r
   r   Zpymysql.constantsr   ZMySQLdb.constantsZ	playhouser   Zplayhouse.cockroachdbr   r   r  objectr.   r4   rq   r   r   r   r   r   r   r   r  r$  r5  r:  r;  r2   r2   r2   r3   <module>   s   


                           pCe.:
  9


(