B
    j“]\)K  ã               @   sP  d Z ddlmZ ddlZddlZddlmZ ddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlZyddlZW n   dZY nX ddlmZmZmZmZ G dd„ deƒZdd„ ZyddlZy.e ¡  e d	¡ ddl m!Z" W dQ R X W n0 e#k
r$   ddl m!Z" Y n   dZ"Y nX e"dkrHdZ$dZ%nd
d„ Z$dd„ Z%W n   dZ$dZ%Y nX yddlZdd„ Z&dd„ Z'W n   dZ&Y nX ylddl(m)Z) ej*dkr¾dZ+ndZ+ddde+ dfde+ dfdde+ dfdddddddœZ,dd „ Z-d!d"„ Z.W n   dZ.Y nX d#d$„ Z/d%d&„ Z0d'd(„ Z1d)d*„ Z2G d+d,„ d,e3ƒZ4e4ƒ Z5e5 6¡  d-d.„ Z7e8d/krLddl9Z9d0ej: ;d1d1¡d0d2gd3œZ<e9 =d4d5d6¡Z>d7d8d0d9d:d5d;gd<dgd0e>e<gd<dfe<d=ej: ;d>d?¡e ?g ¡e>e9 9d4d5d6¡d@œ
Z@ddlAZAeA A¡ ZBe1e@dAƒ eCdBeA A¡ eB  ƒ eA A¡ ZBe2dAƒ\ZDZEe FdA¡ eCdCeA A¡ eB  ƒ dS )Dz
Input/Output Utilities

Note: 'load' functions has to return a dictionary from which a globals()
      namespace may be updated
é    )Úprint_functionN)ÚgetcwdÚpickleÚPY2Úto_text_stringc               @   s@   e Zd ZdZdd„ Zdd„ Zdd„ ZejZ	ej
Zedd	„ ƒZd
S )ÚMatlabStructa”  
    Matlab style struct, enhanced.

    Supports dictionary and attribute style access.  Can be pickled,
    and supports code completion in a REPL.

    Examples
    ========
    >>> from spyder.utils.iofuncs import MatlabStruct
    >>> a = MatlabStruct()
    >>> a.b = 'spam'  # a["b"] == 'spam'
    >>> a.c["d"] = 'eggs'  # a.c.d == 'eggs'
    >>> print(a)
    {'c': {'d': 'eggs'}, 'b': 'spam'}

    c             C   s2   y| | S  t k
r,   d| }t|ƒ‚Y nX dS )z2Access the dictionary keys for unknown attributes.z)'MatlabStruct' object has no attribute %sN)ÚKeyErrorÚAttributeError)ÚselfÚattrÚmsg© r   ú;lib/python3.7/site-packages/spyder_kernels/utils/iofuncs.pyÚ__getattr__@   s
    zMatlabStruct.__getattr__c             C   sz   ||   ¡ ks| d¡r"t | |¡S t ¡ }|jjrR|  |jj¡rRt | |t	ƒ ¡ n|  |j¡rnt | |t	ƒ ¡ t | |¡S )z
        Get a dict value; create a MatlabStruct if requesting a submember.

        Do not create a key if the attribute starts with an underscore.
        Ú_)
ÚkeysÚ
startswithÚdictÚ__getitem__ÚinspectZcurrentframeÚf_backÚ_is_allowedÚ__setitem__r   )r
   r   Úframer   r   r   r   H   s    zMatlabStruct.__getitem__c             C   sN   t jd t jd t j dd¡g}|jj}||jd  }trBt|ƒn|}||kS )z.Check for allowed op code in the calling frameZ
STORE_ATTRZ
LOAD_CONSTZ	STOP_CODEr   é   )ÚdisZopmapÚgetÚf_codeÚco_codeÚf_lastir   Úord)r
   r   ZallowedÚbytecodeZinstructionr   r   r   r   X   s    zMatlabStruct._is_allowedc             C   s   |   ¡ S )z#Allow for code completion in a REPL)Úcopy)r
   r   r   r   Ú__dict__d   s    zMatlabStruct.__dict__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   Ú__setattr__Ú__delitem__Ú__delattr__Úpropertyr#   r   r   r   r   r   /   s   	r   c             C   s.  ddl }t| tƒr dd„ | D ƒS t| |jƒs0| S t| dƒr€tƒ }x(| jjD ]}t| |  	¡  
