o
    [h1                     @   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existingZroot_moduletokenstokenmodule r   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/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 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|v rtd|j|jf  | jt|| j	 d S )Nc                 S   s   g | ]	}|d u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_itemr0   )
rB   r   __qualname____doc__	__slots__r/   r4   r>   r%   rD   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 r0   )rH   rI   r!   _ModNSrJ   r<   r,   r-   )r)   rI   rH   r   r   r   r/      s   
z_ModuleMarker.__init__c                 C   s
   || j v S r0   r3   r)   rI   r   r   r   __contains__      
z_ModuleMarker.__contains__c                 C   s
   | j | S r0   r3   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 r0   )r!   r   rH   r%   rI   r,   r@   rL   r   r   r   r%      s
   z_ModuleMarker._remove_itemc                 C   s   t | j|S r0   )getattrrJ   r)   r=   r   r   r   resolve_attr   s   z_ModuleMarker.resolve_attrc                 C   s0   || j vrt|| }|| j |< |S | j | }|S r0   )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 r0   )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   r/   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   )Z__parentc                 C   
   || _ d S r0   )_ModNS__parent)r)   rH   r   r   r   r/      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)rX   r!   r   r   r   rJ   r   r>   r<   AttributeErrorrI   )r)   r=   valuer   r   r   __getattr__   s   

z_ModNS.__getattr__NrB   r   rE   rG   r/   r[   r   r   r   r   rK          rK   c                   @   rV   )_GetColumnsr   c                 C   rW   r0   r_   )r)   r   r   r   r   r/      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   Zall_orm_descriptorsr   r8   Zextension_typer   ZNOT_EXTENSIONpropertyr   r
   rI   r   rP   )r)   r=   mpZdescpropr   r   r   r[      s(   



z_GetColumns.__getattr__Nr\   r   r   r   r   r^      r]   r^   c                 C   s   t | jS r0   )r   inspectr   )targetr   r   r   rU      s    rU   c                   @   rV   )	_GetTabler=   metadatac                 C   s   || _ || _d S r0   rg   )r)   r=   rh   r   r   r   r/      s   
z_GetTable.__init__c                 C   s   | j jt|| j S r0   )rh   tablesr   r=   rQ   r   r   r   r[      s   z_GetTable.__getattr__Nr\   r   r   r   r   rf      s    rf   c                 C   s   t |tr|g | }t|S r0   )r   r   r>   r^   )r=   rZ   r   r   r   _determine_container   s   
rj   c                   @   s6   e Zd ZdddZdd Zdd Zdd	 Zd
d ZdS )_class_resolverFc                 C   s<   || _ || _| | _| _|| _t| j| _d| _	|| _
d S )Nr   )r   rc   argZ_declarative_argfallbackr   ZPopulateDict_access_cls_dict
_resolversfavor_tables)r)   r   rc   rm   rl   rq   r   r   r   r/     s   
z_class_resolver.__init__c                 C   s   | j }| jr||jjv r|jj| S ||jjv rt||jS ||jv r+t||j| S | jsF||jjv r:|jj| S ||jjv rFt||jS d|jv r\||jd v r\|jd }||S | j	rq| j	D ]}||}|d urp|  S qb| j
| S )Nr   )r   rq   rh   ri   Z_schemasrf   r   rj   rR   rp   rm   )r)   r=   r   registryZresolvrZ   r   r   r   rn     s0   





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.)Zfrom_)r   Zraise_r   r8   rc   rH   rl   r   )r)   rI   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   )rl   ro   r   rP   r   rt   r;   argsr   r^   r   )r)   rI   drvalr   rs   nr   r   r   _resolve_name;  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   )
evalrl   globalsro   r   r^   r   r;   rt   ru   )r)   xrx   r   r   r   __call__O  s   
 z_class_resolver.__call__NF)rB   r   rE   r/   rn   rt   ry   r}   r   r   r   r   rk     s    
	 rk   c                    s\   dd l }ddlm}m} |j ||d d fdd	} fdd}||fS )	Nr   )foreignremoteFc                    s   t  | |dS )Nrq   )rk   )rl   rq   r   rm   rc   r   r   resolve_argb  s   
z_resolver.<locals>.resolve_argc                    s   t  | jS r0   )rk   ry   )rl   r   r   r   resolve_nameg  r5   z_resolver.<locals>.resolve_namer~   )
sqlalchemyZsqlalchemy.ormr   r   __dict__copyupdate)r   rc   r   r   r   r   r   r   r   r   	_resolver[  s   
r   c                 C   s   t |trgt| |\}}dD ]}t||}t |tjr't|||||dkd qdD ]}t||}t |tjr?t|||| q*|jrgt |jtrg|j\}}dD ]}||v rft || tjrf||| ||< qP|S )N)order_byprimaryjoinsecondaryjoin	secondaryZ_user_defined_foreign_keysremote_sider   r   )argument)r   r   r   Zforeign_keysr   r   )	r   r	   r   rP   r   string_typessetattrZbackreftuple)r   rc   r   r   attrvr=   kwargsr   r   r   _deferred_relationshipm  s2   





r   )rF   r#    r   r   r   Zormr   r   Zorm.propertiesr   r	   r
   Zschemar   r+   r,   r   objectr   r   rK   r^   Z	_inspectsrf   rj   rk   r   r   r   r   r   r   <module>   s2   (=4V