o
    8 hv                     @  s  U 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&l*m+Z+ d d'l,m-Z- d d(l,m.Z. d d)l/m0Z0 d d*l1m2Z2 d d+l1m3Z3 d d,l1m4Z4 d d-l1m5Z5 d d.l6m7Z7 d d/l8m9Z9 dd0lm:Z: dd1l;m<Z< dd2l=m>Z> dd3l=m?Z? e@eAZBG d4d5 d5eCZDi ZEd6eFd7< G d8d9 d9eDd:ZGG d;d< d<eZHdFdDdEZIdS )G    )annotationsN)Any)Callable)Dict)Iterable)List)Mapping)
NamedTuple)Optional)Sequence)Set)Tuple)Type)TYPE_CHECKING)Union)cast)Column)MetaData)PrimaryKeyConstraintschema)String)Table)text   )_autogen)base)_constraint_sig)ComparisonResult   )util)sqla_compat)Literal)TextIO)
Connection)Dialect)CursorResult)	Inspector)ClauseElement)
Executable)quoted_name)
Constraint)ForeignKeyConstraint)Index)UniqueConstraint)TableClause)
TypeEngine)_ServerDefault)AutogenContext)ApplyBatchImpl)BatchOperationsImplc                   @  s   e Zd Zd
ddZd	S )ImplMeta	classnamestrbasesTuple[Type[DefaultImpl]]dict_Dict[str, Any]c                 C  s(   t | |||}d|v r| t|d < |S )N__dialect__)type__init___impls)clsr6   r8   r:   Znewtype rA   X/var/www/html/figdemos/bartoux_crm/venv/lib/python3.10/site-packages/alembic/ddl/impl.pyr>   B   s   zImplMeta.__init__N)r6   r7   r8   r9   r:   r;   )__name__
__module____qualname__r>   rA   rA   rA   rB   r5   A   s    r5   zDict[str, Type[DefaultImpl]]r?   c                   @  sp  e Zd ZU dZdZdZdZddhfZded< d	Z	d
ed< dZ
ded< dddZedd d!Zdd$d%Zdd-d.Zdd1d2Zdd6d7Zedd8d9Zd:d:e fddDdEZ	:dddHdIZd:dd:d:d:d:dd:d:d:d:d:dJdd]d^Zd:d:d_ddddeZd:d:dfddhdiZddkdlZddndoZ	:dddsdtZddudvZddwdxZdd{d|Z dd}d~Z!dddZ"dddZ#dddZ$	ddddZ%dddZ&dddZ'dddZ(dddZ)dd Z*dddZ+dd Z,	ddddZ-dddZ.d ddZ/dd Z0dddZ1dddZ2dddZ3dddńZ4ddǄ Z5ddd˄Z6dddфZ7dddӄZ8dddքZ9dddۄZ:dd݄ Z;dddZ<d:S (  DefaultImpla  Provide the entrypoint for major migration operations,
    including database-specific behavioral variances.

    While individual SQL/DDL constructs already provide
    for database-specific implementations, variances here
    allow for entirely different sequences of operations
    to take place for a particular migration, such as
    SQL Server's special 'IDENTITY INSERT' step for
    bulk inserts.

    defaultF;NUMERICDECIMALzTuple[Set[str], ...]type_synonymsrA   zSequence[str]type_arg_extract)orderon_nullzTuple[str, ...]identity_attrs_ignoredialectr%   
connectionOptional[Connection]as_sqlbooltransactional_ddlOptional[bool]output_bufferOptional[TextIO]context_optsr;   returnNonec                 C  s^   || _ || _|| _|dd| _|| _i | _|| _|d ur || _| jr+| js-t	
dd S d S )Nliteral_bindsFz3Can't use literal_binds setting without as_sql mode)rP   rQ   rS   getr\   rW   memorY   rU   r    CommandError)selfrP   rQ   rS   rU   rW   rY   rA   rA   rB   r>   j   s    	zDefaultImpl.__init__Type[DefaultImpl]c                 C  s
   t |j S N)r?   name)r@   rP   rA   rA   rB   get_by_dialect   s   