¡ ƒ||< qJW t| jtf|ƒ}|ƒ S | jjr¾tƒ }x(| jjD ]}t| |  	¡  
¡ ƒ||< q˜W |} nl| jjdkrð|  	¡  
¡ } t| tƒsæ| g} t| ƒ} n:| jdkr|  ¡ } n$| jdkr*| jjdkr&d	} ng } | S )
zƒ
    Extract a value from a Matlab file

    From the oct2py project, see
    https://pythonhosted.org/oct2py/conversions.html
    r   Nc             S   s   g | ]}t |ƒ‘qS r   )Úget_matlab_value)Ú.0Úvr   r   r   ú
<listcomp>u   s    z$get_matlab_value.<locals>.<listcomp>Ú	classnameÚOé   ZUSÚ )ÚnumpyÚ
isinstanceÚlistÚndarrayÚhasattrr   ÚdtypeÚnamesr,   ZsqueezeÚtolistÚtyper0   Úobjectr   ZkindÚsizeÚitem)ÚvalÚnpÚoutÚnameÚclsr   r   r   r,   j   s8    




r,   Úignorec          
   C   sn   y>t j| dd}tƒ }x | ¡ D ]\}}t|ƒ||< q W |d fS  tk
rh } zd t|ƒfS d }~X Y nX d S )NT)Zstruct_as_record)ÚspioZloadmatr   Úitemsr,   Ú	ExceptionÚstr)ÚfilenamerB   ÚdataÚkeyÚvalueÚerrorr   r   r   Úload_matlab¯   s    rO   c          
   C   s@   yt j|| dd W n& tk
r: } zt|ƒS d }~X Y nX d S )NÚrow)Zoned_as)rF   ZsavematrH   rI   )rK   rJ   rN   r   r   r   Úsave_matlab¹   s    rQ   c          
   C   sp   y@t  t  | ¡¡d }t | ¡}t|dƒr2|d fS ||id fS W n* tk
rj } zd t|ƒfS d }~X Y nX d S )Nr   r   )ÚospÚsplitextÚbasenamerA   Úloadr8   rH   rI   )rJ   rC   rK   rN   r   r   r   Ú
load_arrayÆ   s    

rV   c             C   s   |d|  }t  || ¡ |S )zSave numpy arrayz	_%04d.npy)rA   Úsave)rK   rT   ÚindexÚfnamer   r   r   Ú__save_arrayÑ   s    rZ   )ÚImageÚlittleú<ú>)z|b1N)z|u1Nz%si4z%sf4)z|u2Nz%si2)z|u1r   )z|u1é   )Ú1ÚLÚIÚFzI;16zI;16SÚPZRGBZRGBXZRGBAZCMYKZYCbCrc             C   s„   t  | ¡}yt|j \}}W n" tk
r>   td|j ƒ‚Y nX |jd |jd f}|d k	rf||f7 }tj| 	¡ t 
|¡d |¡S )Nz%s mode is not supportedr2   r   )r9   )r[   ÚopenÚDTYPESÚmoder   ÚRuntimeErrorr>   rA   ÚarrayZgetdatar9   Zreshape)rJ   Zimgr9   ZextraÚshaper   r   r   Ú__image_to_arrayï   s    

rk   c          
   C   sT   y$t  t  | ¡¡d }|t| ƒid fS  tk
rN } zd t|ƒfS d }~X Y nX d S )Nr   )rR   rS   rT   rk   rH   rI   )rJ   rC   rN   r   r   r   Ú
load_imageú   s
    rl   c          
   C   sn   y>t rt  | ¡dfS t| dƒ}t |¡}W dQ R X |dfS W n* tk
rh } zdt|ƒfS d}~X Y nX dS )z"Load a pickle file as a dictionaryNÚrb)ÚpdZread_picklere   r   rU   rH   rI   )rJ   ÚfidrK   Úerrr   r   r   Úload_pickle  s    rq   c          
   C   sf   y6t rd}nd}t| |ƒ}t |¡}W dQ R X |dfS  tk
