§
    eŠtj_)  ã                  ó®  — 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 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 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  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,„Z(d=d-„Z)d>d5„Z*d=d6„Z+d?d:„Z,d;S )@é    )Úannotations)ÚList)ÚOptional)ÚUnion)ÚARG_NAMED_OPT)ÚArgument)ÚAssignmentStmt)ÚCallExpr)ÚClassDef)ÚMDEF)Ú
MemberExpr)ÚNameExpr)ÚRefExpr)ÚStrExpr)ÚSymbolTableNode)ÚTempNode)ÚTypeInfo)ÚVar)ÚSemanticAnalyzerPluginInterface)Úadd_method_to_class)ÚAnyType)Úget_proper_type)ÚInstance)ÚNoneTyp)Ú
ProperType)Ú	TypeOfAny)ÚUnboundType)Ú	UnionTypeé   )Úinfer)Úutil)Úexpr_to_mapped_constructor)ÚNAMED_TYPE_SQLA_MAPPEDÚclsr   Úapir   ÚitemúUnion[NameExpr, StrExpr]Ú
attributesúList[util.SQLAlchemyAttribute]ÚreturnÚNonec           	     óÌ  — t          |t          ¦  «        r|j        }nt          |t          ¦  «        r|j        }nd S | j        j        D ]O}t          |t          ¦  «        r8t          |j        d         t          ¦  «        r|j        d         j        |k    r nŒPt          j
        |d|› �| ¦  «         d S |j        €t          j
        |d|¦  «         d S t          |j        ¦  «        }t          |t          t          t          f¦  «        sJ ‚|                     t          j        ||j        |j        || j        ¬¦  «        ¦  «         t+          |||j        d         |d ¦  «         d S )Nr   zCan't find mapped attribute zBStatement linked from _mypy_mapped_attrs has no typing information)ÚnameÚlineÚcolumnÚtypÚinfo)Ú
isinstancer   r-   r   ÚvalueÚdefsÚbodyr	   Úlvaluesr!   ÚfailÚtyper   r   r   r   ÚappendÚSQLAlchemyAttributer.   r/   r1   Úapply_type_to_mapped_statement)r$   r%   r&   r(   r-   ÚstmtÚleft_hand_explicit_types          úW/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sqlalchemy/ext/mypy/apply.pyÚapply_mypy_mapped_attrr?   -   s”  € õ �$�Ñ!Ô!ð ØŒyˆˆÝ	�D�'Ñ	"Ô	"ð ØŒzˆˆàˆtà””ð 	ð 	ˆå�t�^Ñ,Ô,ð	å˜4œ<¨œ?­HÑ5Ô5ð	ð ”˜Q”Ô$¨Ò,Ð,àˆEøåŒ	�#Ð<°dÐ<Ð<¸cÑBÔBÐBØˆtà„yÐÝŒ	Øð!àñ		
ô 	
ð 	
ð ˆtå-¨d¬iÑ8Ô8ÐÝØ¥(­Iµ{Ð!Cñô ð ð ð ð ×ÒÝÔ ØØ”Ø”;Ø'Ø”ð	
ñ 	
ô 	
ñô ð õ #ØˆT�4”< ”?Ð$;¸Tñô ð ð ð ó    c           	     óº  — d„ |D ¦   «         }d}| j         j        D �] }t          |t          ¦  «        �r‡t          |j        d         t
          ¦  «        �rf|j        d         j        |v �rQt          |j        d         j        t          ¦  «        �r+|j        d         j        }||j        d         j                 j	        }t          |j	        ¦  «        }t          |t          ¦  «        �ryt          |t          ¦  «        �sct          |j        t          ¦  «        �rHt          |j        j        t          ¦  «        �r(t          |j        j        j        t
          ¦  «        �r|j        j        j        j        �í|j        j        j        j        j        t$          k    rÉ|j        j        j        dk    r´t          |j        j        d         t          ¦  «        r�t          |j        j        d         j        t(          ¦  «        ret+          j        |||||j        j        d         j        ¦  «        }	|	�6t          |	t          ¦  «        s!|	}|||j        d         j                 _	        d}t          |j	        t.          ¦  «        r|j	        j	        j        t$          k    r%|€J ‚|                     t$          |g¦  «        |_	        �Œ¢|rt3          j        | j        |¦  «         dS dS )zlFor multiple class passes, re-apply our left-hand side types as mypy
    seems to reset them in place.

    c                ó   — i | ]
}|j         |“ŒS © )r-   ©Ú.0Úattrs     r>   ú
<dictcomp>z4re_apply_declarative_assignments.<locals>.<dictcomp>k   s   € ÐAÐAÐA¨d˜$œ) TÐAÐAÐAr@   Fr   NÚ_empty_constructorT)r4   r5   r2   r	   r6   r   r-   Únoder   r8   r   r   Úrvaluer
   Úcalleer   ÚexprÚfullnamer#   Úargsr   r    Ú#infer_type_from_right_hand_nameexprr   Ú
