
    ؄_/                        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 Z G d de          Z G d de          Z G d de          Z G d de          Z  ej        e          d             G d de          Zd Z G d de          Zd Z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                    | |j         v r>|j         |          }t          |t                    st          ||g          x}|j         | <   n
||j         | <   	 |j         d         }n*# t          $ r t	          dd          x|j         d<   }Y nw xY w|j                            d          }|r^|                    d          }|                    |          }|D ]}|                    |          }|	                    | |           |\d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modules          k/var/www/book.euthymeo.com/html/venv/lib/python3.11/site-packages/sqlalchemy/ext/declarative/clsregistry.pyr   r   !   sa   
 C,,,+I6($899 	6 %c8_556Hs/ /2 +E./DE E E E ((=tDD	E !	
KKE
 ^!!#&&F  )

1''.. 	. 	.E&&u--FFC(((  ) ) ) ) )s   A! !$BBc                   6    e Zd ZdZdZd	dZd Zd Zd Zd Z	dS )
r   zRrefers to multiple classes of the same name
    within _decl_class_registry.

    )	on_removecontents__weakref__Nc                      | _         t           fd|D                        _        t                                          d S )Nc                 D    g | ]}t          j        |j                  S  )weakrefref_remove_item).0itemselfs     r!   
<listcomp>z1_MultipleClassMarker.__init__.<locals>.<listcomp>T   s(    FFFdW[t011FFF    )r#   setr$   _registriesadd)r.   classesr#   s   `  r!   __init__z_MultipleClassMarker.__init__Q   sL    "FFFFgFFF
 
 	r0   c                 $    d | j         D             S )Nc              3   *   K   | ]} |            V  d S Nr(   r,   r*   s     r!   	<genexpr>z0_MultipleClassMarker.__iter__.<locals>.<genexpr>Y   s(      //#//////r0   r$   )r.   s    r!   __iter__z_MultipleClassMarker.__iter__X   s    //////r0   c                     t          | j                  dk    r.t          j        dd                    ||gz             z            t          | j                  d         } |            }|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   s        r!   attempt_getz _MultipleClassMarker.attempt_get[   s    t}!!)B 88DC5L))+   t}%%a(C#%%C{nn$Jr0   c                     | j                             |           | j         s7t                              |            | j        r|                                  d S d S d S r8   )r$   remover2   discardr#   )r.   r*   s     r!   r+   z!_MultipleClassMarker._remove_itemj   sj    S!!!} 	!%%%~ !     	! 	!! !r0   c                    t          d d | j        D             D                       }|j        |v r%t          j        d|j        d|j        d           | j                            t          j        || j	                             d S )Nc                      g | ]}||j         S r8   )r   )r,   r   s     r!   r/   z1_MultipleClassMarker.add_item.<locals>.<listcomp>v   s'       ? "??r0   c                 "    g | ]} |            S r(   r(   r9   s     r!   r/   z1_MultipleClassMarker.add_item.<locals>.<listcomp>x   s    ;;;cCCEE;;;r0   z[This declarative base already contains a class with the same class name and module name as r   z2, and will be replaced in the string-lookup table.)
r1   r$   r   r   warn__name__r3   r)   r*   r+   )r.   r-   moduless      r!   add_itemz_MultipleClassMarker.add_itemq   s      ;;T];;;  
 
 ?g%%II ???DMMM3   	'+dD,=>>?????r0   r8   )
