ó
H`¾Tc           @   sR  d  Z  d d l m Z m Z d d l m Z m Z m Z d d l m	 Z	 d d l
 m Z m Z d d l m Z d d l m Z d d l m Z 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 Z d d l Z d „  Z d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d „  Z  d „  Z! d e! _" d „  Z# d S(   s(   Internal implementation for declarative.i   (   t   Tablet   Column(   t   mappert   class_mappert   synonym(   t   MapperProperty(   t   ColumnPropertyt   CompositeProperty(   t   QueryableAttribute(   t   _is_mapped_class(   t   utilt   exc(   t   topological(   t
   expression(   t   eventi   (   t   clsregistryiÿÿÿÿNc         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(    (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   _declared_mapping_info   s
    c   )         s‘
  d d l  m } t | ƒ } i  } i  } d  } d  } } d  }	 | t j f }
 xuˆ j D]j} t | d ƒ } d | j k rŸ t	 j
 t d ƒ ‡ f d †  ƒ } n  d | j k rÒ t	 j
 t d ƒ ‡ f d	 †  ƒ } n  d
 | j k r| j r| ˆ k s| ˆ j k r| rd  Sn  t | ƒ d  k	 } x™t | ƒ j ƒ  D]…\ } } | d k r‚| r½| smt | |
 ƒ r½‡ f d †  } q½q8| d k rº|	 r½| s«t | |
 ƒ r½ˆ j }	 q½q8| d k r7| r½| sãt | |
 ƒ r½ˆ j } t | t t t d  ƒ f ƒ st j d ƒ ‚ n  | ˆ k	 r4t } q4q½q8| rut | |
 ƒ r8t j d | j | | ˆ f ƒ q8q8q8| ˆ k	 r8t | t ƒ r5t ˆ | ƒ | k	 r«q8n  | j rÆt j d ƒ ‚ n  | | k rºd | k o÷| j pê| | d j  k rº| | k rº| j! ƒ  | | <| | <| j" | | _" qºq½t | t# ƒ rVt j d ƒ ‚ q½t | |
 ƒ r½t ˆ | ƒ | | <} | | <t | t t# f ƒ rº| j$ d  k rº| j% | _$ qºq½q8q8WqW Wx$ | j ƒ  D] \ } } | | | <qÒW| r|	 rd  } n  t& j' | ˆ ƒ t j( ƒ  ‰  xut) | ƒ D]g} | d) k rCq+n  | | } t | |
 ƒ rnt ˆ | ƒ } nO t | t* ƒ r½| j+ ˆ k	 r½| j, | k r½t- | j, ƒ } t. ˆ | | ƒ n  t | t ƒ rt/ | ƒ d k rt | d t t# f ƒ rt j d | ƒ q+n  t | t t# f ƒ sX| j0 d ƒ s+| j1 | ƒ t. ˆ | | ƒ q+q+n  | d k rvt j d ƒ ‚ n  t& j2 ˆ | ƒ } | ˆ  | <q+Wˆ  j3 d ‡  f d †  ƒ t4 ƒ  } t5 j6 t4 ƒ } xt) ˆ  j ƒ  ƒ D]ò \ } } t | t7 t8 f ƒ rsxÎ | j9 D]g } t | t ƒ r| j: d  k rt; | | ƒ t | t8 ƒ s\| | j j< | ƒ n  | j< | ƒ qqWqÚt | t ƒ rÚt; | | ƒ | | j j< | ƒ | j< | ƒ | | j, k rÌˆ  | =qÌqÚqÚWxX | j ƒ  D]J \ } } t/ | ƒ d k rÝt j d | | d j= t> | ƒ ƒ f ƒ qÝqÝWt> | d d „  ƒ} d  } t ˆ d ƒ rjt j? ˆ j@ ƒ } n tA } d | k rS|	 d  k	 r¡d* i  } } | rüt | t ƒ r³| } qüt | t ƒ rüt | d t ƒ rð| d d !| d } } qù| } qün  | jB d  ƒ }  |  rt | d! <n  | |	 ˆ jC t | ƒ t | ƒ | Ž ˆ _D } q¡nN ˆ jD } | r¡x< | D]1 } | j  jE | ƒ sit j d" | j, ƒ ‚ qiqiWn  t ˆ d# ƒ rÅt j? ˆ jF ƒ }! n t }! x3 ˆ j D]" } t | ƒ d  k	 rÕ| }" PqÕqÕWd  }" | d  k r/	|" d  k r/	t j d$ ˆ ƒ ‚ n|" r5
t |" ƒ }# |# jG }$ |# jH }% | d  k r5
| rw	t j d% ƒ ‚ n  x¸ | D]­ } | jI rŸ	t j d& ƒ ‚ n  | j |$ j  k rö	|$ j  | j | k rÍ	q~	n  t j d' | ˆ |$ j  | j f ƒ ‚ n  |$ jJ | ƒ |% d  k	 r~	|% |$ k	 r~	|% jK | ƒ q~	q~	Wq5
n  t ˆ d( ƒ }& |& rS
tL }' n tM }' |' |! ˆ | |" | | ˆ  | ƒ }( |& s
|( jN ƒ  n  d  S(+   Ni   (   t   declared_attrt   _decl_class_registryt   __declare_last__t   after_configuredc              s   ˆ  j  ƒ  d  S(   N(   R   (    (   R   (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   go6   s    t   __declare_first__t   before_configuredc              s   ˆ  j  ƒ  d  S(   N(   R   (    (   R   (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR   :   s    t   __abstract__t   __mapper_args__c              s   t  ˆ  j ƒ S(   N(   t   dictR    (    (   R   (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   <lambda>P   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.sv   Columns with foreign keys to other columns must be declared as @declared_attr callables on declarative mixin classes. t	   __table__s”   Mapper properties (i.e. deferred,column_property(), relationship(), etc.) must be declared as @declared_attr callables on declarative mixin classes.i    s€   Ignoring declarative-like tuple value of attribute %s: possibly a copy-and-paste error with a comma left at the end of the line?t   __t   metadatasd   Attribute name 'metadata' is reserved for the MetaData instance when using a declarative base class.t   keyc            s   ˆ  |  j  S(   N(   t   _creation_order(   R(   (   t	   our_stuff(    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR"   ¿   s    sV   On class %r, Column object %r named directly multiple times, only one will be used: %ss   , c         S   s   |  j  S(   N(   R)   (   t   c(    (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR"   â   s    t   __table_cls__iÿÿÿÿt   __autoload__t   autoloads8   Can't add additional column %r when specifying __table__t   __mapper_cls__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.sD   Can't place primary key columns on an inherited class with no table.s;   Column '%s' on class %s conflicts with existing column '%s't   _sa_decl_prepare(   s	   __table__s   __tablename__s   __mapper_args__(    (O   t   apiR   R!   R   R
   t   classpropertyt   __mro__t   hasattrt   __dict__R   t   listens_forR   R   t	   __bases__R   t   varst   itemst
   isinstanceR#   R$   t   tuplet   typeR   t   ArgumentErrort   Truet   warnt   __name__R   t   getattrt   foreign_keyst   InvalidRequestErrort   nameR+   t   copyR)   R   t   doct   __doc__R   t	   add_classt   OrderedDictt   listR   t   class_R(   R   t   setattrt   lent
   startswitht   popt   _deferred_relationshipt   sortt   sett   collectionst   defaultdictR   R   t   columnst   tablet   _undefer_column_namet   addt   joint   sortedt   unbound_method_to_callableR,   R    t   getR'   R%   t   contains_columnR/   t   local_tablet   mapped_tablet   primary_keyt   append_columnt   _refresh_for_new_columnR   t   _MapperConfigt   map()   R   t	   classnamet   dict_R   t   column_copiest   potential_columnst   mapper_args_fnt
   table_argst   inherited_table_argst	   tablenamet   declarative_propst   baset   _is_declarative_inheritsR   t   class_mappedRD   t   objt   rett   kt   vt   valuet   propt   declared_columnst   name_to_prop_keyR(   R+   t   colt   keysRV   t	   table_clst   argst   table_kwR.   t
   mapper_clst   inheritst   inherited_mappert   inherited_tablet   inherited_mapped_tablet	   defer_mapt   cfg_clst   mt(    (   R*   R   se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   _as_declarative#   sŒ   
$$				
!		'						 		Rc   c           B   s)   e  Z d Z d  „  Z d „  Z d „  Z RS(   c	   	      C   sL   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ | |  _ d  S(   N(   R~   R   R^   R   t
   propertiesRi   Rw   Rg   (	   t   selfR~   R   RV   R   Rw   Rg   R‡   Ri   (    (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   __init__P  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 r@t	 g  | j
 D] } | | j k rè | j ^ qè ƒ | d <} | j g  |  j D] } | j ^ q'ƒ n  x€ t | j ƒ  ƒ D]i \ } }	 t |	 t j ƒ swqSn  | | j k rS| j | }
 t |
 t ƒ r¼|	 g |
 j | | <q¼qSqSWn  | j ƒ  } | | d <| S(	   Nt   version_id_colt   polymorphic_onR   s=   Can't specify 'inherits' explicitly with declarative mappingst   concretet   exclude_propertiesR‡   (   RŠ   R‹   (   R‡   Ri   Rg   R\   t   AssertionErrorR   R   R   R^   RR   R+   t   _columntopropertyR(   t   difference_updateRw   RJ   R9   R:   R   t   ColumnElementt   _propsR   RU   RE   (   Rˆ   R‡   t   mapper_argsRs   Rt   R€   R   R+   R   Ry   t   pt   result_mapper_args(    (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   _prepare_mapper_arguments`  s<    		
 			)#!
