ó
5¢Nc        	   @   s*  d  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
 rC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% „ Z/ d& d0 d' „  ƒ  YZ0 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# Wd j
 | ƒ 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   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 ƒ d j | ƒ S| t j k r+d g } x% |  D] } | j d t	 | ƒ ƒ qÞ W| j t
 |  ƒ rd	 pd
 ƒ d j | ƒ S| t j k r—d g } x% |  D] } | j d t	 | ƒ ƒ qJW| j t
 |  ƒ rƒd p†d ƒ d j | ƒ 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   t   ListTypet	   TupleTypeR   (   R   t   tR;   R<   R=   t   x(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyR   °   s0    

	'		c         C   sG   g  } g  } | | d „ } d |  g } t  j  | j | ƒ d j | ƒ S(   Nc         S   sl   | d	 k r | j  | ƒ n | d
 k r5 | j ƒ  n  | d k r[ | j  d t | ƒ ƒ n | j  | ƒ d  S(   NR@   RB   R>   RA   RC   R?   t    s     (   R@   RB   R>   (   RA   RC   R?   (   R8   t   popR%   (   RE   t   valR6   t   ct   lR;   t   stack(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt   eaterÔ   s    R3   (   t   tokenizeRM   R9   (   t   sR;   RQ   RR   RP   (    (    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.   RD   RY   t   has_keyRX   R(   (   t   stringOrFilet   ns(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt   unjellyFromSourceñ   s    

RU   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
   referencesRQ   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.pyRb      s
    
c         C   sQ   t  | t j ƒ r. d  g } | j | d ƒ n	 | g } |  j j | | f ƒ d  S(   Ni   (   R   R   Rf   R!   Rg   R`   R8   (   R   t   callablet   resultRP   (    (    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(   Rb   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	 ƒ |  j/ | t0 | ƒ d | ƒ q)W| S| t j1 k rÛg  } t2 } xR | D]J } | j d	 ƒ t |  j/ | t0 | ƒ d | ƒ t j ƒ rƒt j3 } qƒqƒW| | ƒ S| t j4 k rFi  } xO | j5 ƒ  D]A \ } } t j6 | ƒ } |  j/ | d | ƒ |  j/ | 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(   Rk   t   _l(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt   <lambda>€  s    i   i    s   Unsupported AOT type: %siÿÿÿÿN(7   RQ   R8   RE   R   t   InstanceTypet	   __class__R   R    t   namedModuleR   R	   R   t
   issubclasst   namedObjectR   R   Re   R   Rm   R!   t   getattrR   R   Rf   t   _InstanceMethodt
   MethodTypeR   R   R   RD   Rl   Rp   R   R   R&   R_   t   gett   resolveDependantsR(   R   t   _DereferenceR.   R/   Rd   t   addCallbackRF   RH   Rb   R%   RI   t   tuplet   _TupleR    R4   t   _DictKeyAndValue(   R   R1   RJ   RO   t   im_namet   im_classt   im_selfR   R   R   Ri   t   refkeyt   refR)   t   derR/   R:   RP   RK   t   tuple_R<   R=   t   kvd(    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyRe   ;  s     	!	
		!+
c         C   s   yP d  g } |  j | d | ƒ x% |  j D] \ } } | | d ƒ q) W| d SWn9 t j d ƒ t j d j t t |  j ƒ ƒ ƒ ‚  n Xd  S(   Ni    s+   Error jellying object! Stacktrace follows::s   
(	   R!   Rb   R`   R   t   msgR9   t   mapRG   RQ   (   R   R1   RP   t   funcR=   (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyRV   ¦  s    	"(
   R   R   R2   R   Rd   Rb   Rl   Ro   Re   RV   (    (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyRU     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   fileRW   (    (    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_idRQ   (   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   RE   RQ   R8   RG   RF   R   R{   R   t   im_funcR   R    t   qualR„   t	   jellyToAOR…   t
   ModuleTypeR   t	   ClassTypeR	   Rw   t   FunctionTypeR   t   fullFuncNameR”   R[   R–   R&   R•   R*   R   R   R™   RH   R+   RŒ   RI   R€   t   DictionaryTypeR4   Rt   RD   Rš   Rm   R   Ru   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   sN   y |  j  | ƒ } | SWn0 t j d ƒ t j d j |  j ƒ ƒ ‚  n Xd  S(   Ns+   Error jellying object! Stacktrace follows::s   
(   R   R   R‹   R9   RQ   (   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(    (    (    (    (    (    (    (    (    (1   R2   R   R£   RS   t   ret   twisted.pythonR    R   t   twisted.persistedR   R   R	   R   R   R   R   R   R   t   UnicodeTypet   IntTypet	   FloatTypet   ComplexTypet   LongTypet   NoneTypet	   SliceTypet   EllipsisTypeRF   R8   t   BooleanTypet   AttributeErrorR   R   R   R.   R
   t	   ExceptionR#   t   compileR6   R"   R   R0   RX   R^   RU   R   R!   R“   RŽ   (    (    (    s9   /usr/lib/python2.7/dist-packages/twisted/persisted/aot.pyt   <module>   sB   0		
			!			©	