U
    ^g%i                     @  st  d dl mZ d dlmZ d dl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 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 dlmZ d dlmZ ddlmZ ddlmZ ddlmZ erd 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 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 d"l#m,Z, d d#l#m-Z- d d$l.m/Z/ d d%l0m1Z1 d d&l2m3Z3 d d'l4m5Z5 d d(l6m7Z7 d d)l6m8Z8 d d*l9m:Z: d d+l9m;Z; d,Z<d-d.d/d0d1d2Z=d3d3d4d5d6Z>d-d7d8d9d:d;d<Z?e@  ZAZBd=d-d3d>d?d@ZCd-dAdBdCdDdEZDd-dAd3dCdFdGZEeBFej8d-dHdBdCdIdJZGeBFejHd-dKd3dCdLdMZIeBFejJd-dNd3dCdOdPZKeBFejLd-dQd3dCdRdSZMeBFejNd-dTd3dCdUdVZOd-dWdXdYdZd[ZPeBFejQd-d\d3dCd]d^ZReBFejSd-d_d3dCd`daZTeBFejUd-dbdBdCdcddZVeBFejWd-ded3dCdfdgZXeBFejYdhdi ZZeBFej[djdk Z\eBFej]d-dld3dCdmdnZ^eBFej_d-dod3dCdpdqZ`eBFejad-drd3dCdsdtZbeBFejcd-dud3dCdvdwZdG dxdy dyZedzd{d|d}d~Zfdddddd-dddd3dddZgdd-dBdddZhdd-dd3dddZidd Zjd-d3dddZkd-d3dddZld3dd-ddddZmdd-d3dddZndddddZoddd-dd{dddZpdd-d3dddZqdd-d3dddZrddd-dd3dddZsdd-d3dddZtdd-d3dddZuddd-d3d3d{ddddZve@ Zwdd-dd{dddZxewFej,dd-dd{dddZydd{dd3dŜddǄZzddd9dʜdd̄Z{ewFej)dd-dd{ddd΄Z|ewFej-dd-dd3dddЄZ}ewFej$dd-dd{dddӄZ~eBFejd-dd3dCddքZeA ZBdS )    )annotations)StringION)Any)cast)Dict)List)Optional)Tuple)TYPE_CHECKING)Union)PythonPrinter)schema)sql)types)conv)quoted_name   )util)ops)sqla_compat)Literal)DialectKWArgs)ColumnElement)
TextClause)CheckConstraint)Column)
Constraint)FetchedValue)
ForeignKey)ForeignKeyConstraint)Index)MetaData)PrimaryKeyConstraint)UniqueConstraint)ARRAY)
TypeEngine)AutogenContext)Config)MigrationScript)ModifyTableOps)Computed)Identity   r&   zsqla_compat._ConstraintNamez*Optional[Union[quoted_name, str, _f_name]])autogen_contextnamereturnc                 C  s&   t |trtt| |S t|S d S N)
isinstancer   _f_name_alembic_autogenerate_prefixr   Zconstraint_name_or_none)r-   r.    r4   Z/var/www/html/api-medvista/venv/lib/python3.8/site-packages/alembic/autogenerate/render.py_render_gen_name:   s    
r6   str)textr/   c                 C  s4   t dt jd|  } t dt jd| } | S )N^    z +$ )recompileMsubstrip)r8   r4   r4   r5   _indentD   s    rA   r(   zDict[str, Union[str, Config]]None)r-   migration_scripttemplate_argsr/   c                 C  s\   | j }t|j|jD ]0\}}tt|| ||j< tt|| ||j< qdt	||d< d S )N
imports)
rF   zipZupgrade_ops_listZdowngrade_ops_listrA   _render_cmd_bodyZupgrade_tokenZdowngrade_tokenjoinsorted)r-   rC   rD   rF   Zupgrade_opsZdowngrade_opsr4   r4   r5    _render_python_into_templatevarsJ   s     
rK   zops.OpContainer)op_containerr-   r/   c                 C  sr   t  }t|}|d d}| jD ].}t||}|p:t|}|D ]}|| q@q"|s`|d |d | S )Nz=# ### commands auto generated by Alembic - please adjust! ###Fpassz# ### end Alembic commands ###)r   r   Z	writeliner   	render_opboolgetvalue)rL   r-   bufprinterZ	has_linesoplinesliner4   r4   r5   rH   `   s    



