U
    ˆjÆ  ã                   @   s°   d 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l	m
Z
mZ G dd„ deƒZeeƒG dd	„ d	ƒƒZeZG d
d„ dejƒZdd„ Zdd„ Zdd„ Zddd	dddgZdS )z`
Save and load Small OBjects to and from files, using various formats.

Maintainer: Moshe Zadka
é    N)Ú	InterfaceÚimplementer)Ústyles)ÚlogÚruntimec                   @   s"   e Zd ZdZdd„ Zddd„ZdS )ÚIPersistablez9An object which can be saved in several formats to a filec                 C   s   dS ©zWSet desired format.

        @type style: string (one of 'pickle' or 'source')
        N© ©Ústyler	   r	   ú9/tmp/pip-unpacked-wheel-j5h_c8_q/twisted/persisted/sob.pyÚsetStyle   s    zIPersistable.setStyleNc                 C   s   dS )úxSave object to file.

        @type tag: string
        @type filename: string
        @type passphrase: string
        Nr	   )ÚtagÚfilenameÚ
passphraser	   r	   r   Úsave!   s    zIPersistable.save)NNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r	   r	   r	   r   r      s   r   c                   @   sB   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zddd„Z	dS )Ú
PersistentÚpicklec                 C   s   || _ || _d S )N)ÚoriginalÚname)Úselfr   r   r	   r	   r   Ú__init__.   s    zPersistent.__init__c                 C   s
   || _ dS r   r
   )r   r   r	   r	   r   r   2   s    zPersistent.setStylec                 C   sl   |r|}|d }nR|rD| j › d|› d|› �}| j › d|› d|› �}n | j › d|› �}| j › d|› �}||fS )Nz-2ú-z-2.Ú.)r   )r   r   Úextr   Ú	finalnamer	   r	   r   Ú_getFilename9   s    
zPersistent._getFilenamec              	   C   s&   t |dƒ�}|| j|ƒ W 5 Q R X d S )NÚwb)Úopenr   )r   r   ÚdumpFuncÚfr	   r	   r   Ú	_saveTempE   s    zPersistent._saveTempc                 C   s2   | j dkrddlm} d}nddd„}d}||fS )	NÚsourcer   )ÚjellyToSourceZtasc                 S   s   t  | |d¡ d S )Né   )r   Údump)ÚobjÚfiler	   r	   r   r$   P   s    z&Persistent._getStyle.<locals>.dumpFuncZtap)N)r   Útwisted.persisted.aotr(   )r   r$   r   r	   r	   r   Ú	_getStyleI   s    

zPersistent._getStyleNc                 C   s�   |   ¡ \}}|dk	rtdƒ‚|  |||¡\}}t d| j d | d ¡ |  ||¡ tjdkrvt	j
 |¡rvt	 |¡ t	 ||¡ t d¡ dS )r   Nzpassphrase must be NonezSaving z application to z...Úwin32zSaved.)r.   Ú	TypeErrorr!   r   Úmsgr   r&   r   ZplatformTypeÚosÚpathÚisfileÚremoveÚrename)r   r   r   r   r   r$   r    r	   r	   r   r   V   s    
zPersistent.save)NNN)
r   r   r   r   r   r   r!   r&   r.   r   r	   r	   r	   r   r   *   s   r   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú_EverythingEphemeralr   c                 C   s
   || _ dS )zS
        @param mainMod: The '__main__' module that this class will proxy.
        N)ÚmainMod)r   r8   r	   r	   r   r   p   s    z_EverythingEphemeral.__init__c                 C   sL   zt | j|ƒW S  tk
rF   | jr(‚ nt d| ¡ t ¡  Y S Y nX d S )Nz#Warning!  Loading from __main__: %s)Úgetattrr8   ÚAttributeErrorÚinitRunr   r1   r   Ú	Ephemeral)r   Úkeyr	   r	   r   Ú__getattr__v   s    z _EverythingEphemeral.__getattr__N)r   r   r   r;   r   r>   r	   r	   r	   r   r7   m   s   r7   c              
   C   s¨   d}|dkrddl m} ntjd }}t| |ƒ}ttjd ƒ}|tjd< d|_|�" z||ƒ}W 5 |j	tjd< X W 5 Q R X t
 ¡  d|_t|dƒ}|dk	r¤| |¡ |S )	z·Load an object from a file.

    Deserialize an object from a file. The file can be encrypted.

    @param filename: string
    @param style: string (one of 'pickle' or 'source')
    Úrr'   r   )ÚunjellyFromSourceÚrbÚ__main__é   N)r-   r@   r   Úloadr#   r7   ÚsysÚmodulesr;   r8   r   Z	doUpgrader   r   )r   r   ÚmodeÚ_loadÚfpÚeeÚvalueZpersistabler	   r	   r   rD   �   s$    



rD   c              	   C   sH   t | ƒ�}| ¡ }W 5 Q R X d| i}t|| dƒ}t|||ƒ || }|S )zÚLoad the value of a variable in a Python file.

    Run the contents of the file in a namespace and return the result of the
    variable named C{variable}.

    @param filename: string
    @param variable: string
    Ú__file__Úexec)r#   ÚreadÚcompileÚeval)r   ÚvariableZfileObjÚdataÚdZcodeObjrK   r	   r	   r   ÚloadValueFromFile¢   s    	
rT   c                 C   s(   t j | ¡d }ddddddddœ| S )NrC   Úpythonr   r'   )z.tacz.etacz.pyz.tapz.etapz.tasz.etas)r2   r3   Úsplitext)r   r   r	   r	   r   Ú	guessType´   s    ùørW   Ú
Persistant)r   r2   r   rE   Zzope.interfacer   r   Ztwisted.persistedr   Ztwisted.pythonr   r   r   r   rX   r<   r7   rD   rT   rW   Ú__all__r	   r	   r	   r   Ú<module>   s*   ?!ú