r` } zdt|ƒfS d}~X Y nX dS )z Load a json file as a dictionaryrm   ÚrN)r   re   ÚjsonrU   rH   rI   )rJ   Úargsro   rK   rp   r   r   r   Ú	load_json  s    ru   c             C   sÌ  t  |¡}tƒ }t t  |¡¡ d}g }i }zŒy4xZ|  ¡ D ]N\}}t|ƒs>t|t	j
ƒs>yt |¡||< W q> tk
rŠ   | |¡ Y q>X q>W |} | s tdƒ‚i }tdk	r,t  |¡d }	x^t|  ¡ ƒD ]L}
y"t| |
 tjƒr*| |
 jdkr*t| |
 |	t|ƒƒ}t  |¡||
df< |  |
¡ nÊt| |
 ttfƒrôt| |
 tƒr\t| |
 ƒ}ntt| |
  ¡ ƒƒ}g }xX|D ]P\}}t|tjƒrz|jdkrzt||	t|ƒƒ}t  |¡||
|f< | |¡ qzW x$t|ddD ]}| |
  |¡ qÜW W qÌ ttj t!t"t#fk
r   Y qÌX qÌW |r,|| d< t  |¡d d }t$|dƒ¶}ytj%| |d	d
 W nš tj t"t!t&t#tfk
rø   i }xR|  ¡ D ]F\}}ytj'|d	d
 W n  tk
rÆ   | |¡ Y n
X |||< qŒW |sätdƒ‚tj%||d	d
 Y nX W dQ R X t(j$|dt(j)dH}x@|gdd„ t| *¡ ƒD ƒ D ] }| +t  |¡¡ t ,|¡ q6W W dQ R X W n4 ttj t!fk
rš } zt-|ƒ}W dd}~X Y nX |r¸| .¡  dd /|¡ }W dt |¡ X |S )z.Save dictionary in a single file .spydata fileNzNo supported objects to saver   T)ÚreverseÚ__saved_arrays__z.picklezw+bé   )ZprotocolÚw)Úformatc             S   s   g | ]}|‘qS r   r   )r-   Úfnr   r   r   r/   y  s    z#save_dictionary.<locals>.<listcomp>z!Some objects could not be saved: z, )0rR   Úabspathr   ÚosÚchdirÚdirnamerG   Úcallabler5   ÚtypesÚ
ModuleTyper"   ÚdeepcopyrH   Úappendrh   rV   rS   r6   r   rA   r7   r>   rZ   ÚlenrT   Úpopr   Ú	enumerateÚiterÚsortedr   ZPicklingErrorÚ	TypeErrorr	   Ú
IndexErrorre   ÚdumpÚImportErrorÚdumpsÚtarfileZ
PAX_FORMATÚvaluesÚaddÚremover   ÚsortÚjoin)rK   rJ   Úold_cwdÚerror_messageZskipped_keysZ	data_copyZobj_nameZ	obj_valueÚsaved_arraysZ	arr_fnamerC   rY   ÚiteratorZ	to_removerX   rM   Úpickle_filenameÚfdescZdata_filteredÚtarrN   r   r   r   Úsave_dictionary  s˜    







 rœ   c             C   s®  t  | ¡} tƒ }t ¡ }t |¡ d}d}z0yøt | d¡}| 	¡  W dQ R X t
 
d¡d }t|dƒ}t | ¡ ¡}W dQ R X i }tdk	r$y|| d¡}xlt| ¡ ƒD ]\\\}	}
}t t  ||¡¡}|
dkrÚ|||	< qªt||	 tƒrö|||	 |
< qª||	  |
|¡ qªW W n tk
r"   Y nX W n2 tttfk
rX } zt|ƒ}W dd}~X Y nX W dt |¡ yt |¡ W n, tk
r¢ } zt|ƒ}W dd}~X Y nX X ||fS )z"Load dictionary from .spydata fileNrr   z*.pickler   rm   rw   ) rR   r|   r   ÚtempfileZmkdtempr}   r~   r   re   Z
extractallÚglobr   ÚloadsÚreadrV   r†   r6   rG   rA   rU   r”   r5   r   Úinsertr   r	   ÚEOFErrorÚ
ValueErrorr   ÚshutilZrmtreeÚOSError)rJ   r•   Z
tmp_folderrK   r–   r›   r™   rš   r—   rC   rX   rY   ZarrrN   r   r   r   Úload_dictionaryˆ  sB    






r¦   c               @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚIOFunctionsc             C   s(   d | _ d | _d | _d | _d | _d | _d S )N)Úload_extensionsÚsave_extensionsÚload_filtersÚsave_filtersÚ
load_funcsÚ
save_funcs)r
   r   r   r   Ú__init__´  s    zIOFunctions.__init__c             C   s   |   ¡ |  ¡  }i }i }i }i }g }g }g }xr|D ]j\}	}
}}t|
d|	  ƒ}|d k	rz| |¡ |	||< |||	< | |	¡ |d k	r2|	||< | |¡ |||	< q2W | dtdd |¡ d ƒ¡ | tdƒ¡ d |¡| _d |¡| _|| _|| _	|| _
|| _d S )Nz (*%s)r   zSupported files (*z *ú)zAll files (*.*)Ú
)Úget_internal_funcsÚget_3rd_party_funcsr   r„   r¡   r”   rª   r«   r¬   r­   r¨   r©   )r
   Ziofuncsr¨   r©   r¬   r­   rª   r«   Zload_extÚextrC   ZloadfuncZsavefuncZ
filter_strr   r   r   Úsetup¼  s8    


zIOFunctions.setupc             C   sv   ddt tfddtd fddtd fddttfd	d
ddtd fddtd fddtd fddtd fddtd fddtd fddtd fgS )Nz.spydatazSpyder data filesz.npyzNumPy arraysz.npzzNumPy zip arraysz.matzMatlab files)z.csvzCSV text filesÚimport_wizardN)z.txtz
Text filesrµ   Nz.jpgzJPEG imagesz.pngz
PNG imagesz.gifz
GIF imagesz.tifzTIFF imagesz.pklzPickle filesz.picklez.jsonz
JSON files)r¦   rœ   rV   rO   rQ   rl   rq   ru   )r
   r   r   r   r±   Ú  s    








zIOFunctions.get_internal_funcsc             C   sž   g }y€ddl m} xn|ddD ]`}y| |j|j|j|jf¡ W q tk
r| } ztd|t	|ƒf t
jd W d d }~X Y qX qW W n tk
r˜   Y nX |S )Nr   )Úget_spyderplugins_modsT)Úioz%s: %s)Úfile)Zspyder.otherpluginsr¶   r„   Z
FORMAT_EXTZFORMAT_NAMEZFORMAT_LOADZFORMAT_SAVEr	   ÚprintrI   ÚsysÚstderrr   )r
   Zother_funcsr¶   ÚmodrN   r   r   r   r²   ì  s    4zIOFunctions.get_3rd_party_funcsc             C   s8   t  |¡d  ¡ }|| jkr,| j| ||ƒS d| S d S )Nr2   z!<b>Unsupported file type '%s'</b>)rR   rS   Úlowerr­   )r
   rK   rJ   r³   r   r   r   rW   ú  s    
