U aQ$@sddlmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm Z dd lm Z dd lm Z dd lm Z dd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddl m!Z!ddl m"Z"e eee efe"j#ddd d!Z$e ee"j#dd"d#d$Z%eee eeeedd%d&d'Z&e ee"j#dd"d(d)Z'ee e(e(dd*d+d,Z)dS)-)Optional)Union)nodes) ARG_NAMED_OPT)Argument)AssignmentStmt)CallExpr)ClassDef)MDEF) MemberExpr)NameExpr)StrExpr)SymbolTableNode)TempNode)TypeInfo)Var)SemanticAnalyzerPluginInterface)add_method_to_class)AnyType)get_proper_type)Instance)NoneTyp) ProperType) TypeOfAny) UnboundType) UnionType)infer)utilN)clsapiitem cls_metadatareturncCst|tr|j}nt|tr$|j}ndS|jjD]2}t|tr0t|jdtr0|jdj|kr0q|q0t |d ||dS|j dkrt |d|dSt |j }t|tttfst|j||ft|||jd|ddS)NrzCan't find mapped attribute {}zBStatement linked from _mypy_mapped_attrs has no typing information) isinstancer namer valuedefsbodyrlvaluesrZfailformattyperrrrAssertionErrormapped_attr_namesappend_apply_type_to_mapped_statement)rr r!r"r%stmtleft_hand_explicit_typer2ZC:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-nyjtotrf\sqlalchemy\ext\mypy\apply.py_apply_mypy_mapped_attr(sF     r4)rr r"r#c Cs\dd|jD}d}|jjD]}t|trt|jdtr|jdj|krt|jdjt r|jdj}||jdj}t|t r$t|j t s$t|j j tr$|j j jjjdkr$|j j jdkr$t|j jdtr$t||||j |j jdj }|dkst|t rq|||jdj<d}|d |g|_ q|rXd d |D|jdd<dS) zlFor multiple class passes, re-apply our left-hand side types as mypy seems to reset them in place. cSsi|]\}}||qSr2r2).0r%typr2r2r3 ^sz5_re_apply_declarative_assignments..Fr sqlalchemy.orm.attributes.Mapped_empty_constructorNT __sa_MappedcSsg|]\}}||fqSr2r2)r5kvr2r2r3 sz5_re_apply_declarative_assignments..)r-r'r(r$rr)r r%noderrr+rvalueZcalleer exprfullnameargsrrZ$_infer_type_from_right_hand_nameexpr named_typeitems)rr r"Zmapped_attr_lookupZupdate_cls_metadatar0 left_nodepython_type_for_typer2r2r3!_re_apply_declarative_assignmentsUsh         rG)r r0lvaluer1rFr#c Cs|j}t|tst|dk r.|d|g|_n"d|_|d|dkrFgn|g|_td}d|_ t |d}|j }t ||gtj gdg|_ dS)aApply the Mapped[] 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:: class User(Base): # ... attrname : Mapped[Optional[int]] = Nr:Fr8r9Zarg1)r>r$rr,rCr+Zis_inferred_defrr rAr r?rZARG_POS) r r0rHr1rFrEZcolumn_descriptormmZorig_call_exprr2r2r3r/s"  r/c Cst||}d|jkr|jrdd|jD}|jD]6}tj|jj d|}|jD]\}}| ||qRq2g} | D]:\} } | dkrt t j} | tt| | | t| tdqvt||d| td|jkr|jrt||dd|jrt||d d dS) zCApply __init__, __table__ and other attributes to the mapped class.__init__cSsi|]\}}||qSr2r2)r5ntr2r2r3r7sz2_add_additional_orm_attributes..Z_sa_decl_class_appliedN)variableZtype_annotationZ initializerkindZ __table__zsqlalchemy.sql.schema.Tablezsqlalchemy.orm.mapper.MapperZ __mapper__)rZ _info_for_clsnamesZ is_mappedr-Z mapped_mroDeclClassAppliedZ deserializer+metadata setdefaultrDrr special_formr.rrrrrrZ has_table _apply_placeholder_attr_to_class) rr r"infor-Z mapped_baseZbase_cls_metadatarKrL argumentsr%r6r2r2r3_add_additional_orm_attributessJ    rW)r rqualified_nameattrnamer#cCsb||}|r,t|jtstt|jg}n ttj}t |}|j |_ ||_ t t ||j j|<dS)N)Zlookup_fully_qualified_or_noner$r>rr,rrrrSrrUr+rr rO)r rrXrYsymtype_varr2r2r3rTs  rT)*typingrrZmypyrZ mypy.nodesrrrrr r r r r rrrrZ mypy.pluginrZmypy.plugins.commonrZ mypy.typesrrrrrrrrrrrPr4rGr/rWstrrTr2r2r2r3sp                              . I ; +