ó
[³XMc        	   @   sB  d  Z  d d l Z d d l Z d d l Z d d l Z d d l Z d d l Z d d l m Z m	 Z	 d d l
 m Z d d( d „  ƒ  YZ d e f d „  ƒ  YZ d	 e f d
 „  ƒ  YZ d e f d „  ƒ  YZ d d) d „  ƒ  YZ d d* d „  ƒ  YZ e ƒ  Z e j e j e j e j e j e j e j e j e j g	 Z y e j e j ƒ Wn e k
 r[n Xd d+ d „  ƒ  YZ  d d, d „  ƒ  YZ! d d- d „  ƒ  YZ" d d. d „  ƒ  YZ# d „  Z$ d e% f d „  ƒ  YZ& e j' d ƒ Z( d „  Z) d „  Z* d „  Z+ d  „  Z, d! „  Z- d" d/ d# „  ƒ  YZ. d$ „  Z/ d d% „ Z1 d& d0 d' „  ƒ  YZ2 d S(1   s|   
AOT: Abstract Object Trees
The source-code-marshallin'est abstract-object-serializin'est persister
this side of Marmalade!
iÿÿÿÿN(   t   reflectt   log(   t   crefutilt   Namedc           B   s   e  Z d  „  Z RS(   c         C   s   | |  _  d  S(   N(   t   name(   t   selfR   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt   __init__   s    (   t   __name__t
   __module__R   (    (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR      s   t   Classc           B   s   e  Z d  „  Z RS(   c         C   s   d |  j  S(   Ns	   Class(%r)(   R   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt	   getSource   s    (   R   R   R
   (    (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR	      s   t   Functionc           B   s   e  Z d  „  Z RS(   c         C   s   d |  j  S(   Ns   Function(%r)(   R   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR
   #   s    (   R   R   R
   (    (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR   "   s   t   Modulec           B   s   e  Z d  „  Z RS(   c         C   s   d |  j  S(   Ns
   Module(%r)(   R   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR
   '   s    (   R   R   R
   (    (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR   &   s   t   InstanceMethodc           B   s   e  Z d  „  Z d „  Z RS(   c         C   s_   t  | t ƒ p* t  | t ƒ p* t  | t ƒ s@ t d | ƒ ‚ n  | |  _ | |  _ | |  _ d  S(   Ns$   %s isn't an Instance, Ref, or Deref!(   t
   isinstancet   Reft   Instancet   Dereft	   TypeErrorR   t   klasst   instance(   R   R   R   t   inst(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR   ,   s
    -		c         C   s    d |  j  |  j t |  j ƒ f S(   Ns   InstanceMethod(%r, %r, 
 %s)(   R   R   t   prettifyR   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR
   3   s    (   R   R   R   R
   (    (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR   +   s   	t   _NoStateObjc           B   s   e  Z RS(    (   R   R   (    (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR   7   s   R   c           B   s   e  Z e d  „ Z d „  Z RS(   c         K   se   t  | t j ƒ s% t d | ƒ ‚ n  | |  _ | t k	 rO | |  _ d |  _ n | |  _ d |  _ d  S(   Ns   %s isn't a string!i    i   (   R   t   typest
   StringTypeR   R   t
   NoStateObjt   statet   stateIsDict(   R   t	   classNamet   __stateObj__R   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR   F   s    			c         C   sÀ   |  j  r |  j } n? t |  j t ƒ rN t |  j j t j ƒ rN |  j j } n d  } | d  k	 r¦ y d |  j t	 | ƒ f SWq¦ t
 k
 r¢ d |  j t | ƒ f SXn  d |  j t |  j ƒ f S(   Ns   Instance(%r, %s)(   R   R   R   R   t   objR   t   DictTypet   NoneR   t   dictToKWt   NonFormattableDictR   (   R   t	   stateDict(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR
   Q   s    	*(   R   R   R   R   R
   (    (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR   E   s   R   c           B   s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c         G   sN   t  | ƒ d k r/ | d |  _ | d |  _ n | sJ d  |  _ d  |  _ n  d  S(   Ni   i    i   (   t   lent   refnumR   R!   (   R   t   args(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR   b   s    	c         C   s2   |  j  r% t d | |  j  f ƒ ‚ n  | |  _  d  S(   Ns&   Error setting id %s, I already have %s(   R&   t
   ValueError(   R   t   num(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt   setRefk   s    	c         C   s2   |  j  r% t d | |  j  f ƒ ‚ n  | |  _  d  S(   Ns'   Error setting obj %s, I already have %s(   R   R(   (   R   R   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt   setObjp   s    	c         C   sN   |  j  d  k r t d ƒ ‚ n  |  j rA d |  j t |  j  ƒ f St |  j  ƒ S(   Ns7   Don't try to display me before setting an object on me!s   Ref(%d, 
 %s)(   R   R!   t   RuntimeErrorR&   R   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR
   u   s
    	(   R   R   R   R*   R+   R
   (    (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR   `   s   				R   c           B   s    e  Z d  „  Z d „  Z e Z RS(   c         C   s   | |  _  d  S(   N(   R&   (   R   R)   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR   ~   s    c         C   s   d |  j  S(   Ns	   Deref(%d)(   R&   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR
      s    (   R   R   R   R
   t   __repr__(    (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR   }   s   		t   Copyregc           B   s   e  Z d  „  Z d „  Z RS(   c         C   s   | |  _  | |  _ d  S(   N(   t   loadfuncR   (   R   R/   R   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR   ˆ   s    	c         C   s   d |  j  t |  j ƒ f S(   Ns   Copyreg(%r, %s)(   R/   R   R   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR
   Œ   s    (   R   R   R   R
   (    (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR.   ‡   s   	c         C   s   t  d t |  ƒ ƒ S(   sD   Pass me an AO, I'll return a nicely-formatted source representation.s   app = (   t	   indentifyR   (   t   ao(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR
   –   s    R#   c           B   s   e  Z d  Z RS(   s&   A dictionary was not formattable.
    (   R   R   t   __doc__(    (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR#   ›   s   s   [a-zA-Z_][a-zA-Z0-9_]*$c         C   s§   g  } |  j  ƒ  } | j ƒ  xx | D]p \ } } t | t j ƒ sT t d | ƒ ‚ n  t j | ƒ sv t d | ƒ ‚ n  | j d | t	 | ƒ f ƒ q# Wt
 j | d ƒ S(   Ns   %r ain't a strings   %r ain't an identifiers   
 %s=%s,t    (   t   itemst   sortR   R   R   R#   t   rt   matcht   appendR   t   stringt   join(   t   dt   outR4   t   kt   v(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR"   ¡   s    
c         C   sº  t  |  d ƒ r |  j ƒ  St |  ƒ } | t k r; t |  ƒ S| t j k rÂ d g } x= |  j ƒ  D]/ \ } } | j d t	 | ƒ t	 | ƒ f ƒ q` W| j t
 |  ƒ r« d p® d ƒ t j | d ƒ S| t j k r1d g } x% |  D] } | j d t	 | ƒ ƒ qá W| j t
 |  ƒ rd	 pd
 ƒ t j | d ƒ S| t j k r d g } x% |  D] } | j d t	 | ƒ ƒ qPW| j t
 |  ƒ r‰d pŒd ƒ t j | d ƒ St d | |  f ƒ ‚ d  S(   NR
   t   {s	   
 %s: %s,s   
 }t   }R3   t   [s   
 %s,s   
 ]t   ]t   (s   
 )t   )s/   Unsupported type %s when trying to prettify %s.(   t   hasattrR
   t   typet   _SIMPLE_BUILTINSt   reprR   R    R4   R8   R   R%   R9   R:   t   ListTypet	   TupleTypeR   (   R   t   tR<   R=   R>   t   x(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR   °   s0    

	'		c         C   sJ   g  } g  } | | d „ } d |  g } t  j  | j | ƒ t j | d ƒ S(   Nc         S   sl   | d	 k r | j  | ƒ n | d
 k r5 | j ƒ  n  | d k r[ | j  d t | ƒ ƒ n | j  | ƒ d  S(   NRA   RC   R?   RB   RD   R@   t    s     (   RA   RC   R?   (   RB   RD   R@   (   R8   t   popR%   (   RF   t   valR6   t   ct   lR<   t   stack(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt   eaterÔ   s    R3   (   t   tokenizeRN   R9   R:   (   t   sR<   RR   RS   RQ   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR0   Ñ   s    c         C   s   t  ƒ  j |  ƒ S(   sG   
    Pass me an Abstract Object Tree, and I'll unjelly it for you.
    (   t   AOTUnjelliert   unjelly(   t   aot(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt   unjellyFromAOTë   s    c         B   s—   i e  d 6e d 6e d 6e d 6e d 6e d 6e d 6e d 6} e |  d	 ƒ r^ |  j	 ƒ  | Un |  | U| j
 d
 ƒ rƒ e | d
 ƒ Se d |  ƒ ‚ d S(   så   
    Pass me a string of code or a filename that defines an 'app' variable (in
    terms of Abstract Objects!), and I'll execute it and unjelly the resulting
    AOT for you, returning a newly unpersisted Application object!
    R   R   R	   R   R   R   R   R.   t   readt   apps'   %s needs to define an 'app', it didn't!N(   R   R   R	   R   R   R   R   R.   RE   RZ   t   has_keyRY   R(   (   t   stringOrFilet   ns(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt   unjellyFromSourceñ   s    

RV   c           B   sM   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   sW   I handle the unjellying of an Abstract Object Tree.
    See AOTUnjellier.unjellyAO
    c         C   s   i  |  _  g  |  _ g  |  _ d  S(   N(   t
   referencesRR   t   afterUnjelly(   R   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR     s    		c         C   s#   t  j ƒ  } |  j | d | ƒ | S(   s   Unjelly a node, later.
        i    (   R   t   _Defert   unjellyInto(   R   t   nodeR;   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt   unjellyLater  s    c         C   sB   |  j  | ƒ } | | | <t | t j ƒ r> | j | | ƒ n  | S(   sv   Utility method for unjellying one object into another.
        This automates the handling of backreferences.
        (   t	   unjellyAOR   R   t   NotKnownt   addDependant(   R   R   t   locR1   t   o(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyRc      s
    
c         C   sQ   t  | t j ƒ r. d  g } | j | d ƒ n	 | g } |  j j | | f ƒ d  S(   Ni   (   R   R   Rg   R!   Rh   Ra   R8   (   R   t   callablet   resultRQ   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt	   callAfter*  s
    		c         C   s   |  j  | j | | ƒ d S(   sá   Utility method for unjellying into instances of attributes.
        
        Use this rather than unjellyAO unless you like surprising bugs!
        Alternatively, you can use unjellyInto on your instance's __dict__.
        N(   Rc   t   __dict__(   R   R   t   attrNameR1   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt   unjellyAttribute2  s    c         C   sd  |  j  j | ƒ t | ƒ } | t j k rý| j } | t k rP t j | j	 ƒ S| t
 t g k sq t | t ƒ r t j | j	 ƒ S| t k r3| j	 } t j | j ƒ } |  j | j ƒ } | | j k r$| d	 k râ t | | ƒ St | t j ƒ rt j | | | ƒ St j | j | | | ƒ Sqút d ƒ ‚ qV| t k r°t j | j ƒ } |  j | j ƒ } t | d ƒ ršt j | i  ƒ }	 |  j |	 j  | ƒ n t j | | ƒ }	 |	 S| t! k r`|  j | j" ƒ }
 | j# } |  j$ j% | ƒ } | d	 k r|
 |  j$ | <nW t | t j ƒ r4| j& |
 ƒ |
 |  j$ | <n( | d	 k rCn t' d | | | f ƒ ‚ |
 S| t( k r·| j# } |  j$ j% | ƒ } | d	 k r³t j) | ƒ } | |  j$ | <| S| S| t* k rVt j | j+ ƒ } |  j, | j ƒ j- d „  | ƒ } | SnY| t. k r| S| t j/ k rag  } x8 | D]0 } | j d	 ƒ |  j0 | t1 | ƒ d | ƒ q)W| S| t j2 k rÛg  } t3 } xR | D]J } | j d	 ƒ t |  j0 | t1 | ƒ d | ƒ t j ƒ rƒt j4 } qƒqƒW| | ƒ S| t j5 k rFi  } xO | j6 ƒ  D]A \ } } t j7 | ƒ } |  j0 | d | ƒ |  j0 | d | ƒ qýW| St d | ƒ ‚ |  j  d =d	 S(
   sa   Unjelly an Abstract Object and everything it contains.
        I return the real object.
        s   instance method changedt   __setstate__s1   Multiple references with the same ID: %s, %s, %s!c         S   s   t  | |  ƒ S(   N(   t   apply(   Rl   t   _l(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt   <lambda>€  s    i   i    s   Unsupported AOT type: %siÿÿÿÿN(8   RR   R8   RF   R   t   InstanceTypet	   __class__R   R    t   namedModuleR   R	   R   t
   issubclasst   namedObjectR   R   Rf   R   Rn   R!   t   getattrR   R   Rg   t   _InstanceMethodt   newt   instancemethodR   R   R   RE   Rm   Rq   R   R   R&   R`   t   gett   resolveDependantsR(   R   t   _DereferenceR.   R/   Re   t   addCallbackRG   RI   Rc   R%   RJ   t   tuplet   _TupleR    R4   t   _DictKeyAndValue(   R   R1   RK   RP   t   im_namet   im_classt   im_selfR   R   R   Rj   t   refkeyt   refR)   t   derR/   R;   RQ   RL   t   tuple_R=   R>   t   kvd(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyRf   ;  s     	!	
		!+
c         C   s“   yP d  g } |  j | d | ƒ x% |  j D] \ } } | | d ƒ q) W| d SWn< t j d ƒ t j t j t t |  j	 ƒ d ƒ ƒ ‚  n Xd  S(   Ni    s+   Error jellying object! Stacktrace follows::s   
(
   R!   Rc   Ra   R   t   msgR9   R:   t   mapRH   RR   (   R   R1   RQ   Rk   R>   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyRW   ¦  s    	%(
   R   R   R2   R   Re   Rc   Rm   Rp   Rf   RW   (    (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyRV     s   			
				kc         C   s   t  ƒ  j |  ƒ S(   s-   Convert an object to an Abstract Object Tree.(   t
   AOTJelliert   jelly(   R   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt
   jellyToAOT¶  s    c         C   s6   t  |  ƒ } | r( | j t | ƒ ƒ n
 t | ƒ Sd S(   sª   
    Pass me an object and, optionally, a file object.
    I'll convert the object to an AOT either return it (if no file was
    specified) or write it to the file.
    N(   R‘   t   writeR
   (   R   t   fileRX   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt   jellyToSourceº  s    R   c           B   s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c         C   s   i  |  _  d |  _ g  |  _ d  S(   Ni    (   t   preparedt   _ref_idRR   (   R   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR   É  s    		c         C   s   | |  j  t | ƒ <d S(   sa   I prepare an object for later referencing, by storing its id()
        and its _AORef in a cache.N(   R•   t   id(   R   t   aoreft   object(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt   prepareForRefÏ  s    c         C   s6  t  | ƒ } |  j j t | ƒ ƒ | t k r7 | } nñ| t j k ry t | j j	 t
 j | j ƒ |  j | j ƒ ƒ } n¯| t j k rš t | j	 ƒ } nŽ| t j k rÁ t t
 j | ƒ ƒ } ngt | t  ƒ rè t t
 j | ƒ ƒ } n@| t j k rt t
 j | ƒ ƒ } n|  j j t | ƒ ƒ r|  j t | ƒ } | j rO| j } n& |  j d |  _ |  j } | j | ƒ t | ƒ St ƒ  } |  j | | ƒ | t j  k rÃ| j! t" |  j | ƒ ƒ ne| t j# k rô| j! t$ t" |  j | ƒ ƒ ƒ n4| t j% k rRi  } x6 | j& ƒ  D]( \ } } |  j | ƒ | |  j | ƒ <qW| j! | ƒ nÖ | t j' k r¿t( | d ƒ rˆ|  j | j) ƒ  ƒ }	 n |  j | j* ƒ }	 | j! t+ t
 j | j, ƒ |	 ƒ ƒ ni t- j. j | ƒ rt- j. | | ƒ \ }
 }	 | j! t/ t
 j |
 ƒ |  j |	 ƒ ƒ ƒ n t0 d | j	 ƒ ‚ |  j d =| S(   s+   I turn an object into an AOT and return it.i   t   __getstate__s   Unsupported type: %siÿÿÿÿ(1   RF   RR   R8   RH   RG   R   t
   MethodTypeR   t   im_funcR   R    t   qualR†   t	   jellyToAOR‡   t
   ModuleTypeR   t	   ClassTypeR	   Rx   t   FunctionTypeR   t   fullFuncNameR•   R\   R—   R&   R–   R*   R   R   Rš   RI   R+   RŽ   RJ   R‚   t   DictionaryTypeR4   Ru   RE   R›   Rn   R   Rv   t   copy_regt   dispatch_tableR.   R   (   R   R   t   objTypet   retvalt   oldReft   keyR;   R=   R>   R   t   unpickleFunc(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyRŸ   Ô  s\    			
	" %
c         C   sQ   y |  j  | ƒ } | SWn3 t j d ƒ t j t j |  j d ƒ ƒ ‚  n Xd  S(   Ns+   Error jellying object! Stacktrace follows::s   
(   RŸ   R   R   R9   R:   RR   (   R   R   R1   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR   )  s    (   R   R   R   Rš   RŸ   R   (    (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR   È  s   			U(    (    (    (    (    (    (    (    (    (3   R2   R   R|   R9   R¥   RT   t   ret   twisted.pythonR    R   t   twisted.persistedR   R   R	   R   R   R   R   R   R   t   UnicodeTypet   IntTypet	   FloatTypet   ComplexTypet   LongTypet   NoneTypet	   SliceTypet   EllipsisTypeRG   R8   t   BooleanTypet   AttributeErrorR   R   R   R.   R
   t	   ExceptionR#   t   compileR6   R"   R   R0   RY   R_   RV   R‘   R!   R”   R   (    (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt   <module>   sB   H		
			!			©	