
b]c           @   s  d  Z  d d l Z d d l 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 e  a! a" d   Z# d   Z$ d   Z% e& d  Z' d   Z( d   Z) d e* f d     YZ+ d  e+ f d!     YZ, d"   Z- d#   Z. d$   Z/ d% e/ _0 d&   Z1 d S('   s(   Internal implementation for declarative.iN(   t   instrumentationi   (   t   clsregistryi   (   t   event(   t   exc(   t   util(   t   class_mapper(   t   mapper(   t	   mapperlib(   t   synonym(   t   QueryableAttribute(   t   _is_mapped_class(   t   InspectionAttr(   t   MapperProperty(   t   ColumnProperty(   t   CompositeProperty(   t   Column(   t   Table(   t
   expression(   t   topologicalc         C   s@   t  j |   r t  j |   St |   r8 t |  d t Sd  Sd  S(   Nt	   configure(   t   _DeferredMapperConfigt   has_clst   config_for_clsR
   R   t   Falset   None(   t   cls(    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   _declared_mapping_info%   s
    c         C   s   |  t  k r d  St |  d d t r\ xT |  j D]" } t |  } | d  k	 r/ | Sq/ Wd  Sn  t |   } | d  k	 rx | S|  Sd  S(   Nt   __abstract__t   strict(   t   objectR   t   _get_immediate_cls_attrt   Truet	   __bases__t"   _resolve_for_abstract_or_classicalt"   _dive_for_classically_mapped_class(   R   t   supt	   classical(    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR!   0   s    c         C   sj   t  |  d  r d  St j |   } | d  k	 r2 |  Sx1 |  j D]" } t |  } | d  k	 r< | Sq< Wd  Sd  S(   Nt   _decl_class_registry(   t   hasattrR   R    t   manager_of_classR    R"   (   R   t   managerR#   R   (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR"   C   s    c         C   s   t  |  t  s d Sx |  j D] } t | d  } | oH t |  d k	 } | | j k r | |  k s | r{ | |  j k n t r | r | r t	 | |  Sq Wd Sd S(   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
   issubclassR   R   t   __mro__R&   R"   t   __dict__R    R   t   getattr(   R   t   attrnameR   t   baset   _is_declarative_inheritst   _is_classicial_inherits(    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR   W   s    c         C   s^   t  d  k r. d d l m  a  t  t j f a n  t |  d d t rG d  St j	 |  | |  d  S(   Ni   (   t   declared_attrR   R   (
   R1   R   t   apiR   t   classpropertyt   declarative_propsR   R   t   _MapperConfigt   setup_mapping(   R   t	   classnamet   dict_(    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   _as_declarativey   s    c         C   sG   t  |  t  r? t |  d t  r; t j d | | f  n  t St Sd  S(   Nt
   _cascadings~   @declared_attr.cascading is not supported on the %s attribute on class %s.  This attribute invokes for subclasses in any case.(   t
   isinstanceR4   R,   R   R   t   warnR   (   t   objt   nameR   (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   _check_declared_props_nocascade   s    R5   c           B   s   e  Z e d     Z d   Z d   Z d   Z d   Z d   Z d   Z	 d   Z
 d   Z d	   Z d
   Z d   Z d   Z RS(   c         C   sM   t  | d d t p! t | d  } | r3 t } n t } | | | |  d  S(   Nt   _sa_decl_prepare_nocascadeR   t   _sa_decl_prepare(   R   R   R&   R   R5   (   R   t   cls_R7   R8   t	   defer_mapt   cfg_cls(    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR6      s    	c         C   s   | |  _  t |  |  _ | |  _ d  |  _ t j   |  _ t	   |  _
 i  |  _ |  j   i  |  j  _ |  j   t j j   zL t j |  j |  j   |  j   |  j   |  j   |  j   |  j   Wd  t j j   Xd  S(   N(   R   t   dictR8   R7   R   t   persist_selectableR   t   OrderedDictt
   propertiest   sett   declared_columnst   column_copiest   _setup_declared_eventst   _sa_declared_attr_regt   _scan_attributesR   t   _CONFIGURE_MUTEXt   acquireR   t	   add_classt   _extract_mappable_attributest   _extract_declared_columnst   _setup_tablet   _setup_inheritancet   _early_mappingt   release(   t   selfRB   R7   R8   (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   __init__   s&    				





c         C   s   |  j    d  S(   N(   t   map(   RX   (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRV      s    c            sp   t    j d  r6 t j t d    f d    } n  t    j d  rl t j t d    f d    } n  d  S(   Nt   __declare_last__t   after_configuredc              s     j  j   d  S(   N(   R   R[   (    (   RX   (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR\      s    t   __declare_first__t   before_configuredc              s     j  j   d  S(   N(   R   R]   (    (   RX   (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR^      s    (   R   R   R   t   listens_forR   (   RX   R\   R^   (    (   RX   s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRL      s    $c            s  |  j    |  j } |  j } d  } d  } } d  } x_  j D]T} |   k	 or t |  d  k	 or t | d d t } | r |   k	 r |  j |  n  xt	 |  j
   D]\ }	 }
 |	 d k r t |
 |	    } | r| s | r  f d   } qq |	 d k r?t |
 |	    } | r| s0| r  j } qq |	 d k rt |
 |	    } | r| sq| r  j } t | t t t d   f  st j d   n  |   k	 rt } qqq | rt |
 t  r t j d | j |	 |   f  q q q |   k	 r t |
 t  r$q qt |
 t  rEt j d	   qt |
 t  rut |
 t j  } | r|
 j r|	 | k rt j d
 |	   f  n  |
 j |
    | |	 <| |
 <} t   |	 |  nn | rt j d  n  t    |	  } t | t!  r-| j" r-t | j# t  r-| j$ } n  | | |	 <| |
 <t | t t f  r| j% d  k r|
 j& | _% qq|  j' | |	 |
  q q Wq; W| r| rd  } n  | |  _( | |  _) | |  _* d  S(   NR@   R   t   __mapper_args__c              s   t    j  S(   N(   RE   R`   (    (   R   (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   mapper_args_fn   s    t   __tablename__t   __table_args__s3   __table_args__ value must be a tuple, dict, or Nones   Regular (i.e. not __special__) attribute '%s.%s' uses @declared_attr, but owning class %s is mapped - not applying to subclass %s.s   Mapper properties (i.e. deferred,column_property(), relationship(), etc.) must be declared as @declared_attr callables on declarative mixin classes.sX   Attribute '%s' on class %s cannot be processed due to @declared_attr.cascading; skippingsJ   Use of sqlalchemy.util.classproperty on declarative classes is deprecated.(+   R   R8   RK   R   R*   R   R   R   t   _produce_column_copiest   varst   itemsR?   Rb   Rc   R;   t   tupleRE   t   typeR   t   ArgumentErrorR4   R   R<   t   __name__R   R   t   InvalidRequestErrorR3   R:   t   __get__t   setattrt   warn_deprecatedR,   R   t   _is_internal_proxyt   original_propertyt
   descriptort   doct   __doc__t   _warn_for_decl_attributest
   table_argst	   tablenameRa   (   RX   R8   RK   Ra   Ru   t   inherited_table_argsRv   R.   t   class_mappedR>   R=   t
   check_declt   oldclasspropt   ret(    (   R   s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRN      s    			
	"
				c         C   s0   t  | t j  r, t j d | | f  n  d  S(   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;   R   t   ColumnClauseR   R<   (   RX   R   t   keyt   c(    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRt   c  s    c         C   s   |  j  } |  j } |  j } x t |  j   D] \ } } t | t  r. t | |  | k	 rd q. q | j r t	 j
 d   q | | k r d | k o | j p | | d j k r | j   | | <} | j | _ t | | |  | | | <q q. q. Wd  S(   Nsv   Columns with foreign keys to other columns must be declared as @declared_attr callables on declarative mixin classes. t	   __table__(   R   R8   RK   Re   Rf   R;   R   R,   t   foreign_keysR   Rk   R>   R~   t   copyt   _creation_orderRm   (   RX   R.   R   R8   RK   R>   R=   t   copy_(    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRd   l  s"    				c         C   s  |  j  } |  j } |  j } t | d d t } xt |  D]} | d k rU q= n  | | } t | t  r t | t  r | j	 r t
 j d |  j   n  t | |  } nO t | t  r | j | k	 r | j | k r t | j  } t | | |  n  t | t  rOt |  d k rOt | d t t f  rOt
 j d	 |  q= n t | t t f  s| j d
  s= | j |  |  j | | |  | st | | |  qq= q= n | d k rt j d   n  t j | |  } | | | <q= Wd  S(   NR@   R   R   Rb   R`   s   Use of @declared_attr.cascading only applies to Declarative 'mixin' and 'abstract' classes.  Currently, this flag is ignored on mapped class %si   i    s   Ignoring declarative-like tuple value of attribute '%s': possibly a copy-and-paste error with a comma accidentally placed at the end of the line?t   __t   metadatasd   Attribute name 'metadata' is reserved for the MetaData instance when using a declarative base class.(   R   Rb   R`   (   R   R8   RH   R   R   t   listR;   R4   R1   R:   R   R<   R,   R	   t   class_R}   R   Rm   Rg   t   lenR   R   t
   startswitht   popRt   R   Rk   R   t   _deferred_relationship(   RX   R   R8   t	   our_stufft   late_mappedt   kt   valuet   prop(    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRR     sN    			
c            s  |  j      j d   f d    |  j } t j t  } xt   j    D] \ } } t | t	 t
 f  r x | j D]g } t | t  rx | j d  k rx t | |  t | t
  s | | j j |  n  | j |  qx qx WqM t | t  rM t | |  | | j j |  | j |  | | j k r?  | =q?qM qM Wx[ | j   D]M \ } } t |  d k rPt j d |  j | d j t |   f  qPqPWd  S(   NR}   c            s     |  j  S(   N(   R   (   R}   (   R   (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   <lambda>  t    i   sz   On class %r, Column object %r named directly multiple times, only one will be used: %s. Consider using orm.synonym insteads   , (   RH   t   sortRJ   t   collectionst   defaultdictRI   R   Rf   R;   R   R   t   columnsR   t   tableR   t   _undefer_column_nameR>   t   addR}   R   R   R<   R7   t   joint   sorted(   RX   RJ   t   name_to_prop_keyR}   R~   t   colR>   t   keys(    (   R   s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRS     s.    		c         C   s  |  j  } |  j } |  j } |  j } |  j } t | d d   } |  _ d  } t | d  rs t j	 | j
  } n t } d | k r\| d  k	 rd
 i  } }	 | rt | t  r | }	 qt | t  rt | d t  r | d d !| d } }	 q| } qn  | j d  }
 |
 r't |	 d <n  | | | j t |  t |  |	  | _ } qnN | j } | rx< | D]1 } | j j |  srt j d	 | j   qrqrWn  | |  _ d  S(   NR}   c         S   s   |  j  S(   N(   R   (   R~   (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR     R   t   __table_cls__R   ii    t   __autoload__t   autoloads8   Can't add additional column %r when specifying __table__(    (   R   Rv   Ru   R8   RJ   R   R   R&   R   t   unbound_method_to_callableR   R   R;   RE   Rg   t   getR   R   R   R~   t   contains_columnR   Ri   R}   t   local_table(   RX   R   Rv   Ru   R8   RJ   R   t	   table_clst   argst   table_kwR   R~   (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRT     sJ    							c   
      C   s2  |  j  } |  j } |  j } |  j } g  } xg | j D]\ } t |  } | d  k rX q4 n  t |  d  k	 r4 t | d d t	 r4 | j
 |  q4 q4 W| r t |  d k r t j d | | f   n  | d |  _ n	 d  |  _ | d  k r"|  j d  k r"t | d  r"t j d |   n|  j r.t |  j  } | j  } | j }	 | d  k r.| rpt j d   n  x | D] } | j | j k r| j | j | k rqwn  t j d	 | | | j | j f   n  | j rt j d
   n  | j |  |	 d  k	 rw|	 | k	 rw|	 j |  qwqwWq.n  d  S(   NR@   R   i   s&   Class %s has multiple mapped bases: %ri    t   __no_table__sw   Class %r does not have a __table__ or __tablename__ specified and does not inherit from an existing table-mapped class.s?   Can't place __table_args__ on an inherited class with no table.s;   Column '%s' on class %s conflicts with existing column '%s'sD   Can't place primary key columns on an inherited class with no table.(   R   R   Ru   RJ   R    R!   R   R   R   R   t   appendR   R   Rk   t   inheritsRF   Ri   R>   R~   t   primary_keyt   append_columnt   _refresh_for_new_column(
   RX   R   R   Ru   RJ   R   R~   t   inherited_mappert   inherited_tablet   inherited_persist_selectable(    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRU   '  s`    								 	c         C   s  |  j  } |  j r! |  j   } n i  } x@ d D]8 } | | k r. | | } |  j j | |  | | <q. q. Wd | k s t d   |  j r |  j | d <n  |  j r| j d t  rt |  j  } | j } d | k rRt	 g  | j
 D] } | | j k r | j ^ q  j | j pd	  | d <} | j g  |  j D] } | j ^ q9 n  x t | j    D]i \ } }	 t |	 t j  sqen  | | j k re| j | }
 t |
 t  r|	 g |
 j | | <qqeqeWn  | j   } | | d <| |  _ d  S(
   Nt   version_id_colt   polymorphic_onR   s=   Can't specify 'inherits' explicitly with declarative mappingst   concretet   exclude_propertiesRH   (   R   R   (    (   RH   Ra   RK   R   t   AssertionErrorR   R   R   R   RI   R~   t   _columntopropertyR}   t   unionR   t   difference_updateRJ   R   Rf   R;   R   t   ColumnElementt   _propsR   R   R   t   mapper_args(   RX   RH   R   R   t   vR   R   R~   R   R   t   pt   result_mapper_args(    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   _prepare_mapper_argumentsr  sB    		
 			!#	!
c         C   sl   |  j    t |  j d  r4 t j |  j j  } n t } | |  j |  j |  j  |  j _	 } |  j `
 | S(   Nt   __mapper_cls__(   R   R&   R   R   R   R   R   R   R   t
   __mapper__RM   (   RX   t
   mapper_clst   mp_(    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRZ     s    
"	(   Rj   t
   __module__t   classmethodR6   RY   RV   RL   RN   Rt   Rd   RR   RS   RT   RU   R   RZ   (    (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR5      s   	$							F	'	3	K	<R   c           B   s   e  Z e j   Z d    Z e d    Z e j d    Z e	 d    Z
 e	 d    Z e	 d    Z e	 d    Z e	 e d   Z d   Z RS(	   c         C   s   d  S(   N(    (   RX   (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRV     s    c         C   s
   |  j    S(   N(   t   _cls(   RX   (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR     s    c         C   s,   t  j | |  j  |  _ |  |  j |  j <d  S(   N(   t   weakreft   reft   _remove_config_clsR   t   _configs(   RX   R   (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR     s    c         C   s   |  j  j | d   d  S(   N(   R   R   R   (   R   R   (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR     s    c         C   s%   t  | t  o$ t j |  |  j k S(   N(   R;   Rh   R   R   R   (   R   R   (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR     s    c         C   sB   t  | d  r | j   n  t j | d d t j |   d  S(   Nt   _sa_raise_deferred_configt   msgsO   Class %s has a deferred mapping on it.  It is not yet usable as a mapped class.(   R&   R   t   orm_exct   UnmappedClassErrort   _safe_cls_name(   R   R   (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   raise_unmapped_for_cls  s    c         C   s   |  j  t j |  S(   N(   R   R   R   (   R   R   (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR     s    c            s   g  g  |  j  j   D] } | | j f ^ q D]- \ } } | d  k	 r, t | |  r, | ^ q, } | si | St d   | D    g  } x1   D])  | j    f d    j D  q Wt t	 j
 | |   S(   Nc         s   s   |  ] } | j  | f Vq d  S(   N(   R   (   t   .0t   m(    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pys	   <genexpr>  s    c         3   s/   |  ]% } |   k r   |    f Vq d  S(   N(    (   R   t   base_cls(   t   all_m_by_clst   m_cls(    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pys	   <genexpr>  s   (   R   t   valuesR   R   R)   RE   t   extendR    R   R   R   (   R   R   R   R   RB   t   classes_for_baset   tuples(    (   R   R   s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR     s    5'c         C   s)   |  j  j |  j d   t t |   j   S(   N(   R   R   R   R   t   superR   RZ   (   RX   (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRZ     s    (   Rj   R   R   RG   R   RV   t   propertyR   t   setterR   R   R   R   R   R   R   RZ   (    (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR     s   	c         C   s  d |  j  k rkt | t  rQ t | |  |  j j |  |  j j | |  q~t | t  r xO | j	 D]D } t | t  rj | j
 d k rj t | |  |  j j |  qj qj W|  j j | |  q~t | t  r |  j j | t j |  |   q~t | t  rH| j | k rHt | j  } |  j j | t j |  |   q~t j |  | |  |  j j   n t j |  | |  d S(   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;   R   R   R   R   R   t   add_propertyR   R   R   R   R   R   R   R	   R}   R   Rh   t   __setattr__t   _expire_memoizations(   R   R}   R   R   (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   _add_attribute   s*    		c         C   s   d |  j  k r | |  j  k r |  j j r |  j  | } t | t t t t f  rb t d   q t	 j
 |  |  |  j j   n t	 j
 |  |  d  S(   NR   s<   Can't un-map individual mapped attributes on a mapped class.(   R+   R   t   _dispose_calledR;   R   R   R   R	   t   NotImplementedErrorRh   t   __delattr__R   (   R   R}   R   (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   _del_attribute%  s    c         K   s`   t  |   } xM | D]E } t | |  sD t d | | j f   n  t |  | | |  q Wd S(   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(   Rh   R&   t	   TypeErrorRj   Rm   (   RX   t   kwargsRB   R   (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   _declarative_constructor:  s    
RY   c         C   s:   | j  d  k r |  | _  n  | j d  k r6 |  | _ n  d  S(   N(   R}   R   R>   (   R}   t   column(    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR   P  s    (2   Rs   R   R   t   sqlalchemy.ormR    R   R   R   R   R   t   ormR   R   R   R   R   t   orm.attributesR	   t   orm.baseR
   R   t   orm.interfacesR   t   orm.propertiesR   R   t   schemaR   R   t   sqlR   R   R   R1   R4   R   R!   R"   R   R   R9   R?   R   R5   R   R   R   R   Rj   R   (    (    (    s>   lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   <module>   sL   
			"		  ,B	%			