U aB@s ddlmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm Z dd lm Z dd lm Z dd lm Z dd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddl"m#Z#dd l"m$Z$dd!l"m%Z%dd"l"m&Z&d3eee'ee&j(d$d%d&Z)eee*ee&j(d'd(d)d*Z+eee e&j(d'd+d,d-Z,eeee&j(d'd+d.d/Z-eee&j(d'd0d1d2Z.d'S)4)Optional)Union)nodes)AssignmentStmt)CallExpr)ClassDef) Decorator)ListExpr) MemberExpr)NameExpr)PlaceholderNode)RefExpr)StrExpr) SymbolNode)SymbolTableNode)TempNode)TypeInfo)Var)SemanticAnalyzerPluginInterface)AnyType) CallableType)get_proper_type)Instance)NoneType) ProperType)Type) TypeOfAny) UnboundType) UnionType)apply)infer)names)utilF)clsapi is_mixin_scanreturncCst||}|dkrdS|jdr(dSd|jkrftj|jd|}|sb|jsTtt ||||St| dgg}|j j s|j D]\}}t|||||qnFt|j j D]6}t|trt||||qt|trt||||qt||||s t |||||jd<|S)NbuiltinsZ_sa_decl_class_appliedF)r# _info_for_clsfullname startswithmetadataDeclClassAppliedZ deserialize is_mappedAssertionErrorr Z!_re_apply_declarative_assignmentsdefsbodyr"items_scan_symbol_table_entryZ_flatten_typechecking isinstancer!_scan_declarative_assignment_stmtr _scan_declarative_decorator_stmt_scan_for_mapped_basesZ_add_additional_orm_attributes serialize)r$r%r&info cls_metadataZsym_namesymstmtr=_C:\Users\vtejo\AppData\Local\Temp\pip-unpacked-wheel-nyjtotrf\sqlalchemy\ext\mypy\decl_class.py-_scan_declarative_assignments_and_apply_types-s8       r?N)r$r%namevaluer:r'c Csdt|j}t|tsdSd}t|j}d}|tjtjtjtj tj tj hkrh|j rbt|j d}nd}n|tj kr|j sd}nt|j d} t| tr| j} t| ttfr|| j| } | dk rt| jtrt| jtjrtt|| jgtg}nt|d| jj||rFd} t|| ||j|ttj}|dk r`|j !||fdS)zaExtract mapping information from a SymbolTableNode that's in the type.names dictionary. NFrT4Column type should be a TypeEngine subclass not '{}'zCan't infer type from attribute {} on class {}. please specify a return type from this function that is one of: Mapped[], relationship[], Column[], MapperProperty[])"rtyper4rr"_type_id_for_named_nodeMAPPED RELATIONSHIPCOMPOSITE_PROPERTYMAPPER_PROPERTYSYNONYM_PROPERTYCOLUMN_PROPERTYargsCOLUMNrrlookup_qualifiedr@node_has_base_type_id TYPEENGINErr!$_extract_python_type_from_typeenginerr#failformatr*rr special_formmapped_attr_namesappend) r$r%r@rAr:Z value_typeleft_hand_explicit_typetype_iderrtypeengine_argr;msgr=r=r>r3gsh        r3)r$r%r<r:r'cCs:|jD](}t|tttfrt|tjkrq4qdS|jj |}d}t|j j t rJ|j j j}t|trzt|||}ndS|tjtjtjtjtjtjhkr|jrt|jd}n|tjkrJ|jrJ|jd} t| trJ|| j| } | dk rJt| jtrJt| jtjr2t t!"|| jgt#g}nt$%|d&| jj'||dkrzd} t$%|| &|j(j|t)t*j+}t|j(j} |j(| _t|trtt$,||}|-d|g| j_ t.d} d| _'t.| d}t./|j j0|j j }t1||gt.j2gdg}t3| g|}| jj |_ |j45| j|f||jj |<dS) aExtract mapping information from a @declared_attr in a declarative class. E.g.:: @reg.mapped class MyClass: # ... @declared_attr def updated_at(cls) -> Column[DateTime]: return Column(DateTime) Will resolve in mypy as:: @reg.mapped class MyClass: # ... updated_at: Mapped[Optional[datetime.datetime]] NrrBzCan't infer type from @declared_attr on function '{}'; please specify a return type from this function that is one of: Mapped[], relationship[], Column[], MapperProperty[]Z __sa_Mappedz sqlalchemy.orm.attributes.MappedZ_empty_constructorZarg1)6Z decoratorsr4r r rr"rDZ DECLARED_ATTRr0r1indexfuncrCrZret_typerZ_type_id_for_unbound_typerErFrGrHrIrJrKrrLrMr@rNrrOrPrr!rQrr#rRrSr*varrrrTZ_unbound_to_instanceZ named_typerZ LambdaExpr argumentsrZARG_POSrrUrV)r$r%r<r:decZ dec_indexrWZ func_typerXrZr;r[Z left_nodeZcolumn_descriptormmargrvalueZnew_stmtr=r=r>r6s                 r6c Csl|jd}t|tsdS|jj|j}|dk s4t|j}t|t rHdS||jksVtt|t sdt|jdkr| |j dkrd|_ dS|jdkrd|_nd|jdrdS|jdkrt|j tst|d |n,|j jD]"}t|ttfrt||||qd}d} |js|jdkrt|jtr|j} |jjd kr|d |} | dk r| jdk rt| jtjkrt|jjd} |j}nFt|j} t| trt| jtjkrt| jd} | }n| } d}t|j t r|dk r| } nHt|j t!r2t|j j"t#r2t$%|||| |j j"} | dkr6dSndS| dk sDt|j&'|j| ft(|||| | dS) zZExtract mapping information from an assignment statement in a declarative class. rNZ __abstract__TFZ __tablename____Z_mypy_mapped_attrsz+_mypy_mapped_attrs is expected to be a listZMapped))Zlvaluesr4r r9r"getr@r/rNr rZ parse_boolrcr.Z has_tabler+r r#rRr2rr Z_apply_mypy_mapped_attrZ is_inferredrCrrMrDrErrKrrrZcalleer r!Z$_infer_type_from_right_hand_nameexprrUrVZ_apply_type_to_mapped_statement) r$r%r<r:Zlvaluer;rNitemZleft_hand_mapped_typerWZ mapped_symZ node_typeZpython_type_for_typer=r=r>r5Is               r5)r$r%r:r'cCsnt||}t|j}|rj|d}|jjdr4qt|jj |dd}|dk rZ|j || |jjqdS)zGiven a class, iterate through its superclass hierarchy to find all other classes that are considered as ORM-significant. Locates non-mapped mixins and scans them for mapped attributes to be applied to subclasses. rr(T)r&N) r#r)listbasespoprCr*r+r?ZdefnZ mapped_mrorVextend)r$r%r:r9Z baseclassesbaseZbase_decl_class_appliedr=r=r>r7s    r7)F)/typingrrZmypyrZ mypy.nodesrrrrr r r r r rrrrrrZ mypy.pluginrZ mypy.typesrrrrrrrrrrr r!r"r#boolr-r?strr3r6r5r7r=r=r=r>s                                  ; R  |