o
    Óó·iÏG  ã                
   @   sš  d Z ddlZddlZddlZddlmZ ddlmZm	Z	 ddl
mZ ddlmZ G dd	„ d	ƒZG d
d„ deƒZG dd„ deƒZG dd„ deƒZG dd„ dƒZG dd„ dƒZeƒ Zeeeeeeedƒeeeƒg	ZG dd„ dƒZ G dd„ dƒZ!G dd„ dƒZ"G dd„ dƒZ#dd„ Z$G dd„ de%ƒZ&e 'd ¡Z(d!d"„ Z)d#d$„ Z*d%d&„ Z+d'd(„ Z,d)d*„ Z-G d+d,„ d,ƒZ.d-d.„ Z/d9d/d0„Z0d1d2„ Z1d3d4„ Z2d5d6„ Z3G d7d8„ d8ƒZ4dS ):z|
AOT: Abstract Object Trees
The source-code-marshallin'est abstract-object-serializin'est persister
this side of Marmalade!
é    N)Úcrefutil)ÚlogÚreflect)Ú_constructMethodé   )Úgenerate_tokensc                   @   ó   e Zd Zdd„ ZdS )ÚNamedc                 C   ó
   || _ d S ©N©Úname)Úselfr   © r   ú[C:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\twisted/persisted/aot.pyÚ__init__"   ó   
zNamed.__init__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r	   !   ó    r	   c                   @   r   )ÚClassc                 C   ó
   d| j  S )Nz	Class(%r)r   ©r   r   r   r   Ú	getSource'   r   zClass.getSourceN©r   r   r   r   r   r   r   r   r   &   r   r   c                   @   r   )ÚFunctionc                 C   r   )NzFunction(%r)r   r   r   r   r   r   ,   r   zFunction.getSourceNr   r   r   r   r   r   +   r   r   c                   @   r   )ÚModulec                 C   r   )Nz
Module(%r)r   r   r   r   r   r   1   r   zModule.getSourceNr   r   r   r   r   r   0   r   r   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚInstanceMethodc                 C   s@   t |tƒst |tƒst |tƒstd| ƒ‚|| _|| _|| _d S )Nz$%s isn't an Instance, Ref, or Deref!)Ú
isinstanceÚRefÚInstanceÚDerefÚ	TypeErrorr   ÚklassÚinstance)r   r   r%   Úinstr   r   r   r   6   s   ÿþý
zInstanceMethod.__init__c                 C   s   d  | j| jt| jƒ¡S )Nz InstanceMethod({!r}, {!r}, 
 {}))Úformatr   r%   Úprettifyr&   r   r   r   r   r   A   s
   ýzInstanceMethod.getSourceN©r   r   r   r   r   r   r   r   r   r   5   s    r   c                   @   s   e Zd ZdS )Ú_NoStateObjN)r   r   r   r   r   r   r   r+   I   s    r+   c                   @   s    e Zd Zefdd„Zdd„ ZdS )r"   c                 K   sD   t |tƒstd| ƒ‚|| _|tur|| _d| _d S || _d| _d S )Nz%s isn't a string!r   r   )r    Ústrr$   r%   Ú
NoStateObjÚstateÚstateIsDict)r   Z	classNameZ__stateObj__r.   r   r   r   r   ]   s   


zInstance.__init__c                 C   sž   | j r| j}nt| jtƒrt| jjtƒr| jj}nd }|d urBzd| j›dt|ƒ› d�W S  tyA   d| j›dt	|ƒ› d� Y S w d| j›dt	| jƒ› d�S )Nz	Instance(ú, ú))
r/   r.   r    r!   ÚobjÚdictr%   ÚdictToKWÚNonFormattableDictr)   )r   Z	stateDictr   r   r   r   h   s   
ÿzInstance.getSourceN)r   r   r   r-   r   r   r   r   r   r   r"   \   s    r"   c                   @   ó,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
r!   c                 G   s<   t |ƒdkr|d | _|d | _d S |sd | _d | _d S d S )Né   r   r   )ÚlenÚrefnumr2   )r   Úargsr   r   r   r   y   s   

þzRef.__init__c                 C   ó&   | j rtd|› d| j › �ƒ‚|| _ d S )NzError setting id ú, I already have )r9   Ú
ValueError©r   Únumr   r   r   ÚsetRef‚   ó   
z
Ref.setRefc                 C   r;   )NzError setting obj r<   )r2   r=   )r   r2   r   r   r   ÚsetObj‡   rA   z
Ref.setObjc                 C   s6   | j d u r	tdƒ‚| jrd| jt| j ƒf S t| j ƒS )Nz7Don't try to display me before setting an object on me!zRef(%d, 
 %s))r2   ÚRuntimeErrorr9   r)   r   r   r   r   r   Œ   s   