rH   zops.MigrateOperationz	List[str])r-   rS   r/   c                 C  s   t |}t|| |}|S r0   )	renderersdispatchr   Zto_list)r-   rS   rendererrT   r4   r4   r5   rN   {   s    
rN   c                 C  s   d t| |S )NrE   )rI   rN   r-   rS   r4   r4   r5   render_op_text   s    rZ   r)   c              	   C  s   | j }|dd}|jrg }|rv|  F |d|j|jf  |jD ]}t| |}|| qF|d W 5 Q R X n |jD ]}t| |}|| q||S g S d S )Nrender_as_batchFz5with op.batch_alter_table(%r, schema=%r) as batch_op:r;   )	optsgetr   Z_within_batchappend
table_namer   rN   extend)r-   rS   r\   r[   rT   Zt_opZt_linesr4   r4   r5   _render_modify_table   s(    





ra   zops.CreateTableCommentOpc                 C  sh   | j rd}nd}|jt| |j|jd k	r2d|j nd |jd k	rHd|j nd |jd k	r^d|j nd ddS )NzV{prefix}create_table_comment(
{indent}{comment},
{indent}existing_comment={existing}
)z{prefix}create_table_comment(
{indent}'{tname}',
{indent}{comment},
{indent}existing_comment={existing},
{indent}schema={schema}
)%r'%s'r:   )prefixtnamecommentexistingr   indent)
_has_batchformatr3   r_   rf   existing_commentr   r-   rS   Ztemplr4   r4   r5   _render_create_table_comment   s    rm   zops.DropTableCommentOpc                 C  sR   | j rd}nd}|jt| |j|jd k	r2d|j nd |jd k	rHd|j nd ddS )NzA{prefix}drop_table_comment(
{indent}existing_comment={existing}
)zm{prefix}drop_table_comment(
{indent}'{tname}',
{indent}existing_comment={existing},
{indent}schema={schema}
)rb   rc   r:   )rd   re   rg   r   rh   )ri   rj   r3   r_   rk   r   rl   r4   r4   r5   _render_drop_table_comment   s    rn   zops.CreateTableOpc           
        sZ    }dd  fdd|jD D tdd  fdd|jD D  }t|tkrjdd| d }n
d|}d	tjt	 |d
 }j
r|dtj
 7 }|j}|r|dt| 7 }|j}|r|d|7 }tjD ]"}|d|ddj| f 7 }q|jr0ddd |jD }	|d|	 7 }jd k	rN|dtj 7 }|d7 }|S )Nc                 S  s   g | ]}|r|qS r4   r4   .0colr4   r4   r5   
<listcomp>   s   z_add_table.<locals>.<listcomp>c                   s   g | ]}t | qS r4   )_render_columnro   r-   r4   r5   rr      s    c                 S  s   g | ]}|d k	r|qS r0   r4   )rp   Zrconsr4   r4   r5   rr      s   c                   s   g | ]}t | jqS r4   )_render_constraintZ_namespace_metadata)rp   ZconsrY   r4   r5   rr      s     z*[z,
]z.%(prefix)screate_table(%(tablename)r,
%(args)s)Z	tablenamerd   argsz,
schema=%rz,
comment=%rz,
info=z,
%s=%r _, c                 s  s   | ]}d | V  qdS )rc   Nr4   )rp   pr4   r4   r5   	<genexpr>  s     z_add_table.<locals>.<genexpr>z,
prefixes=[%s]z,
if_not_exists=%rz
))Zto_tablecolumnsrJ   constraintslenMAX_PYTHON_ARGSrI   _identr_   r3   r   rf   infokwreplace	_prefixesif_not_existsrO   )
r-   rS   tablerw   args_strr8   rf   r   kprefixesr4   rY   r5   
_add_table   sN    

 r   zops.DropTableOpc                 C  sX   dt | t|jd }|jr0|dt|j 7 }|jd k	rL|dt|j 7 }|d7 }|S )Nz%(prefix)sdrop_table(%(tname)r)rd   re   , schema=%rz, if_exists=%r))r3   r   r_   r   	if_existsrO   )r-   rS   r8   r4   r4   r5   _drop_table!  s    
