U
    fI                     @  s  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* er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%lm2Z2 d d&l3m4Z4 d d'l5m6Z6 d d(l!m7Z7 d d)l8m9Z9 d d*l8m:Z: d d+l;m<Z< d d,l;m=Z= ed-ed. d/Z>d0d1d2d3d4Z?e@d5d6 eAd7eD ZBeBd8kZCeBd9kZDeBd:kZEeBd;kZFeBd<kZGeZHzd d=lImJZJ W n" eKk
r   d d=l!mJZJ Y nX G d>d? d?ZLzd d@lmMZM W n4 eKk
r   esG dAdB dBeLZMdCZNdCZOY nX dDZNeBdEkZOzd dFlmPZP W n0 eKk
rT   esLG dGdH dHeLZPdCZQY n$X eRePe ZSddIdJdKdLdMdNZTdDZQeGrd dOlmUZU nd dPlVmWZU edeXeUf ZYeeXeUf ZZdQdRdSdTdUZ[dQdVdSdWdXZ\dQdYdSdZd[Z]d\Z^ej_d]d^d_d`daZ`ddbdcZaddded_dfdgZbdddhd_didjZcdddhd_dkdlZdd]dJd_dmdnZedodpdqdrdsZfd-d-dtdudvZgdddwd_dxdyZhdzd{d|d}Ziddd0d~dJdddZjdd Zkdd ZldJd{ddZmdJd{ddZndddddZodd ZpdddhdddZqdd Zresejtdrdd Zudd Zvndd Zudd Zvdd ZwddJdddZxddJdddZydd ZzdddhdddZ{ddddddZ|d-dd-dddZ}G dd dej7Z~ee~ddd0dddZG dd de"Zeeddd0dddZdd Zdd ZdddĜddƄZdddYdɜdd˄ZdddJdɜdd΄ZddJdМdd҄ZddԄ ZdddלddلZeDrnd dlmZ d dlmZ n"d dlmZ ddބ Zdd{ddZdodJdddZdS )    )annotationsN)Any)Dict)Iterable)Iterator)Mapping)Optional)TYPE_CHECKING)TypeVar)Union)__version__)inspectschema)sql)types)url)compiles)CheckConstraint)Column)ForeignKeyConstraint)visitors)DialectKWArgs)BindParameter)ColumnClause)quoted_name)
TextClause)UnaryExpression)traverse)	TypeGuard)Index)Table)
Connection)Dialect)Transaction)	Inspector)ColumnCollection)SQLCompiler)Insert)ColumnElement)
Constraint)
SchemaItem)Select)TableClause_CE)zColumnElement[Any]r+   )boundstrzUnion[int, str])valuereturnc                 C  s    z
t | W S    |  Y S X d S N)int)r1    r5   f/home/www/findmeahotel.co.uk/times_travel/venv/lib/python3.8/site-packages/alembic/util/sqla_compat.py	_safe_int6   s    
r7   c                 C  s   g | ]}t |qS r5   )r7   ).0xr5   r5   r6   
<listcomp>>   s     r:   z(\d+|[abc]\d))      )r;      )r;   r=      )r;   r=      )   )
_NONE_NAMEc                   @  s   e Zd ZdZdS )_Unsupportedz.Placeholder for unsupported SQLAlchemy classesN)__name__
__module____qualname____doc__r5   r5   r5   r6   rB   N   s   rB   )Computedc                   @  s   e Zd ZdS )rG   NrC   rD   rE   r5   r5   r5   r6   rG   W   s   rG   FT)r;   r<      )Identityc                   @  s   e Zd ZdS )rJ   NrH   r5   r5   r5   r6   rJ   e   s   rJ   z&Union[Identity, schema.Sequence, None]boolzDict[str, Any])identitydialect_kwargsr2   c                   s    d kri S t r8  }|rt ts*t| j nHi }t trd j|d<  j	d k	rd j	|d< d}| fdd|D  |S )Nalwayson_null)	start	incrementZminvalueZmaxvalueZ
nominvalueZ
nomaxvaluecyclecacheorderc                   s*   i | ]"}t  |d d k	r|t  |d qS r3   getattrr8   keyrL   r5   r6   
<dictcomp>   s    z._get_identity_options_dict.<locals>.<dictcomp>)
identity_has_dialect_kwargsZ_as_dict
isinstancer   AssertionErrorupdaterM   rJ   rN   rO   )rL   rM   Zas_dictattrsr5   rY   r6   _get_identity_options_dictl   s&    




