o
    DfPL                     @  sd  d dl mZ d dl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 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r%d d"lm-Z- d d#lm.Z. d d$lm/Z/ d d%lm0Z0 d d&lm1Z1 d d'lm2Z2 d d(l3m4Z4 d d)l!m5Z5 d d*l6m7Z7 d d+l8m9Z9 d d,l#m:Z: d d-l;m<Z< d d.l;m=Z= d d/l>m?Z? d d0l>m@Z@ ed1ed2 d3ZAG d4d5 d5eZBdd:d;ZCeDd<d= eEd>eD ZFeFd?kZGeFd@kZHeFdAkZIeFdBkZJeFdCkZKeZLzd dDlMmNZN W n eOyu   d dDl#mNZN Y nw G dEdF dFZPerddKdLZQnd dMlRmQZQ zd dNlmSZS W n eOy   esG dOdP dPePZSdQZTdQZUY nw dRZTeFdSkZUzd dTlmVZV W n eOy   esG dUdV dVePZVdQZWY nw eXeVe"ZY	Qddd\d]ZZdRZWeKrd d^l!m[Z[ nd d_l\m]Z[ ede^e[f Z_ee^e[f Z`ddcddZaddfdgZbddidjZcdkZdejeddodpZfddqdrZgd dudvZhddxdyZiddzd{Zjdd|d}ZkdddZldddZmdddZndddZodddZpdd Zqdd ZrdddZsdddZtd	ddZudd Zvd
ddZwdd Zxeyejzdrdd Z{dd Z|ndd Z{dd Z|dddZ}dddZ~dddZdd ZdddZdddÄZdddǄZG ddɄ dej:ZeQeddd̈́ZG ddτ de$ZeQedddфZdddքZdddۄZdddބZdddZdd ZdddZeHrd dlmZ d dlmZ eZnd dlmZ dd ZdddZdddZdddZdS (      )annotationsN)Any)Callable)Dict)Iterable)Iterator)Mapping)Optional)Protocol)Set)Type)TYPE_CHECKING)TypeVar)Union)__version__)inspectschema)sql)types)url)CheckConstraint)Column)ForeignKeyConstraint)visitors)DialectKWArgs)BindParameter)ColumnClause)quoted_name)
TextClause)UnaryExpression)traverse)	TypeGuard)ClauseElement)Index)Table)
Connection)Dialect)Transaction)	Inspector)ColumnCollection)SQLCompiler)Insert)ColumnElement)
Constraint)
SchemaItem)Select)TableClause_CE)zColumnElement[Any]r/   )boundc                   @  s   e Zd Zd
ddZd	S )_CompilerProtocolelementr   compilerkwreturnstrc                 K     d S N )selfr5   r6   r7   r<   r<   Q/home/ubuntu/webapp/venv/lib/python3.10/site-packages/alembic/util/sqla_compat.py__call__>   s   z_CompilerProtocol.__call__N)r5   r   r6   r   r7   r   r8   r9   )__name__
__module____qualname__r?   r<   r<   r<   r>   r4   =   s    r4   valuer9   r8   Union[int, str]c                 C  s   zt | W S    |  Y S r;   )int)rC   r<   r<   r>   	_safe_intB   s   
rF   c                 C  s   g | ]}t |qS r<   )rF   ).0xr<   r<   r>   
<listcomp>J       rI   z(\d+|[abc]\d))      )rK      )rK   rM      )rK   rM      )   )
_NONE_NAMEc                   @  s   e Zd ZdZdS )_Unsupportedz.Placeholder for unsupported SQLAlchemy classesN)r@   rA   rB   __doc__r<   r<   r<   r>   rR   Z   s    rR   r5   Type[ClauseElement]dialects0Callable[[_CompilerProtocol], _CompilerProtocol]c                 G  r:   r;   r<   )r5   rU   r<   r<   r>   compiles`   s   rW   )rW   )Computedc                   @     e Zd ZdS )rX   Nr@   rA   rB   r<   r<   r<   r>   rX   m       rX   FT)rK   rL      )Identityc                   @  rY   )r]   NrZ   r<   r<   r<   r>   r]   {   r[   r]   identity&Union[Identity, schema.Sequence, None]dialect_kwargsboolDict[str, Any]c                   s    d u ri S t r  }|rt tsJ | j |S i }t tr3 j|d<  jd ur3 j|d< d}| fdd|D  |S )Nalwayson_null)	start	incrementminvaluemaxvalue
nominvalue
nomaxvaluecyclecacheorderc                   s*   i | ]}t  |d d ur|t  |d qS r;   )getattrrG   keyr^   r<   r>   
<dictcomp>   s
    z._get_identity_options_dict.<locals>.<dictcomp>)	identity_has_dialect_kwargs_as_dict
