U
    
W[M                     @   s   d Z ddlmZmZ ddlZddlZzddlZW n ek
rL   ddlZY nX 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
    )divisionabsolute_importN)logruntime)styles)implementer	Interfacec                   @   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   7/usr/lib/python3/dist-packages/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__3   s    zPersistent.__init__c                 C   s
   || _ dS r
   r   )r   r   r   r   r   r   7   s    zPersistent.setStylec                 C   s\   |r|}|d }nB|r8d| j ||f }d| j ||f }nd| j |f }d| j |f }||fS )Nz-2z
%s-%s-2.%sz%s-%s.%sz%s-2.%sz%s.%s)r   )r   r   extr   	finalnamer   r   r   _getFilename>   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   	_saveTempJ   s    zPersistent._saveTempc                 C   s0   | j dkrddlm} d}ndd }d}||fS )Nsourcer   )jellyToSourceZtasc                 S   s   t | |d d S )N   )r   dump)objfiler   r   r   r$   S   s    z&Persistent._getStyle.<locals>.dumpFuncZtap)r   twisted.persisted.aotr(   )r   r$   r   r   r   r   	_getStyleN   s    
zPersistent._getStyleNc                 C   s   |   \}}|dk	r$tdd| }| |||\}}td| j d | d  | || tjdkr~t	j
|r~t	| t	|| td dS )	r   Nzpassphrase must be NoneezSaving z application to z...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   X   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   r   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__x   s    z _EverythingEphemeral.__getattr__N)r   r   r   r;   r   r>   r   r   r   r   r7   n   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 )	zLoad 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fpZeevalueZpersistabler   r   r   rD      s$    



rD   c              	   C   sJ   t | d}| }W 5 Q R X d| i}t|| d}t||| || }|S )zLoad 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
    r?   __file__exec)r#   readcompileeval)r   ZvariableZfileObjdatadZcodeObjrJ   r   r   r   loadValueFromFile   s    	rR   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    rU   
Persistant)r   Z
__future__r   r   r2   rE   ZcPickler   ImportErrorZtwisted.pythonr   r   Ztwisted.persistedr   Zzope.interfacer   r   r	   r   rV   r<   r7   rD   rR   rU   __all__r   r   r   r   <module>   s,   =! 