r   r   z	list[str])r-   itemr/   c                   s    fdd|j  D S )Nc                   s$   g | ]\}}| d t |  qS )=_render_potential_exprrp   keyvalrt   r4   r5   rr   4  s   z0_render_dialect_kwargs_items.<locals>.<listcomp>)dialect_kwargsitems)r-   r   r4   rt   r5   _render_dialect_kwargs_items1  s    
r   zops.CreateIndexOpc                 C  s   |  }| j}|rd}nd}|jd k	s*tt| |}|jd k	rR|dt|j  |t| t	| |j
t|jj
dt|| |jpd|jjrdt|jj nd|rdd| ndd }|S )	NzL%(prefix)screate_index(%(name)r, [%(columns)s], unique=%(unique)r%(kwargs)s)za%(prefix)screate_index(%(name)r, %(table)r, [%(columns)s], unique=%(unique)r%(schema)s%(kwargs)s)zif_not_exists=%rrz   Fr   r;   )rd   r.   r   r}   uniquer   kwargs)to_indexri   r   AssertionErrorr   r   r^   rO   r3   r6   r.   r   rI   _get_index_rendered_expressionsr   r   r-   rS   index	has_batchtmplr\   r8   r4   r4   r5   
_add_index:  s2    



r   zops.DropIndexOpc              	   C  s   |  }| j}|rd}nd}t| |}|jd k	rD|dt|j  |t| t| |jt	|j
|jrrdt	|j nd|rdd| ndd }|S )Nz(%(prefix)sdrop_index(%(name)r%(kwargs)s)zM%(prefix)sdrop_index(%(name)r, table_name=%(table_name)r%(schema)s%(kwargs)s)zif_exists=%rr   r;   rz   )rd   r.   r_   r   r   )r   ri   r   r   r^   rO   r3   r6   Z
index_namer   r_   r   rI   r   r4   r4   r5   _drop_indexb  s"    


r   zops.CreateUniqueConstraintOpc                 C  s   t | | dgS )NT)_uq_constraintZto_constraintrY   r4   r4   r5   _add_unique_constraint|  s    r   zops.CreateForeignKeyOpc                 C  s   t t| |jg}| js,|t t|j |t t|jt dd |j	D t dd |j
D g dddddd	d
g}| js|dd |D ]2}||jkr|j| }|d k	r|d||f  qdt| d|d S )Nc                 S  s   g | ]}t |qS r4   r   ro   r4   r4   r5   rr     s     z&_add_fk_constraint.<locals>.<listcomp>c                 S  s   g | ]}t |qS r4   r   ro   r4   r4   r5   rr     s     Zreferent_schemaonupdateondelete	initially
deferrable	use_altermatchr   Zsource_schema%s=%rz&%(prefix)screate_foreign_key(%(args)s)rz   rd   rw   )reprr6   constraint_nameri   r^   r   Zsource_tabler`   Zreferent_tableZ
local_colsZremote_colsinsertr   r3   rI   )r-   rS   rw   r   r   valuer4   r4   r5   _add_fk_constraint  s8    	

r   c                 C  s
   t  d S r0   NotImplementedError
constraintr-   r4   r4   r5   _add_pk_constraint  s    r   c                 C  s
   t  d S r0   r   r   r4   r4   r5   _add_check_constraint  s    r   zops.DropConstraintOpc                 C  s   t | }t| |j}|jr$t|jnd }|jr8t|jnd }g }|t| | js|tt|j	 |d k	r|d| |d k	r|d| | dd
| dS )Nzschema=ztype_=zdrop_constraint(rz   r   )r3   r6   r   r   r   Zconstraint_typer^   r   ri   r_   rI   )r-   rS   rd   r.   r   type_Zparams_strsr4   r4   r5   _drop_constraint  s    r   zops.AddColumnOpc                 C  sZ   |j |j|j  }}}| jr"d}nd}|r2|d7 }|d7 }|t| |t|| |d }|S )Nz %(prefix)sadd_column(%(column)s)z*%(prefix)sadd_column(%(tname)r, %(column)s, schema=%(schema)rr   )rd   re   columnr   )r   r_   r   ri   r3   rs   )r-   rS   r   re   r   templater8   r4   r4   r5   _add_column  s    r   zops.DropColumnOpc                 C  s`   |j |j|j  }}}| jr"d}nd}|r2|d7 }|d7 }|t| t|t|t|d }|S )Nz %(prefix)sdrop_column(%(cname)r)z*%(prefix)sdrop_column(%(tname)r, %(cname)rr   r   )rd   re   cnamer   )r   r_   column_nameri   r3   r   )r-   rS   r   re   r   r   r8   r4   r4   r5   _drop_column  s    r   zops.AlterColumnOpc                 C  s  |j }|j}|j}|j}|j}|j}|jdd }|j}	|j	}
|j
}|j}|j}d}| jr`d}nd}|t| ||d }|	d k	r|d|t|	| f 7 }|dk	rt|| }|d||f 7 }|d k	r|d	|t|| f 7 }|d k	r|d
||f 7 }|dk	r|d||f 7 }|d k	r"|d||f 7 }|d krF|
d k	rF|d||
f 7 }|d k	r`|d||f 7 }|dkr|rt|| }|d||f 7 }|r| js|d||f 7 }|d7 }|S )Nautoincrementz           z %(prefix)salter_column(%(cname)rz+%(prefix)salter_column(%(tname)r, %(cname)r)rd   re   r   z,
%sexisting_type=%sFz,
%sserver_default=%sz,
%stype_=%sz,
%snullable=%rz,
%scomment=%rz,
%sexisting_comment=%rz,
%sexisting_nullable=%rz,
%sautoincrement=%rz,
%sexisting_server_default=%sz,
%sschema=%rr   )r_   r   Zmodify_server_defaultZmodify_typeZmodify_nullableZmodify_commentr   r]   existing_typeexisting_nullablerk   existing_server_defaultr   ri   r3   
_repr_type_render_server_default)r-   rS   re   r   server_defaultr   nullablerf   r   r   r   rk   r   r   rh   r   r8   renderedr4   r4   r5   _alter_column  sf    



 r   c                   @  s,   e Zd ZddddddZdddd	Zd
