o
    i/                     @   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:`_orm.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   a/var/www/edux/Edux_v2/venv/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>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      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_get[   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&   j   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+   v   s
    z1_MultipleClassMarker.add_item.<locals>.<listcomp>c                 S   s   g | ]}| qS r   r   r2   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_itemr1   )
rC   r   __qualname____doc__	__slots__r0   r5   r?   r&   rE   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 r| j j| jg | _ng | _t|  d S r1   )rI   rJ   r"   _ModNSrK   r=   r-   r.   )r*   rJ   rI   r   r   r    r0      s   
z_ModuleMarker.__init__c                 C   s
   || j v S r1   r4   r*   rJ   r   r   r    __contains__      
z_ModuleMarker.__contains__c                 C   s
   | j | S r1   r4   rM   r   r   r    __getitem__   rO   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   rI   r&   rJ   r-   rA   rM   r   r   r    r&      s
   z_ModuleMarker._remove_itemc                 C   s   t | j|S r1   )getattrrK   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*   rJ   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   rJ   r*   r   r    <lambda>   s   
 z)_ModuleMarker.add_class.<locals>.<lambda>)r!   )r"   rE   r   )r*   rJ   r   r   r   rU   r    r      s   

z_ModuleMarker.add_classN)rC   r   rF   rG   rH   r0   rN   rP   r&   rS   r   r   r   r   r   r    r      s    r   c                   @       e Zd ZdZdd Zdd ZdS )rL   )__parentc                 C   
   || _ d S r1   )_ModNS__parent)r*   rI   r   r   r    r0      rO   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)rZ   r"   r   r   r   rK   r   r?   r=   AttributeErrorrJ   )r*   r>   valuer   r   r    __getattr__   s   

z_ModNS.__getattr__NrC   r   rF   rH   r0   r]   r   r   r   r    rL          rL   c                   @   rW   )_GetColumnsr   c                 C   rY   r1   ra   )r*   r   r   r   r    r0      rO   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   r9   extension_typer   NOT_EXTENSIONpropertyr   r
   rJ   r   rQ   )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    rV      s    rV   c                   @   rW   )	_GetTabler>   metadatac                 C   s   || _ || _d S r1   rm   )r*   r>   rn   r   r   r    r0      s   
z_GetTable.__init__c                 C   s   | j jt|| j S r1   )rn   tablesr   r>   rR   r   r   r    r]      s   z_GetTable.__getattr__Nr^   r   r   r   r    rl      s    rl   c                 C   s   t |tr|g | }t|S r1   )r   r   r?   r`   )r>   r\   r   r   r    _determine_container   s   
rp   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )_class_resolverc                 C   s6   || _ || _| | _| _|| _t| j| _d| _	d S )Nr   )
r   ri   arg_declarative_argfallbackr   PopulateDict_access_cls_dict
_resolvers)r*   r   ri   rt   rr   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   rp   rn   ro   _schemasrl   rS   rx   rt   )r*   r>   r   registryresolvr\   r   r   r    rv     s$   





z_class_resolver._access_clsc                 C   s,   t jtd| jj| j|| jf |d 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.)from_)r   raise_r   r9   ri   rI   rr   r   )r*   rJ   errr   r   r    _raise_for_name$  s   
z_class_resolver._raise_for_namec              
   C   s   | j }| j}d }z|dD ]}|d u r|| }qt||}qW n4 ty9 } z| || W Y d }~d S d }~w tyT } z| |jd | W Y d }~d S d }~ww t|t	r]|j
S |S )Nr   r   )rr   rw   r   rQ   r   r   r<   argsr   r`   r   )r*   rJ   drvalr   r~   nr   r   r    _resolve_name0  s&   
 
z_class_resolver._resolve_namec              
   C   sd   zt | jt | j}t|tr|jW S |W S  ty1 } z| |j	d | W Y d }~d S d }~ww )Nr   )
evalrr   globalsrw   r   r`   r   r<   r   r   )r*   xr   r   r   r    __call__D  s   
 z_class_resolver.__call__N)rC   r   rF   r0   rv   r   r   r   r   r   r   r    rq     s    rq   c                    sZ   dd l }ddlm}m} |j ||d  fdd} fdd}||fS )Nr   )foreignremotec                    s   t  | S r1   )rq   rr   r   rt   ri   r   r    resolve_argW  s   z_resolver.<locals>.resolve_argc                    s   t  | jS r1   )rq   r   r   r   r   r    resolve_nameZ  r6   z_resolver.<locals>.resolve_name)
sqlalchemysqlalchemy.ormr   r   __dict__copyupdate)r   ri   r   r   r   r   r   r   r   r    	_resolverP  s   
r   c                 C   s   t |trct| |\}}dD ]}t||}t |tjr#t|||| qdD ]}t||}t |tjr;t|||| q&|jrct |jtrc|j\}}dD ]}||v rbt || tjrb||| ||< qL|S )N)order_byprimaryjoinsecondaryjoin	secondary_user_defined_foreign_keysremote_side)argument)r   r   r   foreign_keysr   r   )	r   r	   r   rQ   r   string_typessetattrbackreftuple)r   ri   r   r   attrvr>   kwargsr   r   r    _deferred_relationship`  s*   





r   )rG   r$    r   r   r   ormr   r   orm.propertiesr   r	   r
   schemar   r,   r-   r   objectr   r   rL   r`   	_inspectsrl   rp   rq   r   r   r   r   r   r    <module>   s2   (=4K