zDefaultImpl.get_by_dialectr   r7   c                 C  s,   | j d usJ | j |d  | j   d S )Nz

)rW   writeflush)r`   r   rA   rA   rB   static_output   s   zDefaultImpl.static_outputversion_tableversion_table_schemaOptional[str]version_table_pkkwr   r   c                K  s@   t |t tdtddd|d}|r|td| dd |S )a  Generate a :class:`.Table` object which will be used as the
        structure for the Alembic version table.

        Third party dialects may override this hook to provide an alternate
        structure for this :class:`.Table`; requirements are only that it
        be named based on the ``version_table`` parameter and contains
        at least a single string-holding column named ``version_num``.

        .. versionadded:: 1.14

        version_num    F)nullabler   _pkcrc   )r   r   r   r   append_constraintr   )r`   rh   ri   rk   rl   ZvtrA   rA   rB   version_table_impl   s   
zDefaultImpl.version_table_implbatch_opr4   c                 C     dS )zReturn True if the given :class:`.BatchOperationsImpl`
        would need the table to be recreated and copied in order to
        proceed.

        Normally, only returns True on SQLite when operations other
        than add_column are present.

        FrA   )r`   rt   rA   rA   rB   requires_recreate_in_batch   s   z&DefaultImpl.requires_recreate_in_batch
batch_implr3   tablec                 C  ru   )zperform any operations needed on a table before a new
        one is created to replace it in batch mode.

        the PG dialect uses this to drop constraints on the table
        before the new one uses those same names.

        NrA   )r`   rw   rx   rA   rA   rB   prep_table_for_batch       z DefaultImpl.prep_table_for_batchc                 C     | j S rb   )rQ   r`   rA   rA   rB   bind   s   zDefaultImpl.bindN	constructUnion[Executable, str]execution_optionsOptional[Mapping[str, Any]]multiparams%Optional[Sequence[Mapping[str, Any]]]paramsMapping[str, Any]Optional[CursorResult]c                 C  s   t |tr	t|}| jrO|d us|rtd| jr't |tjs'tddid}ni }t	r2t |t
s2J |jd	d| ji|}| t|dd | j  d S | j}|d usXJ |rb|jd	i |}|rl|d urltd|rt|||S |||S )
Nz&SQL parameters not allowed with as_sqlr\   T)compile_kwargsrP   	z    z2Can't send params and multiparams at the same timerA   )
isinstancer7   r   rS   	TypeErrorr\   r   
DDLElementdictr   r(   compilerP   rg   replacestripcommand_terminatorrQ   r   execute)r`   r~   r   r   r   
compile_kwcompiledconnrA   rA   rB   _exec   s<   
zDefaultImpl._execsqlOptional[dict[str, Any]]c                 C  s   |  || d S rb   )r   )r`   r   r   rA   rA   rB   r      s   zDefaultImpl.execute)ro   server_defaultrc   type_r   autoincrementcommentexisting_commentexisting_typeexisting_server_defaultexisting_nullableexisting_autoincrement
table_namecolumn_namero   r   /Optional[Union[_ServerDefault, Literal[False]]]rc   r   Optional[TypeEngine]r   r   r   $Optional[Union[str, Literal[False]]]r   r   r   Optional[_ServerDefault]r   r   c                K  s,  |d us|d urt jddd |d ur#| tj||||||||
d |durWi }t||r3tj}nt||rAtj	}| |d< ntj
}| ||||f|||||
d| |d urk| tj||||||||
d |	dur| tj|||	|||||
d |d ur| tj|||||||d d S d S )NzBautoincrement and existing_autoincrement only make sense for MySQL   )
stacklevel)r   r   r   r   r   Fimpl)r   r   r   r   )r    warnr   r   ColumnNullabler!   _server_default_is_computedComputedColumnDefault_server_default_is_identityIdentityColumnDefaultColumnDefault
ColumnTypeColumnComment
ColumnName)r`   r   r   ro   r   rc   r   r   r   r   r   r   r   r   r   rl   cls_rA   rA   rB   alter_column   s   
	zDefaultImpl.alter_columnr   if_not_existscolumnColumn[Any]!Optional[Union[str, quoted_name]]r   c                C     |  tj||||d d S )Nr   )r   r   	AddColumn)r`   r   r   r   r   rA   rA   rB   
add_columnr  s   zDefaultImpl.add_columnr   	if_existsr   c                K  r   )Nr   )r   r   
DropColumn)r`   r   r   r   r   rl   rA   rA   rB   drop_column  s
   	zDefaultImpl.drop_columnconstc                 C  s,   |j d u s