S )r2   r7   r   rB   )rd   r.   r/   c                 C  s   || _ || _d S r0   )rd   r.   )selfrd   r.   r4   r4   r5   __init__/  s    z_f_name.__init__)r/   c                 C  s   d| j t| jf S )Nz%sf(%r))rd   r   r.   )r   r4   r4   r5   __repr__3  s    z_f_name.__repr__N)__name__
__module____qualname__r   r   r4   r4   r4   r5   r2   .  s   r2   z!Optional[Union[quoted_name, str]]zOptional[str])r.   r/   c                 C  s0   | dkr| S t | trt| S t | tr,| S dS )zproduce a __repr__() object for a string identifier that may
    use quoted_name() in SQLAlchemy 0.9 and greater.

    The issue worked around here is that quoted_name() doesn't have
    very good repr() behavior by itself when unicode is involved.

    N)r1   r   r7   )r.   r4   r4   r5   r   7  s    

r   TF)wrap_in_textis_server_defaultis_indexr   rO   )r   r-   r   r   r   r/   c                C  sH   t | tjr<|rd}nd}|t||jjj| ||dd S t| S d S )Nz%(prefix)stext(%(sql)r)z%(sql)r)r   r   )rd   r   )r1   r   ZClauseElement_sqlalchemy_autogenerate_prefixmigration_contextimplZrender_ddl_sql_exprr   )r   r-   r   r   r   r   r4   r4   r5   r   G  s      r   r    )idxr-   r/   c                   s    fdd| j D S )Nc                   s:   g | ]2}t |tjr(ttt|d dnt| ddqS )r.   NT)r   )r1   	sa_schemar   r   r   getattrr   )rp   exprt   r4   r5   rr   c  s   
z3_get_index_rendered_expressions.<locals>.<listcomp>)Zexpressions)r   r-   r4   rt   r5   r   `  s    
r   r#   )r   r-   alterr/   c                 C  sZ  g }|j }| jr$|dt| jf | jr>|dt| jf |sd|rd| jjrd|dt| jjf |s| jr|dt	|| jf t
|| }|rtt	|| jg}|s|tt| jjg7 }|tdd | jD  |dd |D  || dt|d	|d
 S dd | jD }|dd |D  || dt|d	|d
 S d S )Nr   r   r   r.   c                 S  s   g | ]}t |jqS r4   )r   r.   ro   r4   r4   r5   rr     s     z"_uq_constraint.<locals>.<listcomp>c                 S  s   g | ]\}}d ||f qS r   r4   rp   r   vr4   r4   r5   rr     s     z,%(prefix)screate_unique_constraint(%(args)s)rz   r   c                 S  s   g | ]}t t|jqS r4   )r   r   r.   ro   r4   r4   r5   rr     s     c                 S  s   g | ]\}}d ||f qS r   r4   r   r4   r4   r5   rr     s     z$%(prefix)sUniqueConstraint(%(args)s))ri   r   r^   r7   r   r   r   r   r.   r6   r   r   r}   r`   r3   rI   r   )r   r-   r   r\   r   Zdialect_optionsrw   r4   r4   r5   r   m  s>    