ÿ
zRef.getSourceN)r   r   r   r   r@   rB   r   r   r   r   r   r!   x   s
    	r!   c                   @   s    e Zd Zdd„ Zdd„ ZeZdS )r#   c                 C   r
   r   ©r9   r>   r   r   r   r   —   r   zDeref.__init__c                 C   r   )Nz	Deref(%d)rD   r   r   r   r   r   š   r   zDeref.getSourceN)r   r   r   r   r   Ú__repr__r   r   r   r   r#   –   s    r#   c                   @   r   )ÚCopyregc                 C   s   || _ || _d S r   )Úloadfuncr.   )r   rG   r.   r   r   r   r   ¡   s   
zCopyreg.__init__c                 C   s   d| j ›dt| jƒ› d�S )NzCopyreg(r0   r1   )rG   r)   r.   r   r   r   r   r   ¥   s   zCopyreg.getSourceNr*   r   r   r   r   rF       s    rF   c                 C   s   t dt| ƒ ƒS )zDPass me an AO, I'll return a nicely-formatted source representation.zapp = N)Ú	indentifyr)   )Úaor   r   r   r   ®   s   r   c                   @   s   e Zd ZdZdS )r5   z!A dictionary was not formattable.N)r   r   r   Ú__doc__r   r   r   r   r5   ³   s    r5   z[a-zA-Z_][a-zA-Z0-9_]*$c                 C   sx   g }t |  ¡ ƒ}| ¡  |D ](\}}t|tƒstd| ƒ‚t |¡s(td| ƒ‚| d|› dt	|ƒ› d�¡ qd 
|¡S )Nz%r ain't a stringz%r ain't an identifierú
 ú=ú,Ú )ÚlistÚitemsÚsortr    r,   r5   ÚrÚmatchÚappendr)   Újoin)ÚdÚoutrP   ÚkÚvr   r   r   r4   º   s   


r4   c                 C   s4  t | dƒr	|  ¡ S t| ƒ}|tv rt| ƒS |tu rEdg}|  ¡ D ]\}}| dt|ƒ› dt|ƒ› d�¡ q | t	| ƒr=dp>d¡ d 
|¡S |tu rjd	g}| D ]}| d
t|ƒ ¡ qN| t	| ƒrbdpcd¡ d 
|¡S |tu r�dg}| D ]}| d
t|ƒ ¡ qs| t	| ƒr‡dpˆd¡ d 
|¡S td|› d| › d�ƒ‚)Nr   Ú{rK   z: rM   z
 }Ú}rN   ú[z
 %s,z
 ]ú]ú(z
 )r1   zUnsupported type z when trying to prettify Ú.)Úhasattrr   ÚtypeÚ_SIMPLE_BUILTINSÚreprr3   rP   rT   r)   r8   rU   rO   Útupler$   )r2   ÚtrW   rX   rY   Úxr   r   r   r)   Ç   s0   
"


r)   c                 C   s†   g }g }d| g}t |jƒD ]0\}}\}}\}}	}
|dv r"| |¡ n|dv r*| ¡  |dkr8| dt|ƒ ¡ q| |¡ qd |¡S )NrN   )r\   r^   rZ   )r]   r1   r[   ú z  )ÚtokenizeÚpoprT   r8   rU   )ÚsrW   ÚstackÚlÚ	tokenTypeZtokenStringZstartRowZstartColumnZendRowZ	endColumnZlogicalLiner   r   r   rH   é   s$   ú
rH   c                 C   ó   t ƒ  | ¡S )zG
    Pass me an Abstract Object Tree, and I'll unjelly it for you.
    N)ÚAOTUnjellierÚunjelly)Úaotr   r   r   ÚunjellyFromAOT  s   rr   c              	   C   sf   t tttttttdœ}t| dƒr|  	¡ }n| }t
|ddƒ}t|||ƒ d|v r-t|d ƒS td|  ƒ‚)zå
    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#   rF   Úreadz<source>ÚexecZappz'%s needs to define an 'app', it didn't!N)r"   r   r   r   r   r!   r#   rF   r`   rs   ÚcompileÚevalrr   r=   )ZstringOrFileÚnsÚsourceÚcoder   r   r   ÚunjellyFromSource  s"   ø

rz   c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )ro   zWI handle the unjellying of an Abstract Object Tree.
    See AOTUnjellier.unjellyAO
    c                 C   s   i | _ g | _g | _d S r   )Ú