| | r| t| d S d S rb   )_create_ruler   r   AddConstraint)r`   r   rA   rA   rB   add_constraint  s   zDefaultImpl.add_constraintr+   c                 K     |  tj|fi | d S rb   )r   r   DropConstraint)r`   r   rl   rA   rA   rB   drop_constraint     zDefaultImpl.drop_constraintold_table_namenew_table_nameUnion[str, quoted_name]c                 C  s   |  tj|||d d S )Nr   )r   r   RenameTable)r`   r   r   r   rA   rA   rB   rename_table  s   zDefaultImpl.rename_tablec                 K  s   |j j|| jd| d | tj|fi | |j j|| jd| d |jD ]
}| t| q%| j	j
o8| j	j }|j}|rE|rE| | |jD ]}|j}|rV|rV| | qHd S NF)
checkfirst_ddl_runner)dispatchbefore_createrQ   r   r   CreateTableafter_createindexesCreateIndexrP   supports_commentsinline_commentsr   create_table_commentcolumnscreate_column_comment)r`   rx   rl   indexZwith_commentr   r   rA   rA   rB   create_table  s(   





zDefaultImpl.create_tablec                 K  sH   |j j|| jd| d | tj|fi | |j j|| jd| d d S r   )r   before_droprQ   r   r   	DropTable
after_drop)r`   rx   rl   rA   rA   rB   
drop_table  s   


zDefaultImpl.drop_tabler   r-   c                 K  r   rb   )r   r   r   r`   r   rl   rA   rA   rB   create_index  r   zDefaultImpl.create_indexc                 C     |  t| d S rb   )r   r   SetTableCommentr`   rx   rA   rA   rB   r        z DefaultImpl.create_table_commentc                 C  r   rb   )r   r   DropTableCommentr   rA   rA   rB   drop_table_comment  r   zDefaultImpl.drop_table_commentc                 C  r   rb   )r   r   SetColumnComment)r`   r   rA   rA   rB   r     r   z!DefaultImpl.create_column_commentc                 K  r   rb   )r   r   	DropIndexr   rA   rA   rB   
drop_index  r   zDefaultImpl.drop_indexTUnion[TableClause, Table]rows
List[dict]multiinsertc              	     s   t |ts	td|rt |d tstd| jr8|D ]}|    jdi  fdd|	 D  qd S |r]|rI| j   |d d S |D ]}|    jdi | qKd S d S )NzList expectedr   zList of dictionaries expectedc                   s:   i | ]\}}|t |tjstj|| j| jd n|qS ))r   )r   r!   _literal_bindparamcr=   ).0kvrx   rA   rB   
<dictcomp>  s    
z+DefaultImpl.bulk_insert.<locals>.<dictcomp>)r   rA   )
r   listr   r   rS   r   insertinlinevaluesitems)r`   rx   r   r   rowrA   r   rB   bulk_insert  s0   


 zDefaultImpl.bulk_insertr   Paramsc                 C  s   | j j|j }td|}g }d }|D ]}td|r!|}q|| qt	|d |dd  g i }|r\td|D ]}d|v rS|
d\}	}
|
 |j|	 < q<|j|  q<|S )Nz[\w\-_]+|\(.+?\)z^\(.*\)$r   r   z[^(),]+=)rP   type_compilerprocessr=   lowerrefindallmatchappendr   splitr   kwargsargs)r`   r   Z