r   c                 C  s$   | j d }|d krd|j S |S d S )NZuser_module_prefixz%s.)r\   r   )r-   targetrd   r4   r4   r5   _user_autogenerate_prefix  s    

r   )r-   r/   c                 C  s   | j d pdS )NZsqlalchemy_module_prefixr;   r\   rt   r4   r4   r5   r     s    r   c                 C  s   | j r
dS | jd pdS d S )Nz	batch_op.Zalembic_module_prefixr;   )ri   r\   rt   r4   r4   r5   r3     s    r3   zUnion[str, Literal[False]])r   object_r-   r/   c                 C  s4   d|j kr0|j d }|r0|| ||}|dk	r0|S dS )NZrender_itemFr   )r   r   r-   renderr   r4   r4   r5   _user_defined_render  s    

r   zColumn[Any])r   r-   r/   c                   s<  t d|  }|dk	r|S g }g }| jrZt| j }|rZt| jrL|| n|d|f | jd k	r| jtjkr|d| jf | jd k	r|d| jf | j	r|d| j	f | j
}|r|dd| f d	t t| jt| j |rd
dd |D d
 ndd
dd |D  fddt|  D  d S )Nr   Fr   r   r   systemrf   rb   z8%(prefix)sColumn(%(name)r, %(type)s, %(args)s%(kwargs)s)rz   c                 S  s   g | ]}t |qS r4   )r7   )rp   argr4   r4   r5   rr     s     z"_render_column.<locals>.<listcomp>r;   c                 S  s   g | ]\}}d ||f qS %s=%sr4   rp   Zkwnamer   r4   r4   r5   rr     s     c                   s"   g | ]\}}d |t | f qS r   r   r   rt   r4   r5   rr     s   )rd   r.   typerw   r   )r   r   r   *_should_render_server_default_positionallyr^   r   r   ZAUTOINCREMENT_DEFAULTr   r   rf   r   r   r.   r   r   rI   Z_column_kwargsr   )r   r-   r   rw   r\   rf   r4   rt   r5   rs     sR     


 
rs   )r   r/   c                 C  s   t | pt | S r0   )r   _server_default_is_computed_server_default_is_identity)r   r4   r4   r5   r     s
    r   zBOptional[Union[FetchedValue, str, TextClause, ColumnElement[Any]]])defaultr-   repr_r/   c                 C  s   t d| |}|dk	r|S t| r2ttd| |S t| rLttd| |S t| tj	r|t| j
trl| j
} nt| j
|ddS t| tr|rttdd| } tt| S )	Nr   Fr*   r+   T)r   z^'|'$r;   )r   r   r   _render_computedr   r   _render_identityr1   r   ZDefaultClauser   r7   r   r   r<   r?   )r   r-   r   r   r4   r4   r5   r     s$    

  r   r*   )computedr-   r/   c                 C  sP   t | j|dd}i }| jd k	r(| j|d< dt||ddd | D d S )	NFr   	persistedz(%(prefix)sComputed(%(text)s, %(kwargs)s)rz   c                 s  s   | ]}d | V  qdS r   Nr4   rp   pairr4   r4   r5   r|     s     z#_render_computed.<locals>.<genexpr>)rd   r8   r   )r   sqltextr   r   rI   r   )r   r-   r8   r   r4   r4   r5   r     s      

