ó
¿b›]c           @   sm  d  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 e ƒ  Z d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ e j e ƒ d „  ƒ d e f d „  ƒ  YZ d „  Z d e f d „  ƒ  YZ d „  Z d „  Z d S(   s­   Routines to handle the string class registry used by declarative.

This system allows specification of classes and expressions used in
:func:`.relationship` using strings.

iÿÿÿÿNi   (   t   exc(   t
   inspection(   t   util(   t   class_mapper(   t
   interfaces(   t   ColumnProperty(   t   RelationshipProperty(   t   SynonymProperty(   t   _get_table_keyc         C   s  |  | j  k rN | j  |  } t | t ƒ s[ t | | g ƒ } | j  |  <q[ n | | j  |  <y | j  d } Wn+ t k
 r™ t d d ƒ | j  d <} n X| j j d ƒ } xX | r| j d ƒ } | j	 | ƒ } x | D] } | j	 | ƒ } qÚ W| j
 |  | ƒ q¯ Wd S(   s^   Add a class to the _decl_class_registry associated with the
    given declarative class.

    t   _sa_module_registryt   .i    N(   t   _decl_class_registryt
   isinstancet   _MultipleClassMarkert   KeyErrort   _ModuleMarkert   Nonet
   __module__t   splitt   popt
   get_modulet	   add_class(   t	   classnamet   clst   existingt   root_modulet   tokenst   tokent   module(    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyR   !   s     #
	R   c           B   sD   e  Z d  Z d	 Z d
 d „ Z d „  Z d „  Z d „  Z d „  Z	 RS(   sR   refers to multiple classes of the same name
    within _decl_class_registry.

    t	   on_removet   contentst   __weakref__c         C   sK   | |  _  t g  | D] } t j | |  j ƒ ^ q ƒ |  _ t j |  ƒ d  S(   N(   R   t   sett   weakreft   reft   _remove_itemR   t   _registriest   add(   t   selft   classesR   t   item(    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyt   __init__Q   s    	.c         C   s   d „  |  j  Dƒ S(   Nc         s   s   |  ] } | ƒ  Vq d  S(   N(    (   t   .0R"   (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pys	   <genexpr>Y   s    (   R   (   R&   (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyt   __iter__X   s    c         C   sz   t  |  j ƒ d k r; t j d d j | | g ƒ ƒ ‚ n; t |  j ƒ d } | ƒ  } | d  k rr t | ƒ ‚ n  | Sd  S(   Ni   sx   Multiple classes found for path "%s" in the registry of this declarative base. Please use a fully module-qualified path.R
   i    (   t   lenR   R    t   InvalidRequestErrort   joint   listR   t	   NameError(   R&   t   patht   keyR"   R   (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyt   attempt_get[   s    	c         C   sC   |  j  j | ƒ |  j  s? t j |  ƒ |  j r? |  j ƒ  q? n  d  S(   N(   R   t   removeR$   t   discardR   (   R&   R"   (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyR#   j   s
    		c         C   s™   t  g  g  |  j D] } | ƒ  ^ q D] } | d  k	 r# | j ^ q# ƒ } | j | k rv t j d | j | j f ƒ n  |  j j t j	 | |  j
 ƒ ƒ d  S(   Ns’   This declarative base already contains a class with the same class name and module name as %s.%s, and will be replaced in the string-lookup table.(   R    R   R   R   R   t   warnt   __name__R%   R!   R"   R#   (   R&   R(   R"   R   t   modules(    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyt   add_itemq   s    #(   R   R   R   N(
   R7   R   t   __doc__t	   __slots__R   R)   R+   R3   R#   R9   (    (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyR   I   s   			R   c           B   sS   e  Z d  Z d Z d „  Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z	 d „  Z
 RS(   s?   "refers to a module name within
    _decl_class_registry.

    t   parentt   nameR   t   mod_nsR1   R   c         C   si   | |  _  | |  _ i  |  _ t |  ƒ |  _ |  j  rO |  j  j |  j g |  _ n	 g  |  _ t j |  ƒ d  S(   N(   R<   R=   R   t   _ModNSR>   R1   R$   R%   (   R&   R=   R<   (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyR)   Ž   s    					c         C   s   | |  j  k S(   N(   R   (   R&   R=   (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyt   __contains__™   s    c         C   s   |  j  | S(   N(   R   (   R&   R=   (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyt   __getitem__œ   s    c         C   sS   |  j  j | d  ƒ |  j  rO |  j d  k	 rO |  j j |  j ƒ t j |  ƒ n  d  S(   N(   R   R   R   R<   R#   R=   R$   R5   (   R&   R=   (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyR#   Ÿ   s    c         C   s   t  |  j | ƒ S(   N(   t   getattrR>   (   R&   R2   (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyt   resolve_attr¥   s    c         C   s?   | |  j  k r. t | |  ƒ } | |  j  | <n |  j  | } | S(   N(   R   R   (   R&   R=   t   marker(    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyR   ¨   s
    c            s\   ˆ  ˆ j  k r, ˆ j  ˆ  } | j | ƒ n, t | g d ‡  ‡ f d †  ƒ} ˆ j  ˆ  <d  S(   NR   c              s   ˆ j  ˆ  ƒ S(   N(   R#   (    (   R=   R&   (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyt   <lambda>¶   t    (   R   R9   R   (   R&   R=   R   R   (    (   R=   R&   sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyR   °   s
    (   R<   R=   R   R>   R1   R   (   R7   R   R:   R;   R)   R@   RA   R#   RC   R   R   (    (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyR   †   s   						R?   c           B   s    e  Z d Z d „  Z d „  Z RS(   t   __parentc         C   s   | |  _  d  S(   N(   t   _ModNS__parent(   R&   R<   (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyR)   ½   s    c         C   s˜   y |  j  j | } Wn t k
 r' nQ X| d  k	 rx t | t ƒ rJ | j St | t ƒ s_ t ‚ | j	 |  j  j
 | ƒ Sn  t d |  j  j | f ƒ ‚ d  S(   Ns<   Module %r has no mapped classes registered under the name %r(   RH   R   R   R   R   R   R>   R   t   AssertionErrorR3   R1   t   AttributeErrorR=   (   R&   R2   t   value(    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyt   __getattr__À   s    (   RG   (   R7   R   R;   R)   RL   (    (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyR?   º   s   	t   _GetColumnsc           B   s    e  Z d Z d „  Z d „  Z RS(   R   c         C   s   | |  _  d  S(   N(   R   (   R&   R   (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyR)   Õ   s    c         C   sÇ   t  |  j d t ƒ} | r· | | j k rI t j d |  j | f ƒ ‚ n  | j | } | j t j k r· | j	 } t
 | t ƒ rŒ | j } q´ t
 | t ƒ s´ t j d | ƒ ‚ q´ q· n  t |  j | ƒ S(   Nt	   configures/   Class %r does not have a mapped column named %rsa   Property %r is not an instance of ColumnProperty (i.e. does not correspond directly to a Column).(   R   R   t   Falset   all_orm_descriptorsR    R-   t   extension_typeR   t   NOT_EXTENSIONt   propertyR   R   R=   R   RB   (   R&   R2   t   mpt   desct   prop(    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyRL   Ø   s     	(   R   (   R7   R   R;   R)   RL   (    (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyRM   Ò   s   	c         C   s   t  j |  j ƒ S(   N(   R   t   inspectR   (   t   target(    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyRE   ð   RF   t	   _GetTablec           B   s    e  Z d Z d „  Z d „  Z RS(   R2   t   metadatac         C   s   | |  _  | |  _ d  S(   N(   R2   RZ   (   R&   R2   RZ   (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyR)   ÷   s    	c         C   s   |  j  j t | |  j ƒ S(   N(   RZ   t   tablesR   R2   (   R&   R2   (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyRL   û   s    (   R2   RZ   (   R7   R   R;   R)   RL   (    (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyRY   ô   s   	c         C   s.   t  | t ƒ r$ | j g  |  ƒ } n  t | ƒ S(   N(   R   R   R3   RM   (   R2   RK   (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyt   _determine_containerÿ   s    t   _class_resolverc           B   s#   e  Z d  „  Z d „  Z d „  Z RS(   c         C   sM   | |  _  | |  _ | |  _ |  _ | |  _ t j |  j ƒ |  _ d |  _	 d  S(   N(    (
   R   RV   t   argt   _declarative_argt   fallbackR   t   PopulateDictt   _access_clst   _dictt
   _resolvers(   R&   R   RV   R`   R^   (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyR)     s    			c         C   sñ   |  j  } | | j k r, t | | j | ƒ S| | j j k rL | j j | S| | j j k rn t | | j ƒ Sd | j k rª | | j d k rª | j d } | j | ƒ S|  j ræ x0 |  j D]" } | | ƒ } | d  k	 r½ | Sq½ Wn  |  j
 | S(   NR	   (   R   R   R\   RZ   R[   t   _schemasRY   RC   Rd   R   R`   (   R&   R2   R   t   registryt   resolvRK   (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyRb     s"    		c         C   s…   y9 t  |  j t ƒ  |  j ƒ } t | t ƒ r4 | j S| SWnE t k
 r€ } t j	 d |  j
 j |  j | j d |  j f ƒ ‚ n Xd  S(   NsÅ   When initializing mapper %s, expression %r failed to locate a name (%r). If this is a class name, consider adding this relationship() to the %r class after both dependent classes have been defined.i    (   t   evalR^   t   globalsRc   R   RM   R   R0   R    R-   RV   R<   t   args(   R&   t   xt   n(    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyt   __call__$  s    (   R7   R   R)   Rb   Rm   (    (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyR]     s   		c            se   d d  l  } d d l m } m } | j j ƒ  ‰ ˆ j i | d 6| d 6ƒ ‡  ‡ ‡ f d †  } | S(   Niÿÿÿÿ(   t   foreignt   remoteRn   Ro   c            s   t  ˆ  ˆ ˆ |  ƒ S(   N(   R]   (   R^   (   R   R`   RV   (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyt   resolve_arg=  s    (   t
   sqlalchemyt   sqlalchemy.ormRn   Ro   t   __dict__t   copyt   update(   R   RV   Rq   Rn   Ro   Rp   (    (   R   R`   RV   sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyt	   _resolver6  s    c         C   sç   t  | t ƒ rã t |  | ƒ } xH d	 D]@ } t | | ƒ } t  | t j ƒ r% t | | | | ƒ ƒ q% q% W| j rã t  | j t ƒ rã | j \ } } xJ d
 D]? } | | k rš t  | | t j ƒ rš | | | ƒ | | <qš qš Wqã n  | S(   Nt   argumentt   order_byt   primaryjoint   secondaryjoint	   secondaryt   _user_defined_foreign_keyst   remote_sidet   foreign_keys(   Rw   Rx   Ry   Rz   R{   R|   R}   (   Ry   Rz   R{   R~   R}   Rx   (	   R   R   Rv   RB   R   t   string_typest   setattrt   backreft   tuple(   R   RV   Rp   t   attrt   vR2   t   kwargs(    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyt   _deferred_relationshipC  s4          
     
!(   R:   R!   RF   R    R   R   t   ormR   R   t   orm.propertiesR   R   R   t   schemaR   R    R$   R   t   objectR   R   R?   RM   t	   _inspectsRY   R\   R]   Rv   R†   (    (    (    sE   lib/python2.7/site-packages/sqlalchemy/ext/declarative/clsregistry.pyt   <module>   s.   		(=4
	1	