r`   )	_NoneName)symbol_ConstraintNamez!TypeGuard[_ConstraintNameDefined])namer2   c                 C  s   | t kpt| ttfS r3   )rA   r\   r0   ra   rd   r5   r5   r6   constraint_name_defined   s    rf   zTypeGuard[str]c                 C  s
   t | tS r3   )r\   r0   re   r5   r5   r6   constraint_name_string   s    rg   zOptional[str]c                 C  s   t | r| S d S r3   )rg   re   r5   r5   r6   constraint_name_or_none   s    rh   autozOptional[Connection]zIterator[None])
connectionr2   c              	   c  sl   z
| j }W n tk
r"   d }Y nX |d kr4d V  n4| sb| d k	sFt|   d V  W 5 Q R X nd V  d S r3   )in_transactionAttributeErrorr]   beginrj   rk   r5   r5   r6   _ensure_scope_for_ddl   s    

ro   c                 C  s    t r| j|dS | j|dS d S )N)hide_password)sqla_14Zrender_as_stringZ__to_string__)r   rp   r5   r5   r6   url_render_as_string   s    rr   r"   r$   c                 C  s   t | }|r|S |  S d S r3   )_get_connection_transactionrm   rj   Ztransactionr5   r5   r6   "_safe_begin_connection_transaction   s    ru   Nonec                 C  s   t | }|r|  d S r3   )rs   commitrt   r5   r5   r6   #_safe_commit_connection_transaction   s    rx   c                 C  s   t | }|r|  d S r3   )rs   rollbackrt   r5   r5   r6   %_safe_rollback_connection_transaction   s    rz   c                 C  s,   z
| j }W n tk
r    Y dS X | S d S )NF)rk   rl   rn   r5   r5   r6   _get_connection_in_transaction   s
    
r{   r    zIterable[ColumnElement[Any]])idxr2   c                 C  s   | j S r3   )expressionsr|   r5   r5   r6   _idx_table_bound_expressions   s    r   )schema_itemr2   c                 K  s&   t | dr| jf |S | jf |S d S )N_copy)hasattrr   copy)r   kwr5   r5   r6   r      s    
r   zOptional[Transaction]c                 C  s   t r|  S | j}|jS d S r3   )rq   Zget_transaction_rootZ_Connection__transaction)rj   rr5   r5   r6   rs     s    rs   zurl.URL)r2   c                  O  s*   t tjdrtjj| |S tj| |S d S )Ncreate)r   r   URLr   )argr   r5   r5   r6   _create_url  s    r   zUnion[str, None])connectable	tablename
schemanamer2   c                 C  s(   t rt| ||S | j| ||S d S r3   )rq   r   Z	has_tabledialect)r   r   r   r5   r5   r6   _connectable_has_table  s      r   c              
   K  s@   t r.|  }|||W  5 Q R  S Q R X n| j||S d S r3   )rq   Z_operation_contextexecutebind)	inspectorZ	statementparamsconnr5   r5   r6   _exec_on_inspector  s    
 r   c                 C  s&   t s
| jS ddlm} | j|jkS d S )Nr   r   )rq   Znullablesqlalchemy.sqlr   Z_user_defined_nullableZNULL_UNSPECIFIED)Zmetadata_columnr   r5   r5   r6   _nullability_might_be_unset&  s
    
r   c                  G  s   t sdS tdd | D S d S )NFc                 s  s   | ]}t |tV  qd S r3   )r\   rG   r8   sdr5   r5   r6   	<genexpr>5  s     z._server_default_is_computed.<locals>.<genexpr>)has_computedanyZserver_defaultr5   r5   r6   _server_default_is_computed1  s    r   c                  G  s   t sdS tdd | D S d S )NFc                 s  s   | ]}t |tV  qd S r3   )r\   rJ   r   r5   r5   r6   r   <  s     z._server_default_is_identity.<locals>.<genexpr>)rq   r   r   r5   r5   r6   _server_default_is_identity8  s    r   r*   r!   )
constraintr2   c                 C  s*   t | tr | j}|d k	st|S | jS d S r3   )r\   r   parentr]   table)r   r   r5   r5   r6   _table_for_constraint?  s
    
r   c                 C  s<   t | trdd | jD S t | tr.t| jS t| jS d S )Nc                 S  s   g | ]
}|j qS r5   )r   )r8   Zfkr5   r5   r6   r:   J  s     z+_columns_for_constraint.<locals>.<listcomp>)r\   r   elementsr   _find_columnsZsqltextlistcolumnsr   r5   r5   r6   _columns_for_constraintH  s
    


r   r%   )r   r   r2   c                 C  s    t r| |d S | |d S d S r3   )rq   Zreflect_tableZreflecttable)r   r   r5   r5   r6   _reflect_tableQ  s     r   c                 C  s*   t | r"t| \}}||j|S | S d S r3   )_type_has_variants_get_variant_mappinggetrd   )type_r   Z	base_typemappingr5   r5   r6   _resolve_for_variantZ  s    r   _variant_mappingc                 C  s
   t | jS r3   )rK   r   r   r5   r5   r6   r   d  s    r   c                 C  s
   | | j fS r3   )r   r   r5   r5   r6   r   g  s    r   c                 C  s   t | tjkS r3   )typesqltypesZVariantr   r5   r5   r6   r   l  s    c                 C  s   | j | jfS r3   )implr   r   r5   r5   r6   r   o  s    c              
     s    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 r5   )r   rd   rW   r   r5   r6   r:   t  s    z_fk_spec.<locals>.<listcomp>r   c                 S  s   g | ]}|j jqS r5   )columnrd   )r8   elementr5   r5   r6   r:   |  s     )Zcolumn_keysr   rd   r   r   r   r   ondeleteonupdate
deferrable	initially)r   Zsource_columnsZsource_tableZsource_schemaZtarget_schematarget_tableZtarget_columnsr   r   r   r   r5   r   r6   _fk_specs  s.    
r   r   c                 C  sF   | j d  }|d}|d d|}| jd k	s:t|| jjkS )Nr   .)r   Z_get_colspecsplitpopjoinr   r]   rX   )r   spectokensZtablekeyr5   r5   r6   _fk_is_self_referential  s    


r   c                 C  s   | j S r3   )Z_type_boundr   r5   r5   r6   _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)Zclausecolsr5   r5   r6   r     s    r   r&   z%Union[Column[Any], ColumnClause[Any]])
collectionr   r2   c                 C  sH   |j dk	st| |j  }t| ds,t| dr:| j| n
| | dS )z(remove a column from a ColumnCollection.NZ
_immutableZ	_readonly)rX   r]   r   _parentremove)r   r   Z	to_remover5   r5   r6   _remove_column_from_collection  s
    
r   z*Union[str, TextClause, ColumnElement[Any]]z&Union[ColumnElement[Any], Column[Any]])r   text_r2   c                 C  sp   t |tr$t|tj}| | |S t |tr8t| |S t |trNt| |j	S t |t
jrdt|| S tddS )zAa workaround for the Index construct's severe lack of flexibilityz#String or text() construct expectedN)r\   r0   r   r   NULLTYPEappend_columnr   _textual_index_element_textual_index_columntextr   r)   _copy_expression
ValueError)r   r   cr5   r5   r6   r     s    





r   )
expressionr   r2   c                   s    fdd}t | i |S )Nc                   sV   t | trN| jd k	rN| j k	rN| j jkr6 j| j S t| } | |S nd S d S r3   )r\   r   r   rd   r   r   r   )colr   r   r5   r6   replace  s    
z!_copy_expression.<locals>.replace)r   Zreplacement_traverse)r   r   r   r5   r   r6   r     s      r   c                   @  s.   e Zd ZdZdZddd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.

    Z_textual_idx_elementr!   r   rv   )r   r   r2   c                 C  s8   || _ || _|j| _t| jjtj| _|| j d S r3   )	r   r   rX   r   r   r   r   fake_columnr   )selfr   r   r5   r5   r6   __init__  s
    z_textual_index_element.__init__c                 C  s   | j gS r3   )r   )r   r5   r5   r6   get_children  s    z#_textual_index_element.get_childrenN)rC   rD   rE   rF   Z__visit_name__r   r   r5   r5   r5   r6   r     s   r   r'   )r   compilerr2   c                 K  s   |j | jf|S r3   )processr   r   r   r   r5   r5   r6   _render_textual_index_column  s    r   c                   @  s   e Zd ZdS )_literal_bindparamNrH   r5   r5   r5   r6   r     s   r   c                 K  s   |j | f|S r3   )Zrender_literal_bindparamr   r5   r5   r6   _render_literal_bindparam  s    r   c                 C  s
   t | jS r3   )r   r}   r~   r5   r5   r6   _get_index_expressions  s    r   c                 C  s   dd t | D S )Nc                 S  s   g | ]}t |d dqS )rd   NrU   )r8   expr5   r5   r6   r:     s     z+_get_index_column_names.<locals>.<listcomp>)r   r~   r5   r5   r6   _get_index_column_names  s    r   r   r   )r   r2   c                 C  s   t r
| jS i S d S r3   )sqla_13kwargs)r   r5   r5   r6   _column_kwargs  s    r   zUnion[Index, Constraint]zOptional[Dialect])r   r   r2   c                 C  s   | j d krd S |d k	sttr.|jj| ddS t| j drFt| j }nt}|t| j dd}| j	|d} t
| tjr||d }|| S |j| S d S )NFZ_alembic_quotequote)r   re   )rd   r]   rq   identifier_preparerformat_constraintr   r   r   r0   	__class__r\   r   r    Zddl_compilerZ_prepared_index_name)r   r   Zquoted_name_clsnew_namedr5   r5   r6   _get_constraint_final_name  s&    
 r   zUnion[Constraint, Index]c                 C  sD   t r6| jd krdS |d k	st|jj| dd}|d k	S | jd k	S d S )NFr   )rq   rd   r]   r   r   )r   r   rd   r5   r5   r6   _constraint_is_namedE  s    
 r   r#   )mysql_dialectr2   c                 C  s   t r
| jS t| jo| jS d S r3   )rq   Z
is_mariadbrK   Zserver_version_info_is_mariadbr   r5   r5   r6   r   T  s    r   c                 C  s   | j S r3   ) _mariadb_normalized_version_infor   r5   r5   r6   r   ^  s    r   zUnion[TableClause, Table]r(   )r   r2   c                 C  s    t r|   S | jddS d S )NT)inline)rq   insertr   )r   r5   r5   r6   _insert_inlineb  s    r   )create_mock_engine)selectcreate_enginec                 K  s   t dd|dS )Nzpostgresql://Zmock)Zstrategyexecutorr   )r   r   r   r5   r5   r6   r   o  s
      r   r,   c                  O  s   t jt| f|S r3   )r   r   r   )r   r   r5   r5   r6   _selectt  s    r   )indexr2   c                 C  s8   | j D ],}t|tr|j}q
t|tr,|jr dS qdS )NTF)r}   r\   r   r   r   Z
is_literal)r  exprr5   r5   r6   is_expression_indexx  s    

r  )F)T)
__future__r   
contextlibretypingr   r   r   r   r   r   r	   r
   r   Z
sqlalchemyr   r   r   r   r   r   Zsqlalchemy.enginer   Zsqlalchemy.ext.compilerr   Zsqlalchemy.schemar   r   r   r   r   Zsqlalchemy.sql.baser   Zsqlalchemy.sql.elementsr   r   r   r   r   Zsqlalchemy.sql.visitorsr   Ztyping_extensionsr   r    r!   r"   r#   r$   Zsqlalchemy.engine.reflectionr%   r&   Zsqlalchemy.sql.compilerr'   Zsqlalchemy.sql.dmlr(   r)   Zsqlalchemy.sql.schemar*   r+   Zsqlalchemy.sql.selectabler,   r-   r.   r7   tuplefindallZ_versr   rq   Z
sqla_14_18Z
sqla_14_26Zsqla_2Zsqlalchemy_versionZsqlalchemy.sql.namingrA   ImportErrorrB   rG   r   Zhas_computed_reflectionrJ   Zhas_identity
issubclassr[   r`   ra   Zsqlalchemy.utilrb   r0   rc   Z_ConstraintNameDefinedrf   rg   rh   ZAUTOINCREMENT_DEFAULTcontextmanagerro   rr   ru   rx   rz   r{   r   r   rs   r   r   r   r   r   r   r   r   r   r   r   Z
TypeEnginer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r5   r5   r5   r6   <module>   s  


 '



			
	'
