U
    x^++                     @   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 e Zdd ZG dd deZG dd deZG dd deZG dd deZeedd  G dd deZdd ZG dd deZdd  Zd!d" ZdS )#zRoutines to handle the string class registry used by declarative.

This system allows specification of classes and expressions used in
:func:`.relationship` using strings.

    N   )exc)
inspection)util)class_mapper)
interfaces)ColumnProperty)RelationshipProperty)SynonymProperty)_get_table_keyc                 C   s   | |j kr6|j |  }t|ts@t||g }|j | < n
||j | < z|j d }W n( tk
rv   tdd |j d< }Y nX |jd}|r|d}||}|D ]}||}q|	| | qdS )z^Add a class to the _decl_class_registry associated with the
    given declarative class.

    _sa_module_registryN.r   )
_decl_class_registry
isinstance_MultipleClassMarkerKeyError_ModuleMarker
__module__splitpop
get_module	add_class)	classnameclsexistingZroot_moduletokenstokenmodule r   N/tmp/pip-install-dq5v43_d/SQLAlchemy/sqlalchemy/ext/declarative/clsregistry.pyr   !   s0    







r   c                   @   s>   e Zd ZdZdZdddZdd Zdd	 Zd
d Zdd Z	dS )r   zRrefers to multiple classes of the same name
    within _decl_class_registry.

    )	on_removecontents__weakref__Nc                    s,   | _ t fdd|D  _t  d S )Nc                    s   g | ]}t | jqS r   )weakrefref_remove_item).0itemselfr   r   
<listcomp>T   s     z1_MultipleClassMarker.__init__.<locals>.<listcomp>)r    setr!   _registriesadd)r)   classesr    r   r(   r   __init__Q   s
    z_MultipleClassMarker.__init__c                 C   s   dd | j D S )Nc                 s   s   | ]}| V  qd S Nr   r&   r$   r   r   r   	<genexpr>Y   s     z0_MultipleClassMarker.__iter__.<locals>.<genexpr>r!   r(   r   r   r   __iter__X   s    z_MultipleClassMarker.__iter__c                 C   sV   t | jdkr*tdd||g  n(t| jd }| }|d krNt||S d S )N   zxMultiple classes found for path "%s" in the registry of this declarative base. Please use a fully module-qualified path.r   r   )lenr!   r   InvalidRequestErrorjoinlist	NameError)r)   pathkeyr$   r   r   r   r   attempt_get[   s    z _MultipleClassMarker.attempt_getc                 C   s.   | j | | j s*t|  | jr*|   d S r0   )r!   remover,   discardr    )r)   r$   r   r   r   r%   j   s
    
z!_MultipleClassMarker._remove_itemc                 C   sX   t dd dd | jD D }|j|kr>td|j|jf  | jt|| j	 d S )Nc                 S   s   g | ]}|d k	r|j qS r0   )r   )r&   r   r   r   r   r*   v   s   z1_MultipleClassMarker.add_item.<locals>.<listcomp>c                 S   s   g | ]
}| qS r   r   r1   r   r   r   r*   x   s     zThis declarative base already contains a class with the same class name and module name as %s.%s, and will be replaced in the string-lookup table.)
r+   r!   r   r   warn__name__r-   r#   r$   r%   )r)   r'   modulesr   r   r   add_itemq   s    

z_MultipleClassMarker.add_item)N)
rA   r   __qualname____doc__	__slots__r/   r4   r=   r%   rC   r   r   r   r   r   I   s   
r   c                   @   sL   e Zd Zd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S )r   z?"refers to a module name within
    _decl_class_registry.

    )parentnamer!   mod_nsr;   r"   c                 C   sJ   || _ || _i | _t| | _| j r6| j j| jg | _ng | _t|  d S r0   )rG   rH   r!   _ModNSrI   r;   r,   r-   )r)   rH   rG   r   r   r   r/      s    
z_ModuleMarker.__init__c                 C   s
   || j kS r0   r3   r)   rH   r   r   r   __contains__   s    z_ModuleMarker.__contains__c                 C   s
   | j | S r0   r3   rK   r   r   r   __getitem__   s    z_ModuleMarker.__getitem__c                 C   s:   | j |d  | j s6| jd k	r6| j| j t|  d S r0   )r!   r   rG   r%   rH   r,   r?   rK   r   r   r   r%      s    z_ModuleMarker._remove_itemc                 C   s   t | j|S r0   )getattrrI   r)   r<   r   r   r   resolve_attr   s    z_ModuleMarker.resolve_attrc                 C   s.   || j kr t|| }|| j |< n
| j | }|S r0   )r!   r   )r)   rH   markerr   r   r   r      s
    