isinstancer   updater`   r]   rc   rd   )r^   r`   as_dictattrsr<   rq   r>   _get_identity_options_dict   s(   




ry   )	_NoneName)symbolname_ConstraintName!TypeGuard[_ConstraintNameDefined]c                 C  s   | t u p
t| ttfS r;   )rQ   ru   r9   rz   r|   r<   r<   r>   constraint_name_defined   s   r   TypeGuard[str]c                 C  s
   t | tS r;   )ru   r9   r   r<   r<   r>   constraint_name_string   s   
r   Optional[str]c                 C  s   t | r| S d S r;   )r   r   r<   r<   r>   constraint_name_or_none   s   r   auto
connectionOptional[Connection]Iterator[None]c                 c  s    z| j }W n ty   d }Y nw |d u rd V  d S | s>| d us$J |   d V  W d    d S 1 s7w   Y  d S d V  d S r;   )in_transactionAttributeErrorbeginr   r   r<   r<   r>   _ensure_scope_for_ddl   s   


"
r   c                 C  s   t r| j|dS | j|dS )N)hide_password)sqla_14render_as_string__to_string__)r   r   r<   r<   r>   url_render_as_string      r   r&   r(   c                 C  s   t | }|r|S |  S r;   )_get_connection_transactionr   r   transactionr<   r<   r>   "_safe_begin_connection_transaction   s   r   Nonec                 C     t | }|r|  d S d S r;   )r   commitr   r<   r<   r>   #_safe_commit_connection_transaction      r   c                 C  r   r;   )r   rollbackr   r<   r<   r>   %_safe_rollback_connection_transaction   r   r   c                 C  s$   z| j }W | S  ty   Y dS w )NF)r   r   r   r<   r<   r>   _get_connection_in_transaction  s   r   idxr$   Iterable[ColumnElement[Any]]c                 C     | j S r;   )expressions)r   r<   r<   r>   _idx_table_bound_expressions     r   schema_itemc                 K  s*   t | dr| jdi |S | jdi |S )N_copyr<   )hasattrr   copy)r   r7   r<   r<   r>   r     s   
r   Optional[Transaction]c                 C  s   t r|  S | j}|jS r;   )r   get_transaction_root_Connection__transaction)r   rr<   r<   r>   r     s   r   url.URLc                  O  s.   t tjdrtjj| i |S tj| i |S )Ncreate)r   r   URLr   )argr7   r<   r<   r>   _create_url"  s   r   connectable	tablename
schemanameUnion[str, None]c                 C  s$   t r
t| ||S | j| ||S r;   )r   r   	has_tabledialect)r   r   r   r<   r<   r>   _connectable_has_table)  s
   r   c                 K  sJ   t r|  }|||W  d    S 1 sw   Y  d S | j||S r;   )r   _operation_contextexecutebind)	inspector	statementparamsconnr<   r<   r>   _exec_on_inspector4  s
   

$r   c                 C  s"   t s| jS ddlm} | j|ju S )Nr   r   )r   nullablesqlalchemy.sqlr   _user_defined_nullableNULL_UNSPECIFIED)metadata_columnr   r<   r<   r>   _nullability_might_be_unset<  s
   
r   c                  G     t sdS tdd | D S )NFc                 s      | ]}t |tV  qd S r;   )ru   rX   rG   sdr<   r<   r>   	<genexpr>K      z._server_default_is_computed.<locals>.<genexpr>)has_computedanyserver_defaultr<   r<   r>   _server_default_is_computedG     r   c                  G  r   )NFc                 s  r   r;   )ru   r]   r   r<   r<   r>   r   R  r   z._server_default_is_identity.<locals>.<genexpr>)r   r   r   r<   r<   r>   _server_default_is_identityN  r   r   
constraintr.   r%   c                 C  s&   t | tr| j}|d usJ |S | jS r;   )ru   r   parenttable)r   r   r<   r<   r>   _table_for_constraintU  s
   