definitiontokensZterm_tokensZ
paren_termtokenr   ZtermkeyvalrA   rA   rB   _tokenize_column_type  s    z!DefaultImpl._tokenize_column_typeinspector_paramsmetadata_paramsc                 C  s|   |j |j krdS dd | jD }d|j g|j }d|j g|j }|D ]}||h|s8|j |j h|r; dS q&dS )NTc                 S  s   g | ]	}d d |D qS )c                 S  s   h | ]}|  qS rA   )r  )r   trA   rA   rB   	<setcomp>&      z=DefaultImpl._column_types_match.<locals>.<listcomp>.<setcomp>rA   )r   batchrA   rA   rB   
<listcomp>&  s    z3DefaultImpl._column_types_match.<locals>.<listcomp> F)token0rK   joinr  issubset)r`   r  r  synonymsZinspector_all_termsZmetadata_all_termsr  rA   rA   rB   _column_types_match   s&   zDefaultImpl._column_types_matchinspected_paramsmeta_paramsc                 C  s   t |jt |jkr|j|jkrdS t |jt |jkr$|j|jkr$dS d|j }d|j }| jD ]}t||}t||}|rV|rV|d|dkrV dS q7dS )a  We want to compare column parameters. However, we only want
        to compare parameters that are set. If they both have `collation`,
        we want to make sure they are the same. However, if only one
        specifies it, dont flag it for being less specific
        Fr  r   T)	lenr  r  r  r  rL   r  searchgroup)r`   r  r  inspmetaregmimmrA   rA   rB   _column_args_match6  s   

zDefaultImpl._column_args_matchinspector_columnmetadata_columnc                 C  s8   |  |}|  |}| ||sdS | ||sdS dS )zReturns True if there ARE differences between the types of the two
        columns. Takes impl.type_synonyms into account between retrospected
        and metadata types
        TF)r  r  r(  )r`   r)  r*  r  r  rA   rA   rB   compare_typeW  s   

zDefaultImpl.compare_typec                 C  s   ||kS rb   rA   )r`   r)  r*  rendered_metadata_defaultrendered_inspector_defaultrA   rA   rB   compare_server_defaultg  s   z"DefaultImpl.compare_server_defaultconn_uniquesSet[UniqueConstraint]conn_indexes
Set[Index]metadata_unique_constraintsmetadata_indexesc                 C     d S rb   rA   )r`   r/  r1  r3  r4  rA   rA   rB   correct_for_autogen_constraintsp  s   z+DefaultImpl.correct_for_autogen_constraintsc                 C  s(   |j j|jurt|d ||d< d S d S )Nexpr)r=   _type_affinityr   )r`   existingZexisting_transfernew_typerA   rA   rB   cast_for_batch_migratey  s
   z"DefaultImpl.cast_for_batch_migrater7  r(   is_server_defaultc                 K  s   ddd}t |j| j|dS )zdRender a SQL expression that is typically a server default,
        index expression, etc.

        TF)r\   include_table)rP   r   )r7   r   rP   )r`   r7  r<  rl   r   rA   rA   rB   render_ddl_sql_expr  s   
zDefaultImpl.render_ddl_sql_expr	inspectorr'   r   c                 C  r{   rb   )autogen_column_reflect)r`   r?  rA   rA   rB   _compat_autogen_column_reflect  s   z*DefaultImpl._compat_autogen_column_reflectconn_fksSet[ForeignKeyConstraint]metadata_fksc                 C  r5  rb   rA   )r`   rB  rD  rA   rA   rB   correct_for_autogen_foreignkeys  s   z+DefaultImpl.correct_for_autogen_foreignkeysc                 C  ru   )zA hook that is attached to the 'column_reflect' event for when
        a Table is reflected from the database during the autogenerate
        process.

        Dialects can elect to modify the information gathered here.

        NrA   )r`   r?  rx   column_inforA   rA   rB   r@    rz   z"DefaultImpl.autogen_column_reflectc                 C  ru   )zA hook called when :meth:`.EnvironmentContext.run_migrations`
        is called.

        Implementations can set up per-migration-run state here.

        NrA   r|   rA   rA   rB   start_migrations  rz   zDefaultImpl.start_migrationsc                 C     |  d| j  dS )zEmit the string ``BEGIN``, or the backend-specific
        equivalent, on the current connection context.

        This is used in offline mode and typically
        via :meth:`.EnvironmentContext.begin_transaction`.

        BEGINNrg   r   r|   rA   rA   rB   