c         C   s1   |  j  ƒ  } |  j |  j |  j |  |  j _ d  S(   N(   R–   R~   R   R^   t
   __mapper__(   Rˆ   R“   (    (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRd   –  s
    N(   R@   t
   __module__R   R_   R‰   R–   Rd   (    (    (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRc   L  s   		6R   c           B   s}   e  Z e j ƒ  Z e d  „  ƒ Z e j d „  ƒ Z e d „  ƒ Z	 e d „  ƒ Z
 e d „  ƒ Z e e d „ ƒ Z d „  Z RS(   c         C   s
   |  j  ƒ  S(   N(   t   _cls(   Rˆ   (    (    se   /var/www/send.findwatt.com/datamanager/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(   Rˆ   RK   (    (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR   ¦  s    c         C   s   |  j  j | d  ƒ d  S(   N(   R   RO   R   (   R   R›   (    (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRœ   «  s    c         C   s%   t  | t ƒ o$ t j | ƒ |  j k S(   N(   R:   R<   Rš   R›   R   (   R   RK   (    (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR   ¯  s    c         C   s   |  j  t j | ƒ S(   N(   R   Rš   R›   (   R   RK   (    (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR   µ  s    c            s¤   g  |  j  j ƒ  D] } t | j | ƒ r | ^ q } | s> | St d „  | Dƒ ƒ ‰ g  } x1 ˆ D]) ‰  | j ‡  ‡ f d †  ˆ  j Dƒ ƒ qa Wt t j	 | | ƒ ƒ S(   Nc         s   s   |  ] } | j  | f Vq d  S(   N(   R   (   t   .0t   m(    (    se   /var/www/send.findwatt.com/datamanager/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   m_clst   all_m_by_cls(    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pys	   <genexpr>È  s   (
   R   t   valuest
   issubclassR   R!   t   extendR7   RJ   R   RQ   (   R   R    RQ   RŸ   t   classes_for_baset   tuples(    (   R¡   R¢   se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR¦   ¹  s     c         C   s-   |  j  j |  j d  ƒ t t |  ƒ j ƒ  d  S(   N(   R   RO   R™   R   t   superR   Rd   (   Rˆ   (    (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRd   Ó  s    (   R@   R˜   R
   RI   R   t   propertyR   t   settert   classmethodRœ   R   R   R>   R¦   Rd   (    (    (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyR   Ÿ  s   c         C   su  d |  j  k r^t | t ƒ rQ t | | ƒ |  j j | ƒ |  j j | | ƒ qqt | t ƒ rÈ xO | j	 D]D } t | t ƒ rj | j
 d k rj t | | ƒ |  j j | ƒ qj qj W|  j j | | ƒ qqt | t ƒ rù |  j j | t j |  | ƒ ƒ qqt | t ƒ rH| j | k rHt | j ƒ } |  j j | t j |  | ƒ ƒ qqt 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(   R5   R:   R   RW   R%   Ra   R—   t   add_propertyR   RU   RV   R   R   R   RP   R   R(   R   R<   t   __setattr__(   R   R(   Ru   Ry   (    (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   _add_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(   R<   R4   t	   TypeErrorR@   RL   (   Rˆ   t   kwargst   cls_Rs   (    (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   _declarative_constructorþ  s    
R‰   c         C   s:   | j  d  k r |  | _  n  | j d  k r6 |  | _ n  d  S(   N(   R(   R   RD   (   R(   t   column(    (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyRW     s    ($   RG   t   schemaR    R   t   ormR   R   R   t   orm.interfacesR   t   orm.propertiesR   R   t   orm.attributesR   t   orm.baseR	   t    R
   R   R   t   sqlR   R   R   RS   Rš   R   R†   t   objectRc   R   R®   R²   R@   RW   (    (    (    se   /var/www/send.findwatt.com/datamanager/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.pyt   <module>   s,   		ÿ *S9	&		