1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
U
¸ý°dêEã@sddlmZddlmZddlmZddlmZddlmZddlmZddlm    Z    ddlm
Z
dd    lm Z dd
lm Z dd lm Z dd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z"ddlm#Z#d d!l$m%Z%d d"l$m&Z&d d#l$m'Z'd d$l$m(Z(d?d&d'd(d)d*œd+d,„Z)d&d'd-d.d/d0d1œd2d3„Z*d&d'd4d/d0d5œd6d7„Z+d&d'd8d/d0d5œd9d:„Z,d&d'd0d;œd<d=„Z-d>S)@é)Ú annotations)ÚList)ÚOptional)ÚUnion)ÚAssignmentStmt)ÚCallExpr)ÚClassDef)Ú    Decorator)Ú
LambdaExpr)Ú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)ÚutilFrrÚboolz(Optional[List[util.SQLAlchemyAttribute]])ÚclsÚapiÚ is_mixin_scanÚreturncCst ||¡}|dkrdS|j d¡r(dSt ||¡}t |¡|dk    r\|sXt |||¡|Sg}|jj    sŽ|j
  ¡D]\}}t |||||ƒqrnFt  |jj    ¡D]6}t|tƒrºt||||ƒqœt|tƒrœt||||ƒqœt||ƒ|sðt |||¡t ||¡|S)NÚbuiltins)r%Ú info_for_clsÚfullnameÚ
startswithZget_mapped_attributesZestablish_as_sqlalchemyr"Z re_apply_declarative_assignmentsÚdefsÚbodyr$ÚitemsÚ_scan_symbol_table_entryZflatten_typecheckingÚ
isinstancerÚ!_scan_declarative_assignment_stmtr    Ú _scan_declarative_decorator_stmtÚ_scan_for_mapped_basesZadd_additional_orm_attributesZset_mapped_attributes)r'r(r)ÚinfoZmapped_attributesZsym_nameÚsymÚstmt©r:úUd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\sqlalchemy/ext/mypy/decl_class.pyÚ,scan_declarative_assignments_and_apply_types0sT  
þ
ÿ
ÿ
ÿ
 r<ÚstrrzList[util.SQLAlchemyAttribute]ÚNone)r'r(ÚnameÚvalueÚ
attributesr*c     Csˆt|jƒ}t|tƒsdSd}t |j¡}d}|tjtjtjtj    tj
tj hkrh|j rbt|j dƒ}nd}n²|tj kr|j s€d}nšt|j dƒ}    t|    tƒrž|    j}    t|    ttfƒr| |    j|    ¡}
|
dk    rt|
jtƒrt |
jtj¡rtt ||
jg¡tƒgƒ}nt |d |
jj¡|¡|rFd} t ||  ||j¡|¡ttjƒ}|dk    r„|jdk    s`t ‚| !tj"||jj#|jj$||j%d¡dS)zaExtract mapping information from a SymbolTableNode that's in the
    type.names dictionary.
 
    NFrTú4Column type should be a TypeEngine subclass not '{}'zØCan't infer type from attribute {} on class {}. please specify a return type from this function that is one of: Mapped[<python type>], relationship[<target class>], Column[<TypeEngine>], MapperProperty[<python type>]©r?ÚlineÚcolumnÚtypr7)&rÚtyper3rr$Útype_id_for_named_nodeÚMAPPEDÚ RELATIONSHIPÚCOMPOSITE_PROPERTYÚMAPPER_PROPERTYÚSYNONYM_PROPERTYÚCOLUMN_PROPERTYÚargsÚCOLUMNrrÚlookup_qualifiedr?ÚnodeÚhas_base_type_idÚ
TYPEENGINEr r#Ú#extract_python_type_from_typeenginerr%ÚfailÚformatr-rrÚ special_formÚAssertionErrorÚappendÚSQLAlchemyAttributerDrEr7) r'r(r?r@rAZ
value_typeÚleft_hand_explicit_typeÚtype_idÚerrÚtypeengine_argr8Úmsgr:r:r;r2ssz
 
 ú ÿ
ÿüÿ    ÿüÿ
 
ûÿr2r    )r'r(r9rAr*c    Csv|jD](}t|tttfƒrt |¡tjkrq4qdS|jj     
|¡}d}t   |j ¡ršttjƒ}t|jj ƒ}|j|_t|gt|ƒƒ}    |jj|    _|    |jj    |<dSt|jjtƒr¢|jjj}
t|
tƒrÎt |
||¡} ndS| tjtjtjtjtjtj hkr |
j!r t"|
j!dƒ}n–| tj#kr¢|
j!r¢|
j!d} t| tƒr¢| $| j | ¡} | dk    r¢t| jt%ƒr¢t &| jtj'¡rŠt(t) *|| jg¡t+ƒgƒ}nt  ,|d -| jj.¡|
¡|dkrÒd}t  ,|| -|jj ¡|¡ttjƒ}t|jj ƒ}|j|_t|tƒrt"t  /||¡ƒ}| 0tj1|g¡|j_t 2t3|jj4|jj    ƒ¡}t|g|ƒ}    |jj|    _| 5t j6|j |j7|j8||j9d¡|    |jj    |<dS)a°Extract 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]]
 
    NrrBzàCan't infer type from @declared_attr on function '{}';  please specify a return type from this function that is one of: Mapped[<python type>], relationship[<target class>], Column[<TypeEngine>], MapperProperty[<python type>]rC):Z
decoratorsr3r r rr$rHZ DECLARED_ATTRr/r0Úindexr%Zname_is_dunderr?rrrXÚvarrRrrrGÚfuncrZret_typerZtype_id_for_unbound_typerIrJrKrLrMrNrOrrPrQrrSrTr r#rUrrVrWr-Zunbound_to_instanceZ
named_typeZNAMED_TYPE_SQLA_MAPPEDZexpr_to_mapped_constructorr
Ú    argumentsrZr[rDrEr7)r'r(r9rAÚdecZ    dec_indexr\Zany_Z    left_nodeZnew_stmtZ    func_typer]r_r8r`Úrvaluer:r:r;r5Ís®
ÿþ 
 
 
 