emit_begin     zDefaultImpl.emit_beginc                 C  rH  )zEmit the string ``COMMIT``, or the backend-specific
        equivalent, on the current connection context.

        This is used in offline mode and typically
        via :meth:`.EnvironmentContext.begin_transaction`.

        COMMITNrJ  r|   rA   rA   rB   emit_commit  rL  zDefaultImpl.emit_committype_objr0   autogen_contextr2   Union[str, Literal[False]]c                 C  ru   NFrA   )r`   rO  rP  rA   rA   rB   render_type  s   zDefaultImpl.render_typec                 C  sv   t ||t dhd\}}t|dd }t|dd }t|t|kr&|d || j ||t|p9t|t|kfS )Nalways)skip)_compare_identity_optionsr   IdentitygetattrrT   adddifference_updaterO   )r`   metadata_identityinspector_identitydiffignoredZmeta_alwaysZinspector_alwaysrA   rA   rB   _compare_identity_default  s   

z%DefaultImpl._compare_identity_defaultmetadata_indexreflected_indexc                 C  s0   t |j}t |j}||krd| d| S d S )Nzunique=z to unique=)rT   unique)r`   r`  ra  Zconn_uniqueZmeta_uniquerA   rA   rB   _compare_index_unique  s
   

z!DefaultImpl._compare_index_unique
constraint_autogen._Copts_constraint_sig[_autogen._C]c                 K     t jd| |fi |S )NTr   Zfrom_constraintr`   rd  rf  rA   rA   rB   _create_metadata_constraint_sig     z+DefaultImpl._create_metadata_constraint_sigc                 K  rh  rR  ri  rj  rA   rA   rB    _create_reflected_constraint_sig  rl  z,DefaultImpl._create_reflected_constraint_sigr   c                 C  s   g }|  ||}|r|| | |}| |}t|s J t|s'J ||fD ]}|jr7td|j	 q+|j
|j
krK|d|j
 d|j
  |rRt|S t S )zCompare two indexes by comparing the signature generated by
        ``create_index_sig``.

        This method returns a ``ComparisonResult``.
        zGenerating approximate signature for index %s. The dialect implementation should either skip expression indexes or provide a custom implementation.expression  to )rc  r  rk  rm  r   Zis_index_sigZhas_expressionslogwarningr   column_namesr   	DifferentEqual)r`   r`  ra  msgZ
unique_msgZm_sigZr_sigsigrA   rA   rB   compare_indexes  s0   




zDefaultImpl.compare_indexesmetadata_constraintr.   reflected_constraintc                 C  sF   |  |}| |}|j}|j}||krtd| d| S t S )a  Compare two unique constraints by comparing the two signatures.

        The arguments are two tuples that contain the unique constraint and
        the signatures generated by ``create_unique_constraint_sig``.

        This method returns a ``ComparisonResult``.
        rn  ro  )rk  rm  Zunnamedr   rs  rt  )r`   rx  ry  Zmetadata_tupZreflected_tupZmeta_sigZconn_sigrA   rA   rB   compare_unique_constraint  s   z%DefaultImpl.compare_unique_constraintc              
   C  sh   dd |D }t |D ]&}|j|v rqt|}|r1td|jd| jdtj d || qd S )Nc                 S  s   i | ]}|j |qS rA   rq   )r   r   rA   rA   rB   r   9  r  z8DefaultImpl._skip_functional_indexes.<locals>.<dictcomp>z@autogenerate skipping metadata-specified expression-based index z