r   c                 C  s8   t | trdd | jD S t | trt| jS t| jS )Nc                 S  s   g | ]}|j qS r<   )r   )rG   fkr<   r<   r>   rI   `  s    z+_columns_for_constraint.<locals>.<listcomp>)ru   r   elementsr   _find_columnssqltextlistcolumnsr   r<   r<   r>   _columns_for_constraint^  s
   



r   r   r)   r   c                 C  s   t r| |d S | |d S r;   )r   reflect_tablereflecttable)r   r   r<   r<   r>   _reflect_tableg  s
   r   c                 C  s&   t | rt| \}}||j|S | S r;   )_type_has_variants_get_variant_mappinggetr|   )type_r   	base_typemappingr<   r<   r>   _resolve_for_variantp  s   r   _variant_mappingc                 C  s
   t | jS r;   )ra   r   r   r<   r<   r>   r   z     
r   c                 C  s
   | | j fS r;   )r   r   r<   r<   r>   r   }  r   r   c                 C  s   t | tju S r;   )typesqltypesVariantr   r<   r<   r>   r     s   c                 C  s   | j | jfS r;   )implr   r   r<   r<   r>   r     s   r   r   c              
     s   t r jd us	J  jd usJ t jtsJ  fdd jD } jj} jj} jd j	j
j} jd j	j
j}dd  jD } j} j} j}	 j}
|||||||||	|
f
S )Nc                   s   g | ]} j | jqS r<   )r   r|   ro   r   r<   r>   rI     s    z_fk_spec.<locals>.<listcomp>r   c                 S  s   g | ]}|j jqS r<   )columnr|   )rG   r5   r<   r<   r>   rI     rJ   )r   r   r   ru   r   r%   column_keysr|   r   r   r   ondeleteonupdate
deferrable	initially)r   source_columnssource_tablesource_schematarget_schematarget_tabletarget_columnsr   r   r   r   r<   r   r>   _fk_spec  s6   
r   c                 C  sF   | j d  }|d}|d d|}| jd usJ || jjkS )Nr   .)r   _get_colspecsplitpopjoinr   rp   )r   spectokenstablekeyr<   r<   r>   _fk_is_self_referential  s   


r	  c                 C  r   r;   )_type_boundr   r<   r<   r>   _is_type_bound  s   r  c                 C  s   t  }t| i d|ji |S )z2locate Column objects within the given expression.r   )setr!   add)clausecolsr<   r<   r>   r     s   r   
collectionr*   r   %Union[Column[Any], ColumnClause[Any]]c                 C  sJ   |j dusJ | |j  }t| dst| dr| j| dS | | dS )z(remove a column from a ColumnCollection.N
_immutable	_readonly)rp   r   _parentremove)r  r   	to_remover<   r<   r>   _remove_column_from_collection  s
   
r  text_*Union[str, TextClause, ColumnElement[Any]]&Union[ColumnElement[Any], Column[Any]]c                 C  sl   t |trt|tj}| | |S t |trt| |S t |tr't| |j	S t |t
jr2t|| S td)zAa workaround for the Index construct's severe lack of flexibilityz#String or text() construct expected)ru   r9   r   r   NULLTYPEappend_columnr   _textual_index_element_textual_index_columntextr   r-   _copy_expression
ValueError)r   r  cr<   r<   r>   r    s   





r  
expressionr   c                   s    fdd}t | i |S )Nc                   sP   t | tr&| jd ur&| j ur&| j jv r j| j S t| } | |S d S r;   )ru   r   r   r|   r"  r   r  )colr"  r   r<   r>   replace  s   


z!_copy_expression.<locals>.replace)r   replacement_traverse)r#  r   r&  r<   r%  r>   r     s   r   c                   @  s&   e Zd ZdZdZdd	d
Zdd ZdS )r  aQ  Wrap around a sqlalchemy text() construct in such a way that
    we appear like a column-oriented SQL expression to an Index
    construct.

    The issue here is that currently the Postgresql dialect, the biggest
    recipient of functional indexes, keys all the index expressions to
    the corresponding column expressions when rendering CREATE INDEX,
    so the Index we create here needs to have a .columns collection that
    is the same length as the .expressions collection.  Ultimately
    SQLAlchemy should support text() expressions in indexes.

    See SQLAlchemy issue 3174.

    _textual_idx_elementr   r%   r  r   r8   r   c                 C  s8   || _ || _|j| _t| jjtj| _|| j d S r;   )	r   r  rp   r   r   r   r  fake_columnr  )r=   r   r  r<   r<   r>   __init__  s
   z_textual_index_element.__init__c                 C  s   | j gS r;   )r)  )r=   r<   r<   r>   get_children  s   z#_textual_index_element.get_childrenN)r   r%   r  r   r8   r   )r@   rA   rB   rS   __visit_name__r*  r+  r<   r<   r<   r>   r    s
    
r  r6   r+   c                 K  s   |j | jfi |S r;   )processr  r5   r6   r7   r<   r<   r>   _render_textual_index_column  s   r/  c                   @  rY   )_literal_bindparamNrZ   r<   r<   r<   r>   r0    r[   r0  c                 K  s   |j | fi |S r;   )render_literal_bindparamr.  r<   r<   r>   _render_literal_bindparam#  s   r2  r$  r   r   c                 C  s   t r| jS i S r;   )sqla_13kwargs)r$  r<   r<   r>   _column_kwargs*  s   r5  Union[Index, Constraint]r   Optional[Dialect]c                 C  s   | j d u rd S |d usJ tr|jj| ddS t| j dr#t| j }nt}|t| j dd}| j|d} t	| t
jrE||d }|| S |j| S )NF_alembic_quotequote)r:  r   )r|   r   identifier_preparerformat_constraintr   r   r   r9   	__class__ru   r   r$   ddl_compiler_prepared_index_name)r   r   quoted_name_clsnew_namedr<   r<   r>   _get_constraint_final_name1  s    

rC  Union[Constraint, Index]c                 C  s@   t r| jd u r	dS |d usJ |jj| dd}|d uS | jd uS )NFr8  )r   r|   r;  r<  )r   r   r|   r<   r<   r>   _constraint_is_namedV  s   

rE  mysql_dialectr'   c                 C  s   t r| jS t| jo| jS r;   )r   
is_mariadbra   server_version_info_is_mariadbrF  r<   r<   r>   rI  e  s   rI  c                 C  r   r;   ) _mariadb_normalized_version_inforJ  r<   r<   r>   rK  o  r   rK  Union[TableClause, Table]r,   c                 C  s   t r|   S | jddS )NT)inline)r   insertrM  )r   r<   r<   r>   _insert_inlines  r   rO  )create_mock_engine)selectcreate_enginec                 K  s   t dd|dS )Nzpostgresql://mock)strategyexecutorrR  )r   rV  r7   r<   r<   r>   rP    s   rP  r0   c                  O  s   t jt| fi |S r;   )r   rQ  r   )r   r7   r<   r<   r>   _select  s   rW  indexc                 C  s   | j D ]	}t|r dS qdS NTF)r   is_expression)rX  exprr<   r<   r>   is_expression_index  s
   
r\  r[  c                 C  s2   t | tr| j} t | tst | tr| jrdS dS rY  )ru   r    r5   r   
is_literal)r[  r<   r<   r>   rZ    s   

rZ  )rC   r9   r8   rD   )r5   rT   rU   r9   r8   rV   )F)r^   r_   r`   ra   r8   rb   )r|   r}   r8   r~   )r|   r}   r8   r   )r|   r}   r8   r   )r   r   r8   r   )T)r   r&   r8   r(   )r   r&   r8   r   )r   r   r8   ra   )r   r$   r8   r   )r   r2   r8   r2   )r   r&   r8   r   )r8   r   )r   r&   r   r9   r   r   r8   ra   )r8   ra   )r   r.   r8   r%   )r   r)   r   r%   r8   r   )r   r   r8   r   )r   r   r8   ra   )r   r.   r8   ra   )r  r*   r   r  r8   r   )r   r%   r  r  r8   r  )r#  r2   r   r%   r8   r2   )r5   r  r6   r+   r8   r9   )r5   r0  r6   r+   r8   r9   )r$  r   r8   r   )r   r6  r   r7  r8   r   )r   rD  r   r7  r8   ra   )rF  r'   r8   ra   )r   rL  r8   r,   )r8   r0   )rX  r$   r8   ra   )r[  r   r8   ra   )
__future__r   
contextlibretypingr   r   r   r   r   r   r	   r
   r   r   r   r   r   