named_typer!   Úset_mapped_attributesr1   )
r$   r%   r(   Úmapped_attr_lookupÚupdate_cls_metadatar<   Ú	left_nodeÚpython_type_for_typeÚleft_node_proper_typeÚnew_python_type_for_types
             r>   Ú re_apply_declarative_assignmentsrX   b   sÆ  € ð BÐA°jÐAÑAÔAÐØÐà””ð Cñ Cˆõ �t�^Ñ,Ô,ñ>	å˜4œ<¨œ?­HÑ5Ô5ñ>	ð ”˜Q”Ô$Ð(:Ð:Ñ:Ý˜4œ<¨œ?Ô/µÑ5Ô5ñ ;ð œ QœÔ,ˆIà#5Ø”˜Q”Ô$ô$äð !õ %4°I´NÑ$CÔ$CÐ!õ Ð/µÑ=Ô=ñ$/å"Ð#8½+ÑFÔFñ$/õ ˜tœ{­HÑ5Ô5ñ	$/õ
 # 4¤;Ô#5µzÑBÔBñ$/õ # 4¤;Ô#5Ô#:½HÑEÔEñ$/ð œÔ*Ô/Ô4Ð@ØœÔ*Ô/Ô4Ô=Ý-ò.ð .àœÔ*Ô/Ð3GÒGÐGÝ" 4¤;Ô#3°AÔ#6½ÑAÔAð Hå" 4¤;Ô#3°AÔ#6Ô#=½wÑGÔGð Hõ Ô=ØØØ!Ø-ØœÔ(¨Ô+Ô2ñô ð )ð ,Ð7Å
Ø,­kñAô AÐ7ð ,DÐ(ð
 -ð ' t¤|°A¤Ô';Ô<ÔAð +/Ð'õ ˜yœ~­xÑ8Ô8ðà”>Ô&Ô/Õ3IÒIÐIà+Ð7Ð7Ð7Ø!$§¢Ý*Ð-AÐ,Bñ"ô "�	”ùð ð 9ÝÔ" 3¤8¨ZÑ8Ô8Ð8Ð8Ð8ð9ð 9r@   r<   r	   Úlvaluer   r=   úOptional[ProperType]rU   c                óz  — |j         }t          |t          ¦  «        sJ ‚|�)d|_        |                      t
          |g¦  «        |_        nDd|_        |                      t
          |€t          t          j	        ¦  «        gn|g¦  «        |_        t          |j        ¦  «        |_        |j        �|�||_        dS dS dS )aÞ  Apply the Mapped[<type>] annotation and right hand object to a
    declarative assignment statement.

    This converts a Python declarative class statement such as::

        class User(Base):
            # ...

            attrname = Column(Integer)

    To one that describes the final Python behavior to Mypy::

    ... format: off

        class User(Base):
            # ...

            attrname : Mapped[Optional[int]] = <meaningless temp node>

    ... format: on

    NF)rI   r2   r   Úis_inferred_defrP   r#   r8   r   r   Úspecial_formr"   rJ   )r%   r<   rY   r=   rU   rT   s         r>   r;   r;   ·   sÑ   € ð: ”€IÝ�i¥Ñ%Ô%Ð%Ð%Ð%ð Ð*Ø!&ˆÔØŸšÝ"Ð%<Ð$=ñ
ô 
ˆ	Œˆð "'ˆÔØŸšÝ"ð (Ð/õ �Ô/Ñ0Ô0Ð1Ð1à*Ð+ñ
ô 
ˆ	Œõ* -¨T¬[Ñ9Ô9€D„Kà„yÐÐ!5Ð!AØ(ˆŒ	ˆ	ˆ	ð ÐÐ!AÐ!Ar@   c           
     ó  — t          j        | |¦  «        }|€dS t          j        |¦  «        }d|j        v�r|�sd„ |D ¦   «         }|j        dd…         D ]I}d|j        vrŒt          j        ||¦  «        }|€Œ$|D ]"}|                     |j        |j	        ¦  «         Œ#ŒJg }	| 
                    ¦   «         D ]f\  }
}|€t          t          j        ¦  «        }|	                     t          t!          |
|¦  «        |t#          |¦  «        t$          ¬¦  «        ¦  «         Œgt'          || d|	t)          ¦   «         ¦  «         d|j        vr&t          j        |¦  «        rt-          || d	d¦  «         |st-          || d
d¦  «         dS dS )zCApply __init__, __table__ and other attributes to the mapped class.NÚ__init__c                ó(   — i | ]}|j         |j        “ŒS rC   )r-   r8   rD   s     r>   rG   z1add_additional_orm_attributes.<locals>.<dictcomp>  s   € ÐIÐIÐI°d˜TœY¨¬	ÐIÐIÐIr@   r   éÿÿÿÿÚ
sqlalchemy)ÚvariableÚtype_annotationÚinitializerÚkindÚ	__table__zsqlalchemy.sql.schema.Tablezsqlalchemy.orm.mapper.MapperÚ
__mapper__)r!   Úinfo_for_clsÚget_is_baseÚnamesÚmroÚmetadataÚget_mapped_attributesÚ
setdefaultr-   r8   Úitemsr   r   r]   r9   r   r   r   r   r   r   Úget_has_tableÚ _apply_placeholder_attr_to_class)r$   r%   r(   r1   Úis_baseÚmapped_attr_namesÚbaseÚbase_cls_attributesrF   Ú	argumentsr-   r0   s               r>   Úadd_additional_orm_attributesrx   ÿ   sä  € õ Ô˜S #Ñ&Ô&€Dà€|ØˆåÔ˜tÑ$Ô$€Gà˜œÐ#Ñ#¨GÑ#ØIÐI¸jÐIÑIÔIÐà”H˜Q˜r˜T”Nð 		Cð 		CˆDØ 4¤=Ð0Ð0Øå"&Ô"<¸TÀ3Ñ"GÔ"GÐØ"Ð*Øà+ð Cð C�Ø!×,Ò,¨T¬Y¸¼	ÑBÔBÐBÐBðCð ˆ	Ø*×0Ò0Ñ2Ô2ð 
	ð 
	‰IˆD�#Øˆ{Ý�iÔ4Ñ5Ô5�Ø×ÒÝÝ   s™^œ^Ø$'Ý (¨¡¤Ý&ð	ñ ô ñô ð ð õ 	˜C  j°)½W¹Y¼YÑGÔGÐGà˜$œ*Ð$Ð$­Ô);¸DÑ)AÔ)AÐ$Ý(Ø�Ð3°[ñ	
ô 	
ð 	
ð ð 
Ý(Ø�Ð4°lñ	
ô 	
ð 	
ð 	
ð 	
ð
ð 
r@   Úqualified_nameÚstrÚattrnamec                óv  — |                       |¦  «        }|r2t          |j        t          ¦  «        sJ ‚t	          |j        g ¦  «        }nt          t          j        ¦  «        }t          |¦  «        }|j	        dz   |z   |_
        |j        |_        ||_        t          t          |¦  «        |j        j        |<   d S )Nú.)Úlookup_fully_qualified_or_noner2   rI   r   r   r   r   r]   r   rM   Ú	_fullnamer1   r8   r   r   rk   )r%   r$   ry   r{   ÚsymÚtype_Úvars          r>   rr   rr   4  s¦   € ð ×
,Ò
,¨^Ñ
<Ô
<€CØ
ð 0Ý˜#œ(¥HÑ-Ô-Ð-Ð-Ð-Ý$ S¤X¨rÑ2Ô2ˆˆå�	Ô.Ñ/Ô/ˆÝ
ˆh‰-Œ-€CØ”L 3Ñ&¨Ñ1€C„MØŒx€C„HØ€C„HÝ.­t°SÑ9Ô9€C„H„N�8ÑÐÐr@   N)
r$   r   r%   r   r&   r'   r(   r)   r*   r+   )r$   r   r%   r   r(   r)   r*   r+   )r%   r   r<   r	   rY   r   r=   rZ   rU   rZ   r*   r+   )
r%   r   r$   r   ry   rz   r{   rz   r*   r+   )-Ú
__future__r   Útypingr   r   r   Ú
mypy.nodesr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   Úmypy.pluginr   Úmypy.plugins.commonr   Ú
mypy.typesr   r   r   r   r   r   r   r   Ú r    r!   rk   r"   r#   r?   rX   r;   rx   rr   rC   r@   r>   ú<module>rŠ      sÁ  ðð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à $Ð $Ð $Ð $Ð $Ð $Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 7Ð 7Ð 7Ð 7Ð 7Ð 7Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !Ø  Ð  Ð  Ð  Ð  Ð  Ø "Ð "Ð "Ð "Ð "Ð "Ø  Ð  Ð  Ð  Ð  Ð  à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -Ø )Ð )Ð )Ð )Ð )Ð )ð2ð 2ð 2ð 2ðjR9ð R9ð R9ð R9ðjE)ð E)ð E)ð E)ðP2
ð 2
ð 2
ð 2
ðj:ð :ð :ð :ð :ð :r@   