z_ModuleMarker.get_modulec                    sF    j kr j   }|| n"t|g fddd }j  < d S )Nc                      s
     S r0   )r%   r   rH   r)   r   r   <lambda>       z)_ModuleMarker.add_class.<locals>.<lambda>)r    )r!   rC   r   )r)   rH   r   r   r   rR   r   r      s    

 z_ModuleMarker.add_classN)rA   r   rD   rE   rF   r/   rL   rM   r%   rP   r   r   r   r   r   r   r      s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )rJ   )Z__parentc                 C   s
   || _ d S r0   )_ModNS__parent)r)   rG   r   r   r   r/      s    z_ModNS.__init__c                 C   st   z| j j| }W n tk
r$   Y n8X |d k	r\t|tr>|jS t|tsLt|| j j	|S t
d| j j|f d S )Nz<Module %r has no mapped classes registered under the name %r)rU   r!   r   r   r   rI   r   AssertionErrorr=   r;   AttributeErrorrH   )r)   r<   valuer   r   r   __getattr__   s    

z_ModNS.__getattr__NrA   r   rD   rF   r/   rY   r   r   r   r   rJ      s   rJ   c                   @   s    e Zd ZdZdd Zdd ZdS )_GetColumnsr   c                 C   s
   || _ d S r0   r\   )r)   r   r   r   r   r/      s    z_GetColumns.__init__c                 C   s   t | jdd}|rv||jkr0td| j|f |j| }|jtjkrv|j}t	|t
r^|j}nt	|tsvtd| t| j|S )NF)	configurez/Class %r does not have a mapped column named %rzaProperty %r is not an instance of ColumnProperty (i.e. does not correspond directly to a Column).)r   r   Zall_orm_descriptorsr   r7   Zextension_typer   ZNOT_EXTENSIONpropertyr   r
   rH   r   rN   )r)   r<   mpdescpropr   r   r   rY      s(    



z_GetColumns.__getattr__NrZ   r   r   r   r   r[      s   r[   c                 C   s   t | jS r0   )r   inspectr   )targetr   r   r   rS      rT   rS   c                   @   s    e Zd ZdZdd Zdd ZdS )	_GetTabler<   metadatac                 C   s   || _ || _d S r0   re   )r)   r<   rf   r   r   r   r/      s    z_GetTable.__init__c                 C   s   | j jt|| j S r0   )rf   tablesr   r<   rO   r   r   r   rY      s    z_GetTable.__getattr__NrZ   r   r   r   r   rd      s   rd   c                 C   s   t |tr|g | }t|S r0   )r   r   r=   r[   )r<   rX   r   r   r   _determine_container   s    
rh   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )_class_resolverc                 C   s6   || _ || _| | _| _|| _t| j| _d| _	d S )Nr   )
r   ra   argZ_declarative_argfallbackr   ZPopulateDict_access_cls_dict
_resolvers)r)   r   ra   rk   rj   r   r   r   r/     s    z_class_resolver.__init__c                 C   s   | j }||jkr t||j| S ||jjkr8|jj| S ||jjkrPt||jS d|jkr|||jd kr||jd }||S | jr| jD ]}||}|d k	r|  S q| j	| S )Nr   )
r   r   rh   rf   rg   Z_schemasrd   rP   rn   rk   )r)   r<   r   registryZresolvrX   r   r   r   rl     s&    




z_class_resolver._access_clsc              
   C   sz   z.t | jt | j}t|tr&|jW S |W S W nF tk
rt } z(t	d| j
j| j|jd | jf W 5 d }~X Y nX d S )NzWhen initializing mapper %s, expression %r failed to locate a name (%r). If this is a class name, consider adding this relationship() to the %r class after both dependent classes have been defined.r   )evalrj   globalsrm   r   r[   r   r:   r   r7   ra   rG   args)r)   xnr   r   r   __call__$  s    

z_class_resolver.__call__N)rA   r   rD   r/   rl   ru   r   r   r   r   ri     s   ri   c                    sF   dd l }ddlm}m} |j ||d  fdd}|S )Nr   )foreignremotec                    s   t  | S r0   )ri   )rj   r   rk   ra   r   r   resolve_arg=  s    z_resolver.<locals>.resolve_arg)
sqlalchemyZsqlalchemy.ormrv   rw   __dict__copyupdate)r   ra   rz   rv   rw   ry   r   rx   r   	_resolver6  s    
r~   c                 C   s   t |trt| |}dD ]*}t||}t |tjrt|||| q|jrt |jtr|j\}}dD ],}||krdt || tjrd||| ||< qd|S )N)argumentorder_byprimaryjoinsecondaryjoin	secondaryZ_user_defined_foreign_keysremote_side)r   r   r   Zforeign_keysr   r   )	r   r	   r~   rN   r   string_typessetattrZbackreftuple)r   ra   ry   attrvr<   kwargsr   r   r   _deferred_relationshipC  s    

	


 r   )rE   r#    r   r   r   Zormr   r   Zorm.propertiesr   r	   r
   Zschemar   r+   r,   r   objectr   r   rJ   r[   Z	_inspectsrd   rh   ri   r~   r   r   r   r   r   <module>   s0   (=41