U
    [h                  
   @   s  d 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 G dd deZededededediZdd Zdd Zeeddd Zee
d eed d!d" ZdS )#z5Establish constraint and index naming conventions.


    N   )events)
_NONE_NAME)conv)CheckConstraint)Column)
Constraint)ForeignKeyConstraint)Index)PrimaryKeyConstraint)Table)UniqueConstraint   )event)excc                   @   s\   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd ZdS )ConventionDictc                 C   s*   || _ t|t| _|| _|| _|j| _d S N)const
isinstancer	   _is_fktable
conventionname_const_name)selfr   r   r    r   9/tmp/pip-unpacked-wheel-joqu7d3y/sqlalchemy/sql/naming.py__init__   s
    zConventionDict.__init__c                 C   s   | j jS r   )r   r   r   r   r   r   _key_table_name&   s    zConventionDict._key_table_namec                 C   sz   | j r<z| jj| }W n tk
r,   Y dS X t|j|S n:t| jj}z|| }W n tk
rj   Y dS X t||S d S )N )r   r   elements
IndexErrorgetattrparentlistcolumns)r   idxattrnamefkcolscolr   r   r   	_column_X)   s    zConventionDict._column_Xc                 C   s2   | j d tfkrtdt| j ts,d | j_| j S )NzcNaming convention including %(constraint_name)s token requires that constraint is explicitly named.)r   r   r   ZInvalidRequestErrorr   r   r   r   r   r   r   r   _key_constraint_name:   s    z#ConventionDict._key_constraint_namec                 C   s   |  |dS )Nkeyr,   r   r'   r   r   r   _key_column_X_keyE   s    z ConventionDict._key_column_X_keyc                 C   s   |  |dS )Nr   r/   r0   r   r   r   _key_column_X_nameK   s    z!ConventionDict._key_column_X_namec                 C   s   |  |dS )NZ
_ddl_labelr/   r0   r   r   r   _key_column_X_labelN   s    z"ConventionDict._key_column_X_labelc                 C   s<   | j jd }|jd}t|dkr0|\}}}n|\}}|S )Nr   .   )r   r!   Ztarget_fullnamesplitlen)r   r)   refsZ	refschemaZreftableZrefcolr   r   r   _key_referred_table_nameQ   s    z'ConventionDict._key_referred_table_namec                 C   s   | j j| }|jjS r   )r   r!   columnr   )r   r'   r)   r   r   r   _key_referred_column_X_nameZ   s    z*ConventionDict._key_referred_column_X_namec           
   	   C   s>  || j kr| j | | j| jS t| d| r<t| d|  S td|}|r2|d}|d}|r | jrx| jj	}nt
| jj}g }t|D ]R\}}d|d| d }z|t| || W q tk
r   t|Y qX q|drdnd	}	|	|S d||d }t|}t| |r2t| ||S t|d S )
Nz_key_%sz.*_?column_(\d+)(_?N)?_.+r   r   Z_key_0X_r    )r   r   r   hasattrr#   rematchgroupr   r!   r%   r&   	enumeratereplaceappendAttributeErrorKeyError
startswithjoinint)
r   r.   Zcol_templater'   Z	multipleselemstokenselemattrsepr   r   r   __getitem__a   s4    




zConventionDict.__getitem__N)__name__
__module____qualname__r   r   r,   r-   r1   r2   r3   r9   r;   rP   r   r   r   r   r      s   	r   ixpkZckZuqr)   c                 C   sH   |j D ]<}|tkr.t| | kr.| t|    S || kr| |   S qd S r   )__mro___prefix_dict)Zdict_r.   Zsuper_r   r   r   _get_convention   s    
rX   c                 C   s~   |j }t|jt| }t| jtr(| jS |d k	rnt| jtsn| jd ksXd|ksX| jtkrnt|t| ||j S |tkrzd S d S )NZconstraint_name)	metadatarX   Znaming_conventiontyper   r   r   r   r   )r   r   rY   r   r   r   r   _constraint_name_for_table   s*    
	r[   Z'_sa_event_column_added_to_pk_constraintc                 C   s*   | j r&| j}d | _t| |}|r&|| _d S r   )Z_implicit_generatedr   r   r[   )Zpk_constraintr+   r   newnamer   r   r   _column_added_to_pk_constraint   s    
r]   after_parent_attachc                    s^   t |tr"t|d fdd n8t |trZt  jtsB jtkrFd S t |}|rZ| _d S )Nr^   c                    s
   t  |S r   )_constraint_name)r+   r   r   r   r   <lambda>       z"_constraint_name.<locals>.<lambda>)	r   r   r   listenr   r   r   r   r[   )r   r   r\   r   r`   r   r_      s    



r_   )__doc__r@   r    r   r!   r   r   Zschemar   r   r   r	   r
   r   r   r   r   r   objectr   rW   rX   r[   Zlistens_forr]   r_   r   r   r   r   <module>   sH   e     	 