referencesrk   ÚafterUnjellyr   r   r   r   r   /  s   
zAOTUnjellier.__init__c                 C   s   t  ¡ }|  |d|¡ |S )zUnjelly a node, later.r   N)r   Z_DeferÚunjellyInto)r   ÚnoderV   r   r   r   ÚunjellyLater7  s   zAOTUnjellier.unjellyLaterc                 C   s.   |   |¡}|||< t|tjƒr| ||¡ |S )zvUtility method for unjellying one object into another.
        This automates the handling of backreferences.
        N)Ú	unjellyAOr    r   ÚNotKnownÚaddDependant)r   r2   ÚlocrI   Úor   r   r   r}   =  s
   
zAOTUnjellier.unjellyIntoc                 C   s:   t |tjƒrd g}| |d¡ n|g}| j ||f¡ d S )Nr   )r    r   r�   r‚   r|   rT   )r   ÚcallableÚresultZ
listResultr   r   r   Ú	callAfterG  s
   zAOTUnjellier.callAfterc                 C   s   |   |j||¡ dS )zÙ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)r}   Ú__dict__)r   r&   ÚattrNamerI   r   r   r   ÚunjellyAttributeO  s   zAOTUnjellier.unjellyAttributec                 C   s  | j  |¡ t|ƒ}|tv r|S |tu r-g }|D ]}| d¡ |  |t|ƒd |¡ q|S |tu rUg }t}|D ]}| d¡ t|  |t|ƒd |¡t	j
ƒrPt	j}q7||ƒS |tu ryi }| ¡ D ]\}}t	 |¡}	|  |	d|¡ |  |	d|¡ q_|S |j}
|
tu r†t |j¡S |
ttfv s‘t|
tƒr—t |j¡S |
tu rÏ|j}t |j¡}|  |j¡}||jv rË|du r¸t||ƒS t|t	j
ƒrÅt	 |||¡S t|||ƒS t dƒ‚|
t!u �rt |j¡}|  |j"¡}| #|¡}t$|dƒró|  %|j&|¡ |S t|tƒrý||_|S | '¡ |_|S |
t(u �rH|  |j)¡}|j*}| j+ ,|¡}|du �r$|| j+|< |S t|t	j
ƒ�r7| -|¡ || j+|< |S |du �r?	 |S t.d|||f ƒ‚|
t/u �ri|j*}| j+ ,|¡}|du �rgt	 0|¡}|| j+|< |S |S |
t1u �r‚t |j2¡}|  3|j"¡ 4dd„ |¡}|S t d	| ƒ‚)
zaUnjelly an Abstract Object and everything it contains.
        I return the real object.
        Nr   r   zinstance method changedÚ__setstate__z1Multiple references with the same ID: %s, %s, %s!c                 S   s   || Ž S r   r   )r†   Z_lr   r   r   Ú<lambda>º  s    z(AOTUnjellier.unjellyAO.<locals>.<lambda>zUnsupported AOT type: %s)5rk   rT   ra   rb   rO   r}   r8   rd   r    r   r�   Z_Tupler3   rP   Z_DictKeyAndValueÚ	__class__r   r   ZnamedModuler   r   r   Ú
issubclassZnamedObjectr   r%   r€   r&   rˆ   ÚgetattrZ_InstanceMethodr   r$   r"   r.   Ú__new__r`   r‡   r‹   Ú__getstate__r!   r2   r9   r{   ÚgetZresolveDependantsr=   r#   Z_DereferencerF   rG   r   ZaddCallback)r   rI   re   rl   rf   Útuple_rV   rX   rY   ZkvdÚcZim_nameZim_classZim_selfr%   r.   r'   r„   ZrefkeyÚrefr?   ZderrG   r   r   r   r€   X  s°   

€






ü
ÿ


õ

	
øüÿÿ




ÿzAOTUnjellier.unjellyAOc              
   C   sn   zd g}|   |d|¡ | jD ]
\}}||d ƒ q|d W S  ty6   t d¡ t d tt| jƒ¡¡ ‚ w )Nr   ú+Error jellying object! Stacktrace follows::Ú
)	r}   r|   ÚBaseExceptionr   ÚmsgrU   Úmaprc   rk   )r   rI   rl   ÚfuncrY   r   r   r   rp   À  s   

ýzAOTUnjellier.unjellyN)r   r   r   rJ   r   r   r}   r‡   rŠ   r€   rp   r   r   r   r   ro   *  s    
	hro   c                 C   rn   )z-Convert an object to an Abstract Object Tree.N)Ú
AOTJellierÚjelly)r2   r   r   r   Ú
jellyToAOTÒ  s   rž   c                 C   s,   t | ƒ}|r| t|ƒ d¡¡ dS t|ƒS )zª
    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.
    zutf-8N)rž   Úwriter   Úencode)r2   Úfilerq   r   r   r   ÚjellyToSource×  s   r¢   c                 C   s   | j jS )z½
    Get the associated class of the given method object.

    @param methodObject: a bound method
    @type methodObject: L{types.MethodType}

    @return: a class
    @rtype: L{type}
    N)Ú__self__r�   ©ZmethodObjectr   r   r   Ú_classOfMethodå  s   