rN   r   __qualname____doc__	__slots__r5   r<   rF   r+   rP   r(   r0   r!   r   r   I   sz         
 7I   0 0 0  ! ! !@ @ @ @ @r0   r   c                   @    e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Zd
S )r   z>Refers to a module name within
    _decl_class_registry.

    )parentnamer$   mod_nsrD   r%   c                     || _         || _        i | _        t          |           | _        | j         r| j         j        | j        gz   | _        ng | _        t                              |            d S r8   )rU   rV   r$   _ModNSrW   rD   r2   r3   )r.   rV   rU   s      r!   r5   z_ModuleMarker.__init__   sd    	Tll; 	(DI;6DIIDIr0   c                     || j         v S r8   r;   r.   rV   s     r!   __contains__z_ModuleMarker.__contains__   s    t}$$r0   c                     | j         |         S r8   r;   r[   s     r!   __getitem__z_ModuleMarker.__getitem__   s    }T""r0   c                     | j                             |d            | j         sB| j        =| j                            | j                   t
                              |            d S d S d S r8   )r$   r   rU   r+   rV   r2   rI   r[   s     r!   r+   z_ModuleMarker._remove_item   sm    $%%%} 	&!8K$$TY///%%%%%	& 	&!8!8r0   c                 ,    t          | j        |          S r8   )getattrrW   r.   rE   s     r!   resolve_attrz_ModuleMarker.resolve_attr   s    t{C(((r0   c                 h    || j         vrt          ||           }|| j         |<   n| j         |         }|S r8   )r$   r   )r.   rV   markers      r!   r   z_ModuleMarker.get_module   s>    t}$$"4..F"(DM$]4(Fr0   c                       j         v r$ j                  }|                    |           d S t          |g fd          x} j         <   d S )Nc                  .                                    S r8   )r+   )rV   r.   s   r!   <lambda>z)_ModuleMarker.add_class.<locals>.<lambda>   s    ):):4)@)@ r0   )r#   )r$   rP   r   )r.   rV   r   r   s   ``  r!   r   z_ModuleMarker.add_class   ss    4=  }T*Hc"""""-A!@!@!@!@!@. . . Ht}T***r0   N)rN   r   rQ   rR   rS   r5   r\   r^   r+   rc   r   r   r(   r0   r!   r   r      s         
 NI	 	 	% % %# # #& & &) ) )      r0   r   c                       e Zd ZdZd Zd ZdS )rY   )__parentc                     || _         d S r8   )_ModNS__parent)r.   rU   s     r!   r5   z_ModNS.__init__   s    r0   c                 2   	 | j         j        |         }|St          |t                    r|j        S t          |t
                    sJ |                    | j         j        |          S n# t          $ r Y nw xY wt          d| j         j
        d|          )NzModule z1 has no mapped classes registered under the name )rl   r$   r   r   rW   r   rF   rD   r   AttributeErrorrV   )r.   rE   values      r!   __getattr__z_ModNS.__getattr__   s    
	FM*3/E  e]33 F <'%e-ABBBBB ,,T]-?EEE !  	 	 	D	 n.2m.@.@.@##G
 
 	
s   A* *
A76A7NrN   r   rQ   rS   r5   rp   r(   r0   r!   rY   rY      s7        I  
 
 
 
 
r0   rY   c                       e Zd ZdZd Zd ZdS )_GetColumnsr   c                     || _         d S r8   rt   )r.   r   s     r!   r5   z_GetColumns.__init__   s    r0   c                    t          | j        d          }|r||j        vrt          j        d| j        d|          |j        |         }|j        t          j        u rP|j        }t          |t                    r|j        }n,t          |t                    st          j        d|z            t          | j        |          S )NF)	configurezClass z% does not have a mapped column named zaProperty %r is not an instance of ColumnProperty (i.e. does not correspond directly to a Column).)r   r   all_orm_descriptorsr   r@   extension_typer   NOT_EXTENSIONpropertyr   r   rV   r	   ra   )r.   rE   mpdescprops        r!   rp   z_GetColumns.__getattr__   s    $(e444 	"000--xxx&  
 )#.D"j&>>>}dO44 )CC#D.99 12478  
 tx%%%r0   Nrq   r(   r0   r!   rs   rs      s7        I  & & & & &r0   rs   c                 4    t          j        | j                  S r8   )r   inspectr   )targets    r!   rh   rh      s    :%fj11 r0   c                       e Zd ZdZd Zd ZdS )	_GetTablerE   metadatac                 "    || _         || _        d S r8   r   )r.   rE   r   s      r!   r5   z_GetTable.__init__   s     r0   c                 L    | j         j        t          || j                           S r8   )r   tablesr   rE   rb   s     r!   rp   z_GetTable.__getattr__   s    }#N3$A$ABBr0   Nrq   r(   r0   r!   r   r      s<        !I! ! !C C C C Cr0   r   c                 v    t          |t                    r|                    g |           }t          |          S r8   )r   r   rF   rs   )rE   ro   s     r!   _determine_containerr      s8    %-.. +!!"c**ur0   c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )_class_resolverc                     || _         || _        |x| _        | _        || _        t          j        | j                  | _        d| _	        d S )Nr(   )