r   r+   )identityr-   r/   c                 C  s4   t j| dd}dt|ddd | D d S )NT)r   z%(prefix)sIdentity(%(kwargs)s)rz   c                 s  s   | ]}d | V  qdS r   r4   r   r4   r4   r5   r|   ,  s     z#_render_identity.<locals>.<genexpr>)rd   r   )r   Z_get_identity_options_dictr   rI   r   )r   r-   r   r4   r4   r5   r   #  s     r   r%   )r   r-   _skip_variantsr/   c                 C  s*  t d| |}|dk	r|S t|jdr6|jj| |}nd }t| j}|j}|sbt	| rbt
| |S |drtd|}|d k	st|d}|d k	r|d|  |r|S d|| f S nl|r|S |d	rd
| j t k rt d
| j  }	|	| |S t|}
d|
| f S nt|| }
d|
| f S d S )Nr   Fr   sqlalchemy.dialectssqlalchemy\.dialects\.(\w+)   z"from sqlalchemy.dialects import %sz%s.%rzsqlalchemy.z_render_%s_typez%s%r)r   hasattrr   r   Zrender_typer   r   rF   r   Z_type_has_variants_render_Variant_type
startswithr<   r   r   groupaddZ__visit_name__globalsr   r   )r   r-   r   r   Zimpl_rtmodrF   r   dnamefnrd   r4   r4   r5   r   0  s@     





r   r$   )r   r-   r/   c                 C  s   t tt| |ddS )NZ	item_typez(.+?\())r   r7   _render_type_w_subtype)r   r-   r4   r4   r5   _render_ARRAY_type]  s       r  c                 C  sd   t | \}}t||dd}|d k	r,|dk	s0tt|D ]&}|| }|dt||dd|f 7 }q8|S )NT)r   Fz.with_variant(%s, %r))r   Z_get_variant_mappingr   r   rJ   )r   r-   Z	base_typeZvariant_mappingbasedialecttypr4   r4   r5   r  f  s    
r  z$Union[Optional[str], Literal[False]])r   r-   attrnameregexprd   r/   c                 C  s   t | }t| |d }|d kr dS t |}tdd|}tt| ||}t|| d| |}	|rld||	f S t| j}
|
drtd|
}|d k	st	|
d}d	||	f S |
d
rt|}d||	f S d S d S )NFz([\(\)])z\\\1z\1%sz%s%sr   r   r   %s.%s
sqlalchemy)r   r   r<   r?   r   r   r   r  r   r   r  r   )r   r-   r  r  rd   Z
outer_reprZ
inner_typeZ
inner_reprZsub_typeZ
outer_typer  r   r  r4   r4   r5   r
  u  s(    



r
  r   zOptional[MetaData])r   r-   namespace_metadatar/   c                 C  sJ   zt | }W n* tk
r8   td|   d|   Y S X || ||S d S )Nz(No renderer is established for object %rz[Unknown Python object %r])_constraint_renderersrW   
ValueErrorr   warn)r   r-   r  rX   r4   r4   r5   ru     s    ru   r"   c                 C  sx   t d| |}|dk	r|S | js"d S g }| jrF|dtt|| jf dt|ddd | jD dd |D  d	 S )
NZprimary_keyFr.   z(%(prefix)sPrimaryKeyConstraint(%(args)s)rz   c                 S  s   g | ]}t |jqS r4   )r   r.   )rp   cr4   r4   r5   rr     s     z'_render_primary_key.<locals>.<listcomp>c                 S  s   g | ]\}}d ||f qS r   r4   r   r4   r4   r5   rr     s     r   )r   r}   r.   r^   r   r6   r   rI   r   r-   r  r   r\   r4   r4   r5   _render_primary_key  s$    r  r   r!   )fkmetadata_schemar  r/   c           	      C  s   |   }|d}|dd \}}|dk	rDt|dkrDd||f }nd|dd }| js| jdk	r| jjdk	r||jkr|j| j	|}|dk	rt
|j}d||f }|S )zxImplement a 'safe' version of ForeignKey._get_colspec() that
    won't fail if the remote table can't be resolved.

    .Nr   r  r   )Z_get_colspecsplitr   rI   Zlink_to_nameparentr   Ztablesr  r]   r   r.   )	r  r  r  Zcolspectokensre   ZcolnameZtable_fullnamerq   r4   r4   r5   _fk_colspec  s$    	

	

