
    -h3                     b   S r SSKrSSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
  S	S
KJr  S	SKJr  S	SKJ	r	  S	SKJr  \" 5       rS rS rS r " S S\5      r " S S\5      r " S S\5      r " S S\5      r\R2                  " \5      " S 5         " S S\5      rS r " S S\5      rSqS rg) 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   )
attributes)
interfaces)SynonymProperty)ColumnProperty)class_mapper   )exc)
inspection)util)_get_table_keyc                    X;   a*  X    n[        U[        5      (       d  [        X/5      =o2U '   OXU '    US   nUR                  R                  S5      nU(       aW  UR                  S5      nUR                  U5      nU H  nUR                  U5      nM     UR                  X5        U(       a  MV  gg! [         a    [        SS5      =US'   n Nf = f)zVAdd a class to the _decl_class_registry associated with the
given declarative class.

_sa_module_registryN.r   )	
isinstance_MultipleClassMarkerKeyError_ModuleMarker
__module__splitpop
get_module	add_class	classnameclsdecl_class_registryexistingroot_moduletokenstokenmodules           oC:\Users\ROHAN GUPTA\OneDrive\Desktop\mathbuddy-assessment\venv\Lib\site-packages\sqlalchemy/orm/clsregistry.pyr   r       s    
 '&1($8998L9 H95 *-I&E)*?@ ^^!!#&F 

1''.E&&u-F ( &  E ((=tD	E!	
Es   B4 4CCc                    X;   a-  X    n[        U[        5      (       a  UR                  U5        OX 	  US   nUR                  R                  S5      nU(       aW  UR                  S5      nUR                  U5      nU H  nUR                  U5      nM     UR                  X5        U(       a  MV  g g ! [         a     g f = f)Nr   r   r   )	r   r   remove_itemr   r   r   r   r   remove_classr   s           r#   r&   r&   H   s    '&1h 455  %#.)*?@ ^^!!#&F


1''.E&&u-F I+ &  s   B3 3
C ?C c                     X;  a  gX   n[        U[        5      (       a#  UR                   H  nU" U5      (       d  M    g   gU" U5      (       + $ )a  test if a key is empty of a certain object.

used for unit tests against the registry to see if garbage collection
is working.

"test" is a callable that will be passed an object should return True
if the given object is the one we were looking for.

We can't pass the actual object itself b.c. this is for testing garbage
collection; the caller will have to have removed references to the
object itself.

TFN)r   r   contents)keyr   testthing	sub_things        r#   _key_is_emptyr-   _   sK     %$E%-..II ( ;    c                   D    \ rS rSrSrSrSS jrS rS rS r	S	 r
S
 rSrg)r   y   zJrefers to multiple classes of the same name
within _decl_class_registry.

)	on_remover(   __weakref__Nc           	          X l         [        U Vs/ s H#  n[        R                  " X0R                  5      PM%     sn5      U l        [        R                  U 5        g s  snf N)r1   setweakrefref_remove_itemr(   _registriesadd)selfclassesr1   items       r#   __init___MultipleClassMarker.__init__   sH    ">EFgdW[[001gF
 	 Gs   *Ac                 N    U R                  [        R                  " U5      5        g r4   )r8   r6   r7   r;   r   s     r#   r%    _MultipleClassMarker.remove_item   s    '++c*+r.   c                 (    S U R                    5       $ )Nc              3   .   #    U  H  o" 5       v   M     g 7fr4    ).0r7   s     r#   	<genexpr>0_MultipleClassMarker.__iter__.<locals>.<genexpr>   s     /#s   r(   )r;   s    r#   __iter___MultipleClassMarker.__iter__   s    ///r.   c                     [        U R                  5      S:  a+  [        R                  " SSR	                  X/-   5      -  5      e[        U R                  5      S   nU" 5       nUc  [        U5      eU$ )Nr   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;   pathr)   r7   r   s        r#   attempt_get _MultipleClassMarker.attempt_get   ss    t}}!))B 88D5L)+  t}}%a(C%C{n$Jr.   c                     U R                   R                  U5        U R                   (       d8  [        R                  U 5        U R                  (       a  U R                  5         g g g r4   )r(   discardr9   r1   )r;   r7   s     r#   r8   !_MultipleClassMarker._remove_item   sD    c"}}%~~   r.   c                    [        [        U R                  5       Vs/ s H	  o"" 5       PM     sn Vs/ s H  nUc  M  UR                  PM     sn5      nUR                  U;   a3  [        R
                  " SUR                  < SUR                  < S35        U R                  R                  [        R                  " XR                  5      5        g s  snf s  snf )Nz[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.)r5   rP   r(   r   r   warn__name__r:   r6   r7   r8   )r;   r=   r7   r   moduless        r#   add_item_MultipleClassMarker.add_item   s      .2$---@A-@cCE-@AAC A
 ??g%II ??DMM3 	'++d,=,=>? Bs   CCC)r(   r1   r4   )rZ   r   __qualname____firstlineno____doc__	__slots__r>   r%   rJ   rS   r8   r\   __static_attributes__rE   r.   r#   r   r   y   s-    
 7I,0!@r.   r   c                   L    \ rS rSrSrSrS rS rS rS r	S r
S	 rS
 rS rSrg)r      z6Refers to a module name within
_decl_class_registry.

)parentnamer(   mod_nsrR   r2   c                     X l         Xl        0 U l        [        U 5      U l        U R                   (       a*  U R                   R
                  U R                  /-   U l        O/ U l        [        R                  U 5        g r4   )re   rf   r(   _ModNSrg   rR   r9   r:   )r;   rf   re   s      r#   r>   _ModuleMarker.__init__   sT    	Tl;;((DII;6DIDIr.   c                     XR                   ;   $ r4   rI   r;   rf   s     r#   __contains___ModuleMarker.__contains__   s    }}$$r.   c                      U R                   U   $ r4   rI   rl   s     r#   __getitem___ModuleMarker.__getitem__   s    }}T""r.   c                     U R                   R                  US 5        U R                   (       dI  U R                  b;  U R                  R                  U R                  5        [
        R                  U 5        g g g r4   )r(   r   re   r8   rf   r9   rV   rl   s     r#   r8   _ModuleMarker._remove_item   sQ    $%}}!8KK$$TYY/% "9}r.   c                 .    [        U R                  U5      $ r4   )getattrrg   r;   r)   s     r#   resolve_attr_ModuleMarker.resolve_attr   s    t{{C((r.   c                 x    XR                   ;  a  [        X5      nX R                   U'   U$ U R                   U   nU$ r4   )r(   r   )r;   rf   markers      r#   r   _ModuleMarker.get_module   s>    }}$"4.F"(MM$  ]]4(Fr.   c                    ^ ^ TT R                   ;   a!  T R                   T   nUR                  U5        g [        U/UU 4S jS9=nT R                   T'   g )Nc                  &   > TR                  T 5      $ r4   )r8   )rf   r;   s   r#   <lambda>)_ModuleMarker.add_class.<locals>.<lambda>   s    ):):4)@r.   )r1   )r(   r\   r   r;   rf   r   r   s   ``  r#   r   _ModuleMarker.add_class   sM    4== }}T*Hc"-A!@. Ht}}T*r.   c                 d    XR                   ;   a!  U R                   U   nUR                  U5        g g r4   )r(   r%   r   s       r#   r&   _ModuleMarker.remove_class   s-    == }}T*H  % !r.   )r(   rg   rf   re   rR   N)rZ   r   r^   r_   r`   ra   r>   rm   rp   r8   rw   r   r   r&   rb   rE   r.   r#   r   r      s7    
 NI	%#&)&r.   r   c                   $    \ rS rSrSrS rS rSrg)ri      )__parentc                     Xl         g r4   )_ModNS__parent)r;   re   s     r#   r>   _ModNS.__init__   s    r.   c                 h    U R                   R                  U   nUb^  [        U[        5      (       a  UR                  $ [        U[
        5      (       d   eUR                  U R                   R                  U5      $  [        SU R                   R                  < SU< 35      e! [         a     N3f = f)NzModule z1 has no mapped classes registered under the name )r   r(   r   r   rg   r   rS   rR   r   rQ   rf   )r;   r)   values      r#   __getattr___ModNS.__getattr__   s    
	FMM**3/E  e]33 <<'%e-ABBBB ,,T]]-?-?EE ! .2mm.@.@#G
 	
  		s   B$ $
B10B1NrZ   r   r^   r_   ra   r>   r   rb   rE   r.   r#   ri   ri      s    I
r.   ri   c                   $    \ rS rSrSrS rS rSrg)_GetColumnsi
  r   c                     Xl         g r4   r   rA   s     r#   r>   _GetColumns.__init__  s    r.   c                    [        U R                  SS9nU(       a  XR                  ;  a  [        SU R                  < SU< 35      eUR                  U   nUR                  [
        R                  L a\  UR                  n[        U[        5      (       a  UR                  nO.[        U[        5      (       d  [        R                  " SU-  5      e[        U R                  U5      $ )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_descriptorsAttributeErrorextension_typer   NOT_EXTENSIONpropertyr   r   rf   r   r
   rN   ru   )r;   r)   mpdescprops        r#   r   _GetColumns.__getattr__  s    $((e4000$xx& 
 ))#.D""j&>&>>}}dO44))C#D.99112478 
 txx%%r.   Nr   rE   r.   r#   r   r   
  s    I&r.   r   c                 B    [         R                  " U R                  5      $ r4   )r   inspectr   )targets    r#   r~   r~   (  s    :%%fjj1r.   c                   $    \ rS rSrSrS rS rSrg)	_GetTablei,  r)   metadatac                     Xl         X l        g r4   r   )r;   r)   r   s      r#   r>   _GetTable.__init__/  s     r.   c                 Z    U R                   R                  [        XR                  5         $ r4   )r   tablesr   r)   rv   s     r#   r   _GetTable.__getattr__3  s     }}##N3$ABBr.   Nr   rE   r.   r#   r   r   ,  s    !I!Cr.   r   c                 f    [        U[        5      (       a  UR                  / U 5      n[        U5      $ r4   )r   r   rS   r   )r)   r   s     r#   _determine_containerr   7  s-    %-..!!"c*ur.   c                   :    \ rS rSrSrS
S jrS rS rS rS r	Sr
g	)_class_resolveri=  )r   r   argfallback_dict
_resolversfavor_tablesc                     Xl         X l        X@l        X0l        [        R
                  " U R                  5      U l        SU l        XPl	        g )NrE   )
r   r   r   r   r   PopulateDict_access_clsr   r   r   )r;   r   r   r   r   r   s         r#   r>   _class_resolver.__init__H  s;    	 &&t'7'78
(r.   c                    U R                   n[        R                  " U5      nUR                  nUR                  nUR
                  nU R                  (       aB  XR                  ;   a  UR                  U   $ XR                  ;   a  [        XR
                  5      $ X;   a  [        XU   5      $ U R                  (       dB  XR                  ;   a  UR                  U   $ XR                  ;   a  [        XR
                  5      $ SU;   a  XS   ;   a  US   nUR                  U5      $ U R                  (       a"  U R                   H  nU" U5      n	U	c  M  U	s  $    U R                  U   $ )Nr   )r   r   manager_of_classregistry_class_registryr   r   r   _schemasr   r   rw   r   r   )
r;   r)   r   manager	decl_baser   r   r   resolvr   s
             r#   r   _class_resolver._access_clsQ  s:   hh--c2$$	'77%%oo%s++))) ll33%'-EFF  oo%s++))) ll33 "%88+@AA*+@AH((--__//s$ L *
 }}S!!r.   c                     [         R                  " [        R                  " SU R                  R
                  < SU R                  < SU< SU R                  < S3	5      US9  g )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
   rN   r   re   r   r   )r;   rf   errs      r#   _raise_for_name_class_resolver._raise_for_namev  sC    ##
 99##TXXtTXX	? 		
r.   c                    U R                   nU R                  nS n UR                  S5       H  nUc  X$   nM  [        X45      nM     [	        U[
        5      (       a  UR                  $ U$ ! [         a  nU R                  X5         S nAg S nAf[         a)  nU R                  UR                  S   U5         S nAg S nAff = f)Nr   r   )r   r   r   ru   r   r   r   r   r   rQ   args)r;   rf   drvalr!   r   ns          r#   _resolve_name_class_resolver._resolve_name  s    xxJJ	C<8D"4/D	 ) $,,xx  	,  ++ 	/  A..	/s#   ,A+ +
C5BCB<<Cc                     [        U R                  [        5       U R                  5      n[	        U[
        5      (       a  UR                  $ U$ ! [         a)  nU R                  UR                  S   U5         S nAg S nAff = f)Nr   )
evalr   globalsr   r   r   r   rQ   r   r   )r;   xr   s      r#   __call___class_resolver.__call__  se    	/TXXwy$**5A![))uu 	/  A..	/s   A	A A 
BA<<B)r   r   r   r   r   r   r   NF)rZ   r   r^   r_   ra   r>   r   r   r   r   rb   rE   r.   r#   r   r   =  s#    I)#"J

(	/r.   r   c                    ^ ^ [         c=  SS KnSSKJnJn  [
        R                  " UR                  5      R                  X4S.5      q SU U4S jjnU U4S jnXe4$ )Nr   )foreignremotec                 $   > [        TT[        XS9$ )N)r   )r   _fallback_dict)r   r   r   r   s     r#   resolve_arg_resolver.<locals>.resolve_arg  s    ~s
 	
r.   c                 <   > [        TT[        U 5      R                  $ r4   )r   r   r   )r   r   r   s    r#   resolve_name_resolver.<locals>.resolve_name  s    sD.#>LLLr.   r   )	r   
sqlalchemysqlalchemy.ormr   r   r   immutabledict__dict__union)r   r   r   r   r   r   r   s   ``     r#   	_resolverr     sS     2++J,?,?@FF2

 

M $$r.   )r`   r6    r   r   descriptor_propsr   
propertiesr   r   r   r
   r   
sql.schemar   r5   r9   r   r&   r-   objectr   r   ri   r   	_inspectsr   r   r   r   r   rE   r.   r#   <module>r      s       - &     ' e%)P,.4=@6 =@@6&F 6&r
V 
0&& &:   [ !1
C Cb/f b/J %r.   