o
    ¯bÈ  ã                   @   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g d¢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   ó   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   ó    zIPersistable.setStyleNc                 C   r   )úxSave object to file.

        @type tag: string
        @type filename: string
        @type passphrase: string
        Nr
   )ÚtagÚfilenameÚ
passphraser
   r
   r   Úsave!   r   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   ó
   || _ dS r	   r   )r   r   r
   r
   r   r   3   s   
zPersistent.setStylec                 C   sx   |r|}|d }||fS |r(| j › d|› d|› �}| j › d|› d|› �}||fS | j › d|› �}| j › d|› �}||fS )Nz-2ú-z-2.Ú.)r   )r   r   Úextr   Ú	finalnamer
   r
   r   Ú_getFilename:   s   úþzPersistent._getFilenamec                 C   s<   t |dƒ�}|| j|ƒ W d   ƒ d S 1 sw   Y  d S )NÚwb)Úopenr   )r   r   ÚdumpFuncÚfr
   r
   r   Ú	_saveTempF   s   "ÿzPersistent._saveTempc                 C   s8   | j dkrddlm} d}||fS ddd„}d}||fS )	NÚsourcer   )ÚjellyToSourceÚtasc                 S   s   t  | |d¡ d S )Né   )r   Údump)ÚobjÚfiler
   r
   r   r)   Q   s   z&Persistent._getStyle.<locals>.dumpFuncÚtapr   )r   Útwisted.persisted.aotr-   )r   r)   r$   r
   r
   r   Ú	_getStyleJ   s   

üzPersistent._getStyleNc                 C   s�   |   ¡ \}}|durt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 NonezSaving z application to z...Úwin32zSaved.)r5   Ú	TypeErrorr&   r   Úmsgr   r+   r   ÚplatformTypeÚosÚpathÚisfileÚremoveÚrename)r   r   r   r   r$   r)   r%   r
   r
   r   r   W   s   
zPersistent.saver   )
r   r   r   r   r    r   r&   r+   r5   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   r!   )zS
        @param mainMod: The '__main__' module that this class will proxy.
        N)ÚmainMod)r   r@   r
   r
   r   r    r   s   
z_EverythingEphemeral.__init__c                 C   s@   zt | j|ƒW S  ty   | jr‚ t d| ¡ t ¡  Y S w )Nz#Warning!  Loading from __main__: %s)Úgetattrr@   ÚAttributeErrorÚinitRunr   r8   r   Ú	Ephemeral)r   Úkeyr
   r
   r   Ú__getattr__x   s   ûz _EverythingEphemeral.__getattr__N)r   r   r   rC   r    rF   r
   r
   r
   r   r?   n   s    r?   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 |j	tjd< n|j	tjd< w W d  ƒ n1 sHw   Y  t
 ¡  d|_t|dƒ}|durb| |¡ |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)r4   rH   r   Úloadr(   r?   ÚsysÚmodulesrC   r@   r   Ú	doUpgrader   r   )r   r   ÚmodeÚ_loadÚfpÚeeÚvalueÚpersistabler
   r
   r   rL   ƒ   s&   


û

rL   c                 C   s\   t | ƒ�}| ¡ }W d  ƒ n1 sw   Y  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
    NÚ__file__Úexec)r(   ÚreadÚcompileÚeval)r   ÚvariableÚfileObjÚdataÚdÚcodeObjrT   r
   r
   r   ÚloadValueFromFile¤   s   
	
ÿr`   c                 C   s(   t j | ¡d }ddddddddœ| S )NrK   Úpythonr   r,   )z.tacz.etacz.pyz.tapz.etapz.tasz.etas)r:   r;   Úsplitext)r   r$   r
   r
   r   Ú	guessType¶   s   ùørc   )r`   rL   r   Ú
Persistantr   rc   )r   r:   r   rM   Úzope.interfacer   r   Útwisted.persistedr   Útwisted.pythonr   r   r   r   rd   rD   r?   rL   r`   rc   Ú__all__r
   r
   r
   r   Ú<module>   s    @!