r"  r   zList[Tuple[str, str]])r   r\   r/   c                 C  s   | j r|dt| j f | jr4|dt| jf | jrN|dt| jf | jrh|dt| jf | jr|dt| jf | jr|dt| jf d S )Nr   r   r   r   r   r   )r   r^   r   r   r   r   r   r   )r   r\   r4   r4   r5   _populate_render_fk_opts  s    r#  c                   s   t d| |}|dk	r|S g }| jr<|dtt|| jf t| | j dt|ddd | j	D d fdd| j	D dd	d
 |D d S )NZforeign_keyFr.   zC%(prefix)sForeignKeyConstraint([%(cols)s], [%(refcols)s], %(args)s)rz   c                 s  s   | ]}t t|jjV  qd S r0   )r   r   r   r.   rp   fr4   r4   r5   r|     s    z&_render_foreign_key.<locals>.<genexpr>c                 3  s   | ]}t t| V  qd S r0   )r   r"  r$  Zapply_metadata_schemar  r4   r5   r|     s   c                 S  s   g | ]\}}d ||f qS r   r4   r   r4   r4   r5   rr     s     z'_render_foreign_key.<locals>.<listcomp>)rd   colsZrefcolsrw   )
r   r.   r^   r   r6   r#  r   r   rI   elementsr  r4   r&  r5   _render_foreign_key  s0    

r)  c                 C  s$   t d| |}|dk	r|S t| |dS )Nr   F)r   r   )r   r-   r  r   r4   r4   r5   _render_unique_constraint  s    r*  r   c                 C  s   t d| |}|dk	r|S | jr>t| jdr>t| jjtjr>d S g }| jrb|dt	t
|| jf dt||rdddd |D  nd	t| j|dd
d S )NcheckFr   r.   z.%(prefix)sCheckConstraint(%(sqltext)s%(opts)s)rz   c                 s  s   | ]\}}d ||f V  qdS r   r4   r   r4   r4   r5   r|   K  s     z+_render_check_constraint.<locals>.<genexpr>r;   r   )rd   r\   r   )r   Z_create_ruler  r1   r   sqltypesr%   r.   r^   r   r6   r   rI   r   r   r  r4   r4   r5   _render_check_constraint,  s:    
  r-  zops.ExecuteSQLOpc                 C  s   t |jtstdd|j S )NznAutogenerate rendering of SQL Expression language constructs not supported here; please use a plain SQL stringzop.execute(%r))r1   r   r7   r   rY   r4   r4   r5   _execute_sqlU  s
    r.  )T)F)N)
__future__r   ior   r<   typingr   r   r   r   r   r	   r
   r   Z
mako.pygenr   r  r   r   r   r   r,  Zsqlalchemy.sql.elementsr   r   r;   r   
operationsr   r   r   Zsqlalchemy.sql.baser   r   r   Zsqlalchemy.sql.schemar   r   r   r   r   r   r    r!   r"   r#   Zsqlalchemy.sql.sqltypesr$   Zsqlalchemy.sql.type_apir%   Zalembic.autogenerate.apir&   Zalembic.configr'   Zalembic.operations.opsr(   r)   Zalembic.util.sqla_compatr*   r+   r   r6   rA   rK   Z
DispatcherZdefault_renderersrV   rH   rN   rZ   Zdispatch_forra   ZCreateTableCommentOprm   ZDropTableCommentOprn   ZCreateTableOpr   ZDropTableOpr   r   ZCreateIndexOpr   ZDropIndexOpr   ZCreateUniqueConstraintOpr   ZCreateForeignKeyOpr   ZCreatePrimaryKeyOpr   ZCreateCheckConstraintOpr   ZDropConstraintOpr   ZAddColumnOpr   ZDropColumnOpr   ZAlterColumnOpr   r2   r   r   r   r   r   r   r3   r   rs   r   r   r   r   r   r  r  r
  r  ru   r  r"  r#  r)  r*  r-  ZExecuteSQLOpr.  branchr4   r4   r4   r5   <module>   s   


!

9
	
'


&







<	*9  -	 "
%
%

(
	