; dialect z under SQLAlchemy z6 can't reflect these indexes so they can't be compared)	r   rc   r!   is_expression_indexr    r   r<   sqlalchemy_versiondiscard)r`   r4  r1  Zconn_indexes_by_nameidxZiexrA   rA   rB   _skip_functional_indexes8  s$   


z$DefaultImpl._skip_functional_indexesreflected_objectkindc                 C  s   | di S )Ndialect_options)r]   )r`   r  r  rA   rA   rB    adjust_reflected_dialect_optionsI  s   z,DefaultImpl.adjust_reflected_dialect_options)rP   r%   rQ   rR   rS   rT   rU   rV   rW   rX   rY   r;   rZ   r[   )rP   r%   rZ   ra   )r   r7   rZ   r[   )
rh   r7   ri   rj   rk   rT   rl   r   rZ   r   )rt   r4   rZ   rT   )rw   r3   rx   r   rZ   r[   )rZ   rR   )
r~   r   r   r   r   r   r   r   rZ   r   rb   )r   r   r   r   rZ   r[   ) r   r7   r   r7   ro   rV   r   r   rc   rj   r   r   r   rj   r   rV   r   r   r   rj   r   r   r   r   r   rV   r   rV   rl   r   rZ   r[   )
r   r7   r   r   r   r   r   rV   rZ   r[   )
r   r7   r   r   r   rj   r   rV   rZ   r[   )r   r   rZ   r[   )r   r+   rl   r   rZ   r[   )r   r7   r   r   r   r   rZ   r[   )rx   r   rl   r   rZ   r[   )r   r-   rl   r   rZ   r[   )rx   r   rZ   r[   )r   r   rZ   r[   )T)rx   r   r   r   r   rT   rZ   r[   )r   r   rZ   r   )r  r   r  r   rZ   rT   )r  r   r  r   rZ   rT   )r)  r   r*  r   rZ   rT   )
r/  r0  r1  r2  r3  r0  r4  r2  rZ   r[   )F)r7  r(   r<  rT   rl   r   rZ   r7   )r?  r'   rZ   r   )rB  rC  rD  rC  rZ   r[   )rZ   r[   )rO  r0   rP  r2   rZ   rQ  )r`  r-   ra  r-   rZ   rj   )rd  re  rf  r   rZ   rg  )r`  r-   ra  r-   rZ   r   )rx  r.   ry  r.   rZ   r   )r  r;   r  r7   rZ   r;   )=rC   rD   rE   __doc__r<   rU   r   rK   __annotations__rL   rO   r>   classmethodrd   rg   rs   rv   ry   propertyr}   r    immutabledictr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r(  r+  r.  r6  r;  r>  rA  rE  r@  rG  rK  rN  rS  r_  rc  rk  rm  rw  rz  r  r  rA   rA   rA   rB   rF   Q   s   
 



"
0x





	




&
(

!
		
	


+rF   )	metaclassc                   @  s.   e Zd ZU ded< ded< ded< ded< dS )	r   r7   r  z	List[str]r  r  zDict[str, str]r
  N)rC   rD   rE   r  rA   rA   rA   rB   r   O  s
   
 r   metadata_io-Union[schema.Identity, schema.Sequence, None]inspector_io
default_io'Union[schema.Identity, schema.Sequence]rU  Set[str]c                   s   t | }t |}t  t d
 fdd}|||t |t|| t jrFt|d	s2J |t| d	i t|d	i |jt|d	i   fS )N	meta_dictr   	insp_dictdefault_dictattrsIterable[str]c                   s\   t |D ]$}| |}||}||kr+||}||kr&| q | qd S rb   )set
differencer]   rY  )r  r  r  r  attrZ
meta_valueZ
insp_valuedefault_valuer]  Zignored_attrrU  rA   rB   check_dictse  s   



z._compare_identity_options.<locals>.check_dictsdialect_kwargs)r  r   r  r   r  r   r  r  )r!   _get_identity_options_dictr  unionidentity_has_dialect_kwargshasattrrX  r  )r  r  r  rU  Zmeta_dZinsp_dr  rA   r  rB   rV  V  s(   
	



rV  )r  r  r  r  r  r  rU  r  )J
__future__r   loggingr  typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   
sqlalchemyr   r   r   r   r   r   r   r    r   r   r   r   r    r!   r"   r#   sqlalchemy.enginer$   r%   sqlalchemy.engine.cursorr&   Zsqlalchemy.engine.reflectionr'   sqlalchemy.sqlr(   r)   sqlalchemy.sql.elementsr*   sqlalchemy.sql.schemar+   r,   r-   r.   sqlalchemy.sql.selectabler/   sqlalchemy.sql.type_apir0   r1   autogenerate.apir2   Zoperations.batchr3   r4   	getLoggerrC   rp  r=   r5   r?   r  rF   r   rV  rA   rA   rA   rB   <module>   s~   
      