o
    y¬´\*+  ã                   @   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 )#z­Routines 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 v r|j |  }t|tƒst||gƒ }|j | < n||j | < z|j d }W n ty:   tddƒ |j d< }Y nw |j d¡}|ra| d¡}| |¡}|D ]}| |¡}qO| 	| |¡ |sCdS d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ÚexistingÚroot_moduleÚtokensÚtokenÚmodule© r   úX/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/ext/declarative/clsregistry.pyr       s4   



þÿ€
þÿý


û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>S   s    z1_MultipleClassMarker.__init__.<locals>.<listcomp>)r!   Úsetr"   Ú_registriesÚadd)r*   Úclassesr!   r   r)   r    Ú__init__P   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>X   s   € z0_MultipleClassMarker.__iter__.<locals>.<genexpr>©r"   r)   r   r   r    Ú__iter__W   s   z_MultipleClassMarker.__iter__c                 C   sP   t | jƒdkrt dd ||g ¡ ¡‚t| jƒd }|ƒ }|d u r&t|ƒ‚|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_getZ   s   ýÿz _MultipleClassMarker.attempt_getc                 C   s6   | j  |¡ | j st | ¡ | jr|  ¡  d S d S d S r1   )r"   Úremover-   Údiscardr!   )r*   r%   r   r   r    r&   i   s   
ýz!_MultipleClassMarker._remove_itemc                 C   sX   t dd„ dd„ | jD ƒD ƒƒ}|j|v rt d|j|jf ¡ | j t || j	¡¡ d S )Nc                 S   s   g | ]	}|d ur|j ‘qS r1   )r   )r'   r   r   r   r    r+   u   s
    þz1_MultipleClassMarker.add_item.<locals>.<listcomp>c                 S   s   g | ]}|ƒ ‘qS r   r   r2   r   r   r    r+   w   s    z’This 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_itemp   s   þÿ

ýÿz_MultipleClassMarker.add_itemr1   )
rB   r   Ú__qualname__Ú__doc__Ú	__slots__r0   r5   r>   r&   rD   r   r   r   r    r   H   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 r| j j| jg | _ng | _t | ¡ d S r1   )rH   rI   r"   Ú_ModNSrJ   r<   r-   r.   )r*   rI   rH   r   r   r    r0   �   s   
z_ModuleMarker.__init__c                 C   s
   || j v S r1   r4   ©r*   rI   r   r   r    Ú__contains__˜   ó   
z_ModuleMarker.__contains__c                 C   s
   | j | S r1   r4   rL   r   r   r    Ú__getitem__›   rN   z_ModuleMarker.__getitem__c                 C   sB   | j  |d ¡ | j s| jd ur| j | j¡ t | ¡ d S d S d S r1   )r"   r   rH   r&   rI   r-   r@   rL   r   r   r    r&   ž   s
   þz_ModuleMarker._remove_itemc                 C   s   t | j|ƒS r1   )ÚgetattrrJ   ©r*   r=   r   r   r    Úresolve_attr¤   s   z_ModuleMarker.resolve_attrc                 C   s0   || j vrt|| ƒ}|| j |< |S | j | }|S r1   )r"   r   )r*   rI   Úmarkerr   r   r    r   §   s   



ÿz_ModuleMarker.get_modulec                    sH   ˆ ˆj v rˆj ˆ  }| |¡ d S t|g‡ ‡fdd„d� }ˆj ˆ < d S )Nc                      s
   ˆ  ˆ ¡S r1   )r&   r   ©rI   r*   r   r    Ú<lambda>µ   s   
 z)_ModuleMarker.add_class.<locals>.<lambda>)r!   )r"   rD   r   )r*   rI   r   r   r   rT   r    r   ¯   s   

ÿz_ModuleMarker.add_classN)rB   r   rE   rF   rG   r0   rM   rO   r&   rR   r   r   r   r   r   r    r   …   s    r   c                   @   ó    e Zd ZdZdd„ Zdd„ ZdS )rK   )Ú__parentc                 C   ó
   || _ d S r1   )Ú_ModNS__parent)r*   rH   r   r   r    r0   ¼   rN   z_ModNS.__init__c                 C   sn   z| j j| }W n	 ty   Y nw |d ur-t|tƒr|jS t|tƒs%J ‚| | j j|¡S t	d| j j
|f ƒ‚)Nz<Module %r has no mapped classes registered under the name %r)rY   r"   r   r   r   rJ   r   r>   r<   ÚAttributeErrorrI   )r*   r=   Úvaluer   r   r    Ú__getattr__¿   s   ÿ