zIOFunctions.savec             C   s:   t  |¡d  ¡ }|| jkr*| j| |ƒS d d| fS d S )Nr2   z!<b>Unsupported file type '%s'</b>)rR   rS   r½   r¬   )r
   rJ   r³   r   r   r   rU     s    
zIOFunctions.loadN)	r$   r%   r&   r®   r´   r±   r²   rW   rU   r   r   r   r   r§   ³  s   r§   c             C   s   dS )z4Save data into filename, depending on file extensionNr   )rK   rJ   r   r   r   Ú	save_auto  s    r¾   Ú__main__r2   é
   rx   )ÚdÚaÚbi™  é   é   zkjkj kj k j j kj k jkju   Ã©Ã¹r   r_   é   Zkjkjg&S£’ó?i   i  )
rI   Zunicoder6   Útupler   Úfloatri   Zempty_arrayÚdateÚdatetimeztest.spydataz Data saved in %.3f secondszData loaded in %.3f seconds)Gr'   Z
__future__r   rº   r}   Úos.pathÚpathrR   r   r   r¤   r   Úwarningsrs   r   r   r"   rž   Zpandasrn   Zspyder_kernels.py3compatr   r   r   r   r   r   r,   r4   rA   Úcatch_warningsÚsimplefilterZscipy.ior·   rF   r	   rO   rQ   rV   rZ   Zspyder.pil_patchr[   Ú	byteorderZ_ENDIANrf   rk   rl   rq   ru   rœ   r¦   r=   r§   Ziofunctionsr´   r¾   r$   rÊ   ZrandomZrandZtestdictrÉ   Ztestdateri   ZexampleZtimeZt0r¹   Zexample2Úokr’   r   r   r   r   Ú<module>   sÀ   
;5










i+U