sqlalchemyr   r   r   r   r   r   sqlalchemy.enginer   sqlalchemy.schemar   r   r   r   r   sqlalchemy.sql.baser   sqlalchemy.sql.elementsr   r   r   r   r    sqlalchemy.sql.visitorsr!   typing_extensionsr"   r#   r$   r%   r&   r'   r(   sqlalchemy.engine.reflectionr)   r*   sqlalchemy.sql.compilerr+   sqlalchemy.sql.dmlr,   r-   sqlalchemy.sql.schemar.   r/   sqlalchemy.sql.selectabler0   r1   r2   r4   rF   tuplefindall_versr3  r   
sqla_14_18
sqla_14_26sqla_2sqlalchemy_versionsqlalchemy.sql.namingrQ   ImportErrorrR   rW   sqlalchemy.ext.compilerrX   r   has_computed_reflectionr]   has_identity
issubclassrs   ry   rz   sqlalchemy.utilr{   r9   r}   _ConstraintNameDefinedr   r   r   AUTOINCREMENT_DEFAULTcontextmanagerr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
TypeEnginer   r   r   r	  r  r   r  r  r   r  r/  r0  r2  r5  rC  rE  rI  rK  rO  rP  rQ  
_sa_selectrW  rS  r\  rZ  r<   r<   r<   r>   <module>   s4  
	
'






			
!	%