ÿÿz_ModNS.__getattr__N©rB   r   rE   rG   r0   r\   r   r   r   r    rK   ¹   ó    rK   c                   @   rV   )Ú_GetColumns©r   c                 C   rX   r1   r`   )r*   r   r   r   r    r0   Ô   rN   z_GetColumns.__init__c                 C   s‚   t | jdd�}|r;||jvrt d| j|f ¡‚|j| }|jtju r;|j}t	|t
ƒr/|j}nt	|tƒs;t 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   Úall_orm_descriptorsr   r8   Úextension_typer   ÚNOT_EXTENSIONÚpropertyr   r
   rI   r   rP   )r*   r=   ÚmpÚdescÚpropr   r   r    r\   ×   s(   
ÿÿ


þÿz_GetColumns.__getattr__Nr]   r   r   r   r    r_   Ñ   r^   r_   c                 C   s   t  | j¡S r1   )r   Úinspectr   )Útargetr   r   r    rU   ï   s    rU   c                   @   rV   )Ú	_GetTable©r=   Úmetadatac                 C   s   || _ || _d S r1   rl   )r*   r=   rm   r   r   r    r0   ö   s   
z_GetTable.__init__c                 C   s   | j jt|| jƒ S r1   )rm   Útablesr   r=   rQ   r   r   r    r\   ú   s   z_GetTable.__getattr__Nr]   r   r   r   r    rk   ó   s    rk   c                 C   s   t |tƒr| g | ¡}t|ƒS r1   )r   r   r>   r_   )r=   r[   r   r   r    Ú_determine_containerþ   s   
ro   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   rh   ÚargÚ_declarative_argÚfallbackr   ÚPopulateDictÚ_access_clsÚ_dictÚ
_resolvers)r*   r   rh   rs   rq   r   r   r    r0     s   
z_class_resolver.__init__c                 C   s°   | j }||jv rt||j| ƒS ||jjv r|jj| S ||jjv r(t||jƒS d|jv r>||jd v r>|jd }| |¡S | jrS| jD ]}||ƒ}|d urR|  S qD| j	| S )Nr   )
r   r   ro   rm   rn   Ú_schemasrk   rR   rw   rs   )r*   r=   r   ÚregistryÚresolvr[   r   r   r    ru     s$   




ÿ
z_class_resolver._access_clsc              
   C   sh   zt | jtƒ | jƒ}t|tƒr|jW S |W S  ty3 } zt 	d| j
j| j|jd | jf ¡‚d }~ww )NzÅWhen 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   )Úevalrq   Úglobalsrv   r   r_   r   r;   r   r8   rh   rH   Úargs)r*   ÚxÚnr   r   r    Ú__call__#  s   
üÿ€ÿz_class_resolver.__call__N)rB   r   rE   r0   ru   r€   r   r   r   r    rp     s    rp   c                    sF   dd l }ddlm}m} |j ¡ ‰ˆ ||dœ¡ ‡ ‡‡fdd„}|S )Nr   )ÚforeignÚremotec                    s   t ˆ ˆˆ| ƒS r1   )rp   )rq   ©r   rs   rh   r   r    Úresolve_arg<  s   z_resolver.<locals>.resolve_arg)Ú
sqlalchemyÚsqlalchemy.ormr�   r‚   Ú__dict__ÚcopyÚupdate)r   rh   r…   r�   r‚   r„   r   rƒ   r    Ú	_resolver5  s   
rŠ   c                 C   s–   t |tƒrIt| |ƒ}dD ]}t||ƒ}t |tjƒr!t||||ƒƒ q|jrIt |jtƒrI|j\}}dD ]}||v rHt || tjƒrH||| ƒ||< q2|S )N)ÚargumentÚorder_byÚprimaryjoinÚsecondaryjoinÚ	secondaryÚ_user_defined_foreign_keysÚremote_side)r�   rŽ   r�   Úforeign_keysr‘   rŒ   )	r   r	   rŠ   rP   r   Ústring_typesÚsetattrÚbackrefÚtuple)r   rh   r„   ÚattrÚvr=   Úkwargsr   r   r    Ú_deferred_relationshipB  s    


	€


ÿ€rš   )rF   r$   Ú r   r   r   Úormr   r   Úorm.propertiesr   r	   r
   Úschemar   r,   r-   r   Úobjectr   r   rK   r_   Ú	_inspectsrk   ro   rp   rŠ   rš   r   r   r   r    Ú<module>   s2   (=4ÿ1