úÿÿ
ö 
 ÿüÿ    ÿü
ÿ
 
ÿÿ ÿ 
ûÿ    r5rc     Csˆ|jd}t|tƒsdS|jj |j¡}|dk    s4t‚|j}t|t    ƒrHdS||jksVt‚t|t
ƒsdt‚|jdkrŽ|  |j ¡dkrŠt  |j¡dS|jdkr¦t  |j¡nd|j d¡r¶dS|jdkr
t|j tƒsÞt  |d|¡n,|j jD]"}t|ttfƒræt ||||¡qæd}d}    |js&|jdkr–t|jtƒrÜ|j}    |jjd    krÜ| d    |¡}
|
dk    rÜ|
jdk    rÜt |
j¡tjkrÜt|jjdƒ}    |j}nFt|jƒ} t| tƒrÔt | j¡tjkrÔt| jdƒ}    | }n| }    d}t|j t ƒrú|dk    rú|    } nHt|j t!ƒr>t|j j"t#ƒr>t$ %||||    |j j"¡} | dkrBdSndS| dk    sPt‚| &t j'|j|j(|j)| |jd
¡t *||||    | ¡dS) zZExtract mapping information from an assignment statement in a
    declarative class.
 
    rNZ __abstract__TZ __tablename__Ú__Z_mypy_mapped_attrsz+_mypy_mapped_attrs is expected to be a listZMappedrC)+Zlvaluesr3r r7r$Úgetr?rYrRrrZ
parse_boolrfr%Z set_is_baseZ set_has_tabler.r rVr1rr"Zapply_mypy_mapped_attrZ is_inferredrGrrQrHrIrrOrrrZcalleerr#Z#infer_type_from_right_hand_nameexprrZr[rDrEZapply_type_to_mapped_statement) r'r(r9rAZlvaluer8rRÚitemZleft_hand_mapped_typer\Z
mapped_symZ    node_typeZpython_type_for_typer:r:r;r4isª
 
 
 
 
 
     ÿþ
ÿý
ÿ
ÿþÿÿ
ûÿ
ûr4)r'r(r*cCsNt ||¡}|dkrdS|jdd…D]"}|j d¡r8q&t|j|ddq&dS)zèGiven 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.
 
    Nr!éÿÿÿÿr+T)r))r%r,Úmror-r.r<Zdefn)r'r(r7Z    base_infor:r:r;r6ìs  ÿr6N)F).Ú
__future__rÚtypingrrrZ
mypy.nodesrrrr    r
r r r rrrrrrrrZ mypy.pluginrZ
mypy.typesrrrrrrrrrr Úr"r#r$r%r<r2r5r4r6r:r:r:r;Ú<module>sT                                   ýCZ