r   r~   arg_declarative_argfallbackr   PopulateDict_access_cls_dict
_resolvers)r.   r   r~   r   r   s        r!   r5   z_class_resolver.__init__  sF    	+..4( &t'788
r0   c                    | j         }||j        v rt          ||j        |                   S ||j        j        v r|j        j        |         S ||j        j        v rt          ||j                  S d|j        v r1||j        d         v r"|j        d         }|                    |          S | j        r| j        D ]} ||          }||c S | j	        |         S )Nr   )
r   r   r   r   r   _schemasr   rc   r   r   )r.   rE   r   registryresolvro   s         r!   r   z_class_resolver._access_cls  s    h#***'S-Ec-JKKKCL'''<&s++CL)))S#,///!S%===s/0EFFF/0EFH((---_ 	!/ ! !s$ LLL % }S!!r0   c                     t          j        t          j        d| j        j        d| j        d|d| j        d	          |           d S )NzWhen initializing mapper z, expression z failed to locate a name (zG). If this is a class name, consider adding this relationship() to the z6 class after both dependent classes have been defined.)from_)r   raise_r   r@   r~   rU   r   r   )r.   rV   errs      r!   _raise_for_namez_class_resolver._raise_for_name$  sh    ##
 9###TXXXtttTXXX	?  		
 		
 		
 		
 		
 		
r0   c                    | j         }| j        }d }	 |                    d          D ]}|	||         }t          ||          }	 t	          |t
                    r|j        S |S # t          $ r!}|                     ||           Y d }~d S d }~wt          $ r,}|                     |j
        d         |           Y d }~d S d }~ww xY w)Nr   r   )r   r   r   ra   r   rs   r   r   r   rC   args)r.   rV   drvalr   r   ns          r!   _resolve_namez_class_resolver._resolve_name0  s   xJ	C 0 0<U8DD"4//DD	0 $,, x  	, 	, 	,  s+++++++++ 	/ 	/ 	/  A.........	/s#   3A$ $
C.B

C!B>>Cc                     	 t          | j        t                      | j                  }t	          |t
                    r|j        S |S # t          $ r,}|                     |j	        d         |           Y d }~d S d }~ww xY w)Nr   )
evalr   globalsr   r   rs   r   rC   r   r   )r.   xr   s      r!   __call__z_class_resolver.__call__D  s    	/TXwyy$*55A![)) u 	/ 	/ 	/  A.........	/s   AA A 
A=!A88A=N)rN   r   rQ   r5   r   r   r   r   r(   r0   r!   r   r     s_          " " ",

 

 

  (	/ 	/ 	/ 	/ 	/r0   r   c                      dd l }ddlm}m} |j                                                            ||d            fd} fd}||fS )Nr   )foreignremotec                 (    t          |           S r8   )r   r   r   r   r~   s    r!   resolve_argz_resolver.<locals>.resolve_argW  s    sD(C888r0   c                 2    t          |           j        S r8   )r   r   r   s    r!   resolve_namez_resolver.<locals>.resolve_nameZ  s    sD(C88FFr0   )
sqlalchemysqlalchemy.ormr   r   __dict__copyupdate)r   r~   r   r   r   r   r   r   s   ``     @r!   	_resolverr   P  s    ........"''))HOO6::;;;9 9 9 9 9 9 9G G G G G G G $$r0   c                 L   t          |t                    rt          | |          \  }}dD ]F}t          ||          }t          |t          j                  rt          || ||                     GdD ]F}t          ||          }t          |t          j                  rt          || ||                     G|j        rat          |j        t                    rG|j        \  }}dD ]:}||v r4t          ||         t          j                  r |||                   ||<   ;|S )N)order_byprimaryjoinsecondaryjoin	secondary_user_defined_foreign_keysremote_side)argument)r   r   r   foreign_keysr   r   )	r   r
   r   ra   r   string_typessetattrbackreftuple)r   r~   r   r   attrvrE   kwargss           r!   _deferred_relationshipr   `  sF   $,-- !=$-c4$8$8!k
 
	4 
	4D d##A!T.// 4dKKNN333! 	5 	5Dd##A!T.// 5dLLOO444< 	=Jt|U;; 	=,KC = = 6>>j4L$"3' '> $/;vd|#<#<F4LKr0   )rR   r)    r   r   r   ormr   r   orm.propertiesr	   r
   r   schemar   r1   r2   r   objectr   r   rY   rs   	_inspectsr   r   r   r   r   r(   r0   r!   <module>r      sQ                                   , , , , , , 2 2 2 2 2 2 - - - - - - $ $ $ $ $ $ cee%) %) %)P:@ :@ :@ :@ :@6 :@ :@ :@z1 1 1 1 1F 1 1 1h
 
 
 
 
V 
 
 
0& & & & && & & &: " 
 [ ! !11  
C C C C C C C C  H/ H/ H/ H/ H/f H/ H/ H/V% % % % % % % %r0   