ó ÃÌ4]c@sþdZddlZddlZddlmZddlmZddlmZddlmZdd lm Z dd l m Z ddl mZ dd l m Z dd l mZdd l mZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddl mZe a!a"d„Z#d„Z$d„Z%e&d„Z'd„Z(d„Z)de*fd„ƒYZ+d e+fd!„ƒYZ,d"„Z-d#„Z.d$„Z/d%e/_0d&„Z1dS('s(Internal implementation for declarative.iÿÿÿÿN(tinstrumentationi(t clsregistryi(tevent(texc(tutil(t class_mapper(tmapper(t mapperlib(tsynonym(tQueryableAttribute(t_is_mapped_class(tInspectionAttr(tMapperProperty(tColumnProperty(tCompositeProperty(tColumn(tTable(t expression(t topologicalcCs@tj|ƒrtj|ƒSt|ƒr8t|dtƒSdSdS(Nt configure(t_DeferredMapperConfigthas_clstconfig_for_clsR RtFalsetNone(tcls((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt_declared_mapping_info%s   cCs€|tkrdSt|ddtƒr\xT|jD]"}t|ƒ}|dk r/|Sq/WdSn t|ƒ}|dk rx|S|SdS(Nt __abstract__tstrict(tobjectRt_get_immediate_cls_attrtTruet __bases__t"_resolve_for_abstract_or_classicalt"_dive_for_classically_mapped_class(Rtsupt classical((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR!0s     cCsjt|dƒrdStj|ƒ}|dk r2|Sx1|jD]"}t|ƒ}|dk r<|Sq<WdSdS(Nt_decl_class_registry(thasattrRRtmanager_of_classR R"(RtmanagerR#R((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR"Cs   cCs¨t|tƒsdSxŽ|jD]}t|dƒ}| oHt|ƒdk }||jkr||ks|r{||jkntr| r| rt ||ƒSqWdSdS(s¯return an attribute of the class that is either present directly on the class, e.g. not on a superclass, or is from a superclass but this superclass is a non-mapped mixin, that is, not a descendant of the declarative base and is also not classically mapped. This is used to detect attributes that indicate something about a mapped class independently from any mapped classes that it may inherit from. R%N( t issubclassRRt__mro__R&R"t__dict__R Rtgetattr(RtattrnameRtbaset_is_declarative_inheritst_is_classicial_inherits((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRWs  cCs^tdkr.ddlmattjfant|ddtƒrGdStj |||ƒdS(Ni(t declared_attrRR( R1RtapiRt classpropertytdeclarative_propsRRt _MapperConfigt setup_mapping(Rt classnametdict_((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt_as_declarativeys  cCsGt|tƒr?t|dtƒr;tjd||fƒntStSdS(Nt _cascadings~@declared_attr.cascading is not supported on the %s attribute on class %s. This attribute invokes for subclasses in any case.(t isinstanceR4R,RRtwarnR(tobjtnameR((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt_check_declared_props_nocascade†sR5cBsƒeZed„ƒZd„Zd„Zd„Zd„Zd„Zd„Z d„Z d„Z d „Z d „Z d „Zd „ZRS( cCsMt|ddtƒp!t|dƒ}|r3t}nt}||||ƒdS(Nt_sa_decl_prepare_nocascadeRt_sa_decl_prepare(RRR&RR5(Rtcls_R7R8t defer_maptcfg_cls((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR6•s cCsÜ||_t|ƒ|_||_d|_tjƒ|_t ƒ|_ i|_ |j ƒi|j_ |jƒtjjƒzLtj|j|jƒ|jƒ|jƒ|jƒ|jƒ|jƒWdtjjƒXdS(N(RtdictR8R7Rtpersist_selectableRt OrderedDictt propertiestsettdeclared_columnst column_copiest_setup_declared_eventst_sa_declared_attr_regt_scan_attributesRt_CONFIGURE_MUTEXtacquireRt add_classt_extract_mappable_attributest_extract_declared_columnst _setup_tablet_setup_inheritancet_early_mappingtrelease(tselfRBR7R8((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt__init__¢s&             cCs|jƒdS(N(tmap(RX((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRVÆscsptˆjdƒr6tjtdƒ‡fd†ƒ}ntˆjdƒrltjtdƒ‡fd†ƒ}ndS(Nt__declare_last__tafter_configuredcsˆjjƒdS(N(RR[((RX(sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR\Ìst__declare_first__tbefore_configuredcsˆjjƒdS(N(RR]((RX(sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR^Òs(RRRt listens_forR(RXR\R^((RXsR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRLÉs$csÈ|j‰|j}|j}d}d}}d}x_ˆjD]T}|ˆk ort|ƒdk ort|ddtƒ }| r˜|ˆk r˜|j|ƒnxôt |ƒj ƒD]à\} } | dkrþt | | ˆƒ} | r‹| sé| r‹‡fd†}q‹q«| dkr?t | | ˆƒ} | r‹| s0| r‹ˆj }q‹q«| dkrÅt | | ˆƒ} | r‹| sq| r‹ˆj }t|tttdƒfƒsªtjdƒ‚n|ˆk rÂt}qÂq‹q«|rt| tƒr«tjd|j| |ˆfƒq«q«q«|ˆk r«t| tƒr$q«q‹t| tƒrEtjd ƒ‚q‹t| tƒrut| tjƒ} | rÑ| jrÑ| |krœtjd | ˆfƒn| j| ˆƒ|| <|| <} tˆ| | ƒnn| rçtjd ƒnt ˆ| ƒ} t| t!ƒr-| j"r-t| j#tƒ r-| j$} n| || <|| R=t check_declt oldclassproptret((RsR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRNÖs–              "       cCs0t|tjƒr,tjd||fƒndS(Ns…Attribute '%s' on class %s appears to be a non-schema 'sqlalchemy.sql.column()' object; this won't be part of the declarative mapping(R;Rt ColumnClauseRR<(RXRtkeytc((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRtcscCsü|j}|j}|j}xÚt|ƒjƒD]Æ\}}t|tƒr.t||ƒ|k rdq.qô|jrt j dƒ‚qô||krôd|ko°|j p£||dj k rô|j ƒ||<}|j|_t|||ƒ|||R~tcopyt_creation_orderRm(RXR.RR8RKR>R=tcopy_((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRdls"        cCs÷|j}|j}|j}t|ddtƒ}xÀt|ƒD]²}|d krUq=n||}t|tƒr¯t|tƒr|j rt j d|jƒnt ||ƒ}nOt|t ƒrþ|j|k rþ|j|krþt|jƒ}t|||ƒnt|tƒrOt|ƒdkrOt|dttfƒrOt j d |ƒq=n„t|ttfƒsµ|jd ƒs=|j|ƒ|j|||ƒ|s¯t|||ƒq¯q=q=n|d krÓtjd ƒ‚ntj||ƒ}|||ÑtiszOn class %r, Column object %r named directly multiple times, only one will be used: %s. Consider using orm.synonym insteads, (RHtsortRJt collectionst defaultdictRIR†RfR;R RtcolumnsRttableRt_undefer_column_nameR>taddR}RˆRR<R7tjointsorted(RXRJtname_to_prop_keyR}R~tcolR>tkeys((RŒsR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRSÍs.     c Cs·|j}|j}|j}|j}|j}t|dd„ƒ}|_d}t|dƒrstj |j ƒ}nt }d|kr\|dk rªd i}} |rt |t ƒr¼|} qt |tƒrt |dt ƒrù|dd!|d}} q|}qn|jdƒ} | r't| dR~t primary_keyt append_columnt_refresh_for_new_column( RXR—RRuRJR«R~tinherited_mappertinherited_tabletinherited_persist_selectable((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRU's`                      c Csà|j}|jr!|jƒ}ni}x@dD]8}||kr.||}|jj||ƒ||          !#  !  cCsl|jƒt|jdƒr4tj|jjƒ}nt}||j|j|j|j_ }|j` |S(Nt__mapper_cls__( R¿R&RRR¢RÀRR¥R»t __mapper__RM(RXt mapper_clstmp_((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRZ®s " (Rjt __module__t classmethodR6RYRVRLRNRtRdRRRSRTRUR¿RZ(((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR5”s $   F ' 3 K ðsc3s/|]%}|ˆkrˆ|ˆˆfVqdS(N((RÑtbase_cls(t all_m_by_clstm_cls(sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pys õs( RÊtvaluesRRR)REtextendR R†RR“(RRÓR“RÒRBtclasses_for_basettuples((RÔRÕsR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRØås5' cCs)|jj|jdƒtt|ƒjƒS(N(RÊRŠRÆRtsuperRRZ(RX((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRZûs(RjRÄRRGRÊRVtpropertyRtsetterRÅRÉRRÐRRRØRZ(((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR¾s   cCs‚d|jkrkt|tƒrQt||ƒ|jj|ƒ|jj||ƒq~t|tƒrÈxO|j D]D}t|tƒrj|j dkrjt||ƒ|jj|ƒqjqjW|jj||ƒq~t|t ƒrù|jj|t j||ƒƒq~t|tƒrH|j|krHt|jƒ}|jj|t j||ƒƒq~tj|||ƒ|jjƒntj|||ƒdS(s¹add an attribute to an existing declarative class. This runs through the logic to determine MapperProperty, adds it to the Mapper, adds a column to the mapped Table, etc. RÁN(R+R;RR˜RR­RÁt add_propertyR R–R—RR RR‹R R}RRht __setattr__t_expire_memoizations(RR}RR((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt_add_attributes*    cCs–d|jkr‚||jkr‚|jj r‚|j|}t|ttttfƒrbtdƒ‚q’t j ||ƒ|jj ƒnt j ||ƒdS(NRÁs<Can't un-map individual mapped attributes on a mapped class.( R+RÁt_dispose_calledR;RR R R tNotImplementedErrorRht __delattr__Rß(RR}R((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt_del_attribute%s   cKs`t|ƒ}xM|D]E}t||ƒsDtd||jfƒ‚nt||||ƒqWdS(s=A simple constructor that allows initialization from kwargs. Sets attributes on the constructed instance using the names and values in ``kwargs``. Only keys that are present as attributes of the instance's class are allowed. These could be, for example, any mapped columns or relationships. s(%r is an invalid keyword argument for %sN(RhR&t TypeErrorRjRm(RXtkwargsRBRŽ((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt_declarative_constructor:s  RYcCs:|jdkr||_n|jdkr6||_ndS(N(R}RR>(R}tcolumn((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR˜Ps (2RsR”RÇtsqlalchemy.ormRR’RRRRtormRRÍRRRtorm.attributesR torm.baseR R torm.interfacesR torm.propertiesR RtschemaRRtsqlRRRR1R4RR!R"RRR9R?RR5RRàRäRçRjR˜(((sR/opt/alt/python27/lib64/python2.7/site-packages/sqlalchemy/ext/declarative/base.pytsL      " ÿÿ,B %