r¥   c                 C   ó   | j S )zð
    Get the associated function of the given method object.

    @param methodObject: a bound method
    @type methodObject: L{types.MethodType}

    @return: the function implementing C{methodObject}
    @rtype: L{types.FunctionType}
    N)Ú__func__r¤   r   r   r   Ú_funcOfMethodò  ó   
r¨   c                 C   r¦   )zØ
    Get the object that a bound method is bound to.

    @param methodObject: a bound method
    @type methodObject: L{types.MethodType}

    @return: the C{self} passed to C{methodObject}
    @rtype: L{object}
    N)r£   r¤   r   r   r   Ú_selfOfMethodÿ  r©   rª   c                   @   r6   )
rœ   c                 C   s   i | _ d| _g | _d S )Nr   )ÚpreparedÚ_ref_idrk   r   r   r   r   r     s   
zAOTJellier.__init__c                 C   s   || j t|ƒ< dS )zaI prepare an object for later referencing, by storing its id()
        and its _AORef in a cache.N)r«   Úid)r   ZaorefÚobjectr   r   r   ÚprepareForRef  s   zAOTJellier.prepareForRefc                    s   t ˆ ƒ}ˆj tˆ ƒ¡ |tv rˆ ‰n÷t|tjƒr-tt	ˆ ƒj
t tˆ ƒ¡ˆ tˆ ƒ¡ƒ‰nÝt|tjƒr9tˆ j
ƒ‰nÑt|t ƒrFtt ˆ ¡ƒ‰nÄ|tju rStt ˆ ¡ƒ‰n·tˆ ƒˆjv r}ˆjtˆ ƒ }|jrk|j}t|ƒS ˆjd ˆ_ˆj}| |¡ t|ƒS tƒ ‰‡ ‡‡fdd„}ˆ ˆˆ ¡ |tu rŸˆ ‡fdd„ˆ D ƒ¡ nk|t u r¯ˆ t t!ˆjˆ ƒƒ¡ n[|t"u rÎi }ˆ  #¡ D ]\}}ˆ |¡|ˆ |¡< q¹ˆ |¡ n<|t$j%v rët$j%| ˆ ƒ\}	}
ˆ t&t |	¡ˆ |
¡ƒ¡ nt'ˆ dƒr÷|ˆ  (¡ ƒ nt'ˆ dƒ�r|ˆ j)ƒ nt*d|j
 ƒ‚ˆjd	= ˆS )z+I turn an object into an AOT and return it.r   c                    s"   ˆ  tt ˆ j¡ˆ | ¡ƒ¡ d S r   )rB   r"   r   Úqualr�   Ú	jellyToAO)r.   ©r2   Úretvalr   r   r   Ú
_stateFromL  s   ÿz(AOTJellier.jellyToAO.<locals>._stateFromc                    s   g | ]}ˆ   |¡‘qS r   )r±   )Ú.0r„   r   r   r   Ú
<listcomp>T  s    z(AOTJellier.jellyToAO.<locals>.<listcomp>r‘   rˆ   zUnsupported type: %séÿÿÿÿN)+ra   rk   rT   rc   rb   rŽ   ÚtypesÚ
MethodTyper   r¨   r   r   r°   r¥   r±   rª   Ú
ModuleTyper   r   ÚFunctionTyper   ZfullFuncNamer­   r«   r9   r¬   r@   r#   r!   r¯   rO   rB   rd   rš   r3   rP   Úcopy_regÚdispatch_tablerF   r`   r‘   rˆ   r$   )r   r2   ZobjTypeZoldRefÚkeyr´   rV   rX   rY   ZunpickleFuncr.   r   r²   r   r±     sb   ý

ý

ÿ
zAOTJellier.jellyToAOc                 C   s>   z|   |¡}|W S  ty   t d¡ t d | j¡¡ ‚ w )Nr–   r—   )r±   r˜   r   r™   rU   rk   )r   r2   rI   r   r   r   r�   p  s   

ýzAOTJellier.jellyN)r   r   r   r   r¯   r±   r�   r   r   r   r   rœ     s
    Xrœ   r   )5rJ   Úcopyregr¼   Úrer¸   Ztwisted.persistedr   Ztwisted.pythonr   r   Ztwisted.python.compatr   Ú	_tokenizer   rh   r	   r   r   r   r   r+   r-   ÚboolÚbytesr,   ÚintÚfloatÚcomplexra   ÚsliceÚEllipsisrb   r"   r!   r#   rF   r   Ú	Exceptionr5   ru   rR   r4   r)   rH   rr   rz   ro   rž   r¢   r¥   r¨   rª   rœ   r   r   r   r   Ú<module>   sZ   
÷

" )
